Apply clang-format on BFSComponentExplorer and RestrictionMap
This commit is contained in:
parent
22d0861f6d
commit
e00ef38305
@ -12,19 +12,16 @@
|
|||||||
* Explores the components of the given graph while respecting turn restrictions
|
* Explores the components of the given graph while respecting turn restrictions
|
||||||
* and barriers.
|
* and barriers.
|
||||||
*/
|
*/
|
||||||
template<typename GraphT>
|
template <typename GraphT> class BFSComponentExplorer
|
||||||
class BFSComponentExplorer
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef typename GraphT::NodeIterator NodeIterator;
|
typedef typename GraphT::NodeIterator NodeIterator;
|
||||||
typedef typename GraphT::EdgeIterator EdgeIterator;
|
typedef typename GraphT::EdgeIterator EdgeIterator;
|
||||||
|
|
||||||
BFSComponentExplorer(const GraphT& dynamicGraph,
|
BFSComponentExplorer(const GraphT &dynamicGraph,
|
||||||
const RestrictionMap& restrictions,
|
const RestrictionMap &restrictions,
|
||||||
const boost::unordered_set<NodeID>& barrier_nodes)
|
const boost::unordered_set<NodeID> &barrier_nodes)
|
||||||
: m_graph(dynamicGraph)
|
: m_graph(dynamicGraph), m_restriction_map(restrictions), m_barrier_nodes(barrier_nodes)
|
||||||
, m_restriction_map(restrictions)
|
|
||||||
, m_barrier_nodes(barrier_nodes)
|
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(m_graph.GetNumberOfNodes() > 0);
|
BOOST_ASSERT(m_graph.GetNumberOfNodes() > 0);
|
||||||
}
|
}
|
||||||
@ -39,97 +36,94 @@ public:
|
|||||||
return m_component_index_size[m_component_index_list[node]];
|
return m_component_index_size[m_component_index_list[node]];
|
||||||
}
|
}
|
||||||
|
|
||||||
inline unsigned int getNumberOfComponents()
|
inline unsigned int getNumberOfComponents() { return m_component_index_size.size(); }
|
||||||
{
|
|
||||||
return m_component_index_size.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Computes the component sizes.
|
* Computes the component sizes.
|
||||||
*/
|
*/
|
||||||
void run()
|
void run()
|
||||||
{
|
{
|
||||||
std::queue<std::pair<NodeID, NodeID> > bfs_queue;
|
std::queue<std::pair<NodeID, NodeID>> bfs_queue;
|
||||||
unsigned current_component = 0;
|
unsigned current_component = 0;
|
||||||
|
|
||||||
BOOST_ASSERT( m_component_index_list.empty() );
|
BOOST_ASSERT(m_component_index_list.empty());
|
||||||
BOOST_ASSERT( m_component_index_size.empty() );
|
BOOST_ASSERT(m_component_index_size.empty());
|
||||||
|
|
||||||
unsigned num_nodes = m_graph.GetNumberOfNodes();
|
unsigned num_nodes = m_graph.GetNumberOfNodes();
|
||||||
|
|
||||||
m_component_index_list.resize(
|
m_component_index_list.resize(num_nodes, std::numeric_limits<unsigned>::max());
|
||||||
num_nodes,
|
|
||||||
std::numeric_limits<unsigned>::max()
|
|
||||||
);
|
|
||||||
|
|
||||||
BOOST_ASSERT (num_nodes > 0);
|
BOOST_ASSERT(num_nodes > 0);
|
||||||
|
|
||||||
//put unexplorered node with parent pointer into queue
|
// put unexplorered node with parent pointer into queue
|
||||||
for( NodeID node = 0; node < num_nodes; ++node) {
|
for (NodeID node = 0; node < num_nodes; ++node)
|
||||||
if(std::numeric_limits<unsigned>::max() == m_component_index_list[node]) {
|
{
|
||||||
|
if (std::numeric_limits<unsigned>::max() == m_component_index_list[node])
|
||||||
|
{
|
||||||
unsigned size = exploreComponent(bfs_queue, node, current_component);
|
unsigned size = exploreComponent(bfs_queue, node, current_component);
|
||||||
|
|
||||||
//push size into vector
|
// push size into vector
|
||||||
m_component_index_size.push_back(size);
|
m_component_index_size.push_back(size);
|
||||||
++current_component;
|
++current_component;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*!
|
/*!
|
||||||
* Explores the current component that starts at node using BFS.
|
* Explores the current component that starts at node using BFS.
|
||||||
*/
|
*/
|
||||||
inline unsigned exploreComponent(
|
inline unsigned exploreComponent(std::queue<std::pair<NodeID, NodeID>> &bfs_queue,
|
||||||
std::queue<std::pair<NodeID, NodeID> > &bfs_queue,
|
NodeID node,
|
||||||
NodeID node,
|
unsigned current_component)
|
||||||
unsigned current_component
|
{
|
||||||
) {
|
|
||||||
bfs_queue.push(std::make_pair(node, node));
|
bfs_queue.push(std::make_pair(node, node));
|
||||||
//mark node as read
|
// mark node as read
|
||||||
m_component_index_list[node] = current_component;
|
m_component_index_list[node] = current_component;
|
||||||
|
|
||||||
unsigned current_component_size = 1;
|
unsigned current_component_size = 1;
|
||||||
|
|
||||||
while(!bfs_queue.empty()) {
|
while (!bfs_queue.empty())
|
||||||
//fetch element from BFS queue
|
{
|
||||||
|
// fetch element from BFS queue
|
||||||
std::pair<NodeID, NodeID> current_queue_item = bfs_queue.front();
|
std::pair<NodeID, NodeID> current_queue_item = bfs_queue.front();
|
||||||
bfs_queue.pop();
|
bfs_queue.pop();
|
||||||
|
|
||||||
const NodeID v = current_queue_item.first; //current node
|
const NodeID v = current_queue_item.first; // current node
|
||||||
const NodeID u = current_queue_item.second; //parent
|
const NodeID u = current_queue_item.second; // parent
|
||||||
//increment size counter of current component
|
// increment size counter of current component
|
||||||
++current_component_size;
|
++current_component_size;
|
||||||
const bool is_barrier_node = (m_barrier_nodes.find(v) != m_barrier_nodes.end());
|
const bool is_barrier_node = (m_barrier_nodes.find(v) != m_barrier_nodes.end());
|
||||||
if(!is_barrier_node) {
|
if (!is_barrier_node)
|
||||||
const NodeID to_node_of_only_restriction = m_restriction_map.CheckForEmanatingIsOnlyTurn(u, v);
|
{
|
||||||
|
const NodeID to_node_of_only_restriction =
|
||||||
|
m_restriction_map.CheckForEmanatingIsOnlyTurn(u, v);
|
||||||
|
|
||||||
for(
|
for (EdgeIterator e2 = m_graph.BeginEdges(v); e2 < m_graph.EndEdges(v); ++e2)
|
||||||
EdgeIterator e2 = m_graph.BeginEdges(v);
|
{
|
||||||
e2 < m_graph.EndEdges(v);
|
|
||||||
++e2
|
|
||||||
) {
|
|
||||||
NodeIterator w = m_graph.GetTarget(e2);
|
NodeIterator w = m_graph.GetTarget(e2);
|
||||||
|
|
||||||
if(
|
if (to_node_of_only_restriction != std::numeric_limits<unsigned>::max() &&
|
||||||
to_node_of_only_restriction != std::numeric_limits<unsigned>::max() &&
|
w != to_node_of_only_restriction)
|
||||||
w != to_node_of_only_restriction
|
{
|
||||||
) {
|
|
||||||
// At an only_-restriction but not at the right turn
|
// At an only_-restriction but not at the right turn
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( u != w ) {
|
if (u != w)
|
||||||
//only add an edge if turn is not a U-turn except
|
{
|
||||||
//when it is at the end of a dead-end street.
|
// only add an edge if turn is not a U-turn except
|
||||||
if (!m_restriction_map.CheckIfTurnIsRestricted(u, v, w)) {
|
// when it is at the end of a dead-end street.
|
||||||
//only add an edge if turn is not prohibited
|
if (!m_restriction_map.CheckIfTurnIsRestricted(u, v, w))
|
||||||
if(std::numeric_limits<unsigned>::max() == m_component_index_list[w]) {
|
{
|
||||||
//insert next (node, parent) only if w has
|
// only add an edge if turn is not prohibited
|
||||||
//not yet been explored
|
if (std::numeric_limits<unsigned>::max() == m_component_index_list[w])
|
||||||
//mark node as read
|
{
|
||||||
|
// insert next (node, parent) only if w has
|
||||||
|
// not yet been explored
|
||||||
|
// mark node as read
|
||||||
m_component_index_list[w] = current_component;
|
m_component_index_list[w] = current_component;
|
||||||
bfs_queue.push(std::make_pair(w,v));
|
bfs_queue.push(std::make_pair(w, v));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -140,12 +134,12 @@ private:
|
|||||||
return current_component_size;
|
return current_component_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<unsigned> m_component_index_list;
|
std::vector<unsigned> m_component_index_list;
|
||||||
std::vector<NodeID> m_component_index_size;
|
std::vector<NodeID> m_component_index_size;
|
||||||
|
|
||||||
const GraphT& m_graph;
|
const GraphT &m_graph;
|
||||||
const RestrictionMap& m_restriction_map;
|
const RestrictionMap &m_restriction_map;
|
||||||
const boost::unordered_set<NodeID>& m_barrier_nodes;
|
const boost::unordered_set<NodeID> &m_barrier_nodes;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -4,35 +4,39 @@
|
|||||||
#include "DynamicGraph.h"
|
#include "DynamicGraph.h"
|
||||||
#include "ImportEdge.h"
|
#include "ImportEdge.h"
|
||||||
|
|
||||||
struct NodeBasedEdgeData {
|
struct NodeBasedEdgeData
|
||||||
NodeBasedEdgeData() : distance(INVALID_EDGE_WEIGHT), edgeBasedNodeID(SPECIAL_NODEID), nameID(std::numeric_limits<unsigned>::max()),
|
{
|
||||||
type(std::numeric_limits<short>::max()), isAccessRestricted(false), shortcut(false), forward(false), backward(false),
|
NodeBasedEdgeData()
|
||||||
roundabout(false), ignore_in_grid(false), contraFlow(false)
|
: distance(INVALID_EDGE_WEIGHT), edgeBasedNodeID(SPECIAL_NODEID),
|
||||||
{ }
|
nameID(std::numeric_limits<unsigned>::max()), type(std::numeric_limits<short>::max()),
|
||||||
|
isAccessRestricted(false), shortcut(false), forward(false), backward(false),
|
||||||
|
roundabout(false), ignore_in_grid(false), contraFlow(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
int distance;
|
int distance;
|
||||||
unsigned edgeBasedNodeID;
|
unsigned edgeBasedNodeID;
|
||||||
unsigned nameID;
|
unsigned nameID;
|
||||||
short type;
|
short type;
|
||||||
bool isAccessRestricted:1;
|
bool isAccessRestricted : 1;
|
||||||
bool shortcut:1;
|
bool shortcut : 1;
|
||||||
bool forward:1;
|
bool forward : 1;
|
||||||
bool backward:1;
|
bool backward : 1;
|
||||||
bool roundabout:1;
|
bool roundabout : 1;
|
||||||
bool ignore_in_grid:1;
|
bool ignore_in_grid : 1;
|
||||||
bool contraFlow:1;
|
bool contraFlow : 1;
|
||||||
|
|
||||||
void SwapDirectionFlags() {
|
void SwapDirectionFlags()
|
||||||
|
{
|
||||||
bool temp_flag = forward;
|
bool temp_flag = forward;
|
||||||
forward = backward;
|
forward = backward;
|
||||||
backward = temp_flag;
|
backward = temp_flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsEqualTo( const NodeBasedEdgeData & other ) const {
|
bool IsEqualTo(const NodeBasedEdgeData &other) const
|
||||||
return (forward == other.forward) &&
|
{
|
||||||
(backward == other.backward) &&
|
return (forward == other.forward) && (backward == other.backward) &&
|
||||||
(nameID == other.nameID) &&
|
(nameID == other.nameID) && (ignore_in_grid == other.ignore_in_grid) &&
|
||||||
(ignore_in_grid == other.ignore_in_grid) &&
|
|
||||||
(contraFlow == other.contraFlow);
|
(contraFlow == other.contraFlow);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -40,37 +44,41 @@ struct NodeBasedEdgeData {
|
|||||||
typedef DynamicGraph<NodeBasedEdgeData> NodeBasedDynamicGraph;
|
typedef DynamicGraph<NodeBasedEdgeData> NodeBasedDynamicGraph;
|
||||||
|
|
||||||
// Factory method to create NodeBasedDynamicGraph from ImportEdges
|
// Factory method to create NodeBasedDynamicGraph from ImportEdges
|
||||||
inline std::shared_ptr<NodeBasedDynamicGraph> NodeBasedDynamicGraphFromImportEdges(
|
inline std::shared_ptr<NodeBasedDynamicGraph>
|
||||||
int number_of_nodes,
|
NodeBasedDynamicGraphFromImportEdges(int number_of_nodes, std::vector<ImportEdge> &input_edge_list)
|
||||||
std::vector<ImportEdge>& input_edge_list
|
{
|
||||||
) {
|
|
||||||
typedef NodeBasedDynamicGraph::InputEdge DynInputEdge;
|
typedef NodeBasedDynamicGraph::InputEdge DynInputEdge;
|
||||||
|
|
||||||
std::sort( input_edge_list.begin(), input_edge_list.end() );
|
std::sort(input_edge_list.begin(), input_edge_list.end());
|
||||||
|
|
||||||
//TODO: remove duplicate edges
|
// TODO: remove duplicate edges
|
||||||
DeallocatingVector<DynInputEdge> edges_list;
|
DeallocatingVector<DynInputEdge> edges_list;
|
||||||
DynInputEdge edge;
|
DynInputEdge edge;
|
||||||
for(const ImportEdge& import_edge : input_edge_list) {
|
for (const ImportEdge &import_edge : input_edge_list)
|
||||||
|
{
|
||||||
|
|
||||||
if( !import_edge.isForward() ) {
|
if (!import_edge.isForward())
|
||||||
|
{
|
||||||
edge.source = import_edge.target();
|
edge.source = import_edge.target();
|
||||||
edge.target = import_edge.source();
|
edge.target = import_edge.source();
|
||||||
edge.data.backward = import_edge.isForward();
|
edge.data.backward = import_edge.isForward();
|
||||||
edge.data.forward = import_edge.isBackward();
|
edge.data.forward = import_edge.isBackward();
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
edge.source = import_edge.source();
|
edge.source = import_edge.source();
|
||||||
edge.target = import_edge.target();
|
edge.target = import_edge.target();
|
||||||
edge.data.forward = import_edge.isForward();
|
edge.data.forward = import_edge.isForward();
|
||||||
edge.data.backward = import_edge.isBackward();
|
edge.data.backward = import_edge.isBackward();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( edge.source == edge.target ) {
|
if (edge.source == edge.target)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
edge.data.distance = (std::max)((int)import_edge.weight(), 1 );
|
edge.data.distance = (std::max)((int)import_edge.weight(), 1);
|
||||||
BOOST_ASSERT( edge.data.distance > 0 );
|
BOOST_ASSERT(edge.data.distance > 0);
|
||||||
edge.data.shortcut = false;
|
edge.data.shortcut = false;
|
||||||
edge.data.roundabout = import_edge.isRoundabout();
|
edge.data.roundabout = import_edge.isRoundabout();
|
||||||
edge.data.ignore_in_grid = import_edge.ignoreInGrid();
|
edge.data.ignore_in_grid = import_edge.ignoreInGrid();
|
||||||
@ -78,29 +86,25 @@ inline std::shared_ptr<NodeBasedDynamicGraph> NodeBasedDynamicGraphFromImportEdg
|
|||||||
edge.data.type = import_edge.type();
|
edge.data.type = import_edge.type();
|
||||||
edge.data.isAccessRestricted = import_edge.isAccessRestricted();
|
edge.data.isAccessRestricted = import_edge.isAccessRestricted();
|
||||||
edge.data.contraFlow = import_edge.isContraFlow();
|
edge.data.contraFlow = import_edge.isContraFlow();
|
||||||
edges_list.push_back( edge );
|
edges_list.push_back(edge);
|
||||||
|
|
||||||
if( !import_edge.IsSplit() ) {
|
if (!import_edge.IsSplit())
|
||||||
using std::swap; //enable ADL
|
{
|
||||||
swap( edge.source, edge.target );
|
using std::swap; // enable ADL
|
||||||
|
swap(edge.source, edge.target);
|
||||||
edge.data.SwapDirectionFlags();
|
edge.data.SwapDirectionFlags();
|
||||||
edges_list.push_back( edge );
|
edges_list.push_back(edge);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort( edges_list.begin(), edges_list.end() );
|
std::sort(edges_list.begin(), edges_list.end());
|
||||||
auto graph = std::make_shared<NodeBasedDynamicGraph>(
|
auto graph = std::make_shared<NodeBasedDynamicGraph>(number_of_nodes, edges_list);
|
||||||
number_of_nodes,
|
|
||||||
edges_list
|
|
||||||
);
|
|
||||||
|
|
||||||
//FIXME probably unneeded since this is the end of scope
|
// FIXME probably unneeded since this is the end of scope
|
||||||
DeallocatingVector<DynInputEdge>().swap(edges_list);
|
DeallocatingVector<DynInputEdge>().swap(edges_list);
|
||||||
BOOST_ASSERT(0 == edges_list.size() );
|
BOOST_ASSERT(0 == edges_list.size());
|
||||||
|
|
||||||
return graph;
|
return graph;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,36 +1,42 @@
|
|||||||
#include "RestrictionMap.h"
|
#include "RestrictionMap.h"
|
||||||
#include "NodeBasedGraph.h"
|
#include "NodeBasedGraph.h"
|
||||||
|
|
||||||
RestrictionMap::RestrictionMap(const std::shared_ptr<NodeBasedDynamicGraph>& graph, const std::vector<TurnRestriction> & input_restrictions_list)
|
RestrictionMap::RestrictionMap(const std::shared_ptr<NodeBasedDynamicGraph> &graph,
|
||||||
: m_count(0)
|
const std::vector<TurnRestriction> &input_restrictions_list)
|
||||||
, m_graph(graph)
|
: m_count(0), m_graph(graph)
|
||||||
{
|
{
|
||||||
// decompose restirction consisting of a start, via and end note into a start-edge
|
// decompose restirction consisting of a start, via and end note into a start-edge
|
||||||
// and all end-nodes
|
// and all end-nodes
|
||||||
for (auto& restriction : input_restrictions_list) {
|
for (auto &restriction : input_restrictions_list)
|
||||||
|
{
|
||||||
std::pair<NodeID, NodeID> restriction_source =
|
std::pair<NodeID, NodeID> restriction_source =
|
||||||
std::make_pair(restriction.fromNode, restriction.viaNode);
|
std::make_pair(restriction.fromNode, restriction.viaNode);
|
||||||
unsigned index;
|
unsigned index;
|
||||||
auto restriction_iter = m_restriction_map.find(restriction_source);
|
auto restriction_iter = m_restriction_map.find(restriction_source);
|
||||||
if(restriction_iter == m_restriction_map.end()) {
|
if (restriction_iter == m_restriction_map.end())
|
||||||
|
{
|
||||||
index = m_restriction_bucket_list.size();
|
index = m_restriction_bucket_list.size();
|
||||||
m_restriction_bucket_list.resize(index+1);
|
m_restriction_bucket_list.resize(index + 1);
|
||||||
m_restriction_map.emplace(restriction_source, index);
|
m_restriction_map.emplace(restriction_source, index);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
index = restriction_iter->second;
|
index = restriction_iter->second;
|
||||||
//Map already contains an is_only_*-restriction
|
// Map already contains an is_only_*-restriction
|
||||||
if(m_restriction_bucket_list.at(index).begin()->second) {
|
if (m_restriction_bucket_list.at(index).begin()->second)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
} else if(restriction.flags.isOnly) {
|
}
|
||||||
//We are going to insert an is_only_*-restriction. There can be only one.
|
else if (restriction.flags.isOnly)
|
||||||
|
{
|
||||||
|
// We are going to insert an is_only_*-restriction. There can be only one.
|
||||||
m_count -= m_restriction_bucket_list.at(index).size();
|
m_count -= m_restriction_bucket_list.at(index).size();
|
||||||
m_restriction_bucket_list.at(index).clear();
|
m_restriction_bucket_list.at(index).clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_count;
|
++m_count;
|
||||||
m_restriction_bucket_list.at(index).push_back(
|
m_restriction_bucket_list.at(index)
|
||||||
std::make_pair( restriction.toNode, restriction.flags.isOnly)
|
.push_back(std::make_pair(restriction.toNode, restriction.flags.isOnly));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,41 +45,40 @@ RestrictionMap::RestrictionMap(const std::shared_ptr<NodeBasedDynamicGraph>& gra
|
|||||||
*
|
*
|
||||||
* Note: We need access to node based graph.
|
* Note: We need access to node based graph.
|
||||||
*/
|
*/
|
||||||
void RestrictionMap::FixupArrivingTurnRestriction(
|
void RestrictionMap::FixupArrivingTurnRestriction(const NodeID u, const NodeID v, const NodeID w)
|
||||||
const NodeID u,
|
{
|
||||||
const NodeID v,
|
BOOST_ASSERT(u != std::numeric_limits<unsigned>::max());
|
||||||
const NodeID w
|
BOOST_ASSERT(v != std::numeric_limits<unsigned>::max());
|
||||||
) {
|
BOOST_ASSERT(w != std::numeric_limits<unsigned>::max());
|
||||||
BOOST_ASSERT( u != std::numeric_limits<unsigned>::max() );
|
|
||||||
BOOST_ASSERT( v != std::numeric_limits<unsigned>::max() );
|
|
||||||
BOOST_ASSERT( w != std::numeric_limits<unsigned>::max() );
|
|
||||||
|
|
||||||
// find all possible start edges
|
// find all possible start edges
|
||||||
// it is more efficent to get a (small) list of potential start edges
|
// it is more efficent to get a (small) list of potential start edges
|
||||||
// than iterating over all buckets
|
// than iterating over all buckets
|
||||||
std::vector<NodeID> predecessors;
|
std::vector<NodeID> predecessors;
|
||||||
for(
|
for (EdgeID current_edge_id = m_graph->BeginEdges(u); current_edge_id < m_graph->EndEdges(u);
|
||||||
EdgeID current_edge_id = m_graph->BeginEdges(u);
|
++current_edge_id)
|
||||||
current_edge_id < m_graph->EndEdges(u);
|
{
|
||||||
++current_edge_id
|
const EdgeData &edge_data = m_graph->GetEdgeData(current_edge_id);
|
||||||
) {
|
|
||||||
const EdgeData & edge_data = m_graph->GetEdgeData(current_edge_id);
|
|
||||||
const NodeID target = m_graph->GetTarget(current_edge_id);
|
const NodeID target = m_graph->GetTarget(current_edge_id);
|
||||||
if( edge_data.backward && ( v != target) ) {
|
if (edge_data.backward && (v != target))
|
||||||
|
{
|
||||||
predecessors.push_back(target);
|
predecessors.push_back(target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(const NodeID x : predecessors) {
|
for (const NodeID x : predecessors)
|
||||||
const std::pair<NodeID, NodeID> restr_start = std::make_pair(x,u);
|
{
|
||||||
auto restriction_iterator = m_restriction_map.find( restr_start );
|
const std::pair<NodeID, NodeID> restr_start = std::make_pair(x, u);
|
||||||
if( restriction_iterator == m_restriction_map.end() )
|
auto restriction_iterator = m_restriction_map.find(restr_start);
|
||||||
|
if (restriction_iterator == m_restriction_map.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const unsigned index = restriction_iterator->second;
|
const unsigned index = restriction_iterator->second;
|
||||||
auto& bucket = m_restriction_bucket_list.at(index);
|
auto &bucket = m_restriction_bucket_list.at(index);
|
||||||
for(RestrictionTarget& restriction_target : bucket) {
|
for (RestrictionTarget &restriction_target : bucket)
|
||||||
if( v == restriction_target.first ) {
|
{
|
||||||
|
if (v == restriction_target.first)
|
||||||
|
{
|
||||||
restriction_target.first = w;
|
restriction_target.first = w;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -83,26 +88,24 @@ void RestrictionMap::FixupArrivingTurnRestriction(
|
|||||||
/**
|
/**
|
||||||
* Replaces the start edge (v, w) with (u, w), only start node changes.
|
* Replaces the start edge (v, w) with (u, w), only start node changes.
|
||||||
*/
|
*/
|
||||||
void RestrictionMap::FixupStartingTurnRestriction(
|
void RestrictionMap::FixupStartingTurnRestriction(const NodeID u, const NodeID v, const NodeID w)
|
||||||
const NodeID u,
|
{
|
||||||
const NodeID v,
|
BOOST_ASSERT(u != std::numeric_limits<unsigned>::max());
|
||||||
const NodeID w
|
BOOST_ASSERT(v != std::numeric_limits<unsigned>::max());
|
||||||
) {
|
BOOST_ASSERT(w != std::numeric_limits<unsigned>::max());
|
||||||
BOOST_ASSERT( u != std::numeric_limits<unsigned>::max() );
|
|
||||||
BOOST_ASSERT( v != std::numeric_limits<unsigned>::max() );
|
|
||||||
BOOST_ASSERT( w != std::numeric_limits<unsigned>::max() );
|
|
||||||
|
|
||||||
const std::pair<NodeID, NodeID> old_start = std::make_pair(v,w);
|
const std::pair<NodeID, NodeID> old_start = std::make_pair(v, w);
|
||||||
|
|
||||||
auto restriction_iterator = m_restriction_map.find( old_start );
|
auto restriction_iterator = m_restriction_map.find(old_start);
|
||||||
if( restriction_iterator != m_restriction_map.end() ) {
|
if (restriction_iterator != m_restriction_map.end())
|
||||||
|
{
|
||||||
const unsigned index = restriction_iterator->second;
|
const unsigned index = restriction_iterator->second;
|
||||||
// remove old restriction start (v,w)
|
// remove old restriction start (v,w)
|
||||||
m_restriction_map.erase( restriction_iterator );
|
m_restriction_map.erase(restriction_iterator);
|
||||||
|
|
||||||
// insert new restriction start (u,w) (point to index)
|
// insert new restriction start (u,w) (point to index)
|
||||||
const std::pair<NodeID, NodeID> new_start = std::make_pair(u,w);
|
const std::pair<NodeID, NodeID> new_start = std::make_pair(u, w);
|
||||||
m_restriction_map.insert( std::make_pair(new_start, index) );
|
m_restriction_map.insert(std::make_pair(new_start, index));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,21 +113,22 @@ void RestrictionMap::FixupStartingTurnRestriction(
|
|||||||
* Check if the edge (u, v) is contained in any turn restriction.
|
* Check if the edge (u, v) is contained in any turn restriction.
|
||||||
* If so returns id of first target node.
|
* If so returns id of first target node.
|
||||||
*/
|
*/
|
||||||
NodeID RestrictionMap::CheckForEmanatingIsOnlyTurn(
|
NodeID RestrictionMap::CheckForEmanatingIsOnlyTurn(const NodeID u, const NodeID v) const
|
||||||
const NodeID u,
|
{
|
||||||
const NodeID v
|
BOOST_ASSERT(u != std::numeric_limits<unsigned>::max());
|
||||||
) const {
|
BOOST_ASSERT(v != std::numeric_limits<unsigned>::max());
|
||||||
BOOST_ASSERT( u != std::numeric_limits<unsigned>::max() );
|
|
||||||
BOOST_ASSERT( v != std::numeric_limits<unsigned>::max() );
|
|
||||||
|
|
||||||
const std::pair<NodeID, NodeID> restriction_source = std::make_pair(u, v);
|
const std::pair<NodeID, NodeID> restriction_source = std::make_pair(u, v);
|
||||||
auto restriction_iter = m_restriction_map.find(restriction_source);
|
auto restriction_iter = m_restriction_map.find(restriction_source);
|
||||||
|
|
||||||
if (restriction_iter != m_restriction_map.end()) {
|
if (restriction_iter != m_restriction_map.end())
|
||||||
|
{
|
||||||
const unsigned index = restriction_iter->second;
|
const unsigned index = restriction_iter->second;
|
||||||
auto& bucket = m_restriction_bucket_list.at(index);
|
auto &bucket = m_restriction_bucket_list.at(index);
|
||||||
for(const RestrictionSource& restriction_target : bucket) {
|
for (const RestrictionSource &restriction_target : bucket)
|
||||||
if(restriction_target.second) {
|
{
|
||||||
|
if (restriction_target.second)
|
||||||
|
{
|
||||||
return restriction_target.first;
|
return restriction_target.first;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -136,26 +140,25 @@ NodeID RestrictionMap::CheckForEmanatingIsOnlyTurn(
|
|||||||
/**
|
/**
|
||||||
* Checks if the turn described by start u, via v and targed w is covert by any turn restriction.
|
* Checks if the turn described by start u, via v and targed w is covert by any turn restriction.
|
||||||
*/
|
*/
|
||||||
bool RestrictionMap::CheckIfTurnIsRestricted(
|
bool RestrictionMap::CheckIfTurnIsRestricted(const NodeID u, const NodeID v, const NodeID w) const
|
||||||
const NodeID u,
|
{
|
||||||
const NodeID v,
|
BOOST_ASSERT(u != std::numeric_limits<unsigned>::max());
|
||||||
const NodeID w
|
BOOST_ASSERT(v != std::numeric_limits<unsigned>::max());
|
||||||
) const {
|
BOOST_ASSERT(w != std::numeric_limits<unsigned>::max());
|
||||||
BOOST_ASSERT( u != std::numeric_limits<unsigned>::max() );
|
|
||||||
BOOST_ASSERT( v != std::numeric_limits<unsigned>::max() );
|
|
||||||
BOOST_ASSERT( w != std::numeric_limits<unsigned>::max() );
|
|
||||||
|
|
||||||
const std::pair<NodeID, NodeID> restriction_source = std::make_pair(u, v);
|
const std::pair<NodeID, NodeID> restriction_source = std::make_pair(u, v);
|
||||||
auto restriction_iter = m_restriction_map.find(restriction_source);
|
auto restriction_iter = m_restriction_map.find(restriction_source);
|
||||||
|
|
||||||
if (restriction_iter != m_restriction_map.end()) {
|
if (restriction_iter != m_restriction_map.end())
|
||||||
|
{
|
||||||
const unsigned index = restriction_iter->second;
|
const unsigned index = restriction_iter->second;
|
||||||
auto& bucket = m_restriction_bucket_list.at(index);
|
auto &bucket = m_restriction_bucket_list.at(index);
|
||||||
for(const RestrictionTarget & restriction_target : bucket) {
|
for (const RestrictionTarget &restriction_target : bucket)
|
||||||
if(
|
{
|
||||||
( w == restriction_target.first ) && // target found
|
if ((w == restriction_target.first) && // target found
|
||||||
( !restriction_target.second ) // and not an only_-restr.
|
(!restriction_target.second) // and not an only_-restr.
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,9 +43,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
*/
|
*/
|
||||||
class RestrictionMap
|
class RestrictionMap
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RestrictionMap(const std::shared_ptr<NodeBasedDynamicGraph>& graph,
|
RestrictionMap(const std::shared_ptr<NodeBasedDynamicGraph> &graph,
|
||||||
const std::vector<TurnRestriction> & input_restrictions_list);
|
const std::vector<TurnRestriction> &input_restrictions_list);
|
||||||
|
|
||||||
void FixupArrivingTurnRestriction(const NodeID u, const NodeID v, const NodeID w);
|
void FixupArrivingTurnRestriction(const NodeID u, const NodeID v, const NodeID w);
|
||||||
void FixupStartingTurnRestriction(const NodeID u, const NodeID v, const NodeID w);
|
void FixupStartingTurnRestriction(const NodeID u, const NodeID v, const NodeID w);
|
||||||
@ -54,16 +54,16 @@ public:
|
|||||||
|
|
||||||
unsigned size() { return m_count; }
|
unsigned size() { return m_count; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef std::pair<NodeID, NodeID> RestrictionSource;
|
typedef std::pair<NodeID, NodeID> RestrictionSource;
|
||||||
typedef std::pair<NodeID, bool> RestrictionTarget;
|
typedef std::pair<NodeID, bool> RestrictionTarget;
|
||||||
typedef std::vector<RestrictionTarget> EmanatingRestrictionsVector;
|
typedef std::vector<RestrictionTarget> EmanatingRestrictionsVector;
|
||||||
typedef NodeBasedDynamicGraph::EdgeData EdgeData;
|
typedef NodeBasedDynamicGraph::EdgeData EdgeData;
|
||||||
|
|
||||||
unsigned m_count;
|
unsigned m_count;
|
||||||
std::shared_ptr<NodeBasedDynamicGraph> m_graph;
|
std::shared_ptr<NodeBasedDynamicGraph> m_graph;
|
||||||
//! index -> list of (target, isOnly)
|
//! index -> list of (target, isOnly)
|
||||||
std::vector<EmanatingRestrictionsVector> m_restriction_bucket_list;
|
std::vector<EmanatingRestrictionsVector> m_restriction_bucket_list;
|
||||||
//! maps (start, via) -> bucket index
|
//! maps (start, via) -> bucket index
|
||||||
boost::unordered_map<RestrictionSource, unsigned> m_restriction_map;
|
boost::unordered_map<RestrictionSource, unsigned> m_restriction_map;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user