First round of changes to have the constractor flush its data structures
at around 75% of the preprocessing. Also, a first try to branches.
This commit is contained in:
		
							parent
							
								
									53aede83dc
								
							
						
					
					
						commit
						a5c5f4c02c
					
				@ -233,7 +233,66 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
        std::cout << "ok" << std::endl << "preprocessing ..." << std::flush;
 | 
			
		||||
 | 
			
		||||
        bool flushedContractor = false;
 | 
			
		||||
        while ( numberOfContractedNodes < numberOfNodes ) {
 | 
			
		||||
        	if(!flushedContractor && (numberOfContractedNodes > (numberOfNodes*0.75) ) ){
 | 
			
		||||
        		INFO("Flushing memory after " << numberOfContractedNodes << " nodes");
 | 
			
		||||
        		//TODO:
 | 
			
		||||
 | 
			
		||||
        		//Delete old heap data to free memory that we need for the coming operations
 | 
			
		||||
                for ( unsigned threadNum = 0; threadNum < maxThreads; threadNum++ ) {
 | 
			
		||||
                    delete threadData[threadNum];
 | 
			
		||||
                }
 | 
			
		||||
                threadData.clear();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        		//Create new priority array
 | 
			
		||||
        		std::vector<double> newNodePriority(remainingNodes.size());
 | 
			
		||||
        		//this map gives the old IDs from the new ones, necessary to get a consistent graph at the end of contraction
 | 
			
		||||
        		std::vector<NodeID> oldNodeIDMap(remainingNodes.size());
 | 
			
		||||
        		//this map gives the new IDs from the old ones, necessary to remap targets from the remaining graph
 | 
			
		||||
        		std::vector<NodeID> newNodeIDMap(numberOfNodes, UINT_MAX);
 | 
			
		||||
        		
 | 
			
		||||
        		//build forward and backward renumbering map and remap ids in remainingNodes and Priorities.
 | 
			
		||||
        		for(unsigned newNodeID = 0; newNodeID < remainingNodes.size(); ++newNodeID) {
 | 
			
		||||
        			//create renumbering maps in both directions
 | 
			
		||||
        			oldNodeIDMap[newNodeID] = remainingNodes[newNodeID].first;
 | 
			
		||||
        			newNodeIDMap[remainingNodes[newNodeID].first] = newNodeID;
 | 
			
		||||
        			newNodePriority[newNodeID] = nodePriority[remainingNodes[newNodeID].first];
 | 
			
		||||
        			remainingNodes[newNodeID].first = newNodeID;
 | 
			
		||||
        		}
 | 
			
		||||
        		
 | 
			
		||||
        		//create new _DynamicGraph, goes out of scope after the renumbering
 | 
			
		||||
        		boost::shared_ptr<_DynamicGraph> _newGraph ( new _DynamicGraph(remainingNodes.size()) );
 | 
			
		||||
 | 
			
		||||
        		//walk over all remainingNodes
 | 
			
		||||
        		for(unsigned i = 0; i < remainingNodes.size(); ++i) {
 | 
			
		||||
        		//TODO:Wenn Knoten kontrahiert: speichern seiner Kanten in vector mit
 | 
			
		||||
        		//TODO:Wenn Knoten nicht kontrahiert: Einfügen der Kanten in neuen DynamicGraph und
 | 
			
		||||
        		//								 dabei Source, Target umnummerieren und Priorität in neuem Prioritäten-Array speichern.
 | 
			
		||||
        		}
 | 
			
		||||
        		//
 | 
			
		||||
        		//Delete map from old NodeIDs to new ones.
 | 
			
		||||
        		std::vector<NodeID>().swap(newNodeIDMap);
 | 
			
		||||
 | 
			
		||||
        		//Replace old priorities array by new one
 | 
			
		||||
        		nodePriority.swap(newNodePriority);
 | 
			
		||||
        		//Delete old nodePriority vector
 | 
			
		||||
        		std::vector<double>().swap(newNodePriority);
 | 
			
		||||
        		//Alten Graphen löschen und neuen Graphen speichern.
 | 
			
		||||
 | 
			
		||||
        		//ThreadData mit Heaps passender Größe reinitialisieren.
 | 
			
		||||
                for ( unsigned threadNum = 0; threadNum < maxThreads; ++threadNum ) {
 | 
			
		||||
                    threadData.push_back( new _ThreadData( remainingNodes.size() ) );
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                //TODO: Check if old Graph is removed
 | 
			
		||||
                _graph.swap(_newGraph);
 | 
			
		||||
 | 
			
		||||
//        		numberOfContractedNodes = 0;
 | 
			
		||||
        		flushedContractor = true;
 | 
			
		||||
        	}
 | 
			
		||||
 | 
			
		||||
            const int last = ( int ) remainingNodes.size();
 | 
			
		||||
#pragma omp parallel
 | 
			
		||||
            {
 | 
			
		||||
@ -604,6 +663,7 @@ private:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    boost::shared_ptr<_DynamicGraph> _graph;
 | 
			
		||||
    std::vector<_DynamicGraph::InputEdge> contractedEdges;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // CONTRACTOR_H_INCLUDED
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user