Minor perfomance tweaks. Saves about 3-4 percent of preprocessing time
spent in computing the CH.
This commit is contained in:
parent
6d7dd2cf39
commit
e1f137d59a
@ -81,9 +81,7 @@ private:
|
|||||||
int edgesAdded;
|
int edgesAdded;
|
||||||
int originalEdgesDeleted;
|
int originalEdgesDeleted;
|
||||||
int originalEdgesAdded;
|
int originalEdgesAdded;
|
||||||
_ContractionInformation() {
|
_ContractionInformation() : edgesDeleted(0), edgesAdded(0), originalEdgesDeleted(0), originalEdgesAdded(0) {}
|
||||||
edgesAdded = edgesDeleted = originalEdgesAdded = originalEdgesDeleted = 0;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _NodePartitionor {
|
struct _NodePartitionor {
|
||||||
@ -199,7 +197,7 @@ public:
|
|||||||
}
|
}
|
||||||
std::cout << "Contractor is using " << maxThreads << " threads" << std::endl;
|
std::cout << "Contractor is using " << maxThreads << " threads" << std::endl;
|
||||||
|
|
||||||
NodeID levelID = 0;
|
NodeID numberOfContractedNodes = 0;
|
||||||
std::vector< std::pair< NodeID, bool > > remainingNodes( numberOfNodes );
|
std::vector< std::pair< NodeID, bool > > remainingNodes( numberOfNodes );
|
||||||
std::vector< double > nodePriority( numberOfNodes );
|
std::vector< double > nodePriority( numberOfNodes );
|
||||||
std::vector< _PriorityData > nodeData( numberOfNodes );
|
std::vector< _PriorityData > nodeData( numberOfNodes );
|
||||||
@ -223,7 +221,7 @@ public:
|
|||||||
}
|
}
|
||||||
std::cout << "ok" << std::endl << "preprocessing ..." << std::flush;
|
std::cout << "ok" << std::endl << "preprocessing ..." << std::flush;
|
||||||
|
|
||||||
while ( levelID < numberOfNodes ) {
|
while ( numberOfContractedNodes < numberOfNodes ) {
|
||||||
const int last = ( int ) remainingNodes.size();
|
const int last = ( int ) remainingNodes.size();
|
||||||
#pragma omp parallel
|
#pragma omp parallel
|
||||||
{
|
{
|
||||||
@ -266,7 +264,7 @@ public:
|
|||||||
const _ImportEdge& edge = data.insertedEdges[i];
|
const _ImportEdge& edge = data.insertedEdges[i];
|
||||||
_graph->InsertEdge( edge.source, edge.target, edge.data );
|
_graph->InsertEdge( edge.source, edge.target, edge.data );
|
||||||
}
|
}
|
||||||
std::vector< _ImportEdge >().swap( data.insertedEdges );
|
data.insertedEdges.clear();
|
||||||
}
|
}
|
||||||
//update priorities
|
//update priorities
|
||||||
#pragma omp parallel
|
#pragma omp parallel
|
||||||
@ -275,14 +273,14 @@ public:
|
|||||||
#pragma omp for schedule ( guided ) nowait
|
#pragma omp for schedule ( guided ) nowait
|
||||||
for ( int position = firstIndependent ; position < last; ++position ) {
|
for ( int position = firstIndependent ; position < last; ++position ) {
|
||||||
NodeID x = remainingNodes[position].first;
|
NodeID x = remainingNodes[position].first;
|
||||||
_UpdateNeighbours( &nodePriority, &nodeData, data, x );
|
_UpdateNeighbours( nodePriority, nodeData, data, x );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//remove contracted nodes from the pool
|
//remove contracted nodes from the pool
|
||||||
levelID += last - firstIndependent;
|
numberOfContractedNodes += last - firstIndependent;
|
||||||
remainingNodes.resize( firstIndependent );
|
remainingNodes.resize( firstIndependent );
|
||||||
std::vector< std::pair< NodeID, bool > >( remainingNodes ).swap( remainingNodes );
|
std::vector< std::pair< NodeID, bool > >( remainingNodes ).swap( remainingNodes );
|
||||||
p.printStatus(levelID);
|
p.printStatus(numberOfContractedNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( unsigned threadNum = 0; threadNum < maxThreads; threadNum++ ) {
|
for ( unsigned threadNum = 0; threadNum < maxThreads; threadNum++ ) {
|
||||||
@ -313,7 +311,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _Dijkstra( const int maxDistance, const unsigned numTargets, const int maxNodes, _ThreadData* data ){
|
inline void _Dijkstra( const int maxDistance, const unsigned numTargets, const int maxNodes, _ThreadData* const data ){
|
||||||
|
|
||||||
_Heap& heap = data->heap;
|
_Heap& heap = data->heap;
|
||||||
|
|
||||||
@ -367,7 +365,8 @@ private:
|
|||||||
return edgeQuotionFactor * ((( double ) stats.edgesAdded ) / stats.edgesDeleted ) + originalQuotientFactor * ((( double ) stats.originalEdgesAdded ) / stats.originalEdgesDeleted ) + depthFactor * nodeData->depth;
|
return edgeQuotionFactor * ((( double ) stats.edgesAdded ) / stats.edgesDeleted ) + originalQuotientFactor * ((( double ) stats.originalEdgesAdded ) / stats.originalEdgesDeleted ) + depthFactor * nodeData->depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
template< bool Simulate > bool _Contract( _ThreadData* data, NodeID node, _ContractionInformation* stats = NULL ) {
|
template< bool Simulate >
|
||||||
|
bool _Contract( _ThreadData* data, NodeID node, _ContractionInformation* stats = NULL ) {
|
||||||
_Heap& heap = data->heap;
|
_Heap& heap = data->heap;
|
||||||
int insertedEdgesSize = data->insertedEdges.size();
|
int insertedEdgesSize = data->insertedEdges.size();
|
||||||
std::vector< _ImportEdge >& insertedEdges = data->insertedEdges;
|
std::vector< _ImportEdge >& insertedEdges = data->insertedEdges;
|
||||||
@ -491,10 +490,9 @@ private:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _UpdateNeighbours( std::vector< double >* priorities, std::vector< _PriorityData >* const nodeData, _ThreadData* const data, NodeID node ) {
|
bool _UpdateNeighbours( std::vector< double > & priorities, std::vector< _PriorityData > & nodeData, _ThreadData* const data, NodeID node ) {
|
||||||
std::vector< NodeID >& neighbours = data->neighbours;
|
std::vector< NodeID >& neighbours = data->neighbours;
|
||||||
neighbours.clear();
|
neighbours.clear();
|
||||||
std::vector< NodeID>().swap(neighbours);
|
|
||||||
|
|
||||||
//find all neighbours
|
//find all neighbours
|
||||||
for ( _DynamicGraph::EdgeIterator e = _graph->BeginEdges( node ) ; e < _graph->EndEdges( node ) ; ++e ) {
|
for ( _DynamicGraph::EdgeIterator e = _graph->BeginEdges( node ) ; e < _graph->EndEdges( node ) ; ++e ) {
|
||||||
@ -502,7 +500,7 @@ private:
|
|||||||
if ( u == node )
|
if ( u == node )
|
||||||
continue;
|
continue;
|
||||||
neighbours.push_back( u );
|
neighbours.push_back( u );
|
||||||
( *nodeData )[u].depth = (std::max)(( *nodeData )[node].depth + 1, ( *nodeData )[u].depth );
|
nodeData[u].depth = (std::max)(nodeData[node].depth + 1, nodeData[u].depth );
|
||||||
}
|
}
|
||||||
//eliminate duplicate entries ( forward + backward edges )
|
//eliminate duplicate entries ( forward + backward edges )
|
||||||
std::sort( neighbours.begin(), neighbours.end() );
|
std::sort( neighbours.begin(), neighbours.end() );
|
||||||
@ -510,7 +508,7 @@ private:
|
|||||||
|
|
||||||
for ( int i = 0, e = ( int ) neighbours.size(); i < e; ++i ) {
|
for ( int i = 0, e = ( int ) neighbours.size(); i < e; ++i ) {
|
||||||
const NodeID u = neighbours[i];
|
const NodeID u = neighbours[i];
|
||||||
( *priorities )[u] = _Evaluate( data, &( *nodeData )[u], u );
|
priorities[u] = _Evaluate( data, &( nodeData )[u], u );
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -521,7 +519,6 @@ private:
|
|||||||
|
|
||||||
std::vector< NodeID >& neighbours = data->neighbours;
|
std::vector< NodeID >& neighbours = data->neighbours;
|
||||||
neighbours.clear();
|
neighbours.clear();
|
||||||
std::vector< NodeID>().swap(neighbours);
|
|
||||||
|
|
||||||
for ( _DynamicGraph::EdgeIterator e = _graph->BeginEdges( node ) ; e < _graph->EndEdges( node ) ; ++e ) {
|
for ( _DynamicGraph::EdgeIterator e = _graph->BeginEdges( node ) ; e < _graph->EndEdges( node ) ; ++e ) {
|
||||||
const NodeID target = _graph->GetTarget( e );
|
const NodeID target = _graph->GetTarget( e );
|
||||||
|
Loading…
Reference in New Issue
Block a user