MCPcopy Create free account
hub / github.com/comaps/comaps / GetPenalties

Method GetPenalties

libs/routing/index_graph.cpp:437–507  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

435}
436
437RouteWeight IndexGraph::GetPenalties(EdgeEstimator::Purpose purpose, Segment const & u, Segment const & v,
438 optional<RouteWeight> const & prevWeight) const
439{
440 auto const & fromPenaltyData = GetRoadPenaltyData(u);
441 auto const & toPenaltyData = GetRoadPenaltyData(v);
442 // Route crosses border of pass-through/non-pass-through area if |u| and |v| have different
443 // pass through restrictions.
444 int8_t const passThroughPenalty = fromPenaltyData.m_passThroughAllowed == toPenaltyData.m_passThroughAllowed ? 0 : 1;
445
446 int8_t accessPenalty = 0;
447 int8_t accessConditionalPenalties = 0;
448
449 if (u.GetFeatureId() != v.GetFeatureId())
450 {
451 // We do not distinguish between RoadAccess::Type::Private and RoadAccess::Type::Destination for
452 // now.
453 auto const [fromAccess, fromConfidence] = prevWeight ? m_roadAccess.GetAccess(u.GetFeatureId(), *prevWeight)
454 : m_roadAccess.GetAccessWithoutConditional(u.GetFeatureId());
455
456 auto const [toAccess, toConfidence] = prevWeight ? m_roadAccess.GetAccess(v.GetFeatureId(), *prevWeight)
457 : m_roadAccess.GetAccessWithoutConditional(v.GetFeatureId());
458
459 if (fromConfidence == RoadAccess::Confidence::Sure && toConfidence == RoadAccess::Confidence::Sure)
460 {
461 bool const fromAccessAllowed = fromAccess == RoadAccess::Type::Yes;
462 bool const toAccessAllowed = toAccess == RoadAccess::Type::Yes;
463 // Route crosses border of access=yes/access={private, destination} area if |u| and |v| have
464 // different access restrictions.
465 accessPenalty = fromAccessAllowed == toAccessAllowed ? 0 : 1;
466 }
467 else if (toConfidence == RoadAccess::Confidence::Maybe)
468 {
469 accessConditionalPenalties = 1;
470 }
471 }
472
473 // RoadPoint between u and v is front of u.
474 auto const rp = u.GetRoadPoint(true /* front */);
475 auto const [rpAccessType, rpConfidence] =
476 prevWeight ? m_roadAccess.GetAccess(rp, *prevWeight) : m_roadAccess.GetAccessWithoutConditional(rp);
477 // Get penalty from new penalty system if MWM supports it
478 auto penalty = m_roadPenalty.GetPenalty(rp);
479 uint16_t penaltyTime = 0;
480 if (penalty)
481 penaltyTime = penalty->m_timeSeconds;
482
483 switch (rpConfidence)
484 {
485 case RoadAccess::Confidence::Sure:
486 {
487 if (rpAccessType != RoadAccess::Type::Yes)
488 accessPenalty = 1;
489 break;
490 }
491 case RoadAccess::Confidence::Maybe:
492 {
493 accessConditionalPenalties = 1;
494 break;

Callers

nothing calls this directly

Calls 9

IsUTurnFunction · 0.85
IsBoardingFunction · 0.85
GetAccessMethod · 0.80
GetRoadPointMethod · 0.80
GetFeatureIdMethod · 0.45
GetPenaltyMethod · 0.45
GetUTurnPenaltyMethod · 0.45

Tested by

no test coverage detected