Undoing wrong merge. Flushing some memory before generation of
edge-expanded graph
This commit is contained in:
parent
91d875c157
commit
6fe580bd75
@ -122,11 +122,11 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(int nodes, std::vector<NodeBasedEdg
|
|||||||
edges.push_back( edge );
|
edges.push_back( edge );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
INFO("Expanded " << inputEdges.size() << " node-based edges into " << nodes << " edge-based nodes.");
|
||||||
|
std::vector<NodeBasedEdge>().swap(inputEdges);
|
||||||
std::sort( edges.begin(), edges.end() );
|
std::sort( edges.begin(), edges.end() );
|
||||||
|
|
||||||
_nodeBasedGraph.reset(new _NodeBasedDynamicGraph( nodes, edges ));
|
_nodeBasedGraph.reset(new _NodeBasedDynamicGraph( nodes, edges ));
|
||||||
INFO("Converted " << inputEdges.size() << " node-based edges into " << _nodeBasedGraph->GetNumberOfEdges() << " edge-based nodes.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EdgeBasedGraphFactory::GetEdgeBasedEdges(std::vector< EdgeBasedEdge >& outputEdgeList ) {
|
void EdgeBasedGraphFactory::GetEdgeBasedEdges(std::vector< EdgeBasedEdge >& outputEdgeList ) {
|
||||||
@ -200,63 +200,12 @@ void EdgeBasedGraphFactory::Run() {
|
|||||||
Percent p(_nodeBasedGraph->GetNumberOfNodes());
|
Percent p(_nodeBasedGraph->GetNumberOfNodes());
|
||||||
int numberOfSkippedTurns(0);
|
int numberOfSkippedTurns(0);
|
||||||
int nodeBasedEdgeCounter(0);
|
int nodeBasedEdgeCounter(0);
|
||||||
int triviallySkippedEdges(0);
|
|
||||||
|
|
||||||
std::vector<std::pair<NodeID, NodeID> > edgesToRemove;
|
|
||||||
std::vector<_NodeBasedEdge > edgesToInsert;
|
|
||||||
|
|
||||||
//loop over graph and remove all trivially contractable edges.
|
|
||||||
for(_NodeBasedDynamicGraph::NodeIterator u = 0; u < _nodeBasedGraph->GetNumberOfNodes(); ++u ) {
|
|
||||||
for(_NodeBasedDynamicGraph::EdgeIterator e1 = _nodeBasedGraph->BeginEdges(u); e1 < _nodeBasedGraph->EndEdges(u); ++e1) {
|
|
||||||
_NodeBasedDynamicGraph::NodeIterator v = _nodeBasedGraph->GetTarget(e1);
|
|
||||||
const _NodeBasedDynamicGraph::EdgeData edgeData1 = _nodeBasedGraph->GetEdgeData(e1);
|
|
||||||
for(_NodeBasedDynamicGraph::EdgeIterator e2 = _nodeBasedGraph->BeginEdges(v); e2 < _nodeBasedGraph->EndEdges(v); ++e2) {
|
|
||||||
//TODO: Nur vorwärts-kanten und bei ungerichteten kanten nur eine richtung einfügen. Vorsicht!
|
|
||||||
const _NodeBasedDynamicGraph::EdgeData edgeData2 = _nodeBasedGraph->GetEdgeData(e2);
|
|
||||||
_NodeBasedDynamicGraph::NodeIterator w = _nodeBasedGraph->GetTarget(e2);
|
|
||||||
double testAngle = GetAngleBetweenTwoEdges(inputNodeInfoList[u], inputNodeInfoList[v], inputNodeInfoList[w]);
|
|
||||||
if((testAngle > 179 && testAngle < 181) && _nodeBasedGraph->GetOutDegree(v) <= 2 && edgeData1.nameID == edgeData2.nameID &&
|
|
||||||
edgeData1.backward == edgeData2.backward && edgeData1.isAccessRestricted == edgeData2.isAccessRestricted) {
|
|
||||||
|
|
||||||
//remove edges (u,v), (v,w)
|
|
||||||
edgesToRemove.push_back(std::make_pair(u,v));
|
|
||||||
edgesToRemove.push_back(std::make_pair(v,w));
|
|
||||||
|
|
||||||
//add edge (v,w) with combined distance
|
|
||||||
_NodeBasedEdge newEdge;
|
|
||||||
newEdge.source = u; newEdge.target = w;
|
|
||||||
newEdge.data = edgeData1; newEdge.data.distance += edgeData2.distance;
|
|
||||||
++triviallySkippedEdges;
|
|
||||||
edgesToInsert.push_back(newEdge);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
INFO("Inserting " << edgesToInsert.size() << " contracted edges");
|
|
||||||
|
|
||||||
Percent percent(edgesToInsert.size());
|
|
||||||
for(unsigned i = 0; i < 10; ++i) {
|
|
||||||
_nodeBasedGraph->DeleteEdge(edgesToRemove[2*i].first, edgesToRemove[2*i].second);
|
|
||||||
_nodeBasedGraph->DeleteEdge(edgesToRemove[2*i+1].first, edgesToRemove[2*i+1].second);
|
|
||||||
|
|
||||||
INFO("->delete edge (" << edgesToRemove[2*i].first << "," << edgesToRemove[2*i].second << ")");
|
|
||||||
INFO("->delete edge (" << edgesToRemove[2*i+1].first << "," << edgesToRemove[2*i+1].second << ")");
|
|
||||||
|
|
||||||
_NodeBasedEdge edge = edgesToInsert[i];
|
|
||||||
INFO(" inserted edge (" << edge.source << "," << edge.target << ") " << i << "/" << edgesToInsert.size());
|
|
||||||
assert(edge.source < _nodeBasedGraph->GetNumberOfNodes());
|
|
||||||
assert(edge.target < _nodeBasedGraph->GetNumberOfNodes());
|
|
||||||
_nodeBasedGraph->InsertEdge(edge.source, edge.target, edge.data);
|
|
||||||
percent.printIncrement();
|
|
||||||
}
|
|
||||||
|
|
||||||
INFO("Generating Edge-based Nodes");
|
|
||||||
|
|
||||||
//loop over all edges and generate new set of nodes.
|
//loop over all edges and generate new set of nodes.
|
||||||
for(_NodeBasedDynamicGraph::NodeIterator u = 0; u < _nodeBasedGraph->GetNumberOfNodes(); ++u ) {
|
for(_NodeBasedDynamicGraph::NodeIterator u = 0; u < _nodeBasedGraph->GetNumberOfNodes(); ++u ) {
|
||||||
for(_NodeBasedDynamicGraph::EdgeIterator e1 = _nodeBasedGraph->BeginEdges(u); e1 < _nodeBasedGraph->EndEdges(u); ++e1) {
|
for(_NodeBasedDynamicGraph::EdgeIterator e1 = _nodeBasedGraph->BeginEdges(u); e1 < _nodeBasedGraph->EndEdges(u); ++e1) {
|
||||||
_NodeBasedDynamicGraph::NodeIterator v = _nodeBasedGraph->GetTarget(e1);
|
_NodeBasedDynamicGraph::NodeIterator v = _nodeBasedGraph->GetTarget(e1);
|
||||||
|
|
||||||
if(_nodeBasedGraph->GetEdgeData(e1).type != SHRT_MAX) {
|
if(_nodeBasedGraph->GetEdgeData(e1).type != SHRT_MAX) {
|
||||||
assert(e1 != UINT_MAX);
|
assert(e1 != UINT_MAX);
|
||||||
assert(u != UINT_MAX);
|
assert(u != UINT_MAX);
|
||||||
@ -330,7 +279,6 @@ void EdgeBasedGraphFactory::Run() {
|
|||||||
INFO("Edge-based graph contains " << edgeBasedEdges.size() << " edges, blowup is " << (double)edgeBasedEdges.size()/(double)nodeBasedEdgeCounter);
|
INFO("Edge-based graph contains " << edgeBasedEdges.size() << " edges, blowup is " << (double)edgeBasedEdges.size()/(double)nodeBasedEdgeCounter);
|
||||||
INFO("Edge-based graph skipped " << numberOfSkippedTurns << " turns, defined by " << numberOfTurnRestrictions << " restrictions.");
|
INFO("Edge-based graph skipped " << numberOfSkippedTurns << " turns, defined by " << numberOfTurnRestrictions << " restrictions.");
|
||||||
INFO("Generated " << edgeBasedNodes.size() << " edge based nodes");
|
INFO("Generated " << edgeBasedNodes.size() << " edge based nodes");
|
||||||
INFO("Trivially contracted edges: " << triviallySkippedEdges);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
short EdgeBasedGraphFactory::AnalyzeTurn(const NodeID u, const NodeID v, const NodeID w) const {
|
short EdgeBasedGraphFactory::AnalyzeTurn(const NodeID u, const NodeID v, const NodeID w) const {
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#include <boost/property_tree/ptree.hpp>
|
#include <boost/property_tree/ptree.hpp>
|
||||||
#include <boost/property_tree/ini_parser.hpp>
|
#include <boost/property_tree/ini_parser.hpp>
|
||||||
|
|
||||||
#include <deque>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
@ -138,7 +138,7 @@ int main (int argc, char *argv[]) {
|
|||||||
BOOST_FOREACH(EdgeBasedEdge & edge, edgeBasedEdgeList) {
|
BOOST_FOREACH(EdgeBasedEdge & edge, edgeBasedEdgeList) {
|
||||||
externalEdgeBasedEdgeList.push_back(edge);
|
externalEdgeBasedEdgeList.push_back(edge);
|
||||||
}
|
}
|
||||||
edgeBasedEdgeList.clear();
|
std::vector<EdgeBasedEdge>().swap(edgeBasedEdgeList);
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* Writing info on original (node-based) nodes
|
* Writing info on original (node-based) nodes
|
||||||
|
Loading…
Reference in New Issue
Block a user