do not seek in temporary storage
This commit is contained in:
parent
682079adc6
commit
f47d944349
@ -54,10 +54,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
class Contractor {
|
class Contractor {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct _ContractorEdgeData {
|
struct ContractorEdgeData {
|
||||||
_ContractorEdgeData() :
|
ContractorEdgeData() :
|
||||||
distance(0), id(0), originalEdges(0), shortcut(0), forward(0), backward(0), originalViaNodeID(false) {}
|
distance(0), id(0), originalEdges(0), shortcut(0), forward(0), backward(0), originalViaNodeID(false) {}
|
||||||
_ContractorEdgeData( unsigned _distance, unsigned _originalEdges, unsigned _id, bool _shortcut, bool _forward, bool _backward) :
|
ContractorEdgeData( unsigned _distance, unsigned _originalEdges, unsigned _id, bool _shortcut, bool _forward, bool _backward) :
|
||||||
distance(_distance), id(_id), originalEdges(std::min((unsigned)1<<28, _originalEdges) ), shortcut(_shortcut), forward(_forward), backward(_backward), originalViaNodeID(false) {}
|
distance(_distance), id(_id), originalEdges(std::min((unsigned)1<<28, _originalEdges) ), shortcut(_shortcut), forward(_forward), backward(_backward), originalViaNodeID(false) {}
|
||||||
unsigned distance;
|
unsigned distance;
|
||||||
unsigned id;
|
unsigned id;
|
||||||
@ -75,7 +75,7 @@ private:
|
|||||||
_HeapData( short h, bool t ) : hop(h), target(t) {}
|
_HeapData( short h, bool t ) : hop(h), target(t) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
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;
|
||||||
@ -118,6 +118,7 @@ public:
|
|||||||
Contractor( int nodes, ContainerT& inputEdges) {
|
Contractor( int nodes, ContainerT& inputEdges) {
|
||||||
std::vector< _ContractorEdge > edges;
|
std::vector< _ContractorEdge > edges;
|
||||||
edges.reserve(inputEdges.size()*2);
|
edges.reserve(inputEdges.size()*2);
|
||||||
|
temp_edge_counter = 0;
|
||||||
|
|
||||||
typename ContainerT::deallocation_iterator diter = inputEdges.dbegin();
|
typename ContainerT::deallocation_iterator diter = inputEdges.dbegin();
|
||||||
typename ContainerT::deallocation_iterator dend = inputEdges.dend();
|
typename ContainerT::deallocation_iterator dend = inputEdges.dend();
|
||||||
@ -126,7 +127,7 @@ public:
|
|||||||
while(diter!=dend) {
|
while(diter!=dend) {
|
||||||
newEdge.source = diter->source();
|
newEdge.source = diter->source();
|
||||||
newEdge.target = diter->target();
|
newEdge.target = diter->target();
|
||||||
newEdge.data = _ContractorEdgeData( (std::max)((int)diter->weight(), 1 ), 1, diter->id(), false, diter->isForward(), diter->isBackward());
|
newEdge.data = ContractorEdgeData( (std::max)((int)diter->weight(), 1 ), 1, diter->id(), false, diter->isForward(), diter->isBackward());
|
||||||
|
|
||||||
BOOST_ASSERT_MSG( newEdge.data.distance > 0, "edge distance < 1" );
|
BOOST_ASSERT_MSG( newEdge.data.distance > 0, "edge distance < 1" );
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
@ -195,6 +196,7 @@ public:
|
|||||||
_graph = boost::make_shared<_DynamicGraph>( nodes, edges );
|
_graph = boost::make_shared<_DynamicGraph>( nodes, edges );
|
||||||
edges.clear();
|
edges.clear();
|
||||||
std::vector<_ContractorEdge>().swap(edges);
|
std::vector<_ContractorEdge>().swap(edges);
|
||||||
|
BOOST_ASSERT( 0 == edges.capacity() );
|
||||||
// unsigned maxdegree = 0;
|
// unsigned maxdegree = 0;
|
||||||
// NodeID highestNode = 0;
|
// NodeID highestNode = 0;
|
||||||
//
|
//
|
||||||
@ -214,14 +216,14 @@ public:
|
|||||||
//Create temporary file
|
//Create temporary file
|
||||||
|
|
||||||
// GetTemporaryFileName(temporaryEdgeStorageFilename);
|
// GetTemporaryFileName(temporaryEdgeStorageFilename);
|
||||||
temporaryStorageSlotID = TemporaryStorage::GetInstance().AllocateSlot();
|
edge_storage_slot = 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(edge_storage_slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Run() {
|
void Run() {
|
||||||
@ -264,11 +266,11 @@ public:
|
|||||||
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
|
||||||
BOOST_FOREACH(_ThreadData * data, threadData)
|
BOOST_FOREACH(_ThreadData * data, threadData) {
|
||||||
delete data;
|
delete data;
|
||||||
|
}
|
||||||
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
|
||||||
@ -285,12 +287,6 @@ public:
|
|||||||
remainingNodes[newNodeID].id = newNodeID;
|
remainingNodes[newNodeID].id = newNodeID;
|
||||||
}
|
}
|
||||||
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
||||||
//Write dummy number of edges to temporary file
|
|
||||||
// std::ofstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
|
||||||
uint64_t initialFilePosition = tempStorage.Tell(temporaryStorageSlotID);
|
|
||||||
unsigned numberOfTemporaryEdges = 0;
|
|
||||||
tempStorage.WriteToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
|
||||||
|
|
||||||
//walk over all nodes
|
//walk over all nodes
|
||||||
for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) {
|
for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) {
|
||||||
const NodeID start = i;
|
const NodeID start = i;
|
||||||
@ -299,10 +295,10 @@ public:
|
|||||||
const NodeID target = _graph->GetTarget(currentEdge);
|
const NodeID target = _graph->GetTarget(currentEdge);
|
||||||
if(UINT_MAX == newNodeIDFromOldNodeIDMap[i] ){
|
if(UINT_MAX == newNodeIDFromOldNodeIDMap[i] ){
|
||||||
//Save edges of this node w/o renumbering.
|
//Save edges of this node w/o renumbering.
|
||||||
tempStorage.WriteToSlot(temporaryStorageSlotID, (char*)&start, sizeof(NodeID));
|
tempStorage.WriteToSlot(edge_storage_slot, (char*)&start, sizeof(NodeID));
|
||||||
tempStorage.WriteToSlot(temporaryStorageSlotID, (char*)&target, sizeof(NodeID));
|
tempStorage.WriteToSlot(edge_storage_slot, (char*)&target, sizeof(NodeID));
|
||||||
tempStorage.WriteToSlot(temporaryStorageSlotID, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
tempStorage.WriteToSlot(edge_storage_slot, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
||||||
++numberOfTemporaryEdges;
|
++temp_edge_counter;
|
||||||
} else {
|
} 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.
|
||||||
@ -323,9 +319,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Note the number of temporarily stored edges
|
|
||||||
tempStorage.Seek(temporaryStorageSlotID, initialFilePosition);
|
|
||||||
tempStorage.WriteToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
|
||||||
|
|
||||||
//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);
|
||||||
@ -454,13 +447,13 @@ public:
|
|||||||
SimpleLogger().Write() << "Getting edges of minimized graph";
|
SimpleLogger().Write() << "Getting edges of minimized graph";
|
||||||
NodeID numberOfNodes = _graph->GetNumberOfNodes();
|
NodeID numberOfNodes = _graph->GetNumberOfNodes();
|
||||||
if(_graph->GetNumberOfNodes()) {
|
if(_graph->GetNumberOfNodes()) {
|
||||||
|
Edge newEdge;
|
||||||
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;
|
if( !oldNodeIDFromNewNodeIDMap.empty() ) {
|
||||||
if(0 != oldNodeIDFromNewNodeIDMap.size()) {
|
|
||||||
newEdge.source = oldNodeIDFromNewNodeIDMap[node];
|
newEdge.source = oldNodeIDFromNewNodeIDMap[node];
|
||||||
newEdge.target = oldNodeIDFromNewNodeIDMap[target];
|
newEdge.target = oldNodeIDFromNewNodeIDMap[target];
|
||||||
} else {
|
} else {
|
||||||
@ -477,7 +470,10 @@ public:
|
|||||||
);
|
);
|
||||||
newEdge.data.distance = data.distance;
|
newEdge.data.distance = data.distance;
|
||||||
newEdge.data.shortcut = data.shortcut;
|
newEdge.data.shortcut = data.shortcut;
|
||||||
if(!data.originalViaNodeID && oldNodeIDFromNewNodeIDMap.size()) {
|
if(
|
||||||
|
!data.originalViaNodeID &&
|
||||||
|
!oldNodeIDFromNewNodeIDMap.empty()
|
||||||
|
) {
|
||||||
newEdge.data.id = oldNodeIDFromNewNodeIDMap[data.id];
|
newEdge.data.id = oldNodeIDFromNewNodeIDMap[data.id];
|
||||||
} else {
|
} else {
|
||||||
newEdge.data.id = data.id;
|
newEdge.data.id = data.id;
|
||||||
@ -494,31 +490,29 @@ public:
|
|||||||
}
|
}
|
||||||
_graph.reset();
|
_graph.reset();
|
||||||
std::vector<NodeID>().swap(oldNodeIDFromNewNodeIDMap);
|
std::vector<NodeID>().swap(oldNodeIDFromNewNodeIDMap);
|
||||||
|
BOOST_ASSERT( 0 == oldNodeIDFromNewNodeIDMap.capacity() );
|
||||||
|
|
||||||
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
||||||
//Also get the edges from temporary storage
|
|
||||||
unsigned numberOfTemporaryEdges = 0;
|
|
||||||
tempStorage.ReadFromSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
|
||||||
//loads edges of graph before renumbering, no need for further numbering action.
|
//loads edges of graph before renumbering, no need for further numbering action.
|
||||||
NodeID start;
|
NodeID start;
|
||||||
NodeID target;
|
NodeID target;
|
||||||
//edges.reserve(edges.size()+numberOfTemporaryEdges);
|
|
||||||
_DynamicGraph::EdgeData data;
|
_DynamicGraph::EdgeData data;
|
||||||
for(unsigned i = 0; i < numberOfTemporaryEdges; ++i) {
|
|
||||||
tempStorage.ReadFromSlot(temporaryStorageSlotID, (char*)&start, sizeof(NodeID));
|
Edge restored_edge;
|
||||||
tempStorage.ReadFromSlot(temporaryStorageSlotID, (char*)&target, sizeof(NodeID));
|
for(unsigned i = 0; i < temp_edge_counter; ++i) {
|
||||||
tempStorage.ReadFromSlot(temporaryStorageSlotID, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
tempStorage.ReadFromSlot(edge_storage_slot, (char*)&start, sizeof(NodeID));
|
||||||
Edge newEdge;
|
tempStorage.ReadFromSlot(edge_storage_slot, (char*)&target, sizeof(NodeID));
|
||||||
newEdge.source = start;
|
tempStorage.ReadFromSlot(edge_storage_slot, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
||||||
newEdge.target = target;
|
restored_edge.source = start;
|
||||||
newEdge.data.distance = data.distance;
|
restored_edge.target = target;
|
||||||
newEdge.data.shortcut = data.shortcut;
|
restored_edge.data.distance = data.distance;
|
||||||
newEdge.data.id = data.id;
|
restored_edge.data.shortcut = data.shortcut;
|
||||||
newEdge.data.forward = data.forward;
|
restored_edge.data.id = data.id;
|
||||||
newEdge.data.backward = data.backward;
|
restored_edge.data.forward = data.forward;
|
||||||
edges.push_back( newEdge );
|
restored_edge.data.backward = data.backward;
|
||||||
|
edges.push_back( restored_edge );
|
||||||
}
|
}
|
||||||
tempStorage.DeallocateSlot(temporaryStorageSlotID);
|
tempStorage.DeallocateSlot(edge_storage_slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -548,7 +542,7 @@ private:
|
|||||||
|
|
||||||
//iterate over all edges of node
|
//iterate over all edges of 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 _ContractorEdgeData& data = _graph->GetEdgeData( edge );
|
const ContractorEdgeData& data = _graph->GetEdgeData( edge );
|
||||||
if ( !data.forward ){
|
if ( !data.forward ){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -594,7 +588,7 @@ private:
|
|||||||
std::vector< _ContractorEdge >& insertedEdges = data->insertedEdges;
|
std::vector< _ContractorEdge >& insertedEdges = data->insertedEdges;
|
||||||
|
|
||||||
for ( _DynamicGraph::EdgeIterator inEdge = _graph->BeginEdges( node ), endInEdges = _graph->EndEdges( node ); inEdge != endInEdges; ++inEdge ) {
|
for ( _DynamicGraph::EdgeIterator inEdge = _graph->BeginEdges( node ), endInEdges = _graph->EndEdges( node ); inEdge != endInEdges; ++inEdge ) {
|
||||||
const _ContractorEdgeData& inData = _graph->GetEdgeData( inEdge );
|
const ContractorEdgeData& inData = _graph->GetEdgeData( inEdge );
|
||||||
const NodeID source = _graph->GetTarget( inEdge );
|
const NodeID source = _graph->GetTarget( inEdge );
|
||||||
if ( Simulate ) {
|
if ( Simulate ) {
|
||||||
assert( stats != NULL );
|
assert( stats != NULL );
|
||||||
@ -610,7 +604,7 @@ private:
|
|||||||
unsigned numTargets = 0;
|
unsigned numTargets = 0;
|
||||||
|
|
||||||
for ( _DynamicGraph::EdgeIterator outEdge = _graph->BeginEdges( node ), endOutEdges = _graph->EndEdges( node ); outEdge != endOutEdges; ++outEdge ) {
|
for ( _DynamicGraph::EdgeIterator outEdge = _graph->BeginEdges( node ), endOutEdges = _graph->EndEdges( node ); outEdge != endOutEdges; ++outEdge ) {
|
||||||
const _ContractorEdgeData& outData = _graph->GetEdgeData( outEdge );
|
const ContractorEdgeData& outData = _graph->GetEdgeData( outEdge );
|
||||||
if ( !outData.forward ) {
|
if ( !outData.forward ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -629,7 +623,7 @@ private:
|
|||||||
_Dijkstra( maxDistance, numTargets, 2000, data, node );
|
_Dijkstra( maxDistance, numTargets, 2000, data, node );
|
||||||
}
|
}
|
||||||
for ( _DynamicGraph::EdgeIterator outEdge = _graph->BeginEdges( node ), endOutEdges = _graph->EndEdges( node ); outEdge != endOutEdges; ++outEdge ) {
|
for ( _DynamicGraph::EdgeIterator outEdge = _graph->BeginEdges( node ), endOutEdges = _graph->EndEdges( node ); outEdge != endOutEdges; ++outEdge ) {
|
||||||
const _ContractorEdgeData& outData = _graph->GetEdgeData( outEdge );
|
const ContractorEdgeData& outData = _graph->GetEdgeData( outEdge );
|
||||||
if ( !outData.forward ) {
|
if ( !outData.forward ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -645,7 +639,7 @@ private:
|
|||||||
_ContractorEdge newEdge;
|
_ContractorEdge newEdge;
|
||||||
newEdge.source = source;
|
newEdge.source = source;
|
||||||
newEdge.target = target;
|
newEdge.target = target;
|
||||||
newEdge.data = _ContractorEdgeData( pathDistance, outData.originalEdges + inData.originalEdges, node/*, 0, inData.turnInstruction*/, true, true, false);;
|
newEdge.data = ContractorEdgeData( pathDistance, outData.originalEdges + inData.originalEdges, node/*, 0, inData.turnInstruction*/, true, true, false);;
|
||||||
insertedEdges.push_back( newEdge );
|
insertedEdges.push_back( newEdge );
|
||||||
std::swap( newEdge.source, newEdge.target );
|
std::swap( newEdge.source, newEdge.target );
|
||||||
newEdge.data.forward = false;
|
newEdge.data.forward = false;
|
||||||
@ -784,7 +778,8 @@ private:
|
|||||||
|
|
||||||
boost::shared_ptr<_DynamicGraph> _graph;
|
boost::shared_ptr<_DynamicGraph> _graph;
|
||||||
std::vector<_DynamicGraph::InputEdge> contractedEdges;
|
std::vector<_DynamicGraph::InputEdge> contractedEdges;
|
||||||
unsigned temporaryStorageSlotID;
|
unsigned edge_storage_slot;
|
||||||
|
uint64_t temp_edge_counter;
|
||||||
std::vector<NodeID> oldNodeIDFromNewNodeIDMap;
|
std::vector<NodeID> oldNodeIDFromNewNodeIDMap;
|
||||||
XORFastHash fastHash;
|
XORFastHash fastHash;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user