[osrm][routing] Store number of nodes for matrix

This commit is contained in:
Denis Koronchik 2014-10-14 23:56:13 +03:00 committed by Alex Zolotarev
parent e5f65a930e
commit d903a7fa28
2 changed files with 19 additions and 14 deletions

View file

@ -2,12 +2,13 @@
#include <iostream>
#include "../Server/DataStructures/InternalDataFacade.h"
#include "../../../../base/bits.hpp"
#include "../../../../base/logging.hpp"
#include "../../../../coding/matrix_traversal.hpp"
#include "../../../../coding/internal/file_data.hpp"
#include "../../../../base/bits.hpp"
#include "../../../../base/logging.hpp"
#include "../../../../routing/osrm_data_facade.hpp"
#include "../../../succinct/elias_fano.hpp"
@ -16,6 +17,7 @@
#include "../../../succinct/rs_bit_vector.hpp"
#include "../../../succinct/mapper.hpp"
#include "../Server/DataStructures/InternalDataFacade.h"
namespace mapsme
{
@ -54,7 +56,7 @@ void Converter::run(const std::string & name)
InternalDataFacade<QueryEdge::EdgeData> facade(server_paths);
PrintStatus(true);
uint64_t const nodeCount = facade.GetNumberOfNodes();
unsigned const nodeCount = facade.GetNumberOfNodes();
std::vector<uint64_t> edges;
std::vector<uint32_t> edgesData;
@ -183,8 +185,10 @@ void Converter::run(const std::string & name)
succinct::elias_fano matrix(&builder);
std::string fileName = name + "." + ROUTING_MATRIX_FILE_TAG;
succinct::mapper::freeze(matrix, fileName.c_str());
std::ofstream fout(fileName, std::ios::binary);
fout.write((const char*)&nodeCount, sizeof(nodeCount));
succinct::mapper::freeze(matrix, fout);
fout.close();
std::cout << "--- Save edge data" << std::endl;
succinct::elias_fano_compressed_list edgeVector(edgesData);
@ -234,10 +238,10 @@ void Converter::run(const std::string & name)
facadeNew.Load(container);
uint64_t edgesCount = facadeNew.GetNumberOfEdges() - copiedEdges + ignoredEdges;
std::cout << "Check node count " << facade.GetNumberOfNodes() << " == " << facadeNew.GetNumberOfNodes() << "...";
PrintStatus(facade.GetNumberOfNodes() == facadeNew.GetNumberOfNodes());
std::cout << "Check edges count " << facade.GetNumberOfEdges() << " == " << edgesCount << "...";
PrintStatus(facade.GetNumberOfEdges() == edgesCount);
std::cout << "Check node count " << facade.GetNumberOfNodes() << " == " << facadeNew.GetNumberOfNodes() << "..." << std::endl;
CHECK_EQUAL(facade.GetNumberOfNodes(), facadeNew.GetNumberOfNodes(), ());
std::cout << "Check edges count " << facade.GetNumberOfEdges() << " == " << edgesCount << "..." << std::endl;
CHECK_EQUAL(facade.GetNumberOfEdges(), edgesCount, ());
std::cout << "Check edges data ...";
bool error = false;

View file

@ -65,9 +65,9 @@ public:
m_handleFanoMatrix.Assign(container.Map(ROUTING_MATRIX_FILE_TAG));
ASSERT(m_handleFanoMatrix.IsValid(), ());
succinct::mapper::map(m_matrix, m_handleFanoMatrix.GetData<char>());
m_numberOfNodes = (unsigned)sqrt(m_matrix.size() / 2) + 1;
m_numberOfNodes = *m_handleFanoMatrix.GetData<unsigned>();
succinct::mapper::map(m_matrix, m_handleFanoMatrix.GetData<char>() + sizeof(unsigned));
}
void Clear()
@ -135,13 +135,14 @@ public:
EdgeID BeginEdges(const NodeID n) const
{
return n == 0 ? 0 : m_matrix.rank(2 * n * (uint64_t)GetNumberOfNodes());
uint64_t idx = 2 * n * (uint64_t)GetNumberOfNodes();
return n == 0 ? 0 : m_matrix.rank(min(idx, m_matrix.size()));
}
EdgeID EndEdges(const NodeID n) const
{
uint64_t const idx = 2 * (n + 1) * (uint64_t)GetNumberOfNodes();
return m_matrix.rank(std::min(idx, m_matrix.size()));
return m_matrix.rank(min(idx, m_matrix.size()));
}
EdgeRange GetAdjacentEdgeRange(const NodeID node) const