def main(args): user_input = read_input(args.input) if user_input['path_to_obs'] == 'None': raise IOError('It is not possible to continue a process without determining a static data set.') m1 = imp.load_source(args.functions[:-3], args.functions) user_input['simulation_func'] = getattr(m1, user_input['simulation_func'][0]) if isinstance(user_input['distance_func'][0], str): user_input['distance_func'] = getattr(m1, user_input['distance_func'][0]) #check dimension of distance output dtemp = user_input['distance_func'](user_input['dataset1'], user_input) user_input['dist_dim'] = len(dtemp) for l1 in range(user_input['npar']): par = user_input['param_to_fit'][l1] if isinstance(user_input['prior'][par]['func'], str): user_input['prior'][par]['func'] = getattr(m1, user_input['prior_func'][l1]) #initiate ABC construct sampler_ABC = ABC(params=user_input) #define finished particle system index sampler_ABC.T = int(args.PS) #continue from previous run sampler_ABC.ContinueStoppedRun(sampler_ABC.T, nruns=int(user_input['nruns'][0]))
def main(args): user_input = read_input(args.input) if args.functions != None: m1 = imp.load_source(args.functions[:-3], args.functions) if isinstance(user_input['distance_func'][0], str): user_input['distance_func'] = getattr( m1, user_input['distance_func'][0]) for l1 in range(user_input['npar']): par = user_input['param_to_fit'][l1] if isinstance(user_input['prior'][par]['func'], str): user_input['prior'][par]['func'] = getattr( m1, user_input['prior_func'][l1]) #initiate ABC construct sampler_ABC = ABC(params=user_input) #build first particle system sys1 = sampler_ABC.BuildFirstPSystem() #update particle system until convergence sampler_ABC.fullABC(nruns=int(user_input['nruns'][0]))
def main( args ): user_input = read_input(args.input) m1 = imp.load_source(args.functions[:-3], args.functions) user_input['simulation_func'] = getattr(m1, user_input['simulation_func'][0]) if isinstance(user_input['distance_func'], list): user_input['distance_func'] = getattr(m1, user_input['distance_func'][0]) for element in user_input['param_to_fit']: if isinstance(user_input['prior'][element]['func'], str): user_input['prior'][element]['func'] = getattr(m1, user_input['prior'][element]['func']) for pvar in user_input[element + '_prior_par_name'][:user_input[element + '_prior_par_name'].index('#')]: indx = user_input[element + '_prior_par_name'].index(pvar) user_input['prior'][element][pvar] = float(user_input[element + '_prior_par_val'][indx]) #check if observed data exist, simulate in case negative if user_input['path_to_obs'] == 'None': user_input['dataset1'] = user_input['simulation_func'](user_input['simulation_input']) #save data to file op1 = open('synthetic_data.dat', 'w') for line in user_input['dataset1']: for item in line: op1.write(str(item) + ' ') op1.write('\n') op1.close() dist_try = user_input['distance_func'](user_input['dataset1'], user_input) if 'dist_dim' not in user_input.keys(): user_input['dist_dim'] = len(dist_try) #initiate ABC construct sampler_ABC = ABC(params=user_input) #build first particle system sys1 = sampler_ABC.BuildFirstPSystem() #update particle system until convergence sampler_ABC.fullABC(nruns=int(user_input['nruns'][0])) #plot results if len(user_input['param_to_fit'] ) == 1 : plot_1p(sampler_ABC.T, 'results.pdf', user_input) elif len(user_input['param_to_fit'] ) == 2 : plot_2p(sampler_ABC.T, 'results.pdf', user_input) elif len(user_input['param_to_fit'] ) == 3 : plot_3p(sampler_ABC.T, 'results.pdf', user_input) else: raise ValueError('Only 1, 2, and 3 dimensional plots are implemented so far!')
def main(args): user_input = read_input(args.input) if args.functions: m1 = imp.load_source(args.functions[:-3], args.functions) for l1 in range(user_input['npar']): par = user_input['param_to_fit'][l1] if isinstance(user_input['prior'][par]['func'], str): user_input['prior'][par]['func'] = getattr( m1, user_input['prior_func'][l1]) if isinstance(user_input['simulation_func'][0], str): user_input['simulation_func'] = getattr( m1, user_input['simulation_func'][0]) if isinstance(user_input['distance_func'][0], str): user_input['distance_func'] = getattr( m1, user_input['distance_func'][0]) #check if observed data exist, simulate in case negative if user_input['path_to_obs'] == 'None': user_input['dataset1'] = user_input['simulation_func']( user_input['simulation_input']) if 'dist_dim' not in user_input.keys(): user_input['dist_dim'] = len(user_input['distance_func']( user_input['dataset1'], user_input)) #plot results if len(user_input['param_to_fit']) == 1: plot_1p(int(args.PS), 'results.pdf', user_input) elif len(user_input['param_to_fit']) == 2: plot_2p(int(args.PS), 'results.pdf', user_input) elif len(user_input['param_to_fit']) == 3: plot_3p(int(args.PS), 'results.pdf', user_input) else: raise ValueError( 'Only 1, 2 and 3 dimensional plots are implemented so far!')
def main(args): user_input = read_input(args.input) user_input['simulation_func'] = numcosmo_sim_cluster if user_input['path_to_obs'] == 'None': raise IOError( 'It is not possible to continue a process without determining a static data set.' ) #initiate NumCosmo object necessary for simulation Cosmo = ChooseParamsInput() Cosmo.params = user_input['simulation_input'] Cosmo.params["OL"] = 1. - Cosmo.params['Om'] - Cosmo.params['Ob'] #assign input for simulation user_input['simulation_params'] = Cosmo.params if args.functions != None: m1 = imp.load_source(args.functions[:-3], args.functions) if isinstance(user_input['distance_func'][0], str): user_input['distance_func'] = getattr( m1, user_input['distance_func'][0]) dtemp = user_input['distance_func'](user_input['dataset1'], user_input) user_input['dist_dim'] = len(dtemp) for par in user_input['param_to_fit']: l1 = user_input['param_to_fit'].index(par) if isinstance(user_input['prior'][par]['func'], str): user_input['prior'][par]['func'] = getattr( m1, user_input['prior_func'][l1]) #initiate ABC construct sampler_ABC = ABC(params=user_input) #define finished particle system index sampler_ABC.T = int(args.PS) #continue from previous run sampler_ABC.ContinueStoppedRun(int(args.PS), nruns=int(user_input['nruns'][0]))
def main( args ): user_input = read_input( args.input ) if args.functions: m1 = imp.load_source( args.functions[:-3], args.functions ) for l1 in range( user_input['npar'] ): par = user_input['param_to_fit'][l1] if isinstance( user_input['prior'][par]['func'], str): user_input['prior'][par]['func'] = getattr(m1, user_input['prior_func'][l1]) if isinstance(user_input['simulation_func'][0], str): user_input['simulation_func'] = getattr(m1, user_input['simulation_func'][0]) if isinstance(user_input['distance_func'][0], str): user_input['distance_func'] = getattr(m1, user_input['distance_func'][0]) #check if observed data exist, simulate in case negative if user_input['path_to_obs'] == 'None': user_input['dataset1'] = user_input['simulation_func'](user_input['simulation_input']) if 'dist_dim' not in user_input.keys(): user_input['dist_dim'] = len(user_input['distance_func'](user_input['dataset1'], user_input)) #plot results if len( user_input['param_to_fit'] ) == 1 : plot_1p( int( args.PS ), 'results.pdf', user_input) elif len( user_input['param_to_fit'] ) == 2 : plot_2p( int( args.PS ), 'results.pdf', user_input ) elif len( user_input['param_to_fit'] ) == 3 : plot_3p( int( args.PS ), 'results.pdf', user_input ) else: raise ValueError('Only 1, 2 and 3 dimensional plots are implemented so far!')
def main( args ): user_input = read_input( args.input ) user_input['simulation_func'] = numcosmo_sim_cluster if user_input['path_to_obs'] == 'None': raise IOError('It is not possible to continue a process without determining a static data set.') #initiate NumCosmo object necessary for simulation Cosmo=ChooseParamsInput() Cosmo.params = user_input['simulation_input'] Cosmo.params["OL"] = 1.- Cosmo.params['Om']-Cosmo.params['Ob'] #assign input for simulation user_input['simulation_params'] = Cosmo.params if args.functions != None: m1 = imp.load_source( args.functions[:-3], args.functions ) if isinstance(user_input['distance_func'][0], str): user_input['distance_func'] = getattr(m1, user_input['distance_func'][0]) dtemp = user_input['distance_func'](user_input['dataset1'], user_input) user_input['dist_dim'] = len(dtemp) for par in user_input['param_to_fit']: l1 = user_input['param_to_fit'].index(par) if isinstance( user_input['prior'][par]['func'], str): user_input['prior'][par]['func'] = getattr(m1, user_input['prior_func'][l1]) #initiate ABC construct sampler_ABC = ABC(params = user_input) #define finished particle system index sampler_ABC.T = int(args.PS) #continue from previous run sampler_ABC.ContinueStoppedRun(int(args.PS), nruns=int(user_input['nruns'][0]))
def main( args ): user_input = read_input(args.input) if args.functions != None: m1 = imp.load_source( args.functions[:-3], args.functions ) if isinstance(user_input['distance_func'][0], str): user_input['distance_func'] = getattr(m1, user_input['distance_func'][0]) for l1 in range(user_input['npar']): par = user_input['param_to_fit'][l1] if isinstance(user_input['prior'][par]['func'], str): user_input['prior'][par]['func'] = getattr(m1, user_input['prior_func'][l1]) #initiate ABC construct sampler_ABC = ABC(params=user_input) #build first particle system sys1 = sampler_ABC.BuildFirstPSystem() #update particle system until convergence sampler_ABC.fullABC(nruns=int(user_input['nruns'][0]))
def main(args): params = read_input( args.input ) if args.functions != None: m1 = imp.load_source( args.functions[:-3], args.functions ) if isinstance(params['distance_func'], list): params['distance_func'] = getattr(m1, params['distance_func'][0]) if isinstance(params['simulation_func'], list): params['simulation_func'] = getattr(m1, params['simulation_func'][0]) for par in params['param_to_fit']: if isinstance(params['prior'][par]['func'], str): params['prior'][par]['func'] = getattr(m1, params['prior_func'][params['param_to_fit'].index(par)]) if not args.output: output_file = raw_input('Enter root for output files (no extension): ') else: output_file = args.output if 'dataset1' not in params: params['dataset1'] = params['simulation_func'](params['simulation_input']) if 'cov' in params['simulation_input']: try: fname_cov = args.covariance params['simulation_input']['cov'] = np.loadtxt(fname_cov) params['cov'] = np.loadtxt(fname_cov) except IOError: print 'Provide name of file containing covariance matrix!' #test distance between identical cataloges distance_equal = np.atleast_1d(params['distance_func'](params['dataset1'], params)) if distance_equal.any() != 0.0: raise ValueError('Distance for 2 identical cataloges = ' + str(distance_equal)) else: print 'Distance between identical cataloges = ' + str(distance_equal) #test a single distance calculation new_sim_input = DrawAllParams(params['prior']) for j in xrange(params['npar']): params['simulation_input'][params['param_to_fit'][j]] = new_sim_input[j] data_simul = params['simulation_func'](params['simulation_input']) try: distance_single = params['distance_func'](data_simul, params) print 'New parameter value = ' + str(new_sim_input) print 'Distance between observed and simulated data = ' + str(distance_single) except ValueError: print 'Error in calculating single distance with parameters:' for item in params['param_to_fit']: print item + '=' + str(params['simulation_input'][item]) if str(distance_single) is 'nan': print 'NaN found!' #generate grid for distance behaviour inspection ngrid = int(raw_input('Enter number of draws in parameter grid: ')) param_grid = [DrawAllParams(params['prior']) for j1 in xrange(ngrid)] #open output data file op = open(output_file + '.dat', 'w') for par in params['param_to_fit']: op.write(par + ' ') for i1 in xrange(len(distance_equal)): op.write('dist' + str(i1 + 1) + ' ') op.write('\n') grid = [] for pars in param_grid: if params['screen']: print 'Particle index: ' + str(len(grid)+1) grid_element = list(pars) for j1 in xrange(params['npar']): params['simulation_input'][params['param_to_fit'][j1]] = pars[j1] data_simul_grid = params['simulation_func'](params['simulation_input']) distance_grid = np.atleast_1d(params['distance_func'](data_simul_grid, params)) if sum(distance_grid) < 9**9: for item in grid_element: op.write(str(item) + ' ') for elem in distance_grid: grid_element.append(elem) op.write(str(elem) + ' ') op.write('\n') grid.append(grid_element) op.close() grid = np.array(grid) #plot distance behaviour plt.figure() plt.subplots_adjust(top = 0.95, right=0.985, left=0.075, bottom=0.075, wspace=0.25, hspace=0.25) n=0 for par_indx in xrange(params['npar']): p1 = params['param_to_fit'][par_indx] for dist_indx in xrange(len(distance_single)): n = n + 1 ylim = np.std( grid[:,params['npar'] + dist_indx]) plt.subplot(params['npar'], len(distance_single), n) plt.scatter(grid[:,par_indx], grid[:,params['npar'] + dist_indx]) plt.xlabel(params['param_to_fit'][par_indx], fontsize=14) plt.ylabel('distance' + str(dist_indx + 1), fontsize=14) #plt.xticks(range(int(params['prior'][p1]['min']) - 1, # int(params['prior'][p1]['max']) + 1, int(params['prior'][p1]['max'] - params['prior'][p1]['min'] +2)/5), fontsize=8) plt.yticks(fontsize = 8) plt.ylim(-0.25*ylim, ylim) plt.savefig(output_file + '.pdf') plt.close() print '\n Figure containing distance results is stored in ' + output_file + '.pdf'
10 - 16 December 2107, Passo del Tonale - Italy """ from cosmoabc.priors import flat_prior from cosmoabc.ABC_sampler import ABC from cosmoabc.ABC_functions import read_input from cosmoabc.plots import plot_2p import numpy as np from my_functions import my_distance, my_simulation, my_prior #user input file filename = 'user.input' #read user input Parameters = read_input(filename) # update dictionary of user input parameters # with customized functions Parameters['distance_func'] = my_distance Parameters['simulation_func'] = my_simulation Parameters['prior']['mean']['func'] = my_prior # in case you want to generate a pseudo-observed data set Parameters['dataset1'] = my_simulation(Parameters['simulation_input']) #calculate distance between 2 catalogues dtemp = my_distance(Parameters['dataset1'], Parameters) #determine dimension of distance output Parameters['dist_dim'] = len(dtemp)
def main(args): user_input = read_input(args.input) m1 = imp.load_source(args.functions[:-3], args.functions) user_input['simulation_func'] = getattr(m1, user_input['simulation_func'][0]) if isinstance(user_input['distance_func'], list): user_input['distance_func'] = getattr(m1, user_input['distance_func'][0]) for element in user_input['param_to_fit']: if isinstance(user_input['prior'][element]['func'], str): user_input['prior'][element]['func'] = getattr( m1, user_input['prior'][element]['func']) for pvar in user_input[element + '_prior_par_name'][:user_input[ element + '_prior_par_name'].index('#')]: indx = user_input[element + '_prior_par_name'].index(pvar) user_input['prior'][element][pvar] = float( user_input[element + '_prior_par_val'][indx]) #check if observed data exist, simulate in case negative if user_input['path_to_obs'] == 'None': user_input['dataset1'] = user_input['simulation_func']( user_input['simulation_input']) #save data to file op1 = open('synthetic_data.dat', 'w') for line in user_input['dataset1']: for item in line: op1.write(str(item) + ' ') op1.write('\n') op1.close() dist_try = user_input['distance_func'](user_input['dataset1'], user_input) if 'dist_dim' not in user_input.keys(): user_input['dist_dim'] = len(dist_try) #initiate ABC construct sampler_ABC = ABC(params=user_input) #build first particle system sys1 = sampler_ABC.BuildFirstPSystem() #update particle system until convergence sampler_ABC.fullABC(nruns=int(user_input['nruns'][0])) #plot results if len(user_input['param_to_fit']) == 1: plot_1p(sampler_ABC.T, 'results.pdf', user_input) elif len(user_input['param_to_fit']) == 2: plot_2p(sampler_ABC.T, 'results.pdf', user_input) elif len(user_input['param_to_fit']) == 3: plot_3p(sampler_ABC.T, 'results.pdf', user_input) else: raise ValueError( 'Only 1, 2, and 3 dimensional plots are implemented so far!')
def main(args): params = read_input(args.input) if args.functions != None: m1 = imp.load_source(args.functions[:-3], args.functions) if isinstance(params['distance_func'], list): params['distance_func'] = getattr(m1, params['distance_func'][0]) if isinstance(params['simulation_func'], list): params['simulation_func'] = getattr(m1, params['simulation_func'][0]) for par in params['param_to_fit']: if isinstance(params['prior'][par]['func'], str): params['prior'][par]['func'] = getattr( m1, params['prior_func'][params['param_to_fit'].index(par)]) if not args.output: output_file = raw_input( 'Enter root for output files (no extension): ') else: output_file = args.output if 'dataset1' not in params: params['dataset1'] = params['simulation_func']( params['simulation_input']) if 'cov' in params['simulation_input']: try: fname_cov = args.covariance params['simulation_input']['cov'] = np.loadtxt(fname_cov) params['cov'] = np.loadtxt(fname_cov) except IOError: print 'Provide name of file containing covariance matrix!' #test distance between identical cataloges distance_equal = np.atleast_1d(params['distance_func'](params['dataset1'], params)) if distance_equal.any() != 0.0: raise ValueError('Distance for 2 identical cataloges = ' + str(distance_equal)) else: print 'Distance between identical cataloges = ' + str(distance_equal) #test a single distance calculation new_sim_input = DrawAllParams(params['prior']) for j in xrange(params['npar']): params['simulation_input'][params['param_to_fit'] [j]] = new_sim_input[j] data_simul = params['simulation_func'](params['simulation_input']) try: distance_single = params['distance_func'](data_simul, params) print 'New parameter value = ' + str(new_sim_input) print 'Distance between observed and simulated data = ' + str( distance_single) except ValueError: print 'Error in calculating single distance with parameters:' for item in params['param_to_fit']: print item + '=' + str(params['simulation_input'][item]) if str(distance_single) is 'nan': print 'NaN found!' #generate grid for distance behaviour inspection ngrid = int(raw_input('Enter number of draws in parameter grid: ')) param_grid = [DrawAllParams(params['prior']) for j1 in xrange(ngrid)] #open output data file op = open(output_file + '.dat', 'w') for par in params['param_to_fit']: op.write(par + ' ') for i1 in xrange(len(distance_equal)): op.write('dist' + str(i1 + 1) + ' ') op.write('\n') grid = [] for pars in param_grid: if params['screen']: print 'Particle index: ' + str(len(grid) + 1) grid_element = list(pars) for j1 in xrange(params['npar']): params['simulation_input'][params['param_to_fit'][j1]] = pars[j1] data_simul_grid = params['simulation_func'](params['simulation_input']) distance_grid = np.atleast_1d(params['distance_func'](data_simul_grid, params)) if sum(distance_grid) < 9**9: for item in grid_element: op.write(str(item) + ' ') for elem in distance_grid: grid_element.append(elem) op.write(str(elem) + ' ') op.write('\n') grid.append(grid_element) op.close() grid = np.array(grid) #plot distance behaviour plt.figure() plt.subplots_adjust(top=0.95, right=0.985, left=0.075, bottom=0.075, wspace=0.25, hspace=0.25) n = 0 for par_indx in xrange(params['npar']): p1 = params['param_to_fit'][par_indx] for dist_indx in xrange(len(distance_single)): n = n + 1 ylim = np.std(grid[:, params['npar'] + dist_indx]) plt.subplot(params['npar'], len(distance_single), n) plt.scatter(grid[:, par_indx], grid[:, params['npar'] + dist_indx]) plt.xlabel(params['param_to_fit'][par_indx], fontsize=14) plt.ylabel('distance' + str(dist_indx + 1), fontsize=14) #plt.xticks(range(int(params['prior'][p1]['min']) - 1, # int(params['prior'][p1]['max']) + 1, int(params['prior'][p1]['max'] - params['prior'][p1]['min'] +2)/5), fontsize=8) plt.yticks(fontsize=8) plt.ylim(-0.25 * ylim, ylim) plt.savefig(output_file + '.pdf') plt.close() print '\n Figure containing distance results is stored in ' + output_file + '.pdf'