From 2abdd130cffd623fd5d13e8f474d9bbc43c425d1 Mon Sep 17 00:00:00 2001 From: Nicola Tarocco Date: Fri, 8 Dec 2023 13:56:55 +0100 Subject: [PATCH] config: remove Ref: config parsing --- caimira/enums.py | 13 ++++ caimira/monte_carlo/data.py | 109 +++++++++++++++--------------- caimira/monte_carlo/sampleable.py | 6 +- caimira/store/data_registry.py | 45 ++++++------ 4 files changed, 96 insertions(+), 77 deletions(-) create mode 100644 caimira/enums.py diff --git a/caimira/enums.py b/caimira/enums.py new file mode 100644 index 00000000..8b5418bd --- /dev/null +++ b/caimira/enums.py @@ -0,0 +1,13 @@ +from enum import Enum + +class ViralLoads(Enum): + COVID_OVERALL = "COVID overall" + SYMPTOMATIC_FREQUENCIES = "Symptomatic frequencies" + + +class InfectiousDoses(Enum): + DISTRIBUTION = "Distribution" + + +class ViableToRNARatios(Enum): + DISTRIBUTION = "Distribution" diff --git a/caimira/monte_carlo/data.py b/caimira/monte_carlo/data.py index 101508c5..d6fca11c 100644 --- a/caimira/monte_carlo/data.py +++ b/caimira/monte_carlo/data.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from dataclasses import dataclass import typing @@ -5,10 +7,37 @@ import numpy as np from scipy import special as sp from scipy.stats import weibull_min -import caimira.monte_carlo as mc +from caimira.enums import ViralLoads, InfectiousDoses, ViableToRNARatios + +import caimira.monte_carlo.models as mc from caimira.monte_carlo.sampleable import LogCustom, LogNormal, Normal, LogCustomKernel, CustomKernel, Uniform, Custom from caimira.store.data_registry import DataRegistry + +def evaluate_vl(value, data_registry: DataRegistry): + if value == ViralLoads.COVID_OVERALL: + return covid_overal_vl_data(data_registry) + elif value == ViralLoads.COVID_OVERALL: + return symptomatic_vl_frequencies + else: + raise ValueError(f"Invalid ViralLoads value {value}") + + +def evaluate_infectd(value, data_registry: DataRegistry): + if value == InfectiousDoses.DISTRIBUTION: + return infectious_dose_distribution(data_registry) + else: + raise ValueError(f"Invalid InfectiousDoses value {value}") + + +def evaluate_vtrr(value, data_registry: DataRegistry): + """.""" + if value == ViableToRNARatios.DISTRIBUTION: + return viable_to_RNA_ratio_distribution(data_registry) + else: + raise ValueError(f"Invalid ViableToRNARatios value {value}") + + sqrt2pi = np.sqrt(2.*np.pi) sqrt2 = np.sqrt(2.) @@ -94,10 +123,7 @@ def param_evaluation(root: typing.Dict, param: typing.Union[str, typing.Any]) -> value = root.get(param) if isinstance(value, str): - if value.startswith('Ref:'): - reference_variable = value.split(' - ')[1].strip() - return evaluate_reference(reference_variable) - elif value == 'Custom': + if value == 'Custom': custom_distribution: typing.Dict = custom_distribution_lookup( root, 'custom distribution') for d, p in custom_distribution.items(): @@ -286,66 +312,43 @@ def infectious_dose_distribution(data_registry): # From https://doi.org/10.1101/2021.10.14.21264988 and references therein def virus_distributions(data_registry): + vd = data_registry.virus_distributions return { 'SARS_CoV_2': mc.SARSCoV2( - viral_load_in_sputum=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2'], 'viral_load_in_sputum'), - infectious_dose=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2'], 'infectious_dose'), - viable_to_RNA_ratio=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2'], 'viable_to_RNA_ratio'), - transmissibility_factor=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2'], 'transmissibility_factor'), + viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2']['viral_load_in_sputum'], data_registry), + infectious_dose=evaluate_infectd(vd['SARS_CoV_2']['infectious_dose'], data_registry), + viable_to_RNA_ratio=evaluate_vtrr(vd['SARS_CoV_2']['viable_to_RNA_ratio'], data_registry), + transmissibility_factor=vd['SARS_CoV_2']['transmissibility_factor'], ), 'SARS_CoV_2_ALPHA': mc.SARSCoV2( - viral_load_in_sputum=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_ALPHA'], 'viral_load_in_sputum'), - infectious_dose=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_ALPHA'], 'infectious_dose'), - viable_to_RNA_ratio=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_ALPHA'], 'viable_to_RNA_ratio'), - transmissibility_factor=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_ALPHA'], 'transmissibility_factor'), + viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_ALPHA']['viral_load_in_sputum'], data_registry), + infectious_dose=evaluate_infectd(vd['SARS_CoV_2_ALPHA']['infectious_dose'], data_registry), + viable_to_RNA_ratio=evaluate_vtrr(vd['SARS_CoV_2_ALPHA']['viable_to_RNA_ratio'], data_registry), + transmissibility_factor=vd['SARS_CoV_2_ALPHA']['transmissibility_factor'], ), 'SARS_CoV_2_BETA': mc.SARSCoV2( - viral_load_in_sputum=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_BETA'], 'viral_load_in_sputum'), - infectious_dose=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_BETA'], 'infectious_dose'), - viable_to_RNA_ratio=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_BETA'], 'viable_to_RNA_ratio'), - transmissibility_factor=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_BETA'], 'transmissibility_factor'), + viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_BETA']['viral_load_in_sputum'], data_registry), + infectious_dose=evaluate_infectd(vd['SARS_CoV_2_BETA']['infectious_dose'], data_registry), + viable_to_RNA_ratio=evaluate_vtrr(vd['SARS_CoV_2_BETA']['viable_to_RNA_ratio'], data_registry), + transmissibility_factor=vd['SARS_CoV_2_BETA']['transmissibility_factor'], ), 'SARS_CoV_2_GAMMA': mc.SARSCoV2( - viral_load_in_sputum=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_GAMMA'], 'viral_load_in_sputum'), - infectious_dose=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_GAMMA'], 'infectious_dose'), - viable_to_RNA_ratio=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_GAMMA'], 'viable_to_RNA_ratio'), - transmissibility_factor=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_GAMMA'], 'transmissibility_factor'), + viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_GAMMA']['viral_load_in_sputum'], data_registry), + infectious_dose=evaluate_infectd(vd['SARS_CoV_2_GAMMA']['infectious_dose'], data_registry), + viable_to_RNA_ratio=evaluate_vtrr(vd['SARS_CoV_2_GAMMA']['viable_to_RNA_ratio'], data_registry), + transmissibility_factor=vd['SARS_CoV_2_GAMMA']['transmissibility_factor'], ), 'SARS_CoV_2_DELTA': mc.SARSCoV2( - viral_load_in_sputum=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_DELTA'], 'viral_load_in_sputum'), - infectious_dose=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_DELTA'], 'infectious_dose'), - viable_to_RNA_ratio=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_DELTA'], 'viable_to_RNA_ratio'), - transmissibility_factor=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_DELTA'], 'transmissibility_factor'), + viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_DELTA']['viral_load_in_sputum'], data_registry), + infectious_dose=evaluate_infectd(vd['SARS_CoV_2_DELTA']['infectious_dose'], data_registry), + viable_to_RNA_ratio=evaluate_vtrr(vd['SARS_CoV_2_DELTA']['viable_to_RNA_ratio'], data_registry), + transmissibility_factor=vd['SARS_CoV_2_DELTA']['transmissibility_factor'], ), 'SARS_CoV_2_OMICRON': mc.SARSCoV2( - viral_load_in_sputum=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_OMICRON'], 'viral_load_in_sputum'), - infectious_dose=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_OMICRON'], 'infectious_dose'), - viable_to_RNA_ratio=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_OMICRON'], 'viable_to_RNA_ratio'), - transmissibility_factor=param_evaluation( - data_registry.virus_distributions['SARS_CoV_2_OMICRON'], 'transmissibility_factor'), + viral_load_in_sputum=evaluate_vl(vd['SARS_CoV_2_OMICRON']['viral_load_in_sputum'], data_registry), + infectious_dose=evaluate_infectd(vd['SARS_CoV_2_OMICRON']['infectious_dose'], data_registry), + viable_to_RNA_ratio=evaluate_vtrr(vd['SARS_CoV_2_OMICRON']['viable_to_RNA_ratio'], data_registry), + transmissibility_factor=vd['SARS_CoV_2_OMICRON']['transmissibility_factor'], ), } diff --git a/caimira/monte_carlo/sampleable.py b/caimira/monte_carlo/sampleable.py index 479b91cf..4bbc4c35 100644 --- a/caimira/monte_carlo/sampleable.py +++ b/caimira/monte_carlo/sampleable.py @@ -62,7 +62,7 @@ class Custom(SampleableDistribution): Defines a distribution which follows a custom curve vs. the random variable. Uses a simple algorithm. This is appropriate for a smooth distribution function. - Note: in max_function, a value slightly above the maximum of the distribution + Note: in max_function, a value slightly above the maximum of the distribution function should be provided. """ def __init__(self, bounds: typing.Tuple[float, float], @@ -87,8 +87,8 @@ class LogCustom(SampleableDistribution): """ Defines a distribution which follows a custom curve vs. the log (in base 10) of the random variable. Uses a simple algorithm. This is appropriate for a smooth - distribution function. - Note: in max_function, a value slightly above the maximum of the distribution + distribution function. + Note: in max_function, a value slightly above the maximum of the distribution function should be provided. """ def __init__(self, bounds: typing.Tuple[float, float], diff --git a/caimira/store/data_registry.py b/caimira/store/data_registry.py index 69d6d702..e0c0cfb8 100644 --- a/caimira/store/data_registry.py +++ b/caimira/store/data_registry.py @@ -1,3 +1,6 @@ +from caimira.enums import ViralLoads, InfectiousDoses, ViableToRNARatios + + class DataRegistry: """Registry to hold data values.""" @@ -207,51 +210,51 @@ class DataRegistry: } virus_distributions = { "SARS_CoV_2": { - "viral_load_in_sputum": "Ref: Viral load - covid_overal_vl_data", - "infectious_dose": "Ref: Infectious dose - infectious_dose_distribution", - "viable_to_RNA_ratio": "Ref: Viable to RNA ratio - viable_to_RNA_ratio_distribution", + "viral_load_in_sputum": ViralLoads.COVID_OVERALL, + "infectious_dose": InfectiousDoses.DISTRIBUTION, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION, "transmissibility_factor": 1, "infectiousness_days": 14, }, "SARS_CoV_2_ALPHA": { - "viral_load_in_sputum": "Ref: Viral load - covid_overal_vl_data", - "infectious_dose": "Ref: Infectious dose - infectious_dose_distribution", - "viable_to_RNA_ratio": "Ref: Viable to RNA ratio - viable_to_RNA_ratio_distribution", + "viral_load_in_sputum": ViralLoads.COVID_OVERALL, + "infectious_dose": InfectiousDoses.DISTRIBUTION, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION, "transmissibility_factor": 0.78, "infectiousness_days": 14, }, "SARS_CoV_2_BETA": { - "viral_load_in_sputum": "Ref: Viral load - covid_overal_vl_data", - "infectious_dose": "Ref: Infectious dose - infectious_dose_distribution", - "viable_to_RNA_ratio": "Ref: Viable to RNA ratio - viable_to_RNA_ratio_distribution", + "viral_load_in_sputum": ViralLoads.COVID_OVERALL, + "infectious_dose": InfectiousDoses.DISTRIBUTION, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION, "transmissibility_factor": 0.8, "infectiousness_days": 14, }, "SARS_CoV_2_GAMMA": { - "viral_load_in_sputum": "Ref: Viral load - covid_overal_vl_data", - "infectious_dose": "Ref: Infectious dose - infectious_dose_distribution", - "viable_to_RNA_ratio": "Ref: Viable to RNA ratio - viable_to_RNA_ratio_distribution", + "viral_load_in_sputum": ViralLoads.COVID_OVERALL, + "infectious_dose": InfectiousDoses.DISTRIBUTION, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION, "transmissibility_factor": 0.72, "infectiousness_days": 14, }, "SARS_CoV_2_DELTA": { - "viral_load_in_sputum": "Ref: Viral load - covid_overal_vl_data", - "infectious_dose": "Ref: Infectious dose - infectious_dose_distribution", - "viable_to_RNA_ratio": "Ref: Viable to RNA ratio - viable_to_RNA_ratio_distribution", + "viral_load_in_sputum": ViralLoads.COVID_OVERALL, + "infectious_dose": InfectiousDoses.DISTRIBUTION, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION, "transmissibility_factor": 0.51, "infectiousness_days": 14, }, "SARS_CoV_2_OMICRON": { - "viral_load_in_sputum": "Ref: Viral load - covid_overal_vl_data", - "infectious_dose": "Ref: Infectious dose - infectious_dose_distribution", - "viable_to_RNA_ratio": "Ref: Viable to RNA ratio - viable_to_RNA_ratio_distribution", + "viral_load_in_sputum": ViralLoads.COVID_OVERALL, + "infectious_dose": InfectiousDoses.DISTRIBUTION, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION, "transmissibility_factor": 0.2, "infectiousness_days": 14, }, "SARS_CoV_2_Other": { - "viral_load_in_sputum": "Ref: Viral load - covid_overal_vl_data", - "infectious_dose": "Ref: Infectious dose - infectious_dose_distribution", - "viable_to_RNA_ratio": "Ref: Viable to RNA ratio - viable_to_RNA_ratio_distribution", + "viral_load_in_sputum": ViralLoads.COVID_OVERALL, + "infectious_dose": InfectiousDoses.DISTRIBUTION, + "viable_to_RNA_ratio": ViableToRNARatios.DISTRIBUTION, "transmissibility_factor": 0.1, "infectiousness_days": 14, },