def run_esmda_model(base_filename, config, data, save_plots=1, save_files=1): # concatenate additional column for actual observed hospitalized based t_obs = data[:, I_TIME] useworldfile = config['worldfile'] if not useworldfile: data = generate_hos_actual(data, config) else: data = generate_zero_columns(data, config) # Run the forward model to obtain a prior ensemble of models save_input_data(base_filename, data) calibration_modes = get_calibration_modes(config['calibration_mode']) observation_errors = get_calibration_errors(config['observation_error']) calibration_mode = calibration_modes[0] found = False for i, calmode in enumerate(s_calmodes): if calmode == calibration_mode: print('ensemble fit on : ', calibration_modes[0], ' with error ', observation_errors[0]) y_obs = data[:, i_calmodes[i]] output_index = [o_calmodes[i]] # error = np.ones_like(y_obs) * observation_errors[0] if calmode == S_HOS or calmode == S_ICU: error = y_obs * (observation_errors[0] / 100) error[error <= 0] = 1 else: error = np.ones_like(y_obs) * observation_errors[0] found = True if not found: raise NotImplementedError for ical, calibration_mode in enumerate(calibration_modes): if ical > 0: print('additional ensemble fit on : ', calibration_modes[ical], ' with error ', observation_errors[ical]) for i, calmode in enumerate(s_calmodes): if calmode == calibration_mode: y_obs2 = data[:, i_calmodes[i]] output_index2 = [o_calmodes[i]] # error2 = np.ones_like(y_obs2) * observation_errors[ical] # error2[min(0,len(error2)-20):] *= 1 if calmode == S_HOS or calmode == S_ICU: error2 = y_obs2 * (observation_errors[ical] / 100) error2[error2 <= 0] = 1 else: error2 = np.ones_like( y_obs2) * observation_errors[ical] y_obs = np.append(y_obs, y_obs2) # output_index = [output_index[0], O_ICU] output_index = np.append(output_index, output_index2) error = np.append(error, error2) found = True if not found: raise NotImplementedError # Load inversion method and define forward model try: ni = config['esmda_iterations'] except KeyError: ni = 8 im = InversionMethods(ni=ni) forward = base_seir_model np.random.seed(12345) # Run the find_N function only if specified in the config file try: if config['find_N']: nnew = find_N(config, data) config['N'] = { 'type': 'uniform', 'min': 0.25 * nnew, 'max': 4 * nnew } except KeyError: pass # Parse the configuration json ndata = np.size(data[:, 0]) m_prior, fwd_args = parse_config(config, ndata) m_prior = reshape_prior(m_prior) # Estimated uncertainty on the data # sigma = np.sqrt(y_obs).clip(min=10) # error = config['observation_error'] # if calibration_mode == S_HOS or calibration_mode == S_HOSCUM: # error = 2 * error # sigma = error * np.ones_like(y_obs) sigma = error add_arg = [fwd_args] kwargs = { 't_obs': t_obs, 'output_index': output_index, 'G': map_model_to_obs, 'print_results': 1 } results = im.es_mda(forward, m_prior, y_obs, sigma, *add_arg, **kwargs) prior_and_posterior_results = save_and_plot_prior_and_posterior( results, fwd_args, config, base_filename, t_obs, data, calibration_mode, output_index, save_plots, save_files) if save_files: # if True: # Add this to have a output folder in main directory outpath = os.path.join(os.getcwd(), 'bin', 'output', base_filename) # outpath = os.path.join(os.path.split(os.getcwd())[0], 'output', base_filename + '_output.h5') save_results(results, fwd_args, config, outpath, data, mode='esmda') try: accc_timeinterval = config['ACCC_timeinterval'] accc_timestart = config['ACCC_timestart'] accc_step = config['ACCC_step'] accc_maxstep = config['ACCC_maxstep'] accc_step_sd = config['ACCC_step_sd'] accc_low = config['ACCC_low'] accc_slope = config['ACCC_slope'] accc_scale = config['ACCC_scale'] accc_cliplow = config['ACCC_cliplow'] accc_cliphigh = config['ACCC_cliphigh'] time_delay = config['time_delay'] hammer_icu = config['hammer_ICU'] hammer_slope = config['hammer_slope'] hammer_release = config['hammer_release'] hammer_alpha = config['hammer_alpha'] accc_results = apply_accc(base_filename, results['M'][-1], fwd_args, accc_timeinterval, accc_timestart, accc_maxstep, accc_step, accc_step_sd, accc_low, accc_slope, accc_scale, hammer_icu, hammer_slope, hammer_alpha, hammer_release, accc_cliplow, accc_cliphigh, time_delay, data_end=data[-1, 0]) # TODO: Add hammer results to h5 file and plotting results['fw'][-1] = accc_results save_and_plot_prior_and_posterior(results, fwd_args, config, base_filename, t_obs, data, calibration_mode, output_index, save_plots, save_files, plothammer=True) add_hammer_to_results(accc_results, outpath, mode='esmda') except KeyError: pass return prior_and_posterior_results, results
def main(configpath): # Load the model configuration file and the data (observed cases) config = load_config(configpath) data = load_data(config) # concatenate additional column for actual observed hospitalized based t_obs = data[:, I_TIME] useworldfile = config['worldfile'] if (not useworldfile): data = generate_hos_actual(data, config) else: data = generate_zero_columns(data, config) # Run the forward model to obtain a prior ensemble of models save_input_data(configpath, data) calibration_modes = get_calibration_modes(config['calibration_mode']) observation_errors = get_calibration_errors(config['observation_error']) calibration_mode = calibration_modes[0] found = False for i, calmode in enumerate(s_calmodes): if (calmode == calibration_mode): print('ensemble fit on : ', calibration_modes[0], ' with error ', observation_errors[0]) y_obs = data[:, i_calmodes[i]] output_index = [o_calmodes[i]] error = np.ones_like(y_obs) * observation_errors[0] found = True if not found: raise NotImplementedError for ical, calibration_mode in enumerate(calibration_modes): if (ical > 0): print('additional ensemble fit on : ', calibration_modes[ical], ' with error ', observation_errors[ical]) for i, calmode in enumerate(s_calmodes): if (calmode == calibration_mode): y_obs2 = data[:, i_calmodes[i]] output_index2 = [o_calmodes[i]] error2 = np.ones_like(y_obs2) * observation_errors[ical] y_obs = np.append(y_obs, y_obs2) # output_index = [output_index[0], O_ICU] output_index = np.append(output_index, output_index2) error = np.append(error, error2) found = True if not found: raise NotImplementedError # Load inversion method and define forward model try: ni = config['esmda_iterations'] except KeyError: ni = 8 im = InversionMethods(ni=ni) forward = base_seir_model np.random.seed(12345) # Parse the configuration json m_prior, fwd_args = parse_config(config) m_prior = reshape_prior(m_prior) # Estimated uncertainty on the data # sigma = np.sqrt(y_obs).clip(min=10) # error = config['observation_error'] # if calibration_mode == S_HOS or calibration_mode == S_HOSCUM: # error = 2 * error # sigma = error * np.ones_like(y_obs) sigma = error add_arg = [fwd_args] kwargs = { 't_obs': t_obs, 'output_index': output_index, 'G': map_model_to_obs, 'print_results': 1 } results = im.es_mda(forward, m_prior, y_obs, sigma, *add_arg, **kwargs) plot_prior_and_posterior(results, fwd_args, config, configpath, t_obs, data, calibration_mode, output_index) base = (os.path.split(configpath)[-1]).split('.')[0] outpath = os.path.join( os.path.split(os.getcwd())[0], 'output', base + '_output.h5') save_results(results, fwd_args, config, outpath, data, mode='esmda') # Check if we want to apply a 'hammer' try: hammer_icu = config['hammer_ICU'] hammer_alpha = config['hammer_alpha'] assert len(hammer_alpha) == 2 hammered_results = apply_hammer(results['fw'][-1], results['M'][-1], fwd_args, hammer_icu, hammer_alpha, data_end=data[-1, 0]) # TODO: Add hammer results to h5 file and plotting add_hammer_to_results(hammered_results, outpath, mode='esmda') except KeyError as e: pass # Don't apply hammer, you're done early!
def main(configpath): # Load the model configuration file and the data (observed cases) config = load_config(configpath) data = load_data(config) outpath = config['outpath'] useworldfile = config['worldfile'] if (not useworldfile): data = generate_hos_actual(data, config) else: data = generate_zero_columns(data, config) # Run the forward model to obtain a prior ensemble of models save_input_data(configpath, outpath, data) prior, time, prior_param, fwd_args = run_prior(config) # Calibrate the model (as calibration data, we either use 'hospitalized' or 'dead') calibration_mode = get_calibration_modes(config['calibration_mode'])[0] if calibration_mode == 'dead': data_index = I_DEAD output_index = O_DEAD elif calibration_mode == 'hospitalized': data_index = I_HOS output_index = O_HOS elif calibration_mode == 'hospitalizedcum': data_index = I_HOSCUM output_index = O_HOSCUM elif calibration_mode == 'ICU': data_index = I_ICU output_index = O_ICU else: raise NotImplementedError plotplume = config['plot']['hindcast_plume'] p = calibrate_with_data( prior, time, data, data_index, output_index) # Posterior probability for each ensemble member integrated_parameter_values = integrate_parameters(prior_param, p) np.savetxt(outpath + "/integrated_parameter_values.csv", integrated_parameter_values, delimiter=";") integrated_results = integrate_calibration(prior, p) # Mean posterior model # Create output of the calibration phase plot_results(prior, time, configpath, outpath, config, data, integrated_results, calibration_mode, prior=True, plot_plume=plotplume) # Based on the model performance in the past, run models again, forecasting the future forecast = rerun_model_with_alpha_uncertainty(prior_param, p, config, fwd_args) plot_results(forecast, time, configpath, outpath, config, data, cal_mode=config['calibration_mode'], prior=False, plot_plume=True) plot_posterior(forecast, config, configpath, outpath, data, ['time']) hospital_forecast_to_txt(forecast, time, configpath, outpath, config)
def main(configpath): # Load the model configuration file and the data (observed cases) config = load_config(configpath) data = load_data(config) base_filename = (os.path.split(configpath)[-1]).split('.')[0] useworldfile = config['worldfile'] if (not useworldfile): data = generate_hos_actual(data, config) else: data = generate_zero_columns(data, config) # Run the forward model to obtain a prior ensemble of models save_input_data(base_filename, data) ndata = np.size(data[:, 0]) prior, time, prior_param, fwd_args = run_prior(config, ndata) # Calibrate the model (as calibration data, we either use 'hospitalized' or 'dead') calibration_mode = get_calibration_modes(config['calibration_mode'])[0] if calibration_mode == 'dead': data_index = I_DEAD output_index = O_DEAD elif calibration_mode == 'hospitalized': data_index = I_HOS output_index = O_HOS elif calibration_mode == 'hospitalizedcum': data_index = I_HOSCUM output_index = O_HOSCUM elif calibration_mode == 'ICU': data_index = I_ICU output_index = O_ICU else: raise NotImplementedError plotplume = config['plot']['hindcast_plume'] p = calibrate_with_data( prior, time, data, data_index, output_index) # Posterior probability for each ensemble member integrated_results = integrate_calibration(prior, p) # Mean posterior model # Create output of the calibration phase plot_results(prior, time, configpath, config, data, integrated_results, calibration_mode, prior=True, plot_plume=plotplume) # Based on the model performance in the past, run models again, forecasting the future forecast = rerun_model_with_alpha_uncertainty(prior_param, p, config, fwd_args) base = (os.path.split(configpath)[-1]).split('.')[0] outbase = os.path.join(os.path.split(os.getcwd())[0], 'output', base) plot_results(forecast, time, configpath, config, data, cal_mode=config['calibration_mode'], prior=False, plot_plume=True) plot_posterior(forecast, config, outbase, data, ['time']) try: hospital_forecast_to_txt(forecast, time, configpath, config, data) except: pass