Source code for archABM.creator

from random import sample
from typing import List

from simpy import Environment

from .actions import Actions
from .database import Database
from .event_model import EventModel
from .options import Options
from .parameters import Parameters
from .person import Person
from .place import Place


[docs]class Creator: """Initializes the required assets to run a simulation: :class:`~archABM.options.Options`, :class:`~archABM.aerosol_model.AerosolModel`, :class:`~archABM.event.Event`, :class:`~archABM.place.Place`, :class:`~archABM.actions.Actions`, :class:`~archABM.person.Person`. """ env: Environment config: dict db: Database def __init__(self, env: Environment, config: dict, db: Database) -> None: self.env = env self.config = config self.db = db Person.reset() Place.reset() EventModel.reset()
[docs] def create_options(self) -> Options: """Initializes general :class:`~archABM.options.Options` for the simulation. Returns: Options: general :class:`~archABM.options.Options` for the simulation """ p = self.config["options"] params = Parameters(p) options = Options(self.env, self.db, params) return options
[docs] def create_events(self) -> List[EventModel]: """Initializes list of :class:`~archABM.event_model.EventModel` and their respective :class:`~archABM.parameters.Parameters`. Returns: List[EventModel]: types of events or activities """ events = [] for e in self.config["events"]: params = Parameters(e) event = EventModel(params) events.append(event) return events
[docs] def create_places(self) -> List[Place]: """Initializes list of :class:`~archABM.place.Place` and their respective :class:`~archABM.parameters.Parameters`. Returns: List[Place]: list of available places """ places = [] for p in self.config["places"]: params = Parameters(p) place = Place(self.env, self.db, params) places.append(place) return places
[docs] def create_actions(self) -> Actions: """Initializes instance of class :class:`~archABM.actions.Actions`. Returns: Actions: instance of class :class:`~archABM.actions.Actions` """ return Actions(self.env, self.db)
[docs] def create_people(self) -> List[Person]: """Initializes list of :class:`~archABM.person.Person` and their respective :class:`~archABM.parameters.Parameters`. It also sets the status of certain :class:`~archABM.person.Person` from ``susceptible`` to ``infected``. This is controlled by the ``ratio_infected`` configuration parameter. Returns: List[Person]: simulation people """ people = [] for p in self.config["people"]: params = Parameters(p) person = Person(self.env, self.db, params) person.start() people.append(person) num_people = len(people) num_infected = int(max(1, self.config["options"]["ratio_infected"] * num_people)) for p in sample(people, num_infected): p.status = 1 return people
[docs] def create_model(self): """Initializes the selected COVID19 aerosol model. At the moment, there are three models available: #. :class:`~archABM.aerosol_model_colorado.AerosolModelColorado`: COVID-19 Airborne Transmission Estimator \ :cite:`doi:10.1021/acs.estlett.1c00183,https://doi.org/10.1111/ina.12751,Peng2021.04.21.21255898` #. :class:`~archABM.aerosol_model_mit.AerosolModelMIT`: MIT COVID-19 Indoor Safety Guideline \ :cite:`Bazante2018995118,Bazant2021.04.04.21254903,Risbeck2021.06.21.21259287` #. :class:`~archABM.aerosol_model_maxplanck.AerosolModelMaxPlanck`: Model Calculations of Aerosol Transmission and \ Infection Risk of COVID-19 in Indoor Environments :cite:`ijerph17218114` Returns: AerosolModel: selected aerosol model """ options = self.config["options"] selection = options["model"] params = Parameters(options["model_parameters"][selection]) model = None if selection == "MaxPlanck": from .aerosol_model_maxplanck import AerosolModelMaxPlanck model = AerosolModelMaxPlanck(params) elif selection == "MIT": from .aerosol_model_mit import AerosolModelMIT model = AerosolModelMIT(params) elif selection == "Colorado": from .aerosol_model_colorado import AerosolModelColorado model = AerosolModelColorado(params) return model