[osrm] 01/04: Imported Upstream version 4.9.1+ds
Sebastiaan Couwenberg
sebastic at moszumanska.debian.org
Fri Jan 22 18:09:49 UTC 2016
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository osrm.
commit c52c682dc35f8b2c0f0349732ec83ea57fda0f06
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Fri Jan 22 18:39:42 2016 +0100
Imported Upstream version 4.9.1+ds
---
data_structures/shared_memory_factory.hpp | 4 ++
descriptors/json_descriptor.hpp | 3 +
extractor/edge_based_graph_factory.cpp | 19 +++++-
library/osrm_impl.cpp | 11 +++-
plugins/match.hpp | 6 +-
plugins/trip.hpp | 38 ++++++-----
plugins/viaroute.hpp | 43 +++++++------
server/data_structures/shared_datafacade.hpp | 96 ++++++++++++++++++----------
8 files changed, 139 insertions(+), 81 deletions(-)
diff --git a/data_structures/shared_memory_factory.hpp b/data_structures/shared_memory_factory.hpp
index 7d92eaa..833b4aa 100644
--- a/data_structures/shared_memory_factory.hpp
+++ b/data_structures/shared_memory_factory.hpp
@@ -99,6 +99,7 @@ class SharedMemory
SharedMemory() = delete;
SharedMemory(const SharedMemory &) = delete;
+ SharedMemory &operator=(const SharedMemory &) = delete;
template <typename IdentifierT>
SharedMemory(const boost::filesystem::path &lock_file,
@@ -208,11 +209,13 @@ class SharedMemory
class SharedMemory
{
SharedMemory(const SharedMemory &) = delete;
+ SharedMemory &operator=(const SharedMemory &) = delete;
// Remove shared memory on destruction
class shm_remove
{
private:
shm_remove(const shm_remove &) = delete;
+ shm_remove &operator=(const shm_remove &) = delete;
char *m_shmid;
bool m_initialized;
@@ -375,6 +378,7 @@ template <class LockFileT = OSRMLockFile> class SharedMemoryFactory_tmpl
SharedMemoryFactory_tmpl() = delete;
SharedMemoryFactory_tmpl(const SharedMemoryFactory_tmpl &) = delete;
+ SharedMemoryFactory_tmpl &operator=(const SharedMemoryFactory_tmpl &) = delete;
};
using SharedMemoryFactory = SharedMemoryFactory_tmpl<>;
diff --git a/descriptors/json_descriptor.hpp b/descriptors/json_descriptor.hpp
index a4344d9..e476dd8 100644
--- a/descriptors/json_descriptor.hpp
+++ b/descriptors/json_descriptor.hpp
@@ -306,6 +306,7 @@ template <class DataFacadeT> class JSONDescriptor final : public BaseDescriptor<
round_about.leave_at_exit = 0;
round_about.name_id = 0;
std::string temp_dist, temp_length, temp_duration, temp_bearing, temp_instruction;
+ TravelMode last_travel_mode = TRAVEL_MODE_DEFAULT;
// Fetch data from Factory and generate a string from it.
for (const SegmentInformation &segment : description_factory.path_description)
@@ -354,6 +355,7 @@ template <class DataFacadeT> class JSONDescriptor final : public BaseDescriptor<
static_cast<unsigned>(round(post_turn_bearing_value)));
json_instruction_row.values.push_back(segment.travel_mode);
+ last_travel_mode = segment.travel_mode;
// pre turn bearing
const double pre_turn_bearing_value = (segment.pre_turn_bearing / 10.);
@@ -389,6 +391,7 @@ template <class DataFacadeT> class JSONDescriptor final : public BaseDescriptor<
json_last_instruction_row.values.push_back("0m");
json_last_instruction_row.values.push_back(bearing::get(0.0));
json_last_instruction_row.values.push_back(0.);
+ json_last_instruction_row.values.push_back(last_travel_mode);
json_last_instruction_row.values.push_back(bearing::get(0.0));
json_last_instruction_row.values.push_back(0.);
json_instruction_array.values.push_back(json_last_instruction_row);
diff --git a/extractor/edge_based_graph_factory.cpp b/extractor/edge_based_graph_factory.cpp
index f0c083d..1ddeb6a 100644
--- a/extractor/edge_based_graph_factory.cpp
+++ b/extractor/edge_based_graph_factory.cpp
@@ -445,10 +445,23 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(
}
else
{
- if ((node_u == node_w) && (m_node_based_graph->GetOutDegree(node_v) > 1))
+ if (node_u == node_w && m_node_based_graph->GetOutDegree(node_v) > 1)
{
- ++skipped_uturns_counter;
- continue;
+ auto number_of_emmiting_bidirectional_edges = 0;
+ for (auto edge : m_node_based_graph->GetAdjacentEdgeRange(node_v))
+ {
+ auto target = m_node_based_graph->GetTarget(edge);
+ auto reverse_edge = m_node_based_graph->FindEdge(target, node_v);
+ if (!m_node_based_graph->GetEdgeData(reverse_edge).reversed)
+ {
+ ++number_of_emmiting_bidirectional_edges;
+ }
+ }
+ if (number_of_emmiting_bidirectional_edges > 1)
+ {
+ ++skipped_uturns_counter;
+ continue;
+ }
}
}
diff --git a/library/osrm_impl.cpp b/library/osrm_impl.cpp
index 3f5b62b..069ef95 100644
--- a/library/osrm_impl.cpp
+++ b/library/osrm_impl.cpp
@@ -109,7 +109,16 @@ int OSRM::OSRM_impl::RunQuery(const RouteParameters &route_parameters, osrm::jso
}
increase_concurrent_query_count();
- auto return_code = plugin_iterator->second->HandleRequest(route_parameters, json_result);
+ BasePlugin::Status return_code;
+ if (barrier) {
+ // Get a shared data lock so that other threads won't update
+ // things while the query is running
+ boost::shared_lock<boost::shared_mutex> data_lock{
+ (static_cast<SharedDataFacade<QueryEdge::EdgeData> *>(query_data_facade))->data_mutex};
+ return_code = plugin_iterator->second->HandleRequest(route_parameters, json_result);
+ } else {
+ return_code = plugin_iterator->second->HandleRequest(route_parameters, json_result);
+ }
decrease_concurrent_query_count();
return static_cast<int>(return_code);
}
diff --git a/plugins/match.hpp b/plugins/match.hpp
index f176956..e213d19 100644
--- a/plugins/match.hpp
+++ b/plugins/match.hpp
@@ -51,8 +51,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
{
- constexpr static const unsigned max_number_of_candidates = 10;
-
std::shared_ptr<SearchEngine<DataFacadeT>> search_engine_ptr;
using ClassifierT = BayesClassifier<LaplaceDistribution, LaplaceDistribution, double>;
@@ -101,7 +99,9 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
{
osrm::matching::CandidateLists candidates_lists;
- double query_radius = 10 * gps_precision;
+ // assuming the gps_precision is the standart-diviation of normal distribution that models
+ // GPS noise (in this model) this should give us the correct candidate with >0.95
+ double query_radius = 3 * gps_precision;
double last_distance =
coordinate_calculation::haversine_distance(input_coords[0], input_coords[1]);
diff --git a/plugins/trip.hpp b/plugins/trip.hpp
index a69e25e..b1ba55b 100644
--- a/plugins/trip.hpp
+++ b/plugins/trip.hpp
@@ -126,26 +126,18 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
// NodeID 3, 6, 7, 8 are in component 1
// => in_component = [0, 1, 2, 4, 5, 3, 6, 7, 8]
// => in_range = [0, 5]
- SCC_Component(std::vector<NodeID> in_component, std::vector<size_t> in_range)
- : component(std::move(in_component)), range(std::move(in_range))
+ SCC_Component(std::vector<NodeID> in_component_nodes, std::vector<size_t> in_range)
+ : component(std::move(in_component_nodes)), range(std::move(in_range))
{
- range.push_back(component.size());
-
- BOOST_ASSERT_MSG(component.size() >= range.size(),
- "scc component and its ranges do not match");
BOOST_ASSERT_MSG(component.size() > 0, "there's no scc component");
- BOOST_ASSERT_MSG(*std::max_element(range.begin(), range.end()) <= component.size(),
+ BOOST_ASSERT_MSG(*std::max_element(range.begin(), range.end()) == component.size(),
"scc component ranges are out of bound");
- BOOST_ASSERT_MSG(*std::min_element(range.begin(), range.end()) >= 0,
+ BOOST_ASSERT_MSG(*std::min_element(range.begin(), range.end()) == 0,
"invalid scc component range");
BOOST_ASSERT_MSG(std::is_sorted(std::begin(range), std::end(range)),
"invalid component ranges");
};
- // constructor to use when whole graph is one single scc
- SCC_Component(std::vector<NodeID> in_component)
- : component(std::move(in_component)), range({0, component.size()}){};
-
std::size_t GetNumberOfComponents() const
{
BOOST_ASSERT_MSG(range.size() > 0, "there's no range");
@@ -169,7 +161,8 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
// whole graph is one scc
std::vector<NodeID> location_ids(number_of_locations);
std::iota(std::begin(location_ids), std::end(location_ids), 0);
- return SCC_Component(std::move(location_ids));
+ std::vector<size_t> range = {0, location_ids.size()};
+ return SCC_Component(std::move(location_ids), std::move(range));
}
// Run TarjanSCC
@@ -194,6 +187,8 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
range.push_back(prefix);
prefix += scc.get_component_size(j);
}
+ // senitel
+ range.push_back(components.size());
for (std::size_t i = 0; i < number_of_locations; ++i)
{
@@ -235,11 +230,13 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
BOOST_ASSERT(min_route.segment_end_coordinates.size() == trip.size());
std::vector<bool> uturns(trip.size() + 1);
+ BOOST_ASSERT(route_parameters.uturns.size() > 0);
std::transform(trip.begin(), trip.end(), uturns.begin(),
[&route_parameters](const NodeID idx)
{
return route_parameters.uturns[idx];
});
+ BOOST_ASSERT(uturns.size() > 0);
uturns.back() = route_parameters.uturns[trip.front()];
search_engine_ptr->shortest_path(min_route.segment_end_coordinates, uturns, min_route);
@@ -316,13 +313,14 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
{
const auto component_size = scc.range[k + 1] - scc.range[k];
- BOOST_ASSERT_MSG(component_size >= 0, "invalid component size");
+ BOOST_ASSERT_MSG(component_size > 0, "invalid component size");
+
+ std::vector<NodeID> scc_route;
+ NodeIDIterator start = std::begin(scc.component) + scc.range[k];
+ NodeIDIterator end = std::begin(scc.component) + scc.range[k + 1];
if (component_size > 1)
{
- std::vector<NodeID> scc_route;
- NodeIDIterator start = std::begin(scc.component) + scc.range[k];
- NodeIDIterator end = std::begin(scc.component) + scc.range[k + 1];
if (component_size < BF_MAX_FEASABLE)
{
@@ -346,13 +344,13 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
// return s;
// }();
- route_result.push_back(std::move(scc_route));
}
else
{
- // if component only consists of one node, add it to the result routes
- route_result.emplace_back(scc.component[scc.range[k]]);
+ scc_route = std::vector<NodeID>(start, end);
}
+
+ route_result.push_back(std::move(scc_route));
}
// compute all round trip routes
diff --git a/plugins/viaroute.hpp b/plugins/viaroute.hpp
index f9a6737..21e8714 100644
--- a/plugins/viaroute.hpp
+++ b/plugins/viaroute.hpp
@@ -164,28 +164,9 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
route_parameters.uturns, raw_route);
}
- bool no_route = INVALID_EDGE_WEIGHT == raw_route.shortest_path_length;
-
- std::unique_ptr<BaseDescriptor<DataFacadeT>> descriptor;
- switch (descriptor_table.get_id(route_parameters.output_format))
- {
- case 1:
- descriptor = osrm::make_unique<GPXDescriptor<DataFacadeT>>(facade);
- break;
- // case 2:
- // descriptor = osrm::make_unique<GEOJSONDescriptor<DataFacadeT>>();
- // break;
- default:
- descriptor = osrm::make_unique<JSONDescriptor<DataFacadeT>>(facade);
- break;
- }
-
- descriptor->SetConfig(route_parameters);
- descriptor->Run(raw_route, json_result);
-
// we can only know this after the fact, different SCC ids still
// allow for connection in one direction.
- if (no_route)
+ if (raw_route.shortest_path_length == INVALID_EDGE_WEIGHT)
{
auto first_component_id = snapped_phantoms.front().component.id;
auto not_in_same_component =
@@ -194,14 +175,36 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
{
return node.component.id != first_component_id;
});
+
if (not_in_same_component)
{
json_result.values["status_message"] = "Impossible route between points";
return Status::EmptyResult;
}
+ else
+ {
+ json_result.values["status_message"] = "No route found between points";
+ return Status::Error;
+ }
}
else
{
+ std::unique_ptr<BaseDescriptor<DataFacadeT>> descriptor;
+ switch (descriptor_table.get_id(route_parameters.output_format))
+ {
+ case 1:
+ descriptor = osrm::make_unique<GPXDescriptor<DataFacadeT>>(facade);
+ break;
+ // case 2:
+ // descriptor = osrm::make_unique<GEOJSONDescriptor<DataFacadeT>>();
+ // break;
+ default:
+ descriptor = osrm::make_unique<JSONDescriptor<DataFacadeT>>(facade);
+ break;
+ }
+
+ descriptor->SetConfig(route_parameters);
+ descriptor->Run(raw_route, json_result);
json_result.values["status_message"] = "Found route between points";
}
diff --git a/server/data_structures/shared_datafacade.hpp b/server/data_structures/shared_datafacade.hpp
index 024a894..4bbf076 100644
--- a/server/data_structures/shared_datafacade.hpp
+++ b/server/data_structures/shared_datafacade.hpp
@@ -239,10 +239,17 @@ template <class EdgeDataT> class SharedDataFacade final : public BaseDataFacade<
public:
virtual ~SharedDataFacade() {}
+ boost::shared_mutex data_mutex;
+
SharedDataFacade()
{
+ if (!SharedMemory::RegionExists(CURRENT_REGIONS))
+ {
+ throw osrm::exception("No shared memory blocks found, have you forgotten to run osrm-datastore?");
+ }
data_timestamp_ptr = (SharedDataTimestamp *)SharedMemoryFactory::Get(
- CURRENT_REGIONS, sizeof(SharedDataTimestamp), false, false)->Ptr();
+ CURRENT_REGIONS, sizeof(SharedDataTimestamp), false, false)
+ ->Ptr();
CURRENT_LAYOUT = LAYOUT_NONE;
CURRENT_DATA = DATA_NONE;
CURRENT_TIMESTAMP = 0;
@@ -257,50 +264,71 @@ template <class EdgeDataT> class SharedDataFacade final : public BaseDataFacade<
CURRENT_DATA != data_timestamp_ptr->data ||
CURRENT_TIMESTAMP != data_timestamp_ptr->timestamp)
{
- // release the previous shared memory segments
- SharedMemory::Remove(CURRENT_LAYOUT);
- SharedMemory::Remove(CURRENT_DATA);
-
- CURRENT_LAYOUT = data_timestamp_ptr->layout;
- CURRENT_DATA = data_timestamp_ptr->data;
- CURRENT_TIMESTAMP = data_timestamp_ptr->timestamp;
+ // Get exclusive lock
+ SimpleLogger().Write(logDEBUG) << "Updates available, getting exclusive lock";
+ boost::unique_lock<boost::shared_mutex> lock(data_mutex);
- m_layout_memory.reset(SharedMemoryFactory::Get(CURRENT_LAYOUT));
-
- data_layout = (SharedDataLayout *)(m_layout_memory->Ptr());
+ if (CURRENT_LAYOUT != data_timestamp_ptr->layout ||
+ CURRENT_DATA != data_timestamp_ptr->data)
+ {
+ // release the previous shared memory segments
+ SharedMemory::Remove(CURRENT_LAYOUT);
+ SharedMemory::Remove(CURRENT_DATA);
- m_large_memory.reset(SharedMemoryFactory::Get(CURRENT_DATA));
- shared_memory = (char *)(m_large_memory->Ptr());
+ CURRENT_LAYOUT = data_timestamp_ptr->layout;
+ CURRENT_DATA = data_timestamp_ptr->data;
+ CURRENT_TIMESTAMP = 0; // Force trigger a reload
- const char *file_index_ptr =
- data_layout->GetBlockPtr<char>(shared_memory, SharedDataLayout::FILE_INDEX_PATH);
- file_index_path = boost::filesystem::path(file_index_ptr);
- if (!boost::filesystem::exists(file_index_path))
+ SimpleLogger().Write(logDEBUG) << "Current layout was different to new layout, swapping";
+ }
+ else
{
- SimpleLogger().Write(logDEBUG) << "Leaf file name " << file_index_path.string();
- throw osrm::exception("Could not load leaf index file. "
- "Is any data loaded into shared memory?");
+ SimpleLogger().Write(logDEBUG) << "Current layout was same to new layout, not swapping";
}
- LoadGraph();
- LoadChecksum();
- LoadNodeAndEdgeInformation();
- LoadGeometries();
- LoadTimestamp();
- LoadViaNodeList();
- LoadNames();
- LoadCoreInformation();
+ if (CURRENT_TIMESTAMP != data_timestamp_ptr->timestamp)
+ {
+ CURRENT_TIMESTAMP = data_timestamp_ptr->timestamp;
- data_layout->PrintInformation();
+ SimpleLogger().Write(logDEBUG) << "Performing data reload";
+ m_layout_memory.reset(SharedMemoryFactory::Get(CURRENT_LAYOUT));
- SimpleLogger().Write() << "number of geometries: " << m_coordinate_list->size();
- for (unsigned i = 0; i < m_coordinate_list->size(); ++i)
- {
- if (!GetCoordinateOfNode(i).is_valid())
+ data_layout = (SharedDataLayout *) (m_layout_memory->Ptr());
+
+ m_large_memory.reset(SharedMemoryFactory::Get(CURRENT_DATA));
+ shared_memory = (char *) (m_large_memory->Ptr());
+
+ const char *file_index_ptr =
+ data_layout->GetBlockPtr<char>(shared_memory, SharedDataLayout::FILE_INDEX_PATH);
+ file_index_path = boost::filesystem::path(file_index_ptr);
+ if (!boost::filesystem::exists(file_index_path)) {
+ SimpleLogger().Write(logDEBUG) << "Leaf file name "
+ << file_index_path.string();
+ throw osrm::exception("Could not load leaf index file. "
+ "Is any data loaded into shared memory?");
+ }
+
+ LoadGraph();
+ LoadChecksum();
+ LoadNodeAndEdgeInformation();
+ LoadGeometries();
+ LoadTimestamp();
+ LoadViaNodeList();
+ LoadNames();
+ LoadCoreInformation();
+
+ data_layout->PrintInformation();
+
+ SimpleLogger().Write() << "number of geometries: " << m_coordinate_list->size();
+ for (unsigned i = 0; i < m_coordinate_list->size(); ++i)
{
- SimpleLogger().Write() << "coordinate " << i << " not valid";
+ if (!GetCoordinateOfNode(i).is_valid())
+ {
+ SimpleLogger().Write() << "coordinate " << i << " not valid";
+ }
}
}
+ SimpleLogger().Write(logDEBUG) << "Releasing exclusive lock";
}
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osrm.git
More information about the Pkg-grass-devel
mailing list