From f47d944349d668e764ddc9a7700ca09882906585 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Fri, 29 Nov 2013 16:27:26 +0100 Subject: [PATCH] do not seek in temporary storage --- Contractor/Contractor.h | 93 +++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 49 deletions(-) diff --git a/Contractor/Contractor.h b/Contractor/Contractor.h index 46925603e..469248700 100644 --- a/Contractor/Contractor.h +++ b/Contractor/Contractor.h @@ -54,10 +54,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class Contractor { private: - struct _ContractorEdgeData { - _ContractorEdgeData() : + struct ContractorEdgeData { + ContractorEdgeData() : 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) {} unsigned distance; unsigned id; @@ -75,7 +75,7 @@ private: _HeapData( short h, bool t ) : hop(h), target(t) {} }; - typedef DynamicGraph< _ContractorEdgeData > _DynamicGraph; + typedef DynamicGraph< ContractorEdgeData > _DynamicGraph; // typedef BinaryHeap< NodeID, NodeID, int, _HeapData, ArrayStorage > _Heap; typedef BinaryHeap< NodeID, NodeID, int, _HeapData, XORFastHashStorage > _Heap; typedef _DynamicGraph::InputEdge _ContractorEdge; @@ -118,6 +118,7 @@ public: Contractor( int nodes, ContainerT& inputEdges) { std::vector< _ContractorEdge > edges; edges.reserve(inputEdges.size()*2); + temp_edge_counter = 0; typename ContainerT::deallocation_iterator diter = inputEdges.dbegin(); typename ContainerT::deallocation_iterator dend = inputEdges.dend(); @@ -126,7 +127,7 @@ public: while(diter!=dend) { newEdge.source = diter->source(); 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" ); #ifndef NDEBUG @@ -195,6 +196,7 @@ public: _graph = boost::make_shared<_DynamicGraph>( nodes, edges ); edges.clear(); std::vector<_ContractorEdge>().swap(edges); + BOOST_ASSERT( 0 == edges.capacity() ); // unsigned maxdegree = 0; // NodeID highestNode = 0; // @@ -214,14 +216,14 @@ public: //Create temporary file // GetTemporaryFileName(temporaryEdgeStorageFilename); - temporaryStorageSlotID = TemporaryStorage::GetInstance().AllocateSlot(); + edge_storage_slot = TemporaryStorage::GetInstance().AllocateSlot(); std::cout << "contractor finished initalization" << std::endl; } ~Contractor() { //Delete temporary file // remove(temporaryEdgeStorageFilename.c_str()); - TemporaryStorage::GetInstance().DeallocateSlot(temporaryStorageSlotID); + TemporaryStorage::GetInstance().DeallocateSlot(edge_storage_slot); } void Run() { @@ -264,11 +266,11 @@ public: std::cout << " [flush " << numberOfContractedNodes << " nodes] " << std::flush; //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; + } threadData.clear(); - //Create new priority array std::vector newNodePriority(remainingNodes.size()); //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; } 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 for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) { const NodeID start = i; @@ -299,10 +295,10 @@ public: 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; + tempStorage.WriteToSlot(edge_storage_slot, (char*)&start, sizeof(NodeID)); + tempStorage.WriteToSlot(edge_storage_slot, (char*)&target, sizeof(NodeID)); + tempStorage.WriteToSlot(edge_storage_slot, (char*)&data, sizeof(_DynamicGraph::EdgeData)); + ++temp_edge_counter; } else { //node is not yet contracted. //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. std::vector().swap(newNodeIDFromOldNodeIDMap); @@ -454,13 +447,13 @@ public: SimpleLogger().Write() << "Getting edges of minimized graph"; NodeID numberOfNodes = _graph->GetNumberOfNodes(); if(_graph->GetNumberOfNodes()) { + Edge newEdge; for ( NodeID node = 0; node < numberOfNodes; ++node ) { p.printStatus(node); for ( _DynamicGraph::EdgeIterator edge = _graph->BeginEdges( node ), endEdges = _graph->EndEdges( node ); edge < endEdges; ++edge ) { const NodeID target = _graph->GetTarget( edge ); const _DynamicGraph::EdgeData& data = _graph->GetEdgeData( edge ); - Edge newEdge; - if(0 != oldNodeIDFromNewNodeIDMap.size()) { + if( !oldNodeIDFromNewNodeIDMap.empty() ) { newEdge.source = oldNodeIDFromNewNodeIDMap[node]; newEdge.target = oldNodeIDFromNewNodeIDMap[target]; } else { @@ -477,7 +470,10 @@ public: ); newEdge.data.distance = data.distance; newEdge.data.shortcut = data.shortcut; - if(!data.originalViaNodeID && oldNodeIDFromNewNodeIDMap.size()) { + if( + !data.originalViaNodeID && + !oldNodeIDFromNewNodeIDMap.empty() + ) { newEdge.data.id = oldNodeIDFromNewNodeIDMap[data.id]; } else { newEdge.data.id = data.id; @@ -494,31 +490,29 @@ public: } _graph.reset(); std::vector().swap(oldNodeIDFromNewNodeIDMap); + BOOST_ASSERT( 0 == oldNodeIDFromNewNodeIDMap.capacity() ); 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. NodeID start; NodeID target; - //edges.reserve(edges.size()+numberOfTemporaryEdges); _DynamicGraph::EdgeData data; - for(unsigned i = 0; i < numberOfTemporaryEdges; ++i) { - tempStorage.ReadFromSlot(temporaryStorageSlotID, (char*)&start, sizeof(NodeID)); - tempStorage.ReadFromSlot(temporaryStorageSlotID, (char*)&target, sizeof(NodeID)); - tempStorage.ReadFromSlot(temporaryStorageSlotID, (char*)&data, sizeof(_DynamicGraph::EdgeData)); - Edge newEdge; - newEdge.source = start; - newEdge.target = target; - newEdge.data.distance = data.distance; - newEdge.data.shortcut = data.shortcut; - newEdge.data.id = data.id; - newEdge.data.forward = data.forward; - newEdge.data.backward = data.backward; - edges.push_back( newEdge ); + + Edge restored_edge; + for(unsigned i = 0; i < temp_edge_counter; ++i) { + tempStorage.ReadFromSlot(edge_storage_slot, (char*)&start, sizeof(NodeID)); + tempStorage.ReadFromSlot(edge_storage_slot, (char*)&target, sizeof(NodeID)); + tempStorage.ReadFromSlot(edge_storage_slot, (char*)&data, sizeof(_DynamicGraph::EdgeData)); + restored_edge.source = start; + restored_edge.target = target; + restored_edge.data.distance = data.distance; + restored_edge.data.shortcut = data.shortcut; + restored_edge.data.id = data.id; + restored_edge.data.forward = data.forward; + restored_edge.data.backward = data.backward; + edges.push_back( restored_edge ); } - tempStorage.DeallocateSlot(temporaryStorageSlotID); + tempStorage.DeallocateSlot(edge_storage_slot); } private: @@ -548,7 +542,7 @@ private: //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 ); + const ContractorEdgeData& data = _graph->GetEdgeData( edge ); if ( !data.forward ){ continue; } @@ -594,7 +588,7 @@ private: std::vector< _ContractorEdge >& insertedEdges = data->insertedEdges; 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 ); if ( Simulate ) { assert( stats != NULL ); @@ -610,7 +604,7 @@ private: unsigned numTargets = 0; 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 ) { continue; } @@ -629,7 +623,7 @@ private: _Dijkstra( maxDistance, numTargets, 2000, data, node ); } 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 ) { continue; } @@ -645,7 +639,7 @@ private: _ContractorEdge newEdge; newEdge.source = source; 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 ); std::swap( newEdge.source, newEdge.target ); newEdge.data.forward = false; @@ -784,7 +778,8 @@ private: boost::shared_ptr<_DynamicGraph> _graph; std::vector<_DynamicGraph::InputEdge> contractedEdges; - unsigned temporaryStorageSlotID; + unsigned edge_storage_slot; + uint64_t temp_edge_counter; std::vector oldNodeIDFromNewNodeIDMap; XORFastHash fastHash; };