Moving contractor back to baseline
This commit is contained in:
		
							parent
							
								
									9b340a507b
								
							
						
					
					
						commit
						29b30bb69c
					
				| @ -98,8 +98,7 @@ private: | |||||||
| public: | public: | ||||||
| 
 | 
 | ||||||
|     template< class InputEdge > |     template< class InputEdge > | ||||||
|     Contractor( int nodes, std::vector< InputEdge >& inputEdges, const double eqf = 2, const double oqf = 2, const double df = 1) |     Contractor( int nodes, std::vector< InputEdge >& inputEdges) { | ||||||
|     : edgeQuotionFactor(eqf), originalQuotientFactor(oqf), depthFactor(df) { |  | ||||||
|         std::vector< _ImportEdge > edges; |         std::vector< _ImportEdge > edges; | ||||||
|         edges.reserve( 2 * inputEdges.size() ); |         edges.reserve( 2 * inputEdges.size() ); | ||||||
|         BOOST_FOREACH(InputEdge & currentEdge, inputEdges) { |         BOOST_FOREACH(InputEdge & currentEdge, inputEdges) { | ||||||
| @ -179,6 +178,22 @@ public: | |||||||
|         edges.resize( edge ); |         edges.resize( edge ); | ||||||
|         _graph.reset( new _DynamicGraph( nodes, edges ) ); |         _graph.reset( new _DynamicGraph( nodes, edges ) ); | ||||||
|         std::vector< _ImportEdge >().swap( edges ); |         std::vector< _ImportEdge >().swap( edges ); | ||||||
|  | //        unsigned maxdegree = 0;
 | ||||||
|  | //        NodeID highestNode = 0;
 | ||||||
|  | //
 | ||||||
|  | //        for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) {
 | ||||||
|  | //            unsigned degree = _graph->EndEdges(i) - _graph->BeginEdges(i);
 | ||||||
|  | //            if(degree > maxdegree) {
 | ||||||
|  | //                maxdegree = degree;
 | ||||||
|  | //                highestNode = i;
 | ||||||
|  | //            }
 | ||||||
|  | //        }
 | ||||||
|  | //
 | ||||||
|  | //        INFO("edges at node with id " << highestNode << " has degree " << maxdegree);
 | ||||||
|  | //        for(unsigned i = _graph->BeginEdges(highestNode); i < _graph->EndEdges(highestNode); ++i) {
 | ||||||
|  | //            INFO(" ->(" << highestNode << "," << _graph->GetTarget(i) << "); via: " << _graph->GetEdgeData(i).via);
 | ||||||
|  | //        }
 | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     ~Contractor() { } |     ~Contractor() { } | ||||||
| @ -213,13 +228,12 @@ public: | |||||||
|             _ThreadData* data = threadData[omp_get_thread_num()]; |             _ThreadData* data = threadData[omp_get_thread_num()]; | ||||||
| #pragma omp parallel for schedule ( guided ) | #pragma omp parallel for schedule ( guided ) | ||||||
|             for ( int x = 0; x < ( int ) numberOfNodes; ++x ) { |             for ( int x = 0; x < ( int ) numberOfNodes; ++x ) { | ||||||
|                 nodePriority[x] = _Evaluate( data, &nodeData[x], x, false ); |                 nodePriority[x] = _Evaluate( data, &nodeData[x], x ); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         std::cout << "ok" << std::endl << "preprocessing ..." << std::flush; |         std::cout << "ok" << std::endl << "preprocessing ..." << std::flush; | ||||||
| 
 | 
 | ||||||
|         while ( numberOfContractedNodes < numberOfNodes ) { |         while ( numberOfContractedNodes < numberOfNodes ) { | ||||||
|             bool topOnePercent = (numberOfNodes - numberOfContractedNodes) > 0.01*numberOfNodes; |  | ||||||
|             const int last = ( int ) remainingNodes.size(); |             const int last = ( int ) remainingNodes.size(); | ||||||
| #pragma omp parallel | #pragma omp parallel | ||||||
|             { |             { | ||||||
| @ -241,10 +255,7 @@ 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; | ||||||
|                     if(topOnePercent) |                     _Contract< false > ( data, x ); | ||||||
|                         _Contract< false, true > ( data, x ); |  | ||||||
|                     else |  | ||||||
|                         _Contract< false, false > ( data, x ); |  | ||||||
|                     nodePriority[x] = -1; |                     nodePriority[x] = -1; | ||||||
|                 } |                 } | ||||||
|                 std::sort( data->insertedEdges.begin(), data->insertedEdges.end() ); |                 std::sort( data->insertedEdges.begin(), data->insertedEdges.end() ); | ||||||
| @ -287,13 +298,34 @@ 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, topOnePercent ); |                     _UpdateNeighbours( nodePriority, nodeData, data, x ); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             //remove contracted nodes from the pool
 |             //remove contracted nodes from the pool
 | ||||||
|             numberOfContractedNodes += 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 ); | ||||||
|  | //            unsigned maxdegree = 0;
 | ||||||
|  | //            unsigned avgdegree = 0;
 | ||||||
|  | //            unsigned mindegree = UINT_MAX;
 | ||||||
|  | //            unsigned quaddegree = 0;
 | ||||||
|  | //
 | ||||||
|  | //            for(unsigned i = 0; i < remainingNodes.size(); ++i) {
 | ||||||
|  | //                unsigned degree = _graph->EndEdges(remainingNodes[i].first) - _graph->BeginEdges(remainingNodes[i].first);
 | ||||||
|  | //                if(degree > maxdegree)
 | ||||||
|  | //                    maxdegree = degree;
 | ||||||
|  | //                if(degree < mindegree)
 | ||||||
|  | //                    mindegree = degree;
 | ||||||
|  | //
 | ||||||
|  | //                avgdegree += degree;
 | ||||||
|  | //                quaddegree += (degree*degree);
 | ||||||
|  | //            }
 | ||||||
|  | //
 | ||||||
|  | //            avgdegree /= std::max((unsigned)1,(unsigned)remainingNodes.size() );
 | ||||||
|  | //            quaddegree /= std::max((unsigned)1,(unsigned)remainingNodes.size() );
 | ||||||
|  | 
 | ||||||
|  |            // INFO("rest: " << remainingNodes.size() << ", max: " << maxdegree << ", min: " << mindegree << ", avg: " << avgdegree << ", quad: " << quaddegree);
 | ||||||
|  | 
 | ||||||
|             p.printStatus(numberOfContractedNodes); |             p.printStatus(numberOfContractedNodes); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -372,22 +404,23 @@ private: | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     double _Evaluate( _ThreadData* const data, _PriorityData* const nodeData, NodeID node, bool topOnePercent ){ |     double _Evaluate( _ThreadData* const data, _PriorityData* const nodeData, NodeID node){ | ||||||
|         _ContractionInformation stats; |         _ContractionInformation stats; | ||||||
| 
 | 
 | ||||||
|         //perform simulated contraction
 |         //perform simulated contraction
 | ||||||
|         if(topOnePercent) |         _Contract< true> ( data, node, &stats ); | ||||||
|             _Contract< true, true > ( data, node, &stats ); |  | ||||||
|         else |  | ||||||
|             _Contract< true, false > ( data, node, &stats ); |  | ||||||
| 
 | 
 | ||||||
|         // Result will contain the priority
 |         // Result will contain the priority
 | ||||||
|  |         double result; | ||||||
|         if ( stats.edgesDeleted == 0 || stats.originalEdgesDeleted == 0 ) |         if ( stats.edgesDeleted == 0 || stats.originalEdgesDeleted == 0 ) | ||||||
|             return depthFactor * nodeData->depth; |                 result = 1 * nodeData->depth; | ||||||
|         return edgeQuotionFactor * ((( double ) stats.edgesAdded ) / stats.edgesDeleted ) + originalQuotientFactor * ((( double ) stats.originalEdgesAdded ) / stats.originalEdgesDeleted ) + depthFactor * nodeData->depth; |         else | ||||||
|  |                 result =  2 * ((( double ) stats.edgesAdded ) / stats.edgesDeleted ) + 4 * ((( double ) stats.originalEdgesAdded ) / stats.originalEdgesDeleted ) + 1 * nodeData->depth; | ||||||
|  |         assert( result >= 0 ); | ||||||
|  |         return result; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     template< bool Simulate, bool topOnePercent > |     template< bool Simulate > | ||||||
|     bool _Contract( _ThreadData* data, NodeID node, _ContractionInformation* stats = NULL ) { |     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(); | ||||||
| @ -502,7 +535,7 @@ private: | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     bool _UpdateNeighbours( std::vector< double > & priorities, std::vector< _PriorityData > & nodeData, _ThreadData* const data, NodeID node, bool topOnePercent ) { |     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(); | ||||||
| 
 | 
 | ||||||
| @ -521,7 +554,7 @@ private: | |||||||
|         int neighbourSize = ( int ) neighbours.size(); |         int neighbourSize = ( int ) neighbours.size(); | ||||||
|         for ( int i = 0, e = neighbourSize; i < e; ++i ) { |         for ( int i = 0, e = neighbourSize; i < e; ++i ) { | ||||||
|             const NodeID u = neighbours[i]; |             const NodeID u = neighbours[i]; | ||||||
|             priorities[u] = _Evaluate( data, &( nodeData )[u], u, topOnePercent ); |             priorities[u] = _Evaluate( data, &( nodeData )[u], u ); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return true; |         return true; | ||||||
| @ -571,9 +604,6 @@ private: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     boost::shared_ptr<_DynamicGraph> _graph; |     boost::shared_ptr<_DynamicGraph> _graph; | ||||||
|     double edgeQuotionFactor; |  | ||||||
|     double originalQuotientFactor; |  | ||||||
|     double depthFactor; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif // CONTRACTOR_H_INCLUDED
 | #endif // CONTRACTOR_H_INCLUDED
 | ||||||
|  | |||||||
| @ -84,10 +84,10 @@ public: | |||||||
|         RawRouteData rawRoute; |         RawRouteData rawRoute; | ||||||
|         rawRoute.checkSum = nodeHelpDesk->GetCheckSum(); |         rawRoute.checkSum = nodeHelpDesk->GetCheckSum(); | ||||||
|         checksumOK = ((unsigned)atoi(routeParameters.options.Find("checksum").c_str()) == rawRoute.checkSum); |         checksumOK = ((unsigned)atoi(routeParameters.options.Find("checksum").c_str()) == rawRoute.checkSum); | ||||||
|         if(!checksumOK) { | //        if(!checksumOK) {
 | ||||||
|             INFO((unsigned)atoi(routeParameters.options.Find("checksum").c_str()) << "!=" << rawRoute.checkSum); | //            INFO((unsigned)atoi(routeParameters.options.Find("checksum").c_str()) << "!=" << rawRoute.checkSum);
 | ||||||
|             INFO("mismatching checksum"); | //            INFO("mismatching checksum");
 | ||||||
|         } | //        }
 | ||||||
|         std::vector<std::string> textCoord; |         std::vector<std::string> textCoord; | ||||||
|         for(unsigned i = 0; i < routeParameters.viaPoints.size(); ++i) { |         for(unsigned i = 0; i < routeParameters.viaPoints.size(); ++i) { | ||||||
|             textCoord = split (routeParameters.viaPoints[i], ','); |             textCoord = split (routeParameters.viaPoints[i], ','); | ||||||
| @ -107,14 +107,14 @@ public: | |||||||
|         std::vector<PhantomNode> phantomNodeVector(rawRoute.rawViaNodeCoordinates.size()); |         std::vector<PhantomNode> phantomNodeVector(rawRoute.rawViaNodeCoordinates.size()); | ||||||
|         for(unsigned i = 0; i < rawRoute.rawViaNodeCoordinates.size(); ++i) { |         for(unsigned i = 0; i < rawRoute.rawViaNodeCoordinates.size(); ++i) { | ||||||
|             if(checksumOK && i < routeParameters.hints.size() && "" != routeParameters.hints[i]) { |             if(checksumOK && i < routeParameters.hints.size() && "" != routeParameters.hints[i]) { | ||||||
|                 INFO("Decoding hint: " << routeParameters.hints[i] << " for location index " << i); | //                INFO("Decoding hint: " << routeParameters.hints[i] << " for location index " << i);
 | ||||||
|                 DecodeObjectFromBase64(phantomNodeVector[i], routeParameters.hints[i]); |                 DecodeObjectFromBase64(phantomNodeVector[i], routeParameters.hints[i]); | ||||||
|                 if(phantomNodeVector[i].isValid(nodeHelpDesk->getNumberOfNodes())) { |                 if(phantomNodeVector[i].isValid(nodeHelpDesk->getNumberOfNodes())) { | ||||||
|                     INFO("Decoded hint " << i << " successfully"); | //                    INFO("Decoded hint " << i << " successfully");
 | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             INFO("Brute force lookup of coordinate " << i); | //            INFO("Brute force lookup of coordinate " << i);
 | ||||||
|             searchEngine->FindPhantomNodeForCoordinate( rawRoute.rawViaNodeCoordinates[i], phantomNodeVector[i]); |             searchEngine->FindPhantomNodeForCoordinate( rawRoute.rawViaNodeCoordinates[i], phantomNodeVector[i]); | ||||||
|         } |         } | ||||||
|         unsigned distance = 0; |         unsigned distance = 0; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user