LCOV - code coverage report
Current view: top level - src/activitygen/city - AGHousehold.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 53 72 73.6 %
Date: 2024-05-05 15:31:14 Functions: 15 17 88.2 %

          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    AGHousehold.cpp
      17             : /// @author  Piotr Woznica
      18             : /// @author  Daniel Krajzewicz
      19             : /// @author  Michael Behrisch
      20             : /// @author  Walter Bamberger
      21             : /// @date    July 2010
      22             : ///
      23             : // A household contains the people and cars of the city: roughly represents
      24             : // families with their address, cars, adults and possibly children
      25             : /****************************************************************************/
      26             : #include <config.h>
      27             : 
      28             : #include <utils/common/RandHelper.h>
      29             : #include "AGCar.h"
      30             : #include "AGChild.h"
      31             : #include "AGCity.h"
      32             : #include "AGDataAndStatistics.h"
      33             : #include "AGHousehold.h"
      34             : 
      35             : 
      36             : // ===========================================================================
      37             : // method definitions
      38             : // ===========================================================================
      39             : void
      40        2005 : AGHousehold::generatePeople(int numAdults, int numChilds, bool firstRetired) {
      41        2005 :     AGDataAndStatistics* ds = &(myCity->statData);
      42             :     //the first adult
      43        2005 :     AGAdult pers(ds->getRandomPopDistributed(ds->limitAgeChildren, ds->limitEndAge));
      44        2005 :     if (firstRetired) {
      45           0 :         pers = AGAdult(ds->getRandomPopDistributed(ds->limitAgeRetirement, ds->limitEndAge));
      46             :     }
      47        2005 :     myAdults.push_back(pers);
      48             :     //further adults
      49        3245 :     while (static_cast<int>(myAdults.size()) < numAdults) {
      50        1240 :         if (firstRetired) {
      51           0 :             AGAdult pers2(ds->getRandomPopDistributed(ds->limitAgeRetirement, ds->limitEndAge));
      52             :             myAdults.push_back(pers2);
      53             :         } else {
      54        1240 :             AGAdult pers2(ds->getRandomPopDistributed(ds->limitAgeChildren, ds->limitAgeRetirement));
      55             :             myAdults.push_back(pers2);
      56             :         }
      57             :     }
      58             :     //Children
      59        2765 :     while (static_cast<int>(myChildren.size()) < numChilds) {
      60         760 :         AGChild chl(ds->getRandomPopDistributed(0, ds->limitAgeChildren));
      61         760 :         myChildren.push_back(chl);
      62             :     }
      63        2005 : }
      64             : 
      65             : void
      66        2005 : AGHousehold::generateCars(double rate) {
      67        2005 :     int peopleInNeed = static_cast<int>(myAdults.size()) - static_cast<int>(myCars.size());
      68        5001 :     while (peopleInNeed > 0) {
      69        2996 :         if (RandHelper::rand() < rate) {
      70        1596 :             addACar();
      71             :         }
      72        2996 :         --peopleInNeed;
      73             :     }
      74        2005 : }
      75             : 
      76             : void
      77        1845 : AGHousehold::addACar() {
      78        1845 :     int numCar = static_cast<int>(myCars.size() + 1);
      79        1845 :     myCars.push_back(AGCar(myId, numCar));
      80        1845 : }
      81             : 
      82             : int
      83       12474 : AGHousehold::getCarNbr() {
      84       12474 :     return static_cast<int>(myCars.size());
      85             : }
      86             : 
      87             : int
      88        5082 : AGHousehold::getPeopleNbr() {
      89        5082 :     return static_cast<int>(myAdults.size() + myChildren.size());
      90             : }
      91             : 
      92             : int
      93       12538 : AGHousehold::getAdultNbr() {
      94       12538 :     return static_cast<int>(myAdults.size());
      95             : }
      96             : 
      97             : const std::list<AGAdult>&
      98       17749 : AGHousehold::getAdults() const {
      99       17749 :     return myAdults;
     100             : }
     101             : 
     102             : const std::list<AGChild>&
     103        3582 : AGHousehold::getChildren() const {
     104        3582 :     return myChildren;
     105             : }
     106             : 
     107             : const std::list<AGCar>&
     108        2220 : AGHousehold::getCars() const {
     109        2220 :     return myCars;
     110             : }
     111             : 
     112             : bool
     113           0 : AGHousehold::isCloseFromPubTransport(std::list<AGPosition>* pubTransport) {
     114           0 :     double distToPT = myLocation.minDistanceTo(*pubTransport);
     115           0 :     if (distToPT > myCity->statData.maxFootDistance) {
     116           0 :         return false;
     117             :     }
     118             :     return true;
     119             : }
     120             : 
     121             : bool
     122        2005 : AGHousehold::isCloseFromPubTransport(std::map<int, AGPosition>* pubTransport) {
     123        2005 :     double distToPT = myLocation.minDistanceTo(*pubTransport);
     124        2005 :     if (distToPT > myCity->statData.maxFootDistance) {
     125         249 :         return false;
     126             :     }
     127             :     return true;
     128             : }
     129             : 
     130             : void
     131           0 : AGHousehold::regenerate() {
     132             :     //only allocation of work or school to people will change
     133             :     std::list<AGChild>::iterator itC;
     134             :     std::list<AGAdult>::iterator itA;
     135           0 :     for (itC = myChildren.begin(); itC != myChildren.end(); ++itC) {
     136           0 :         if (itC->haveASchool()) {
     137           0 :             if (itC->leaveSchool()) {
     138           0 :                 itC->allocateASchool(&(myCity->schools), getPosition());
     139             :             }
     140             :         } else {
     141           0 :             itC->allocateASchool(&(myCity->schools), getPosition());
     142             :         }
     143             :     }
     144           0 :     for (itA = myAdults.begin(); itA != myAdults.end(); ++itA) {
     145           0 :         if (itA->isWorking()) {
     146           0 :             itA->resignFromWorkPosition();
     147             :         }
     148             : 
     149           0 :         if (myCity->statData.workPositions > 0) {
     150           0 :             itA->tryToWork(1 - myCity->statData.unemployement, &(myCity->workPositions));
     151             : 
     152             :         } else {
     153             :             std::cout << "Not enough work positions in AGHousehold::regenerate. Should not happen!" << std::endl;
     154             :         }
     155             :     }
     156           0 : }
     157             : 
     158             : bool
     159        2005 : AGHousehold::allocateChildrenSchool() {
     160             :     std::list<AGChild>::iterator it;
     161             :     bool oneRemainsAtHome = false;
     162             : 
     163        2765 :     for (it = myChildren.begin(); it != myChildren.end(); ++it) {
     164         760 :         if (!it->allocateASchool(&(myCity->schools), myLocation)) {
     165             :             oneRemainsAtHome = true;
     166             :         }
     167             :     }
     168        2005 :     return !oneRemainsAtHome;
     169             : }
     170             : 
     171             : bool
     172        1425 : AGHousehold::allocateAdultsWork() {
     173             :     std::list<AGAdult>::iterator it;
     174        3717 :     for (it = myAdults.begin(); it != myAdults.end(); ++it) {
     175        2292 :         if (myCity->statData.workPositions <= 0) {
     176             :             std::cout << "Not enough free work positions in AGHousehold::allocateAdultsWork. Should not happen." << std::endl;
     177           0 :             return false;
     178             : 
     179             :         } else {
     180        2292 :             it->tryToWork(1 - myCity->statData.unemployement, &(myCity->workPositions));
     181             :         }
     182             :     }
     183             :     return true;
     184             : }
     185             : 
     186             : AGPosition
     187       13272 : AGHousehold::getPosition() {
     188       13272 :     return myLocation;
     189             : }
     190             : 
     191             : AGCity*
     192         327 : AGHousehold::getTheCity() {
     193         327 :     return myCity;
     194             : }
     195             : 
     196             : bool
     197        2005 : AGHousehold::retiredHouseholders() {
     198        2005 :     return (myAdults.front().getAge() >= myCity->statData.limitAgeRetirement);
     199             : }
     200             : 
     201             : 
     202             : /****************************************************************************/

Generated by: LCOV version 1.14