Fixes issue #306
This commit is contained in:
parent
1326c5a01f
commit
9b17543021
@ -31,6 +31,8 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
|
#include "TemporaryStorage.h"
|
||||||
|
|
||||||
#include "../DataStructures/BinaryHeap.h"
|
#include "../DataStructures/BinaryHeap.h"
|
||||||
#include "../DataStructures/DeallocatingVector.h"
|
#include "../DataStructures/DeallocatingVector.h"
|
||||||
#include "../DataStructures/DynamicGraph.h"
|
#include "../DataStructures/DynamicGraph.h"
|
||||||
@ -195,13 +197,15 @@ public:
|
|||||||
|
|
||||||
//Create temporary file
|
//Create temporary file
|
||||||
|
|
||||||
GetTemporaryFileName(temporaryEdgeStorageFilename);
|
// GetTemporaryFileName(temporaryEdgeStorageFilename);
|
||||||
|
temporaryStorageSlotID = TemporaryStorage::GetInstance().allocateSlot();
|
||||||
std::cout << "contractor finished initalization" << std::endl;
|
std::cout << "contractor finished initalization" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
~Contractor() {
|
~Contractor() {
|
||||||
//Delete temporary file
|
//Delete temporary file
|
||||||
remove(temporaryEdgeStorageFilename.c_str());
|
// remove(temporaryEdgeStorageFilename.c_str());
|
||||||
|
TemporaryStorage::GetInstance().deallocateSlot(temporaryStorageSlotID);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Run() {
|
void Run() {
|
||||||
@ -264,12 +268,12 @@ public:
|
|||||||
newNodePriority[newNodeID] = nodePriority[remainingNodes[newNodeID].first];
|
newNodePriority[newNodeID] = nodePriority[remainingNodes[newNodeID].first];
|
||||||
remainingNodes[newNodeID].first = newNodeID;
|
remainingNodes[newNodeID].first = newNodeID;
|
||||||
}
|
}
|
||||||
|
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
||||||
//Write dummy number of edges to temporary file
|
//Write dummy number of edges to temporary file
|
||||||
std::ofstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
// std::ofstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
||||||
long initialFilePosition = temporaryEdgeStorage.tellp();
|
long initialFilePosition = tempStorage.tell(temporaryStorageSlotID);
|
||||||
unsigned numberOfTemporaryEdges = 0;
|
unsigned numberOfTemporaryEdges = 0;
|
||||||
temporaryEdgeStorage.write((char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
||||||
|
|
||||||
//walk over all nodes
|
//walk over all nodes
|
||||||
for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) {
|
for(unsigned i = 0; i < _graph->GetNumberOfNodes(); ++i) {
|
||||||
@ -280,9 +284,9 @@ public:
|
|||||||
const NodeID target = _graph->GetTarget(currentEdge);
|
const NodeID target = _graph->GetTarget(currentEdge);
|
||||||
if(UINT_MAX == newNodeIDFromOldNodeIDMap[i] ){
|
if(UINT_MAX == newNodeIDFromOldNodeIDMap[i] ){
|
||||||
//Save edges of this node w/o renumbering.
|
//Save edges of this node w/o renumbering.
|
||||||
temporaryEdgeStorage.write((char*)&start, sizeof(NodeID));
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&start, sizeof(NodeID));
|
||||||
temporaryEdgeStorage.write((char*)&target, sizeof(NodeID));
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&target, sizeof(NodeID));
|
||||||
temporaryEdgeStorage.write((char*)&data, sizeof(_DynamicGraph::EdgeData));
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
||||||
++numberOfTemporaryEdges;
|
++numberOfTemporaryEdges;
|
||||||
}else {
|
}else {
|
||||||
//node is not yet contracted.
|
//node is not yet contracted.
|
||||||
@ -299,9 +303,9 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Note the number of temporarily stored edges
|
//Note the number of temporarily stored edges
|
||||||
temporaryEdgeStorage.seekp(initialFilePosition);
|
tempStorage.seek(temporaryStorageSlotID, initialFilePosition);
|
||||||
temporaryEdgeStorage.write((char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
tempStorage.writeToSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
||||||
temporaryEdgeStorage.close();
|
|
||||||
// INFO("Flushed " << numberOfTemporaryEdges << " edges to disk");
|
// INFO("Flushed " << numberOfTemporaryEdges << " edges to disk");
|
||||||
|
|
||||||
//Delete map from old NodeIDs to new ones.
|
//Delete map from old NodeIDs to new ones.
|
||||||
@ -485,19 +489,20 @@ public:
|
|||||||
std::vector<NodeID>().swap(oldNodeIDFromNewNodeIDMap);
|
std::vector<NodeID>().swap(oldNodeIDFromNewNodeIDMap);
|
||||||
INFO("Loading temporary edges");
|
INFO("Loading temporary edges");
|
||||||
|
|
||||||
std::ifstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
// std::ifstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
|
||||||
|
TemporaryStorage & tempStorage = TemporaryStorage::GetInstance();
|
||||||
//Also get the edges from temporary storage
|
//Also get the edges from temporary storage
|
||||||
unsigned numberOfTemporaryEdges = 0;
|
unsigned numberOfTemporaryEdges = 0;
|
||||||
temporaryEdgeStorage.read((char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&numberOfTemporaryEdges, sizeof(unsigned));
|
||||||
//loads edges of graph before renumbering, no need for further numbering action.
|
//loads edges of graph before renumbering, no need for further numbering action.
|
||||||
NodeID start;
|
NodeID start;
|
||||||
NodeID target;
|
NodeID target;
|
||||||
//edges.reserve(edges.size()+numberOfTemporaryEdges);
|
//edges.reserve(edges.size()+numberOfTemporaryEdges);
|
||||||
_DynamicGraph::EdgeData data;
|
_DynamicGraph::EdgeData data;
|
||||||
for(unsigned i = 0; i < numberOfTemporaryEdges; ++i) {
|
for(unsigned i = 0; i < numberOfTemporaryEdges; ++i) {
|
||||||
temporaryEdgeStorage.read((char*)&start, sizeof(NodeID));
|
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&start, sizeof(NodeID));
|
||||||
temporaryEdgeStorage.read((char*)&target, sizeof(NodeID));
|
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&target, sizeof(NodeID));
|
||||||
temporaryEdgeStorage.read((char*)&data, sizeof(_DynamicGraph::EdgeData));
|
tempStorage.readFromSlot(temporaryStorageSlotID, (char*)&data, sizeof(_DynamicGraph::EdgeData));
|
||||||
Edge newEdge;
|
Edge newEdge;
|
||||||
newEdge.source = start;
|
newEdge.source = start;
|
||||||
newEdge.target = target;
|
newEdge.target = target;
|
||||||
@ -508,7 +513,7 @@ public:
|
|||||||
newEdge.data.backward = data.backward;
|
newEdge.data.backward = data.backward;
|
||||||
edges.push_back( newEdge );
|
edges.push_back( newEdge );
|
||||||
}
|
}
|
||||||
temporaryEdgeStorage.close();
|
tempStorage.deallocateSlot(temporaryStorageSlotID);
|
||||||
INFO("CH has " << edges.size() << " edges");
|
INFO("CH has " << edges.size() << " edges");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -780,7 +785,8 @@ private:
|
|||||||
|
|
||||||
boost::shared_ptr<_DynamicGraph> _graph;
|
boost::shared_ptr<_DynamicGraph> _graph;
|
||||||
std::vector<_DynamicGraph::InputEdge> contractedEdges;
|
std::vector<_DynamicGraph::InputEdge> contractedEdges;
|
||||||
std::string temporaryEdgeStorageFilename;
|
// std::string temporaryEdgeStorageFilename;
|
||||||
|
unsigned temporaryStorageSlotID;
|
||||||
std::vector<NodeID> oldNodeIDFromNewNodeIDMap;
|
std::vector<NodeID> oldNodeIDFromNewNodeIDMap;
|
||||||
|
|
||||||
XORFastHash fastHash;
|
XORFastHash fastHash;
|
||||||
|
@ -25,6 +25,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <boost/unordered_map.hpp>
|
#include <boost/unordered_map.hpp>
|
||||||
#include "../DataStructures/HashTable.h"
|
#include "../DataStructures/HashTable.h"
|
||||||
|
#include "../DataStructures/NodeCoords.h"
|
||||||
#include "../typedefs.h"
|
#include "../typedefs.h"
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user