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

            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 2.0-1