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