From 9d6402aad470e5603b1a6be8a3202710ae1483dd Mon Sep 17 00:00:00 2001 From: DennisOSRM Date: Fri, 20 Apr 2012 18:34:49 +0200 Subject: [PATCH] Contract trivial degree two ways. --- Contractor/EdgeBasedGraphFactory.cpp | 55 +++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/Contractor/EdgeBasedGraphFactory.cpp b/Contractor/EdgeBasedGraphFactory.cpp index bfa09d84d..31e248433 100644 --- a/Contractor/EdgeBasedGraphFactory.cpp +++ b/Contractor/EdgeBasedGraphFactory.cpp @@ -25,6 +25,7 @@ #include #include "../Util/OpenMPReplacement.h" +#include "../DataStructures/Percent.h" #include "EdgeBasedGraphFactory.h" template<> @@ -197,12 +198,63 @@ void EdgeBasedGraphFactory::Run() { Percent p(_nodeBasedGraph->GetNumberOfNodes()); int numberOfSkippedTurns(0); int nodeBasedEdgeCounter(0); + int triviallySkippedEdges(0); + + std::vector > edgesToRemove; + std::vector<_NodeBasedEdge > edgesToInsert; + + //loop over graph and remove all trivially contractable edges. + for(_NodeBasedDynamicGraph::NodeIterator u = 0; u < _nodeBasedGraph->GetNumberOfNodes(); ++u ) { + for(_NodeBasedDynamicGraph::EdgeIterator e1 = _nodeBasedGraph->BeginEdges(u); e1 < _nodeBasedGraph->EndEdges(u); ++e1) { + _NodeBasedDynamicGraph::NodeIterator v = _nodeBasedGraph->GetTarget(e1); + const _NodeBasedDynamicGraph::EdgeData edgeData1 = _nodeBasedGraph->GetEdgeData(e1); + for(_NodeBasedDynamicGraph::EdgeIterator e2 = _nodeBasedGraph->BeginEdges(v); e2 < _nodeBasedGraph->EndEdges(v); ++e2) { + //TODO: Nur vorwärts-kanten und bei ungerichteten kanten nur eine richtung einfügen. Vorsicht! + const _NodeBasedDynamicGraph::EdgeData edgeData2 = _nodeBasedGraph->GetEdgeData(e2); + _NodeBasedDynamicGraph::NodeIterator w = _nodeBasedGraph->GetTarget(e2); + double testAngle = GetAngleBetweenTwoEdges(inputNodeInfoList[u], inputNodeInfoList[v], inputNodeInfoList[w]); + if((testAngle > 179 && testAngle < 181) && _nodeBasedGraph->GetOutDegree(v) <= 2 && edgeData1.nameID == edgeData2.nameID && + edgeData1.backward == edgeData2.backward && edgeData1.isAccessRestricted == edgeData2.isAccessRestricted) { + + //remove edges (u,v), (v,w) + edgesToRemove.push_back(std::make_pair(u,v)); + edgesToRemove.push_back(std::make_pair(v,w)); + + //add edge (v,w) with combined distance + _NodeBasedEdge newEdge; + newEdge.source = u; newEdge.target = w; + newEdge.data = edgeData1; newEdge.data.distance += edgeData2.distance; + ++triviallySkippedEdges; + edgesToInsert.push_back(newEdge); + } + } + } + } + + INFO("Inserting " << edgesToInsert.size() << " contracted edges"); + + Percent percent(edgesToInsert.size()); + for(unsigned i = 0; i < 10; ++i) { + _nodeBasedGraph->DeleteEdge(edgesToRemove[2*i].first, edgesToRemove[2*i].second); + _nodeBasedGraph->DeleteEdge(edgesToRemove[2*i+1].first, edgesToRemove[2*i+1].second); + + INFO("->delete edge (" << edgesToRemove[2*i].first << "," << edgesToRemove[2*i].second << ")"); + INFO("->delete edge (" << edgesToRemove[2*i+1].first << "," << edgesToRemove[2*i+1].second << ")"); + + _NodeBasedEdge edge = edgesToInsert[i]; + INFO(" inserted edge (" << edge.source << "," << edge.target << ") " << i << "/" << edgesToInsert.size()); + assert(edge.source < _nodeBasedGraph->GetNumberOfNodes()); + assert(edge.target < _nodeBasedGraph->GetNumberOfNodes()); + _nodeBasedGraph->InsertEdge(edge.source, edge.target, edge.data); + percent.printIncrement(); + } + + INFO("Generating Edge-based Nodes"); //loop over all edges and generate new set of nodes. for(_NodeBasedDynamicGraph::NodeIterator u = 0; u < _nodeBasedGraph->GetNumberOfNodes(); ++u ) { for(_NodeBasedDynamicGraph::EdgeIterator e1 = _nodeBasedGraph->BeginEdges(u); e1 < _nodeBasedGraph->EndEdges(u); ++e1) { _NodeBasedDynamicGraph::NodeIterator v = _nodeBasedGraph->GetTarget(e1); - if(_nodeBasedGraph->GetEdgeData(e1).type != SHRT_MAX) { assert(e1 != UINT_MAX); assert(u != UINT_MAX); @@ -270,6 +322,7 @@ void EdgeBasedGraphFactory::Run() { INFO("Edge-based graph contains " << edgeBasedEdges.size() << " edges, blowup is " << (double)edgeBasedEdges.size()/(double)nodeBasedEdgeCounter); INFO("Edge-based graph skipped " << numberOfSkippedTurns << " turns, defined by " << numberOfTurnRestrictions << " restrictions."); INFO("Generated " << edgeBasedNodes.size() << " edge based nodes"); + INFO("Trivially contracted edges: " << triviallySkippedEdges); } short EdgeBasedGraphFactory::AnalyzeTurn(const NodeID u, const NodeID v, const NodeID w) const {