SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SUMOVehicleClass.cpp
Go to the documentation of this file.
1 /****************************************************************************/
10 // Definitions of SUMO vehicle classes and helper functions
11 /****************************************************************************/
12 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
13 // Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
14 /****************************************************************************/
15 //
16 // This file is part of SUMO.
17 // SUMO is free software: you can redistribute it and/or modify
18 // it under the terms of the GNU General Public License as published by
19 // the Free Software Foundation, either version 3 of the License, or
20 // (at your option) any later version.
21 //
22 /****************************************************************************/
23 
24 
25 // ===========================================================================
26 // included modules
27 // ===========================================================================
28 #ifdef _MSC_VER
29 #include <windows_config.h>
30 #else
31 #include <config.h>
32 #endif
33 
34 #include <string>
35 #include <map>
36 #include "SUMOVehicleClass.h"
38 #include <utils/common/ToString.h>
41 
42 
43 #ifdef CHECK_MEMORY_LEAKS
44 #include <foreign/nvwa/debug_new.h>
45 #endif // CHECK_MEMORY_LEAKS
46 
47 
48 // ===========================================================================
49 // static members
50 // ===========================================================================
52  {"unknown", SVC_UNKNOWN},
53  {"private", SVC_PRIVATE},
54  {"public_transport", SVC_PUBLIC_TRANSPORT},
55  {"public_emergency", SVC_PUBLIC_EMERGENCY},
56  {"public_authority", SVC_PUBLIC_AUTHORITY},
57  {"public_army", SVC_PUBLIC_ARMY},
58  {"vip", SVC_VIP},
59  {"ignoring", SVC_IGNORING},
60  {"passenger", SVC_PASSENGER},
61  {"hov", SVC_HOV},
62  {"taxi", SVC_TAXI},
63  {"bus", SVC_BUS},
64  {"delivery", SVC_DELIVERY},
65  {"transport", SVC_TRANSPORT},
66  {"lightrail", SVC_LIGHTRAIL},
67  {"cityrail", SVC_CITYRAIL},
68  {"rail_slow", SVC_RAIL_SLOW},
69  {"rail_fast", SVC_RAIL_FAST},
70  {"motorcycle", SVC_MOTORCYCLE},
71  {"bicycle", SVC_BICYCLE},
72  {"pedestrian", SVC_PEDESTRIAN}
73 };
74 
76  sumoVehicleClassStringInitializer, SVC_PEDESTRIAN);
77 
78 
80  {"pedestrian", SVS_PEDESTRIAN},
81  {"bicycle", SVS_BICYCLE},
82  {"motorcycle", SVS_MOTORCYCLE},
83  {"passenger", SVS_PASSENGER},
84  {"passenger/sedan", SVS_PASSENGER_SEDAN},
85  {"passenger/hatchback", SVS_PASSENGER_HATCHBACK},
86  {"passenger/wagon", SVS_PASSENGER_WAGON},
87  {"passenger/van", SVS_PASSENGER_VAN},
88  {"delivery", SVS_DELIVERY},
89  {"transport", SVS_TRANSPORT},
90  {"transport/semitrailer", SVS_TRANSPORT_SEMITRAILER},
91  {"transport/trailer", SVS_TRANSPORT_1TRAILER},
92  {"bus", SVS_BUS},
93  {"bus/city", SVS_BUS_CITY},
94  {"bus/flexible", SVS_BUS_CITY_FLEXIBLE},
95  {"bus/overland", SVS_BUS_OVERLAND},
96  {"bus/trolley", SVS_BUS_TROLLEY},
97  {"rail", SVS_RAIL},
98  {"rail/light", SVS_RAIL_LIGHT},
99  {"rail/city", SVS_RAIL_CITY},
100  {"rail/slow", SVS_RAIL_SLOW},
101  {"rail/fast", SVS_RAIL_FAST},
102  {"rail/cargo", SVS_RAIL_CARGO},
103  {"evehicle", SVS_E_VEHICLE},
104  {"ant", SVS_ANT},
105  {"", SVS_UNKNOWN}
106 };
107 
108 
110  sumoVehicleShapeStringInitializer, SVS_UNKNOWN);
111 
112 
114  {"unknown", SVE_UNKNOWN},
115  // heavy duty vehicles; 3 clusters
116  {"HDV_3_1", SVE_HDV_3_1},
117  {"HDV_3_2", SVE_HDV_3_2},
118  {"HDV_3_3", SVE_HDV_3_3},
119  // heavy duty vehicles; 6 clusters
120  {"HDV_6_1", SVE_HDV_6_1},
121  {"HDV_6_2", SVE_HDV_6_2},
122  {"HDV_6_3", SVE_HDV_6_3},
123  {"HDV_6_4", SVE_HDV_6_4},
124  {"HDV_6_5", SVE_HDV_6_5},
125  {"HDV_6_6", SVE_HDV_6_6},
126  // heavy duty vehicles; 12 clusters
127  {"HDV_12_1", SVE_HDV_12_1},
128  {"HDV_12_2", SVE_HDV_12_2},
129  {"HDV_12_3", SVE_HDV_12_3},
130  {"HDV_12_4", SVE_HDV_12_4},
131  {"HDV_12_5", SVE_HDV_12_5},
132  {"HDV_12_6", SVE_HDV_12_6},
133  {"HDV_12_7", SVE_HDV_12_7},
134  {"HDV_12_8", SVE_HDV_12_8},
135  {"HDV_12_9", SVE_HDV_12_9},
136  {"HDV_12_10", SVE_HDV_12_10},
137  {"HDV_12_11", SVE_HDV_12_11},
138  {"HDV_12_12", SVE_HDV_12_12},
139  // passenger & light duty vehicles; 7 clusters
140  {"P_7_1", SVE_P_LDV_7_1},
141  {"P_7_2", SVE_P_LDV_7_2},
142  {"P_7_3", SVE_P_LDV_7_3},
143  {"P_7_4", SVE_P_LDV_7_4},
144  {"P_7_5", SVE_P_LDV_7_5},
145  {"P_7_6", SVE_P_LDV_7_6},
146  {"P_7_7", SVE_P_LDV_7_7},
147  // passenger & light duty vehicles; 14 clusters
148  {"P_14_1", SVE_P_LDV_14_1},
149  {"P_14_2", SVE_P_LDV_14_2},
150  {"P_14_3", SVE_P_LDV_14_3},
151  {"P_14_4", SVE_P_LDV_14_4},
152  {"P_14_5", SVE_P_LDV_14_5},
153  {"P_14_6", SVE_P_LDV_14_6},
154  {"P_14_7", SVE_P_LDV_14_7},
155  {"P_14_8", SVE_P_LDV_14_8},
156  {"P_14_9", SVE_P_LDV_14_9},
157  {"P_14_10", SVE_P_LDV_14_10},
158  {"P_14_11", SVE_P_LDV_14_11},
159  {"P_14_12", SVE_P_LDV_14_12},
160  {"P_14_13", SVE_P_LDV_14_13},
161  {"P_14_14", SVE_P_LDV_14_14},
162  // no emissions
163  {"zero", SVE_ZERO_EMISSIONS},
164  // heavy duty vehicles, no accel; 3 clusters
165  {"HDV_A0_3_1", SVE_HDV_A0_3_1},
166  {"HDV_A0_3_2", SVE_HDV_A0_3_2},
167  {"HDV_A0_3_3", SVE_HDV_A0_3_3},
168  // heavy duty vehicles, no accel; 6 clusters
169  {"HDV_A0_6_1", SVE_HDV_A0_6_1},
170  {"HDV_A0_6_2", SVE_HDV_A0_6_2},
171  {"HDV_A0_6_3", SVE_HDV_A0_6_3},
172  {"HDV_A0_6_4", SVE_HDV_A0_6_4},
173  {"HDV_A0_6_5", SVE_HDV_A0_6_5},
174  {"HDV_A0_6_6", SVE_HDV_A0_6_6},
175  // heavy duty vehicles, no accel; 12 clusters
176  {"HDV_A0_12_1", SVE_HDV_A0_12_1},
177  {"HDV_A0_12_2", SVE_HDV_A0_12_2},
178  {"HDV_A0_12_3", SVE_HDV_A0_12_3},
179  {"HDV_A0_12_4", SVE_HDV_A0_12_4},
180  {"HDV_A0_12_5", SVE_HDV_A0_12_5},
181  {"HDV_A0_12_6", SVE_HDV_A0_12_6},
182  {"HDV_A0_12_7", SVE_HDV_A0_12_7},
183  {"HDV_A0_12_8", SVE_HDV_A0_12_8},
184  {"HDV_A0_12_9", SVE_HDV_A0_12_9},
185  {"HDV_A0_12_10", SVE_HDV_A0_12_10},
186  {"HDV_A0_12_11", SVE_HDV_A0_12_11},
187  {"HDV_A0_12_12", SVE_HDV_A0_12_12},
188  // passenger & light duty vehicles, no accel; 7 clusters
189  {"P_A0_7_1", SVE_P_LDV_A0_7_1},
190  {"P_A0_7_2", SVE_P_LDV_A0_7_2},
191  {"P_A0_7_3", SVE_P_LDV_A0_7_3},
192  {"P_A0_7_4", SVE_P_LDV_A0_7_4},
193  {"P_A0_7_5", SVE_P_LDV_A0_7_5},
194  {"P_A0_7_6", SVE_P_LDV_A0_7_6},
195  {"P_A0_7_7", SVE_P_LDV_A0_7_7},
196  // passenger & light duty vehicles, no accel; 14 clusters
197  {"P_A0_14_1", SVE_P_LDV_A0_14_1},
198  {"P_A0_14_2", SVE_P_LDV_A0_14_2},
199  {"P_A0_14_3", SVE_P_LDV_A0_14_3},
200  {"P_A0_14_4", SVE_P_LDV_A0_14_4},
201  {"P_A0_14_5", SVE_P_LDV_A0_14_5},
202  {"P_A0_14_6", SVE_P_LDV_A0_14_6},
203  {"P_A0_14_7", SVE_P_LDV_A0_14_7},
204  {"P_A0_14_8", SVE_P_LDV_A0_14_8},
205  {"P_A0_14_9", SVE_P_LDV_A0_14_9},
206  {"P_A0_14_10", SVE_P_LDV_A0_14_10},
207  {"P_A0_14_11", SVE_P_LDV_A0_14_11},
208  {"P_A0_14_12", SVE_P_LDV_A0_14_12},
209  {"P_A0_14_13", SVE_P_LDV_A0_14_13},
210  {"P_A0_14_14", SVE_P_LDV_A0_14_14}
211 };
212 
214  SumoEmissionClassStringInitializer, SVE_P_LDV_A0_14_14);
215 
216 
217 // ===========================================================================
218 // additional constants
219 // ===========================================================================
220 
223 
224 // ===========================================================================
225 // method definitions
226 // ===========================================================================
227 // ------------ Conversion of SUMOVehicleClass
228 
229 std::string
231  std::string ret;
232  const std::vector<std::string> names = SumoVehicleClassStrings.getStrings();
233  for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
234  if ((id & SumoVehicleClassStrings.get(*it))) {
235  ret += ("|" + *it);
236  }
237  }
238  if (ret.length() > 0) {
239  return ret.substr(1);
240  } else {
241  return ret;
242  }
243 }
244 
245 
246 std::string
248  return joinToString(getAllowedVehicleClassNamesList(permissions), ' ');
249 }
250 
251 
252 std::vector<std::string>
255  const std::vector<std::string> classNames = SumoVehicleClassStrings.getStrings();
256  std::vector<std::string> result;
257  for (std::vector<std::string>::const_iterator it = classNames.begin(); it != classNames.end(); it++) {
258  const int svc = (int)SumoVehicleClassStrings.get(*it);
259  if ((svc & permissions) == svc && svc != SVC_UNKNOWN) {
260  result.push_back(*it);
261  }
262  }
263  return result;
264 }
265 
266 
267 std::pair<std::string, bool>
269  // shortcut the common cases
270  if (permissions == SVCFreeForAll) {
271  return std::pair<std::string, bool>("", false); // nothing disallowed
272  }
273  // figure out whether its shorter to write allow or disallow
274  // @note: this code assumes that enum values are assigned contiguous powers of 2 from 1 to SUMOVehicleClass_MAX
275  size_t num_allowed = 0;
276  for (int mask = 1; mask <= SUMOVehicleClass_MAX; mask = mask << 1) {
277  if ((mask & permissions) == mask) {
278  ++num_allowed;
279  }
280  }
281  if (num_allowed <= (SumoVehicleClassStrings.size() - num_allowed) && num_allowed > 0) {
282  return std::pair<std::string, bool>(getAllowedVehicleClassNames(permissions), true);
283  } else {
284  return std::pair<std::string, bool>(getAllowedVehicleClassNames(~permissions), false);
285  }
286 }
287 
288 
290 getVehicleClassID(const std::string& name) {
291  if (SumoVehicleClassStrings.hasString(name)) {
292  return SumoVehicleClassStrings.get(name);
293  }
294  throw ProcessError("Unknown vehicle class '" + name + "'.");
295 }
296 
297 
298 int
299 getVehicleClassCompoundID(const std::string& name) {
300  int ret = SVC_UNKNOWN;
301  const std::vector<std::string> names = SumoVehicleClassStrings.getStrings();
302  for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
303  if (name.find(*it) != std::string::npos) {
304  ret = ret | (int) SumoVehicleClassStrings.get(*it);
305  }
306  }
307  return ret;
308 }
309 
310 
312 parseVehicleClasses(const std::string& allowedS) {
313  SVCPermissions result = 0;
314  StringTokenizer sta(allowedS, " ");
315  while (sta.hasNext()) {
316  result |= getVehicleClassID(sta.next());
317  }
318  return result;
319 }
320 
321 
322 bool
323 canParseVehicleClasses(const std::string& classes) {
324  StringTokenizer sta(classes, " ");
325  while (sta.hasNext()) {
326  if (!SumoVehicleClassStrings.hasString(sta.next())) {
327  return false;
328  }
329  }
330  return true;
331 }
332 
333 
334 extern SVCPermissions parseVehicleClasses(const std::string& allowedS, const std::string& disallowedS) {
335  if (allowedS.size() == 0 && disallowedS.size() == 0) {
336  return SVCFreeForAll;
337  } else if (allowedS.size() > 0 && disallowedS.size() > 0) {
338  WRITE_WARNING("SVCPermissions must be specified either via 'allow' or 'disallow'. Ignoring 'disallow'");
339  return parseVehicleClasses(allowedS);
340  } else if (allowedS.size() > 0) {
341  return parseVehicleClasses(allowedS);
342  } else {
343  return ~parseVehicleClasses(disallowedS);
344  }
345 }
346 
347 
349 parseVehicleClasses(const std::vector<std::string>& allowedS) {
350  SVCPermissions result = 0;
351  for (std::vector<std::string>::const_iterator i = allowedS.begin(); i != allowedS.end(); ++i) {
352  result |= getVehicleClassID(*i);
353  }
354  return result;
355 }
356 
357 
359 getVehicleShapeID(const std::string& name) {
360  if (SumoVehicleShapeStrings.hasString(name)) {
361  return SumoVehicleShapeStrings.get(name);
362  } else {
363  throw ProcessError("Unknown vehicle shape '" + name + "'.");
364  }
365 }
366 
367 
368 std::string
370  return SumoVehicleShapeStrings.getString(id);
371 }
372 
373 
374 bool isRailway(SVCPermissions permissions) {
375  const int anyRail = SVC_RAIL_FAST + SVC_RAIL_SLOW + SVC_CITYRAIL + SVC_LIGHTRAIL;
376  return (permissions & anyRail) > 0 && (permissions & SVC_PASSENGER) == 0;
377 }
378 
379 // ------------ Conversion of SUMOEmissionClass
381 getVehicleEmissionTypeID(const std::string& name) {
382  if (SumoEmissionClassStrings.hasString(name)) {
383  return SumoEmissionClassStrings.get(name);
384  } else {
385  throw ProcessError("Unknown emission type '" + name + "'.");
386  }
387 }
388 
389 std::string
391  return SumoEmissionClassStrings.getString(id);
392 }
393 
394 
395 const std::string DEFAULT_VTYPE_ID("DEFAULT_VEHTYPE");
396 const SUMOReal DEFAULT_VEH_MAXSPEED(70.0);
397 const SUMOReal DEFAULT_VEH_ACCEL(2.6);
398 const SUMOReal DEFAULT_VEH_DECEL(4.5);
399 const SUMOReal DEFAULT_VEH_SIGMA(0.5);
400 const SUMOReal DEFAULT_VEH_LENGTH(5.);
401 const SUMOReal DEFAULT_VEH_MINGAP(2.5);
402 const SUMOReal DEFAULT_VEH_TAU(1.);
404 const SUMOReal DEFAULT_VEH_PROB(1.);
407 const SUMOReal DEFAULT_VEH_WIDTH(2.);
408 const SUMOReal DEFAULT_VEH_HEIGHT(1.5);
410 const std::string DEFAULT_VEH_LANE_CHANGE_MODEL("dkrajzew2008");
412 const SUMOReal DEFAULT_VEH_TMP1(1.);
413 const SUMOReal DEFAULT_VEH_TMP2(1.);
414 const SUMOReal DEFAULT_VEH_TMP3(1.);
415 const SUMOReal DEFAULT_VEH_TMP4(1.);
416 const SUMOReal DEFAULT_VEH_TMP5(1.);
417 
418 const SUMOReal DEFAULT_PERSON_SPEED(5. / 3.6);
419 
420 /****************************************************************************/
421