Dynamic Number of Occupants (Infected)
Closes #297 (closed)
This feature enables to simulate a scenario with dynamic number of occupants throughout the simulation time. For example, if we consider a CO2ConcentrationModel with a presence time between 8h-10h (1 person), 10h-11h (3 people), 12h-13h (0 people), and 13-17h (2 people), it is expected that the concentration slopes between any of these intervals are different:
To this end, the Population method was modified to consider an IntPiecewiseConstant(PiecewiseConstant) for the number of people attribute, while the presence can be set as None in this case:
Population=(
number=IntPiecewiseConstant((8, 10, 12, 13, 17), (1, 3, 0, 2)),
presence=None,
...
)
This way, one can profit from the value() method of the PiecewiseContant class to get the number of people present at a given time when calculating the concentration -> every occurrence of the population.number was replaced by population.number.value(time) and every occurrence of population.presence was replaced by population.number.interval(). The _normed_concentration method was adapted to normalize the concentration_at_last_state_change by the correct number of present people at a given time, to avoid unexpected jumps in the concentration line.
It is important to note that the code was developed to allow a back-compatibility with the static number of occupants, which means that the previous way of creating a static Population object is still possible/working. Some __post_init__ validation was added in order to recognise which structure the model should consider.
Feature implemented only for the infected occupants. A solution for the exposed may be developed with an upcoming MR. This means that the number of exposed occupants is still static.
Tests were added to compare the old-method way of calculate the concentration at a given time vs. the new way of doing it.
