SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00009 // An edge the jtr-router may route through 00010 /****************************************************************************/ 00011 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00012 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors 00013 /****************************************************************************/ 00014 // 00015 // This file is part of SUMO. 00016 // SUMO is free software: you can redistribute it and/or modify 00017 // it under the terms of the GNU General Public License as published by 00018 // the Free Software Foundation, either version 3 of the License, or 00019 // (at your option) any later version. 00020 // 00021 /****************************************************************************/ 00022 00023 00024 // =========================================================================== 00025 // included modules 00026 // =========================================================================== 00027 #ifdef _MSC_VER 00028 #include <windows_config.h> 00029 #else 00030 #include <config.h> 00031 #endif 00032 00033 #include <algorithm> 00034 #include <cassert> 00035 #include <utils/common/MsgHandler.h> 00036 #include <utils/common/RandHelper.h> 00037 #include "ROJTREdge.h" 00038 #include <utils/common/RandomDistributor.h> 00039 00040 #ifdef CHECK_MEMORY_LEAKS 00041 #include <foreign/nvwa/debug_new.h> 00042 #endif // CHECK_MEMORY_LEAKS 00043 00044 00045 // =========================================================================== 00046 // method definitions 00047 // =========================================================================== 00048 ROJTREdge::ROJTREdge(const std::string& id, RONode* from, RONode* to, unsigned int index) 00049 : ROEdge(id, from, to, index) {} 00050 00051 00052 ROJTREdge::~ROJTREdge() { 00053 for (FollowerUsageCont::iterator i = myFollowingDefs.begin(); i != myFollowingDefs.end(); i++) { 00054 delete(*i).second; 00055 } 00056 } 00057 00058 00059 void 00060 ROJTREdge::addFollower(ROEdge* s, std::string) { 00061 ROEdge::addFollower(s); 00062 ROJTREdge* js = static_cast<ROJTREdge*>(s); 00063 if (myFollowingDefs.find(js) == myFollowingDefs.end()) { 00064 myFollowingDefs[js] = new ValueTimeLine<SUMOReal>(); 00065 } 00066 } 00067 00068 00069 void 00070 ROJTREdge::addFollowerProbability(ROJTREdge* follower, SUMOTime begTime, 00071 SUMOTime endTime, SUMOReal probability) { 00072 FollowerUsageCont::iterator i = myFollowingDefs.find(follower); 00073 if (i == myFollowingDefs.end()) { 00074 WRITE_ERROR("The edges '" + getID() + "' and '" + follower->getID() + "' are not connected."); 00075 return; 00076 } 00077 (*i).second->add(begTime, endTime, probability); 00078 } 00079 00080 00081 ROJTREdge* 00082 ROJTREdge::chooseNext(const ROVehicle* const veh, SUMOTime time) const { 00083 // if no usable follower exist, return 0 00084 // their probabilities are not yet regarded 00085 if (myFollowingEdges.size() == 0 || (veh != 0 && allFollowersProhibit(veh))) { 00086 return 0; 00087 } 00088 // gather information about the probabilities at this time 00089 RandomDistributor<ROJTREdge*> dist; 00090 { 00091 // use the loaded definitions, first 00092 FollowerUsageCont::const_iterator i; 00093 for (i = myFollowingDefs.begin(); i != myFollowingDefs.end(); i++) { 00094 if ((veh == 0 || !(*i).first->prohibits(veh)) && (*i).second->describesTime(time)) { 00095 dist.add((*i).second->getValue(time), (*i).first); 00096 } 00097 } 00098 } 00099 // if no loaded definitions are valid for this time, try to use the defaults 00100 if (dist.getOverallProb() == 0) { 00101 for (size_t i = 0; i < myParsedTurnings.size(); ++i) { 00102 if (veh == 0 || !myFollowingEdges[i]->prohibits(veh)) { 00103 dist.add(myParsedTurnings[i], static_cast<ROJTREdge*>(myFollowingEdges[i])); 00104 } 00105 } 00106 } 00107 // if still no valid follower exists, return null 00108 if (dist.getOverallProb() == 0) { 00109 return 0; 00110 } 00111 // return one of the possible followers 00112 return dist.get(); 00113 } 00114 00115 00116 void 00117 ROJTREdge::setTurnDefaults(const std::vector<SUMOReal> &defs) { 00118 // I hope, we'll find a less ridiculous solution for this 00119 std::vector<SUMOReal> tmp(defs.size()*myFollowingEdges.size(), 0); 00120 // store in less common multiple 00121 size_t i; 00122 for (i = 0; i < defs.size(); i++) { 00123 for (size_t j = 0; j < myFollowingEdges.size(); j++) { 00124 tmp[i * myFollowingEdges.size() + j] = (SUMOReal) 00125 (defs[i] / 100.0 / (myFollowingEdges.size())); 00126 } 00127 } 00128 // parse from less common multiple 00129 for (i = 0; i < myFollowingEdges.size(); i++) { 00130 SUMOReal value = 0; 00131 for (size_t j = 0; j < defs.size(); j++) { 00132 value += tmp[i * defs.size() + j]; 00133 } 00134 myParsedTurnings.push_back((SUMOReal) value); 00135 } 00136 } 00137 00138 00139 00140 /****************************************************************************/ 00141