void DifferentialEvolution::solve(RunManagerAbstract &run_manager, RestartController &restart_controller, int max_gen, double f, double cr, bool dither_f, ModelRun &cur_run) { ostream &os = file_manager.rec_ofstream(); ostream &fout_restart = file_manager.get_ofstream("rst"); for (int iter = 0; iter < max_gen && best_phi > std::numeric_limits<double>::min(); ++iter) { RestartController::write_start_iteration(fout_restart, solver_type_name, iter+1, iter+1); Parameters tmp_pars; Observations tmp_obs; // write header for iteration cout << endl; output_file_writer.iteration_report(cout, iter+1, run_manager.get_total_runs(), "differntial evolution"); os << endl; output_file_writer.iteration_report(os, iter + 1, run_manager.get_total_runs(), "differntial evolution"); // write initial phi report for this iteration bool run_target_ok = gen_1.get_run(best_run_idx, tmp_pars, tmp_obs); par_transform.model2ctl_ip(tmp_pars); map<string, double> phi_comps = obj_func_ptr->phi_report(tmp_obs, tmp_pars, DynamicRegularization::get_unit_reg_instance()); output_file_writer.phi_report(cout, iter, run_manager.get_nruns(), phi_comps, DynamicRegularization::get_unit_reg_instance().get_weight(), false); output_file_writer.phi_report(os, iter, run_manager.get_nruns(), phi_comps, DynamicRegularization::get_unit_reg_instance().get_weight(), false); run_manager.reinitialize(); mutation(run_manager, f, dither_f, cr); RestartController::write_upgrade_runs_built(fout_restart); // make trial vector model runs cout << endl; cout << " performing trial vector model runs... "; cout.flush(); run_manager.run(); os << endl; best_run_idx = recombination(run_manager); os << endl; run_target_ok = gen_1.get_run(best_run_idx, tmp_pars, tmp_obs); par_transform.model2ctl_ip(tmp_pars); // write parameter file for this iteration output_file_writer.write_par(file_manager.open_ofile_ext("par"), tmp_pars, *(par_transform.get_offset_ptr()), *(par_transform.get_scale_ptr())); file_manager.close_file("par"); // write final phi report for this iteration phi_comps = obj_func_ptr->phi_report(tmp_obs, tmp_pars, DynamicRegularization::get_unit_reg_instance()); output_file_writer.phi_report(cout, iter, run_manager.get_nruns(), phi_comps, DynamicRegularization::get_unit_reg_instance().get_weight(), true); cout << endl; output_file_writer.phi_report(os, iter, run_manager.get_nruns(), phi_comps, DynamicRegularization::get_unit_reg_instance().get_weight(), true); os << endl; } }