From d2c532e4d57607d3190fabd3c883b9ec3cda76f5 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Thu, 10 Mar 2011 16:01:44 +0000 Subject: [PATCH] Removed Dead code --- Contractor/ContractionCleanup.h | 458 ++++++++++++++++---------------- Contractor/Contractor.h | 10 - Contractor/GraphLoader.h | 142 ---------- 3 files changed, 225 insertions(+), 385 deletions(-) delete mode 100644 Contractor/GraphLoader.h diff --git a/Contractor/ContractionCleanup.h b/Contractor/ContractionCleanup.h index d4158d97e..61e380568 100644 --- a/Contractor/ContractionCleanup.h +++ b/Contractor/ContractionCleanup.h @@ -36,287 +36,279 @@ or see http://www.gnu.org/licenses/agpl.txt. class ContractionCleanup { private: - struct _HeapData { - NodeID parent; - _HeapData( NodeID p ) { - parent = p; - } - }; + struct _HeapData { + NodeID parent; + _HeapData( NodeID p ) { + parent = p; + } + }; #ifdef _MANYCORES - typedef BinaryHeap< NodeID, NodeID, int, _HeapData, DenseStorage > _Heap; +typedef BinaryHeap< NodeID, NodeID, int, _HeapData, DenseStorage > _Heap; #else - typedef BinaryHeap< NodeID, NodeID, int, _HeapData > _Heap; +typedef BinaryHeap< NodeID, NodeID, int, _HeapData > _Heap; #endif - struct _ThreadData { - _Heap* _heapForward; - _Heap* _heapBackward; - _ThreadData( NodeID nodes ) { - _heapBackward = new _Heap(nodes); - _heapForward = new _Heap(nodes); - } - ~_ThreadData() - { - delete _heapBackward; - delete _heapForward; - } - }; - union _MiddleName { - NodeID nameID; - NodeID middle; - }; +struct _ThreadData { + _Heap* _heapForward; + _Heap* _heapBackward; + _ThreadData( NodeID nodes ) { + _heapBackward = new _Heap(nodes); + _heapForward = new _Heap(nodes); + } + ~_ThreadData() + { + delete _heapBackward; + delete _heapForward; + } +}; +union _MiddleName { + NodeID nameID; + NodeID middle; +}; public: - struct Edge { - NodeID source; - NodeID target; - struct EdgeData { - int distance : 29; - bool shortcut : 1; - bool forward : 1; - bool backward : 1; - short type:6; - bool forwardTurn:1; - bool backwardTurn:1; - _MiddleName middleName; - } data; +struct Edge { + NodeID source; + NodeID target; + struct EdgeData { + int distance : 29; + bool shortcut : 1; + bool forward : 1; + bool backward : 1; + short type:6; + bool forwardTurn:1; + bool backwardTurn:1; + _MiddleName middleName; + } data; - //sorts by source and other attributes - static bool CompareBySource( const Edge& left, const Edge& right ) { - if ( left.source != right.source ) - return left.source < right.source; - int l = ( left.data.forward ? -1 : 0 ) + ( left.data.backward ? -1 : 0 ); - int r = ( right.data.forward ? -1 : 0 ) + ( right.data.backward ? -1 : 0 ); - if ( l != r ) - return l < r; - if ( left.target != right.target ) - return left.target < right.target; - return left.data.distance < right.data.distance; - } + //sorts by source and other attributes + static bool CompareBySource( const Edge& left, const Edge& right ) { + if ( left.source != right.source ) + return left.source < right.source; + int l = ( left.data.forward ? -1 : 0 ) + ( left.data.backward ? -1 : 0 ); + int r = ( right.data.forward ? -1 : 0 ) + ( right.data.backward ? -1 : 0 ); + if ( l != r ) + return l < r; + if ( left.target != right.target ) + return left.target < right.target; + return left.data.distance < right.data.distance; + } - bool operator== ( const Edge& right ) const { - return ( source == right.source && target == right.target && data.distance == right.data.distance && data.shortcut == right.data.shortcut && data.forward == right.data.forward && data.backward == right.data.backward && data.middleName.middle == right.data.middleName.middle ); - } - }; + bool operator== ( const Edge& right ) const { + return ( source == right.source && target == right.target && data.distance == right.data.distance && data.shortcut == right.data.shortcut && data.forward == right.data.forward && data.backward == right.data.backward && data.middleName.middle == right.data.middleName.middle ); + } +}; - ContractionCleanup( int numNodes, const std::vector< Edge >& edges ) { - _graph = edges; - _numNodes = numNodes; - } +ContractionCleanup( int numNodes, const std::vector< Edge >& edges ) { + _graph = edges; + _numNodes = numNodes; +} - ~ContractionCleanup() { +~ContractionCleanup() { - } +} - void Run() { - RemoveUselessShortcuts(); - } +void Run() { + RemoveUselessShortcuts(); +} - template< class EdgeT > - void GetData( std::vector< EdgeT >& edges ) { - for ( int edge = 0, endEdges = ( int ) _graph.size(); edge != endEdges; ++edge ) { - EdgeT newEdge; - newEdge.source = _graph[edge].source; - newEdge.target = _graph[edge].target; +template< class EdgeT > +void GetData( std::vector< EdgeT >& edges ) { + for ( int edge = 0, endEdges = ( int ) _graph.size(); edge != endEdges; ++edge ) { + EdgeT newEdge; + newEdge.source = _graph[edge].source; + newEdge.target = _graph[edge].target; - newEdge.data.distance = _graph[edge].data.distance; - newEdge.data.shortcut = _graph[edge].data.shortcut; - newEdge.data.middleName = _graph[edge].data.middleName; - newEdge.data.forward = _graph[edge].data.forward; - newEdge.data.backward = _graph[edge].data.backward; - newEdge.data.type = _graph[edge].data.type; - newEdge.data.forwardTurn = _graph[edge].data.forwardTurn; - newEdge.data.backwardTurn = _graph[edge].data.backwardTurn; - edges.push_back( newEdge ); - } + newEdge.data.distance = _graph[edge].data.distance; + newEdge.data.shortcut = _graph[edge].data.shortcut; + newEdge.data.middleName = _graph[edge].data.middleName; + newEdge.data.forward = _graph[edge].data.forward; + newEdge.data.backward = _graph[edge].data.backward; + newEdge.data.type = _graph[edge].data.type; + newEdge.data.forwardTurn = _graph[edge].data.forwardTurn; + newEdge.data.backwardTurn = _graph[edge].data.backwardTurn; + edges.push_back( newEdge ); + } #ifdef _GLIBCXX_PARALLEL - __gnu_parallel::sort( edges.begin(), edges.end() ); +__gnu_parallel::sort( edges.begin(), edges.end() ); #else - sort( edges.begin(), edges.end() ); + sort( edges.begin(), edges.end() ); #endif - } +} private: - class AllowForwardEdge { - public: - bool operator()( const Edge& data ) const { - return data.data.forward; - } - }; +class AllowForwardEdge { +public: + bool operator()( const Edge& data ) const { + return data.data.forward; + } +}; - class AllowBackwardEdge { - public: - bool operator()( const Edge& data ) const { - return data.data.backward; - } - }; +class AllowBackwardEdge { +public: + bool operator()( const Edge& data ) const { + return data.data.backward; + } +}; - double _Timestamp() { - struct timeval tp; - gettimeofday(&tp, NULL); - return double(tp.tv_sec) + tp.tv_usec / 1000000.; - } +double _Timestamp() { + struct timeval tp; + gettimeofday(&tp, NULL); + return double(tp.tv_sec) + tp.tv_usec / 1000000.; +} - void BuildOutgoingGraph() { - //sort edges by source +void BuildOutgoingGraph() { + //sort edges by source #ifdef _GLIBCXX_PARALLEL - __gnu_parallel::sort( _graph.begin(), _graph.end(), Edge::CompareBySource ); +__gnu_parallel::sort( _graph.begin(), _graph.end(), Edge::CompareBySource ); #else - sort( _graph.begin(), _graph.end(), Edge::CompareBySource ); +sort( _graph.begin(), _graph.end(), Edge::CompareBySource ); #endif - try { - _firstEdge.resize( _numNodes + 1 ); - } catch(...) { - cerr << "Not enough RAM on machine" << endl; - } - _firstEdge[0] = 0; - for ( NodeID i = 0, node = 0; i < ( NodeID ) _graph.size(); i++ ) { - while ( _graph[i].source != node ) - _firstEdge[++node] = i; - if ( i == ( NodeID ) _graph.size() - 1 ) - while ( node < _numNodes ) - _firstEdge[++node] = ( int ) _graph.size(); - } - } +try { + _firstEdge.resize( _numNodes + 1 ); +} catch(...) { + cerr << "Not enough RAM on machine" << endl; +} +_firstEdge[0] = 0; +for ( NodeID i = 0, node = 0; i < ( NodeID ) _graph.size(); i++ ) { + while ( _graph[i].source != node ) + _firstEdge[++node] = i; + if ( i == ( NodeID ) _graph.size() - 1 ) + while ( node < _numNodes ) + _firstEdge[++node] = ( int ) _graph.size(); +} +} - void RemoveUselessShortcuts() { - int maxThreads = omp_get_max_threads(); - std::vector < _ThreadData* > threadData; - for ( int threadNum = 0; threadNum < maxThreads; ++threadNum ) { - threadData.push_back( new _ThreadData( _numNodes ) ); - } +void RemoveUselessShortcuts() { + int maxThreads = omp_get_max_threads(); + std::vector < _ThreadData* > threadData; + for ( int threadNum = 0; threadNum < maxThreads; ++threadNum ) { + threadData.push_back( new _ThreadData( _numNodes ) ); + } - cout << "Scanning for useless shortcuts" << endl; - BuildOutgoingGraph(); + cout << "Scanning for useless shortcuts" << endl; + BuildOutgoingGraph(); #pragma omp parallel for - for ( unsigned i = 0; i < ( unsigned ) _graph.size(); i++ ) { - for ( unsigned edge = _firstEdge[_graph[i].source]; edge < _firstEdge[_graph[i].source + 1]; ++edge ) { - if ( edge == i ) - continue; - if ( _graph[edge].target != _graph[i].target ) - continue; - if ( _graph[edge].data.distance < _graph[i].data.distance ) - continue; + for ( unsigned i = 0; i < ( unsigned ) _graph.size(); i++ ) { + for ( unsigned edge = _firstEdge[_graph[i].source]; edge < _firstEdge[_graph[i].source + 1]; ++edge ) { + if ( edge == i ) + continue; + if ( _graph[edge].target != _graph[i].target ) + continue; + if ( _graph[edge].data.distance < _graph[i].data.distance ) + continue; - _graph[edge].data.forward &= !_graph[i].data.forward; - _graph[edge].data.backward &= !_graph[i].data.backward; - } + _graph[edge].data.forward &= !_graph[i].data.forward; + _graph[edge].data.backward &= !_graph[i].data.backward; + } - if ( !_graph[i].data.forward && !_graph[i].data.backward ) - continue; + if ( !_graph[i].data.forward && !_graph[i].data.backward ) + continue; - //only remove shortcuts - if ( !_graph[i].data.shortcut ) - continue; + //only remove shortcuts + if ( !_graph[i].data.shortcut ) + continue; - if ( _graph[i].data.forward ) { - int result = _ComputeDistance( _graph[i].source, _graph[i].target, threadData[omp_get_thread_num()] ); - if ( result < _graph[i].data.distance ) { - _graph[i].data.forward = false; - Contractor::Witness temp; - temp.source = _graph[i].source; - temp.target = _graph[i].target; - temp.middleName.middle = _graph[i].data.middleName.middle; - } - } - if ( _graph[i].data.backward ) { - int result = _ComputeDistance( _graph[i].target, _graph[i].source, threadData[omp_get_thread_num()] ); + if ( _graph[i].data.forward ) { + int result = _ComputeDistance( _graph[i].source, _graph[i].target, threadData[omp_get_thread_num()] ); + if ( result < _graph[i].data.distance ) { + _graph[i].data.forward = false; + } + } + if ( _graph[i].data.backward ) { + int result = _ComputeDistance( _graph[i].target, _graph[i].source, threadData[omp_get_thread_num()] ); - if ( result < _graph[i].data.distance ) { - _graph[i].data.backward = false; - Contractor::Witness temp; - temp.source = _graph[i].target; - temp.target = _graph[i].source; - temp.middleName.middle = _graph[i].data.middleName.middle; - } - } - } + if ( result < _graph[i].data.distance ) { + _graph[i].data.backward = false; + } + } + } - cout << "Removing edges" << endl; - int usefull = 0; - for ( int i = 0; i < ( int ) _graph.size(); i++ ) { - if ( !_graph[i].data.forward && !_graph[i].data.backward && _graph[i].data.shortcut ) - continue; - _graph[usefull] = _graph[i]; - usefull++; - } - cout << "Removed " << _graph.size() - usefull << " useless shortcuts" << endl; - _graph.resize( usefull ); - for ( int threadNum = 0; threadNum < maxThreads; ++threadNum ) { - delete threadData[threadNum]; - } - } + cout << "Removing edges" << endl; + int usefull = 0; + for ( int i = 0; i < ( int ) _graph.size(); i++ ) { + if ( !_graph[i].data.forward && !_graph[i].data.backward && _graph[i].data.shortcut ) + continue; + _graph[usefull] = _graph[i]; + usefull++; + } + cout << "Removed " << _graph.size() - usefull << " useless shortcuts" << endl; + _graph.resize( usefull ); + for ( int threadNum = 0; threadNum < maxThreads; ++threadNum ) { + delete threadData[threadNum]; + } +} - template< class EdgeAllowed, class StallEdgeAllowed > void _ComputeStep( _Heap* heapForward, _Heap* heapBackward, const EdgeAllowed& edgeAllowed, const StallEdgeAllowed& stallEdgeAllowed, NodeID* middle, int* targetDistance ) { +template< class EdgeAllowed, class StallEdgeAllowed > void _ComputeStep( _Heap* heapForward, _Heap* heapBackward, const EdgeAllowed& edgeAllowed, const StallEdgeAllowed& stallEdgeAllowed, NodeID* middle, int* targetDistance ) { - const NodeID node = heapForward->DeleteMin(); - const int distance = heapForward->GetKey( node ); + const NodeID node = heapForward->DeleteMin(); + const int distance = heapForward->GetKey( node ); - if ( heapBackward->WasInserted( node ) ) { - const int newDistance = heapBackward->GetKey( node ) + distance; - if ( newDistance < *targetDistance ) { - *middle = node; - *targetDistance = newDistance; - } - } + if ( heapBackward->WasInserted( node ) ) { + const int newDistance = heapBackward->GetKey( node ) + distance; + if ( newDistance < *targetDistance ) { + *middle = node; + *targetDistance = newDistance; + } + } - if ( distance > *targetDistance ) { - heapForward->DeleteAll(); - return; - } - for ( int edge = _firstEdge[node], endEdges = _firstEdge[node + 1]; edge != endEdges; ++edge ) { - const NodeID to = _graph[edge].target; - const int edgeWeight = _graph[edge].data.distance; - assert( edgeWeight > 0 ); - const int toDistance = distance + edgeWeight; + if ( distance > *targetDistance ) { + heapForward->DeleteAll(); + return; + } + for ( int edge = _firstEdge[node], endEdges = _firstEdge[node + 1]; edge != endEdges; ++edge ) { + const NodeID to = _graph[edge].target; + const int edgeWeight = _graph[edge].data.distance; + assert( edgeWeight > 0 ); + const int toDistance = distance + edgeWeight; - if ( edgeAllowed( _graph[edge] ) ) { - //New Node discovered -> Add to Heap + Node Info Storage - if ( !heapForward->WasInserted( to ) ) - heapForward->Insert( to, toDistance, node ); + if ( edgeAllowed( _graph[edge] ) ) { + //New Node discovered -> Add to Heap + Node Info Storage + if ( !heapForward->WasInserted( to ) ) + heapForward->Insert( to, toDistance, node ); - //Found a shorter Path -> Update distance - else if ( toDistance < heapForward->GetKey( to ) ) { - heapForward->DecreaseKey( to, toDistance ); - //new parent - heapForward->GetData( to ) = node; - } - } - } - } + //Found a shorter Path -> Update distance + else if ( toDistance < heapForward->GetKey( to ) ) { + heapForward->DecreaseKey( to, toDistance ); + //new parent + heapForward->GetData( to ) = node; + } + } + } +} - int _ComputeDistance( NodeID source, NodeID target, _ThreadData * data, std::vector< NodeID >* path = NULL ) { - data->_heapForward->Clear(); - data->_heapBackward->Clear(); - //insert source into heap - data->_heapForward->Insert( source, 0, source ); - data->_heapBackward->Insert( target, 0, target ); +int _ComputeDistance( NodeID source, NodeID target, _ThreadData * data, std::vector< NodeID >* path = NULL ) { + data->_heapForward->Clear(); + data->_heapBackward->Clear(); + //insert source into heap + data->_heapForward->Insert( source, 0, source ); + data->_heapBackward->Insert( target, 0, target ); - int targetDistance = std::numeric_limits< int >::max(); - NodeID middle = 0; - AllowForwardEdge forward; - AllowBackwardEdge backward; + int targetDistance = std::numeric_limits< int >::max(); + NodeID middle = 0; + AllowForwardEdge forward; + AllowBackwardEdge backward; - while ( data->_heapForward->Size() + data->_heapBackward->Size() > 0 ) { + while ( data->_heapForward->Size() + data->_heapBackward->Size() > 0 ) { - if ( data->_heapForward->Size() > 0 ) { - _ComputeStep( data->_heapForward, data->_heapBackward, forward, backward, &middle, &targetDistance ); - } + if ( data->_heapForward->Size() > 0 ) { + _ComputeStep( data->_heapForward, data->_heapBackward, forward, backward, &middle, &targetDistance ); + } - if ( data->_heapBackward->Size() > 0 ) { - _ComputeStep( data->_heapBackward, data->_heapForward, backward, forward, &middle, &targetDistance ); - } - } + if ( data->_heapBackward->Size() > 0 ) { + _ComputeStep( data->_heapBackward, data->_heapForward, backward, forward, &middle, &targetDistance ); + } + } - if ( targetDistance == std::numeric_limits< int >::max() ) - return std::numeric_limits< unsigned >::max(); + if ( targetDistance == std::numeric_limits< int >::max() ) + return std::numeric_limits< unsigned >::max(); - return targetDistance; - } - NodeID _numNodes; - std::vector< Edge > _graph; - std::vector< unsigned > _firstEdge; + return targetDistance; +} +NodeID _numNodes; +std::vector< Edge > _graph; +std::vector< unsigned > _firstEdge; }; #endif // CONTRACTIONCLEANUP_H_INCLUDED diff --git a/Contractor/Contractor.h b/Contractor/Contractor.h index 4f1d0ae3e..98af582eb 100644 --- a/Contractor/Contractor.h +++ b/Contractor/Contractor.h @@ -44,15 +44,6 @@ private: NodeID nameID; }; -public: - - struct Witness { - NodeID source; - NodeID target; - _MiddleName middleName; - }; - -private: struct _EdgeData { unsigned distance; unsigned originalEdges : 29; @@ -78,7 +69,6 @@ private: struct _ThreadData { _Heap heap; std::vector< _ImportEdge > insertedEdges; - std::vector< Witness > witnessList; _ThreadData( NodeID nodes ): heap( nodes ) { } }; diff --git a/Contractor/GraphLoader.h b/Contractor/GraphLoader.h deleted file mode 100644 index 955a619a3..000000000 --- a/Contractor/GraphLoader.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - open source routing machine - Copyright (C) Dennis Luxen, others 2010 - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU AFFERO General Public License as published by -the Free Software Foundation; either version 3 of the License, or -any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -or see http://www.gnu.org/licenses/agpl.txt. - */ - -#ifndef CREATEGRAPH_H -#define GRAPHLOADER_H - -#include -#include -#include -#include -#include -#include - -#include - -#ifdef _GLIBCXX_PARALLEL -#include -#else -#include -#endif - -#include "../DataStructures/ImportEdge.h" -#include "../typedefs.h" - -typedef google::dense_hash_map ExternalNodeMap; - -template -NodeID readOSRMGraphFromStream(istream &in, vector& edgeList, vector * int2ExtNodeMap) { - NodeID n, source, target, id; - EdgeID m; - short locatable; - int dir, xcoord, ycoord;// direction (0 = open, 1 = forward, 2+ = open) - ExternalNodeMap ext2IntNodeMap; - ext2IntNodeMap.set_empty_key(UINT_MAX); - in >> n; - VERBOSE(cout << "Importing n = " << n << " nodes ..." << flush;) - for (NodeID i=0; i> id >> ycoord >> xcoord; - int2ExtNodeMap->push_back(NodeInfo(xcoord, ycoord, id)); - ext2IntNodeMap.insert(make_pair(id, i)); - } - in >> m; - VERBOSE(cout << " and " << m << " edges ..." << flush;) - - edgeList.reserve(m); - for (EdgeID i=0; i> source >> target >> length >> dir >> weight >> type >> nameID; - assert(length > 0); - assert(weight > 0); - assert(0<=dir && dir<=2); - - bool forward = true; - bool backward = true; - if (dir == 1) backward = false; - if (dir == 2) forward = false; - - if(length == 0) - { cerr << "loaded null length edge" << endl; exit(1); } - - // translate the external NodeIDs to internal IDs - ExternalNodeMap::iterator intNodeID = ext2IntNodeMap.find(source); - if( ext2IntNodeMap.find(source) == ext2IntNodeMap.end()) - { - cerr << "after " << edgeList.size() << " edges" << endl; - cerr << "->" << source << "," << target << "," << length << "," << dir << "," << weight << endl; - cerr << "unresolved source NodeID: " << source << endl; exit(0); - } - source = intNodeID->second; - intNodeID = ext2IntNodeMap.find(target); - if(ext2IntNodeMap.find(target) == ext2IntNodeMap.end()) { cerr << "unresolved target NodeID : " << target << endl; exit(0); } - target = intNodeID->second; - - if(source == UINT_MAX || target == UINT_MAX) { cerr << "nonexisting source or target" << endl; exit(0); } - - EdgeT inputEdge(source, target, nameID, weight, forward, backward, type ); - edgeList.push_back(inputEdge); - } - ext2IntNodeMap.clear(); - vector(edgeList.begin(), edgeList.end()).swap(edgeList); //remove excess candidates. - cout << "ok" << endl; - return n; -} - -template -void readHSGRFromStream(istream &in, vector * edgeList) { - while(!in.eof()) - { - EdgeT g; - EdgeData e; - - int distance; - bool shortcut; - bool forward; - bool backward; - bool forwardTurn; - bool backwardTurn; - short type; - NodeID middle; - NodeID source; - NodeID target; - - in.read((char *)&(distance), sizeof(int)); - assert(distance > 0); - in.read((char *)&(forwardTurn), sizeof(bool)); - in.read((char *)&(backwardTurn), sizeof(bool)); - in.read((char *)&(shortcut), sizeof(bool)); - in.read((char *)&(forward), sizeof(bool)); - in.read((char *)&(backward), sizeof(bool)); - in.read((char *)&(middle), sizeof(NodeID)); - in.read((char *)&(type), sizeof(short)); - in.read((char *)&(source), sizeof(NodeID)); - in.read((char *)&(target), sizeof(NodeID)); - e.backward = backward; e.distance = distance; e.forward = forward; e.middleName.middle = middle; e.shortcut = shortcut; e.type = type; - e.forwardTurn = forwardTurn; e.backwardTurn = backwardTurn; - g.data = e; g.source = source; g.target = target; - - edgeList->push_back(g); - } - -} -#endif // CREATEGRAPH_H