From 218c509c9ddcf6f6841316f7707889ab08bf6662 Mon Sep 17 00:00:00 2001 From: Denis Koronchik Date: Thu, 9 Oct 2014 15:03:34 +0300 Subject: [PATCH] =?UTF-8?q?[osrm][routing]=20Improve=20compression.=20Stor?= =?UTF-8?q?e=20edge=20id=E2=80=99s=20by=20shortcuts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3party/osrm/osrm-backend/mapsme/converter.cpp | 16 +++++++++------- defines.hpp | 8 ++++---- routing/osrm_data_facade.hpp | 19 +++++-------------- routing/routing.pro | 1 + 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/3party/osrm/osrm-backend/mapsme/converter.cpp b/3party/osrm/osrm-backend/mapsme/converter.cpp index 2f77c0ce18..3f15375ba3 100644 --- a/3party/osrm/osrm-backend/mapsme/converter.cpp +++ b/3party/osrm/osrm-backend/mapsme/converter.cpp @@ -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; diff --git a/defines.hpp b/defines.hpp index 6c45396574..399eb8364a 100644 --- a/defines.hpp +++ b/defines.hpp @@ -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" diff --git a/routing/osrm_data_facade.hpp b/routing/osrm_data_facade.hpp index aef0f68efd..7750c9b8ae 100644 --- a/routing/osrm_data_facade.hpp +++ b/routing/osrm_data_facade.hpp @@ -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 OsrmDataFacade : public BaseDataFacade 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; } diff --git a/routing/routing.pro b/routing/routing.pro index ec4005a8cc..cc381f6871 100644 --- a/routing/routing.pro +++ b/routing/routing.pro @@ -17,6 +17,7 @@ SOURCES += \ osrm_online_router.cpp \ osrm2feature_map.cpp \ vehicle_model.cpp \ + ../3party/succinct/rs_bit_vector.cpp \ HEADERS += \ route.hpp \