Eclipse SUMO - Simulation of Urban MObility
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 // ===========================================================================
36 ROJTREdge::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 
49 void
50 ROJTREdge::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 
59 void
60 ROJTREdge::addFollowerProbability(ROJTREdge* follower, double begTime,
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 
71 ROJTREdge*
72 ROJTREdge::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 
107 void
108 ROJTREdge::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:70
bool allFollowersProhibit(const ROVehicle *const vehicle) const
Returns whether this edge succeeding edges prohibit the given vehicle to pass them.
Definition: ROEdge.cpp:341
bool prohibits(const ROVehicle *const vehicle) const
Returns whether this edge prohibits the given vehicle to pass it.
Definition: ROEdge.h:278
ROEdgeVector myFollowingEdges
List of edges that may be approached from this edge.
Definition: ROEdge.h:609
virtual void addSuccessor(ROEdge *s, ROEdge *via=nullptr, std::string dir="")
Adds information about a connected edge.
Definition: ROEdge.cpp:111
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.
Definition: ROJTREdge.cpp:108
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:43
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.