diff --git a/include/engine/datafacade/contiguous_internalmem_datafacade.hpp b/include/engine/datafacade/contiguous_internalmem_datafacade.hpp index c258bb400..35d2ca79d 100644 --- a/include/engine/datafacade/contiguous_internalmem_datafacade.hpp +++ b/include/engine/datafacade/contiguous_internalmem_datafacade.hpp @@ -14,6 +14,7 @@ #include "extractor/datasources.hpp" #include "extractor/guidance/turn_instruction.hpp" #include "extractor/guidance/turn_lane_types.hpp" +#include "extractor/intersection_bearings_container.hpp" #include "extractor/node_data_container.hpp" #include "extractor/packed_osm_ids.hpp" #include "extractor/profile_properties.hpp" @@ -218,7 +219,6 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade unsigned m_check_sum; util::vector_view m_coordinate_list; extractor::PackedOSMIDsView m_osmnodeid_list; - util::NameTable m_names_table; util::vector_view m_lane_description_offsets; util::vector_view m_lane_description_masks; util::vector_view m_turn_weight_penalties; @@ -236,19 +236,12 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade std::unique_ptr m_geospatial_query; boost::filesystem::path file_index_path; - util::NameTable m_name_table; - // bearing classes by node based node - util::vector_view m_bearing_class_id_table; - // entry class IDs - util::vector_view m_entry_class_id_list; + extractor::IntersectionBearingsView intersection_bearings_view; + util::NameTable m_name_table; // the look-up table for entry classes. An entry class lists the possibility of entry for all // available turns. Such a class id is stored with every edge. util::vector_view m_entry_class_table; - // the look-up table for distinct bearing classes. A bearing class lists the available bearings - // at an intersection - std::shared_ptr> m_bearing_ranges_table; - util::vector_view m_bearing_values_table; // allocator that keeps the allocation data std::shared_ptr allocator; @@ -502,15 +495,13 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade { auto bearing_class_id_ptr = data_layout.GetBlockPtr( memory_block, storage::DataLayout::BEARING_CLASSID); - typename util::vector_view bearing_class_id_table( + util::vector_view bearing_class_id( bearing_class_id_ptr, data_layout.num_entries[storage::DataLayout::BEARING_CLASSID]); - m_bearing_class_id_table = std::move(bearing_class_id_table); - auto bearing_class_ptr = data_layout.GetBlockPtr( + auto bearing_values_ptr = data_layout.GetBlockPtr( memory_block, storage::DataLayout::BEARING_VALUES); - typename util::vector_view bearing_class_table( - bearing_class_ptr, data_layout.num_entries[storage::DataLayout::BEARING_VALUES]); - m_bearing_values_table = std::move(bearing_class_table); + util::vector_view bearing_values( + bearing_values_ptr, data_layout.num_entries[storage::DataLayout::BEARING_VALUES]); auto offsets_ptr = data_layout.GetBlockPtr(memory_block, storage::DataLayout::BEARING_OFFSETS); @@ -521,12 +512,15 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade util::vector_view bearing_blocks( blocks_ptr, data_layout.num_entries[storage::DataLayout::BEARING_BLOCKS]); - m_bearing_ranges_table = std::make_unique>( - bearing_offsets, bearing_blocks, static_cast(m_bearing_values_table.size())); + util::RangeTable<16, storage::Ownership::View> bearing_range_table( + bearing_offsets, bearing_blocks, static_cast(bearing_values.size())); + + intersection_bearings_view = extractor::IntersectionBearingsView{ + std::move(bearing_values), std::move(bearing_class_id), std::move(bearing_range_table)}; auto entry_class_ptr = data_layout.GetBlockPtr( memory_block, storage::DataLayout::ENTRY_CLASS); - typename util::vector_view entry_class_table( + util::vector_view entry_class_table( entry_class_ptr, data_layout.num_entries[storage::DataLayout::ENTRY_CLASS]); m_entry_class_table = std::move(entry_class_table); } @@ -843,27 +837,9 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade return m_profile_properties->GetWeightMultiplier(); } - BearingClassID GetBearingClassID(const NodeID id) const override final + util::guidance::BearingClass GetBearingClass(const NodeID node) const override final { - return m_bearing_class_id_table.at(id); - } - - util::guidance::BearingClass - GetBearingClass(const BearingClassID bearing_class_id) const override final - { - BOOST_ASSERT(bearing_class_id != INVALID_BEARING_CLASSID); - auto range = m_bearing_ranges_table->GetRange(bearing_class_id); - util::guidance::BearingClass result; - for (auto itr = m_bearing_values_table.begin() + range.front(); - itr != m_bearing_values_table.begin() + range.back() + 1; - ++itr) - result.add(*itr); - return result; - } - - EntryClassID GetEntryClassID(const EdgeID eid) const override final - { - return turn_data.GetEntryClassID(eid); + return intersection_bearings_view.GetBearingClass(node); } util::guidance::TurnBearing PreTurnBearing(const EdgeID eid) const override final @@ -875,8 +851,9 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade return turn_data.GetPostTurnBearing(eid); } - util::guidance::EntryClass GetEntryClass(const EntryClassID entry_class_id) const override final + util::guidance::EntryClass GetEntryClass(const EdgeID turn_id) const override final { + auto entry_class_id = turn_data.GetEntryClassID(turn_id); return m_entry_class_table.at(entry_class_id); } diff --git a/include/engine/datafacade/datafacade_base.hpp b/include/engine/datafacade/datafacade_base.hpp index 91fb88974..4d29ec4af 100644 --- a/include/engine/datafacade/datafacade_base.hpp +++ b/include/engine/datafacade/datafacade_base.hpp @@ -170,17 +170,12 @@ class BaseDataFacade virtual double GetWeightMultiplier() const = 0; - virtual BearingClassID GetBearingClassID(const NodeID id) const = 0; - virtual util::guidance::TurnBearing PreTurnBearing(const EdgeID eid) const = 0; virtual util::guidance::TurnBearing PostTurnBearing(const EdgeID eid) const = 0; - virtual util::guidance::BearingClass - GetBearingClass(const BearingClassID bearing_class_id) const = 0; + virtual util::guidance::BearingClass GetBearingClass(const NodeID node) const = 0; - virtual EntryClassID GetEntryClassID(const EdgeID eid) const = 0; - - virtual util::guidance::EntryClass GetEntryClass(const EntryClassID entry_class_id) const = 0; + virtual util::guidance::EntryClass GetEntryClass(const EdgeID turn_id) const = 0; virtual bool IsLeftHandDriving() const = 0; }; diff --git a/include/engine/guidance/assemble_steps.hpp b/include/engine/guidance/assemble_steps.hpp index 66826e5c8..152f1eb7b 100644 --- a/include/engine/guidance/assemble_steps.hpp +++ b/include/engine/guidance/assemble_steps.hpp @@ -144,9 +144,7 @@ inline std::vector assembleSteps(const datafacade::BaseDataFacade &fa // extract bearings bearings = std::make_pair( path_point.pre_turn_bearing.Get(), path_point.post_turn_bearing.Get()); - const auto entry_class = facade.GetEntryClass(path_point.entry_classid); - const auto bearing_class = - facade.GetBearingClass(facade.GetBearingClassID(path_point.turn_via_node)); + const auto bearing_class = facade.GetBearingClass(path_point.turn_via_node); auto bearing_data = bearing_class.getAvailableBearings(); intersection.in = bearing_class.findMatchingBearing(bearings.first); intersection.out = bearing_class.findMatchingBearing(bearings.second); @@ -174,7 +172,7 @@ inline std::vector assembleSteps(const datafacade::BaseDataFacade &fa intersection.entry.clear(); for (auto idx : util::irange(0, intersection.bearings.size())) { - intersection.entry.push_back(entry_class.allowsEntry(idx)); + intersection.entry.push_back(path_point.entry_class.allowsEntry(idx)); } std::int16_t bearing_in_driving_direction = util::bearing::reverse(std::round(bearings.first)); diff --git a/include/engine/internal_route_result.hpp b/include/engine/internal_route_result.hpp index d7d986e18..ef8ed9b80 100644 --- a/include/engine/internal_route_result.hpp +++ b/include/engine/internal_route_result.hpp @@ -5,6 +5,7 @@ #include "extractor/travel_mode.hpp" #include "engine/phantom_node.hpp" #include "osrm/coordinate.hpp" +#include "util/guidance/entry_class.hpp" #include "util/guidance/turn_bearing.hpp" #include "util/guidance/turn_lanes.hpp" #include "util/typedefs.hpp" @@ -33,7 +34,7 @@ struct PathData // travel mode of the street that leads to the turn extractor::TravelMode travel_mode : 4; // entry class of the turn, indicating possibility of turns - EntryClassID entry_classid; + util::guidance::EntryClass entry_class; // Source of the speed value on this road segment DatasourceID datasource_id; diff --git a/include/engine/routing_algorithms/routing_base.hpp b/include/engine/routing_algorithms/routing_base.hpp index 38cf95d96..5dad4b458 100644 --- a/include/engine/routing_algorithms/routing_base.hpp +++ b/include/engine/routing_algorithms/routing_base.hpp @@ -158,7 +158,7 @@ void annotatePath(const FacadeT &facade, extractor::guidance::TurnInstruction::NO_TURN(), {{0, INVALID_LANEID}, INVALID_LANE_DESCRIPTIONID}, travel_mode, - INVALID_ENTRY_CLASSID, + {}, datasource_vector[segment_idx], util::guidance::TurnBearing(0), util::guidance::TurnBearing(0)}); @@ -167,7 +167,7 @@ void annotatePath(const FacadeT &facade, if (facade.HasLaneData(turn_id)) unpacked_path.back().lane_data = facade.GetLaneData(turn_id); - unpacked_path.back().entry_classid = facade.GetEntryClassID(turn_id); + unpacked_path.back().entry_class = facade.GetEntryClass(turn_id); unpacked_path.back().turn_instruction = turn_instruction; unpacked_path.back().duration_until_turn += facade.GetDurationPenaltyForEdgeID(turn_id); unpacked_path.back().weight_until_turn += facade.GetWeightPenaltyForEdgeID(turn_id); @@ -233,7 +233,7 @@ void annotatePath(const FacadeT &facade, extractor::guidance::TurnInstruction::NO_TURN(), {{0, INVALID_LANEID}, INVALID_LANE_DESCRIPTIONID}, facade.GetTravelMode(target_node_id), - INVALID_ENTRY_CLASSID, + {}, datasource_vector[segment_idx], util::guidance::TurnBearing(0), util::guidance::TurnBearing(0)}); diff --git a/include/extractor/files.hpp b/include/extractor/files.hpp index 6042e455f..b5e909685 100644 --- a/include/extractor/files.hpp +++ b/include/extractor/files.hpp @@ -4,12 +4,15 @@ #include "extractor/edge_based_edge.hpp" #include "extractor/guidance/turn_lane_types.hpp" #include "extractor/node_data_container.hpp" +#include "extractor/profile_properties.hpp" #include "extractor/serialization.hpp" #include "extractor/turn_data_container.hpp" -#include "extractor/profile_properties.hpp" #include "util/coordinate.hpp" +#include "util/guidance/bearing_class.hpp" +#include "util/guidance/entry_class.hpp" #include "util/packed_vector.hpp" +#include "util/range_table.hpp" #include "util/serialization.hpp" #include @@ -21,8 +24,41 @@ namespace extractor namespace files { +// writes the .osrm.icd file +template +inline void writeIntersections(const boost::filesystem::path &path, + const IntersectionBearingsT &intersection_bearings, + const EntryClassVectorT &entry_classes) +{ + static_assert(std::is_same::value || + std::is_same::value, + ""); + + storage::io::FileWriter writer(path, storage::io::FileWriter::GenerateFingerprint); + + serialization::write(writer, intersection_bearings); + storage::serialization::write(writer, entry_classes); +} + +// read the .osrm.icd file +template +inline void readIntersections(const boost::filesystem::path &path, + IntersectionBearingsT &intersection_bearings, + EntryClassVectorT &entry_classes) +{ + static_assert(std::is_same::value || + std::is_same::value, + ""); + + storage::io::FileReader reader(path, storage::io::FileReader::VerifyFingerprint); + + serialization::read(reader, intersection_bearings); + storage::serialization::read(reader, entry_classes); +} + // reads .osrm.properties -inline void readProfileProperties(const boost::filesystem::path &path, ProfileProperties &properties) +inline void readProfileProperties(const boost::filesystem::path &path, + ProfileProperties &properties) { const auto fingerprint = storage::io::FileReader::VerifyFingerprint; storage::io::FileReader reader{path, fingerprint}; @@ -32,7 +68,7 @@ inline void readProfileProperties(const boost::filesystem::path &path, ProfilePr // writes .osrm.properties inline void writeProfileProperties(const boost::filesystem::path &path, - const ProfileProperties &properties) + const ProfileProperties &properties) { const auto fingerprint = storage::io::FileWriter::GenerateFingerprint; storage::io::FileWriter writer{path, fingerprint}; diff --git a/include/extractor/guidance/turn_lane_types.hpp b/include/extractor/guidance/turn_lane_types.hpp index 4d083f81e..7c5404164 100644 --- a/include/extractor/guidance/turn_lane_types.hpp +++ b/include/extractor/guidance/turn_lane_types.hpp @@ -4,10 +4,10 @@ #include #include #include +#include //partial_sum #include #include #include -#include //partial_sum #include diff --git a/include/extractor/intersection_bearings_container.hpp b/include/extractor/intersection_bearings_container.hpp new file mode 100644 index 000000000..8e25a0711 --- /dev/null +++ b/include/extractor/intersection_bearings_container.hpp @@ -0,0 +1,105 @@ +#ifndef OSRM_EXTRACTOR_BEARING_CONTAINER_HPP +#define OSRM_EXTRACTOR_BEARING_CONTAINER_HPP + +#include "storage/shared_memory_ownership.hpp" + +#include "util/guidance/bearing_class.hpp" +#include "util/range_table.hpp" +#include "util/vector_view.hpp" + +#include + +namespace osrm +{ +namespace extractor +{ +namespace detail +{ +template class IntersectionBearingsContainer; +} + +namespace serialization +{ +template +void read(storage::io::FileReader &reader, + detail::IntersectionBearingsContainer &turn_data); + +template +void write(storage::io::FileWriter &writer, + const detail::IntersectionBearingsContainer &turn_data); +} + +namespace detail +{ +template class IntersectionBearingsContainer +{ + template using Vector = util::ViewOrVector; + template using RangeTable = util::RangeTable; + + public: + IntersectionBearingsContainer() = default; + IntersectionBearingsContainer(IntersectionBearingsContainer &&) = default; + IntersectionBearingsContainer(const IntersectionBearingsContainer &) = default; + IntersectionBearingsContainer &operator=(IntersectionBearingsContainer &&) = default; + IntersectionBearingsContainer &operator=(const IntersectionBearingsContainer &) = default; + + IntersectionBearingsContainer(std::vector node_to_class_id_, + const std::vector &bearing_classes) + : node_to_class_id(std::move(node_to_class_id_)) + { + std::vector bearing_counts(bearing_classes.size()); + std::transform(bearing_classes.begin(), + bearing_classes.end(), + bearing_counts.begin(), + [](const auto &bearings) { return bearings.getAvailableBearings().size(); }); + auto total_bearings = std::accumulate(bearing_counts.begin(), bearing_counts.end(), 0); + class_id_to_ranges_table = RangeTable<16>{bearing_counts}; + + values.reserve(total_bearings); + for (const auto &bearing_class : bearing_classes) + { + const auto &bearings = bearing_class.getAvailableBearings(); + values.insert(values.end(), bearings.begin(), bearings.end()); + } + } + + IntersectionBearingsContainer(Vector values_, + Vector node_to_class_id_, + RangeTable<16> class_id_to_ranges_table_) + : values(std::move(values_)), node_to_class_id(std::move(node_to_class_id_)), + class_id_to_ranges_table(std::move(class_id_to_ranges_table_)) + { + } + + // Returns the bearing class for an intersection node + util::guidance::BearingClass GetBearingClass(const NodeID node) const + { + auto class_id = node_to_class_id[node]; + auto range = class_id_to_ranges_table.GetRange(class_id); + util::guidance::BearingClass result; + std::for_each(values.begin() + range.front(), + values.begin() + range.back() + 1, + [&](const DiscreteBearing &bearing) { result.add(bearing); }); + return result; + } + + friend void serialization::read(storage::io::FileReader &reader, + IntersectionBearingsContainer &turn_data_container); + friend void + serialization::write(storage::io::FileWriter &writer, + const IntersectionBearingsContainer &turn_data_container); + + private: + Vector values; + Vector node_to_class_id; + RangeTable<16> class_id_to_ranges_table; +}; +} + +using IntersectionBearingsContainer = + detail::IntersectionBearingsContainer; +using IntersectionBearingsView = detail::IntersectionBearingsContainer; +} +} + +#endif diff --git a/include/extractor/serialization.hpp b/include/extractor/serialization.hpp index 0a726a4ed..cfe1139c3 100644 --- a/include/extractor/serialization.hpp +++ b/include/extractor/serialization.hpp @@ -2,12 +2,13 @@ #define OSRM_EXTRACTOR_IO_HPP #include "extractor/datasources.hpp" +#include "extractor/intersection_bearings_container.hpp" #include "extractor/nbg_to_ebg.hpp" #include "extractor/node_data_container.hpp" +#include "extractor/profile_properties.hpp" #include "extractor/restriction.hpp" #include "extractor/segment_data_container.hpp" #include "extractor/turn_data_container.hpp" -#include "extractor/profile_properties.hpp" #include "storage/io.hpp" #include "storage/serialization.hpp" @@ -21,6 +22,25 @@ namespace extractor namespace serialization { +// read/write for bearing data +template +inline void read(storage::io::FileReader &reader, + detail::IntersectionBearingsContainer &intersection_bearings) +{ + storage::serialization::read(reader, intersection_bearings.values); + storage::serialization::read(reader, intersection_bearings.node_to_class_id); + util::serialization::read(reader, intersection_bearings.class_id_to_ranges_table); +} + +template +inline void write(storage::io::FileWriter &writer, + const detail::IntersectionBearingsContainer &intersection_bearings) +{ + storage::serialization::write(writer, intersection_bearings.values); + storage::serialization::write(writer, intersection_bearings.node_to_class_id); + util::serialization::write(writer, intersection_bearings.class_id_to_ranges_table); +} + // read/write for properties file inline void read(storage::io::FileReader &reader, ProfileProperties &properties) { diff --git a/include/util/concurrent_id_map.hpp b/include/util/concurrent_id_map.hpp index b20e6a8ee..fb12029f7 100644 --- a/include/util/concurrent_id_map.hpp +++ b/include/util/concurrent_id_map.hpp @@ -35,7 +35,7 @@ struct ConcurrentIDMap data = std::move(other.data); } - ConcurrentIDMap& operator=(ConcurrentIDMap &&other) + ConcurrentIDMap &operator=(ConcurrentIDMap &&other) { ScopedWriterLock other_lock{other.mutex}; ScopedWriterLock lock{mutex}; diff --git a/include/util/range_table.hpp b/include/util/range_table.hpp index ef5305c05..33448711a 100644 --- a/include/util/range_table.hpp +++ b/include/util/range_table.hpp @@ -22,11 +22,14 @@ namespace util template class RangeTable; -template -std::ostream &operator<<(std::ostream &out, const RangeTable &table); +namespace serialization +{ +template +void write(storage::io::FileWriter &writer, const util::RangeTable &table); -template -std::istream &operator>>(std::istream &in, RangeTable &table); +template +void read(storage::io::FileReader &reader, util::RangeTable &table); +} /** * Stores adjacent ranges in a compressed format. @@ -45,9 +48,6 @@ template class RangeTable using OffsetContainerT = util::ViewOrVector; using RangeT = range; - friend std::ostream &operator<<<>(std::ostream &out, const RangeTable &table); - friend std::istream &operator>><>(std::istream &in, RangeTable &table); - RangeTable() : sum_lengths(0) {} // for loading from shared memory @@ -141,33 +141,6 @@ template class RangeTable sum_lengths = lengths_prefix_sum; } - void Write(storage::io::FileWriter &filewriter) - { - auto number_of_blocks = diff_blocks.size(); - - filewriter.WriteElementCount64(number_of_blocks); - - filewriter.WriteOne(sum_lengths); - - filewriter.WriteFrom(block_offsets.data(), number_of_blocks); - filewriter.WriteFrom(diff_blocks.data(), number_of_blocks); - } - - void Read(storage::io::FileReader &filereader) - { - auto number_of_blocks = filereader.ReadElementCount64(); - // read total length - filereader.ReadInto(&sum_lengths, 1); - - block_offsets.resize(number_of_blocks); - diff_blocks.resize(number_of_blocks); - - // read block offsets - filereader.ReadInto(block_offsets.data(), number_of_blocks); - // read blocks - filereader.ReadInto(diff_blocks.data(), number_of_blocks); - } - inline RangeT GetRange(const unsigned id) const { BOOST_ASSERT(id < block_offsets.size() + diff_blocks.size() * BLOCK_SIZE); @@ -204,6 +177,11 @@ template class RangeTable return irange(begin_idx, end_idx); } + friend void serialization::write(storage::io::FileWriter &writer, + const RangeTable &table); + friend void serialization::read(storage::io::FileReader &reader, + RangeTable &table); + private: inline unsigned PrefixSumAtIndex(int index, const BlockT &block) const; @@ -227,41 +205,6 @@ unsigned RangeTable::PrefixSumAtIndex(int index, const Bl return sum; } - -template -std::ostream &operator<<(std::ostream &out, const RangeTable &table) -{ - // write number of block - const unsigned number_of_blocks = table.diff_blocks.size(); - out.write((char *)&number_of_blocks, sizeof(unsigned)); - // write total length - out.write((char *)&table.sum_lengths, sizeof(unsigned)); - // write block offsets - out.write((char *)table.block_offsets.data(), sizeof(unsigned) * table.block_offsets.size()); - // write blocks - out.write((char *)table.diff_blocks.data(), BLOCK_SIZE * table.diff_blocks.size()); - - return out; -} - -template -std::istream &operator>>(std::istream &in, RangeTable &table) -{ - // read number of block - unsigned number_of_blocks; - in.read((char *)&number_of_blocks, sizeof(unsigned)); - // read total length - in.read((char *)&table.sum_lengths, sizeof(unsigned)); - - table.block_offsets.resize(number_of_blocks); - table.diff_blocks.resize(number_of_blocks); - - // read block offsets - in.read((char *)table.block_offsets.data(), sizeof(unsigned) * number_of_blocks); - // read blocks - in.read((char *)table.diff_blocks.data(), BLOCK_SIZE * number_of_blocks); - return in; -} } } diff --git a/include/util/serialization.hpp b/include/util/serialization.hpp index 3c9fc62b1..8fd406ded 100644 --- a/include/util/serialization.hpp +++ b/include/util/serialization.hpp @@ -3,6 +3,7 @@ #include "util/dynamic_graph.hpp" #include "util/packed_vector.hpp" +#include "util/range_table.hpp" #include "util/static_graph.hpp" #include "storage/io.hpp" @@ -14,6 +15,22 @@ namespace util { namespace serialization { +template +void write(storage::io::FileWriter &writer, const util::RangeTable &table) +{ + writer.WriteOne(table.sum_lengths); + storage::serialization::write(writer, table.block_offsets); + storage::serialization::write(writer, table.diff_blocks); +} + +template +void read(storage::io::FileReader &reader, util::RangeTable &table) +{ + table.sum_lengths = reader.ReadOne(); + storage::serialization::read(reader, table.block_offsets); + storage::serialization::read(reader, table.diff_blocks); +} + template inline void read(storage::io::FileReader &reader, detail::PackedVector &vec) { diff --git a/src/extractor/edge_based_graph_factory.cpp b/src/extractor/edge_based_graph_factory.cpp index 0dcc227d5..fe0161dc7 100644 --- a/src/extractor/edge_based_graph_factory.cpp +++ b/src/extractor/edge_based_graph_factory.cpp @@ -348,10 +348,8 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges( profile_properties); util::guidance::LaneDataIdMap lane_data_map; - guidance::lanes::TurnLaneHandler turn_lane_handler(*m_node_based_graph, - lane_description_map, - turn_analysis, - lane_data_map); + guidance::lanes::TurnLaneHandler turn_lane_handler( + *m_node_based_graph, lane_description_map, turn_analysis, lane_data_map); bearing_class_by_node_based_node.resize(m_node_based_graph->GetNumberOfNodes(), std::numeric_limits::max()); diff --git a/src/extractor/extractor.cpp b/src/extractor/extractor.cpp index 3553e5811..956cacde6 100644 --- a/src/extractor/extractor.cpp +++ b/src/extractor/extractor.cpp @@ -518,10 +518,15 @@ Extractor::BuildEdgeExpandedGraph(ScriptingEnvironment &scripting_environment, const std::size_t number_of_node_based_nodes = node_based_graph->GetNumberOfNodes(); - WriteIntersectionClassificationData(intersection_class_output_file, - edge_based_graph_factory.GetBearingClassIds(), - edge_based_graph_factory.GetBearingClasses(), - edge_based_graph_factory.GetEntryClasses()); + util::Log() << "Writing Intersection Classification Data"; + TIMER_START(write_intersections); + files::writeIntersections( + intersection_class_output_file, + IntersectionBearingsContainer{edge_based_graph_factory.GetBearingClassIds(), + edge_based_graph_factory.GetBearingClasses()}, + edge_based_graph_factory.GetEntryClasses()); + TIMER_STOP(write_intersections); + util::Log() << "ok, after " << TIMER_SEC(write_intersections) << "s"; return std::make_pair(number_of_node_based_nodes, max_edge_id); } @@ -572,49 +577,6 @@ void Extractor::BuildRTree(std::vector edge_based_node_seg util::Log() << "finished r-tree construction in " << TIMER_SEC(construction) << " seconds"; } -void Extractor::WriteIntersectionClassificationData( - const std::string &output_file_name, - const std::vector &node_based_intersection_classes, - const std::vector &bearing_classes, - const std::vector &entry_classes) const -{ - storage::io::FileWriter writer(output_file_name, storage::io::FileWriter::GenerateFingerprint); - - util::Log() << "Writing Intersection Classification Data"; - TIMER_START(write_edges); - storage::serialization::write(writer, node_based_intersection_classes); - - // create range table for vectors: - std::vector bearing_counts; - bearing_counts.reserve(bearing_classes.size()); - std::uint64_t total_bearings = 0; - for (const auto &bearing_class : bearing_classes) - { - bearing_counts.push_back( - static_cast(bearing_class.getAvailableBearings().size())); - total_bearings += bearing_class.getAvailableBearings().size(); - } - - util::RangeTable<> bearing_class_range_table(bearing_counts); - bearing_class_range_table.Write(writer); - - writer.WriteOne(total_bearings); - - for (const auto &bearing_class : bearing_classes) - { - const auto &bearings = bearing_class.getAvailableBearings(); - writer.WriteFrom(bearings.data(), bearings.size()); - } - - storage::serialization::write(writer, entry_classes); - - TIMER_STOP(write_edges); - util::Log() << "ok, after " << TIMER_SEC(write_edges) << "s for " - << node_based_intersection_classes.size() << " Indices into " - << bearing_classes.size() << " bearing classes and " << entry_classes.size() - << " entry classes and " << total_bearings << " bearing values."; -} - void Extractor::WriteCompressedNodeBasedGraph(const std::string &path, const util::NodeBasedDynamicGraph &graph, const std::vector &coordinates) diff --git a/src/extractor/guidance/turn_lane_handler.cpp b/src/extractor/guidance/turn_lane_handler.cpp index 83bce260d..65a9c0304 100644 --- a/src/extractor/guidance/turn_lane_handler.cpp +++ b/src/extractor/guidance/turn_lane_handler.cpp @@ -37,10 +37,11 @@ TurnLaneHandler::TurnLaneHandler(const util::NodeBasedDynamicGraph &node_based_g LaneDescriptionMap &lane_description_map, const TurnAnalysis &turn_analysis, util::guidance::LaneDataIdMap &id_map) - : node_based_graph(node_based_graph), lane_description_map(lane_description_map), + : node_based_graph(node_based_graph), lane_description_map(lane_description_map), turn_analysis(turn_analysis), id_map(id_map) { - std::tie(turn_lane_offsets, turn_lane_masks) = transformTurnLaneMapIntoArrays(lane_description_map); + std::tie(turn_lane_offsets, turn_lane_masks) = + transformTurnLaneMapIntoArrays(lane_description_map); count_handled = count_called = 0; } diff --git a/src/storage/storage.cpp b/src/storage/storage.cpp index 4256ff530..c26f791eb 100644 --- a/src/storage/storage.cpp +++ b/src/storage/storage.cpp @@ -387,39 +387,26 @@ void Storage::PopulateLayout(DataLayout &layout) } { - io::FileReader intersection_file(config.intersection_class_path, - io::FileReader::VerifyFingerprint); + io::FileReader reader(config.intersection_class_path, io::FileReader::VerifyFingerprint); - std::vector bearing_class_id_table; - serialization::read(intersection_file, bearing_class_id_table); + auto num_discreate_bearings = reader.ReadVectorSize(); + layout.SetBlockSize(DataLayout::BEARING_VALUES, num_discreate_bearings); - layout.SetBlockSize(DataLayout::BEARING_CLASSID, - bearing_class_id_table.size()); + auto num_bearing_classes = reader.ReadVectorSize(); + layout.SetBlockSize(DataLayout::BEARING_CLASSID, num_bearing_classes); - const auto bearing_blocks = intersection_file.ReadElementCount64(); - intersection_file.Skip(1); // sum_lengths + reader.Skip(1); // sum_lengths + const auto bearing_blocks = reader.ReadVectorSize(); + const auto bearing_offsets = + reader + .ReadVectorSize::BlockT>(); layout.SetBlockSize(DataLayout::BEARING_OFFSETS, bearing_blocks); layout.SetBlockSize::BlockT>( - DataLayout::BEARING_BLOCKS, bearing_blocks); + DataLayout::BEARING_BLOCKS, bearing_offsets); - // No need to read the data - intersection_file.Skip(bearing_blocks); - intersection_file.Skip::BlockT>( - bearing_blocks); - - const auto num_bearings = intersection_file.ReadElementCount64(); - - // Skip over the actual data - intersection_file.Skip(num_bearings); - - layout.SetBlockSize(DataLayout::BEARING_VALUES, num_bearings); - - std::vector entry_class_table; - serialization::read(intersection_file, entry_class_table); - - layout.SetBlockSize(DataLayout::ENTRY_CLASS, - entry_class_table.size()); + auto num_entry_classes = reader.ReadVectorSize(); + layout.SetBlockSize(DataLayout::ENTRY_CLASS, num_entry_classes); } { @@ -826,86 +813,39 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) // Load intersection data { - io::FileReader intersection_file(config.intersection_class_path, - io::FileReader::VerifyFingerprint); + auto bearing_class_id_ptr = layout.GetBlockPtr( + memory_ptr, storage::DataLayout::BEARING_CLASSID); + util::vector_view bearing_class_id( + bearing_class_id_ptr, layout.num_entries[storage::DataLayout::BEARING_CLASSID]); - std::vector bearing_class_id_table; - serialization::read(intersection_file, bearing_class_id_table); + auto bearing_values_ptr = layout.GetBlockPtr( + memory_ptr, storage::DataLayout::BEARING_VALUES); + util::vector_view bearing_values( + bearing_values_ptr, layout.num_entries[storage::DataLayout::BEARING_VALUES]); - const auto bearing_blocks = intersection_file.ReadElementCount64(); - intersection_file.Skip(1); // sum_lengths + auto offsets_ptr = + layout.GetBlockPtr(memory_ptr, storage::DataLayout::BEARING_OFFSETS); + auto blocks_ptr = + layout.GetBlockPtr::BlockT, true>( + memory_ptr, storage::DataLayout::BEARING_BLOCKS); + util::vector_view bearing_offsets( + offsets_ptr, layout.num_entries[storage::DataLayout::BEARING_OFFSETS]); + util::vector_view::BlockT> bearing_blocks( + blocks_ptr, layout.num_entries[storage::DataLayout::BEARING_BLOCKS]); - std::vector bearing_offsets_data(bearing_blocks); - std::vector::BlockT> - bearing_blocks_data(bearing_blocks); + util::RangeTable<16, storage::Ownership::View> bearing_range_table( + bearing_offsets, bearing_blocks, static_cast(bearing_values.size())); - intersection_file.ReadInto(bearing_offsets_data.data(), bearing_blocks); - intersection_file.ReadInto(bearing_blocks_data.data(), bearing_blocks); + extractor::IntersectionBearingsView intersection_bearings_view{ + std::move(bearing_values), std::move(bearing_class_id), std::move(bearing_range_table)}; - const auto num_bearings = intersection_file.ReadElementCount64(); + auto entry_class_ptr = layout.GetBlockPtr( + memory_ptr, storage::DataLayout::ENTRY_CLASS); + util::vector_view entry_classes( + entry_class_ptr, layout.num_entries[storage::DataLayout::ENTRY_CLASS]); - std::vector bearing_class_table(num_bearings); - intersection_file.ReadInto(bearing_class_table.data(), num_bearings); - - std::vector entry_class_table; - serialization::read(intersection_file, entry_class_table); - - // load intersection classes - if (!bearing_class_id_table.empty()) - { - const auto bearing_id_ptr = - layout.GetBlockPtr(memory_ptr, DataLayout::BEARING_CLASSID); - BOOST_ASSERT( - static_cast(layout.GetBlockSize(DataLayout::BEARING_CLASSID)) >= - std::distance(bearing_class_id_table.begin(), bearing_class_id_table.end()) * - sizeof(decltype(bearing_class_id_table)::value_type)); - std::copy(bearing_class_id_table.begin(), bearing_class_id_table.end(), bearing_id_ptr); - } - - if (layout.GetBlockSize(DataLayout::BEARING_OFFSETS) > 0) - { - const auto bearing_offsets_ptr = - layout.GetBlockPtr(memory_ptr, DataLayout::BEARING_OFFSETS); - BOOST_ASSERT( - static_cast(layout.GetBlockSize(DataLayout::BEARING_OFFSETS)) >= - std::distance(bearing_offsets_data.begin(), bearing_offsets_data.end()) * - sizeof(decltype(bearing_offsets_data)::value_type)); - std::copy( - bearing_offsets_data.begin(), bearing_offsets_data.end(), bearing_offsets_ptr); - } - - if (layout.GetBlockSize(DataLayout::BEARING_BLOCKS) > 0) - { - const auto bearing_blocks_ptr = - layout.GetBlockPtr::BlockT, - true>(memory_ptr, DataLayout::BEARING_BLOCKS); - BOOST_ASSERT( - static_cast(layout.GetBlockSize(DataLayout::BEARING_BLOCKS)) >= - std::distance(bearing_blocks_data.begin(), bearing_blocks_data.end()) * - sizeof(decltype(bearing_blocks_data)::value_type)); - std::copy(bearing_blocks_data.begin(), bearing_blocks_data.end(), bearing_blocks_ptr); - } - - if (!bearing_class_table.empty()) - { - const auto bearing_class_ptr = - layout.GetBlockPtr(memory_ptr, DataLayout::BEARING_VALUES); - BOOST_ASSERT( - static_cast(layout.GetBlockSize(DataLayout::BEARING_VALUES)) >= - std::distance(bearing_class_table.begin(), bearing_class_table.end()) * - sizeof(decltype(bearing_class_table)::value_type)); - std::copy(bearing_class_table.begin(), bearing_class_table.end(), bearing_class_ptr); - } - - if (!entry_class_table.empty()) - { - const auto entry_class_ptr = layout.GetBlockPtr( - memory_ptr, DataLayout::ENTRY_CLASS); - BOOST_ASSERT(static_cast(layout.GetBlockSize(DataLayout::ENTRY_CLASS)) >= - std::distance(entry_class_table.begin(), entry_class_table.end()) * - sizeof(decltype(entry_class_table)::value_type)); - std::copy(entry_class_table.begin(), entry_class_table.end(), entry_class_ptr); - } + extractor::files::readIntersections( + config.intersection_class_path, intersection_bearings_view, entry_classes); } { diff --git a/unit_tests/mocks/mock_datafacade.hpp b/unit_tests/mocks/mock_datafacade.hpp index e4d9d4f9d..8b6485505 100644 --- a/unit_tests/mocks/mock_datafacade.hpp +++ b/unit_tests/mocks/mock_datafacade.hpp @@ -208,8 +208,6 @@ class MockBaseDataFacade : public engine::datafacade::BaseDataFacade const char *GetWeightName() const override final { return "duration"; } unsigned GetWeightPrecision() const override final { return 1; } double GetWeightMultiplier() const override final { return 10.; } - BearingClassID GetBearingClassID(const NodeID /*id*/) const override { return 0; } - EntryClassID GetEntryClassID(const EdgeID /*id*/) const override { return 0; } bool IsLeftHandDriving() const override { return false; } util::guidance::TurnBearing PreTurnBearing(const EdgeID /*eid*/) const override final @@ -232,8 +230,7 @@ class MockBaseDataFacade : public engine::datafacade::BaseDataFacade return {}; } - util::guidance::BearingClass - GetBearingClass(const BearingClassID /*bearing_class_id*/) const override + util::guidance::BearingClass GetBearingClass(const NodeID /*node*/) const override { util::guidance::BearingClass result; result.add(0); @@ -243,7 +240,7 @@ class MockBaseDataFacade : public engine::datafacade::BaseDataFacade return result; } - util::guidance::EntryClass GetEntryClass(const EntryClassID /*entry_class_id*/) const override + util::guidance::EntryClass GetEntryClass(const EdgeID /*id*/) const override { util::guidance::EntryClass result; result.activate(1);