SUMO - Simulation of Urban MObility
ROJTREdge.cpp
Go to the documentation of this file.
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 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines