vivarium-public-health 3.1.0__py3-none-any.whl → 3.1.2__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. vivarium_public_health/_version.py +1 -1
  2. vivarium_public_health/disease/model.py +40 -28
  3. vivarium_public_health/disease/special_disease.py +7 -8
  4. vivarium_public_health/disease/state.py +23 -22
  5. vivarium_public_health/disease/transition.py +11 -10
  6. vivarium_public_health/mslt/delay.py +5 -5
  7. vivarium_public_health/mslt/disease.py +5 -5
  8. vivarium_public_health/mslt/intervention.py +8 -8
  9. vivarium_public_health/mslt/magic_wand_components.py +3 -3
  10. vivarium_public_health/mslt/observer.py +4 -6
  11. vivarium_public_health/mslt/population.py +4 -6
  12. vivarium_public_health/plugins/parser.py +57 -30
  13. vivarium_public_health/population/add_new_birth_cohorts.py +3 -5
  14. vivarium_public_health/population/base_population.py +8 -10
  15. vivarium_public_health/population/data_transformations.py +4 -5
  16. vivarium_public_health/population/mortality.py +7 -7
  17. vivarium_public_health/results/disability.py +1 -3
  18. vivarium_public_health/results/disease.py +5 -5
  19. vivarium_public_health/results/mortality.py +3 -3
  20. vivarium_public_health/results/observer.py +7 -7
  21. vivarium_public_health/results/risk.py +3 -3
  22. vivarium_public_health/risks/base_risk.py +4 -4
  23. vivarium_public_health/risks/distributions.py +15 -15
  24. vivarium_public_health/risks/effect.py +10 -10
  25. vivarium_public_health/risks/implementations/low_birth_weight_and_short_gestation.py +17 -16
  26. vivarium_public_health/treatment/magic_wand.py +3 -3
  27. vivarium_public_health/treatment/scale_up.py +6 -5
  28. vivarium_public_health/utilities.py +4 -5
  29. {vivarium_public_health-3.1.0.dist-info → vivarium_public_health-3.1.2.dist-info}/METADATA +2 -2
  30. vivarium_public_health-3.1.2.dist-info/RECORD +49 -0
  31. {vivarium_public_health-3.1.0.dist-info → vivarium_public_health-3.1.2.dist-info}/WHEEL +1 -1
  32. vivarium_public_health-3.1.0.dist-info/RECORD +0 -49
  33. {vivarium_public_health-3.1.0.dist-info → vivarium_public_health-3.1.2.dist-info}/LICENSE.txt +0 -0
  34. {vivarium_public_health-3.1.0.dist-info → vivarium_public_health-3.1.2.dist-info}/top_level.txt +0 -0
@@ -1 +1 @@
1
- __version__ = "3.1.0"
1
+ __version__ = "3.1.2"
@@ -8,8 +8,9 @@ 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
-
12
- from typing import Any, Callable, Dict, List, Optional, Tuple, Union
11
+ import warnings
12
+ from collections.abc import Callable, Iterable
13
+ from typing import Any
13
14
 
14
15
  import numpy as np
15
16
  import pandas as pd
@@ -34,25 +35,25 @@ class DiseaseModel(Machine):
34
35
  ##############
35
36
 
36
37
  @property
37
- def configuration_defaults(self) -> Dict[str, Any]:
38
+ def configuration_defaults(self) -> dict[str, Any]:
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
  }
45
46
 
46
47
  @property
47
- def columns_created(self) -> List[str]:
48
+ def columns_created(self) -> list[str]:
48
49
  return [self.state_column]
49
50
 
50
51
  @property
51
- def columns_required(self) -> Optional[List[str]]:
52
+ def columns_required(self) -> list[str] | None:
52
53
  return ["age", "sex"]
53
54
 
54
55
  @property
55
- def initialization_requirements(self) -> Dict[str, List[str]]:
56
+ def initialization_requirements(self) -> dict[str, list[str]]:
56
57
  return {
57
58
  "requires_columns": ["age", "sex"],
58
59
  "requires_values": [],
@@ -60,11 +61,11 @@ class DiseaseModel(Machine):
60
61
  }
61
62
 
62
63
  @property
63
- def state_names(self) -> List[str]:
64
+ def state_names(self) -> list[str]:
64
65
  return [s.state_id for s in self.states]
65
66
 
66
67
  @property
67
- def transition_names(self) -> List[TransitionString]:
68
+ def transition_names(self) -> list[TransitionString]:
68
69
  return [
69
70
  state_name for state in self.states for state_name in state.get_transition_names()
70
71
  ]
@@ -76,19 +77,38 @@ class DiseaseModel(Machine):
76
77
  def __init__(
77
78
  self,
78
79
  cause: str,
79
- initial_state: Optional[BaseDiseaseState] = None,
80
- get_data_functions: Optional[Dict[str, Callable]] = None,
80
+ initial_state: BaseDiseaseState | None = None,
81
+ get_data_functions: dict[str, Callable] | None = 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 {}
@@ -111,9 +131,7 @@ class DiseaseModel(Machine):
111
131
  # Setup methods #
112
132
  #################
113
133
 
114
- def load_cause_specific_mortality_rate(
115
- self, builder: Builder
116
- ) -> Union[float, pd.DataFrame]:
134
+ def load_cause_specific_mortality_rate(self, builder: Builder) -> float | pd.DataFrame:
117
135
  if "cause_specific_mortality_rate" not in self._get_data_functions:
118
136
  only_morbid = builder.data.load(f"cause.{self.cause}.restrictions")["yld_only"]
119
137
  if only_morbid:
@@ -135,7 +153,7 @@ class DiseaseModel(Machine):
135
153
  def on_initialize_simulants(self, pop_data: SimulantData) -> None:
136
154
  population = self.population_view.subview(["age", "sex"]).get(pop_data.index)
137
155
 
138
- assert self.initial_state in {s.state_id for s in self.states}
156
+ assert self.residual_state in {s.state_id for s in self.states}
139
157
 
140
158
  if pop_data.user_data["sim_state"] == "setup": # simulation start
141
159
  if self.configuration_age_start != self.configuration_age_end != 0:
@@ -176,16 +194,10 @@ class DiseaseModel(Machine):
176
194
  )
177
195
  else:
178
196
  condition_column = pd.Series(
179
- self.initial_state, index=population.index, name=self.state_column
197
+ self.residual_state, index=population.index, name=self.state_column
180
198
  )
181
199
  self.population_view.update(condition_column)
182
200
 
183
- def on_time_step(self, event: Event) -> None:
184
- self.transition(event.index, event.time)
185
-
186
- def on_time_step_cleanup(self, event: Event) -> None:
187
- self.cleanup(event.index, event.time)
188
-
189
201
  ##################################
190
202
  # Pipeline sources and modifiers #
191
203
  ##################################
@@ -197,7 +209,7 @@ class DiseaseModel(Machine):
197
209
  # Helper functions #
198
210
  ####################
199
211
 
200
- def _get_default_initial_state(self):
212
+ def _get_default_residual_state(self):
201
213
  susceptible_states = [s for s in self.states if isinstance(s, SusceptibleState)]
202
214
  if len(susceptible_states) != 1:
203
215
  raise DiseaseModelError("Disease model must have exactly one SusceptibleState.")
@@ -205,7 +217,7 @@ class DiseaseModel(Machine):
205
217
 
206
218
  def get_state_weights(
207
219
  self, pop_index: pd.Index, prevalence_type: str
208
- ) -> Tuple[List[str], Union[np.ndarray, None]]:
220
+ ) -> tuple[list[str], np.ndarray | None]:
209
221
  states = [state for state in self.states if state.lookup_tables.get(prevalence_type)]
210
222
 
211
223
  if not states:
@@ -219,7 +231,7 @@ class DiseaseModel(Machine):
219
231
  weights = np.array(weights).T
220
232
  weights_bins = np.cumsum(weights, axis=1)
221
233
 
222
- state_names = [s.state_id for s in states] + [self.initial_state]
234
+ state_names = [s.state_id for s in states] + [self.residual_state]
223
235
 
224
236
  return state_names, weights_bins
225
237
 
@@ -10,11 +10,10 @@ This module contains frequently used, but non-standard disease models.
10
10
  import re
11
11
  from collections import namedtuple
12
12
  from operator import gt, lt
13
- from typing import Any, Dict, List, Optional
13
+ from typing import Any
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
@@ -96,13 +95,13 @@ class RiskAttributableDisease(Component):
96
95
  return f"risk_attributable_disease.{self.cause.name}"
97
96
 
98
97
  @property
99
- def configuration_defaults(self) -> Dict[str, Any]:
98
+ def configuration_defaults(self) -> dict[str, Any]:
100
99
  return {
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,
@@ -112,7 +111,7 @@ class RiskAttributableDisease(Component):
112
111
  }
113
112
 
114
113
  @property
115
- def columns_created(self) -> List[str]:
114
+ def columns_created(self) -> list[str]:
116
115
  return [
117
116
  self.cause.name,
118
117
  self.diseased_event_time_column,
@@ -120,11 +119,11 @@ class RiskAttributableDisease(Component):
120
119
  ]
121
120
 
122
121
  @property
123
- def columns_required(self) -> Optional[List[str]]:
122
+ def columns_required(self) -> list[str] | None:
124
123
  return ["alive"]
125
124
 
126
125
  @property
127
- def initialization_requirements(self) -> Dict[str, List[str]]:
126
+ def initialization_requirements(self) -> dict[str, list[str]]:
128
127
  return {
129
128
  "requires_columns": [],
130
129
  "requires_values": [f"{self.risk.name}.exposure"],
@@ -7,7 +7,8 @@ This module contains tools to manage standard disease states.
7
7
 
8
8
  """
9
9
 
10
- from typing import Any, Callable, Dict, List, Optional
10
+ from collections.abc import Callable
11
+ from typing import Any
11
12
 
12
13
  import numpy as np
13
14
  import pandas as pd
@@ -36,11 +37,11 @@ class BaseDiseaseState(State):
36
37
  return [self.event_time_column, self.event_count_column]
37
38
 
38
39
  @property
39
- def columns_required(self) -> Optional[List[str]]:
40
+ def columns_required(self) -> list[str] | None:
40
41
  return [self.model, "alive"]
41
42
 
42
43
  @property
43
- def initialization_requirements(self) -> Dict[str, List[str]]:
44
+ def initialization_requirements(self) -> dict[str, list[str]]:
44
45
  return {
45
46
  "requires_columns": [self.model],
46
47
  "requires_values": [],
@@ -55,7 +56,7 @@ class BaseDiseaseState(State):
55
56
  self,
56
57
  state_id: str,
57
58
  allow_self_transition: bool = False,
58
- side_effect_function: Optional[Callable] = None,
59
+ side_effect_function: Callable | None = None,
59
60
  cause_type: str = "cause",
60
61
  ):
61
62
  super().__init__(state_id, allow_self_transition) # becomes state_id
@@ -83,7 +84,7 @@ class BaseDiseaseState(State):
83
84
  # Helper methods #
84
85
  ##################
85
86
 
86
- def get_initialization_parameters(self) -> Dict[str, Any]:
87
+ def get_initialization_parameters(self) -> dict[str, Any]:
87
88
  """Exclude side effect function and cause type from name and __repr__."""
88
89
  initialization_parameters = super().get_initialization_parameters()
89
90
  for key in ["side_effect_function", "cause_type"]:
@@ -118,7 +119,7 @@ class BaseDiseaseState(State):
118
119
  # Public methods #
119
120
  ##################
120
121
 
121
- def get_transition_names(self) -> List[str]:
122
+ def get_transition_names(self) -> list[str]:
122
123
  transitions = []
123
124
  for trans in self.transition_set.transitions:
124
125
  init_state = trans.input_state.name.split(".")[1]
@@ -129,7 +130,7 @@ class BaseDiseaseState(State):
129
130
  def add_rate_transition(
130
131
  self,
131
132
  output: "BaseDiseaseState",
132
- get_data_functions: Dict[str, Callable] = None,
133
+ get_data_functions: dict[str, Callable] = None,
133
134
  triggered=Trigger.NOT_TRIGGERED,
134
135
  ) -> RateTransition:
135
136
  """Builds a RateTransition from this state to the given state.
@@ -156,7 +157,7 @@ class BaseDiseaseState(State):
156
157
  def add_proportion_transition(
157
158
  self,
158
159
  output: "BaseDiseaseState",
159
- get_data_functions: Optional[Dict[str, Callable]] = None,
160
+ get_data_functions: dict[str, Callable] | None = None,
160
161
  triggered=Trigger.NOT_TRIGGERED,
161
162
  ) -> ProportionTransition:
162
163
  """Builds a ProportionTransition from this state to the given state.
@@ -198,7 +199,7 @@ class NonDiseasedState(BaseDiseaseState):
198
199
  self,
199
200
  state_id: str,
200
201
  allow_self_transition: bool = False,
201
- side_effect_function: Optional[Callable] = None,
202
+ side_effect_function: Callable | None = None,
202
203
  cause_type: str = "cause",
203
204
  name_prefix: str = "",
204
205
  ):
@@ -218,7 +219,7 @@ class NonDiseasedState(BaseDiseaseState):
218
219
  def add_rate_transition(
219
220
  self,
220
221
  output: BaseDiseaseState,
221
- get_data_functions: Dict[str, Callable] = None,
222
+ get_data_functions: dict[str, Callable] = None,
222
223
  **kwargs,
223
224
  ) -> RateTransition:
224
225
  if get_data_functions is None:
@@ -241,7 +242,7 @@ class SusceptibleState(NonDiseasedState):
241
242
  self,
242
243
  state_id: str,
243
244
  allow_self_transition: bool = False,
244
- side_effect_function: Optional[Callable] = None,
245
+ side_effect_function: Callable | None = None,
245
246
  cause_type: str = "cause",
246
247
  ):
247
248
  super().__init__(
@@ -258,7 +259,7 @@ class RecoveredState(NonDiseasedState):
258
259
  self,
259
260
  state_id: str,
260
261
  allow_self_transition: bool = False,
261
- side_effect_function: Optional[Callable] = None,
262
+ side_effect_function: Callable | None = None,
262
263
  cause_type: str = "cause",
263
264
  ):
264
265
  super().__init__(
@@ -278,15 +279,15 @@ class DiseaseState(BaseDiseaseState):
278
279
  ##############
279
280
 
280
281
  @property
281
- def configuration_defaults(self) -> Dict[str, Any]:
282
+ def configuration_defaults(self) -> dict[str, Any]:
282
283
  return {
283
284
  f"{self.name}": {
284
285
  "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",
286
+ "prevalence": self.load_prevalence,
287
+ "birth_prevalence": self.load_birth_prevalence,
288
+ "dwell_time": self.load_dwell_time,
289
+ "disability_weight": self.load_disability_weight,
290
+ "excess_mortality_rate": self.load_excess_mortality_rate,
290
291
  },
291
292
  },
292
293
  }
@@ -299,10 +300,10 @@ class DiseaseState(BaseDiseaseState):
299
300
  self,
300
301
  state_id: str,
301
302
  allow_self_transition: bool = False,
302
- side_effect_function: Optional[Callable] = None,
303
+ side_effect_function: Callable | None = None,
303
304
  cause_type: str = "cause",
304
- get_data_functions: Optional[Dict[str, Callable]] = None,
305
- cleanup_function: Optional[Callable] = None,
305
+ get_data_functions: dict[str, Callable] | None = None,
306
+ cleanup_function: Callable | None = None,
306
307
  ):
307
308
  """
308
309
  Parameters
@@ -472,7 +473,7 @@ class DiseaseState(BaseDiseaseState):
472
473
  def add_rate_transition(
473
474
  self,
474
475
  output: BaseDiseaseState,
475
- get_data_functions: Dict[str, Callable] = None,
476
+ get_data_functions: dict[str, Callable] = None,
476
477
  **kwargs,
477
478
  ) -> RateTransition:
478
479
  if get_data_functions is None:
@@ -7,7 +7,8 @@ This module contains tools to model transitions between disease states.
7
7
 
8
8
  """
9
9
 
10
- from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union
10
+ from collections.abc import Callable
11
+ from typing import TYPE_CHECKING, Any
11
12
 
12
13
  import pandas as pd
13
14
  from vivarium.framework.engine import Builder
@@ -39,17 +40,17 @@ class RateTransition(Transition):
39
40
  ##############
40
41
 
41
42
  @property
42
- def configuration_defaults(self) -> Dict[str, Any]:
43
+ def configuration_defaults(self) -> dict[str, Any]:
43
44
  return {
44
45
  f"{self.name}": {
45
46
  "data_sources": {
46
- "transition_rate": "self::load_transition_rate",
47
+ "transition_rate": self.load_transition_rate,
47
48
  },
48
49
  },
49
50
  }
50
51
 
51
52
  @property
52
- def columns_required(self) -> Optional[List[str]]:
53
+ def columns_required(self) -> list[str] | None:
53
54
  return ["alive"]
54
55
 
55
56
  @property
@@ -77,7 +78,7 @@ class RateTransition(Transition):
77
78
  self,
78
79
  input_state: "BaseDiseaseState",
79
80
  output_state: "BaseDiseaseState",
80
- get_data_functions: Dict[str, Callable] = None,
81
+ get_data_functions: dict[str, Callable] = None,
81
82
  triggered=Trigger.NOT_TRIGGERED,
82
83
  ):
83
84
  super().__init__(
@@ -108,7 +109,7 @@ class RateTransition(Transition):
108
109
  # Setup methods #
109
110
  #################
110
111
 
111
- def load_transition_rate(self, builder: Builder) -> Union[float, pd.DataFrame]:
112
+ def load_transition_rate(self, builder: Builder) -> float | pd.DataFrame:
112
113
  if "incidence_rate" in self._get_data_functions:
113
114
  rate_data = self._get_data_functions["incidence_rate"](
114
115
  builder, self.output_state.state_id
@@ -152,11 +153,11 @@ class ProportionTransition(Transition):
152
153
  ##############
153
154
 
154
155
  @property
155
- def configuration_defaults(self) -> Dict[str, Any]:
156
+ def configuration_defaults(self) -> dict[str, Any]:
156
157
  return {
157
158
  f"{self.name}": {
158
159
  "data_sources": {
159
- "proportion": "self::load_proportion",
160
+ "proportion": self.load_proportion,
160
161
  },
161
162
  },
162
163
  }
@@ -169,7 +170,7 @@ class ProportionTransition(Transition):
169
170
  self,
170
171
  input_state: "BaseDiseaseState",
171
172
  output_state: "BaseDiseaseState",
172
- get_data_functions: Dict[str, Callable] = None,
173
+ get_data_functions: dict[str, Callable] = None,
173
174
  triggered=Trigger.NOT_TRIGGERED,
174
175
  ):
175
176
  super().__init__(
@@ -183,7 +184,7 @@ class ProportionTransition(Transition):
183
184
  # Setup methods #
184
185
  #################
185
186
 
186
- def load_proportion(self, builder: Builder) -> Union[float, pd.DataFrame]:
187
+ def load_proportion(self, builder: Builder) -> float | pd.DataFrame:
187
188
  if "proportion" not in self._get_data_functions:
188
189
  raise ValueError("Must supply a proportion function")
189
190
  return self._get_data_functions["proportion"](builder, self.output_state.state_id)
@@ -8,7 +8,7 @@ lifetable simulation.
8
8
 
9
9
  """
10
10
 
11
- from typing import Any, Dict, List, Optional
11
+ from typing import Any
12
12
 
13
13
  import numpy as np
14
14
  import pandas as pd
@@ -93,7 +93,7 @@ class DelayedRisk(Component):
93
93
  ##############
94
94
 
95
95
  @property
96
- def configuration_defaults(self) -> Dict[str, Any]:
96
+ def configuration_defaults(self) -> dict[str, Any]:
97
97
  return {
98
98
  self.risk: {
99
99
  "constant_prevalence": False,
@@ -103,15 +103,15 @@ class DelayedRisk(Component):
103
103
  }
104
104
 
105
105
  @property
106
- def columns_created(self) -> List[str]:
106
+ def columns_created(self) -> list[str]:
107
107
  return self._bin_names
108
108
 
109
109
  @property
110
- def columns_required(self) -> Optional[List[str]]:
110
+ def columns_required(self) -> list[str] | None:
111
111
  return ["age", "sex", "population"]
112
112
 
113
113
  @property
114
- def initialization_requirements(self) -> Dict[str, List[str]]:
114
+ def initialization_requirements(self) -> dict[str, list[str]]:
115
115
  return {
116
116
  "requires_columns": ["age", "sex", "population"],
117
117
  "requires_values": [],
@@ -8,7 +8,7 @@ simulations.
8
8
 
9
9
  """
10
10
 
11
- from typing import Any, Dict, List, Optional
11
+ from typing import Any
12
12
 
13
13
  import numpy as np
14
14
  import pandas as pd
@@ -143,7 +143,7 @@ class Disease(Component):
143
143
  ##############
144
144
 
145
145
  @property
146
- def configuration_defaults(self) -> Dict[str, Any]:
146
+ def configuration_defaults(self) -> dict[str, Any]:
147
147
  return {
148
148
  self.disease: {
149
149
  "simplified_no_remission_equations": False,
@@ -151,7 +151,7 @@ class Disease(Component):
151
151
  }
152
152
 
153
153
  @property
154
- def columns_created(self) -> List[str]:
154
+ def columns_created(self) -> list[str]:
155
155
  columns = []
156
156
  for scenario in ["", "_intervention"]:
157
157
  for rate in ["_S", "_C"]:
@@ -160,11 +160,11 @@ class Disease(Component):
160
160
  return columns
161
161
 
162
162
  @property
163
- def columns_required(self) -> Optional[List[str]]:
163
+ def columns_required(self) -> list[str] | None:
164
164
  return ["age", "sex"]
165
165
 
166
166
  @property
167
- def initialization_requirements(self) -> Dict[str, List[str]]:
167
+ def initialization_requirements(self) -> dict[str, list[str]]:
168
168
  return {
169
169
  "requires_columns": ["age", "sex"],
170
170
  "requires_values": [],
@@ -8,7 +8,7 @@ simulations.
8
8
 
9
9
  """
10
10
 
11
- from typing import Any, Dict
11
+ from typing import Any
12
12
 
13
13
  from vivarium import Component
14
14
  from vivarium.framework.engine import Builder
@@ -22,7 +22,7 @@ class ModifyAllCauseMortality(Component):
22
22
  ##############
23
23
 
24
24
  @property
25
- def configuration_defaults(self) -> Dict[str, Any]:
25
+ def configuration_defaults(self) -> dict[str, Any]:
26
26
  return {
27
27
  "intervention": {
28
28
  self.intervention: {
@@ -62,7 +62,7 @@ class ModifyDiseaseRate(Component):
62
62
  ##############
63
63
 
64
64
  @property
65
- def configuration_defaults(self) -> Dict[str, Any]:
65
+ def configuration_defaults(self) -> dict[str, Any]:
66
66
  return {
67
67
  "intervention": {
68
68
  self.intervention: {
@@ -144,7 +144,7 @@ class ModifyAcuteDiseaseIncidence(Component):
144
144
  ##############
145
145
 
146
146
  @property
147
- def configuration_defaults(self) -> Dict[str, Any]:
147
+ def configuration_defaults(self) -> dict[str, Any]:
148
148
  return {
149
149
  "intervention": {
150
150
  self.intervention: {
@@ -187,7 +187,7 @@ class ModifyAcuteDiseaseMorbidity(Component):
187
187
  ##############
188
188
 
189
189
  @property
190
- def configuration_defaults(self) -> Dict[str, Any]:
190
+ def configuration_defaults(self) -> dict[str, Any]:
191
191
  return {
192
192
  "intervention": {
193
193
  self.intervention: {
@@ -228,7 +228,7 @@ class ModifyAcuteDiseaseMortality(Component):
228
228
  ##############
229
229
 
230
230
  @property
231
- def configuration_defaults(self) -> Dict[str, Any]:
231
+ def configuration_defaults(self) -> dict[str, Any]:
232
232
  return {
233
233
  "intervention": {
234
234
  self.intervention: {
@@ -269,7 +269,7 @@ class TobaccoFreeGeneration(Component):
269
269
  ##############
270
270
 
271
271
  @property
272
- def configuration_defaults(self) -> Dict[str, Any]:
272
+ def configuration_defaults(self) -> dict[str, Any]:
273
273
  return {
274
274
  "tobacco_free_generation": {
275
275
  "year": 2020,
@@ -310,7 +310,7 @@ class TobaccoEradication(Component):
310
310
  ##############
311
311
 
312
312
  @property
313
- def configuration_defaults(self) -> Dict[str, Any]:
313
+ def configuration_defaults(self) -> dict[str, Any]:
314
314
  return {
315
315
  "tobacco_eradication": {
316
316
  "year": 2020,
@@ -8,7 +8,7 @@ multi-state lifetable simulations.
8
8
 
9
9
  """
10
10
 
11
- from typing import Any, Dict
11
+ from typing import Any
12
12
 
13
13
  from vivarium import Component
14
14
  from vivarium.framework.engine import Builder
@@ -73,7 +73,7 @@ class ModifyAcuteDiseaseYLD(Component):
73
73
  ##############
74
74
 
75
75
  @property
76
- def configuration_defaults(self) -> Dict[str, Any]:
76
+ def configuration_defaults(self) -> dict[str, Any]:
77
77
  return {
78
78
  "intervention": {
79
79
  self.disease: {
@@ -112,7 +112,7 @@ class ModifyAcuteDiseaseMortality(Component):
112
112
  ##############
113
113
 
114
114
  @property
115
- def configuration_defaults(self) -> Dict[str, Any]:
115
+ def configuration_defaults(self) -> dict[str, Any]:
116
116
  return {
117
117
  "intervention": {
118
118
  self.disease: {
@@ -8,8 +8,6 @@ multi-state lifetable simulations.
8
8
 
9
9
  """
10
10
 
11
- from typing import List, Optional
12
-
13
11
  import pandas as pd
14
12
  from vivarium import Component
15
13
  from vivarium.framework.engine import Builder
@@ -76,7 +74,7 @@ class MorbidityMortality(Component):
76
74
  ##############
77
75
 
78
76
  @property
79
- def columns_required(self) -> Optional[List[str]]:
77
+ def columns_required(self) -> list[str] | None:
80
78
  return [
81
79
  "age",
82
80
  "sex",
@@ -224,7 +222,7 @@ class Disease(Component):
224
222
  ##############
225
223
 
226
224
  @property
227
- def columns_required(self) -> Optional[List[str]]:
225
+ def columns_required(self) -> list[str] | None:
228
226
  return [
229
227
  "age",
230
228
  "sex",
@@ -238,7 +236,7 @@ class Disease(Component):
238
236
  # Lifecycle methods #
239
237
  #####################
240
238
 
241
- def __init__(self, disease: str, output_suffix: Optional[str] = None):
239
+ def __init__(self, disease: str, output_suffix: str | None = None):
242
240
  super().__init__()
243
241
  self.disease = disease
244
242
  if output_suffix is None:
@@ -335,7 +333,7 @@ class TobaccoPrevalence(Component):
335
333
  ##############
336
334
 
337
335
  @property
338
- def columns_required(self) -> Optional[List[str]]:
336
+ def columns_required(self) -> list[str] | None:
339
337
  return ["age", "sex", "bau_population", "population"] + self._bin_names
340
338
 
341
339
  #####################