LCOV - code coverage report
Current view: top level - src/activitygen/city - AGWorkPosition.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 45 59 76.3 %
Date: 2024-05-05 15:31:14 Functions: 10 12 83.3 %

          Line data    Source code
       1             : /****************************************************************************/
       2             : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3             : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
       4             : // activitygen module
       5             : // Copyright 2010 TUM (Technische Universitaet Muenchen, http://www.tum.de/)
       6             : // This program and the accompanying materials are made available under the
       7             : // terms of the Eclipse Public License 2.0 which is available at
       8             : // https://www.eclipse.org/legal/epl-2.0/
       9             : // This Source Code may also be made available under the following Secondary
      10             : // Licenses when the conditions for such availability set forth in the Eclipse
      11             : // Public License 2.0 are satisfied: GNU General Public License, version 2
      12             : // or later which is available at
      13             : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      14             : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      15             : /****************************************************************************/
      16             : /// @file    AGWorkPosition.cpp
      17             : /// @author  Piotr Woznica
      18             : /// @author  Walter Bamberger
      19             : /// @author  Daniel Krajzewicz
      20             : /// @author  Michael Behrisch
      21             : /// @author  Mirko Barthauer
      22             : /// @date    July 2010
      23             : ///
      24             : // Location and schedules of a work position: linked with one adult
      25             : /****************************************************************************/
      26             : #include <config.h>
      27             : 
      28             : #include "AGWorkPosition.h"
      29             : #include "AGStreet.h"
      30             : #include "AGPosition.h"
      31             : #include "AGDataAndStatistics.h"
      32             : #include "AGAdult.h"
      33             : #include <utils/common/RandHelper.h>
      34             : #include <iostream>
      35             : 
      36             : 
      37             : // ===========================================================================
      38             : // method definitions
      39             : // ===========================================================================
      40        3170 : AGWorkPosition::AGWorkPosition(AGDataAndStatistics* ds, const AGStreet& inStreet) :
      41        3170 :     myStatData(ds),
      42        3170 :     myLocation(inStreet),
      43        3170 :     myAdult(nullptr),
      44        3170 :     myOpeningTime(generateOpeningTime(*ds)),
      45        3170 :     myClosingTime(generateClosingTime(*ds)) {
      46        3170 :     ds->workPositions++;
      47        3170 : }
      48             : 
      49             : 
      50         240 : AGWorkPosition::AGWorkPosition(AGDataAndStatistics* ds, const AGStreet& inStreet, double pos) :
      51         240 :     myStatData(ds),
      52         240 :     myLocation(inStreet, pos),
      53         240 :     myAdult(nullptr),
      54         240 :     myOpeningTime(generateOpeningTime(*ds)),
      55         240 :     myClosingTime(generateClosingTime(*ds)) {
      56         240 :     ds->workPositions++;
      57         240 : }
      58             : 
      59       10917 : AGWorkPosition::~AGWorkPosition() {
      60             : //    let();
      61       10917 : }
      62             : 
      63             : 
      64             : void
      65           0 : AGWorkPosition::print() const {
      66           0 :     std::cout << "- AGWorkPosition: open=" << myOpeningTime << " closingTime=" << myClosingTime << " taken=" << isTaken() << std::endl;
      67           0 :     std::cout << "\t";
      68           0 :     myLocation.print();
      69           0 : }
      70             : 
      71             : 
      72             : int
      73        3410 : AGWorkPosition::generateOpeningTime(const AGDataAndStatistics& ds) {
      74        3410 :     double choice = RandHelper::rand();
      75             :     double cumul = 0;
      76             : 
      77        3410 :     for (std::map<int, double>::const_iterator it = ds.beginWorkHours.begin();
      78        5794 :             it != ds.beginWorkHours.end(); ++it) {
      79        5794 :         cumul += it->second;
      80        5794 :         if (cumul >= choice) {
      81        3410 :             return it->first;
      82             :         }
      83             :     }
      84             :     std::cout << "-- WARNING: work time distribution not complete (Sum(proportions) != 1): AUTODEFINED at 9.00am --" << std::endl;
      85           0 :     return 32400;
      86             : }
      87             : 
      88             : 
      89             : int
      90        3410 : AGWorkPosition::generateClosingTime(const AGDataAndStatistics& ds) {
      91        3410 :     double choice = RandHelper::rand();
      92             :     double cumul = 0;
      93        3410 :     for (std::map<int, double>::const_iterator it = ds.endWorkHours.begin();
      94        8238 :             it != ds.endWorkHours.end(); ++it) {
      95        8238 :         cumul += it->second;
      96        8238 :         if (cumul >= choice) {
      97        3410 :             return it->first;
      98             :         }
      99             :     }
     100             :     std::cout << "-- WARNING: work time distribution not complete (Sum(proportions) != 1): AUTODEFINED at 5.00pm --" << std::endl;
     101           0 :     return 61200;
     102             : }
     103             : 
     104             : 
     105             : bool
     106     2503340 : AGWorkPosition::isTaken() const {
     107     2503340 :     return (myAdult != nullptr);
     108             : }
     109             : 
     110             : 
     111             : void
     112           0 : AGWorkPosition::let() {
     113           0 :     if (myAdult != nullptr) {
     114           0 :         myStatData->workPositions++;
     115           0 :         myAdult->lostWorkPosition();
     116           0 :         myAdult = nullptr;
     117             :     }
     118           0 : }
     119             : 
     120             : 
     121             : void
     122        2952 : AGWorkPosition::take(AGAdult* worker) {
     123        2952 :     if (myAdult == nullptr) {
     124        2952 :         myStatData->workPositions--;
     125        2952 :         myAdult = worker;
     126             :     } else {
     127           0 :         throw ProcessError(TL("Work position already occupied. Cannot give it to another adult."));
     128             :     }
     129        2952 : }
     130             : 
     131             : 
     132             : AGPosition
     133        8025 : AGWorkPosition::getPosition() const {
     134        8025 :     return myLocation;
     135             : }
     136             : 
     137             : 
     138             : int
     139         977 : AGWorkPosition::getClosing() const {
     140         977 :     return myClosingTime;
     141             : }
     142             : 
     143             : 
     144             : int
     145        1079 : AGWorkPosition::getOpening() const {
     146        1079 :     return myOpeningTime;
     147             : }
     148             : 
     149             : 
     150             : /****************************************************************************/

Generated by: LCOV version 1.14