From f2ce4f0ff136e67e589c0c771aff9318e47ddd93 Mon Sep 17 00:00:00 2001 From: DennisOSRM Date: Wed, 27 Jun 2012 13:13:18 +0200 Subject: [PATCH] Better checks for parallel edges, thanks @DennisSchiefer --- Contractor/Contractor.h | 44 ++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/Contractor/Contractor.h b/Contractor/Contractor.h index 51d0fd34e..b4637fd85 100644 --- a/Contractor/Contractor.h +++ b/Contractor/Contractor.h @@ -368,21 +368,42 @@ public: for ( unsigned threadNum = 0; threadNum < maxThreads; ++threadNum ) { _ThreadData& data = *threadData[threadNum]; for ( int i = 0; i < ( int ) data.insertedEdges.size(); ++i ) { - const _ContractorEdge& edge = data.insertedEdges[i]; - _DynamicGraph::EdgeIterator currentEdgeID = _graph->FindEdge(edge.source, edge.target); - if(currentEdgeID != _graph->EndEdges(edge.source)) { - _DynamicGraph::EdgeData & currentEdgeData = _graph->GetEdgeData(currentEdgeID); - if(edge.data.forward == currentEdgeData.forward && edge.data.backward == currentEdgeData.backward ) { - if(_graph->GetEdgeData(_graph->FindEdge(edge.source, edge.target)).distance <= edge.data.distance) { + _ContractorEdge& edgeToInsert = data.insertedEdges[i]; + const _DynamicGraph::EdgeIterator existingEdgeID = _graph->FindEdge(edgeToInsert.source, edgeToInsert.target); + if(existingEdgeID != _graph->EndEdges(edgeToInsert.source)) { + _DynamicGraph::EdgeData & existingEdgeData = _graph->GetEdgeData(existingEdgeID); + if((edgeToInsert.data.forward == existingEdgeData.forward) && (edgeToInsert.data.backward == existingEdgeData.backward) ){ + if(existingEdgeData.distance <= edgeToInsert.data.distance) { + continue; + } else { + existingEdgeData.distance = edgeToInsert.data.distance; continue; } - if(currentEdgeData.distance > edge.data.distance) { - currentEdgeData.distance = edge.data.distance; + } else if(existingEdgeData.forward && existingEdgeData.backward) { + //existing edge is bidirectional, new edge is not + if(existingEdgeData.distance > edgeToInsert.data.distance) { + //split existing edge, because edge to insert is smaller in the one direction it goes than the existing edge + existingEdgeData.forward =~ edgeToInsert.data.forward; + existingEdgeData.backward =~ edgeToInsert.data.backward; + } else { continue; } + } else { + //new edge is bidirectional, existing one is not + if(existingEdgeData.distance > edgeToInsert.data.distance) { + existingEdgeData = edgeToInsert.data; + continue; + } else { + //existing edge is lower distance, but unidirectional. + //split new edge before insertion, because it is only valid in one direction +// edgeToInsert.data.forward =~ existingEdgeData.forward; +// edgeToInsert.data.backward =~ existingEdgeData.backward; + //INFO("should not happen too often"); + } } + } - _graph->InsertEdge( edge.source, edge.target, edge.data ); + _graph->InsertEdge( edgeToInsert.source, edgeToInsert.target, edgeToInsert.data ); } data.insertedEdges.clear(); } @@ -488,6 +509,7 @@ public: edges.push_back( newEdge ); } temporaryEdgeStorage.close(); + INFO("CH has " << edges.size() << " edges"); } private: @@ -573,8 +595,8 @@ private: heap.Clear(); heap.Insert( source, 0, _HeapData() ); - if ( node != source ) - heap.Insert( node, inData.distance, _HeapData() ); +// if ( node != source ) +// heap.Insert( node, inData.distance, _HeapData() ); int maxDistance = 0; unsigned numTargets = 0;