def ga_evaluate(self, min, max, args={}): """ Optimization using Genetics algorithm (GA). :param min: Minimum values for parameters :param max: Maximum values for parameters :param args: Optional arguments for neurotune optimizer :return: optimized values """ # Initialize neurotune optional arguments if 'population_size' in args: population_size = args['population_size'] else: population_size = 100 if 'max_evaluations' in args: max_evaluations = args['max_evaluations'] else: max_evaluations = 100 if 'num_selected' in args: num_selected = args['num_selected'] else: num_selected = None if 'num_offspring' in args: num_offspring = args['num_offspring'] else: num_offspring = None if 'num_elites' in args: num_elites = args['num_elites'] else: num_elites = 1 if 'mutation_rate' in args: mutation_rate = args['mutation_rate'] else: mutation_rate = 0.2 if 'maximize' in args: maximize = args['maximize'] else: maximize = False if 'seeds' in args: seeds = args['seeds'] else: seeds = [] if 'verbose' in args: verbose = args['verbose'] else: verbose = False candidates = optimizers.CustomOptimizerA( max_constraints=max, min_constraints=min, evaluator=self, population_size= population_size, #20 times larger than free parameters max_evaluations=max_evaluations, num_selected=num_selected, num_offspring=num_offspring, num_elites=num_elites, mutation_rate=mutation_rate, maximize=maximize, seeds=seeds, verbose=verbose) best_candidate, score = candidates.optimize(do_plot=False, seed=1234) return best_candidate, score
def run_optimisation(prefix, config, level, parameters, max_constraints, min_constraints, weights, target_data, sim_time=500, dt=0.05, analysis_start_time=0, population_size=20, max_evaluations=20, num_selected=10, num_offspring=20, mutation_rate=0.9, num_elites=1, seed=12345, simulator='jNeuroML', nogui=False, num_local_procesors_to_use=4): print("Running optimisation...") print("parameters: %s" % parameters) print("max_constraints: %s" % max_constraints) print("min_constraints: %s" % min_constraints) print("simulator: %s" % simulator) ref = prefix + config run_dir = "NT_%s_%s" % (ref, time.ctime().replace(' ', '_').replace( ':', '.')) os.mkdir(run_dir) my_controller = C302Controller( ref, level, config, sim_time, dt, simulator=simulator, generate_dir=run_dir, num_local_procesors_to_use=num_local_procesors_to_use) peak_threshold = -31 if level.startswith('A') or level.startswith( 'B') else (-40) analysis_var = { 'peak_delta': 0, 'baseline': 0, 'dvdt_threshold': 0, 'peak_threshold': peak_threshold } data = ref + '.dat' sim_var = OrderedDict() for i in range(len(parameters)): sim_var[ parameters[i]] = max_constraints[i] / 2 + min_constraints[i] / 2 #make an evaluator, using automatic target evaluation: my_evaluator = c302Evaluators.EnhancedNetworkEvaluator( controller=my_controller, analysis_start_time=analysis_start_time, analysis_end_time=sim_time, parameters=parameters, analysis_var=analysis_var, weights=weights, targets=target_data) #make an optimizer my_optimizer = optimizers.CustomOptimizerA(max_constraints, min_constraints, my_evaluator, population_size=population_size, max_evaluations=max_evaluations, num_selected=num_selected, num_offspring=num_offspring, num_elites=num_elites, mutation_rate=mutation_rate, seeds=None, verbose=False) start = time.time() #run the optimizer best_candidate, fitness = my_optimizer.optimize(do_plot=False, seed=seed, summary_dir=run_dir) secs = time.time() - start reportj = {} info = "Ran %s evaluations (pop: %s) in %f seconds (%f mins total; %fs per eval)\n\n" % ( max_evaluations, population_size, secs, secs / 60.0, (secs / max_evaluations)) report = "----------------------------------------------------\n\n" + info reportj['comment'] = info reportj['time'] = secs for key, value in zip(parameters, best_candidate): sim_var[key] = value best_candidate_t, best_candidate_v = my_controller.run_individual( sim_var, show=False) best_candidate_results = my_controller.last_results best_candidate_analysis = c302Analysis.Data_Analyser( best_candidate_v, best_candidate_t, analysis_var, start_analysis=analysis_start_time, end_analysis=sim_time) best_cand_analysis_full = best_candidate_analysis.analyse() best_cand_analysis = best_candidate_analysis.analyse(target_data) report += "---------- Best candidate ------------------------------------------\n" report += pp.pformat(best_candidate) + "\n\n" report += pp.pformat(best_cand_analysis_full) + "\n" report += pp.pformat(best_cand_analysis) + "\n\n" report += "FITNESS: %f\n\n" % fitness print(report) reportj['fitness'] = fitness reportj['fittest vars'] = dict(sim_var) reportj['best_cand_details'] = best_candidate reportj['best_cand_analysis_full'] = best_cand_analysis_full reportj['best_cand_analysis'] = best_cand_analysis reportj['parameters'] = parameters reportj['analysis_var'] = analysis_var reportj['target_data'] = target_data reportj['weights'] = weights reportj['analysis_start_time'] = analysis_start_time reportj['population_size'] = population_size reportj['max_evaluations'] = max_evaluations reportj['num_selected'] = num_selected reportj['num_offspring'] = num_offspring reportj['mutation_rate'] = mutation_rate reportj['num_elites'] = num_elites reportj['seed'] = seed reportj['simulator'] = simulator reportj['sim_time'] = sim_time reportj['dt'] = dt reportj['run_directory'] = run_dir reportj['reference'] = ref report_file = open("%s/report.json" % run_dir, 'w') report_file.write(pp.pformat(reportj)) report_file.close() plot_file = open("%s/plotgens.py" % run_dir, 'w') plot_file.write( 'from neurotune.utils import plot_generation_evolution\nimport os\n') plot_file.write('\n') plot_file.write('parameters = %s\n' % parameters) plot_file.write('\n') plot_file.write( "curr_dir = os.path.dirname(__file__) if len(os.path.dirname(__file__))>0 else '.'\n" ) plot_file.write( "plot_generation_evolution(parameters, individuals_file_name = '%s/ga_individuals.csv'%curr_dir)\n" ) plot_file.close() if not nogui: added = [] for wref in weights.keys(): ref = wref.split(':')[0] if not ref in added and not "phase_offset" in ref: added.append(ref) best_candidate_plot = plt.plot(best_candidate_t, best_candidate_v[ref], label="%s - %i evaluations" % (ref, max_evaluations)) plt.legend() plt.ylim(-80.0, 80.0) plt.xlim(0.0, sim_time) plt.title("Models") plt.xlabel("Time (ms)") plt.ylabel("Membrane potential(mV)") utils.plot_generation_evolution( sim_var.keys(), individuals_file_name='%s/ga_individuals.csv' % run_dir) c302_utils.plot_c302_results(best_candidate_results, config, level, directory=run_dir, save=True)
targets=targets) population_size = 20 max_evaluations = 300 num_selected = 10 num_offspring = 5 mutation_rate = 0.5 num_elites = 1 #make an optimizer my_optimizer=optimizers.CustomOptimizerA(max_constraints, min_constraints, my_evaluator, population_size=population_size, max_evaluations=max_evaluations, num_selected=num_selected, num_offspring=num_offspring, num_elites=num_elites, mutation_rate=mutation_rate, seeds=None, verbose=True) #run the optimizer best_candidate, fitness = my_optimizer.optimize(do_plot=False, seed=1234567) keys = list(sim_vars.keys()) for i in range(len(best_candidate)): sim_vars[keys[i]] = best_candidate[i] fit_times, fit_volts = swc.run_individual(sim_vars, showPlots, False)
def main(targets, population_size=100, max_evaluations=100, num_selected=5, num_offspring=5, seeds=None): """ The optimization runs in this main method """ #make a controller my_controller = BasketCellController() #parameters to be modified in each simulation parameters = [ 'axon_gbar_na', 'axon_gbar_kv', 'axon_gbar_kv3', 'soma_gbar_na', 'soma_gbar_kv', 'soma_gbar_kv3' ] #above parameters will not be modified outside these bounds: min_constraints = [0, 0, 0, 0, 0, 0] max_constraints = [10000, 30, 1, 300, 20, 2] # EXAMPLE - how to set a seed #manual_vals=[50,50,2000,70,70,5,0.1,28.0,49.0,-73.0,23.0] #analysis variables, these default values will do: analysis_var = {'peak_delta': 1e-4, 'baseline': 0, 'dvdt_threshold': 0.0} weights = { 'average_minimum': 1.0, 'spike_frequency_adaptation': 1.0, 'trough_phase_adaptation': 1.0, 'mean_spike_frequency': 1.0, 'average_maximum': 1.0, 'trough_decay_exponent': 1.0, 'interspike_time_covar': 1.0, 'min_peak_no': 1.0, 'spike_broadening': 1.0, 'spike_width_adaptation': 1.0, 'max_peak_no': 1.0, 'first_spike_time': 1.0, 'peak_decay_exponent': 1.0, 'pptd_error': 1.0 } data = './100pA_1.csv' print('data location') print(data) #make an evaluator, using automatic target evaluation: my_evaluator = evaluators.IClampEvaluator(controller=my_controller, analysis_start_time=0, analysis_end_time=900, target_data_path=data, parameters=parameters, analysis_var=analysis_var, weights=weights, targets=targets, automatic=False) #make an optimizer my_optimizer = optimizers.CustomOptimizerA(max_constraints, min_constraints, my_evaluator, population_size=population_size, max_evaluations=max_evaluations, num_selected=num_selected, num_offspring=num_offspring, num_elites=1, mutation_rate=0.5, seeds=seeds, verbose=True) #run the optimizer best_candidate, fitness = my_optimizer.optimize(do_plot=False) return best_candidate
def _run_optimisation(a): if isinstance(a.parameters, str): a.parameters = parse_list_arg(a.parameters) if isinstance(a.min_constraints, str): a.min_constraints = parse_list_arg(a.min_constraints) if isinstance(a.max_constraints, str): a.max_constraints = parse_list_arg(a.max_constraints) if isinstance(a.target_data, str): a.target_data = parse_dict_arg(a.target_data) if isinstance(a.weights, str): a.weights = parse_dict_arg(a.weights) if isinstance(a.known_target_values, str): a.known_target_values = parse_dict_arg(a.known_target_values) if isinstance(a.extra_report_info, str): a.extra_report_info = parse_dict_arg(a.extra_report_info) pynml.print_comment_v( "=====================================================================================" ) pynml.print_comment_v("Starting run_optimisation with: ") keys = sorted(a.__dict__.keys()) for key in keys: value = a.__dict__[key] pynml.print_comment_v(" %s = %s%s" % (key, ' ' * (30 - len(key)), value)) pynml.print_comment_v( "=====================================================================================" ) if a.dry_run: pynml.print_comment_v("Dry run; not running optimization...") return ref = a.prefix run_dir = "NT_%s_%s" % (ref, time.ctime().replace(' ', '_').replace( ':', '.')) os.mkdir(run_dir) my_controller = NeuroMLController( ref, a.neuroml_file, a.target, a.sim_time, a.dt, simulator=a.simulator, generate_dir=run_dir, num_parallel_evaluations=a.num_parallel_evaluations, cleanup=a.cleanup) peak_threshold = 0 analysis_var = { 'peak_delta': 0, 'baseline': 0, 'dvdt_threshold': 0, 'peak_threshold': peak_threshold } sim_var = OrderedDict() #make an evaluator, using automatic target evaluation: my_evaluator = evaluators.NetworkEvaluator( controller=my_controller, analysis_start_time=a.analysis_start_time, analysis_end_time=a.sim_time, parameters=a.parameters, analysis_var=analysis_var, weights=a.weights, targets=a.target_data) #make an optimizer my_optimizer = optimizers.CustomOptimizerA( a.max_constraints, a.min_constraints, my_evaluator, population_size=a.population_size, max_evaluations=a.max_evaluations, num_selected=a.num_selected, num_offspring=a.num_offspring, num_elites=a.num_elites, mutation_rate=a.mutation_rate, seeds=None, verbose=a.verbose) start = time.time() #run the optimizer best_candidate, fitness = my_optimizer.optimize(do_plot=False, seed=a.seed, summary_dir=run_dir) secs = time.time() - start reportj = {} info = "Ran %s evaluations (pop: %s) in %f seconds (%f mins total; %fs per eval)\n\n" % ( a.max_evaluations, a.population_size, secs, secs / 60.0, (secs / a.max_evaluations)) report = "----------------------------------------------------\n\n" + info reportj['comment'] = info reportj['time'] = secs for key, value in zip(a.parameters, best_candidate): sim_var[key] = value best_candidate_t, best_candidate_v = my_controller.run_individual( sim_var, show=False, cleanup=False) best_candidate_analysis = analysis.NetworkAnalysis( best_candidate_v, best_candidate_t, analysis_var, start_analysis=a.analysis_start_time, end_analysis=a.sim_time) best_cand_analysis_full = best_candidate_analysis.analyse() best_cand_analysis = best_candidate_analysis.analyse(a.weights.keys()) report += "---------- Best candidate ------------------------------------------\n" report += pp.pformat(best_cand_analysis_full) + "\n\n" report += "TARGETS: \n" report += pp.pformat(a.target_data) + "\n\n" report += "TUNED VALUES:\n" report += pp.pformat(best_cand_analysis) + "\n\n" report += "FITNESS: %f\n\n" % fitness report += "FITTEST: %s\n\n" % pp.pformat(dict(sim_var)) pynml.print_comment_v(report) reportj['fitness'] = fitness reportj['fittest vars'] = dict(sim_var) reportj['best_cand_analysis_full'] = best_cand_analysis_full reportj['best_cand_analysis'] = best_cand_analysis reportj['parameters'] = a.parameters reportj['analysis_var'] = analysis_var reportj['target_data'] = a.target_data reportj['weights'] = a.weights reportj['analysis_start_time'] = a.analysis_start_time reportj['population_size'] = a.population_size reportj['max_evaluations'] = a.max_evaluations reportj['num_selected'] = a.num_selected reportj['num_offspring'] = a.num_offspring reportj['mutation_rate'] = a.mutation_rate reportj['num_elites'] = a.num_elites reportj['seed'] = a.seed reportj['simulator'] = a.simulator reportj['sim_time'] = a.sim_time reportj['dt'] = a.dt reportj['run_directory'] = run_dir reportj['reference'] = ref if a.extra_report_info: for key in a.extra_report_info: reportj[key] = a.extra_report_info[key] report_file = open("%s/report.json" % run_dir, 'w') report_file.write(pp.pformat(reportj)) report_file.close() plot_file = open("%s/plotgens.py" % run_dir, 'w') plot_file.write( 'from neurotune.utils import plot_generation_evolution\nimport os\n') plot_file.write('\n') plot_file.write('parameters = %s\n' % a.parameters) plot_file.write('\n') plot_file.write( "curr_dir = os.path.dirname(__file__) if len(os.path.dirname(__file__))>0 else '.'\n" ) plot_file.write( "plot_generation_evolution(parameters, individuals_file_name = '%s/ga_individuals.csv'%curr_dir)\n" ) plot_file.close() if not a.nogui: added = [] #print("Plotting saved data from %s which are relevant for targets: %s"%(best_candidate_v.keys(), a.target_data.keys())) fig = plt.figure() fig.canvas.set_window_title( "Simulation of fittest individual from run: %s" % ref) for tref in best_candidate_v.keys( ): ##################a.target_data.keys(): ref = tref.split(':')[0] if not ref in added: added.append(ref) #pynml.print_comment(" - Adding plot of: %s"%ref) plt.plot(best_candidate_t, best_candidate_v[ref], label="%s - %i evaluations" % (ref, a.max_evaluations)) plt.legend() #plt.ylim(-80.0,80.0) plt.xlim(0.0, a.sim_time) plt.title("Models %s" % a.prefix) plt.xlabel("Time (ms)") plt.ylabel("Membrane potential(mV)") utils.plot_generation_evolution( sim_var.keys(), individuals_file_name='%s/ga_individuals.csv' % run_dir, target_values=a.known_target_values, show_plot_already=a.show_plot_already, title_prefix=ref) if a.show_plot_already: plt.show() return reportj
def main(): """ The optimization runs in this main method """ show_plots = not (len(sys.argv) == 2 and sys.argv[1] == '-nogui') #make a controller my_controller= BasketCellController(show_plots) #parameters to be modified in each simulation parameters = ['axon_gbar_na', 'axon_gbar_kv', 'axon_gbar_kv3', 'soma_gbar_na', 'soma_gbar_kv', 'soma_gbar_kv3'] #above parameters will not be modified outside these bounds: min_constraints = [0,0,0,0,0,0] max_constraints = [10000,30,1,300,20,2] # EXAMPLE - how to set a seed #manual_vals=[50,50,2000,70,70,5,0.1,28.0,49.0,-73.0,23.0] #analysis variables, these default values will do: analysis_var={'peak_delta':0, 'baseline':0, 'dvdt_threshold':2} weights={'average_minimum': 1.0, 'spike_frequency_adaptation': 1.0, 'trough_phase_adaptation': 1.0, 'mean_spike_frequency': 1.0, 'average_maximum': 1.0, 'trough_decay_exponent': 1.0, 'interspike_time_covar': 1.0, 'min_peak_no': 1.0, 'spike_broadening': 1.0, 'spike_width_adaptation': 1.0, 'max_peak_no': 1.0, 'first_spike_time': 1.0, 'peak_decay_exponent': 1.0, 'pptd_error':1.0} #make an evaluator, using automatic target evaluation: my_evaluator=evaluators.IClampEvaluator(controller=my_controller, analysis_start_time=1, analysis_end_time=500, target_data_path='100pA_1a.csv', parameters=parameters, analysis_var=analysis_var, weights=weights, targets=None, # because we're using automatic automatic=True) #make an optimizer my_optimizer=optimizers.CustomOptimizerA(max_constraints,min_constraints,my_evaluator, population_size=3, max_evaluations=100, num_selected=3, num_offspring=3, num_elites=1, seeds=None) #run the optimizer my_optimizer.optimize(do_plot=show_plots)
# userData['samples'] = {'IClamp':IClamp,'IV':IV} myInitiator = initiators.Initiator(userData) sampleData = myInitiator.get_sample_params() bio_params = myInitiator.get_bio_params() # sim_params = myInitiator.get_sim_params(type='IClamp') sim_params = myInitiator.get_sim_params() myEvaluator = evaluators.Evaluator(sampleData,sim_params,bio_params) candidates = optimizers.CustomOptimizerA(bio_params['max_val_channel'], bio_params['min_val_channel'], myEvaluator, population_size=300, #20 times larger than free parameters max_evaluations=600, num_selected=2, num_offspring=15, num_elites=1, mutation_rate=0.05, maximize = False, seeds=None, verbose=True) best_candidate = candidates.optimize(do_plot=True, seed=1234) # best_candidate = [189.66504757196532, 0.04619592278775828, -0.0015715032129984834, 0.03232782689368996, # 0.0009038799935426481, -0.0006996189007248855, 0.0002076054785033701, 0.5361776032113692, # 2.0, 1.0, 2.9942088447494227e-07, 0.18712673917281542, -1.1396759086697654e-07, # 0.014145060464901655, 1.0] best_candidate_params = dict(zip(bio_params['channel_params'],best_candidate)) cell_var = dict(zip(bio_params['cell_params'],bio_params['val_cell_params'])) mySimulator = simulators.Simulator(sim_params,best_candidate_params,cell_var,bio_params['gate_params']) bestSim = dict()