Fixing corner case in contractor which may have lead to an incorrect
path with correct distance. Thx @DennisSchiefer
This commit is contained in:
parent
db9292ee86
commit
62f31f3e2d
@ -66,7 +66,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef DynamicGraph< _ContractorEdgeData > _DynamicGraph;
|
typedef DynamicGraph< _ContractorEdgeData > _DynamicGraph;
|
||||||
// typedef BinaryHeap< NodeID, NodeID, int, _HeapData, ArrayStorage<NodeID, NodeID> > _Heap;
|
// typedef BinaryHeap< NodeID, NodeID, int, _HeapData, ArrayStorage<NodeID, NodeID> > _Heap;
|
||||||
typedef BinaryHeap< NodeID, NodeID, int, _HeapData, XORFastHashStorage<NodeID, NodeID> > _Heap;
|
typedef BinaryHeap< NodeID, NodeID, int, _HeapData, XORFastHashStorage<NodeID, NodeID> > _Heap;
|
||||||
typedef _DynamicGraph::InputEdge _ContractorEdge;
|
typedef _DynamicGraph::InputEdge _ContractorEdge;
|
||||||
|
|
||||||
@ -136,7 +136,7 @@ public:
|
|||||||
const NodeID source = edges[i].source;
|
const NodeID source = edges[i].source;
|
||||||
const NodeID target = edges[i].target;
|
const NodeID target = edges[i].target;
|
||||||
const NodeID id = edges[i].data.id;
|
const NodeID id = edges[i].data.id;
|
||||||
// const short turnType = edges[i].data.turnInstruction;
|
// const short turnType = edges[i].data.turnInstruction;
|
||||||
//remove eigenloops
|
//remove eigenloops
|
||||||
if ( source == target ) {
|
if ( source == target ) {
|
||||||
i++;
|
i++;
|
||||||
@ -176,36 +176,36 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::cout << "merged " << edges.size() - edge << " edges out of " << edges.size() << std::endl;
|
std::cout << "merged " << edges.size() - edge << " edges out of " << edges.size() << std::endl;
|
||||||
// edges.resize( edge );
|
// edges.resize( edge );
|
||||||
|
|
||||||
_graph.reset( new _DynamicGraph( nodes, edges ) );
|
_graph.reset( new _DynamicGraph( nodes, edges ) );
|
||||||
edges.clear();
|
edges.clear();
|
||||||
// unsigned maxdegree = 0;
|
// unsigned maxdegree = 0;
|
||||||
// NodeID highestNode = 0;
|
// NodeID highestNode = 0;
|
||||||
//
|
//
|
||||||
// for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) {
|
// for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) {
|
||||||
// unsigned degree = _graph->EndEdges(i) - _graph->BeginEdges(i);
|
// unsigned degree = _graph->EndEdges(i) - _graph->BeginEdges(i);
|
||||||
// if(degree > maxdegree) {
|
// if(degree > maxdegree) {
|
||||||
// maxdegree = degree;
|
// maxdegree = degree;
|
||||||
// highestNode = i;
|
// highestNode = i;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// INFO("edges at node with id " << highestNode << " has degree " << maxdegree);
|
// INFO("edges at node with id " << highestNode << " has degree " << maxdegree);
|
||||||
// for(unsigned i = _graph->BeginEdges(highestNode); i < _graph->EndEdges(highestNode); ++i) {
|
// for(unsigned i = _graph->BeginEdges(highestNode); i < _graph->EndEdges(highestNode); ++i) {
|
||||||
// INFO(" ->(" << highestNode << "," << _graph->GetTarget(i) << "); via: " << _graph->GetEdgeData(i).via);
|
// INFO(" ->(" << highestNode << "," << _graph->GetTarget(i) << "); via: " << _graph->GetEdgeData(i).via);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
//Create temporary file
|
//Create temporary file
|
||||||
|
|
||||||
// GetTemporaryFileName(temporaryEdgeStorageFilename);
|
// GetTemporaryFileName(temporaryEdgeStorageFilename);
|
||||||
temporaryStorageSlotID = TemporaryStorage::GetInstance().allocateSlot();
|
temporaryStorageSlotID = TemporaryStorage::GetInstance().allocateSlot();
|
||||||
std::cout << "contractor finished initalization" << std::endl;
|
std::cout << "contractor finished initalization" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
~Contractor() {
|
~Contractor() {
|
||||||
//Delete temporary file
|
//Delete temporary file
|
||||||
// remove(temporaryEdgeStorageFilename.c_str());
|
// remove(temporaryEdgeStorageFilename.c_str());
|
||||||
TemporaryStorage::GetInstance().deallocateSlot(temporaryStorageSlotID);
|
TemporaryStorage::GetInstance().deallocateSlot(temporaryStorageSlotID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,7 +271,7 @@ public:
|
|||||||
}
|
}
|
||||||
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
||||||
//Write dummy number of edges to temporary file
|
//Write dummy number of edges to temporary file
|
||||||
// std::ofstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
// std::ofstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
||||||
long initialFilePosition = tempStorage.tell(temporaryStorageSlotID);
|
long initialFilePosition = tempStorage.tell(temporaryStorageSlotID);
|
||||||
unsigned numberOfTemporaryEdges = 0;
|
unsigned numberOfTemporaryEdges = 0;
|
||||||
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
||||||
@ -307,7 +307,7 @@ public:
|
|||||||
tempStorage.seek(temporaryStorageSlotID, initialFilePosition);
|
tempStorage.seek(temporaryStorageSlotID, initialFilePosition);
|
||||||
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
||||||
|
|
||||||
// INFO("Flushed " << numberOfTemporaryEdges << " edges to disk");
|
// INFO("Flushed " << numberOfTemporaryEdges << " edges to disk");
|
||||||
|
|
||||||
//Delete map from old NodeIDs to new ones.
|
//Delete map from old NodeIDs to new ones.
|
||||||
std::vector<NodeID>().swap(newNodeIDFromOldNodeIDMap);
|
std::vector<NodeID>().swap(newNodeIDFromOldNodeIDMap);
|
||||||
@ -376,7 +376,7 @@ public:
|
|||||||
for ( int i = 0; i < ( int ) data.insertedEdges.size(); ++i ) {
|
for ( int i = 0; i < ( int ) data.insertedEdges.size(); ++i ) {
|
||||||
const _ContractorEdge& edge = data.insertedEdges[i];
|
const _ContractorEdge& edge = data.insertedEdges[i];
|
||||||
_DynamicGraph::EdgeIterator currentEdgeID = _graph->FindEdge(edge.source, edge.target);
|
_DynamicGraph::EdgeIterator currentEdgeID = _graph->FindEdge(edge.source, edge.target);
|
||||||
if(currentEdgeID != _graph->EndEdges(edge.source)) {
|
if(currentEdgeID != _graph->EndEdges(edge.source) && _graph->GetEdgeData(currentEdgeID).shortcut) {
|
||||||
_DynamicGraph::EdgeData & currentEdgeData = _graph->GetEdgeData(currentEdgeID);
|
_DynamicGraph::EdgeData & currentEdgeData = _graph->GetEdgeData(currentEdgeID);
|
||||||
if(edge.data.forward == currentEdgeData.forward && edge.data.backward == currentEdgeData.backward ) {
|
if(edge.data.forward == currentEdgeData.forward && edge.data.backward == currentEdgeData.backward ) {
|
||||||
if(_graph->GetEdgeData(_graph->FindEdge(edge.source, edge.target)).distance <= edge.data.distance) {
|
if(_graph->GetEdgeData(_graph->FindEdge(edge.source, edge.target)).distance <= edge.data.distance) {
|
||||||
@ -388,7 +388,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_graph->InsertEdge( edge.source, edge.target, edge.data );
|
_graph->InsertEdge( data.insertedEdges[i].source, data.insertedEdges[i].target, data.insertedEdges[i].data );
|
||||||
}
|
}
|
||||||
data.insertedEdges.clear();
|
data.insertedEdges.clear();
|
||||||
}
|
}
|
||||||
@ -406,26 +406,26 @@ public:
|
|||||||
numberOfContractedNodes += last - firstIndependent;
|
numberOfContractedNodes += last - firstIndependent;
|
||||||
remainingNodes.resize( firstIndependent );
|
remainingNodes.resize( firstIndependent );
|
||||||
std::vector< std::pair< NodeID, bool > >( remainingNodes ).swap( remainingNodes );
|
std::vector< std::pair< NodeID, bool > >( remainingNodes ).swap( remainingNodes );
|
||||||
// unsigned maxdegree = 0;
|
// unsigned maxdegree = 0;
|
||||||
// unsigned avgdegree = 0;
|
// unsigned avgdegree = 0;
|
||||||
// unsigned mindegree = UINT_MAX;
|
// unsigned mindegree = UINT_MAX;
|
||||||
// unsigned quaddegree = 0;
|
// unsigned quaddegree = 0;
|
||||||
//
|
//
|
||||||
// for(unsigned i = 0; i < remainingNodes.size(); ++i) {
|
// for(unsigned i = 0; i < remainingNodes.size(); ++i) {
|
||||||
// unsigned degree = _graph->EndEdges(remainingNodes[i].first) - _graph->BeginEdges(remainingNodes[i].first);
|
// unsigned degree = _graph->EndEdges(remainingNodes[i].first) - _graph->BeginEdges(remainingNodes[i].first);
|
||||||
// if(degree > maxdegree)
|
// if(degree > maxdegree)
|
||||||
// maxdegree = degree;
|
// maxdegree = degree;
|
||||||
// if(degree < mindegree)
|
// if(degree < mindegree)
|
||||||
// mindegree = degree;
|
// mindegree = degree;
|
||||||
//
|
//
|
||||||
// avgdegree += degree;
|
// avgdegree += degree;
|
||||||
// quaddegree += (degree*degree);
|
// quaddegree += (degree*degree);
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// avgdegree /= std::max((unsigned)1,(unsigned)remainingNodes.size() );
|
// avgdegree /= std::max((unsigned)1,(unsigned)remainingNodes.size() );
|
||||||
// quaddegree /= std::max((unsigned)1,(unsigned)remainingNodes.size() );
|
// quaddegree /= std::max((unsigned)1,(unsigned)remainingNodes.size() );
|
||||||
//
|
//
|
||||||
// INFO("rest: " << remainingNodes.size() << ", max: " << maxdegree << ", min: " << mindegree << ", avg: " << avgdegree << ", quad: " << quaddegree);
|
// INFO("rest: " << remainingNodes.size() << ", max: " << maxdegree << ", min: " << mindegree << ", avg: " << avgdegree << ", quad: " << quaddegree);
|
||||||
|
|
||||||
p.printStatus(numberOfContractedNodes);
|
p.printStatus(numberOfContractedNodes);
|
||||||
}
|
}
|
||||||
@ -470,7 +470,7 @@ public:
|
|||||||
std::vector<NodeID>().swap(oldNodeIDFromNewNodeIDMap);
|
std::vector<NodeID>().swap(oldNodeIDFromNewNodeIDMap);
|
||||||
INFO("Loading temporary edges");
|
INFO("Loading temporary edges");
|
||||||
|
|
||||||
// std::ifstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
// std::ifstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
||||||
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
||||||
//Also get the edges from temporary storage
|
//Also get the edges from temporary storage
|
||||||
unsigned numberOfTemporaryEdges = 0;
|
unsigned numberOfTemporaryEdges = 0;
|
||||||
@ -578,8 +578,8 @@ private:
|
|||||||
|
|
||||||
heap.Clear();
|
heap.Clear();
|
||||||
heap.Insert( source, 0, _HeapData() );
|
heap.Insert( source, 0, _HeapData() );
|
||||||
// if ( node != source )
|
// if ( node != source )
|
||||||
// heap.Insert( node, inData.distance, _HeapData() );
|
// heap.Insert( node, inData.distance, _HeapData() );
|
||||||
int maxDistance = 0;
|
int maxDistance = 0;
|
||||||
unsigned numTargets = 0;
|
unsigned numTargets = 0;
|
||||||
|
|
||||||
@ -763,7 +763,7 @@ private:
|
|||||||
|
|
||||||
boost::shared_ptr<_DynamicGraph> _graph;
|
boost::shared_ptr<_DynamicGraph> _graph;
|
||||||
std::vector<_DynamicGraph::InputEdge> contractedEdges;
|
std::vector<_DynamicGraph::InputEdge> contractedEdges;
|
||||||
// std::string temporaryEdgeStorageFilename;
|
// std::string temporaryEdgeStorageFilename;
|
||||||
unsigned temporaryStorageSlotID;
|
unsigned temporaryStorageSlotID;
|
||||||
std::vector<NodeID> oldNodeIDFromNewNodeIDMap;
|
std::vector<NodeID> oldNodeIDFromNewNodeIDMap;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user