From f780aa6160df671ed78c859247eeca951df7f7ba Mon Sep 17 00:00:00 2001 From: DennisOSRM Date: Thu, 14 Feb 2013 17:11:18 +0100 Subject: [PATCH] Saving 4 bytes on each original edge. Simplifying handling of original edge data --- Contractor/EdgeBasedGraphFactory.cpp | 25 ++++++++++++++----------- Contractor/EdgeBasedGraphFactory.h | 5 ++--- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Contractor/EdgeBasedGraphFactory.cpp b/Contractor/EdgeBasedGraphFactory.cpp index 968adf731..13a570e46 100644 --- a/Contractor/EdgeBasedGraphFactory.cpp +++ b/Contractor/EdgeBasedGraphFactory.cpp @@ -234,6 +234,9 @@ void EdgeBasedGraphFactory::Run(const char * originalEdgeDataFilename) { std::vector().swap(vectorOfComponentSizes); std::vector().swap(componentsIndex); + std::vector original_edge_data_vector; + original_edge_data_vector.reserve(10000); + //Loop over all turns and generate new set of edges. //Three nested loop look super-linear, but we are dealing with a linear number of turns only. for(_NodeBasedDynamicGraph::NodeIterator u = 0; u < _nodeBasedGraph->GetNumberOfNodes(); ++u ) { @@ -271,8 +274,9 @@ void EdgeBasedGraphFactory::Run(const char * originalEdgeDataFilename) { distance += speedProfile.trafficSignalPenalty; } TurnInstruction turnInstruction = AnalyzeTurn(u, v, w); - if(turnInstruction == TurnInstructions.UTurn) + if(TurnInstructions.UTurn == turnInstruction) { distance += speedProfile.uTurnPenalty; + } // if(!edgeData1.isAccessRestricted && edgeData2.isAccessRestricted) { // distance += TurnInstructions.AccessRestrictionPenalty; // turnInstruction |= TurnInstructions.AccessRestrictionFlag; @@ -282,17 +286,16 @@ void EdgeBasedGraphFactory::Run(const char * originalEdgeDataFilename) { //distance += heightPenalty; //distance += ComputeTurnPenalty(u, v, w); assert(edgeData1.edgeBasedNodeID != edgeData2.edgeBasedNodeID); - if(originalEdgeData.size() == originalEdgeData.capacity()-3) { - originalEdgeData.reserve(originalEdgeData.size()*1.2); - } OriginalEdgeData oed(v,edgeData2.nameID, turnInstruction); - EdgeBasedEdge newEdge(edgeData1.edgeBasedNodeID, edgeData2.edgeBasedNodeID, edgeBasedEdges.size(), distance, true, false ); - originalEdgeData.push_back(oed); - if(originalEdgeData.size() > 100000) { - originalEdgeDataOutFile.write((char*)&(originalEdgeData[0]), originalEdgeData.size()*sizeof(OriginalEdgeData)); - originalEdgeData.clear(); - } + original_edge_data_vector.push_back(oed); ++numberOfOriginalEdges; + + if(original_edge_data_vector.size() > 100000) { + originalEdgeDataOutFile.write((char*)&(original_edge_data_vector[0]), original_edge_data_vector.size()*sizeof(OriginalEdgeData)); + original_edge_data_vector.clear(); + } + + EdgeBasedEdge newEdge(edgeData1.edgeBasedNodeID, edgeData2.edgeBasedNodeID, edgeBasedEdges.size(), distance, true, false ); edgeBasedEdges.push_back(newEdge); } else { ++numberOfSkippedTurns; @@ -302,7 +305,7 @@ void EdgeBasedGraphFactory::Run(const char * originalEdgeDataFilename) { } p.printIncrement(); } - originalEdgeDataOutFile.write((char*)&(originalEdgeData[0]), originalEdgeData.size()*sizeof(OriginalEdgeData)); + originalEdgeDataOutFile.write((char*)&(original_edge_data_vector[0]), original_edge_data_vector.size()*sizeof(OriginalEdgeData)); originalEdgeDataOutFile.seekp(std::ios::beg); originalEdgeDataOutFile.write((char*)&numberOfOriginalEdges, sizeof(unsigned)); originalEdgeDataOutFile.close(); diff --git a/Contractor/EdgeBasedGraphFactory.h b/Contractor/EdgeBasedGraphFactory.h index 45ac0ad39..1198ae971 100644 --- a/Contractor/EdgeBasedGraphFactory.h +++ b/Contractor/EdgeBasedGraphFactory.h @@ -82,13 +82,13 @@ private: unsigned edgeBasedNodeID; unsigned nameID; short type; - bool isAccessRestricted; + bool isAccessRestricted:1; bool shortcut:1; bool forward:1; bool backward:1; bool roundabout:1; bool ignoreInGrid:1; - bool contraFlow; + bool contraFlow:1; }; struct _EdgeBasedEdgeData { @@ -118,7 +118,6 @@ private: DeallocatingVector edgeBasedEdges; DeallocatingVector edgeBasedNodes; - std::vector originalEdgeData; NodeID CheckForEmanatingIsOnlyTurn(const NodeID u, const NodeID v) const; bool CheckIfTurnIsRestricted(const NodeID u, const NodeID v, const NodeID w) const;