Skip to content

Commit 0dedcff

Browse files
work in progress
1 parent 86c6c52 commit 0dedcff

File tree

3 files changed

+76
-19
lines changed

3 files changed

+76
-19
lines changed

src/infection_propagation_loop.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ use crate::infectiousness_manager::{
66
Forecast, InfectionContextExt, InfectionStatus, evaluate_forecast, get_forecast,
77
infection_attempt,
88
};
9+
use crate::itinerary::{ContextItineraryExt, ItineraryUse};
910
use crate::parameters::{ContextParametersExt, Params};
10-
use crate::population_loader::{Person, PersonId};
11+
use crate::population_loader::{IsolationStatus, Person, PersonId};
1112
use crate::rate_fns::{InfectiousnessRateExt, load_rate_fns};
1213
use ixa::profiling::{increment_named_count, open_span};
1314
use ixa::{Context, ContextRandomExt, IxaError, define_rng, trace};
@@ -80,6 +81,8 @@ pub fn init(context: &mut Context) -> Result<(), IxaError> {
8081
load_rate_fns(context)?;
8182
seed_initial_infections(context, initial_incidence);
8283

84+
context.register_person_interary_modifier(IsolationStatus::Isolated, ItineraryUse::Isolated, 1, Some(1.0), None, None, None);
85+
8386
// Subscribe to the person becoming infectious to trigger the infection propagation loop
8487
context.subscribe_to_event(
8588
|context, event: PropertyChangeEvent<Person, InfectionStatus>| {
@@ -88,6 +91,21 @@ pub fn init(context: &mut Context) -> Result<(), IxaError> {
8891
}
8992
schedule_next_forecasted_infection(context, event.entity_id);
9093
schedule_recovery(context, event.entity_id);
94+
95+
context.add_plan(context.get_current_time() + 2.0, move |context| {
96+
context.set_property::<Person, IsolationStatus>(event.entity_id, IsolationStatus::Isolated);
97+
});
98+
},
99+
);
100+
101+
context.subscribe_to_event(
102+
|context, event: PropertyChangeEvent<Person, InfectionStatus>| {
103+
if event.current != InfectionStatus::Recovered {
104+
context.add_plan(context.get_current_time(), move |context| {
105+
context.set_property::<Person, IsolationStatus>(event.entity_id, IsolationStatus::NotIsolated);
106+
});
107+
}
108+
91109
},
92110
);
93111

src/itinerary.rs

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -125,29 +125,61 @@ pub trait ContextItineraryExt: PluginContext + ContextRandomExt {
125125
BelongsTo(person_id),
126126
itinerary_use,
127127
Ranking(ranking),
128-
Activity(true)
129-
HomeItinerary {
128+
Activity(true))).unwrap();
129+
if let Some(home_ratio) = home_ratio {
130+
context.set_property::<Itinerary, HomeItinerary>(modified_itinerary, HomeItinerary {
130131
home_id: home_id.0,
131-
ratio: home_ratio,
132-
},
133-
SchoolItinerary {
134-
school_id: school_id.0,
135-
ratio: school_ratio,
136-
},
137-
WorkplaceItinerary {
132+
ratio: Some(home_ratio),
133+
});
134+
} else {
135+
context.set_property::<Itinerary, HomeItinerary>(modified_itinerary, HomeItinerary {
136+
home_id: None,
137+
ratio: None,
138+
});
139+
}
140+
if let Some(workplace_ratio) = workplace_ratio {
141+
context.set_property::<Itinerary, WorkplaceItinerary>(modified_itinerary, WorkplaceItinerary {
138142
workplace_id: workplace_id.0,
139-
ratio: workplace_ratio,
140-
},
141-
CensusTractItinerary {
143+
ratio: Some(workplace_ratio),
144+
});
145+
} else {
146+
context.set_property::<Itinerary, WorkplaceItinerary>(modified_itinerary, WorkplaceItinerary {
147+
workplace_id: None,
148+
ratio: None,
149+
});
150+
}
151+
if let Some(school_ratio) = school_ratio {
152+
context.set_property::<Itinerary, SchoolItinerary>(modified_itinerary, SchoolItinerary {
153+
school_id: school_id.0,
154+
ratio: Some(school_ratio),
155+
});
156+
} else {
157+
context.set_property::<Itinerary, SchoolItinerary>(modified_itinerary, SchoolItinerary {
158+
school_id: None,
159+
ratio: None,
160+
});
161+
}
162+
if let Some(census_tract_ratio) = census_tract_ratio {
163+
context.set_property::<Itinerary, CensusTractItinerary>(modified_itinerary, CensusTractItinerary {
142164
census_tract_id: census_tract_id.0,
143-
ratio: census_tract_ratio,
144-
},
145-
))
146-
.unwrap();
147-
context.normalize_itinerary_ratios(person_id);
165+
ratio: Some(census_tract_ratio),
166+
});
167+
} else {
168+
context.set_property::<Itinerary, CensusTractItinerary>(modified_itinerary, CensusTractItinerary {
169+
census_tract_id: None,
170+
ratio: None,
171+
});
172+
}
173+
context.normalize_itinerary_ratios(person_id);
148174
}
175+
149176
if event.previous == entity_property {
150-
177+
let active_itineraries = context.query_result_iterator::<Itinerary, _>((BelongsTo(event.entity_id), Activity(true))).collect::<Vec<_>>();
178+
for itinerary in active_itineraries {
179+
context.set_property::<Itinerary, Activity>(itinerary, Activity(false));
180+
}
181+
let default_itinerary = context.query_result_iterator::<Itinerary, _>((BelongsTo(event.entity_id), ItineraryUse::Default,)).next().unwrap();
182+
context.set_property::<Itinerary, Activity>(default_itinerary, Activity(true));
151183
}
152184
},
153185
);

src/population_loader.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ impl_property!(Age, Person);
3333
pub struct Alive(pub bool);
3434
impl_property!(Alive, Person, default_const = Alive(true));
3535

36+
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Hash)]
37+
pub enum IsolationStatus {
38+
Isolated,
39+
NotIsolated,
40+
}
41+
impl_property!(IsolationStatus, Person, default_const = IsolationStatus::NotIsolated);
42+
3643
fn create_person_from_record(
3744
context: &mut Context,
3845
person_record: &PeopleRecord,

0 commit comments

Comments
 (0)