Fixes issue #334 (partially)

This commit is contained in:
DennisOSRM 2012-08-22 16:46:47 +02:00
parent f69076f55c
commit 818c66e774

View File

@ -359,6 +359,7 @@ public:
_Contract< false > ( data, x );
//nodePriority[x] = -1;
}
std::sort( data->insertedEdges.begin(), data->insertedEdges.end() );
}
#pragma omp parallel
@ -371,45 +372,24 @@ public:
}
}
//insert new edges
for ( unsigned threadNum = 0; threadNum < maxThreads; ++threadNum ) {
_ThreadData& data = *threadData[threadNum];
for ( int i = 0; i < ( int ) data.insertedEdges.size(); ++i ) {
_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;
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) {
continue;
}
} 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 {
if(currentEdgeData.distance > edge.data.distance) {
currentEdgeData.distance = edge.data.distance;
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( edgeToInsert.source, edgeToInsert.target, edgeToInsert.data );
_graph->InsertEdge( edge.source, edge.target, edge.data );
}
data.insertedEdges.clear();
}
@ -520,7 +500,7 @@ public:
}
private:
inline void _Dijkstra( const int maxDistance, const unsigned numTargets, const int maxNodes, const int hopLimit, _ThreadData* const data ){
inline void _Dijkstra( const int maxDistance, const unsigned numTargets, const int maxNodes, _ThreadData* const data ){
_Heap& heap = data->heap;
@ -543,9 +523,6 @@ private:
return;
}
if(currentHop >= hopLimit)
continue;
//iterate over all edges of node
for ( _DynamicGraph::EdgeIterator edge = _graph->BeginEdges( node ), endEdges = _graph->EndEdges( node ); edge != endEdges; ++edge ) {
const _ContractorEdgeData& data = _graph->GetEdgeData( edge );
@ -623,9 +600,9 @@ private:
}
if( Simulate )
_Dijkstra( maxDistance, numTargets, 1000, (true ? INT_MAX : 5), data );
_Dijkstra( maxDistance, numTargets, 1000, data );
else
_Dijkstra( maxDistance, numTargets, 2000, (true ? INT_MAX : 7), data );
_Dijkstra( maxDistance, numTargets, 2000, data );
for ( _DynamicGraph::EdgeIterator outEdge = _graph->BeginEdges( node ), endOutEdges = _graph->EndEdges( node ); outEdge != endOutEdges; ++outEdge ) {
const _ContractorEdgeData& outData = _graph->GetEdgeData( outEdge );