From d46b5846a1beedeef1e093f7817d1d0bd59e7d6d Mon Sep 17 00:00:00 2001 From: lrdossan Date: Thu, 19 Dec 2024 16:46:19 +0000 Subject: [PATCH] fix to model_start_end and reproduction number methods --- .../src/caimira/calculator/models/models.py | 22 ++-------------- .../calculator/report/virus_report_data.py | 25 ++++++------------- 2 files changed, 9 insertions(+), 38 deletions(-) diff --git a/caimira/src/caimira/calculator/models/models.py b/caimira/src/caimira/calculator/models/models.py index 9d8c073a..d5915308 100644 --- a/caimira/src/caimira/calculator/models/models.py +++ b/caimira/src/caimira/calculator/models/models.py @@ -1944,24 +1944,6 @@ class ExposureModelGroup: def reproduction_number(self) -> _VectorisedFloat: """ - Reproduction number considering the contribution - of each individual probability of infection and - a single infected occupant. + Expected number of cases when there is only one infected case. """ - single_exposure_models = [] - for model in self.exposure_models: - if model.concentration_model.infected.number != 1: - model = nested_replace( - self, { - 'model.concentration_model.infected.number': 1 - } - ) - single_exposure_models.append(model) - - single_exposure_model_group = nested_replace( - self, { - 'exposure_models': single_exposure_models, - } - ) - return single_exposure_model_group.expected_new_cases() - \ No newline at end of file + return np.sum([model.reproduction_number() for model in self.exposure_models], axis=0) # type: ignore diff --git a/caimira/src/caimira/calculator/report/virus_report_data.py b/caimira/src/caimira/calculator/report/virus_report_data.py index 1cf96595..527a7229 100644 --- a/caimira/src/caimira/calculator/report/virus_report_data.py +++ b/caimira/src/caimira/calculator/report/virus_report_data.py @@ -11,22 +11,7 @@ from caimira.calculator.models.enums import ViralLoads from caimira.calculator.validators.virus.virus_validator import VirusFormData -def model_start_end(model: models.ExposureModel): - """ - Calculates the start and end times for a single ExposureModel. - - Determines the boundary times of an ExposureModel by comparing - the presence intervals of both the exposed and the infected people. - """ - t_start = min(model.exposed.presence_interval().boundaries()[0][0], - model.concentration_model.infected.presence_interval().boundaries()[0][0]) - t_end = max(model.exposed.presence_interval().boundaries()[-1][1], - model.concentration_model.infected.presence_interval().boundaries()[-1][1]) - - return t_start, t_end - - -def model_boundary_times(model: typing.Union[models.ExposureModelGroup, models.ExposureModel]): +def model_start_end(model: typing.Union[models.ExposureModelGroup, models.ExposureModel]): """ Calculates the boundary times for an ExposureModel or ExposureModelGroup. @@ -40,7 +25,11 @@ def model_boundary_times(model: typing.Union[models.ExposureModelGroup, models.E t_end = max((model_start_end(nth_model)[1] for nth_model in model.exposure_models)) return t_start, t_end else: - return model_start_end(model) + t_start = min(model.exposed.presence_interval().boundaries()[0][0], + model.concentration_model.infected.presence_interval().boundaries()[0][0]) + t_end = max(model.exposed.presence_interval().boundaries()[-1][1], + model.concentration_model.infected.presence_interval().boundaries()[-1][1]) + return t_start, t_end def fill_big_gaps(array, gap_size): @@ -84,7 +73,7 @@ def non_temp_transition_times(model: typing.Union[models.ExposureModelGroup, mod else: yield name, obj - t_start, t_end = model_boundary_times(model) + t_start, t_end = model_start_end(model) change_times = {t_start, t_end} for _, obj in walk_model(model, name="exposure"):