LCOV - code coverage report
Current view: top level - src/microsim/devices - MSDispatch_TraCI.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 85.1 % 47 40
Test Date: 2024-11-22 15:46:21 Functions: 100.0 % 5 5

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2007-2024 German Aerospace Center (DLR) and others.
       4              : // This program and the accompanying materials are made available under the
       5              : // terms of the Eclipse Public License 2.0 which is available at
       6              : // https://www.eclipse.org/legal/epl-2.0/
       7              : // This Source Code may also be made available under the following Secondary
       8              : // Licenses when the conditions for such availability set forth in the Eclipse
       9              : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10              : // or later which is available at
      11              : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12              : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13              : /****************************************************************************/
      14              : /// @file    MSDispatch_TraCI.cpp
      15              : /// @author  Jakob Erdmann
      16              : /// @date    16.12.2019
      17              : ///
      18              : // An algorithm that performs dispatch for the taxi device
      19              : /****************************************************************************/
      20              : #include <config.h>
      21              : 
      22              : #include <limits>
      23              : #include <microsim/transportables/MSTransportable.h>
      24              : #include "MSDispatch_TraCI.h"
      25              : 
      26              : //#define DEBUG_RESERVATION
      27              : //#define DEBUG_DISPATCH
      28              : //#define DEBUG_SERVABLE
      29              : //#define DEBUG_TRAVELTIME
      30              : //#define DEBUG_DETOUR
      31              : //#define DEBUG_COND2(obj) (obj->getID() == "p0")
      32              : #define DEBUG_COND2(obj) (true)
      33              : 
      34              : // ===========================================================================
      35              : // MSDispatch_TraCI methods
      36              : // ===========================================================================
      37              : 
      38              : Reservation*
      39          345 : MSDispatch_TraCI::addReservation(MSTransportable* person,
      40              :                                  SUMOTime reservationTime,
      41              :                                  SUMOTime pickupTime,
      42              :                                  SUMOTime earliestPickupTime,
      43              :                                  const MSEdge* from, double fromPos,
      44              :                                  const MSStoppingPlace* fromStop,
      45              :                                  const MSEdge* to, double toPos,
      46              :                                  const MSStoppingPlace* toStop,
      47              :                                  std::string group,
      48              :                                  const std::string& line,
      49              :                                  int maxCapacity,
      50              :                                  int maxContainerCapacity) {
      51          690 :     Reservation* res = MSDispatch::addReservation(person, reservationTime, pickupTime, earliestPickupTime, from, fromPos, fromStop, to, toPos, toStop, group, line, maxCapacity, maxContainerCapacity);
      52          345 :     if (!myReservationLookup.has(res)) {
      53          660 :         myReservationLookup.insert(res->id, res);
      54              :     }
      55          345 :     return res;
      56              : }
      57              : 
      58              : std::string
      59           57 : MSDispatch_TraCI::removeReservation(MSTransportable* person,
      60              :                                     const MSEdge* from, double fromPos,
      61              :                                     const MSEdge* to, double toPos,
      62              :                                     std::string group) {
      63          114 :     const std::string removedID = MSDispatch::removeReservation(person, from, fromPos, to, toPos, group);
      64              :     if (myReservationLookup.hasString(removedID)) {
      65              :         // warning! res is already deleted
      66            0 :         const Reservation* res = myReservationLookup.get(removedID);
      67            0 :         myReservationLookup.remove(removedID, res);
      68              :     }
      69           57 :     return removedID;
      70              : }
      71              : 
      72              : 
      73              : void
      74          293 : MSDispatch_TraCI::fulfilledReservation(const Reservation* res) {
      75          293 :     myReservationLookup.remove(res->id, res);
      76          293 :     MSDispatch::fulfilledReservation(res);
      77          293 : }
      78              : 
      79              : void
      80          191 : MSDispatch_TraCI::interpretDispatch(MSDevice_Taxi* taxi, const std::vector<std::string>& reservationsIDs) {
      81              :     std::vector<const Reservation*> reservations;
      82          867 :     for (std::string resID : reservationsIDs) {
      83              :         if (myReservationLookup.hasString(resID)) {
      84          676 :             reservations.push_back(myReservationLookup.get(resID));
      85              :         } else {
      86            0 :             throw InvalidArgument("Reservation id '" + resID + "' is not known");
      87              :         }
      88              :     }
      89              :     try {
      90          191 :         if (reservations.size() == 1) {
      91           78 :             taxi->dispatch(*reservations.front());
      92              :         } else {
      93          113 :             taxi->dispatchShared(reservations);
      94              :         }
      95            4 :     } catch (ProcessError& e) {
      96            8 :         throw InvalidArgument(e.what());
      97            4 :     }
      98              :     // in case of ride sharing the same reservation may occur multiple times
      99          187 :     std::set<const Reservation*> unique(reservations.begin(), reservations.end());
     100          570 :     for (const Reservation* res : unique) {
     101          383 :         servedReservation(res);
     102              :     }
     103          191 : }
     104              : 
     105              : 
     106              : std::string
     107            5 : MSDispatch_TraCI::splitReservation(std::string resID, std::vector<std::string> personIDs) {
     108              :     if (myReservationLookup.hasString(resID)) {
     109            5 :         Reservation* res = const_cast<Reservation*>(myReservationLookup.get(resID));
     110              :         if (myRunningReservations.count(res) != 0) {
     111            0 :             throw InvalidArgument("Cannot split reservation '" + resID + "' after dispatch");
     112              :         }
     113              :         std::set<std::string> allPersons;
     114           25 :         for (const MSTransportable* t : res->persons) {
     115              :             allPersons.insert(t->getID());
     116              :         }
     117           15 :         for (std::string p : personIDs) {
     118              :             if (allPersons.count(p) == 0) {
     119            0 :                 throw InvalidArgument("Person '" + p + "' is not part of reservation '" + resID + "'");
     120              :             }
     121              :         }
     122            5 :         if (personIDs.size() == allPersons.size()) {
     123            0 :             throw InvalidArgument("Cannot remove all person from reservation '" + resID + "'");
     124              :         }
     125              :         std::vector<const MSTransportable*> split;
     126           15 :         for (const std::string& p : personIDs) {
     127           13 :             for (const MSTransportable* const t : res->persons) {
     128           13 :                 if (t->getID() == p) {
     129              :                     res->persons.erase(t);
     130           10 :                     split.push_back(t);
     131              :                     break;
     132              :                 }
     133              :             }
     134              :         }
     135           10 :         Reservation* newRes = new Reservation(toString(myReservationCount++), split,
     136              :                                               res->reservationTime, res->pickupTime,
     137              :                                               res->earliestPickupTime,
     138              :                                               res->from, res->fromPos, res->fromStop,
     139              :                                               res->to, res->toPos, res->toStop,
     140            5 :                                               res->group, res->line);
     141            5 :         myGroupReservations[res->group].push_back(newRes);
     142           10 :         myReservationLookup.insert(newRes->id, newRes);
     143            5 :         return newRes->id;
     144            5 :     } else {
     145            0 :         throw InvalidArgument("Reservation id '" + resID + "' is not known");
     146              :     }
     147              : }
     148              : 
     149              : 
     150              : 
     151              : //
     152              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1