diff --git a/src/descriptor_identifier/Model/Model.cpp b/src/descriptor_identifier/Model/Model.cpp index 3a3e09ae0ffdbda55898a9a5a344445b1f296cd8..95cbb4553269439918250a87cd8d5c634d619442 100644 --- a/src/descriptor_identifier/Model/Model.cpp +++ b/src/descriptor_identifier/Model/Model.cpp @@ -22,11 +22,12 @@ Model::Model(std::vector<double> prop_train, std::vector<double> prop_test, std: for(int ff = 0; ff < feats.size(); ++ff) { std::copy_n(feats[ff]->value_ptr(), _n_samp_train, _D_train.data() + ff * _n_samp_train); - std::copy_n(feats[ff]->test_value_ptr(), _n_samp_test, _D_test.data() + ff * _n_samp_test); std::copy_n(feats[ff]->value_ptr(), _n_samp_train, a.data() + ff * _n_samp_train); + + if(_n_samp_test > 0) + std::copy_n(feats[ff]->test_value_ptr(), _n_samp_test, _D_test.data() + ff * _n_samp_test); } std::copy_n(a.data() + feats.size() * _n_samp_train, _n_samp_train, _D_train.data() + feats.size() * _n_samp_train); - std::copy_n(a.data() + feats.size() * _n_samp_train, _n_samp_test, _D_test.data() + feats.size() * _n_samp_test); std::vector<double> s(_n_dim, 0.0); std::vector<double> work(_n_dim * _n_samp_train, 0.0); @@ -37,10 +38,14 @@ Model::Model(std::vector<double> prop_train, std::vector<double> prop_test, std: std::copy_n(prop_train.begin(), _n_dim, _coefs.data()); dgemv_('N', _n_samp_train, _n_dim, 1.0, _D_train.data(), _n_samp_train, _coefs.data(), 1, 0.0, _prop_train_est.data(), 1); - dgemv_('N', _n_samp_test, _n_dim, 1.0, _D_test.data(), _n_samp_test, _coefs.data(), 1, 0.0, _prop_test_est.data(), 1); - std::transform(_prop_train_est.begin(), _prop_train_est.end(), _prop_train.data(), _train_error.data(), std::minus<double>()); - std::transform(_prop_test_est.begin(), _prop_test_est.end(), _prop_test.data(), _test_error.data(), std::minus<double>()); + if(_n_samp_test > 0) + { + std::copy_n(std::vector<double>(_n_samp_test, 1.0).data(), _n_samp_test, _D_test.data() + feats.size() * _n_samp_test); + dgemv_('N', _n_samp_test, _n_dim, 1.0, _D_test.data(), _n_samp_test, _coefs.data(), 1, 0.0, _prop_test_est.data(), 1); + std::transform(_prop_test_est.begin(), _prop_test_est.end(), _prop_test.data(), _test_error.data(), std::minus<double>()); + } + } std::string Model::toString() const @@ -67,7 +72,7 @@ void Model::train_to_file(std::string filename) out_file_stream.open(filename); out_file_stream << "# " << toString() << std::endl; - out_file_stream << "# RMSE: " << rmse() << "; Max AE( " << max_ae() << std::endl; + out_file_stream << "# RMSE: " << rmse() << "; Max AE: " << max_ae() << std::endl; out_file_stream << "# coeffs:"; for(auto& coef: _coefs) out_file_stream << " " << std::setw(24) << std::setprecision(18) << coef << ";"; @@ -86,7 +91,7 @@ void Model::train_to_file(std::string filename) out_file_stream.close(); } -void Model::test_to_file(std::string filename) +void Model::test_to_file(std::string filename, std::vector<int> test_inds) { boost::filesystem::path p(filename.c_str()); boost::filesystem::create_directories(p.remove_filename()); @@ -95,6 +100,10 @@ void Model::test_to_file(std::string filename) out_file_stream.open(filename); out_file_stream << "# " << toString() << std::endl; + out_file_stream << "# Testing Indexes: [" << test_inds[0]; + for(int ss = 1; ss < _n_samp_test; ++ss) + out_file_stream << ", " << test_inds[ss]; + out_file_stream << "]" << std::endl; out_file_stream << "# RMSE: " << test_rmse() << "; Max AE: " << test_max_ae() << std::endl; out_file_stream << "# coeffs:"; for(auto& coef: _coefs) @@ -107,8 +116,8 @@ void Model::test_to_file(std::string filename) for(int ss = 0; ss < _n_samp_test; ++ss) { out_file_stream << std::setw(24) << std::setprecision(18) << _prop_test[ss] << std::setw(24) << std::setprecision(18) << _prop_test_est[ss]; - for(int ff = 0; ff < _n_dim - 1; ++ff) - out_file_stream << std::setw(24) << std::setprecision(18) << _D_test[ss + ff * _n_samp_train]; + for(int ff = 0; ff < _feats.size(); ++ff) + out_file_stream << std::setw(24) << std::setprecision(18) << _feats[ff]->test_value()[ss]; out_file_stream << std::endl; } out_file_stream.close(); diff --git a/src/descriptor_identifier/Model/Model.hpp b/src/descriptor_identifier/Model/Model.hpp index 208664ade828964253a02837c3c764f5c1aa0d96..574a8abbb16adeeca39203367c6fd86be11c973f 100644 --- a/src/descriptor_identifier/Model/Model.hpp +++ b/src/descriptor_identifier/Model/Model.hpp @@ -77,19 +77,19 @@ public: */ inline double max_ae() { - return *std::max_element(_train_error.data(), _train_error.data() + _n_samp_train, [](double d1, double d2){return std::abs(d1) < std::abs(d2);}); + return std::abs(*std::max_element(_train_error.data(), _train_error.data() + _n_samp_train, [](double d1, double d2){return std::abs(d1) < std::abs(d2);})); } inline double test_max_ae() { - return *std::max_element(_test_error.data(), _test_error.data() + _n_samp_test, [](double d1, double d2){return std::abs(d1) < std::abs(d2);}); + return std::abs(*std::max_element(_test_error.data(), _test_error.data() + _n_samp_test, [](double d1, double d2){return std::abs(d1) < std::abs(d2);})); } /** * @brief Print model to a file */ - void test_to_file(std::string filename); + void test_to_file(std::string filename, std::vector<int> test_inds); /** * @brief Print model to a file diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.cpp index b4761ebeb08aa15ba57806183ac502eb3ece8473..df28a9e1323bba4c8a871cbed338d44dd6978074 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.cpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.cpp @@ -13,9 +13,10 @@ NegExpNode::NegExpNode(std::vector<node_ptr> feats, int rung, int feat_ind): throw InvalidFeatureException(); set_value(); - if(is_nan() || is_const()) throw InvalidFeatureException(); + + set_test_value(); } NegExpNode::NegExpNode(node_ptr feat, int rung, int feat_ind): @@ -28,9 +29,10 @@ NegExpNode::NegExpNode(node_ptr feat, int rung, int feat_ind): throw InvalidFeatureException(); set_value(); - if(is_nan() || is_const()) throw InvalidFeatureException(); + + set_test_value(); } void NegExpNode::update_add_sub_leaves(std::map<std::string, int>& add_sub_leaves, int pl_mn, int& expected_abs_tot) diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.cpp index 3ab1f7e5571dacf1361ad0d172a93c395949a6ab..3aedd0737f4551f9f106fc5721045e937344cfdc 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.cpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.cpp @@ -16,7 +16,7 @@ SinNode::SinNode(std::vector<node_ptr> feats, int rung, int feat_ind): if(is_nan() || is_const()) throw InvalidFeatureException(); - set_test_value(); + set_test_value(); } SinNode::SinNode(node_ptr feat, int rung, int feat_ind): @@ -32,7 +32,7 @@ SinNode::SinNode(node_ptr feat, int rung, int feat_ind): if(is_nan() || is_const()) throw InvalidFeatureException(); - set_test_value(); + set_test_value(); } void SinNode::update_add_sub_leaves(std::map<std::string, int>& add_sub_leaves, int pl_mn, int& expected_abs_tot) diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.hpp index 2c946896b612fa62ba92fc4bbaa3eee425cb1621..8883fe3e55e768d6821b63581745fb6f4b184a1d 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.hpp @@ -33,7 +33,7 @@ public: inline void set_test_value(int offset = -1) { offset = (offset == -1) ? rung() : offset; - allowed_op_funcs::mult(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), _feats[1]->test_value_ptr(offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, offset)); + allowed_op_funcs::sub(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), _feats[1]->test_value_ptr(offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, offset)); } /** diff --git a/src/inputs/InputParser.cpp b/src/inputs/InputParser.cpp index f362c51a233d267e407a1cf36fe2b8b9f052ed34..d2ce52ef6562748630c0c032b31d6bfda7151828 100644 --- a/src/inputs/InputParser.cpp +++ b/src/inputs/InputParser.cpp @@ -31,6 +31,7 @@ InputParser::InputParser(boost::property_tree::ptree IP, std::string fn, std::sh std::shuffle (indexes.begin(), indexes.end(), std::default_random_engine(seed)); std::copy_n(indexes.begin(), _n_leave_out, _leave_out_inds.begin()); + std::sort(_leave_out_inds.begin(), _leave_out_inds.end()); } else if((_n_leave_out == 0) && (_leave_out_inds.size() > 0)) _n_leave_out = _leave_out_inds.size(); diff --git a/src/main.cpp b/src/main.cpp index 7d51ce4f415ee2eb33a503b6de8689c535724d51..a23cff94396521dfb48fd79cd555b43ba23b89bb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -44,12 +44,17 @@ int main(int argc, char const *argv[]) { for(int ii = 0; ii < sisso.models().size(); ++ii) { - std::cout << sisso.models()[ii][0].rmse() << std::endl; + std::cout << "Train RMSE: " << sisso.models()[ii][0].rmse(); + if(IP._prop_test.size() > 0) + std::cout << "; Test RMSE: " << sisso.models()[ii][0].test_rmse() << std::endl; + else + std::cout << std::endl; std::cout << sisso.models()[ii][0] << "\n" << std::endl; for(int jj = 0; jj < sisso.models()[ii].size(); ++jj) { sisso.models()[ii][jj].train_to_file("models/train_dim_" + std::to_string(ii) + "_model_" + std::to_string(jj) + ".dat"); - sisso.models()[ii][jj].test_to_file("models/test_dim_" + std::to_string(ii) + "_model_" + std::to_string(jj) + ".dat"); + if(IP._prop_test.size() > 0) + sisso.models()[ii][jj].test_to_file("models/test_dim_" + std::to_string(ii) + "_model_" + std::to_string(jj) + ".dat", IP._leave_out_inds); } } }