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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,79 +243,79 @@ public:
|
|||||||
|
|
||||||
bool flushedContractor = false;
|
bool flushedContractor = false;
|
||||||
while ( numberOfContractedNodes < numberOfNodes ) {
|
while ( numberOfContractedNodes < numberOfNodes ) {
|
||||||
if(!flushedContractor && (numberOfContractedNodes > (numberOfNodes*0.65) ) ){
|
if(!flushedContractor && (numberOfContractedNodes > (numberOfNodes*0.65) ) ){
|
||||||
DeallocatingVector<_ContractorEdge> newSetOfEdges; //this one is not explicitely cleared since it goes out of scope anywa
|
DeallocatingVector<_ContractorEdge> newSetOfEdges; //this one is not explicitely cleared since it goes out of scope anywa
|
||||||
std::cout << " [flush " << numberOfContractedNodes << " nodes] " << std::flush;
|
std::cout << " [flush " << numberOfContractedNodes << " nodes] " << std::flush;
|
||||||
|
|
||||||
//Delete old heap data to free memory that we need for the coming operations
|
//Delete old heap data to free memory that we need for the coming operations
|
||||||
for ( unsigned threadNum = 0; threadNum < maxThreads; threadNum++ ) {
|
for ( unsigned threadNum = 0; threadNum < maxThreads; threadNum++ ) {
|
||||||
delete threadData[threadNum];
|
delete threadData[threadNum];
|
||||||
}
|
}
|
||||||
threadData.clear();
|
threadData.clear();
|
||||||
|
|
||||||
|
|
||||||
//Create new priority array
|
//Create new priority array
|
||||||
std::vector<float> newNodePriority(remainingNodes.size());
|
std::vector<float> newNodePriority(remainingNodes.size());
|
||||||
//this map gives the old IDs from the new ones, necessary to get a consistent graph at the end of contraction
|
//this map gives the old IDs from the new ones, necessary to get a consistent graph at the end of contraction
|
||||||
oldNodeIDFromNewNodeIDMap.resize(remainingNodes.size());
|
oldNodeIDFromNewNodeIDMap.resize(remainingNodes.size());
|
||||||
//this map gives the new IDs from the old ones, necessary to remap targets from the remaining graph
|
//this map gives the new IDs from the old ones, necessary to remap targets from the remaining graph
|
||||||
std::vector<NodeID> newNodeIDFromOldNodeIDMap(numberOfNodes, UINT_MAX);
|
std::vector<NodeID> newNodeIDFromOldNodeIDMap(numberOfNodes, UINT_MAX);
|
||||||
|
|
||||||
//build forward and backward renumbering map and remap ids in remainingNodes and Priorities.
|
|
||||||
for(unsigned newNodeID = 0; newNodeID < remainingNodes.size(); ++newNodeID) {
|
|
||||||
//create renumbering maps in both directions
|
|
||||||
oldNodeIDFromNewNodeIDMap[newNodeID] = remainingNodes[newNodeID].first;
|
|
||||||
newNodeIDFromOldNodeIDMap[remainingNodes[newNodeID].first] = newNodeID;
|
|
||||||
newNodePriority[newNodeID] = nodePriority[remainingNodes[newNodeID].first];
|
|
||||||
remainingNodes[newNodeID].first = newNodeID;
|
|
||||||
}
|
|
||||||
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
|
||||||
//Write dummy number of edges to temporary file
|
|
||||||
// std::ofstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
|
||||||
long initialFilePosition = tempStorage.tell(temporaryStorageSlotID);
|
|
||||||
unsigned numberOfTemporaryEdges = 0;
|
|
||||||
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
|
||||||
|
|
||||||
//walk over all nodes
|
//build forward and backward renumbering map and remap ids in remainingNodes and Priorities.
|
||||||
for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) {
|
for(unsigned newNodeID = 0; newNodeID < remainingNodes.size(); ++newNodeID) {
|
||||||
//INFO("Restructuring node " << i << "|" << _graph->GetNumberOfNodes());
|
//create renumbering maps in both directions
|
||||||
const NodeID start = i;
|
oldNodeIDFromNewNodeIDMap[newNodeID] = remainingNodes[newNodeID].first;
|
||||||
for(_DynamicGraph::EdgeIterator currentEdge = _graph->BeginEdges(start); currentEdge < _graph->EndEdges(start); ++currentEdge) {
|
newNodeIDFromOldNodeIDMap[remainingNodes[newNodeID].first] = newNodeID;
|
||||||
_DynamicGraph::EdgeData & data = _graph->GetEdgeData(currentEdge);
|
newNodePriority[newNodeID] = nodePriority[remainingNodes[newNodeID].first];
|
||||||
const NodeID target = _graph->GetTarget(currentEdge);
|
remainingNodes[newNodeID].first = newNodeID;
|
||||||
if(UINT_MAX == newNodeIDFromOldNodeIDMap[i] ){
|
}
|
||||||
//Save edges of this node w/o renumbering.
|
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
||||||
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&start, sizeof(NodeID));
|
//Write dummy number of edges to temporary file
|
||||||
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&target, sizeof(NodeID));
|
// std::ofstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
||||||
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
long initialFilePosition = tempStorage.tell(temporaryStorageSlotID);
|
||||||
++numberOfTemporaryEdges;
|
unsigned numberOfTemporaryEdges = 0;
|
||||||
}else {
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
||||||
|
|
||||||
|
//walk over all nodes
|
||||||
|
for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) {
|
||||||
|
//INFO("Restructuring node " << i << "|" << _graph->GetNumberOfNodes());
|
||||||
|
const NodeID start = i;
|
||||||
|
for(_DynamicGraph::EdgeIterator currentEdge = _graph->BeginEdges(start); currentEdge < _graph->EndEdges(start); ++currentEdge) {
|
||||||
|
_DynamicGraph::EdgeData & data = _graph->GetEdgeData(currentEdge);
|
||||||
|
const NodeID target = _graph->GetTarget(currentEdge);
|
||||||
|
if(UINT_MAX == newNodeIDFromOldNodeIDMap[i] ){
|
||||||
|
//Save edges of this node w/o renumbering.
|
||||||
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&start, sizeof(NodeID));
|
||||||
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&target, sizeof(NodeID));
|
||||||
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
||||||
|
++numberOfTemporaryEdges;
|
||||||
|
}else {
|
||||||
//node is not yet contracted.
|
//node is not yet contracted.
|
||||||
//add (renumbered) outgoing edges to new DynamicGraph.
|
//add (renumbered) outgoing edges to new DynamicGraph.
|
||||||
_ContractorEdge newEdge;
|
_ContractorEdge newEdge;
|
||||||
newEdge.source = newNodeIDFromOldNodeIDMap[start];
|
newEdge.source = newNodeIDFromOldNodeIDMap[start];
|
||||||
newEdge.target = newNodeIDFromOldNodeIDMap[target];
|
newEdge.target = newNodeIDFromOldNodeIDMap[target];
|
||||||
newEdge.data = data;
|
newEdge.data = data;
|
||||||
newEdge.data.originalViaNodeID = true;
|
newEdge.data.originalViaNodeID = true;
|
||||||
assert(UINT_MAX != newNodeIDFromOldNodeIDMap[start] );
|
assert(UINT_MAX != newNodeIDFromOldNodeIDMap[start] );
|
||||||
assert(UINT_MAX != newNodeIDFromOldNodeIDMap[target]);
|
assert(UINT_MAX != newNodeIDFromOldNodeIDMap[target]);
|
||||||
newSetOfEdges.push_back(newEdge);
|
newSetOfEdges.push_back(newEdge);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Note the number of temporarily stored edges
|
//Note the number of temporarily stored edges
|
||||||
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);
|
||||||
|
|
||||||
//Replace old priorities array by new one
|
//Replace old priorities array by new one
|
||||||
nodePriority.swap(newNodePriority);
|
nodePriority.swap(newNodePriority);
|
||||||
//Delete old nodePriority vector
|
//Delete old nodePriority vector
|
||||||
std::vector<float>().swap(newNodePriority);
|
std::vector<float>().swap(newNodePriority);
|
||||||
//old Graph is removed
|
//old Graph is removed
|
||||||
_graph.reset();
|
_graph.reset();
|
||||||
|
|
||||||
@ -325,14 +325,14 @@ public:
|
|||||||
//int nodes, const ContainerT &graph
|
//int nodes, const ContainerT &graph
|
||||||
_graph.reset( new _DynamicGraph(remainingNodes.size(), newSetOfEdges));
|
_graph.reset( new _DynamicGraph(remainingNodes.size(), newSetOfEdges));
|
||||||
newSetOfEdges.clear();
|
newSetOfEdges.clear();
|
||||||
flushedContractor = true;
|
flushedContractor = true;
|
||||||
|
|
||||||
//INFO: MAKE SURE THIS IS THE LAST OPERATION OF THE FLUSH!
|
//INFO: MAKE SURE THIS IS THE LAST OPERATION OF THE FLUSH!
|
||||||
//reinitialize heaps and ThreadData objects with appropriate size
|
//reinitialize heaps and ThreadData objects with appropriate size
|
||||||
for ( unsigned threadNum = 0; threadNum < maxThreads; ++threadNum ) {
|
for ( unsigned threadNum = 0; threadNum < maxThreads; ++threadNum ) {
|
||||||
threadData.push_back( new _ThreadData( _graph->GetNumberOfNodes() ) );
|
threadData.push_back( new _ThreadData( _graph->GetNumberOfNodes() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const int last = ( int ) remainingNodes.size();
|
const int last = ( int ) remainingNodes.size();
|
||||||
#pragma omp parallel
|
#pragma omp parallel
|
||||||
@ -371,12 +371,12 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//insert new edges
|
//insert new edges
|
||||||
for ( unsigned threadNum = 0; threadNum < maxThreads; ++threadNum ) {
|
for ( unsigned threadNum = 0; threadNum < maxThreads; ++threadNum ) {
|
||||||
_ThreadData& data = *threadData[threadNum];
|
_ThreadData& data = *threadData[threadNum];
|
||||||
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);
|
||||||
}
|
}
|
||||||
@ -440,37 +440,37 @@ public:
|
|||||||
INFO("Getting edges of minimized graph");
|
INFO("Getting edges of minimized graph");
|
||||||
NodeID numberOfNodes = _graph->GetNumberOfNodes();
|
NodeID numberOfNodes = _graph->GetNumberOfNodes();
|
||||||
if(oldNodeIDFromNewNodeIDMap.size()) {
|
if(oldNodeIDFromNewNodeIDMap.size()) {
|
||||||
for ( NodeID node = 0; node < numberOfNodes; ++node ) {
|
for ( NodeID node = 0; node < numberOfNodes; ++node ) {
|
||||||
p.printStatus(node);
|
p.printStatus(node);
|
||||||
for ( _DynamicGraph::EdgeIterator edge = _graph->BeginEdges( node ), endEdges = _graph->EndEdges( node ); edge < endEdges; ++edge ) {
|
for ( _DynamicGraph::EdgeIterator edge = _graph->BeginEdges( node ), endEdges = _graph->EndEdges( node ); edge < endEdges; ++edge ) {
|
||||||
const NodeID target = _graph->GetTarget( edge );
|
const NodeID target = _graph->GetTarget( edge );
|
||||||
const _DynamicGraph::EdgeData& data = _graph->GetEdgeData( edge );
|
const _DynamicGraph::EdgeData& data = _graph->GetEdgeData( edge );
|
||||||
Edge newEdge;
|
Edge newEdge;
|
||||||
newEdge.source = oldNodeIDFromNewNodeIDMap[node];
|
newEdge.source = oldNodeIDFromNewNodeIDMap[node];
|
||||||
newEdge.target = oldNodeIDFromNewNodeIDMap[target];
|
newEdge.target = oldNodeIDFromNewNodeIDMap[target];
|
||||||
assert(UINT_MAX != newEdge.source);
|
assert(UINT_MAX != newEdge.source);
|
||||||
assert(UINT_MAX != newEdge.target);
|
assert(UINT_MAX != newEdge.target);
|
||||||
|
|
||||||
newEdge.data.distance = data.distance;
|
newEdge.data.distance = data.distance;
|
||||||
newEdge.data.shortcut = data.shortcut;
|
newEdge.data.shortcut = data.shortcut;
|
||||||
if(!data.originalViaNodeID)
|
if(!data.originalViaNodeID)
|
||||||
newEdge.data.id = oldNodeIDFromNewNodeIDMap[data.id];
|
newEdge.data.id = oldNodeIDFromNewNodeIDMap[data.id];
|
||||||
else
|
else
|
||||||
newEdge.data.id = data.id;
|
newEdge.data.id = data.id;
|
||||||
|
|
||||||
assert(newEdge.data.id != UINT_MAX);
|
assert(newEdge.data.id != UINT_MAX);
|
||||||
newEdge.data.forward = data.forward;
|
newEdge.data.forward = data.forward;
|
||||||
newEdge.data.backward = data.backward;
|
newEdge.data.backward = data.backward;
|
||||||
edges.push_back( newEdge );
|
edges.push_back( newEdge );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
INFO("Renumbered edges of minimized graph, freeing space");
|
INFO("Renumbered edges of minimized graph, freeing space");
|
||||||
_graph.reset();
|
_graph.reset();
|
||||||
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;
|
||||||
@ -481,18 +481,18 @@ public:
|
|||||||
//edges.reserve(edges.size()+numberOfTemporaryEdges);
|
//edges.reserve(edges.size()+numberOfTemporaryEdges);
|
||||||
_DynamicGraph::EdgeData data;
|
_DynamicGraph::EdgeData data;
|
||||||
for(unsigned i = 0; i < numberOfTemporaryEdges; ++i) {
|
for(unsigned i = 0; i < numberOfTemporaryEdges; ++i) {
|
||||||
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&start, sizeof(NodeID));
|
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&start, sizeof(NodeID));
|
||||||
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&target, sizeof(NodeID));
|
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&target, sizeof(NodeID));
|
||||||
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
||||||
Edge newEdge;
|
Edge newEdge;
|
||||||
newEdge.source = start;
|
newEdge.source = start;
|
||||||
newEdge.target = target;
|
newEdge.target = target;
|
||||||
newEdge.data.distance = data.distance;
|
newEdge.data.distance = data.distance;
|
||||||
newEdge.data.shortcut = data.shortcut;
|
newEdge.data.shortcut = data.shortcut;
|
||||||
newEdge.data.id = data.id;
|
newEdge.data.id = data.id;
|
||||||
newEdge.data.forward = data.forward;
|
newEdge.data.forward = data.forward;
|
||||||
newEdge.data.backward = data.backward;
|
newEdge.data.backward = data.backward;
|
||||||
edges.push_back( newEdge );
|
edges.push_back( newEdge );
|
||||||
}
|
}
|
||||||
tempStorage.deallocateSlot(temporaryStorageSlotID);
|
tempStorage.deallocateSlot(temporaryStorageSlotID);
|
||||||
INFO("CH has " << edges.size() << " edges");
|
INFO("CH has " << edges.size() << " edges");
|
||||||
@ -552,9 +552,9 @@ private:
|
|||||||
// Result will contain the priority
|
// Result will contain the priority
|
||||||
float result;
|
float result;
|
||||||
if ( stats.edgesDeleted == 0 || stats.originalEdgesDeleted == 0 )
|
if ( stats.edgesDeleted == 0 || stats.originalEdgesDeleted == 0 )
|
||||||
result = 1 * nodeData->depth;
|
result = 1 * nodeData->depth;
|
||||||
else
|
else
|
||||||
result = 2 * ((( float ) stats.edgesAdded ) / stats.edgesDeleted ) + 4 * ((( float ) stats.originalEdgesAdded ) / stats.originalEdgesDeleted ) + 1 * nodeData->depth;
|
result = 2 * ((( float ) stats.edgesAdded ) / stats.edgesDeleted ) + 4 * ((( float ) stats.originalEdgesAdded ) / stats.originalEdgesDeleted ) + 1 * nodeData->depth;
|
||||||
assert( result >= 0 );
|
assert( result >= 0 );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
@ -715,7 +715,7 @@ private:
|
|||||||
if ( priority > targetPriority )
|
if ( priority > targetPriority )
|
||||||
return false;
|
return false;
|
||||||
//tie breaking
|
//tie breaking
|
||||||
if ( fabs(priority - targetPriority) < FLT_EPSILON && bias(node, target) ) {
|
if ( fabs(priority - targetPriority) < FLT_EPSILON && bias(node, target) ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
neighbours.push_back( target );
|
neighbours.push_back( target );
|
||||||
@ -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