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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. vivarium_public_health/_version.py +1 -1
  2. vivarium_public_health/disease/model.py +12 -20
  3. vivarium_public_health/disease/special_disease.py +5 -5
  4. vivarium_public_health/disease/state.py +18 -17
  5. vivarium_public_health/disease/transition.py +9 -8
  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 +18 -19
  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 +6 -6
  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 +45 -33
  25. vivarium_public_health/risks/implementations/low_birth_weight_and_short_gestation.py +20 -20
  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.1.dist-info → vivarium_public_health-3.1.3.dist-info}/METADATA +32 -32
  30. vivarium_public_health-3.1.3.dist-info/RECORD +49 -0
  31. {vivarium_public_health-3.1.1.dist-info → vivarium_public_health-3.1.3.dist-info}/WHEEL +1 -1
  32. vivarium_public_health-3.1.1.dist-info/RECORD +0 -49
  33. {vivarium_public_health-3.1.1.dist-info → vivarium_public_health-3.1.3.dist-info}/LICENSE.txt +0 -0
  34. {vivarium_public_health-3.1.1.dist-info → vivarium_public_health-3.1.3.dist-info}/top_level.txt +0 -0
@@ -1 +1 @@
1
- __version__ = "3.1.1"
1
+ __version__ = "3.1.3"
@@ -9,8 +9,8 @@ transitions at simulation initialization and during transitions.
9
9
 
10
10
  """
11
11
  import warnings
12
- from collections.abc import Iterable
13
- from typing import Any, Callable, Dict, List, Optional, Tuple, Union
12
+ from collections.abc import Callable, Iterable
13
+ from typing import Any
14
14
 
15
15
  import numpy as np
16
16
  import pandas as pd
@@ -35,7 +35,7 @@ class DiseaseModel(Machine):
35
35
  ##############
36
36
 
37
37
  @property
38
- def configuration_defaults(self) -> Dict[str, Any]:
38
+ def configuration_defaults(self) -> dict[str, Any]:
39
39
  return {
40
40
  f"{self.name}": {
41
41
  "data_sources": {
@@ -45,15 +45,15 @@ class DiseaseModel(Machine):
45
45
  }
46
46
 
47
47
  @property
48
- def columns_created(self) -> List[str]:
48
+ def columns_created(self) -> list[str]:
49
49
  return [self.state_column]
50
50
 
51
51
  @property
52
- def columns_required(self) -> Optional[List[str]]:
52
+ def columns_required(self) -> list[str] | None:
53
53
  return ["age", "sex"]
54
54
 
55
55
  @property
56
- def initialization_requirements(self) -> Dict[str, List[str]]:
56
+ def initialization_requirements(self) -> dict[str, list[str]]:
57
57
  return {
58
58
  "requires_columns": ["age", "sex"],
59
59
  "requires_values": [],
@@ -61,11 +61,11 @@ class DiseaseModel(Machine):
61
61
  }
62
62
 
63
63
  @property
64
- def state_names(self) -> List[str]:
64
+ def state_names(self) -> list[str]:
65
65
  return [s.state_id for s in self.states]
66
66
 
67
67
  @property
68
- def transition_names(self) -> List[TransitionString]:
68
+ def transition_names(self) -> list[TransitionString]:
69
69
  return [
70
70
  state_name for state in self.states for state_name in state.get_transition_names()
71
71
  ]
@@ -77,8 +77,8 @@ class DiseaseModel(Machine):
77
77
  def __init__(
78
78
  self,
79
79
  cause: str,
80
- initial_state: Optional[BaseDiseaseState] = None,
81
- get_data_functions: Optional[Dict[str, Callable]] = None,
80
+ initial_state: BaseDiseaseState | None = None,
81
+ get_data_functions: dict[str, Callable] | None = None,
82
82
  cause_type: str = "cause",
83
83
  states: Iterable[BaseDiseaseState] = (),
84
84
  residual_state: BaseDiseaseState | None = None,
@@ -131,9 +131,7 @@ class DiseaseModel(Machine):
131
131
  # Setup methods #
132
132
  #################
133
133
 
134
- def load_cause_specific_mortality_rate(
135
- self, builder: Builder
136
- ) -> Union[float, pd.DataFrame]:
134
+ def load_cause_specific_mortality_rate(self, builder: Builder) -> float | pd.DataFrame:
137
135
  if "cause_specific_mortality_rate" not in self._get_data_functions:
138
136
  only_morbid = builder.data.load(f"cause.{self.cause}.restrictions")["yld_only"]
139
137
  if only_morbid:
@@ -200,12 +198,6 @@ class DiseaseModel(Machine):
200
198
  )
201
199
  self.population_view.update(condition_column)
202
200
 
203
- def on_time_step(self, event: Event) -> None:
204
- self.transition(event.index, event.time)
205
-
206
- def on_time_step_cleanup(self, event: Event) -> None:
207
- self.cleanup(event.index, event.time)
208
-
209
201
  ##################################
210
202
  # Pipeline sources and modifiers #
211
203
  ##################################
@@ -225,7 +217,7 @@ class DiseaseModel(Machine):
225
217
 
226
218
  def get_state_weights(
227
219
  self, pop_index: pd.Index, prevalence_type: str
228
- ) -> Tuple[List[str], Union[np.ndarray, None]]:
220
+ ) -> tuple[list[str], np.ndarray | None]:
229
221
  states = [state for state in self.states if state.lookup_tables.get(prevalence_type)]
230
222
 
231
223
  if not states:
@@ -10,7 +10,7 @@ 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
@@ -95,7 +95,7 @@ class RiskAttributableDisease(Component):
95
95
  return f"risk_attributable_disease.{self.cause.name}"
96
96
 
97
97
  @property
98
- def configuration_defaults(self) -> Dict[str, Any]:
98
+ def configuration_defaults(self) -> dict[str, Any]:
99
99
  return {
100
100
  self.name: {
101
101
  "data_sources": {
@@ -111,7 +111,7 @@ class RiskAttributableDisease(Component):
111
111
  }
112
112
 
113
113
  @property
114
- def columns_created(self) -> List[str]:
114
+ def columns_created(self) -> list[str]:
115
115
  return [
116
116
  self.cause.name,
117
117
  self.diseased_event_time_column,
@@ -119,11 +119,11 @@ class RiskAttributableDisease(Component):
119
119
  ]
120
120
 
121
121
  @property
122
- def columns_required(self) -> Optional[List[str]]:
122
+ def columns_required(self) -> list[str] | None:
123
123
  return ["alive"]
124
124
 
125
125
  @property
126
- def initialization_requirements(self) -> Dict[str, List[str]]:
126
+ def initialization_requirements(self) -> dict[str, list[str]]:
127
127
  return {
128
128
  "requires_columns": [],
129
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,7 +279,7 @@ 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": {
@@ -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,7 +40,7 @@ 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": {
@@ -49,7 +50,7 @@ class RateTransition(Transition):
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,7 +153,7 @@ 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": {
@@ -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
  #####################
@@ -8,8 +8,6 @@ multi-state lifetable simulations.
8
8
 
9
9
  """
10
10
 
11
- from typing import List, Optional
12
-
13
11
  import numpy as np
14
12
  import pandas as pd
15
13
  from vivarium import Component
@@ -50,7 +48,7 @@ class BasePopulation(Component):
50
48
  ##############
51
49
 
52
50
  @property
53
- def columns_created(self) -> List[str]:
51
+ def columns_created(self) -> list[str]:
54
52
  return [
55
53
  "age",
56
54
  "sex",
@@ -71,7 +69,7 @@ class BasePopulation(Component):
71
69
  ]
72
70
 
73
71
  @property
74
- def columns_required(self) -> Optional[List[str]]:
72
+ def columns_required(self) -> list[str] | None:
75
73
  return ["tracked"]
76
74
 
77
75
  #####################
@@ -122,7 +120,7 @@ class Mortality(Component):
122
120
  ##############
123
121
 
124
122
  @property
125
- def columns_required(self) -> Optional[List[str]]:
123
+ def columns_required(self) -> list[str] | None:
126
124
  return [
127
125
  "population",
128
126
  "bau_population",
@@ -190,7 +188,7 @@ class Disability(Component):
190
188
  ##############
191
189
 
192
190
  @property
193
- def columns_required(self) -> Optional[List[str]]:
191
+ def columns_required(self) -> list[str] | None:
194
192
  return [
195
193
  "bau_yld_rate",
196
194
  "yld_rate",