/** * DESCRIPTION OF THE FILE * * @author Michal KravĨenko * @date 29.09.19 - */ #include <random.hpp> #include <limits> #include "message.h" #include "MultiGridLearning.h" namespace lib4neuro { MultiGridLearning::MultiGridLearning( LearningMethod &inner_trainer, double tol, double res ){ this->inner_method = &inner_trainer; this->learning_tolerance = tol; this->resolution_coeff = res; } MultiGridLearning::~MultiGridLearning( ) {} void MultiGridLearning::optimize( lib4neuro::ErrorFunction& ef, std::ofstream* ofs ) { DataSet *ds_orig = ef.get_dataset(); double res = this->resolution_coeff; double multi_grid_coeff = this->resolution_coeff; std::vector<DataSet*> data_set_hierarchies; data_set_hierarchies.push_back( ds_orig ); DataSet *new_data_set = ds_orig->get_approximated_set( 1e-12, 0 ); data_set_hierarchies.push_back( new_data_set ); size_t nref = new_data_set->get_n_elements(); while(new_data_set->get_n_elements() >= nref){ res += multi_grid_coeff; multi_grid_coeff *= 0.95; new_data_set = new_data_set->get_approximated_set( res, 0 ); data_set_hierarchies.push_back( new_data_set ); } for( size_t i = data_set_hierarchies.size() - 1; i > 0; --i ){ ef.set_dataset( data_set_hierarchies[ i ] ); // while( true ){ this->inner_method->optimize( ef, ofs ); // if( ef.eval() < this->learning_tolerance ){ // break; // } // } delete data_set_hierarchies[ i ]; COUT_INFO("--------------------------------------------"); } // std::vector<double> output(1); // for(auto e : *ds_orig->get_data()) { // std::cout << "{"; // for( size_t j = 0; j < e.first.size(); ++j ){ // std::cout << e.first[ j ] << " "; // } // std::cout << "} -> {"; // // std::cout << e.second.at(0) << " "; // ef.get_nets()[0]->eval_single(e.first, output); // std::cout << output.at(0) << "}" << std::endl; // } // // for(auto e : *ef.get_dataset()->get_data()) { // std::cout << "{"; // for( size_t j = 0; j < e.first.size(); ++j ){ // std::cout << e.first[ j ] << " "; // } // std::cout << "} -> {"; // // std::cout << e.second.at(0) << " "; // ef.get_nets()[0]->eval_single(e.first, output); // std::cout << output.at(0) << "}" << std::endl; // } ef.set_dataset( ds_orig ); this->inner_method->optimize( ef, ofs ); } }//end of namespace lib4neuro