mrc-ide / individual

R Package for individual based epidemiological models
https://mrc-ide.github.io/individual
Other
30 stars 16 forks source link

Allow events and variables to be added when restoring the simulation. #194

Closed plietar closed 7 months ago

plietar commented 8 months ago

The simulation restoring feature required the number of events to be identical to the original simulation's. This has turned out to be too restrictive for our use cases in malariasimulation, where we want to resume the simulation with new interventions enabled, which come with new events.

I had originally hoped that this would be enough, and that we could run the first phase of the simulation with all the events present, even though they are unused. However there are interventions whose number of events depends on the parametrization of it, hence we cannot create a saved simulation state that fits all possible use cases when resuming.

The solution implemented here is to allow more events and variables to be introduced when resuming the simulation, on the condition that the objects are named when passed to simulation_loop. Without this requirement, given more objects than were saved, it would be ambigous which ones need to be restored and which ones are new.

Additionally, the list of events and variables can now be structured using nested lists of objects. This has no impact on the way the simulation is executed, but it allows for more complicated simulations to be restored.

For example, this is a simplified example of what the list of events in malariasimulation might look like:

list(
 mda_administer = Event$new(),
 mass_pev_doses = list(
  TargetedEvent$new(n),
  TargetedEvent$new(n),
  TargetedEvent$new(n)
 )
)

In this example, the top-level list is names, allowing the mass_pev_doses events to be absent during the warmup simulation and added only later when restoring. However, because the nested list of targeted events is not named, more events cannot be added to it.

The names of the methods to save and restore state, together with the helper functions save_object_state and restore_object_state are tweaked and made public to allow this pattern to be reused in applications that have their own state to save, as demonstrated by the stateful.R file in malariasimulation.

codecov[bot] commented 8 months ago

Codecov Report

All modified and coverable lines are covered by tests :white_check_mark:

Project coverage is 96.26%. Comparing base (7e48608) to head (ec584db). Report is 1 commits behind head on master.

:exclamation: Current head ec584db differs from pull request most recent head 9c7fcde. Consider uploading reports for the commit 9c7fcde to get more accurate results

Additional details and impacted files ```diff @@ Coverage Diff @@ ## master #194 +/- ## ========================================== + Coverage 96.13% 96.26% +0.12% ========================================== Files 36 36 Lines 1839 1872 +33 ========================================== + Hits 1768 1802 +34 + Misses 71 70 -1 ```

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

giovannic commented 7 months ago

Oh, can you change the destination to dev before merging? Didn't notice that before I approved. Thanks!