def run_fitting_schemes(model_types, number_of_generators, random_seeds, schemes, mean_data, cov_data, max_fun_eval=100000): all_models = def_all_models_dict(schemes, model_types, number_of_generators, random_seeds) overall_start_time = time.time() for (model_type, n_gen, seed, scheme) in [(model_type, n_gen, seed, scheme) for scheme in schemes for model_type in model_types for n_gen in number_of_generators for seed in random_seeds]: random.seed(seed) entry = def_empty_entry_dict() erp_model = ERP_Variability_Model_Fit(n_sub=23, n_gen=n_gen) parameter_list = prepare_variability_parameter_list(erp_model, model_type, n_gen) # If parameter_list is None that means the combination of model_type # and number of generators shouldn't be taken into account. if parameter_list is None: continue parameter_list.insert(0,'amplitudes') parameter_list.insert(0,'locations and orientations') erp_model.set_random_parameters(parameter_list) description = 'Fitting scheme: ' + scheme + ', model type: ' +\ model_type + ', with ' + str(n_gen) +\ ' generator(s) and seed ' + str(seed) print(description + '\n' + '=' * len(description)) entry['starting_error_mean'] = error_mean(mean_data, erp_model, [], []) / norm(mean_data, 2) entry['starting_error_covariance'] = error_cov(cov_data, erp_model, [], []) / norm(cov_data.reshape((erp_model.n_el**2,1)), 2) entry['starting_error_mean_and_covariance'] =\ error_mean_and_cov(mean_data, cov_data, erp_model, [], []) print('Starting error on mean: ' + str(entry['starting_error_mean'])) print('Starting error on covariance: ' +\ str(entry['starting_error_covariance'])) print('Starting error on mean and covariance combined: ' +\ str(entry['starting_error_mean_and_covariance']) + '\n') # Simplifying calling of fitting functions to make fitting scheme code # clearer and easier to read. fit_amplitudes_lambda = lambda erp_model, with_locations:\ fit_amplitudes(erp_model, n_gen, seed, mean_data, with_locations=with_locations, max_fun_eval=max_fun_eval) fit_variability_lambda = lambda erp_model, with_locations:\ fit_variability(erp_model, model_type, n_gen, seed, cov_data, with_locations=with_locations, max_fun_eval=max_fun_eval) if scheme == 'covariance and locations': entry['fits'].append(fit_variability_lambda(erp_model, True)) elif scheme == 'amplitudes, covariance and locations': entry['fits'].append(fit_amplitudes_and_variability(erp_model, model_type, n_gen, seed, mean_data, cov_data, with_locations=True, max_fun_eval=max_fun_eval)) if scheme == 'amplitudes and locations, then covariance': entry['fits'].append(fit_amplitudes_lambda(erp_model, True)) entry['fits'].append(fit_variability_lambda(erp_model, False)) if scheme == 'covariance and locations, then amplitudes': entry['fits'].append(fit_variability_lambda(erp_model, True)) entry['fits'].append(fit_amplitudes_lambda(erp_model, False)) if scheme == 'amplitudes and locations, then covariance and ' +\ 'locations, multiple times': n_repeats = 10 for i in range(n_repeats): entry['fits'].append(fit_amplitudes_lambda(erp_model, True)) entry['fits'].append(fit_variability_lambda(erp_model, True)) #if entry['fits'][-1] != None: entry['scheme'] = scheme entry['erp_model'] = erp_model all_models[scheme][model_type][n_gen][seed] = entry entry['final_error_mean'] = error_mean(mean_data, erp_model, [], [])\ / norm(mean_data, 2) entry['final_error_covariance'] = error_cov(cov_data, erp_model, [], []) / norm(cov_data.reshape((erp_model.n_el**2,1)), 2) entry['final_error_mean_and_covariance'] =\ error_mean_and_cov(mean_data, cov_data, erp_model, [], []) print('Final error on mean: ' + str(entry['final_error_mean'])) print('Final error on covariance: ' +\ str(entry['final_error_covariance'])) print('Final error on mean and covariance combined: ' +\ str(entry['final_error_mean_and_covariance']) + '\n') print('Overall time elapsed: ' + str(round(time.time() -\ overall_start_time,2))) return all_models