vivarium-public-health 3.0.11__py3-none-any.whl → 3.1.1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
1
- __version__ = "3.0.11"
1
+ __version__ = "3.1.1"
@@ -8,7 +8,8 @@ function is to provide coordination across a set of disease states and
8
8
  transitions at simulation initialization and during transitions.
9
9
 
10
10
  """
11
-
11
+ import warnings
12
+ from collections.abc import Iterable
12
13
  from typing import Any, Callable, Dict, List, Optional, Tuple, Union
13
14
 
14
15
  import numpy as np
@@ -38,7 +39,7 @@ class DiseaseModel(Machine):
38
39
  return {
39
40
  f"{self.name}": {
40
41
  "data_sources": {
41
- "cause_specific_mortality_rate": "self::load_cause_specific_mortality_rate"
42
+ "cause_specific_mortality_rate": self.load_cause_specific_mortality_rate,
42
43
  },
43
44
  },
44
45
  }
@@ -79,16 +80,35 @@ class DiseaseModel(Machine):
79
80
  initial_state: Optional[BaseDiseaseState] = None,
80
81
  get_data_functions: Optional[Dict[str, Callable]] = None,
81
82
  cause_type: str = "cause",
83
+ states: Iterable[BaseDiseaseState] = (),
84
+ residual_state: BaseDiseaseState | None = None,
82
85
  **kwargs,
83
86
  ):
84
- super().__init__(cause, **kwargs)
87
+ super().__init__(cause, states=states, **kwargs)
85
88
  self.cause = cause
86
89
  self.cause_type = cause_type
87
90
 
88
91
  if initial_state is not None:
89
- self.initial_state = initial_state.state_id
92
+ warnings.warn(
93
+ "In the future, the 'initial_state' argument to DiseaseModel"
94
+ " will be used to initialize all simulants into that state. To"
95
+ " retain the current behavior of defining a residual state, use"
96
+ " the 'residual_state' argument.",
97
+ DeprecationWarning,
98
+ stacklevel=2,
99
+ )
100
+
101
+ if residual_state:
102
+ raise DiseaseModelError(
103
+ "A DiseaseModel cannot be initialized with both"
104
+ " 'initial_state and 'residual_state'."
105
+ )
106
+
107
+ self.residual_state = initial_state.state_id
108
+ elif residual_state is not None:
109
+ self.residual_state = residual_state.state_id
90
110
  else:
91
- self.initial_state = self._get_default_initial_state()
111
+ self.residual_state = self._get_default_residual_state()
92
112
 
93
113
  self._get_data_functions = (
94
114
  get_data_functions if get_data_functions is not None else {}
@@ -135,7 +155,7 @@ class DiseaseModel(Machine):
135
155
  def on_initialize_simulants(self, pop_data: SimulantData) -> None:
136
156
  population = self.population_view.subview(["age", "sex"]).get(pop_data.index)
137
157
 
138
- assert self.initial_state in {s.state_id for s in self.states}
158
+ assert self.residual_state in {s.state_id for s in self.states}
139
159
 
140
160
  if pop_data.user_data["sim_state"] == "setup": # simulation start
141
161
  if self.configuration_age_start != self.configuration_age_end != 0:
@@ -176,7 +196,7 @@ class DiseaseModel(Machine):
176
196
  )
177
197
  else:
178
198
  condition_column = pd.Series(
179
- self.initial_state, index=population.index, name=self.state_column
199
+ self.residual_state, index=population.index, name=self.state_column
180
200
  )
181
201
  self.population_view.update(condition_column)
182
202
 
@@ -197,7 +217,7 @@ class DiseaseModel(Machine):
197
217
  # Helper functions #
198
218
  ####################
199
219
 
200
- def _get_default_initial_state(self):
220
+ def _get_default_residual_state(self):
201
221
  susceptible_states = [s for s in self.states if isinstance(s, SusceptibleState)]
202
222
  if len(susceptible_states) != 1:
203
223
  raise DiseaseModelError("Disease model must have exactly one SusceptibleState.")
@@ -219,7 +239,7 @@ class DiseaseModel(Machine):
219
239
  weights = np.array(weights).T
220
240
  weights_bins = np.cumsum(weights, axis=1)
221
241
 
222
- state_names = [s.state_id for s in states] + [self.initial_state]
242
+ state_names = [s.state_id for s in states] + [self.residual_state]
223
243
 
224
244
  return state_names, weights_bins
225
245
 
@@ -14,7 +14,6 @@ from typing import Any, Dict, List, Optional
14
14
 
15
15
  import pandas as pd
16
16
  from vivarium import Component
17
- from vivarium.framework.engine import Builder
18
17
  from vivarium.framework.event import Event
19
18
  from vivarium.framework.population import SimulantData
20
19
  from vivarium.framework.values import list_combiner, union_post_processor
@@ -101,8 +100,8 @@ class RiskAttributableDisease(Component):
101
100
  self.name: {
102
101
  "data_sources": {
103
102
  "raw_disability_weight": f"{self.cause}.disability_weight",
104
- "cause_specific_mortality_rate": "self::load_cause_specific_mortality_rate_data",
105
- "excess_mortality_rate": "self::load_excess_mortality_rate_data",
103
+ "cause_specific_mortality_rate": self.load_cause_specific_mortality_rate_data,
104
+ "excess_mortality_rate": self.load_excess_mortality_rate_data,
106
105
  "population_attributable_fraction": 0,
107
106
  },
108
107
  "threshold": None,
@@ -282,11 +282,11 @@ class DiseaseState(BaseDiseaseState):
282
282
  return {
283
283
  f"{self.name}": {
284
284
  "data_sources": {
285
- "prevalence": "self::load_prevalence",
286
- "birth_prevalence": "self::load_birth_prevalence",
287
- "dwell_time": "self::load_dwell_time",
288
- "disability_weight": "self::load_disability_weight",
289
- "excess_mortality_rate": "self::load_excess_mortality_rate",
285
+ "prevalence": self.load_prevalence,
286
+ "birth_prevalence": self.load_birth_prevalence,
287
+ "dwell_time": self.load_dwell_time,
288
+ "disability_weight": self.load_disability_weight,
289
+ "excess_mortality_rate": self.load_excess_mortality_rate,
290
290
  },
291
291
  },
292
292
  }
@@ -43,7 +43,7 @@ class RateTransition(Transition):
43
43
  return {
44
44
  f"{self.name}": {
45
45
  "data_sources": {
46
- "transition_rate": "self::load_transition_rate",
46
+ "transition_rate": self.load_transition_rate,
47
47
  },
48
48
  },
49
49
  }
@@ -156,7 +156,7 @@ class ProportionTransition(Transition):
156
156
  return {
157
157
  f"{self.name}": {
158
158
  "data_sources": {
159
- "proportion": "self::load_proportion",
159
+ "proportion": self.load_proportion,
160
160
  },
161
161
  },
162
162
  }
@@ -9,7 +9,7 @@ that can parse configurations of components specific to the Vivarium Public
9
9
  Health package.
10
10
 
11
11
  """
12
-
12
+ import warnings
13
13
  from importlib import import_module
14
14
  from typing import Any, Callable, Dict, List, Optional, Union
15
15
 
@@ -56,11 +56,13 @@ class CausesConfigurationParser(ComponentConfigurationParser):
56
56
  DEFAULT_MODEL_CONFIG = {
57
57
  "model_type": f"{DiseaseModel.__module__}.{DiseaseModel.__name__}",
58
58
  "initial_state": None,
59
+ "residual_state": None,
59
60
  }
60
61
  """Default cause model configuration if it's not explicitly specified.
61
62
 
62
- If the initial state is not specified, the cause model must have a state
63
- named 'susceptible'.
63
+ Initial state and residual state cannot both be provided. If neither initial
64
+ state nor residual state has been specified, the cause model must have a
65
+ state named 'susceptible'.
64
66
  """
65
67
 
66
68
  DEFAULT_STATE_CONFIG = {
@@ -104,7 +106,7 @@ class CausesConfigurationParser(ComponentConfigurationParser):
104
106
  causes:
105
107
  cause_1:
106
108
  model_type: vivarium_public_health.disease.DiseaseModel
107
- initial_state: susceptible
109
+ residual_state: susceptible
108
110
  states:
109
111
  susceptible:
110
112
  cause_type: cause
@@ -247,11 +249,13 @@ class CausesConfigurationParser(ComponentConfigurationParser):
247
249
  )
248
250
 
249
251
  model_type = import_by_path(cause_config.model_type)
250
- initial_state = states.get(cause_config.initial_state, None)
252
+ residual_state = states.get(
253
+ cause_config.residual_state, states.get(cause_config.initial_state, None)
254
+ )
251
255
  model = model_type(
252
256
  cause_name,
253
- initial_state=initial_state,
254
257
  states=list(states.values()),
258
+ residual_state=residual_state,
255
259
  get_data_functions=data_sources,
256
260
  )
257
261
  cause_models.append(model)
@@ -403,7 +407,14 @@ class CausesConfigurationParser(ComponentConfigurationParser):
403
407
  # Validation methods #
404
408
  ######################
405
409
 
406
- _CAUSE_KEYS = {"model_type", "initial_state", "states", "transitions", "data_sources"}
410
+ _CAUSE_KEYS = {
411
+ "model_type",
412
+ "initial_state",
413
+ "states",
414
+ "transitions",
415
+ "data_sources",
416
+ "residual_state",
417
+ }
407
418
  _STATE_KEYS = {
408
419
  "state_type",
409
420
  "cause_type",
@@ -535,11 +546,28 @@ class CausesConfigurationParser(ComponentConfigurationParser):
535
546
  )
536
547
  else:
537
548
  initial_state = cause_config.get("initial_state", None)
538
- if initial_state is not None and initial_state not in states_config:
549
+ residual_state = cause_config.get("residual_state", None)
550
+ if initial_state is not None:
551
+ warnings.warn(
552
+ "In the future, the 'initial_state' cause configuration will"
553
+ " be used to initialize all simulants into that state. To"
554
+ " retain the current behavior of defining a residual state,"
555
+ " use the 'residual_state' cause configuration.",
556
+ DeprecationWarning,
557
+ stacklevel=2,
558
+ )
559
+ if residual_state is None:
560
+ residual_state = initial_state
561
+ else:
562
+ error_messages.append(
563
+ "A cause may not have both 'initial_state and"
564
+ " 'residual_state' configurations."
565
+ )
566
+
567
+ if residual_state is not None and residual_state not in states_config:
539
568
  error_messages.append(
540
- f"Initial state '{cause_config['initial_state']}' for cause "
541
- f"'{cause_name}' must be present in the states for cause "
542
- f"'{cause_name}."
569
+ f"Residual state '{residual_state}' for cause '{cause_name}'"
570
+ f" must be present in the states for cause '{cause_name}."
543
571
  )
544
572
  for state_name, state_config in states_config.items():
545
573
  error_messages += self._validate_state(cause_name, state_name, state_config)
@@ -105,7 +105,7 @@ class Mortality(Component):
105
105
  "mortality": {
106
106
  "data_sources": {
107
107
  "all_cause_mortality_rate": "cause.all_causes.cause_specific_mortality_rate",
108
- "unmodeled_cause_specific_mortality_rate": "self::load_unmodeled_csmr",
108
+ "unmodeled_cause_specific_mortality_rate": self.load_unmodeled_csmr,
109
109
  "life_expectancy": "population.theoretical_minimum_risk_life_expectancy",
110
110
  },
111
111
  "unmodeled_causes": [],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vivarium_public_health
3
- Version: 3.0.11
3
+ Version: 3.1.1
4
4
  Summary: Components for modelling diseases, risks, and interventions with ``vivarium``
5
5
  Home-page: https://github.com/ihmeuw/vivarium_public_health
6
6
  Author: The vivarium developers
@@ -26,7 +26,7 @@ Classifier: Topic :: Scientific/Engineering :: Medical Science Apps.
26
26
  Classifier: Topic :: Scientific/Engineering :: Physics
27
27
  Classifier: Topic :: Software Development :: Libraries
28
28
  License-File: LICENSE.txt
29
- Requires-Dist: vivarium >=3.0.3
29
+ Requires-Dist: vivarium >=3.2.0
30
30
  Requires-Dist: layered-config-tree >=1.0.1
31
31
  Requires-Dist: loguru
32
32
  Requires-Dist: numpy <2.0.0
@@ -1,13 +1,13 @@
1
1
  vivarium_public_health/__about__.py,sha256=RgWycPypKZS80TpSX7o41cREnG8PfguNHDHLuLyl820,487
2
2
  vivarium_public_health/__init__.py,sha256=GDeeP-7OlCBwPuv_xQoB1wNmvCaFsqfTB7qnnYApm0w,1343
3
- vivarium_public_health/_version.py,sha256=W1N6WTKcxezCC9VWuVcJYjP2WH4QF_enZGppktJNiZw,23
3
+ vivarium_public_health/_version.py,sha256=14eImCCNxRh4pWMIfkKe4h5OCS1ICfRjHSj2AfgEXa0,22
4
4
  vivarium_public_health/utilities.py,sha256=5cl9jjVkOQ1UeXT4DjDMAhaBNNjAsDo-SVJwpv6FDw0,3071
5
5
  vivarium_public_health/disease/__init__.py,sha256=VUJHDLlE6ngo2qHNQUtZ8OWH5H_T7_ao-xsYKDkRmHw,443
6
- vivarium_public_health/disease/model.py,sha256=0WIYDEx-hwlUJp6Zl8m8bUMoWxuVkOWsJvh_YlZiOPs,8234
6
+ vivarium_public_health/disease/model.py,sha256=wbQvRQF6faTjx6OzokLt6u_9vdAvUrx_P8iQmiKNfv4,9128
7
7
  vivarium_public_health/disease/models.py,sha256=01UK7yB2zGPFzmlIpvhd-XnGe6vSCMDza3QTidgY7Nc,3479
8
- vivarium_public_health/disease/special_disease.py,sha256=3vS1WsO__IwOK0Oe_CUmh3aaKrXIf2CANtmiqlS3pjc,14614
9
- vivarium_public_health/disease/state.py,sha256=PUSDE1UlvoCPT6jPEyCTQO1bXjjYxqzdIa6-Bxpd-7I,22370
10
- vivarium_public_health/disease/transition.py,sha256=fgeVMy86GLrNpZ3J9E4AC0iA5z3aVdP0ZQ0AWa_odTY,6452
8
+ vivarium_public_health/disease/special_disease.py,sha256=ZBtS-eDVptbZ1OjD35dhJvkKw78oDUfTyQSLY7g74dw,14562
9
+ vivarium_public_health/disease/state.py,sha256=ON1RGVLV2BAmq2aGR7u94j3Q0btb0Hz3flr1FCEQHtQ,22355
10
+ vivarium_public_health/disease/transition.py,sha256=G2-L0JvX4tWaHN5zrYXMR2jFj_JXFe9LEbrWjIbplCc,6446
11
11
  vivarium_public_health/mslt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  vivarium_public_health/mslt/delay.py,sha256=aOYjMpMSHEVlJs0FuC2gdq3uj6_vKmkhDjoBtC4i9G0,22812
13
13
  vivarium_public_health/mslt/disease.py,sha256=TBqa7yj6k1oUbgkAe0rIgLpbdMLMFs4DiZ1Igi2BQBg,16663
@@ -16,12 +16,12 @@ vivarium_public_health/mslt/magic_wand_components.py,sha256=pnl-7MwIJIus6UjtvVmM
16
16
  vivarium_public_health/mslt/observer.py,sha256=O4rysQzAGE5oDkdXb0E-qjD9TPFphQHTn7_3Qj7pBL0,15225
17
17
  vivarium_public_health/mslt/population.py,sha256=v_p5VkjndAVJMuXaJQc3lAdzUWHlWCEQWH4A-c4phPA,7255
18
18
  vivarium_public_health/plugins/__init__.py,sha256=oBW_zfgG_LbwfgTDjUe0btfy9FaDvAbtXho1zQFnz0Y,76
19
- vivarium_public_health/plugins/parser.py,sha256=v78mj8awpdrB-oqK8udPI_7MZBChoKJOQN_e17fNEj8,31841
19
+ vivarium_public_health/plugins/parser.py,sha256=WuhgV47EVUAMSR8pQxQfNfQWkR3QtAOL0zhqvLNGdBQ,32946
20
20
  vivarium_public_health/population/__init__.py,sha256=x_9rB93q64Krw-kbBDI1-_U_JsPO1_QrL03AwiFlwXI,243
21
21
  vivarium_public_health/population/add_new_birth_cohorts.py,sha256=k65Li0LYWl-JFHBUvLjJxkRv12EJw_FVxrOYgbd44q8,9078
22
22
  vivarium_public_health/population/base_population.py,sha256=jJMVWv_EO0ckUZHhh01dRbsRgL491Eg3thRxPwNiAeg,18866
23
23
  vivarium_public_health/population/data_transformations.py,sha256=YmqyrlrIBtHGp1nFyhesqlNryvB7Vr33eVu4fU4HWsA,22260
24
- vivarium_public_health/population/mortality.py,sha256=w7b_TUssHjRcnULdXu7MXKfZBjCrlYWbB94oO3JWogI,10264
24
+ vivarium_public_health/population/mortality.py,sha256=WAHtqXOgkX7li_lLvfwJsvJvVjlS5RLvm0DVpu0K3n0,10261
25
25
  vivarium_public_health/results/__init__.py,sha256=rKUZGlRXJgEyFY4a_WJeg3XnC0l34S5guYZ0N9JJS4E,319
26
26
  vivarium_public_health/results/columns.py,sha256=V-L3JgTcsk51Zx9PcUwSgaE1iZjuGyfZ8aShPjynadU,495
27
27
  vivarium_public_health/results/disability.py,sha256=JQm3Q7CoGCT2AgxaoH6MKkvnq4xF83wfFmEvEOvTmvA,9876
@@ -42,8 +42,8 @@ vivarium_public_health/treatment/__init__.py,sha256=wONElu9aJbBYwpYIovYPYaN_GYfV
42
42
  vivarium_public_health/treatment/magic_wand.py,sha256=i9N57-MEuQv5B6dQ5iVMTAdOPghYcgiRRz-dTzigf1s,1980
43
43
  vivarium_public_health/treatment/scale_up.py,sha256=9Cl3_MaCNPtUPPKXf3hWYepIwMCFlFY24jt2jeyFQO4,7006
44
44
  vivarium_public_health/treatment/therapeutic_inertia.py,sha256=8Z97s7GfcpfLu1U1ESJSqeEk4L__a3M0GbBV21MFg2s,2346
45
- vivarium_public_health-3.0.11.dist-info/LICENSE.txt,sha256=mN4bNLUQNcN9njYRc_3jCZkfPySVpmM6MRps104FxA4,1548
46
- vivarium_public_health-3.0.11.dist-info/METADATA,sha256=u0zd8NuWIzdLxDYVFI-XfgksSIjwmiQtzJC7ermq4w0,4062
47
- vivarium_public_health-3.0.11.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
48
- vivarium_public_health-3.0.11.dist-info/top_level.txt,sha256=VVInlpzCFD0UNNhjOq_j-a29odzjwUwYFTGfvqbi4dY,23
49
- vivarium_public_health-3.0.11.dist-info/RECORD,,
45
+ vivarium_public_health-3.1.1.dist-info/LICENSE.txt,sha256=mN4bNLUQNcN9njYRc_3jCZkfPySVpmM6MRps104FxA4,1548
46
+ vivarium_public_health-3.1.1.dist-info/METADATA,sha256=T9qvhChXoRbfWilAVz8Rbi2GkPMnDxsy-bcY16jZggk,4061
47
+ vivarium_public_health-3.1.1.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91
48
+ vivarium_public_health-3.1.1.dist-info/top_level.txt,sha256=VVInlpzCFD0UNNhjOq_j-a29odzjwUwYFTGfvqbi4dY,23
49
+ vivarium_public_health-3.1.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (75.4.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5