[osrm][routing] Improve compression. Store edge id’s by shortcuts

This commit is contained in:
Denis Koronchik 2014-10-09 15:03:34 +03:00 committed by Alex Zolotarev
parent 46958c0ba8
commit 218c509c9d
4 changed files with 19 additions and 25 deletions

View file

@ -14,6 +14,7 @@
#include "../../../succinct/elias_fano.hpp"
#include "../../../succinct/elias_fano_compressed_list.hpp"
#include "../../../succinct/gamma_vector.hpp"
#include "../../../succinct/rs_bit_vector.hpp"
#include "../../../succinct/mapper.hpp"
@ -78,7 +79,8 @@ void Converter::run(const std::string & name)
int id1 = data.id;
int id2 = node;
edgeId.push_back(bits::ZigZagEncode(id2 - id1));
if (data.shortcut)
edgeId.push_back(bits::ZigZagEncode(id2 - id1));
}
}
std::cout << "Edges count: " << edgeId.size() << std::endl;
@ -97,22 +99,22 @@ void Converter::run(const std::string & name)
builder.push_back(e);
succinct::elias_fano matrix(&builder);
std::string fileName = name + ".matrix";
std::string fileName = name + "." + ROUTING_MATRIX_FILE_TAG;
succinct::mapper::freeze(matrix, fileName.c_str());
std::cout << "--- Save edge data" << std::endl;
succinct::elias_fano_compressed_list edgeVector(edgesData);
fileName = name + ".edgedata";
fileName = name + "." + ROUTING_EDGEDATA_FILE_TAG;
succinct::mapper::freeze(edgeVector, fileName.c_str());
succinct::elias_fano_compressed_list edgeIdVector(edgeId);
fileName = name + ".edgeid";
fileName = name + "." + ROUTING_EDGEID_FILE_TAG;
succinct::mapper::freeze(edgeIdVector, fileName.c_str());
std::cout << "--- Save edge shortcuts" << std::endl;
succinct::bit_vector shortcutsVector(shortcuts);
fileName = name + ".shortcuts";
succinct::rs_bit_vector shortcutsVector(shortcuts);
fileName = name + "." + ROUTING_SHORTCUTS_FILE_TAG;
succinct::mapper::freeze(shortcutsVector, fileName.c_str());
/// @todo Restore this checking. Now data facade depends on mwm libraries.
@ -182,7 +184,7 @@ void Converter::run(const std::string & name)
if (d1.backward != d2.backward ||
d1.forward != d2.forward ||
d1.distance != d2.distance ||
d1.id != d2.id ||
(d1.id != d2.id && (d1.shortcut || d2.shortcut)) ||
d1.shortcut != d2.shortcut)
{
stringstream ss;

View file

@ -12,10 +12,10 @@
#define SEARCH_INDEX_FILE_TAG "sdx"
#define HEADER_FILE_TAG "header"
#define VERSION_FILE_TAG "version"
#define ROUTING_MATRIX_FILE_TAG "matrix"
#define ROUTING_EDGEDATA_FILE_TAG "edgedata"
#define ROUTING_EDGEID_FILE_TAG "edgeid"
#define ROUTING_SHORTCUTS_FILE_TAG "shortcuts"
#define ROUTING_MATRIX_FILE_TAG "mercedes"
#define ROUTING_EDGEDATA_FILE_TAG "daewoo"
#define ROUTING_EDGEID_FILE_TAG "infinity"
#define ROUTING_SHORTCUTS_FILE_TAG "skoda"
#define ROUTING_FTSEG_FILE_TAG "ftseg"
#define ROUTING_NODEIND_TO_FTSEGIND_FILE_TAG "node2ftseg"

View file

@ -11,7 +11,7 @@
#include "../3party/succinct/elias_fano.hpp"
#include "../3party/succinct/elias_fano_compressed_list.hpp"
#include "../3party/succinct/gamma_vector.hpp"
#include "../3party/succinct/bit_vector.hpp"
#include "../3party/succinct/rs_bit_vector.hpp"
#include "../3party/succinct/mapper.hpp"
#include "../3party/osrm/osrm-backend/Server/DataStructures/BaseDataFacade.h"
@ -25,12 +25,13 @@ template <class EdgeDataT> class OsrmDataFacade : public BaseDataFacade<EdgeData
typedef BaseDataFacade<EdgeDataT> super;
succinct::elias_fano_compressed_list m_edgeData;
succinct::bit_vector m_shortcuts;
succinct::rs_bit_vector m_shortcuts;
succinct::elias_fano m_fanoMatrix;
succinct::elias_fano_compressed_list m_edgeId;
FilesMappingContainer::Handle m_handleEdgeData;
FilesMappingContainer::Handle m_handleEdgeId;
FilesMappingContainer::Handle m_handleEdgeIdFano;
FilesMappingContainer::Handle m_handleShortcuts;
FilesMappingContainer::Handle m_handleFanoMatrix;
@ -117,7 +118,8 @@ public:
uint64_t data = m_edgeData[e];
res.id = node - bits::ZigZagDecode(m_edgeId[e]);
res.id = 0;
res.id = node - bits::ZigZagDecode(m_edgeId[m_shortcuts.rank(e)]);
res.backward = data & 0x1;
data >>= 1;
res.forward = data & 0x1;
@ -132,17 +134,6 @@ public:
EdgeDataT const & GetEdgeData(const EdgeID e) const
{
static EdgeDataT res;
uint64_t data = m_edgeData[e];
res.id = m_edgeId[e];
res.backward = data & 0x1;
data >>= 1;
res.forward = data & 0x1;
data >>= 1;
res.distance = data;
res.shortcut = m_shortcuts[e];
return res;
}

View file

@ -17,6 +17,7 @@ SOURCES += \
osrm_online_router.cpp \
osrm2feature_map.cpp \
vehicle_model.cpp \
../3party/succinct/rs_bit_vector.cpp \
HEADERS += \
route.hpp \