Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
ROJTREdge.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2004-2024 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
21// An edge the jtr-router may route through
22/****************************************************************************/
23#include <config.h>
24
25#include <algorithm>
26#include <cassert>
29#include "ROJTREdge.h"
31
32
33// ===========================================================================
34// method definitions
35// ===========================================================================
36ROJTREdge::ROJTREdge(const std::string& id, RONode* from, RONode* to, int index, const int priority) :
37 ROEdge(id, from, to, index, priority),
38 mySourceFlows(0)
39{}
40
41
43 for (FollowerUsageCont::iterator i = myFollowingDefs.begin(); i != myFollowingDefs.end(); ++i) {
44 delete (*i).second;
45 }
46}
47
48
49void
50ROJTREdge::addSuccessor(ROEdge* s, ROEdge* via, std::string dir) {
51 ROEdge::addSuccessor(s, via, dir);
52 ROJTREdge* js = static_cast<ROJTREdge*>(s);
53 if (myFollowingDefs.find(js) == myFollowingDefs.end()) {
55 }
56}
57
58
59void
61 double endTime, double probability) {
62 FollowerUsageCont::iterator i = myFollowingDefs.find(follower);
63 if (i == myFollowingDefs.end()) {
64 WRITE_ERRORF(TL("The edges '%' and '%' are not connected."), getID(), follower->getID());
65 return;
66 }
67 (*i).second->add(begTime, endTime, probability);
68}
69
70
72ROJTREdge::chooseNext(const ROVehicle* const veh, double time, const std::set<const ROEdge*>& avoid) const {
73 // if no usable follower exist, return 0
74 // their probabilities are not yet regarded
75 if (myFollowingEdges.size() == 0 || (veh != nullptr && allFollowersProhibit(veh))) {
76 return nullptr;
77 }
78 // gather information about the probabilities at this time
80 // use the loaded definitions, first
81 for (FollowerUsageCont::const_iterator i = myFollowingDefs.begin(); i != myFollowingDefs.end(); ++i) {
82 if (avoid.count(i->first) == 0) {
83 if ((veh == nullptr || !(*i).first->prohibits(veh)) && (*i).second->describesTime(time)) {
84 dist.add((*i).first, (*i).second->getValue(time));
85 }
86 }
87 }
88 // if no loaded definitions are valid for this time, try to use the defaults
89 if (dist.getOverallProb() == 0) {
90 for (int i = 0; i < (int)myParsedTurnings.size(); ++i) {
91 if (avoid.count(myFollowingEdges[i]) == 0) {
92 if (veh == nullptr || !myFollowingEdges[i]->prohibits(veh)) {
93 dist.add(static_cast<ROJTREdge*>(myFollowingEdges[i]), myParsedTurnings[i]);
94 }
95 }
96 }
97 }
98 // if still no valid follower exists, return null
99 if (dist.getOverallProb() == 0) {
100 return nullptr;
101 }
102 // return one of the possible followers
103 return dist.get();
104}
105
106
107void
108ROJTREdge::setTurnDefaults(const std::vector<double>& defs) {
109 // I hope, we'll find a less ridiculous solution for this
110 std::vector<double> tmp(defs.size()*myFollowingEdges.size(), 0);
111 // store in less common multiple
112 for (int i = 0; i < (int)defs.size(); ++i) {
113 for (int j = 0; j < (int)myFollowingEdges.size(); ++j) {
114 tmp[i * myFollowingEdges.size() + j] = defs[i] / 100. / (double)myFollowingEdges.size();
115 }
116 }
117 // parse from less common multiple
118 for (int i = 0; i < (int)myFollowingEdges.size(); ++i) {
119 double value = 0;
120 for (int j = 0; j < (int)defs.size(); ++j) {
121 value += tmp[i * defs.size() + j];
122 }
123 myParsedTurnings.push_back((double) value);
124 }
125}
126
127
128/****************************************************************************/
#define WRITE_ERRORF(...)
Definition MsgHandler.h:305
#define TL(string)
Definition MsgHandler.h:315
const std::string & getID() const
Returns the id.
Definition Named.h:74
A basic edge for routing applications.
Definition ROEdge.h:72
bool allFollowersProhibit(const ROVehicle *const vehicle) const
Returns whether this edge succeeding edges prohibit the given vehicle to pass them.
Definition ROEdge.cpp:343
bool prohibits(const ROVehicle *const vehicle) const
Returns whether this edge prohibits the given vehicle to pass it.
Definition ROEdge.h:280
ROEdgeVector myFollowingEdges
List of edges that may be approached from this edge.
Definition ROEdge.h:620
virtual void addSuccessor(ROEdge *s, ROEdge *via=nullptr, std::string dir="")
Adds information about a connected edge.
Definition ROEdge.cpp:113
An edge the jtr-router may route through.
Definition ROJTREdge.h:48
void addFollowerProbability(ROJTREdge *follower, double begTime, double endTime, double probability)
adds the information about the percentage of using a certain follower
Definition ROJTREdge.cpp:60
void setTurnDefaults(const std::vector< double > &defs)
Sets the turning definition defaults.
ROJTREdge * chooseNext(const ROVehicle *const veh, double time, const std::set< const ROEdge * > &avoid) const
Returns the next edge to use.
Definition ROJTREdge.cpp:72
FollowerUsageCont myFollowingDefs
Storage for the probabilities of using a certain follower over time.
Definition ROJTREdge.h:117
ROJTREdge(const std::string &id, RONode *from, RONode *to, int index, const int priority)
Constructor.
Definition ROJTREdge.cpp:36
void addSuccessor(ROEdge *s, ROEdge *via=nullptr, std::string dir="")
Adds information about a connected edge.
Definition ROJTREdge.cpp:50
~ROJTREdge()
Destructor.
Definition ROJTREdge.cpp:42
std::vector< double > myParsedTurnings
The defaults for turnings.
Definition ROJTREdge.h:120
Base class for nodes used by the router.
Definition RONode.h:46
A vehicle as used by router.
Definition ROVehicle.h:50
Represents a generic random distribution.
double getOverallProb() const
Return the sum of the probabilites assigned to the members.
T get(SumoRNG *which=nullptr) const
Draw a sample of the distribution.
bool add(T val, double prob, bool checkDuplicates=true)
Adds a value with an assigned probability to the distribution.