Ownership: vector already owns, no need for wrapping in unique_ptr.
Removes the pointless `std::unique_ptr<std::vector<T>>` usage, as a `std::vector` already owns its resources and manages them. Results in one indirection less (hint: good).
This commit is contained in:
parent
db092c828e
commit
f10fb77a81
@ -40,7 +40,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "../util/graph_loader.hpp"
|
#include "../util/graph_loader.hpp"
|
||||||
#include "../util/integer_range.hpp"
|
#include "../util/integer_range.hpp"
|
||||||
#include "../util/lua_util.hpp"
|
#include "../util/lua_util.hpp"
|
||||||
#include "../util/make_unique.hpp"
|
|
||||||
#include "../util/osrm_exception.hpp"
|
#include "../util/osrm_exception.hpp"
|
||||||
#include "../util/simple_logger.hpp"
|
#include "../util/simple_logger.hpp"
|
||||||
#include "../util/string_util.hpp"
|
#include "../util/string_util.hpp"
|
||||||
@ -79,12 +78,11 @@ int Prepare::Run()
|
|||||||
|
|
||||||
TIMER_START(expansion);
|
TIMER_START(expansion);
|
||||||
|
|
||||||
auto node_based_edge_list = osrm::make_unique<std::vector<EdgeBasedNode>>();;
|
std::vector<EdgeBasedNode> node_based_edge_list;
|
||||||
DeallocatingVector<EdgeBasedEdge> edge_based_edge_list;
|
DeallocatingVector<EdgeBasedEdge> edge_based_edge_list;
|
||||||
auto internal_to_external_node_map = osrm::make_unique<std::vector<QueryNode>>();
|
std::vector<QueryNode> internal_to_external_node_map;
|
||||||
auto graph_size =
|
auto graph_size = BuildEdgeExpandedGraph(internal_to_external_node_map, node_based_edge_list,
|
||||||
BuildEdgeExpandedGraph(*internal_to_external_node_map,
|
edge_based_edge_list);
|
||||||
*node_based_edge_list, edge_based_edge_list);
|
|
||||||
|
|
||||||
auto number_of_node_based_nodes = graph_size.first;
|
auto number_of_node_based_nodes = graph_size.first;
|
||||||
auto max_edge_id = graph_size.second;
|
auto max_edge_id = graph_size.second;
|
||||||
@ -94,39 +92,37 @@ int Prepare::Run()
|
|||||||
SimpleLogger().Write() << "building r-tree ...";
|
SimpleLogger().Write() << "building r-tree ...";
|
||||||
TIMER_START(rtree);
|
TIMER_START(rtree);
|
||||||
|
|
||||||
FindComponents(max_edge_id, edge_based_edge_list, *node_based_edge_list);
|
FindComponents(max_edge_id, edge_based_edge_list, node_based_edge_list);
|
||||||
|
|
||||||
BuildRTree(*node_based_edge_list, *internal_to_external_node_map);
|
BuildRTree(node_based_edge_list, internal_to_external_node_map);
|
||||||
|
|
||||||
TIMER_STOP(rtree);
|
TIMER_STOP(rtree);
|
||||||
|
|
||||||
SimpleLogger().Write() << "writing node map ...";
|
SimpleLogger().Write() << "writing node map ...";
|
||||||
WriteNodeMapping(std::move(internal_to_external_node_map));
|
WriteNodeMapping(internal_to_external_node_map);
|
||||||
|
|
||||||
// Contracting the edge-expanded graph
|
// Contracting the edge-expanded graph
|
||||||
|
|
||||||
TIMER_START(contraction);
|
TIMER_START(contraction);
|
||||||
std::vector<bool> is_core_node;
|
std::vector<bool> is_core_node;
|
||||||
auto contracted_edge_list = osrm::make_unique<DeallocatingVector<QueryEdge>>();
|
DeallocatingVector<QueryEdge> contracted_edge_list;
|
||||||
ContractGraph(max_edge_id, edge_based_edge_list, *contracted_edge_list, is_core_node);
|
ContractGraph(max_edge_id, edge_based_edge_list, contracted_edge_list, is_core_node);
|
||||||
TIMER_STOP(contraction);
|
TIMER_STOP(contraction);
|
||||||
|
|
||||||
SimpleLogger().Write() << "Contraction took " << TIMER_SEC(contraction) << " sec";
|
SimpleLogger().Write() << "Contraction took " << TIMER_SEC(contraction) << " sec";
|
||||||
|
|
||||||
std::size_t number_of_used_edges = WriteContractedGraph(max_edge_id,
|
std::size_t number_of_used_edges =
|
||||||
std::move(node_based_edge_list),
|
WriteContractedGraph(max_edge_id, node_based_edge_list, contracted_edge_list);
|
||||||
std::move(contracted_edge_list));
|
|
||||||
WriteCoreNodeMarker(std::move(is_core_node));
|
WriteCoreNodeMarker(std::move(is_core_node));
|
||||||
|
|
||||||
TIMER_STOP(preparing);
|
TIMER_STOP(preparing);
|
||||||
|
|
||||||
SimpleLogger().Write() << "Preprocessing : " << TIMER_SEC(preparing) << " seconds";
|
SimpleLogger().Write() << "Preprocessing : " << TIMER_SEC(preparing) << " seconds";
|
||||||
SimpleLogger().Write() << "Expansion : " << (number_of_node_based_nodes / TIMER_SEC(expansion))
|
SimpleLogger().Write() << "Expansion : " << (number_of_node_based_nodes / TIMER_SEC(expansion))
|
||||||
<< " nodes/sec and "
|
<< " nodes/sec and " << ((max_edge_id + 1) / TIMER_SEC(expansion))
|
||||||
<< ((max_edge_id+1) / TIMER_SEC(expansion)) << " edges/sec";
|
<< " edges/sec";
|
||||||
|
|
||||||
SimpleLogger().Write() << "Contraction: "
|
SimpleLogger().Write() << "Contraction: " << ((max_edge_id + 1) / TIMER_SEC(contraction))
|
||||||
<< ((max_edge_id+1) / TIMER_SEC(contraction))
|
|
||||||
<< " nodes/sec and " << number_of_used_edges / TIMER_SEC(contraction)
|
<< " nodes/sec and " << number_of_used_edges / TIMER_SEC(contraction)
|
||||||
<< " edges/sec";
|
<< " edges/sec";
|
||||||
|
|
||||||
@ -135,21 +131,25 @@ int Prepare::Run()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<EdgeBasedEdge>& input_edge_list,
|
void Prepare::FindComponents(unsigned max_edge_id,
|
||||||
std::vector<EdgeBasedNode>& input_nodes) const
|
const DeallocatingVector<EdgeBasedEdge> &input_edge_list,
|
||||||
|
std::vector<EdgeBasedNode> &input_nodes) const
|
||||||
{
|
{
|
||||||
struct UncontractedEdgeData { };
|
struct UncontractedEdgeData
|
||||||
struct InputEdge {
|
{
|
||||||
|
};
|
||||||
|
struct InputEdge
|
||||||
|
{
|
||||||
unsigned source;
|
unsigned source;
|
||||||
unsigned target;
|
unsigned target;
|
||||||
UncontractedEdgeData data;
|
UncontractedEdgeData data;
|
||||||
|
|
||||||
bool operator<(const InputEdge& rhs) const
|
bool operator<(const InputEdge &rhs) const
|
||||||
{
|
{
|
||||||
return source < rhs.source || (source == rhs.source && target < rhs.target);
|
return source < rhs.source || (source == rhs.source && target < rhs.target);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const InputEdge& rhs) const
|
bool operator==(const InputEdge &rhs) const
|
||||||
{
|
{
|
||||||
return source == rhs.source && target == rhs.target;
|
return source == rhs.source && target == rhs.target;
|
||||||
}
|
}
|
||||||
@ -158,7 +158,7 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<Edge
|
|||||||
std::vector<InputEdge> edges;
|
std::vector<InputEdge> edges;
|
||||||
edges.reserve(input_edge_list.size() * 2);
|
edges.reserve(input_edge_list.size() * 2);
|
||||||
|
|
||||||
for (const auto& edge : input_edge_list)
|
for (const auto &edge : input_edge_list)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT_MSG(static_cast<unsigned int>(std::max(edge.weight, 1)) > 0,
|
BOOST_ASSERT_MSG(static_cast<unsigned int>(std::max(edge.weight, 1)) > 0,
|
||||||
"edge distance < 1");
|
"edge distance < 1");
|
||||||
@ -174,7 +174,7 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<Edge
|
|||||||
}
|
}
|
||||||
|
|
||||||
// connect forward and backward nodes of each edge
|
// connect forward and backward nodes of each edge
|
||||||
for (const auto& node : input_nodes)
|
for (const auto &node : input_nodes)
|
||||||
{
|
{
|
||||||
if (node.reverse_edge_based_node_id != SPECIAL_NODEID)
|
if (node.reverse_edge_based_node_id != SPECIAL_NODEID)
|
||||||
{
|
{
|
||||||
@ -187,16 +187,18 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<Edge
|
|||||||
auto new_end = std::unique(edges.begin(), edges.end());
|
auto new_end = std::unique(edges.begin(), edges.end());
|
||||||
edges.resize(new_end - edges.begin());
|
edges.resize(new_end - edges.begin());
|
||||||
|
|
||||||
auto uncontractor_graph = std::make_shared<UncontractedGraph>(max_edge_id+1, edges);
|
auto uncontractor_graph = std::make_shared<UncontractedGraph>(max_edge_id + 1, edges);
|
||||||
|
|
||||||
TarjanSCC<UncontractedGraph> component_search(std::const_pointer_cast<const UncontractedGraph>(uncontractor_graph));
|
TarjanSCC<UncontractedGraph> component_search(
|
||||||
|
std::const_pointer_cast<const UncontractedGraph>(uncontractor_graph));
|
||||||
component_search.run();
|
component_search.run();
|
||||||
|
|
||||||
for (auto& node : input_nodes)
|
for (auto &node : input_nodes)
|
||||||
{
|
{
|
||||||
auto forward_component = component_search.get_component_id(node.forward_edge_based_node_id);
|
auto forward_component = component_search.get_component_id(node.forward_edge_based_node_id);
|
||||||
BOOST_ASSERT(node.reverse_edge_based_node_id == SPECIAL_EDGEID ||
|
BOOST_ASSERT(node.reverse_edge_based_node_id == SPECIAL_EDGEID ||
|
||||||
forward_component == component_search.get_component_id(node.reverse_edge_based_node_id));
|
forward_component ==
|
||||||
|
component_search.get_component_id(node.reverse_edge_based_node_id));
|
||||||
|
|
||||||
const unsigned component_size = component_search.get_component_size(forward_component);
|
const unsigned component_size = component_search.get_component_size(forward_component);
|
||||||
const bool is_tiny_component = component_size < 1000;
|
const bool is_tiny_component = component_size < 1000;
|
||||||
@ -204,7 +206,7 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<Edge
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Prepare::WriteCoreNodeMarker(std::vector<bool>&& in_is_core_node) const
|
void Prepare::WriteCoreNodeMarker(std::vector<bool> &&in_is_core_node) const
|
||||||
{
|
{
|
||||||
std::vector<bool> is_core_node(in_is_core_node);
|
std::vector<bool> is_core_node(in_is_core_node);
|
||||||
std::vector<char> unpacked_bool_flags(is_core_node.size());
|
std::vector<char> unpacked_bool_flags(is_core_node.size());
|
||||||
@ -213,21 +215,23 @@ void Prepare::WriteCoreNodeMarker(std::vector<bool>&& in_is_core_node) const
|
|||||||
unpacked_bool_flags[i] = is_core_node[i] ? 1 : 0;
|
unpacked_bool_flags[i] = is_core_node[i] ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::filesystem::ofstream core_marker_output_stream(config.core_output_path, std::ios::binary);
|
boost::filesystem::ofstream core_marker_output_stream(config.core_output_path,
|
||||||
|
std::ios::binary);
|
||||||
unsigned size = unpacked_bool_flags.size();
|
unsigned size = unpacked_bool_flags.size();
|
||||||
core_marker_output_stream.write((char *)&size, sizeof(unsigned));
|
core_marker_output_stream.write((char *)&size, sizeof(unsigned));
|
||||||
core_marker_output_stream.write((char *)unpacked_bool_flags.data(), sizeof(char)*unpacked_bool_flags.size());
|
core_marker_output_stream.write((char *)unpacked_bool_flags.data(),
|
||||||
|
sizeof(char) * unpacked_bool_flags.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
||||||
std::unique_ptr<std::vector<EdgeBasedNode>> node_based_edge_list,
|
const std::vector<EdgeBasedNode> &node_based_edge_list,
|
||||||
std::unique_ptr<DeallocatingVector<QueryEdge>> contracted_edge_list)
|
const DeallocatingVector<QueryEdge> &contracted_edge_list)
|
||||||
{
|
{
|
||||||
const unsigned crc32_value = CalculateEdgeChecksum(std::move(node_based_edge_list));
|
const unsigned crc32_value = CalculateEdgeChecksum(node_based_edge_list);
|
||||||
|
|
||||||
// Sorting contracted edges in a way that the static query graph can read some in in-place.
|
// Sorting contracted edges in a way that the static query graph can read some in in-place.
|
||||||
tbb::parallel_sort(contracted_edge_list->begin(), contracted_edge_list->end());
|
tbb::parallel_sort(contracted_edge_list);
|
||||||
const unsigned contracted_edge_count = contracted_edge_list->size();
|
const unsigned contracted_edge_count = contracted_edge_list.size();
|
||||||
SimpleLogger().Write() << "Serializing compacted graph of " << contracted_edge_count
|
SimpleLogger().Write() << "Serializing compacted graph of " << contracted_edge_count
|
||||||
<< " edges";
|
<< " edges";
|
||||||
|
|
||||||
@ -237,7 +241,7 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
|||||||
const unsigned max_used_node_id = [&contracted_edge_list]
|
const unsigned max_used_node_id = [&contracted_edge_list]
|
||||||
{
|
{
|
||||||
unsigned tmp_max = 0;
|
unsigned tmp_max = 0;
|
||||||
for (const QueryEdge &edge : *contracted_edge_list)
|
for (const QueryEdge &edge : contracted_edge_list)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(SPECIAL_NODEID != edge.source);
|
BOOST_ASSERT(SPECIAL_NODEID != edge.source);
|
||||||
BOOST_ASSERT(SPECIAL_NODEID != edge.target);
|
BOOST_ASSERT(SPECIAL_NODEID != edge.target);
|
||||||
@ -247,8 +251,8 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
|||||||
return tmp_max;
|
return tmp_max;
|
||||||
}();
|
}();
|
||||||
|
|
||||||
SimpleLogger().Write(logDEBUG) << "input graph has " << (max_node_id+1) << " nodes";
|
SimpleLogger().Write(logDEBUG) << "input graph has " << (max_node_id + 1) << " nodes";
|
||||||
SimpleLogger().Write(logDEBUG) << "contracted graph has " << (max_used_node_id+1) << " nodes";
|
SimpleLogger().Write(logDEBUG) << "contracted graph has " << (max_used_node_id + 1) << " nodes";
|
||||||
|
|
||||||
std::vector<StaticGraph<EdgeData>::NodeArrayEntry> node_array;
|
std::vector<StaticGraph<EdgeData>::NodeArrayEntry> node_array;
|
||||||
// make sure we have at least one sentinel
|
// make sure we have at least one sentinel
|
||||||
@ -260,10 +264,10 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
|||||||
StaticGraph<EdgeData>::EdgeIterator last_edge;
|
StaticGraph<EdgeData>::EdgeIterator last_edge;
|
||||||
|
|
||||||
// initializing 'first_edge'-field of nodes:
|
// initializing 'first_edge'-field of nodes:
|
||||||
for (const auto node : osrm::irange(0u, max_used_node_id+1))
|
for (const auto node : osrm::irange(0u, max_used_node_id + 1))
|
||||||
{
|
{
|
||||||
last_edge = edge;
|
last_edge = edge;
|
||||||
while ((edge < contracted_edge_count) && ((*contracted_edge_list)[edge].source == node))
|
while ((edge < contracted_edge_count) && (contracted_edge_list[edge].source == node))
|
||||||
{
|
{
|
||||||
++edge;
|
++edge;
|
||||||
}
|
}
|
||||||
@ -271,7 +275,8 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
|||||||
position += edge - last_edge; // remove
|
position += edge - last_edge; // remove
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto sentinel_counter : osrm::irange<unsigned>(max_used_node_id+1, node_array.size()))
|
for (const auto sentinel_counter :
|
||||||
|
osrm::irange<unsigned>(max_used_node_id + 1, node_array.size()))
|
||||||
{
|
{
|
||||||
// sentinel element, guarded against underflow
|
// sentinel element, guarded against underflow
|
||||||
node_array[sentinel_counter].first_edge = contracted_edge_count;
|
node_array[sentinel_counter].first_edge = contracted_edge_count;
|
||||||
@ -298,12 +303,12 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
|||||||
int number_of_used_edges = 0;
|
int number_of_used_edges = 0;
|
||||||
|
|
||||||
StaticGraph<EdgeData>::EdgeArrayEntry current_edge;
|
StaticGraph<EdgeData>::EdgeArrayEntry current_edge;
|
||||||
for (const auto edge : osrm::irange<std::size_t>(0, contracted_edge_list->size()))
|
for (const auto edge : osrm::irange<std::size_t>(0, contracted_edge_list.size()))
|
||||||
{
|
{
|
||||||
// no eigen loops
|
// no eigen loops
|
||||||
BOOST_ASSERT((*contracted_edge_list)[edge].source != (*contracted_edge_list)[edge].target);
|
BOOST_ASSERT(contracted_edge_list[edge].source != contracted_edge_list[edge].target);
|
||||||
current_edge.target = (*contracted_edge_list)[edge].target;
|
current_edge.target = contracted_edge_list[edge].target;
|
||||||
current_edge.data = (*contracted_edge_list)[edge].data;
|
current_edge.data = contracted_edge_list[edge].data;
|
||||||
|
|
||||||
// every target needs to be valid
|
// every target needs to be valid
|
||||||
BOOST_ASSERT(current_edge.target <= max_used_node_id);
|
BOOST_ASSERT(current_edge.target <= max_used_node_id);
|
||||||
@ -311,12 +316,12 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
|||||||
if (current_edge.data.distance <= 0)
|
if (current_edge.data.distance <= 0)
|
||||||
{
|
{
|
||||||
SimpleLogger().Write(logWARNING) << "Edge: " << edge
|
SimpleLogger().Write(logWARNING) << "Edge: " << edge
|
||||||
<< ",source: " << (*contracted_edge_list)[edge].source
|
<< ",source: " << contracted_edge_list[edge].source
|
||||||
<< ", target: " << (*contracted_edge_list)[edge].target
|
<< ", target: " << contracted_edge_list[edge].target
|
||||||
<< ", dist: " << current_edge.data.distance;
|
<< ", dist: " << current_edge.data.distance;
|
||||||
|
|
||||||
SimpleLogger().Write(logWARNING) << "Failed at adjacency list of node "
|
SimpleLogger().Write(logWARNING) << "Failed at adjacency list of node "
|
||||||
<< (*contracted_edge_list)[edge].source << "/"
|
<< contracted_edge_list[edge].source << "/"
|
||||||
<< node_array.size() - 1;
|
<< node_array.size() - 1;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -330,7 +335,7 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
|||||||
return number_of_used_edges;
|
return number_of_used_edges;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Prepare::CalculateEdgeChecksum(std::unique_ptr<std::vector<EdgeBasedNode>> node_based_edge_list)
|
unsigned Prepare::CalculateEdgeChecksum(const std::vector<EdgeBasedNode> &node_based_edge_list)
|
||||||
{
|
{
|
||||||
RangebasedCRC32 crc32;
|
RangebasedCRC32 crc32;
|
||||||
if (crc32.using_hardware())
|
if (crc32.using_hardware())
|
||||||
@ -342,7 +347,7 @@ unsigned Prepare::CalculateEdgeChecksum(std::unique_ptr<std::vector<EdgeBasedNod
|
|||||||
SimpleLogger().Write() << "using software based CRC32 computation";
|
SimpleLogger().Write() << "using software based CRC32 computation";
|
||||||
}
|
}
|
||||||
|
|
||||||
const unsigned crc32_value = crc32(*node_based_edge_list);
|
const unsigned crc32_value = crc32(node_based_edge_list);
|
||||||
SimpleLogger().Write() << "CRC32: " << crc32_value;
|
SimpleLogger().Write() << "CRC32: " << crc32_value;
|
||||||
|
|
||||||
return crc32_value;
|
return crc32_value;
|
||||||
@ -352,8 +357,7 @@ unsigned Prepare::CalculateEdgeChecksum(std::unique_ptr<std::vector<EdgeBasedNod
|
|||||||
\brief Setups scripting environment (lua-scripting)
|
\brief Setups scripting environment (lua-scripting)
|
||||||
Also initializes speed profile.
|
Also initializes speed profile.
|
||||||
*/
|
*/
|
||||||
void Prepare::SetupScriptingEnvironment(
|
void Prepare::SetupScriptingEnvironment(lua_State *lua_state, SpeedProfileProperties &speed_profile)
|
||||||
lua_State *lua_state, SpeedProfileProperties &speed_profile)
|
|
||||||
{
|
{
|
||||||
// open utility libraries string library;
|
// open utility libraries string library;
|
||||||
luaL_openlibs(lua_state);
|
luaL_openlibs(lua_state);
|
||||||
@ -395,7 +399,8 @@ void Prepare::SetupScriptingEnvironment(
|
|||||||
*/
|
*/
|
||||||
std::shared_ptr<RestrictionMap> Prepare::LoadRestrictionMap()
|
std::shared_ptr<RestrictionMap> Prepare::LoadRestrictionMap()
|
||||||
{
|
{
|
||||||
boost::filesystem::ifstream input_stream(config.restrictions_path, std::ios::in | std::ios::binary);
|
boost::filesystem::ifstream input_stream(config.restrictions_path,
|
||||||
|
std::ios::in | std::ios::binary);
|
||||||
|
|
||||||
std::vector<TurnRestriction> restriction_list;
|
std::vector<TurnRestriction> restriction_list;
|
||||||
loadRestrictionsFromFile(input_stream, restriction_list);
|
loadRestrictionsFromFile(input_stream, restriction_list);
|
||||||
@ -411,17 +416,17 @@ std::shared_ptr<RestrictionMap> Prepare::LoadRestrictionMap()
|
|||||||
std::shared_ptr<NodeBasedDynamicGraph>
|
std::shared_ptr<NodeBasedDynamicGraph>
|
||||||
Prepare::LoadNodeBasedGraph(std::unordered_set<NodeID> &barrier_nodes,
|
Prepare::LoadNodeBasedGraph(std::unordered_set<NodeID> &barrier_nodes,
|
||||||
std::unordered_set<NodeID> &traffic_lights,
|
std::unordered_set<NodeID> &traffic_lights,
|
||||||
std::vector<QueryNode>& internal_to_external_node_map)
|
std::vector<QueryNode> &internal_to_external_node_map)
|
||||||
{
|
{
|
||||||
std::vector<NodeBasedEdge> edge_list;
|
std::vector<NodeBasedEdge> edge_list;
|
||||||
|
|
||||||
boost::filesystem::ifstream input_stream(config.osrm_input_path, std::ios::in | std::ios::binary);
|
boost::filesystem::ifstream input_stream(config.osrm_input_path,
|
||||||
|
std::ios::in | std::ios::binary);
|
||||||
|
|
||||||
std::vector<NodeID> barrier_list;
|
std::vector<NodeID> barrier_list;
|
||||||
std::vector<NodeID> traffic_light_list;
|
std::vector<NodeID> traffic_light_list;
|
||||||
NodeID number_of_node_based_nodes = loadNodesFromFile(input_stream,
|
NodeID number_of_node_based_nodes = loadNodesFromFile(
|
||||||
barrier_list, traffic_light_list,
|
input_stream, barrier_list, traffic_light_list, internal_to_external_node_map);
|
||||||
internal_to_external_node_map);
|
|
||||||
|
|
||||||
SimpleLogger().Write() << " - " << barrier_list.size() << " bollard nodes, "
|
SimpleLogger().Write() << " - " << barrier_list.size() << " bollard nodes, "
|
||||||
<< traffic_light_list.size() << " traffic lights";
|
<< traffic_light_list.size() << " traffic lights";
|
||||||
@ -446,7 +451,6 @@ Prepare::LoadNodeBasedGraph(std::unordered_set<NodeID> &barrier_nodes,
|
|||||||
return NodeBasedDynamicGraphFromEdges(number_of_node_based_nodes, edge_list);
|
return NodeBasedDynamicGraphFromEdges(number_of_node_based_nodes, edge_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Building an edge-expanded graph from node-based input and turn restrictions
|
\brief Building an edge-expanded graph from node-based input and turn restrictions
|
||||||
*/
|
*/
|
||||||
@ -465,20 +469,18 @@ Prepare::BuildEdgeExpandedGraph(std::vector<QueryNode> &internal_to_external_nod
|
|||||||
std::unordered_set<NodeID> traffic_lights;
|
std::unordered_set<NodeID> traffic_lights;
|
||||||
|
|
||||||
auto restriction_map = LoadRestrictionMap();
|
auto restriction_map = LoadRestrictionMap();
|
||||||
auto node_based_graph = LoadNodeBasedGraph(barrier_nodes, traffic_lights, internal_to_external_node_map);
|
auto node_based_graph =
|
||||||
|
LoadNodeBasedGraph(barrier_nodes, traffic_lights, internal_to_external_node_map);
|
||||||
|
|
||||||
CompressedEdgeContainer compressed_edge_container;
|
CompressedEdgeContainer compressed_edge_container;
|
||||||
GraphCompressor graph_compressor(speed_profile);
|
GraphCompressor graph_compressor(speed_profile);
|
||||||
graph_compressor.Compress(barrier_nodes, traffic_lights, *restriction_map, *node_based_graph, compressed_edge_container);
|
graph_compressor.Compress(barrier_nodes, traffic_lights, *restriction_map, *node_based_graph,
|
||||||
|
compressed_edge_container);
|
||||||
|
|
||||||
EdgeBasedGraphFactory edge_based_graph_factory(node_based_graph,
|
EdgeBasedGraphFactory edge_based_graph_factory(
|
||||||
compressed_edge_container,
|
node_based_graph, compressed_edge_container, barrier_nodes, traffic_lights,
|
||||||
barrier_nodes,
|
|
||||||
traffic_lights,
|
|
||||||
std::const_pointer_cast<RestrictionMap const>(restriction_map),
|
std::const_pointer_cast<RestrictionMap const>(restriction_map),
|
||||||
internal_to_external_node_map,
|
internal_to_external_node_map, speed_profile);
|
||||||
speed_profile);
|
|
||||||
|
|
||||||
compressed_edge_container.SerializeInternalVector(config.geometry_output_path);
|
compressed_edge_container.SerializeInternalVector(config.geometry_output_path);
|
||||||
|
|
||||||
@ -497,9 +499,9 @@ Prepare::BuildEdgeExpandedGraph(std::vector<QueryNode> &internal_to_external_nod
|
|||||||
\brief Build contracted graph.
|
\brief Build contracted graph.
|
||||||
*/
|
*/
|
||||||
void Prepare::ContractGraph(const unsigned max_edge_id,
|
void Prepare::ContractGraph(const unsigned max_edge_id,
|
||||||
DeallocatingVector<EdgeBasedEdge>& edge_based_edge_list,
|
DeallocatingVector<EdgeBasedEdge> &edge_based_edge_list,
|
||||||
DeallocatingVector<QueryEdge>& contracted_edge_list,
|
DeallocatingVector<QueryEdge> &contracted_edge_list,
|
||||||
std::vector<bool>& is_core_node)
|
std::vector<bool> &is_core_node)
|
||||||
{
|
{
|
||||||
Contractor contractor(max_edge_id + 1, edge_based_edge_list);
|
Contractor contractor(max_edge_id + 1, edge_based_edge_list);
|
||||||
contractor.Run(config.core_factor);
|
contractor.Run(config.core_factor);
|
||||||
@ -510,14 +512,14 @@ void Prepare::ContractGraph(const unsigned max_edge_id,
|
|||||||
/**
|
/**
|
||||||
\brief Writing info on original (node-based) nodes
|
\brief Writing info on original (node-based) nodes
|
||||||
*/
|
*/
|
||||||
void Prepare::WriteNodeMapping(std::unique_ptr<std::vector<QueryNode>> internal_to_external_node_map)
|
void Prepare::WriteNodeMapping(const std::vector<QueryNode> &internal_to_external_node_map)
|
||||||
{
|
{
|
||||||
boost::filesystem::ofstream node_stream(config.node_output_path, std::ios::binary);
|
boost::filesystem::ofstream node_stream(config.node_output_path, std::ios::binary);
|
||||||
const unsigned size_of_mapping = internal_to_external_node_map->size();
|
const unsigned size_of_mapping = internal_to_external_node_map.size();
|
||||||
node_stream.write((char *)&size_of_mapping, sizeof(unsigned));
|
node_stream.write((char *)&size_of_mapping, sizeof(unsigned));
|
||||||
if (size_of_mapping > 0)
|
if (size_of_mapping > 0)
|
||||||
{
|
{
|
||||||
node_stream.write((char *) internal_to_external_node_map->data(),
|
node_stream.write((char *)internal_to_external_node_map.data(),
|
||||||
size_of_mapping * sizeof(QueryNode));
|
size_of_mapping * sizeof(QueryNode));
|
||||||
}
|
}
|
||||||
node_stream.close();
|
node_stream.close();
|
||||||
@ -528,8 +530,10 @@ void Prepare::WriteNodeMapping(std::unique_ptr<std::vector<QueryNode>> internal_
|
|||||||
|
|
||||||
Saves tree into '.ramIndex' and leaves into '.fileIndex'.
|
Saves tree into '.ramIndex' and leaves into '.fileIndex'.
|
||||||
*/
|
*/
|
||||||
void Prepare::BuildRTree(const std::vector<EdgeBasedNode> &node_based_edge_list, const std::vector<QueryNode>& internal_to_external_node_map)
|
void Prepare::BuildRTree(const std::vector<EdgeBasedNode> &node_based_edge_list,
|
||||||
|
const std::vector<QueryNode> &internal_to_external_node_map)
|
||||||
{
|
{
|
||||||
StaticRTree<EdgeBasedNode>(node_based_edge_list, config.rtree_nodes_output_path.c_str(),
|
StaticRTree<EdgeBasedNode>(node_based_edge_list, config.rtree_nodes_output_path.c_str(),
|
||||||
config.rtree_leafs_output_path.c_str(), internal_to_external_node_map);
|
config.rtree_leafs_output_path.c_str(),
|
||||||
|
internal_to_external_node_map);
|
||||||
}
|
}
|
||||||
|
@ -58,30 +58,32 @@ class Prepare
|
|||||||
int Run();
|
int Run();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void SetupScriptingEnvironment(lua_State *myLuaState,
|
void SetupScriptingEnvironment(lua_State *myLuaState, SpeedProfileProperties &speed_profile);
|
||||||
SpeedProfileProperties &speed_profile);
|
unsigned CalculateEdgeChecksum(const std::vector<EdgeBasedNode> &node_based_edge_list);
|
||||||
unsigned CalculateEdgeChecksum(std::unique_ptr<std::vector<EdgeBasedNode>> node_based_edge_list);
|
|
||||||
void ContractGraph(const unsigned max_edge_id,
|
void ContractGraph(const unsigned max_edge_id,
|
||||||
DeallocatingVector<EdgeBasedEdge>& edge_based_edge_list,
|
DeallocatingVector<EdgeBasedEdge> &edge_based_edge_list,
|
||||||
DeallocatingVector<QueryEdge>& contracted_edge_list,
|
DeallocatingVector<QueryEdge> &contracted_edge_list,
|
||||||
std::vector<bool>& is_core_node);
|
std::vector<bool> &is_core_node);
|
||||||
void WriteCoreNodeMarker(std::vector<bool>&& is_core_node) const;
|
void WriteCoreNodeMarker(std::vector<bool> &&is_core_node) const;
|
||||||
std::size_t WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
std::size_t WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||||
std::unique_ptr<std::vector<EdgeBasedNode>> node_based_edge_list,
|
const std::vector<EdgeBasedNode> &node_based_edge_list,
|
||||||
std::unique_ptr<DeallocatingVector<QueryEdge>> contracted_edge_list);
|
const DeallocatingVector<QueryEdge> &contracted_edge_list);
|
||||||
std::shared_ptr<RestrictionMap> LoadRestrictionMap();
|
std::shared_ptr<RestrictionMap> LoadRestrictionMap();
|
||||||
std::shared_ptr<NodeBasedDynamicGraph>
|
std::shared_ptr<NodeBasedDynamicGraph>
|
||||||
LoadNodeBasedGraph(std::unordered_set<NodeID> &barrier_nodes,
|
LoadNodeBasedGraph(std::unordered_set<NodeID> &barrier_nodes,
|
||||||
std::unordered_set<NodeID> &traffic_lights,
|
std::unordered_set<NodeID> &traffic_lights,
|
||||||
std::vector<QueryNode>& internal_to_external_node_map);
|
std::vector<QueryNode> &internal_to_external_node_map);
|
||||||
std::pair<std::size_t, std::size_t>
|
std::pair<std::size_t, std::size_t>
|
||||||
BuildEdgeExpandedGraph(std::vector<QueryNode> &internal_to_external_node_map,
|
BuildEdgeExpandedGraph(std::vector<QueryNode> &internal_to_external_node_map,
|
||||||
std::vector<EdgeBasedNode> &node_based_edge_list,
|
std::vector<EdgeBasedNode> &node_based_edge_list,
|
||||||
DeallocatingVector<EdgeBasedEdge> &edge_based_edge_list);
|
DeallocatingVector<EdgeBasedEdge> &edge_based_edge_list);
|
||||||
void WriteNodeMapping(std::unique_ptr<std::vector<QueryNode>> internal_to_external_node_map);
|
void WriteNodeMapping(const std::vector<QueryNode> &internal_to_external_node_map);
|
||||||
void FindComponents(unsigned max_edge_id, const DeallocatingVector<EdgeBasedEdge>& edges, std::vector<EdgeBasedNode>& nodes) const;
|
void FindComponents(unsigned max_edge_id,
|
||||||
|
const DeallocatingVector<EdgeBasedEdge> &edges,
|
||||||
|
std::vector<EdgeBasedNode> &nodes) const;
|
||||||
void BuildRTree(const std::vector<EdgeBasedNode> &node_based_edge_list,
|
void BuildRTree(const std::vector<EdgeBasedNode> &node_based_edge_list,
|
||||||
const std::vector<QueryNode> &internal_to_external_node_map);
|
const std::vector<QueryNode> &internal_to_external_node_map);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ContractorConfig config;
|
ContractorConfig config;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user