Merge pull request #42 from gardster/cross_mwm_fix

[routing] Reverse node id support for cross mwm routing.
This commit is contained in:
Konstantin Shalnev 2015-09-30 12:50:19 +03:00
commit 51b124e3a2
6 changed files with 46 additions and 7 deletions

View file

@ -199,6 +199,18 @@ namespace
MercatorBounds::FromLatLon(45.38053, 36.73226), 13110.);
}
UNIT_TEST(ParisCrossDestinationInForwardHeapCase)
{
// Forward
integration::CalculateRouteAndTestRouteLength(
integration::GetOsrmComponents(), MercatorBounds::FromLatLon(49.85015, 2.24296), {0., 0.},
MercatorBounds::FromLatLon(48.85860, 2.34784), 126000.);
// And backward case
integration::CalculateRouteAndTestRouteLength(
integration::GetOsrmComponents(), MercatorBounds::FromLatLon(48.85860, 2.34784), {0., 0.},
MercatorBounds::FromLatLon(49.85015, 2.24296), 126000.);
}
UNIT_TEST(RussiaSmolenskRussiaMoscowTimeTest)
{
TRouteResult const routeResult = integration::CalculateRoute(

View file

@ -33,7 +33,8 @@ IRouter::ResultCode CrossMwmGraph::SetStartNode(CrossNode const & startNode)
targets.reserve(outSize);
for (auto j = mwmOutsIter.first; j < mwmOutsIter.second; ++j)
targets.emplace_back(j->m_nodeId, false /* isStartNode */, startNode.mwmName);
sources[0] = FeatureGraphNode(startNode.node, true /* isStartNode */, startNode.mwmName);
sources[0] = FeatureGraphNode(startNode.node, startNode.reverseNode, true /* isStartNode */,
startNode.mwmName);
vector<EdgeWeight> weights;
FindWeightsMatrix(sources, targets, startMapping->m_dataFacade, weights);
@ -95,7 +96,8 @@ IRouter::ResultCode CrossMwmGraph::SetFinalNode(CrossNode const & finalNode)
}
vector<EdgeWeight> weights;
targets[0] = FeatureGraphNode(finalNode.node, false /* isStartNode */, finalNode.mwmName);
targets[0] = FeatureGraphNode(finalNode.node, finalNode.reverseNode, false /* isStartNode */,
finalNode.mwmName);
FindWeightsMatrix(sources, targets, finalMapping->m_dataFacade, weights);
if (find_if(weights.begin(), weights.end(), &IsValidEdgeWeight) == weights.end())
return IRouter::EndPointNotFound;

View file

@ -18,16 +18,22 @@ namespace routing
struct CrossNode
{
NodeID node;
NodeID reverseNode;
string mwmName;
m2::PointD point;
bool isVirtual;
CrossNode(NodeID node, string const & mwmName, m2::PointD const & point)
: node(node), mwmName(mwmName), point(point), isVirtual(false)
CrossNode(NodeID node, NodeID reverse, string const & mwmName, m2::PointD const & point)
: node(node), reverseNode(reverse), mwmName(mwmName), point(point), isVirtual(false)
{
}
CrossNode() : node(INVALID_NODE_ID), point(m2::PointD::Zero()) {}
CrossNode(NodeID node, string const & mwmName, m2::PointD const & point)
: node(node), reverseNode(INVALID_NODE_ID), mwmName(mwmName), point(point), isVirtual(false)
{
}
CrossNode() : node(INVALID_NODE_ID), reverseNode(INVALID_NODE_ID), point(m2::PointD::Zero()) {}
inline bool IsValid() const { return node != INVALID_NODE_ID; }

View file

@ -53,7 +53,8 @@ IRouter::ResultCode CalculateCrossMwmPath(TRoutingNodes const & startGraphNodes,
IRouter::ResultCode code = IRouter::StartPointNotFound;
for (FeatureGraphNode const & start : startGraphNodes)
{
startNode = CrossNode(start.node.forward_node_id, start.mwmName, start.segmentPoint);
startNode = CrossNode(start.node.forward_node_id, start.node.reverse_node_id, start.mwmName,
start.segmentPoint);
code = roadGraph.SetStartNode(startNode);
if (code == IRouter::NoError)
{
@ -70,7 +71,8 @@ IRouter::ResultCode CalculateCrossMwmPath(TRoutingNodes const & startGraphNodes,
code = IRouter::EndPointNotFound;
for (FeatureGraphNode const & final : finalGraphNodes)
{
finalNode = CrossNode(final.node.reverse_node_id, final.mwmName, final.segmentPoint);
finalNode = CrossNode(final.node.reverse_node_id, final.node.forward_node_id, final.mwmName,
final.segmentPoint);
finalNode.isVirtual = true;
code = roadGraph.SetFinalNode(finalNode);
if (code == IRouter::NoError)

View file

@ -104,6 +104,20 @@ FeatureGraphNode::FeatureGraphNode(NodeID const nodeId, bool const isStartNode,
segment.m_fid = kInvalidFid;
}
FeatureGraphNode::FeatureGraphNode(NodeID const nodeId, NodeID const reverseNodeId,
bool const isStartNode, string const & mwmName)
: segmentPoint(m2::PointD::Zero()), mwmName(mwmName)
{
node.forward_node_id = isStartNode ? nodeId : reverseNodeId;
node.reverse_node_id = isStartNode ? reverseNodeId : nodeId;
node.forward_weight = 0;
node.reverse_weight = 0;
node.forward_offset = 0;
node.reverse_offset = 0;
node.name_id = 1;
segment.m_fid = kInvalidFid;
}
FeatureGraphNode::FeatureGraphNode()
{
node.forward_node_id = INVALID_NODE_ID;

View file

@ -27,6 +27,9 @@ struct FeatureGraphNode
*/
FeatureGraphNode(NodeID const nodeId, bool const isStartNode, string const & mwmName);
FeatureGraphNode(NodeID const nodeId, NodeID const reverseNodeId, bool const isStartNode,
string const & mwmName);
/// \brief Invalid graph node constructor
FeatureGraphNode();
};