minor changes
This commit is contained in:
parent
e695e269b1
commit
3db44b3ce1
@ -43,11 +43,11 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
#ifdef _MANYCORES
|
#ifdef _MANYCORES
|
||||||
typedef BinaryHeap< NodeID, NodeID, int, _HeapData, DenseStorage<NodeID, NodeID> > _Heap;
|
typedef BinaryHeap< NodeID, NodeID, int, _HeapData, DenseStorage<NodeID, NodeID> > _Heap;
|
||||||
#else
|
#else
|
||||||
typedef BinaryHeap< NodeID, NodeID, int, _HeapData > _Heap;
|
typedef BinaryHeap< NodeID, NodeID, int, _HeapData > _Heap;
|
||||||
#endif
|
#endif
|
||||||
struct _ThreadData {
|
struct _ThreadData {
|
||||||
_Heap* _heapForward;
|
_Heap* _heapForward;
|
||||||
_Heap* _heapBackward;
|
_Heap* _heapBackward;
|
||||||
_ThreadData( NodeID nodes ) {
|
_ThreadData( NodeID nodes ) {
|
||||||
@ -59,15 +59,15 @@ struct _ThreadData {
|
|||||||
delete _heapBackward;
|
delete _heapBackward;
|
||||||
delete _heapForward;
|
delete _heapForward;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
union _MiddleName {
|
union _MiddleName {
|
||||||
NodeID nameID;
|
NodeID nameID;
|
||||||
NodeID middle;
|
NodeID middle;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
struct Edge {
|
struct Edge {
|
||||||
NodeID source;
|
NodeID source;
|
||||||
NodeID target;
|
NodeID target;
|
||||||
struct EdgeData {
|
struct EdgeData {
|
||||||
@ -97,23 +97,23 @@ struct Edge {
|
|||||||
bool operator== ( const Edge& right ) const {
|
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 );
|
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 ) {
|
ContractionCleanup( int numNodes, const std::vector< Edge >& edges ) {
|
||||||
_graph = edges;
|
_graph = edges;
|
||||||
_numNodes = numNodes;
|
_numNodes = numNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
~ContractionCleanup() {
|
~ContractionCleanup() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Run() {
|
void Run() {
|
||||||
RemoveUselessShortcuts();
|
RemoveUselessShortcuts();
|
||||||
}
|
}
|
||||||
|
|
||||||
template< class EdgeT >
|
template< class EdgeT >
|
||||||
void GetData( std::vector< EdgeT >& edges ) {
|
void GetData( std::vector< EdgeT >& edges ) {
|
||||||
for ( int edge = 0, endEdges = ( int ) _graph.size(); edge != endEdges; ++edge ) {
|
for ( int edge = 0, endEdges = ( int ) _graph.size(); edge != endEdges; ++edge ) {
|
||||||
EdgeT newEdge;
|
EdgeT newEdge;
|
||||||
newEdge.source = _graph[edge].source;
|
newEdge.source = _graph[edge].source;
|
||||||
@ -130,57 +130,57 @@ void GetData( std::vector< EdgeT >& edges ) {
|
|||||||
edges.push_back( newEdge );
|
edges.push_back( newEdge );
|
||||||
}
|
}
|
||||||
#ifdef _GLIBCXX_PARALLEL
|
#ifdef _GLIBCXX_PARALLEL
|
||||||
__gnu_parallel::sort( edges.begin(), edges.end() );
|
__gnu_parallel::sort( edges.begin(), edges.end() );
|
||||||
#else
|
#else
|
||||||
sort( edges.begin(), edges.end() );
|
sort( edges.begin(), edges.end() );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
class AllowForwardEdge {
|
class AllowForwardEdge {
|
||||||
public:
|
public:
|
||||||
bool operator()( const Edge& data ) const {
|
bool operator()( const Edge& data ) const {
|
||||||
return data.data.forward;
|
return data.data.forward;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class AllowBackwardEdge {
|
class AllowBackwardEdge {
|
||||||
public:
|
public:
|
||||||
bool operator()( const Edge& data ) const {
|
bool operator()( const Edge& data ) const {
|
||||||
return data.data.backward;
|
return data.data.backward;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
double _Timestamp() {
|
double _Timestamp() {
|
||||||
struct timeval tp;
|
struct timeval tp;
|
||||||
gettimeofday(&tp, NULL);
|
gettimeofday(&tp, NULL);
|
||||||
return double(tp.tv_sec) + tp.tv_usec / 1000000.;
|
return double(tp.tv_sec) + tp.tv_usec / 1000000.;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BuildOutgoingGraph() {
|
void BuildOutgoingGraph() {
|
||||||
//sort edges by source
|
//sort edges by source
|
||||||
#ifdef _GLIBCXX_PARALLEL
|
#ifdef _GLIBCXX_PARALLEL
|
||||||
__gnu_parallel::sort( _graph.begin(), _graph.end(), Edge::CompareBySource );
|
__gnu_parallel::sort( _graph.begin(), _graph.end(), Edge::CompareBySource );
|
||||||
#else
|
#else
|
||||||
sort( _graph.begin(), _graph.end(), Edge::CompareBySource );
|
sort( _graph.begin(), _graph.end(), Edge::CompareBySource );
|
||||||
#endif
|
#endif
|
||||||
try {
|
try {
|
||||||
_firstEdge.resize( _numNodes + 1 );
|
_firstEdge.resize( _numNodes + 1 );
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
cerr << "Not enough RAM on machine" << endl;
|
cerr << "Not enough RAM on machine" << endl;
|
||||||
}
|
}
|
||||||
_firstEdge[0] = 0;
|
_firstEdge[0] = 0;
|
||||||
for ( NodeID i = 0, node = 0; i < ( NodeID ) _graph.size(); i++ ) {
|
for ( NodeID i = 0, node = 0; i < ( NodeID ) _graph.size(); i++ ) {
|
||||||
while ( _graph[i].source != node )
|
while ( _graph[i].source != node )
|
||||||
_firstEdge[++node] = i;
|
_firstEdge[++node] = i;
|
||||||
if ( i == ( NodeID ) _graph.size() - 1 )
|
if ( i == ( NodeID ) _graph.size() - 1 )
|
||||||
while ( node < _numNodes )
|
while ( node < _numNodes )
|
||||||
_firstEdge[++node] = ( int ) _graph.size();
|
_firstEdge[++node] = ( int ) _graph.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoveUselessShortcuts() {
|
void RemoveUselessShortcuts() {
|
||||||
int maxThreads = omp_get_max_threads();
|
int maxThreads = omp_get_max_threads();
|
||||||
std::vector < _ThreadData* > threadData;
|
std::vector < _ThreadData* > threadData;
|
||||||
for ( int threadNum = 0; threadNum < maxThreads; ++threadNum ) {
|
for ( int threadNum = 0; threadNum < maxThreads; ++threadNum ) {
|
||||||
@ -238,9 +238,9 @@ void RemoveUselessShortcuts() {
|
|||||||
for ( int threadNum = 0; threadNum < maxThreads; ++threadNum ) {
|
for ( int threadNum = 0; threadNum < maxThreads; ++threadNum ) {
|
||||||
delete threadData[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 NodeID node = heapForward->DeleteMin();
|
||||||
const int distance = heapForward->GetKey( node );
|
const int distance = heapForward->GetKey( node );
|
||||||
@ -276,9 +276,9 @@ template< class EdgeAllowed, class StallEdgeAllowed > void _ComputeStep( _Heap*
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int _ComputeDistance( NodeID source, NodeID target, _ThreadData * data, std::vector< NodeID >* path = NULL ) {
|
int _ComputeDistance( NodeID source, NodeID target, _ThreadData * data, std::vector< NodeID >* path = NULL ) {
|
||||||
data->_heapForward->Clear();
|
data->_heapForward->Clear();
|
||||||
data->_heapBackward->Clear();
|
data->_heapBackward->Clear();
|
||||||
//insert source into heap
|
//insert source into heap
|
||||||
@ -305,10 +305,10 @@ int _ComputeDistance( NodeID source, NodeID target, _ThreadData * data, std::vec
|
|||||||
return std::numeric_limits< unsigned >::max();
|
return std::numeric_limits< unsigned >::max();
|
||||||
|
|
||||||
return targetDistance;
|
return targetDistance;
|
||||||
}
|
}
|
||||||
NodeID _numNodes;
|
NodeID _numNodes;
|
||||||
std::vector< Edge > _graph;
|
std::vector< Edge > _graph;
|
||||||
std::vector< unsigned > _firstEdge;
|
std::vector< unsigned > _firstEdge;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CONTRACTIONCLEANUP_H_INCLUDED
|
#endif // CONTRACTIONCLEANUP_H_INCLUDED
|
||||||
|
Loading…
Reference in New Issue
Block a user