ROJTREdge.cpp
Go to the documentation of this file.00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029
00030 #include <algorithm>
00031 #include <cassert>
00032 #include <utils/common/MsgHandler.h>
00033 #include <utils/common/RandHelper.h>
00034 #include "ROJTREdge.h"
00035 #include <utils/common/RandomDistributor.h>
00036
00037 #ifdef CHECK_MEMORY_LEAKS
00038 #include <foreign/nvwa/debug_new.h>
00039 #endif // CHECK_MEMORY_LEAKS
00040
00041
00042
00043
00044
00045 ROJTREdge::ROJTREdge(const std::string &id, RONode *from, RONode *to, unsigned int index) throw()
00046 : ROEdge(id, from, to, index, false) {}
00047
00048
00049 ROJTREdge::~ROJTREdge() throw() {
00050 for (FollowerUsageCont::iterator i=myFollowingDefs.begin(); i!=myFollowingDefs.end(); i++) {
00051 delete(*i).second;
00052 }
00053 }
00054
00055
00056 void
00057 ROJTREdge::addFollower(ROEdge *s) throw() {
00058 ROEdge::addFollower(s);
00059 ROJTREdge *js = static_cast<ROJTREdge*>(s);
00060 if (myFollowingDefs.find(js)==myFollowingDefs.end()) {
00061 myFollowingDefs[js] = new ValueTimeLine<SUMOReal>();
00062 }
00063 }
00064
00065
00066 void
00067 ROJTREdge::addFollowerProbability(ROJTREdge *follower, SUMOTime begTime,
00068 SUMOTime endTime, SUMOReal probability) {
00069 FollowerUsageCont::iterator i = myFollowingDefs.find(follower);
00070 if (i==myFollowingDefs.end()) {
00071 MsgHandler::getErrorInstance()->inform("The edges '" + getID() + "' and '" + follower->getID() + "' are not connected.");
00072 return;
00073 }
00074 (*i).second->add(begTime, endTime, probability);
00075 }
00076
00077
00078 ROJTREdge *
00079 ROJTREdge::chooseNext(const ROVehicle * const veh, SUMOTime time) const {
00080
00081
00082 if (myFollowingEdges.size()==0 || (veh!=0 && allFollowersProhibit(veh))) {
00083 return 0;
00084 }
00085
00086 RandomDistributor<ROJTREdge*> dist;
00087 {
00088
00089 FollowerUsageCont::const_iterator i;
00090 for (i=myFollowingDefs.begin(); i!=myFollowingDefs.end(); i++) {
00091 if ((veh==0 || !(*i).first->prohibits(veh)) && (*i).second->describesTime(time)) {
00092 dist.add((*i).second->getValue(time), (*i).first);
00093 }
00094 }
00095 }
00096
00097 if (dist.getOverallProb()==0) {
00098 for (size_t i=0; i<myParsedTurnings.size(); ++i) {
00099 if (veh==0 || !myFollowingEdges[i]->prohibits(veh)) {
00100 dist.add(myParsedTurnings[i], static_cast<ROJTREdge*>(myFollowingEdges[i]));
00101 }
00102 }
00103 }
00104
00105 if (dist.getOverallProb()==0) {
00106 return 0;
00107 }
00108
00109 return dist.get();
00110 }
00111
00112
00113 void
00114 ROJTREdge::setTurnDefaults(const std::vector<SUMOReal> &defs) {
00115
00116 std::vector<SUMOReal> tmp(defs.size()*myFollowingEdges.size(), 0);
00117
00118 size_t i;
00119 for (i=0; i<defs.size(); i++) {
00120 for (size_t j=0; j<myFollowingEdges.size(); j++) {
00121 tmp[i*myFollowingEdges.size()+j] = (SUMOReal)
00122 (defs[i] / 100.0 / (myFollowingEdges.size()));
00123 }
00124 }
00125
00126 for (i=0; i<myFollowingEdges.size(); i++) {
00127 SUMOReal value = 0;
00128 for (size_t j=0; j<defs.size(); j++) {
00129 value += tmp[i*defs.size()+j];
00130 }
00131 myParsedTurnings.push_back((SUMOReal) value);
00132 }
00133 }
00134
00135
00136
00137
00138