SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RODFRouteCont.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // A container for routes
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
12 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include <fstream>
34 #include <cassert>
35 #include "RODFRouteDesc.h"
36 #include "RODFRouteCont.h"
37 #include "RODFNet.h"
38 #include <router/ROEdge.h>
39 #include <utils/common/ToString.h>
41 
42 #ifdef CHECK_MEMORY_LEAKS
43 #include <foreign/nvwa/debug_new.h>
44 #endif // CHECK_MEMORY_LEAKS
45 
46 
47 // ===========================================================================
48 // method definitions
49 // ===========================================================================
51 
52 
54 }
55 
56 
57 void
59  // routes may be duplicate as in-between routes may have different starting points
60  if (find_if(myRoutes.begin(), myRoutes.end(), route_finder(desc)) == myRoutes.end()) {
61  // compute route id
62  setID(desc);
63  myRoutes.push_back(desc);
64  } else {
65  RODFRouteDesc& prev = *find_if(myRoutes.begin(), myRoutes.end(), route_finder(desc));
66  prev.overallProb += desc.overallProb;
67  }
68 }
69 
70 
71 bool
73  std::vector<RODFRouteDesc>::const_iterator j = find_if(myRoutes.begin(), myRoutes.end(), route_finder(desc));
74  if (j == myRoutes.end()) {
75  return false;
76  }
77  return true;
78 }
79 
80 
81 bool
82 RODFRouteCont::save(std::vector<std::string> &saved,
83  const std::string& prependix, OutputDevice& out) {
84  bool haveSavedOneAtLeast = false;
85  for (std::vector<RODFRouteDesc>::const_iterator j = myRoutes.begin(); j != myRoutes.end(); ++j) {
86  const RODFRouteDesc& desc = (*j);
87  if (find(saved.begin(), saved.end(), desc.routename) != saved.end()) {
88  continue;
89  }
90  saved.push_back((*j).routename);
91  assert(desc.edges2Pass.size() >= 1);
92  out << " <route id=\"" << prependix << desc.routename << "\" edges=\"";
93  for (std::vector<ROEdge*>::const_iterator k = desc.edges2Pass.begin(); k != desc.edges2Pass.end(); k++) {
94  if (k != desc.edges2Pass.begin()) {
95  out << ' ';
96  }
97  out << (*k)->getID();
98  }
99  out << "\"/>\n";
100  haveSavedOneAtLeast = true;
101  }
102  return haveSavedOneAtLeast;
103 }
104 
105 
106 void
108  sort(myRoutes.begin(), myRoutes.end(), by_distance_sorter());
109 }
110 
111 
112 void
113 RODFRouteCont::removeIllegal(const std::vector<std::vector<ROEdge*> > &illegals) {
114  for (std::vector<RODFRouteDesc>::iterator i = myRoutes.begin(); i != myRoutes.end();) {
115  RODFRouteDesc& desc = *i;
116  bool remove = false;
117  for (std::vector<std::vector<ROEdge*> >::const_iterator j = illegals.begin(); !remove && j != illegals.end(); ++j) {
118  int noFound = 0;
119  for (std::vector<ROEdge*>::const_iterator k = (*j).begin(); !remove && k != (*j).end(); ++k) {
120  if (find(desc.edges2Pass.begin(), desc.edges2Pass.end(), *k) != desc.edges2Pass.end()) {
121  noFound++;
122  if (noFound > 1) {
123  remove = true;
124  }
125  }
126  }
127  }
128  if (remove) {
129  i = myRoutes.erase(i);
130  } else {
131  ++i;
132  }
133  }
134 }
135 
136 
137 void
139  std::vector<RODFRouteDesc> newRoutes;
140  for (std::vector<RODFRouteDesc>::iterator i = myRoutes.begin(); i != myRoutes.end(); ++i) {
141  RODFRouteDesc& desc = *i;
142  ROEdge* last = *(desc.edges2Pass.end() - 1);
143  if (last->getNoFollowing() == 0) {
144  newRoutes.push_back(desc);
145  continue;
146  }
147  for (unsigned int j = 0; j < last->getNoFollowing(); ++j) {
148  RODFRouteDesc ndesc(desc);
149  ndesc.edges2Pass.push_back(last->getFollower(j));
150  setID(ndesc);
151  newRoutes.push_back(ndesc);
152  }
153  }
154  myRoutes = newRoutes;
155 }
156 
157 
158 void
160  std::pair<ROEdge*, ROEdge*> c(desc.edges2Pass[0], desc.edges2Pass.back());
161  desc.routename = c.first->getID() + "_to_" + c.second->getID();
162  if (myConnectionOccurences.find(c) == myConnectionOccurences.end()) {
163  myConnectionOccurences[c] = 0;
164  } else {
166  desc.routename = desc.routename + "_" + toString(myConnectionOccurences[c]);
167  }
168 }
169 
170 
171 
172 /****************************************************************************/
173