예제 #1
0
    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)
예제 #3
0
                                            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)
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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)
예제 #7
0
    # 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()