forked from organicmaps/organicmaps
[osrm][routing] Improve compression. Store edge id’s by shortcuts
This commit is contained in:
parent
46958c0ba8
commit
218c509c9d
4 changed files with 19 additions and 25 deletions
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ SOURCES += \
|
|||
osrm_online_router.cpp \
|
||||
osrm2feature_map.cpp \
|
||||
vehicle_model.cpp \
|
||||
../3party/succinct/rs_bit_vector.cpp \
|
||||
|
||||
HEADERS += \
|
||||
route.hpp \
|
||||
|
|
Loading…
Add table
Reference in a new issue