sim

sim

Define core Sim classes

Classes

Name Description
AlreadyRunError Raised if trying to re-run an already-run sim without re-initializing
Sim The Sim object

AlreadyRunError

sim.AlreadyRunError()

Raised if trying to re-run an already-run sim without re-initializing

Sim

sim.Sim(
    self,
    pars=None,
    label=None,
    people=None,
    modules=None,
    demographics=None,
    diseases=None,
    networks=None,
    interventions=None,
    analyzers=None,
    connectors=None,
    copy_inputs=True,
    data=None,
    **kwargs,
)

The Sim object

All Starsim simulations run via the Sim class. It is responsible for initializing and running all modules and generating results.

Parameters

Name Type Description Default
pars SimPars / dict either an ss.SimPars object, or a nested dictionary; can include all other arguments None
label str the human-readable name of the simulation None
people People if provided, use this ss.People object None
modules Module / list if provided, use these modules (and divide among demographics, diseases, etc. based on type) None
demographics str / Demographics / list a string naming the demographics module to use, the module itself, or a list None
connectors str / Connector / list as above, for connectors None
networks str / Network / list as above, for networks None
interventions str / Intervention / list as above, for interventions None
diseases str / Disease / list as above, for diseases None
analyzers str / Analyzer / list as above, for analyzers None
copy_inputs bool if True, copy modules as they’re inserted into the sim (allowing reuse in other sims, but meaning they won’t be updated) True
data df a dataframe (or dict) of data, with a column “time” plus data of the form “module.result”, e.g. “hiv.new_infections” (used for plotting only) None
kwargs dict merged with pars; see ss.SimPars for all parameter values {}

Examples:

sim = ss.Sim(diseases='sir', networks='random') # Simplest Starsim sim; equivalent to ss.demo()
sim = ss.Sim(diseases=ss.SIR(), networks=ss.RandomNet()) # Equivalent using objects instead of strings
sim = ss.Sim(diseases=['sir', ss.SIS()], networks=['random', 'mf']) # Example using list inputs; can mix and match types

Attributes

Name Description
label Get the sim label from the parameters, if available.
module_dict Return a dictionary of all Module instances; see sim.module_list for the list version
module_list Return a list of all Module instances (stored in standard places) in the Sim; see sim.module_dict for the dict version

Methods

Name Description
check_method_calls Check if any required methods were not called.
check_results_ready Check that results are ready
cprofile Profile the performance of the simulation using a function profiler (sc.cprofile())
finalize Compute final results
finalize_results Scale the results and remove any “unused” results
finish_step Finish the simulation timestep
init Perform all initializations for the sim
init_data Initialize or add data to the sim
init_dists Initialize the distributions
init_module_attrs Move initialized modules to the sim
init_modules_post Initialize values in other modules, including networks and time parameters, and do any other post-processing
init_modules_pre Initialize all the modules with the sim
init_people Initialize people within the sim
init_people_vals Initialize the People states with actual values
init_results Create initial results that are present in all simulations
init_time Time indexing; derived values live in the sim rather than in the pars
plot Plot all results in the Sim object
products List all products across interventions; not an ndict like the other module types
profile Profile the performance of the simulation using a line profiler (sc.profile())
reset_time_pars Reset the time parameters in the modules; used for imposing the sim’s timestep on the modules
run Run the model – the main method for running a simulation.
run_one_step Run a single sim step; only used for debugging purposes.
save Save to disk as a gzipped pickle.
shrink “Shrinks” the simulation by removing the people and other memory-intensive
start_step Start the step – only print progress; all actual changes happen in the modules
summarize Provide a quick summary of the sim; returns the last entry for count and
to_df Export results as a Pandas dataframe
to_json Export results and parameters as JSON.
to_yaml Export results and parameters as YAML.
check_method_calls
sim.Sim.check_method_calls(die=None, warn=None, verbose=False)

Check if any required methods were not called.

Typically called automatically by sim.run(); default behavior is to warn (see options.check_method_calls).

Parameters
Name Type Description Default
die bool whether to raise an exception if missing methods were found (default False) None
warn bool whether to raise a warning if missing methods were found (default False) None
verbose bool whether to print the number of times each method was called (default False) False
Returns
Name Type Description
A list of missing method calls by module
check_results_ready
sim.Sim.check_results_ready(errormsg=None)

Check that results are ready

cprofile
sim.Sim.cprofile(sort='cumtime', mintime=0.001, **kwargs)

Profile the performance of the simulation using a function profiler (sc.cprofile())

Parameters
Name Type Description Default
sort str default sort column; common choices are ‘cumtime’ (total time spent in a function, includin subfunctions) and ‘selftime’ (excluding subfunctions) 'cumtime'
mintime float exclude function calls less than this time in seconds 0.001
**kwargs dict passed to sc.cprofile() {}

Example:

import starsim as ss

net = ss.RandomNet()
sis = ss.SIS()
sim = ss.Sim(networks=net, diseases=sis)
prof = sim.cprofile()
finalize
sim.Sim.finalize()

Compute final results

finalize_results
sim.Sim.finalize_results()

Scale the results and remove any “unused” results

finish_step
sim.Sim.finish_step()

Finish the simulation timestep

init
sim.Sim.init(force=False, timer=False, **kwargs)

Perform all initializations for the sim

Parameters
Name Type Description Default
force bool whether to overwrite sim attributes even if they already exist False
timer bool if True, count the time required for initialization (otherwise just count run time) False
kwargs dict passed to ss.People() {}
init_data
sim.Sim.init_data(data=None)

Initialize or add data to the sim

init_dists
sim.Sim.init_dists()

Initialize the distributions

init_module_attrs
sim.Sim.init_module_attrs(force=False)

Move initialized modules to the sim

init_modules_post
sim.Sim.init_modules_post()

Initialize values in other modules, including networks and time parameters, and do any other post-processing

init_modules_pre
sim.Sim.init_modules_pre()

Initialize all the modules with the sim

init_people
sim.Sim.init_people(verbose=None, **kwargs)

Initialize people within the sim Sometimes the people are provided, in which case this just adds a few sim properties to them. Other time people are not provided and this method makes them.

Parameters
Name Type Description Default
verbose int detail to print None
kwargs (dict passed to ss.People() {}
init_people_vals
sim.Sim.init_people_vals()

Initialize the People states with actual values

init_results
sim.Sim.init_results()

Create initial results that are present in all simulations

init_time
sim.Sim.init_time()

Time indexing; derived values live in the sim rather than in the pars

plot
sim.Sim.plot(
    key=None,
    fig=None,
    show_data=True,
    show_skipped=False,
    show_module=None,
    show_label=False,
    n_ticks=None,
    **kwargs,
)

Plot all results in the Sim object

Parameters
Name Type Description Default
key str / list the results key to plot (by default, all); if a list, plot exactly those keys None
fig Figure if provided, plot results into an existing figure None
style str the plotting style to use required
show_data bool plot the data, if available True
show_skipped bool show even results that are skipped by default False
show_module int whether to show the module as well as the result name; if an int, show if the label is less than that length (default, 26); if -1, use a newline None
show_label str if ‘fig’, reset the fignum; if ‘title’, set the figure suptitle False
n_ticks tuple of ints if provided, specify how many x-axis ticks to use (default: (2,5), i.e. minimum of 2 and maximum of 5) None
fig_kw dict passed to sc.getrowscols(), then plt.subplots() and plt.figure() required
plot_kw dict passed to plt.plot() required
data_kw dict passed to plt.scatter(), for plotting the data required
style_kw dict passed to ss.style(), for controlling the detailed plotting style (default “starsim”; other options are “simple”, None, or any Matplotlib style) required
**kwargs dict known arguments (e.g. figsize, font) split between the above dicts; see ss.plot_args() for all valid options {}

Examples:

sim = ss.Sim(diseases='sis', networks='random').run()

# Basic usage
sim.plot()

# Plot a single result
sim.plot('sis.prevalence')

# Plot with a custom figure size, font, and style
sim.plot(figsize=(12,16), font='Raleway', style='fancy')
products
sim.Sim.products()

List all products across interventions; not an ndict like the other module types

profile
sim.Sim.profile(line=True, do_run=True, plot=True, follow=None, **kwargs)

Profile the performance of the simulation using a line profiler (sc.profile())

Parameters
Name Type Description Default
do_run bool whether to immediately run the sim True
plot bool whether to plot time spent per module step True
follow func / list a list of functions/methods to follow in detail None
**kwargs dict passed to sc.profile() {}

Example:

import starsim as ss

net = ss.RandomNet()
sis = ss.SIS()
sim = ss.Sim(networks=net, diseases=sis)
prof = sim.profile(follow=[net.add_pairs, sis.infect])
reset_time_pars
sim.Sim.reset_time_pars(force=True)

Reset the time parameters in the modules; used for imposing the sim’s timestep on the modules

run
sim.Sim.run(until=None, verbose=None, check_method_calls=True)

Run the model – the main method for running a simulation.

Parameters
Name Type Description Default
until date / str / float the date to run the sim until None
verbose float the level of detail to print (default 0.1, i.e. output once every 10 steps) None
check_method_calls bool whether to check that all required methods were called True
run_one_step
sim.Sim.run_one_step(verbose=None)

Run a single sim step; only used for debugging purposes.

Note: sim.run_one_step() runs a single simulation timestep, which involves multiple function calls. In contrast, loop.run_one_step() runs a single function call.

Note: the verbose here is only for the Loop object, not the sim.

save
sim.Sim.save(filename=None, shrink=None, **kwargs)

Save to disk as a gzipped pickle.

Parameters
Name Type Description Default
filename str or None the name or path of the file to save to; if None, uses stored None
shrink bool or None whether to shrink the sim prior to saving (reduces size by ~99%) None
kwargs passed to sc.makefilepath() {}
Returns
Name Type Description
filename str the validated absolute path to the saved file

Example:

sim.save() # Saves to a .sim file
shrink
sim.Sim.shrink(inplace=True, size_limit=1.0, intercept=10, die=True)

“Shrinks” the simulation by removing the people and other memory-intensive attributes (e.g., some interventions and analyzers), and returns a copy of the “shrunken” simulation. Used to reduce the memory required for RAM or for saved files.

Parameters
Name Type Description Default
inplace bool whether to perform the shrinking in place (default), or return a shrunken copy instead True
size_limit float print a warning if any module is larger than this size limit, in units of KB per timestep (set to None to disable) 1.0
intercept float the size (in units of size_limit) to allow for a zero-timestep sim 10
die bool whether to raise an exception if the shrink failed True
Returns
Name Type Description
shrunken Sim a Sim object with the listed attributes removed
start_step
sim.Sim.start_step()

Start the step – only print progress; all actual changes happen in the modules

summarize
sim.Sim.summarize(how='default')

Provide a quick summary of the sim; returns the last entry for count and cumulative results, and the mean otherwise.

Parameters
Name Type Description Default
how str how to summarize: can be ‘mean’, ‘median’, ‘last’, or a mapping of result keys to those 'default'
to_df
sim.Sim.to_df(sep='_', **kwargs)

Export results as a Pandas dataframe Args: sep (str): separator for the keys kwargs: passed to results.to_df()

to_json
sim.Sim.to_json(
    filename=None,
    keys=None,
    tostring=False,
    indent=2,
    verbose=False,
    **kwargs,
)

Export results and parameters as JSON.

Parameters
Name Type Description Default
filename str if None, return string; else, write to file None
keys str / list attributes to write to json (choices: ‘pars’, ‘summary’, and/or ‘results’) None
verbose bool detail to print False
**kwargs dict passed to sc.jsonify() {}
Returns
Name Type Description
A dictionary representation of the parameters and/or summary results
(or write that dictionary to a file)

Examples:

json = sim.to_json() # Convert to a dict
sim.to_json('sim.json') # Write everything
sim.to_json('summary.json', keys='summary') # Just write the summary
to_yaml
sim.Sim.to_yaml(filename=None, sort_keys=False, **kwargs)

Export results and parameters as YAML.

Parameters
Name Type Description Default
filename str the name of the file to write to (default {sim.label}.yaml) None
kwargs dict passed to sim.to_json() {}

Example:

sim = ss.Sim(diseases='sis', networks='random').run()
sim.to_yaml('results.yaml', keys='results')

Functions

Name Description
check_sims_match Shortcut to using ss.diff_sims() to check if multiple sims match
demo Create a simple demo simulation for Starsim
diff_sims Compute the difference of the summaries of two simulations, and print any

check_sims_match

sim.check_sims_match(*args, full=False)

Shortcut to using ss.diff_sims() to check if multiple sims match

Parameters

Name Type Description Default
args list a list of 2 or more sims to compare ()
full bool if True, return whether each sim matches the first False

Example:

s1 = ss.Sim(diseases='sir', networks='random')
s2 = ss.Sim(pars=dict(diseases='sir', networks='random'))
s3 = ss.Sim(diseases=ss.SIR(), networks=ss.RandomNet())
assert ss.check_sims_match(s1, s2, s3)

demo

sim.demo(run=True, plot=True, summary=True, show=True, **kwargs)

Create a simple demo simulation for Starsim

Defaults to using the SIR model with a random network, but these can be configured.

Parameters

Name Type Description Default
run bool whether to run the sim True
plot bool whether to plot the results True
summary bool whether to print a summary of the results True
kwargs dict passed to ss.Sim() {}

Examples:

ss.demo() # Run, plot, and show results
ss.demo(diseases='hiv', networks='mf') # Run with different defaults

diff_sims

sim.diff_sims(
    sim1,
    sim2,
    skip_key_diffs=False,
    skip=None,
    full=False,
    output=False,
    die=False,
)

Compute the difference of the summaries of two simulations, and print any values which differ.

Parameters

Name Type Description Default
sim1 Sim / MultiSim / dict either a simulation/MultiSim object or the sim.summary dictionary required
sim2 im / dict ditto required
skip_key_diffs bool whether to skip keys that don’t match between sims False
skip list a list of values to skip None
full bool whether to print out all values (not just those that differ) False
output bool whether to return the output as a string (otherwise print) False
die bool whether to raise an exception if the sims don’t match False
require_run bool require that the simulations have been run required

Example:

s1 = ss.Sim(rand_seed=1).run()
s2 = ss.Sim(rand_seed=2).run()
ss.diff_sims(s1, s2)