Source code for laser_measles.abm.components.process_no_births

"""
Process for setting a static population (no vital dynamics).
"""

import numpy as np
import polars as pl

from laser_measles.abm.model import ABMModel
from laser_measles.base import BaseLaserModel
from laser_measles.components import BaseVitalDynamicsParams
from laser_measles.components import BaseVitalDynamicsProcess


class NoBirthsParams(BaseVitalDynamicsParams):
    """Parameters for the no births process."""

    @property
    def crude_birth_rate(self) -> float:
        return 0.0

    @property
    def crude_death_rate(self) -> float:
        return 0.0


[docs] class NoBirthsProcess(BaseVitalDynamicsProcess): """ Component for setting the population of the patches to not have births. """ def __init__( self, model: BaseLaserModel, verbose: bool = False, params: NoBirthsParams | None = None, ) -> None: super().__init__(model, verbose) if params is None: params = NoBirthsParams() self.params = params return def __call__(self, model, tick) -> None: pass def calculate_capacity(self, model: ABMModel) -> int: """ Calculate the capacity of the people laserframe. Args: model: The ABM model instance Returns: The total population capacity needed across all patches """ return int(model.patches.states.sum()) def _initialize(self, model: ABMModel) -> None: """ Initialize the no births process by setting up the population. Args: model: The ABM model instance to initialize """ # initialize the people laserframe with correct capacity model.initialize_people_capacity(self.calculate_capacity(model)) # people laserframe people = model.people # scenario dataframe scenario = model.scenario # initialize the patch ids according to the scenario population people.patch_id[:] = np.array( scenario.with_row_index().select(pl.col("index").repeat_by(pl.col("pop"))).explode("index")["index"].to_numpy(), dtype=people.patch_id.dtype, ) return