Example #1
0
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;
	}
}