def parse_parameters(sim_pars, epi_pars, int_pars, n_days, location, verbose, errs, die): ''' Sanitize web parameters into actual simulation ones ''' orig_pars = cv.make_pars() defaults = get_defaults(merge=True) web_pars = {} web_pars['verbose'] = verbose # Control verbosity here for key, entry in {**sim_pars, **epi_pars}.items(): print(key, entry) best = defaults[key]['best'] minval = defaults[key]['min'] maxval = defaults[key]['max'] try: web_pars[key] = np.clip(float(entry['best']), minval, maxval) except Exception as E: user_key = entry['name'] user_val = entry['best'] err = f'Could not convert parameter "{user_key}" from value "{user_val}"; using default value instead.' errs.append(log_err(err, E)) web_pars[key] = best if die: raise if key in sim_pars: sim_pars[key]['best'] = web_pars[key] else: epi_pars[key]['best'] = web_pars[key] # Convert durations web_pars['dur'] = sc.dcp( orig_pars['dur']) # This is complicated, so just copy it web_pars['dur']['exp2inf']['par1'] = web_pars.pop('web_exp2inf') web_pars['dur']['inf2sym']['par1'] = web_pars.pop('web_inf2sym') web_pars['dur']['crit2die']['par1'] = web_pars.pop('web_timetodie') web_dur = web_pars.pop('web_dur') for key in ['asym2rec', 'mild2rec', 'sev2rec', 'crit2rec']: web_pars['dur'][key]['par1'] = web_dur # Add n_days web_pars['n_days'] = n_days # Add demographic web_pars['location'] = location # Add the intervention web_pars['interventions'] = parse_interventions(int_pars) # Handle CFR -- ignore symptoms and set to 1 if web_pars['rand_seed'] == 0: web_pars['rand_seed'] = None web_pars['timelimit'] = max_time # Set the time limit web_pars['pop_size'] = int(web_pars['pop_size']) # Set data type return web_pars
def set_sim_pars(self, params_dict=None): """ Overrides all of the default sim parameters with the ones in the dictionary Args: params_dict: keys are param names, values are expected values to use Returns: None, sets self.simulation_params """ if not self.sim_pars: self.sim_pars = cv.make_pars(set_prognoses=True, prog_by_age=True) if params_dict: self.sim_pars.update(params_dict)
def test_parameters(): sc.heading('Model parameters') pars = cv.make_pars() sc.pp(pars) return pars
def run_sim(sim_pars=None, epi_pars=None, intervention_pars=None, datafile=None, show_animation=False, n_days=90, verbose=True): ''' Create, run, and plot everything ''' err = '' try: # Fix up things that JavaScript mangles orig_pars = cv.make_pars(set_prognoses=True, prog_by_age=False, use_layers=False) defaults = get_defaults(merge=True) web_pars = {} web_pars['verbose'] = verbose # Control verbosity here for key,entry in {**sim_pars, **epi_pars}.items(): print(key, entry) best = defaults[key]['best'] minval = defaults[key]['min'] maxval = defaults[key]['max'] try: web_pars[key] = np.clip(float(entry['best']), minval, maxval) except Exception: user_key = entry['name'] user_val = entry['best'] err1 = f'Could not convert parameter "{user_key}", value "{user_val}"; using default value instead\n' print(err1) err += err1 web_pars[key] = best if die: raise if key in sim_pars: sim_pars[key]['best'] = web_pars[key] else: epi_pars[key]['best'] = web_pars[key] # Convert durations web_pars['dur'] = sc.dcp(orig_pars['dur']) # This is complicated, so just copy it web_pars['dur']['exp2inf']['par1'] = web_pars.pop('web_exp2inf') web_pars['dur']['inf2sym']['par1'] = web_pars.pop('web_inf2sym') web_pars['dur']['crit2die']['par1'] = web_pars.pop('web_timetodie') web_dur = web_pars.pop('web_dur') for key in ['asym2rec', 'mild2rec', 'sev2rec', 'crit2rec']: web_pars['dur'][key]['par1'] = web_dur # Add n_days web_pars['n_days'] = n_days # Add the intervention web_pars['interventions'] = [] switcher = { 'social_distance': map_social_distance, 'school_closures': map_school_closures, 'symptomatic_testing': map_symptomatic_testing, 'contact_tracing': map_contact_tracing } if intervention_pars is not None: for key,scenario in intervention_pars.items(): func = switcher.get(key) func(scenario, web_pars) # Handle CFR -- ignore symptoms and set to 1 web_pars['prognoses'] = sc.dcp(orig_pars['prognoses']) web_pars['rel_symp_prob'] = 1e4 # Arbitrarily large web_pars['rel_severe_prob'] = 1e4 web_pars['rel_crit_prob'] = 1e4 web_pars['prognoses']['death_probs'][0] = web_pars.pop('web_cfr') if web_pars['rand_seed'] == 0: web_pars['rand_seed'] = None web_pars['timelimit'] = max_time # Set the time limit web_pars['pop_size'] = int(web_pars['pop_size']) # Set data type web_pars['contacts'] = int(web_pars['contacts']) # Set data type except Exception as E: err2 = f'Parameter conversion failed! {str(E)}\n' print(err2) err += err2 if die: raise # Create the sim and update the parameters try: sim = cv.Sim(pars=web_pars,datafile=datafile) except Exception as E: err3 = f'Sim creation failed! {str(E)}\n' print(err3) err += err3 if die: raise if verbose: print('Input parameters:') print(web_pars) # Core algorithm try: sim.run(do_plot=False) except TimeoutError: day = sim.t err4 = f"The simulation stopped on day {day} because run time limit ({sim['timelimit']} seconds) was exceeded. Please reduce the population size and/or number of days simulated." err += err4 if die: raise except Exception as E: err4 = f'Sim run failed! {str(E)}\n' print(err4) err += err4 if die: raise # Core plotting graphs = [] try: to_plot = sc.dcp(cv.default_sim_plots) for p,title,keylabels in to_plot.enumitems(): fig = go.Figure() for key in keylabels: label = sim.results[key].name this_color = sim.results[key].color y = sim.results[key][:] fig.add_trace(go.Scatter(x=sim.results['t'][:], y=y, mode='lines', name=label, line_color=this_color)) if sim.data is not None and key in sim.data: data_t = (sim.data.index-sim['start_day'])/np.timedelta64(1,'D') print(sim.data.index, sim['start_day'], np.timedelta64(1,'D'), data_t) ydata = sim.data[key] fig.add_trace(go.Scatter(x=data_t, y=ydata, mode='markers', name=label + ' (data)', line_color=this_color)) if sim['interventions']: interv_day = sim['interventions'][0].days[0] if interv_day > 0 and interv_day < sim['n_days']: fig.add_shape(dict(type="line", xref="x", yref="paper", x0=interv_day, x1=interv_day, y0=0, y1=1, name='Intervention', line=dict(width=0.5, dash='dash'))) fig.update_layout(annotations=[dict(x=interv_day, y=1.07, xref="x", yref="paper", text="Intervention start", showarrow=False)]) fig.update_layout(title={'text':title}, xaxis_title='Day', yaxis_title='Count', autosize=True) output = {'json': fig.to_json(), 'id': str(sc.uuid())} d = json.loads(output['json']) d['config'] = {'responsive': True} output['json'] = json.dumps(d) graphs.append(output) graphs.append(plot_people(sim)) if show_animation: graphs.append(animate_people(sim)) except Exception as E: err5 = f'Plotting failed! {str(E)}\n' print(err5) err += err5 if die: raise # Create and send output files (base64 encoded content) files = {} summary = {} try: datestamp = sc.getdate(dateformat='%Y-%b-%d_%H.%M.%S') ss = sim.to_excel() files['xlsx'] = { 'filename': f'covasim_results_{datestamp}.xlsx', 'content': 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,' + base64.b64encode(ss.blob).decode("utf-8"), } json_string = sim.to_json(verbose=False) files['json'] = { 'filename': f'covasim_results_{datestamp}.json', 'content': 'data:application/text;base64,' + base64.b64encode(json_string.encode()).decode("utf-8"), } # Summary output summary = { 'days': sim.npts-1, 'cases': round(sim.results['cum_infections'][-1]), 'deaths': round(sim.results['cum_deaths'][-1]), } except Exception as E: err6 = f'File saving failed! {str(E)}\n' print(err6) err += err6 if die: raise output = {} output['err'] = err output['sim_pars'] = sim_pars output['epi_pars'] = epi_pars output['graphs'] = graphs output['files'] = files output['summary'] = summary return output
import covasim as cv import matplotlib.pyplot as plt import numpy as np dur = cv.make_pars()['dur'] N = 50000 fig = plt.figure(figsize=(16, 16)) for idx, (k, d) in enumerate(dur.items()): ax = plt.subplot(3, 3, idx + 1) vals = [cv.utils.sample(**d) for _ in range(N)] ax.hist(vals, density=True, bins=range(int(np.ceil(max(vals) + 1))), align='left') mu = np.mean(vals) ax.plot([mu] * 2, ax.get_ylim(), 'r') ax.set_title(f'{k}: {d["dist"]}({d["par1"]},{d["par2"]})') plt.suptitle('Default distributions in Covasim', fontsize=20) plt.show()
def run_sim(sim_pars=None, epi_pars=None, int_pars=None, datafile=None, show_animation=False, n_days=90, verbose=True, die=die): ''' Create, run, and plot everything ''' errs = [] try: # Fix up things that JavaScript mangles orig_pars = cv.make_pars(set_prognoses=True, prog_by_age=False, use_layers=False) defaults = get_defaults(merge=True) web_pars = {} web_pars['verbose'] = verbose # Control verbosity here for key, entry in {**sim_pars, **epi_pars}.items(): print(key, entry) best = defaults[key]['best'] minval = defaults[key]['min'] maxval = defaults[key]['max'] try: web_pars[key] = np.clip(float(entry['best']), minval, maxval) except Exception as E: user_key = entry['name'] user_val = entry['best'] err = f'Could not convert parameter "{user_key}" from value "{user_val}"; using default value instead.' errs.append(log_err(err, E)) web_pars[key] = best if die: raise if key in sim_pars: sim_pars[key]['best'] = web_pars[key] else: epi_pars[key]['best'] = web_pars[key] # Convert durations web_pars['dur'] = sc.dcp( orig_pars['dur']) # This is complicated, so just copy it web_pars['dur']['exp2inf']['par1'] = web_pars.pop('web_exp2inf') web_pars['dur']['inf2sym']['par1'] = web_pars.pop('web_inf2sym') web_pars['dur']['crit2die']['par1'] = web_pars.pop('web_timetodie') web_dur = web_pars.pop('web_dur') for key in ['asym2rec', 'mild2rec', 'sev2rec', 'crit2rec']: web_pars['dur'][key]['par1'] = web_dur # Add n_days web_pars['n_days'] = n_days # Add the intervention web_pars['interventions'] = parse_interventions(int_pars) # Handle CFR -- ignore symptoms and set to 1 web_pars['prognoses'] = sc.dcp(orig_pars['prognoses']) web_pars['rel_symp_prob'] = 1e4 # Arbitrarily large web_pars['rel_severe_prob'] = 1e4 web_pars['rel_crit_prob'] = 1e4 web_pars['prognoses']['death_probs'][0] = web_pars.pop('web_cfr') if web_pars['rand_seed'] == 0: web_pars['rand_seed'] = None web_pars['timelimit'] = max_time # Set the time limit web_pars['pop_size'] = int(web_pars['pop_size']) # Set data type web_pars['contacts'] = int(web_pars['contacts']) # Set data type except Exception as E: errs.append(log_err('Parameter conversion failed!', E)) if die: raise # Create the sim and update the parameters try: sim = cv.Sim(pars=web_pars, datafile=datafile) except Exception as E: errs.append(log_err('Sim creation failed!', E)) if die: raise if verbose: print('Input parameters:') print(web_pars) # Core algorithm try: sim.run(do_plot=False) except TimeoutError as TE: err = f"The simulation stopped on day {sim.t} because run time limit ({sim['timelimit']} seconds) was exceeded. Please reduce the population size and/or number of days simulated." errs.append(log_err(err, TE)) if die: raise except Exception as E: errs.append(log_err('Sim run failed!', E)) if die: raise # Core plotting graphs = [] try: graphs += main_plots(sim) graphs += plot_people(sim) if show_animation: graphs += animate_people(sim) except Exception as E: errs.append(log_err('Plotting failed!', E)) if die: raise # Create and send output files (base64 encoded content) try: files, summary = get_output_files(sim) except Exception as E: files = {} summary = {} errs.append(log_err('Unable to save output files!', E)) if die: raise output = {} output['errs'] = errs output['sim_pars'] = sim_pars output['epi_pars'] = epi_pars output['int_pars'] = int_pars output['graphs'] = graphs output['files'] = files output['summary'] = summary return output
def run_sim(sim_pars=None, epi_pars=None, show_animation=False, verbose=True): ''' Create, run, and plot everything ''' err = '' try: # Fix up things that JavaScript mangles orig_pars = cv.make_pars() defaults = get_defaults(merge=True) web_pars = {} web_pars['verbose'] = verbose # Control verbosity here for key, entry in {**sim_pars, **epi_pars}.items(): print(key, entry) best = defaults[key]['best'] minval = defaults[key]['min'] maxval = defaults[key]['max'] try: web_pars[key] = np.clip(float(entry['best']), minval, maxval) except Exception: user_key = entry['name'] user_val = entry['best'] err1 = f'Could not convert parameter "{user_key}", value "{user_val}"; using default value instead\n' print(err1) err += err1 web_pars[key] = best if key in sim_pars: sim_pars[key]['best'] = web_pars[key] else: epi_pars[key]['best'] = web_pars[key] # Convert durations web_pars['dur'] = sc.dcp( orig_pars['dur']) # This is complicated, so just copy it web_pars['dur']['exp2inf']['par1'] = web_pars.pop('web_exp2inf') web_pars['dur']['inf2sym']['par1'] = web_pars.pop('web_inf2sym') web_pars['dur']['crit2die']['par1'] = web_pars.pop('web_timetodie') web_dur = web_pars.pop('web_dur') for key in ['asym2rec', 'mild2rec', 'sev2rec', 'crit2rec']: web_pars['dur'][key]['par1'] = web_dur # Add the intervention web_pars['interventions'] = [] if web_pars['web_int_day'] is not None: web_pars['interventions'] = cv.change_beta( days=web_pars.pop('web_int_day'), changes=(1 - web_pars.pop('web_int_eff'))) # Handle CFR -- ignore symptoms and set to 1 prog_pars = cv.get_default_prognoses(by_age=False) web_pars['rel_symp_prob'] = 1.0 / prog_pars.symp_prob web_pars['rel_severe_prob'] = 1.0 / prog_pars.severe_prob web_pars['rel_crit_prob'] = 1.0 / prog_pars.crit_prob web_pars['rel_death_prob'] = web_pars.pop( 'web_cfr') / prog_pars.death_prob except Exception as E: err2 = f'Parameter conversion failed! {str(E)}\n' print(err2) err += err2 # Create the sim and update the parameters try: sim = cv.Sim() sim['prog_by_age'] = False # So the user can override this value sim['timelimit'] = max_time # Set the time limit if web_pars['seed'] == 0: web_pars['seed'] = None # Reset sim.update_pars(web_pars) except Exception as E: err3 = f'Sim creation failed! {str(E)}\n' print(err3) err += err3 if verbose: print('Input parameters:') print(web_pars) # Core algorithm try: sim.run(do_plot=False) except Exception as E: err4 = f'Sim run failed! {str(E)}\n' print(err4) err += err4 if sim.stopped: try: # Assume it stopped because of the time, but if not, don't worry day = sim.stopped['t'] time_exceeded = f"The simulation stopped on day {day} because run time limit ({sim['timelimit']} seconds) was exceeded. Please reduce the population size and/or number of days simulated." err += time_exceeded except: pass # Core plotting graphs = [] try: to_plot = sc.dcp(cv.default_sim_plots) for p, title, keylabels in to_plot.enumitems(): fig = go.Figure() for key in keylabels: label = sim.results[key].name this_color = sim.results[key].color y = sim.results[key][:] fig.add_trace( go.Scatter(x=sim.results['t'][:], y=y, mode='lines', name=label, line_color=this_color)) if sim['interventions']: interv_day = sim['interventions'][0].days[0] if interv_day > 0 and interv_day < sim['n_days']: fig.add_shape( dict(type="line", xref="x", yref="paper", x0=interv_day, x1=interv_day, y0=0, y1=1, name='Intervention', line=dict(width=0.5, dash='dash'))) fig.update_layout(annotations=[ dict(x=interv_day, y=1.07, xref="x", yref="paper", text="Intervention start", showarrow=False) ]) fig.update_layout(title={'text': title}, xaxis_title='Day', yaxis_title='Count', autosize=True) output = {'json': fig.to_json(), 'id': str(sc.uuid())} d = json.loads(output['json']) d['config'] = {'responsive': True} output['json'] = json.dumps(d) graphs.append(output) graphs.append(plot_people(sim)) if show_animation: graphs.append(animate_people(sim)) except Exception as E: err5 = f'Plotting failed! {str(E)}\n' print(err5) err += err5 # Create and send output files (base64 encoded content) files = {} summary = {} try: datestamp = sc.getdate(dateformat='%Y-%b-%d_%H.%M.%S') ss = sim.to_xlsx() files['xlsx'] = { 'filename': f'COVASim_results_{datestamp}.xlsx', 'content': 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,' + base64.b64encode(ss.blob).decode("utf-8"), } json_string = sim.to_json() files['json'] = { 'filename': f'COVASim_results_{datestamp}.txt', 'content': 'data:application/text;base64,' + base64.b64encode(json_string.encode()).decode("utf-8"), } # Summary output summary = { 'days': sim.npts - 1, 'cases': round(sim.results['cum_infections'][-1]), 'deaths': round(sim.results['cum_deaths'][-1]), } except Exception as E: err6 = f'File saving failed! {str(E)}\n' print(err6) err += err6 output = {} output['err'] = err output['sim_pars'] = sim_pars output['epi_pars'] = epi_pars output['graphs'] = graphs output['files'] = files output['summary'] = summary return output