Skip to content

Commit 62ba90d

Browse files
committed
more updates
1 parent cefa3c2 commit 62ba90d

File tree

4 files changed

+103
-65
lines changed

4 files changed

+103
-65
lines changed

input/input.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"mu": 0.1,
2929
"sigma": 0.1
3030
},
31-
"probability_critical_given_severe": 0.2,
31+
"probability_critical_given_severe": {"Young": 0.05, "Old": 0.1},
3232
"severe_to_critical_delay": {
3333
"mu": 0.1,
3434
"sigma": 0.1
@@ -37,7 +37,7 @@
3737
"mu": 0.1,
3838
"sigma": 0.1
3939
},
40-
"probability_dead_given_critical": 0.2,
40+
"probability_dead_given_critical": {"Young": 0.005, "Old": 0.1},
4141
"critical_to_dead_delay": {
4242
"mu": 0.1,
4343
"sigma": 0.1

src/parameters.rs

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ use ixa::{HashMap, HashMapExt, prelude::*};
22
use serde::{Deserialize, Serialize};
33
use std::{fmt::Debug, path::PathBuf};
44

5+
use crate::Age;
56
use crate::infection_importation::ImportCasesFromFile;
67
use crate::reports::ReportParams;
78
use crate::settings::SettingProperties;
8-
use crate::symptom_status_manager::{SymptomAgeGroupNames, SymptomDelayDistLogNormParams};
9+
use crate::symptom_status_manager::{SymptomAgeGroup, SymptomDelayDistLogNormParams};
910

1011
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1112
pub enum RateFnType {
@@ -38,25 +39,25 @@ pub struct Params {
3839
/// A library of infection rates to assign to infected people.
3940
pub infectiousness_rate_fn: RateFnType,
4041
/// age thresholds
41-
pub symptom_age_groups: HashMap<SymptomAgeGroupNames, u8>,
42+
pub symptom_age_groups: HashMap<SymptomAgeGroup, u8>,
4243
/// Probability an infected person develops mild illness
4344
pub probability_mild_given_infect: f64,
4445
/// Parameters for log normal delay distribution from infection to mild illness
4546
pub infect_to_mild_delay: SymptomDelayDistLogNormParams,
4647
/// Probability a person with mild illness develops severe illness
47-
pub probability_severe_given_mild: HashMap<SymptomAgeGroupNames, f64>,
48+
pub probability_severe_given_mild: HashMap<SymptomAgeGroup, f64>,
4849
/// Parameters for log normal delay distribution from mild to severe illness
4950
pub mild_to_severe_delay: SymptomDelayDistLogNormParams,
5051
/// Parameters for log normal delay distribution from mild illness to resolution
5152
pub mild_to_resolved_delay: SymptomDelayDistLogNormParams,
5253
/// Probability a person with severe illness develops critical illness
53-
pub probability_critical_given_severe: f64,
54+
pub probability_critical_given_severe: HashMap<SymptomAgeGroup, f64>,
5455
/// Parameters for log normal delay distribution from severe to critical illness
5556
pub severe_to_critical_delay: SymptomDelayDistLogNormParams,
5657
/// Parameters for log normal delay distribution from severe illness to resolution
5758
pub severe_to_resolved_delay: SymptomDelayDistLogNormParams,
5859
/// Probability a person with critical illness dies
59-
pub probability_dead_given_critical: f64,
60+
pub probability_dead_given_critical: HashMap<SymptomAgeGroup, f64>,
6061
/// Parameters for log normal delay distribution from critical illness to death
6162
pub critical_to_dead_delay: SymptomDelayDistLogNormParams,
6263
/// Parameters for log normal delay distribution from critical illness to resolution
@@ -102,35 +103,35 @@ fn validate_inputs(parameters: &Params) -> Result<(), IxaError> {
102103
}
103104
}
104105

105-
// Validate the symptom status parameters
106-
107-
let symptom_probability_params = [
108-
(
109-
"probability_mild_given_infect",
110-
&parameters.probability_mild_given_infect,
111-
),
112-
(
113-
"probability_severe_given_mild",
114-
&parameters.probability_severe_given_mild,
115-
),
116-
(
117-
"probability_critical_given_severe",
118-
&parameters.probability_critical_given_severe,
119-
),
120-
(
121-
"probability_dead_given_critical",
122-
&parameters.probability_dead_given_critical,
123-
),
124-
];
125-
126-
for (param_name, param_value) in symptom_probability_params {
127-
if !(0.0..=1.0).contains(param_value) {
128-
return Err(IxaError::IxaError(format!(
129-
"{} = {} is not a valid transition probability; probabilities must be between 0 and 1, inclusive.",
130-
param_name, param_value
131-
)));
132-
}
133-
}
106+
// // Validate the symptom status parameters
107+
108+
// let symptom_probability_params = [
109+
// (
110+
// "probability_mild_given_infect",
111+
// &parameters.probability_mild_given_infect,
112+
// ),
113+
// (
114+
// "probability_severe_given_mild",
115+
// &parameters.probability_severe_given_mild,
116+
// ),
117+
// (
118+
// "probability_critical_given_severe",
119+
// &parameters.probability_critical_given_severe,
120+
// ),
121+
// (
122+
// "probability_dead_given_critical",
123+
// &parameters.probability_dead_given_critical,
124+
// ),
125+
// ];
126+
127+
// for (param_name, param_value) in symptom_probability_params {
128+
// if !(0.0..=1.0).contains(param_value) {
129+
// return Err(IxaError::IxaError(format!(
130+
// "{} = {} is not a valid transition probability; probabilities must be between 0 and 1, inclusive.",
131+
// param_name, param_value
132+
// )));
133+
// }
134+
// }
134135

135136
let symptom_sigma_params = [
136137
(
@@ -262,7 +263,7 @@ impl Default for Params {
262263
mu: 0.0,
263264
sigma: 0.0,
264265
},
265-
probability_severe_given_mild: 0.0,
266+
probability_severe_given_mild: HashMap::new(),
266267
mild_to_severe_delay: SymptomDelayDistLogNormParams {
267268
mu: 0.0,
268269
sigma: 0.0,
@@ -271,7 +272,7 @@ impl Default for Params {
271272
mu: 0.0,
272273
sigma: 0.0,
273274
},
274-
probability_critical_given_severe: 0.0,
275+
probability_critical_given_severe: HashMap::new(),
275276
severe_to_critical_delay: SymptomDelayDistLogNormParams {
276277
mu: 0.0,
277278
sigma: 0.0,
@@ -280,7 +281,7 @@ impl Default for Params {
280281
mu: 0.0,
281282
sigma: 0.0,
282283
},
283-
probability_dead_given_critical: 0.0,
284+
probability_dead_given_critical: HashMap::new(),
284285
critical_to_dead_delay: SymptomDelayDistLogNormParams {
285286
mu: 0.0,
286287
sigma: 0.0,

src/population_loader.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub struct PeopleRecord<'a> {
2020
workplaceId: &'a [u8],
2121
}
2222

23-
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Hash)]
23+
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Hash, PartialOrd, Deserialize)]
2424
pub struct Age(pub u8);
2525
impl_property!(Age, Person);
2626

src/symptom_status_manager.rs

Lines changed: 62 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
use ixa::{
2-
Context, ContextEntitiesExt, ContextRandomExt, IxaError, define_property, define_rng,
3-
impl_property, prelude::PropertyChangeEvent,
2+
Context, ContextEntitiesExt, ContextRandomExt, IxaError, define_derived_property, define_rng, impl_derived_property, impl_property, prelude::PropertyChangeEvent
43
};
54
use rand_distr::LogNormal;
65
use serde::{Deserialize, Serialize};
76

87
use crate::{
9-
ContextParametersExt, Params,
10-
infectiousness_manager::InfectionStatus,
11-
population_loader::{Person, PersonId},
8+
Age, ContextParametersExt, Params, infectiousness_manager::InfectionStatus, population_loader::{Person, PersonId}
129
};
1310

1411
define_rng!(SymptomsRng);
@@ -29,12 +26,21 @@ impl_property!(
2926
default_const = SymptomStatus::NoSymptoms
3027
);
3128

32-
pub enum SymptomAgeGroupNames {
29+
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, Hash)]
30+
pub enum SymptomAgeGroup {
3331
Young,
3432
Old,
3533
}
3634

37-
define_property!(SymptomAgeGroupNames, Person,);
35+
impl_derived_property!(SymptomAgeGroup, Person, [Age], [GlobalParams],
36+
|age, params|{
37+
let symptom_age_group_thresholds = params.symptom_age_groups.clone();
38+
for (age_group, min_age) in symptom_age_group_thresholds{
39+
if age >= min_age {
40+
let symptom_age_group: SymptomAgeGroup = age_group;
41+
}
42+
}
43+
});
3844

3945
#[derive(Debug, Serialize, Deserialize, Copy, Clone)]
4046
pub struct SymptomDelayDistLogNormParams {
@@ -61,6 +67,7 @@ fn process_symptom_change_event(
6167
event: PropertyChangeEvent<Person, SymptomStatus>,
6268
) {
6369
let &Params {
70+
symptom_age_groups,
6471
probability_severe_given_mild,
6572
mild_to_severe_delay,
6673
mild_to_resolved_delay,
@@ -75,7 +82,7 @@ fn process_symptom_change_event(
7582

7683
match event.current {
7784
SymptomStatus::Mild => {
78-
if context.sample_bool(SymptomsRng, probability_severe_given_mild) {
85+
if context.sample_bool(SymptomsRng, probability_severe_given_mild.get(symptom_age_group)) {
7986
plan_symptom_transition(
8087
context,
8188
event.entity_id,
@@ -92,7 +99,7 @@ fn process_symptom_change_event(
9299
}
93100
}
94101
SymptomStatus::Severe => {
95-
if context.sample_bool(SymptomsRng, probability_critical_given_severe) {
102+
if context.sample_bool(SymptomsRng, probability_critical_given_severe.get(symptom_age_group)) {
96103
plan_symptom_transition(
97104
context,
98105
event.entity_id,
@@ -109,7 +116,7 @@ fn process_symptom_change_event(
109116
}
110117
}
111118
SymptomStatus::Critical => {
112-
if context.sample_bool(SymptomsRng, probability_dead_given_critical) {
119+
if context.sample_bool(SymptomsRng, probability_dead_given_critical.get(&symptom_age_group)) {
113120
plan_symptom_transition(
114121
context,
115122
event.entity_id,
@@ -194,27 +201,39 @@ mod test {
194201
..Default::default()
195202
},
196203
(SymptomStatus::Mild, SymptomStatus::Severe) => Params {
197-
probability_severe_given_mild: expected_proportion,
204+
probability_severe_given_mild: HashMap::from([
205+
("all", expected_proportion)
206+
]),
198207
..Default::default()
199208
},
200209
(SymptomStatus::Mild, SymptomStatus::Resolved) => Params {
201-
probability_severe_given_mild: 1.0 - expected_proportion,
210+
probability_severe_given_mild: HashMap::from([
211+
("all", 1.0 - expected_proportion)
212+
]),
202213
..Default::default()
203214
},
204215
(SymptomStatus::Severe, SymptomStatus::Critical) => Params {
205-
probability_critical_given_severe: expected_proportion,
216+
probability_critical_given_severe: HashMap::from([
217+
("all", expected_proportion)
218+
]),
206219
..Default::default()
207220
},
208221
(SymptomStatus::Severe, SymptomStatus::Resolved) => Params {
209-
probability_critical_given_severe: 1.0 - expected_proportion,
222+
probability_critical_given_severe: HashMap::from([
223+
("all", 1.0 - expected_proportion)
224+
]),
210225
..Default::default()
211226
},
212227
(SymptomStatus::Critical, SymptomStatus::Dead) => Params {
213-
probability_dead_given_critical: expected_proportion,
228+
probability_dead_given_critical: HashMap::from([
229+
("all", expected_proportion)
230+
]),
214231
..Default::default()
215232
},
216233
(SymptomStatus::Critical, SymptomStatus::Resolved) => Params {
217-
probability_dead_given_critical: 1.0 - expected_proportion,
234+
probability_dead_given_critical: HashMap::from([
235+
("all", 1.0 - expected_proportion)
236+
]),
218237
..Default::default()
219238
},
220239
_ => panic!(
@@ -290,47 +309,59 @@ mod test {
290309
..Default::default()
291310
},
292311
(SymptomStatus::Mild, SymptomStatus::Severe) => Params {
293-
probability_severe_given_mild: 1.0,
312+
probability_severe_given_mild: HashMap::from([
313+
("all", 1.0)
314+
]),
294315
mild_to_severe_delay: SymptomDelayDistLogNormParams {
295316
mu: expected_mu,
296317
sigma: expected_sigma,
297318
},
298319
..Default::default()
299320
},
300321
(SymptomStatus::Mild, SymptomStatus::Resolved) => Params {
301-
probability_severe_given_mild: 0.0,
322+
probability_severe_given_mild: HashMap::from([
323+
("all", 0.0)
324+
]),
302325
mild_to_resolved_delay: SymptomDelayDistLogNormParams {
303326
mu: expected_mu,
304327
sigma: expected_sigma,
305328
},
306329
..Default::default()
307330
},
308331
(SymptomStatus::Severe, SymptomStatus::Critical) => Params {
309-
probability_critical_given_severe: 1.0,
332+
probability_critical_given_severe: HashMap::from([
333+
("all", 1.0)
334+
]),
310335
severe_to_critical_delay: SymptomDelayDistLogNormParams {
311336
mu: expected_mu,
312337
sigma: expected_sigma,
313338
},
314339
..Default::default()
315340
},
316341
(SymptomStatus::Severe, SymptomStatus::Resolved) => Params {
317-
probability_critical_given_severe: 0.0,
342+
probability_critical_given_severe: HashMap::from([
343+
("all", 0.0)
344+
]),
318345
severe_to_resolved_delay: SymptomDelayDistLogNormParams {
319346
mu: expected_mu,
320347
sigma: expected_sigma,
321348
},
322349
..Default::default()
323350
},
324351
(SymptomStatus::Critical, SymptomStatus::Dead) => Params {
325-
probability_dead_given_critical: 1.0,
352+
probability_dead_given_critical: HashMap::from([
353+
("all", 1.0)
354+
]),
326355
critical_to_dead_delay: SymptomDelayDistLogNormParams {
327356
mu: expected_mu,
328357
sigma: expected_sigma,
329358
},
330359
..Default::default()
331360
},
332361
(SymptomStatus::Critical, SymptomStatus::Resolved) => Params {
333-
probability_dead_given_critical: 0.0,
362+
probability_dead_given_critical: HashMap::from([
363+
("all", 0.0)
364+
]),
334365
critical_to_resolved_delay: SymptomDelayDistLogNormParams {
335366
mu: expected_mu,
336367
sigma: expected_sigma,
@@ -463,9 +494,15 @@ mod test {
463494
let mut count_resolved: u64 = 0;
464495
let mut count_dead: u64 = 0;
465496
let probability_mild_given_infect = 0.5;
466-
let probability_severe_given_mild = 0.5;
467-
let probability_critical_given_severe = 0.5;
468-
let probability_dead_given_critical = 0.5;
497+
let probability_severe_given_mild = HashMap::from([
498+
("all", 0.5)
499+
]);
500+
let probability_critical_given_severe = HashMap::from([
501+
("all", 0.5)
502+
]);
503+
let probability_dead_given_critical = HashMap::from([
504+
("all", 0.5)
505+
]);
469506
for seed in 0..num_sims {
470507
let mut context = Context::new();
471508
let parameters = Params {

0 commit comments

Comments
 (0)