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.org/sumo
3 // Copyright (C) 2004-2018 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
18 // An edge the jtr-router may route through
19 /****************************************************************************/
20 
21 
22 // ===========================================================================
23 // included modules
24 // ===========================================================================
25 #include <config.h>
26 
27 #include <algorithm>
28 #include <cassert>
31 #include "ROJTREdge.h"
33 
34 
35 // ===========================================================================
36 // method definitions
37 // ===========================================================================
38 ROJTREdge::ROJTREdge(const std::string& id, RONode* from, RONode* to, int index, const int priority)
39  : ROEdge(id, from, to, index, priority) {}
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_ERROR("The edges '" + getID() + "' and '" + follower->getID() + "' are not connected.");
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] = (double)(defs[i] / 100.0 / (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 
129 /****************************************************************************/
130 
FollowerUsageCont myFollowingDefs
Storage for the probabilities of using a certain follower over time.
Definition: ROJTREdge.h:111
bool allFollowersProhibit(const ROVehicle *const vehicle) const
Returns whether this edge succeeding edges prohibit the given vehicle to pass them.
Definition: ROEdge.cpp:309
Represents a generic random distribution.
bool prohibits(const ROVehicle *const vehicle) const
Returns whether this edge prohibits the given vehicle to pass it.
Definition: ROEdge.h:264
const std::string & getID() const
Returns the id.
Definition: Named.h:78
std::vector< double > myParsedTurnings
The defaults for turnings.
Definition: ROJTREdge.h:114
ROEdgeVector myFollowingEdges
List of edges that may be approached from this edge.
Definition: ROEdge.h:525
A vehicle as used by router.
Definition: ROVehicle.h:53
T get(std::mt19937 *which=0) const
Draw a sample of the distribution.
An edge the jtr-router may route through.
Definition: ROJTREdge.h:51
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
A basic edge for routing applications.
Definition: ROEdge.h:72
~ROJTREdge()
Destructor.
Definition: ROJTREdge.cpp:42
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:247
ROJTREdge(const std::string &id, RONode *from, RONode *to, int index, const int priority)
Constructor.
Definition: ROJTREdge.cpp:38
virtual void addSuccessor(ROEdge *s, ROEdge *via=nullptr, std::string dir="")
Adds information about a connected edge.
Definition: ROEdge.cpp:103
void setTurnDefaults(const std::vector< double > &defs)
Sets the turning definition defaults.
Definition: ROJTREdge.cpp:108
double getOverallProb() const
Return the sum of the probabilites assigned to the members.
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
Base class for nodes used by the router.
Definition: RONode.h:46
void addSuccessor(ROEdge *s, ROEdge *via=nullptr, std::string dir="")
Adds information about a connected edge.
Definition: ROJTREdge.cpp:50
bool add(T val, double prob, bool checkDuplicates=true)
Adds a value with an assigned probability to the distribution.