Eclipse SUMO - Simulation of Urban MObility
FareModul.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2002-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
14 // Fare Modul for calculating prices during intermodal routing
15 /****************************************************************************/
16 #ifndef SUMO_FAREMODUL_H
17 #define SUMO_FAREMODUL_H
18 
19 // ===========================================================================
20 // included modules
21 // ===========================================================================
22 #include <config.h>
23 
24 #include <cassert>
25 #include <string>
26 #include <vector>
27 #include "EffortCalculator.h"
28 #include "FareToken.h"
29 #include "FareZones.h"
30 
31 
32 // ===========================================================================
33 // class definitions
34 // ===========================================================================
35 class ZoneCounter {
36 public:
37 
38  explicit ZoneCounter(unsigned int ct) :
39  myCount(ct) {
40 
41  }
42 
43  inline void addZone(int zoneNumber) {
44  zoneNumber = getOverlayZone(zoneNumber);
45  if (zoneNumber == 0) {
46  return;
47  }
48  long long int repNum = fareZoneToRep[zoneNumber];
49  //assert power of 2
50  if (bitcount(repNum) == 0) {
51  return;
52  }
53  myCount = myCount | repNum;
54  }
55 
56 
57  int numZones() const {
58  return bitcount(myCount);
59  }
60 
61 
62 private:
63  inline int bitcount(long long int intVal) const {
64  int count = 0;
65  long long int counter = intVal;
66 
67  while (counter != 0) {
68  counter = counter & (counter - 1);
69  ++count;
70  }
71  return count;
72  }
73 
74 private:
75  long long int myCount;
76 
77 
78 };
79 
80 
81 
86 struct FareState {
87  friend class FareModul;
88 
89 public:
90 
92  explicit FareState():
93  myFareToken(FareToken::None),
94  myCounter(std::numeric_limits<int>::max()),
95  myTravelledDistance(std::numeric_limits<double>::max()),
96  myVisistedStops(std::numeric_limits<int>::max()),
97  myPriceDiff(0) {
98  };
99 
104  explicit FareState(FareToken token):
105  myFareToken(token),
106  myCounter(0),
108  myVisistedStops(0),
109  myPriceDiff(0) {}
110 
112  ~FareState() = default;
113 
118  bool isValid() const {
119  return !(myFareToken == FareToken::None);
120  }
121 
122 private:
123 
133  double myPriceDiff;
134 
135 };
136 
137 
138 
139 struct Prices {
140 
141 
142 
144  std::vector<double> zonePrices = std::vector<double> {1.9, 3.4, 4.9, 6.2, 7.7, 9.2};
145  double halle = 2.3;
146  double leipzig = 2.7;
147  double t1 = 1.5;
148  double t2 = 1.6;
149  double t3 = 1.6;
150  double shortTrip = 1.6;
151  double shortTripLeipzig = 1.9;
152  double shortTripHalle = 1.7;
153  double maxPrice = 10.6;
154 };
155 
156 
160 class FareModul : public EffortCalculator {
161 public:
162 
165  myFareStates()
166  {};
167 
169  void init(const std::vector<std::string>& edges) override {
170  myEdges = edges;
171  myFareStates.resize(edges.size());
172  }
173 
174  void addStop(const int stopEdge, const Parameterised& params) override {
175  myStopFareZone[stopEdge] = StringUtils::toInt(params.getParameter("fareZone"));
176  myStopFareToken[stopEdge] = FareUtil::stringToToken(params.getParameter("fareToken"));
177  myStopStartToken[stopEdge] = FareUtil::stringToToken(params.getParameter("startToken"));
178  }
179 
181  double getEffort(const int numericalID) const override {
182  double effort = 0;
183  FareState const& state = myFareStates.at(numericalID);
184  if (state.isValid()) {
185  effort = state.myPriceDiff;
186  } else {
187  effort = std::numeric_limits<double>::max();
188  }
189  return effort;
190  }
191 
193  void update(const int edge, const int prev, const double length) override {
194 
195  std::string const& edgeType = myEdges[edge];
196 
197  //get propagated fare state
198  FareState& state = myFareStates.at(prev);
199 
200  double oldPr;
201  if (state.myFareToken == FareToken::START) {
202  oldPr = 0;
203  } else {
204  oldPr = computePrice(state);
205  }
206  //treat public transport edges
207  if (edgeType.c_str()[0] != '!') {
208  updateFareStatePublic(state, edge, length);
209  } else if (edgeType == "!stop") {
210  updateFareStateStop(state, edge);
211  } else if (edgeType == "!ped") {
212  updateFareStatePedestrian(state, edge);
213  } else if (edgeType == "!access") {
214  updateFareStateAccess(state, edge, prev);
215  } else {
216  updateFareState(state, edge);
217  }
218  FareState& stateAtE = myFareStates[edge];
219  double newPr = computePrice(stateAtE);
220  stateAtE.myPriceDiff = newPr - oldPr;
221 
222  assert(stateAtE.myPriceDiff >= 0);
223 
224  }
225 
228  void setInitialState(const int edge) override {
229 // assert( edge->getLine() == "!connector");
230 
232 
233  }
234 
235 
236 private:
238  std::vector<FareState> myFareStates;
239 
241  std::vector<std::string> myEdges;
242 
244  std::map<int, int> myStopFareZone;
245 
247  std::map<int, FareToken> myStopFareToken;
248 
250  std::map<int, FareToken> myStopStartToken;
251 
254 
255  double computePrice(FareState const& fareState) const {
256  switch (fareState.myFareToken) {
257  case FareToken ::H:
258  return prices.halle;
259  case FareToken ::L:
260  return prices.leipzig;
261  case FareToken ::T1:
262  return prices.t1;
263  case FareToken ::T2:
264  return prices.t2;
265  case FareToken ::T3:
266  return prices.t3;
267  case FareToken::U:
268  return prices.zonePrices[0];
269  case FareToken ::Z:
270  return prices.zonePrices[fareState.myCounter.numZones() - 1];
271  case FareToken ::M:
272  return prices.maxPrice;
273  case FareToken ::K:
274  return prices.shortTrip;
275  case FareToken ::KL:
276  case FareToken ::KLZ:
277  case FareToken ::KLU:
278  return prices.shortTripLeipzig;
279  case FareToken ::KH:
280  case FareToken ::KHU:
281  case FareToken ::KHZ:
282  return prices.shortTripHalle;
283  case FareToken::Free:
284  return 1.4;
285  case FareToken ::START:
286  return 0;
287  case FareToken::ZU:
288  case FareToken::None:
289  assert(false);
290 
291  }
292  return std::numeric_limits<double>::max();
293  }
294 
295 
296 
297  std::string output(const int edge) const override {
298 
299  FareState const& my = myFareStates[edge];
300  std::stringstream msg;
301  /*
302  msg << "Final fare state at edge of type: " << myEdges[edge] << std::endl;
303  msg << "Faretoken" << FareUtil::tokenToString(my.myFareToken) << std::endl;
304  msg << "Price:" << computePrice(my) << std::endl;
305  msg << "Zones " << my.myCounter.numZones() << std::endl;
306  msg << "Stations: " << my.myVisistedStops << std::endl;
307  msg << "Distance:" << my.myTravelledDistance << std::endl;
308  */
309  msg << FareUtil::tokenToTicket(my.myFareToken) << " ";
310  if (my.myFareToken == FareToken::Z) {
311  msg << my.myCounter.numZones() << " ";
312  if (my.myCounter.numZones() == 1) {
313  msg << "Zone";
314  } else {
315  msg << "Zonen";
316  }
317 
318  } else if (my.myFareToken == FareToken::U) {
319  msg << my.myCounter.numZones() << "1 Zone";
320 
321  }
322  msg << ":" << computePrice(my);
323  return msg.str();
324  }
325 
326  void updateFareStateStop(FareState const& currentFareState, const int stopEdge) {
327 
328  FareToken collectedToken = myStopFareToken[stopEdge];
329 
330  //if station has no fare information, just propagate
331  if (collectedToken == FareToken::None) {
332  std::cout << "Progagating fare state for stop w/o a price!" << std::endl;
333  return;
334  }
335 
336  FareToken const& token = currentFareState.myFareToken;
337 
338  FareState& stateAtE = myFareStates[stopEdge];
339 
340  stateAtE = currentFareState;
341 
342  stateAtE.myCounter.addZone(myStopFareZone[stopEdge]);
343 
344  stateAtE.myVisistedStops++;
345 
346  switch (token) {
347  case FareToken ::Free:
348  stateAtE.myFareToken = myStopStartToken[stopEdge];
349  break;
350  case FareToken::M :
351  break;
352 
353  case FareToken::Z :
354  if (stateAtE.myCounter.numZones() > 6) {
355  stateAtE.myFareToken = FareToken::M;
356  }
357  break;
358 
359  case FareToken::T1 :
360  case FareToken::T2 :
361  case FareToken::T3 :
362  if (collectedToken == FareToken::Z) {
363  stateAtE.myFareToken = stateAtE.myTravelledDistance <= 4000 ? FareToken::K : FareToken::Z;
364  }
365  break;
366  case FareToken::U :
367  if (collectedToken == FareToken::H) {
368  stateAtE.myFareToken = FareToken::H;
369  }
370  if (collectedToken == FareToken::L) {
371  stateAtE.myFareToken = FareToken::L;
372  }
373  if (collectedToken == FareToken::Z) {
374  stateAtE.myFareToken = FareToken::Z;
375  }
376  break;
377  case FareToken::H:
378  case FareToken::L:
379  if (collectedToken == FareToken::Z) {
380  stateAtE.myFareToken = FareToken::Z;
381  }
382  break;
383  case FareToken::KH:
384  if (stateAtE.myVisistedStops <= 4) {
385  if (collectedToken == FareToken::U) {
386  stateAtE.myFareToken = FareToken::KHU;
387  }
388  if (collectedToken == FareToken::Z) {
389  stateAtE.myFareToken = FareToken::KHZ;
390  }
391  } else {
392  if (collectedToken == FareToken::H) {
393  stateAtE.myFareToken = FareToken ::H;
394  }
395  if (collectedToken == FareToken::Z) {
396  stateAtE.myFareToken = FareToken ::Z;
397  }
398  if (collectedToken == FareToken::U) {
399  stateAtE.myFareToken = FareToken ::U;
400  }
401  }
402  break;
403  case FareToken::KL:
404  if (stateAtE.myVisistedStops <= 4) {
405  if (collectedToken == FareToken::U) {
406  stateAtE.myFareToken = FareToken::KLU;
407  }
408  if (collectedToken == FareToken::Z) {
409  stateAtE.myFareToken = FareToken::KLZ;
410  }
411  } else {
412  if (collectedToken == FareToken::L) {
413  stateAtE.myFareToken = FareToken ::L;
414  }
415  if (collectedToken == FareToken::Z) {
416  stateAtE.myFareToken = FareToken ::Z;
417  }
418  if (collectedToken == FareToken::U) {
419  stateAtE.myFareToken = FareToken ::U;
420  }
421  }
422  break;
423  case FareToken::K:
424  if (stateAtE.myTravelledDistance > 4000) {
425  if (collectedToken == FareToken::U) {
426  stateAtE.myFareToken = FareToken ::U;
427  }
428  if (collectedToken == FareToken::Z) {
429  stateAtE.myFareToken = FareToken ::Z;
430  }
431  }
432  break;
433  case FareToken::KHU :
434  case FareToken::KLU :
435  if (stateAtE.myVisistedStops > 4) {
436  if (collectedToken == FareToken::U) {
437  stateAtE.myFareToken = FareToken::U;
438  }
439  }
440  break;
441 
442  case FareToken::KLZ:
443  case FareToken::KHZ:
444  if (stateAtE.myVisistedStops > 4) {
445  if (collectedToken == FareToken::Z) {
446  stateAtE.myFareToken = FareToken::Z;
447  }
448  }
449  break;
450  case FareToken::ZU :
451  assert(false);
452  if (collectedToken == FareToken::U) {
453  stateAtE.myFareToken = FareToken::U;
454  } else {
455  stateAtE.myFareToken = FareToken::Z;
456  }
457 
458  break;
459  default:
460  std::cout << "Reached invalid position in fareToken selection!" << std::endl;
461  assert(false);
462  break;
463  }
464  }
465 
466  void updateFareStatePedestrian(FareState const& currentFareState, const int pedestrianEdge) {
467 
468  //only propagates the fare state
469  FareState& stateAtE = myFareStates[pedestrianEdge];
470 
471  stateAtE = currentFareState;
472 
473  if (currentFareState.myFareToken == FareToken::START) {
474  stateAtE.myFareToken = FareToken::Free;
475  }
476 
477  }
478 
479 
480  void updateFareStatePublic(FareState const& currentFareState, const int publicTransportEdge, const double length) {
481 
482 
483  if (currentFareState.myFareToken == FareToken::None) {
484  return;
485  }
486 
487  FareState& stateAtE = myFareStates[publicTransportEdge];
488 
489  stateAtE = currentFareState;
490  stateAtE.myTravelledDistance += length;
491  }
492 
493  void updateFareState(FareState const& currentFareState, const int intermodalEdge) {
494 
495  if (currentFareState.myFareToken == FareToken::None) {
496  return;
497  }
498 
499  FareState& stateAtE = myFareStates[intermodalEdge];
500 
501  stateAtE = currentFareState;
502 
503  if (currentFareState.myFareToken == FareToken::START) {
504  stateAtE.myFareToken = FareToken::Free;
505  }
506 
507  }
508 
509  void updateFareStateAccess(FareState const& currentFareState, const int accessEdge, const int prev) {
510 
511  FareToken const& token = currentFareState.myFareToken;
512 
513  FareState& stateAtE = myFareStates[accessEdge];
514 
515  stateAtE = currentFareState;
516 
517  if (currentFareState.myFareToken == FareToken::START) {
518  stateAtE.myFareToken = FareToken::Free;
519  }
520 
521  if (myEdges[prev] == "!ped") {
522  switch (token) {
523 
524  case FareToken::Free ://we have not yet taken public transport
525  break;
526  case FareToken::K :
527  if (currentFareState.myCounter.numZones() == 0) {
528  stateAtE.myFareToken = FareToken::U;
529  } else {
530  stateAtE.myFareToken = FareToken::Z;
531  }
532  break;
533  case FareToken::KH :
534  stateAtE.myFareToken = FareToken::H;
535  break;
536  case FareToken::KL :
537  stateAtE.myFareToken = FareToken::L;
538  break;
539  case FareToken::KLU :
540  stateAtE.myFareToken = FareToken::L;
541  break;
542  case FareToken::KHU:
543  stateAtE.myFareToken = FareToken::H;
544  break;
545  case FareToken::KLZ :
546  stateAtE.myFareToken = FareToken::Z;
547  break;
548  case FareToken::KHZ:
549  stateAtE.myFareToken = FareToken::Z;
550  break;
551  default:
552  return;
553  }
554  }
555 
556  }
557 };
558 
559 
560 #endif //SUMO_FAREMODUL_H
Prices::shortTripLeipzig
double shortTripLeipzig
Definition: FareModul.h:151
FareModul::updateFareStatePedestrian
void updateFareStatePedestrian(FareState const &currentFareState, const int pedestrianEdge)
Definition: FareModul.h:466
Parameterised
An upper class for objects with additional parameters.
Definition: Parameterised.h:42
FareState::myCounter
ZoneCounter myCounter
Definition: FareModul.h:127
FareState::~FareState
~FareState()=default
FareToken.h
FareModul::update
void update(const int edge, const int prev, const double length) override
Definition: FareModul.h:193
FareModul::prices
Prices prices
Definition: FareModul.h:253
FareToken::L
@ L
ZoneCounter::ZoneCounter
ZoneCounter(unsigned int ct)
Definition: FareModul.h:38
Prices::leipzig
double leipzig
Definition: FareModul.h:146
FareModul::addStop
void addStop(const int stopEdge, const Parameterised &params) override
Definition: FareModul.h:174
FareModul::myStopFareZone
std::map< int, int > myStopFareZone
Definition: FareModul.h:244
Parameterised::getParameter
const std::string getParameter(const std::string &key, const std::string &defaultValue="") const
Returns the value for a given key.
Definition: Parameterised.cpp:72
FareState::myFareToken
FareToken myFareToken
Definition: FareModul.h:125
FareModul::setInitialState
void setInitialState(const int edge) override
Definition: FareModul.h:228
fareZoneToRep
static std::unordered_map< int, long long int > fareZoneToRep
Definition: FareZones.h:93
ZoneCounter::numZones
int numZones() const
Definition: FareModul.h:57
FareZones.h
getOverlayZone
int getOverlayZone(int zoneNumber)
Definition: FareZones.h:163
FareUtil::stringToToken
FareToken stringToToken(std::string str)
Definition: FareToken.h:133
FareState::FareState
FareState(FareToken token)
Definition: FareModul.h:104
FareState::FareState
FareState()
Definition: FareModul.h:92
Prices::maxPrice
double maxPrice
Definition: FareModul.h:153
FareState::isValid
bool isValid() const
Definition: FareModul.h:118
FareState::myVisistedStops
int myVisistedStops
Definition: FareModul.h:131
FareModul::output
std::string output(const int edge) const override
Definition: FareModul.h:297
EffortCalculator.h
FareModul
Definition: FareModul.h:160
ZoneCounter::addZone
void addZone(int zoneNumber)
Definition: FareModul.h:43
Prices
Definition: FareModul.h:139
Prices::t2
double t2
Definition: FareModul.h:148
StringUtils::toInt
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
Definition: StringUtils.cpp:278
FareToken::None
@ None
ZoneCounter
Definition: FareModul.h:35
FareModul::computePrice
double computePrice(FareState const &fareState) const
Definition: FareModul.h:255
Prices::zonePrices
std::vector< double > zonePrices
Definition: FareModul.h:144
ZoneCounter::bitcount
int bitcount(long long int intVal) const
Definition: FareModul.h:63
FareModul::updateFareState
void updateFareState(FareState const &currentFareState, const int intermodalEdge)
Definition: FareModul.h:493
FareState::myPriceDiff
double myPriceDiff
Definition: FareModul.h:133
FareModul::updateFareStatePublic
void updateFareStatePublic(FareState const &currentFareState, const int publicTransportEdge, const double length)
Definition: FareModul.h:480
FareModul::updateFareStateAccess
void updateFareStateAccess(FareState const &currentFareState, const int accessEdge, const int prev)
Definition: FareModul.h:509
FareModul::init
void init(const std::vector< std::string > &edges) override
Definition: FareModul.h:169
FareState
Definition: FareModul.h:86
EffortCalculator
the effort calculator interface
Definition: EffortCalculator.h:32
ZoneCounter::myCount
long long int myCount
Definition: FareModul.h:75
FareModul::updateFareStateStop
void updateFareStateStop(FareState const &currentFareState, const int stopEdge)
Definition: FareModul.h:326
config.h
FareModul::FareModul
FareModul()
Definition: FareModul.h:164
Prices::t1
double t1
Definition: FareModul.h:147
FareToken::K
@ K
FareModul::getEffort
double getEffort(const int numericalID) const override
Definition: FareModul.h:181
FareModul::myEdges
std::vector< std::string > myEdges
Definition: FareModul.h:241
FareModul::myFareStates
std::vector< FareState > myFareStates
Definition: FareModul.h:238
Prices::shortTrip
double shortTrip
Definition: FareModul.h:150
Prices::shortTripHalle
double shortTripHalle
Definition: FareModul.h:152
FareState::myTravelledDistance
double myTravelledDistance
Definition: FareModul.h:129
FareModul::myStopStartToken
std::map< int, FareToken > myStopStartToken
Definition: FareModul.h:250
Prices::halle
double halle
Definition: FareModul.h:145
FareUtil::tokenToTicket
std::string tokenToTicket(FareToken const &token)
Definition: FareToken.h:89
Prices::t3
double t3
Definition: FareModul.h:149
FareToken
FareToken
Definition: FareToken.h:19
FareModul::myStopFareToken
std::map< int, FareToken > myStopFareToken
Definition: FareModul.h:247