diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/parameterized_absolute_value.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/parameterized_absolute_value.cpp index f08bc7abe7d1dbe2d20f22374ed87e60e7f97157..376253117cb85cb4d959b66d1baa5779c49dcff3 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/parameterized_absolute_value.cpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/parameterized_absolute_value.cpp @@ -6,7 +6,7 @@ void generateAbsParamNode(std::vector<node_ptr>& feat_list, node_ptr feat, int& node_ptr new_feat = std::make_shared<AbsParamNode>(feat, feat_ind, prop); new_feat->set_value(); - if(new_feat->is_nan() || new_feat->is_const() || (*std::min_element(new_feat->value_ptr(), new_feat->value_ptr() + new_feat->n_samp()) > 0) || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) > u_bound) || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) < l_bound)) + if(new_feat->is_nan() || new_feat->is_const() || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) > u_bound) || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) < l_bound)) return; feat_list.push_back(new_feat); @@ -21,7 +21,7 @@ AbsParamNode::AbsParamNode(node_ptr feat, int feat_ind, double l_bound, double u _params.resize(n_params(), 0.0); get_parameters(prop); - if(is_nan() || is_const() || (*std::min_element(value_ptr(), value_ptr() + n_samp()) > 0) || (util_funcs::max_abs_val<double>(value_ptr(), _n_samp) > u_bound) || (util_funcs::max_abs_val<double>(value_ptr(), _n_samp) < l_bound)) + if(is_nan() || is_const() || (util_funcs::max_abs_val<double>(value_ptr(), _n_samp) > u_bound) || (util_funcs::max_abs_val<double>(value_ptr(), _n_samp) < l_bound)) throw InvalidFeatureException(); } diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/parameterized_absolute_value.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/parameterized_absolute_value.hpp index 685cf68010f32adf91e4131c78adb78a99d91e82..dda13a1c8ffa1421ca69161fbd2ccf804990a0df 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/parameterized_absolute_value.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/parameterized_absolute_value.hpp @@ -172,9 +172,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/parameterized_absolute_difference.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/parameterized_absolute_difference.cpp index 76e9a0f23254527d2faef104fc0799efc5a4d34c..f10c7cf533a8409293cbac9724607e2013811546 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/parameterized_absolute_difference.cpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/parameterized_absolute_difference.cpp @@ -6,7 +6,7 @@ void generateAbsDiffParamNode(std::vector<node_ptr>& feat_list, node_ptr feat_1, node_ptr new_feat = std::make_shared<AbsDiffParamNode>(feat_1, feat_2, feat_ind, prop); new_feat->set_value(); - if(new_feat->is_nan() || new_feat->is_const() || (*std::min_element(new_feat->value_ptr(), new_feat->value_ptr() + new_feat->n_samp()) > 0) || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) > u_bound) || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) < l_bound)) + if(new_feat->is_nan() || new_feat->is_const() || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) > u_bound) || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) < l_bound)) return; feat_list.push_back(new_feat); @@ -21,7 +21,7 @@ AbsDiffParamNode::AbsDiffParamNode(node_ptr feat_1, node_ptr feat_2, int feat_in _params.resize(n_params(), 0.0); get_parameters(prop); - if(is_nan() || is_const() || (*std::min_element(value_ptr(), value_ptr() + n_samp()) > 0) || (util_funcs::max_abs_val<double>(value_ptr(), _n_samp) > u_bound) || (util_funcs::max_abs_val<double>(value_ptr(), _n_samp) < l_bound)) + if(is_nan() || is_const()|| (util_funcs::max_abs_val<double>(value_ptr(), _n_samp) > u_bound) || (util_funcs::max_abs_val<double>(value_ptr(), _n_samp) < l_bound)) throw InvalidFeatureException(); } diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/parameterized_absolute_difference.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/parameterized_absolute_difference.hpp index ad68673d08d3d73a6e5ae2e62890bc6e176cb7df..ba2382094fa34a5a8e0f430e3775ae04cd6aeab8 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/parameterized_absolute_difference.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/parameterized_absolute_difference.hpp @@ -172,9 +172,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[1]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/parameterized_add.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/parameterized_add.cpp index 70d62de21677f9c64e939c93d00b023b0be6f0c1..f4156fec649a1bb014e622d9fe8b82319c5d38eb 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/parameterized_add.cpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/parameterized_add.cpp @@ -6,6 +6,7 @@ void generateAddParamNode(std::vector<node_ptr>& feat_list, node_ptr feat_1, nod node_ptr new_feat = std::make_shared<AddParamNode>(feat_1, feat_2, feat_ind, prop); new_feat->set_value(); + if(new_feat->is_nan() || new_feat->is_const() || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) > u_bound) || (util_funcs::max_abs_val<double>(new_feat->value_ptr(), new_feat->n_samp()) < l_bound)) return; diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/parameterized_add.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/parameterized_add.hpp index 67509116156e9a4c488d0b5228f02773ca013400..aaa0a5a55272e3473e4743ff0df403f6f303ac88 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/parameterized_add.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/parameterized_add.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[1]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/parameterized_cube.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/parameterized_cube.hpp index 7acb52949855f968f2661f57c1589a328565e49d..8ac3b85d167bd5646163d636ed08052548bb1bef 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/parameterized_cube.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/parameterized_cube.hpp @@ -172,9 +172,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/parameterized_cube_root.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/parameterized_cube_root.hpp index 842177c94a56225ebb2c3dbb6290e57274c405c1..93672e7bab6b2d5158e990f20bdb9df0a1197ca5 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/parameterized_cube_root.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/parameterized_cube_root.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.cpp index a6c66709e2602337c2b6d1cdb8334d931a917291..951fdaf2216ad76047662b5fc8a749da2f50207e 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.cpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.cpp @@ -72,10 +72,10 @@ void CosParamNode::get_parameters(std::vector<double>& prop) try { - nlopt::result result = opt.optimize(_params, minf); - result = opt_global.optimize(_params, minf); + // nlopt::result result = opt.optimize(_params, minf); + // result = opt_global.optimize(_params, minf); opt.set_xtol_rel(1e-6); - result = opt.optimize(_params, minf); + nlopt::result result = opt.optimize(_params, minf); } catch(std::exception &e) { diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.hpp index a30d640d228d1229be013d596063da0be78800b0..9dc37289bbae829e3b1a4a73b32254bb0c598ee1 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.hpp @@ -172,9 +172,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/parameterized_divide.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/parameterized_divide.hpp index f9e854b6a239531500409a7f54015bcf1139f21f..344341e0361cfa3c54f51e1c5ecc9305aeb6b1be 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/parameterized_divide.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/parameterized_divide.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[1]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/parameterized_exponential.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/parameterized_exponential.hpp index c78c5a3a594d94713642f87a423220acacd44879..313ee288e1c689779563e9b1e00277b4832a8d2f 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/parameterized_exponential.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/parameterized_exponential.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/parameterized_inverse.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/parameterized_inverse.hpp index 5c4ab6ed918aba884caf1cb32c9ef47f75b8903a..0510c669ab6b099d9c53ba9de231f0ad23bf7ae0 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/parameterized_inverse.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/parameterized_inverse.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/parameterized_log.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/parameterized_log.hpp index af187b4f78ca4d92778f221e3b623d2d05b4dd88..80d5aafe0d4b2d34752f6618daa37f3bca758281 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/parameterized_log.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/parameterized_log.hpp @@ -172,9 +172,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/parameterized_multiply.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/parameterized_multiply.hpp index 2de8040d870a02f17361c422df90cd2ff8b5617b..9732009ca28addac6bef70dc6f8123f324540c13 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/parameterized_multiply.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/parameterized_multiply.hpp @@ -169,9 +169,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[1]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/parameterized_negative_exponential.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/parameterized_negative_exponential.hpp index 3eade9a1c0a56a9243dd794903c4dee1b4464088..58699cc6ac23d8917dff185ae553153d713873fb 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/parameterized_negative_exponential.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/parameterized_negative_exponential.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.cpp index 915228540ef282d0b3f1bd9ea22f4db105c6ec2e..c04257d7f8733e1a92d1f819513df2bd5422cd9b 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.cpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.cpp @@ -72,10 +72,10 @@ void SinParamNode::get_parameters(std::vector<double>& prop) try { - nlopt::result result = opt.optimize(_params, minf); - result = opt_global.optimize(_params, minf); + // nlopt::result result = opt.optimize(_params, minf); + // result = opt_global.optimize(_params, minf); opt.set_xtol_rel(1e-6); - result = opt.optimize(_params, minf); + nlopt::result result = opt.optimize(_params, minf); } catch(std::exception &e) { diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.hpp index 0592e64ec27bb461641b06ef54f85c43b93497a0..2cccc6b3b053c88f8097e50342970ef4ca3b13fa 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/six_pow/parameterized_sixth_power.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/six_pow/parameterized_sixth_power.hpp index 99db7b3cb86f543a53977f59b2478b65a79d34df..c42fbb52b8d91cb5932b793b318555a103a91b70 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/six_pow/parameterized_sixth_power.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/six_pow/parameterized_sixth_power.hpp @@ -172,9 +172,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/parameterized_square.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/parameterized_square.hpp index bdbeb2e345f5cbc4d1a1bbefb0c34dbfbbae40b4..d924d39395c991196e55b9a0f2f8df24a3f42e44 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/parameterized_square.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/parameterized_square.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/parameterized_square_root.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/parameterized_square_root.hpp index ad5a8e024f959733adccb80e0f5d3b3812288eb4..5bf034b0ae550f8153358b4d7e7074d7c75bdb4c 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/parameterized_square_root.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/parameterized_square_root.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[0]->update_postfix(cur_expr, false); diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/parameterized_subtract.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/parameterized_subtract.hpp index 4bc7b1ceca27e3c7c304a576d07422c36b34e0fe..657f99217d0a51b5b897da3d6f081c1d7d737f31 100644 --- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/parameterized_subtract.hpp +++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/parameterized_subtract.hpp @@ -171,9 +171,9 @@ public: postfix << get_postfix_term(); if(add_params) { - postfix << ":" << std::to_string(_params[0]); + postfix << ":" << _params[0]; for(int pp = 1; pp < _params.size(); ++pp) - postfix << "," << std::to_string(_params[pp]); + postfix << "," << _params[pp]; } cur_expr = postfix.str() + "|" + cur_expr; _feats[1]->update_postfix(cur_expr, false); diff --git a/tests/googletest/feature_creation/parameterization/test_abs_diff_node.cc b/tests/googletest/feature_creation/parameterization/test_abs_diff_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..f95bfa358c0ba9afaa27da199502b91965c38811 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_abs_diff_node.cc @@ -0,0 +1,145 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/parameterized_absolute_difference.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class AbsDiffParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(-2.50, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = distribution_feats(generator); + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = distribution_feats(generator); + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("[-50.0, 50.0]"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("[-50.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + + allowed_op_funcs::abs_diff(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _abs_diff_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(AbsDiffParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateAbsDiffParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (AbsDiffParamNode created with an absolute value above the upper bound)"; + + generateAbsDiffParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (AbsDiffParamNode created with an absolute value below the lower bound)"; + + generateAbsDiffParamNode(_phi, _phi[0], _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (AbsDiffParamNode created with only one primary feature present)"; + + generateAbsDiffParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(AbsDiffParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _abs_diff_test = std::make_shared<AbsDiffParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (AbsDiffParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _abs_diff_test = std::make_shared<AbsDiffParamNode>(_phi[0], _phi[1], feat_ind, 1e3, 1e50, _prop); + EXPECT_TRUE(false) << " (AbsDiffParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _abs_diff_test = std::make_shared<AbsDiffParamNode>(_phi[0], _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_TRUE(false) << " (AbsDiffParamNode created with only one primary feature present)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _abs_diff_test = std::make_shared<AbsDiffParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _abs_diff_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(AbsDiffParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _abs_diff_test = std::make_shared<AbsDiffParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_abs_diff_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::abs_diff(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _abs_diff_test->parameters()[0], _abs_diff_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_abs_diff_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_abs_diff_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::abs_diff(10, _phi[0]->test_value_ptr(), _phi[1]->test_value_ptr(), _abs_diff_test->parameters()[0], _abs_diff_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_abs_diff_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_abs_diff_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "0|1|abd:" <<_abs_diff_test->parameters()[0] << ',' << _abs_diff_test->parameters()[1]; + EXPECT_STREQ(_abs_diff_test->unit().toString().c_str(), "m"); + EXPECT_STREQ(_abs_diff_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_abs_node.cc b/tests/googletest/feature_creation/parameterization/test_abs_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..d1d4c1b975118df12ef51cee67c3948fef6168a7 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_abs_node.cc @@ -0,0 +1,123 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/abs/parameterized_absolute_value.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class AbsParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(-2.50, 2.50); + + for(int ii = 0; ii < 90; ++ii) + value_1[ii] = distribution_feats(generator); + + for(int ii = 0; ii < 10; ++ii) + test_value_1[ii] = distribution_feats(generator); + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("[-50.0, 50.0]"), Unit("m")); + _phi = {_feat_1}; + + _a = distribution_params(generator); + _alpha = distribution_params(generator); + + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::abs(90, _phi[0]->value_ptr(), _alpha, _a, _prop.data()); + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _abs_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(AbsParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateAbsParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 1) << " (AbsParamNode created with an absolute value above the upper bound)"; + + generateAbsParamNode(_phi, _phi[0], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 1) << " (AbsParamNode created with an absolute value below the lower bound)"; + + generateAbsParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(AbsParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _abs_test = std::make_shared<AbsParamNode>(_phi[0], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (AbsParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _abs_test = std::make_shared<AbsParamNode>(_phi[0], feat_ind, 1e40, 1e50, _prop); + EXPECT_TRUE(false) << " (AbsParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _abs_test = std::make_shared<AbsParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _abs_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(AbsParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _abs_test = std::make_shared<AbsParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_abs_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::abs(90, _phi[0]->value_ptr(), _abs_test->parameters()[0], _abs_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_abs_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_abs_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::abs(10, _phi[0]->test_value_ptr(), _abs_test->parameters()[0], _abs_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_abs_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_abs_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "0|abs:" <<_abs_test->parameters()[0] << ',' << _abs_test->parameters()[1]; + EXPECT_STREQ(_abs_test->unit().toString().c_str(), "m"); + EXPECT_STREQ(_abs_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_add_node.cc b/tests/googletest/feature_creation/parameterization/test_add_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..b7621c73a4b85840a25859d17a5ffaae59bd9547 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_add_node.cc @@ -0,0 +1,133 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/add/parameterized_add.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class AddParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(-2.50, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = distribution_feats(generator); + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = distribution_feats(generator); + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("[-50.0, 50.0]"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("[-50.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::add(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _add_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(AddParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateAddParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (AddParamNode created with an absolute value above the upper bound)"; + + generateAddParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (AddParamNode created with an absolute value below the lower bound)"; + + generateAddParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(AddParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _add_test = std::make_shared<AddParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (AddParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _add_test = std::make_shared<AddParamNode>(_phi[0], _phi[1], feat_ind, 1e3, 1e50, _prop); + EXPECT_TRUE(false) << " (AddParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _add_test = std::make_shared<AddParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _add_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(AddParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _add_test = std::make_shared<AddParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_add_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::add(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _add_test->parameters()[0], _add_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_add_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_add_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::add(10, _phi[0]->test_value_ptr(), _phi[1]->test_value_ptr(), _add_test->parameters()[0], _add_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_add_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_add_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "0|1|add:" <<_add_test->parameters()[0] << ',' << _add_test->parameters()[1]; + EXPECT_STREQ(_add_test->unit().toString().c_str(), "m"); + EXPECT_STREQ(_add_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_cb_node.cc b/tests/googletest/feature_creation/parameterization/test_cb_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..e4a10836256d511f1428883035a4505e5d5513ce --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_cb_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/cb/parameterized_cube.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class CbParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::cb(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _exp_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(CbParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateCbParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (CbParamNode created with an absolute value above the upper bound)"; + + generateCbParamNode(_phi, _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (CbParamNode created with an absolute value below the lower bound)"; + + // generateCbParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_EQ(_phi.size(), 2) << " (CbParamNode created with a negative valued feature in the denominator)"; + + generateCbParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(CbParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _exp_test = std::make_shared<CbParamNode>(_phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (CbParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _exp_test = std::make_shared<CbParamNode>(_phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (CbParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + // try + // { + // _exp_test = std::make_shared<CbParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_TRUE(false) << " (CbParamNode created with a negative valued feature in the denominator)"; + // } + // catch(const InvalidFeatureException& e) + // {} + + try + { + _exp_test = std::make_shared<CbParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _exp_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(CbParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _exp_test = std::make_shared<CbParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_exp_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::cb(90, _phi[1]->value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::cb(10, _phi[1]->test_value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|cb:" <<_exp_test->parameters()[0] << ',' << _exp_test->parameters()[1]; + EXPECT_STREQ(_exp_test->unit().toString().c_str(), "s^3"); + EXPECT_STREQ(_exp_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc b/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..eb154638e1b4cf5bd08fa2bf270bc852246e8369 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/parameterized_cube_root.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class CbrtParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::cbrt(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _cbrt_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(CbrtParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateCbrtParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (CbrtParamNode created with an absolute value above the upper bound)"; + + generateCbrtParamNode(_phi, _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (CbrtParamNode created with an absolute value below the lower bound)"; + + generateCbrtParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (CbrtParamNode created with a negative valued feature in the denominator)"; + + generateCbrtParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(CbrtParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _cbrt_test = std::make_shared<CbrtParamNode>(_phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (CbrtParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _cbrt_test = std::make_shared<CbrtParamNode>(_phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (CbrtParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _cbrt_test = std::make_shared<CbrtParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_TRUE(false) << " (CbrtParamNode created with a negative valued feature in the denominator)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _cbrt_test = std::make_shared<CbrtParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _cbrt_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(CbrtParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _cbrt_test = std::make_shared<CbrtParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_cbrt_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::cbrt(90, _phi[1]->value_ptr(), _cbrt_test->parameters()[0], _cbrt_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_cbrt_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_cbrt_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::cbrt(10, _phi[1]->test_value_ptr(), _cbrt_test->parameters()[0], _cbrt_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_cbrt_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_cbrt_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|cbrt:" <<_cbrt_test->parameters()[0] << ',' << _cbrt_test->parameters()[1]; + EXPECT_STREQ(_cbrt_test->unit().toString().c_str(), "s^0.333333"); + EXPECT_STREQ(_cbrt_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_cos_node.cc b/tests/googletest/feature_creation/parameterization/test_cos_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..71b53f487bdcdfd95b32568f931623360f692171 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_cos_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.hpp> +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class CosParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(900, 10, 3); + + _task_sizes_train = {900}; + + std::vector<double> value_1(900, 0.0); + std::vector<double> value_2(900, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-6.23, 6.23); + + for(int ii = 0; ii < 900; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = distribution_feats(generator); + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = distribution_feats(generator); + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-6.23, 6.23)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(-6.23, 6.23)"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = 0.143; + _alpha = 1.05; + _prop = std::vector<double>(900, 0.0); + allowed_op_funcs::cos(900, _phi[0]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _cos_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(CosParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateCosParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (CosParamNode created with an absolute value above the upper bound)"; + + generateCosParamNode(_phi, _phi[0], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (CosParamNode created with an absolute value below the lower bound)"; + + // generateCosParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_EQ(_phi.size(), 2) << " (CosParamNode created with a negative valued feature in the denominator)"; + + generateCosParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-5); + } + + TEST_F(CosParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _cos_test = std::make_shared<CosParamNode>(_phi[0], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (CosParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _cos_test = std::make_shared<CosParamNode>(_phi[0], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (CosParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + // try + // { + // _cos_test = std::make_shared<CosParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_TRUE(false) << " (CosParamNode created with a negative valued feature in the denominator)"; + // } + // catch(const InvalidFeatureException& e) + // {} + + try + { + _cos_test = std::make_shared<CosParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _cos_test->value_ptr(), 90), 1e-5); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(CosParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _cos_test = std::make_shared<CosParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_cos_test->rung(), 1); + + std::vector<double> expected_val(900, 0.0); + + allowed_op_funcs::cos(900, _phi[1]->value_ptr(), _cos_test->parameters()[0], _cos_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_cos_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_cos_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::cos(10, _phi[1]->test_value_ptr(), _cos_test->parameters()[0], _cos_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_cos_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_cos_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|cos:" <<_cos_test->parameters()[0] << ',' << _cos_test->parameters()[1]; + EXPECT_STREQ(_cos_test->unit().toString().c_str(), "Unitless"); + EXPECT_STREQ(_cos_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_div_node.cc b/tests/googletest/feature_creation/parameterization/test_div_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..a7e0b26b20d4385e224c0bf293679fcb59d906a6 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_div_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/div/parameterized_divide.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class DivParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::div(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _div_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(DivParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateDivParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (DivParamNode created with an absolute value above the upper bound)"; + + generateDivParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (DivParamNode created with an absolute value below the lower bound)"; + + generateDivParamNode(_phi, _phi[1], _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (DivParamNode created with a zero valued feature in the denominator)"; + + generateDivParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(DivParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _div_test = std::make_shared<DivParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (DivParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _div_test = std::make_shared<DivParamNode>(_phi[0], _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (DivParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _div_test = std::make_shared<DivParamNode>(_phi[1], _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_TRUE(false) << " (DivParamNode created with a zero valued feature in the denominator)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _div_test = std::make_shared<DivParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _div_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(DivParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _div_test = std::make_shared<DivParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_div_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::div(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _div_test->parameters()[0], _div_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_div_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_div_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::div(10, _phi[0]->test_value_ptr(), _phi[1]->test_value_ptr(), _div_test->parameters()[0], _div_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_div_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_div_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "0|1|div:" <<_div_test->parameters()[0] << ',' << _div_test->parameters()[1]; + EXPECT_STREQ(_div_test->unit().toString().c_str(), "m * s^-1"); + EXPECT_STREQ(_div_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_exp_node.cc b/tests/googletest/feature_creation/parameterization/test_exp_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..57c316921693b0b1c0d244d8fe4b25e884180d82 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_exp_node.cc @@ -0,0 +1,146 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/exp/parameterized_exponential.hpp> +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/log/parameterized_log.hpp> +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/parameterized_negative_exponential.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class ExpParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::exp(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _exp_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(ExpParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateExpParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (ExpParamNode created with an absolute value above the upper bound)"; + + generateExpParamNode(_phi, _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (ExpParamNode created with an absolute value below the lower bound)"; + + // generateExpParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_EQ(_phi.size(), 2) << " (ExpParamNode created with a negative valued feature in the denominator)"; + + generateExpParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(ExpParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _exp_test = std::make_shared<ExpParamNode>(_phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (ExpParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _exp_test = std::make_shared<ExpParamNode>(_phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (ExpParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + // try + // { + // _exp_test = std::make_shared<ExpParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_TRUE(false) << " (ExpParamNode created with a negative valued feature in the denominator)"; + // } + // catch(const InvalidFeatureException& e) + // {} + + try + { + _exp_test = std::make_shared<ExpParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _exp_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(ExpParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _exp_test = std::make_shared<ExpParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_exp_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::exp(90, _phi[1]->value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::exp(10, _phi[1]->test_value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|exp:" <<_exp_test->parameters()[0] << ',' << _exp_test->parameters()[1]; + EXPECT_STREQ(_exp_test->unit().toString().c_str(), "Unitless"); + EXPECT_STREQ(_exp_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_inv_node.cc b/tests/googletest/feature_creation/parameterization/test_inv_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..ec32644a7a4a618f2e8085981d0ab0fe25233f24 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_inv_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/inv/parameterized_inverse.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class InvParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::inv(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _inv_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(InvParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateInvParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (InvParamNode created with an absolute value above the upper bound)"; + + generateInvParamNode(_phi, _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (InvParamNode created with an absolute value below the lower bound)"; + + generateInvParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (InvParamNode created with a zero valued feature in the denominator)"; + + generateInvParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(InvParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _inv_test = std::make_shared<InvParamNode>(_phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (InvParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _inv_test = std::make_shared<InvParamNode>(_phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (InvParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _inv_test = std::make_shared<InvParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_TRUE(false) << " (InvParamNode created with a zero valued feature in the denominator)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _inv_test = std::make_shared<InvParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _inv_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(InvParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _inv_test = std::make_shared<InvParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_inv_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::inv(90, _phi[1]->value_ptr(), _inv_test->parameters()[0], _inv_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_inv_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_inv_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::inv(10, _phi[1]->test_value_ptr(), _inv_test->parameters()[0], _inv_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_inv_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_inv_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|inv:" <<_inv_test->parameters()[0] << ',' << _inv_test->parameters()[1]; + EXPECT_STREQ(_inv_test->unit().toString().c_str(), "s^-1"); + EXPECT_STREQ(_inv_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_log_node.cc b/tests/googletest/feature_creation/parameterization/test_log_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..54f454bc1469ce35f94a06d1dce17cced5263982 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_log_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/log/parameterized_log.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class LogParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::log(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _log_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(LogParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateLogParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (LogParamNode created with an absolute value above the upper bound)"; + + generateLogParamNode(_phi, _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (LogParamNode created with an absolute value below the lower bound)"; + + generateLogParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (LogParamNode created with a negative valued feature in the denominator)"; + + generateLogParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(LogParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _log_test = std::make_shared<LogParamNode>(_phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (LogParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _log_test = std::make_shared<LogParamNode>(_phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (LogParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _log_test = std::make_shared<LogParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_TRUE(false) << " (LogParamNode created with a negative valued feature in the denominator)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _log_test = std::make_shared<LogParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _log_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(LogParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _log_test = std::make_shared<LogParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_log_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::log(90, _phi[1]->value_ptr(), _log_test->parameters()[0], _log_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_log_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_log_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::log(10, _phi[1]->test_value_ptr(), _log_test->parameters()[0], _log_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_log_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_log_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|log:" <<_log_test->parameters()[0] << ',' << _log_test->parameters()[1]; + EXPECT_STREQ(_log_test->unit().toString().c_str(), "Unitless"); + EXPECT_STREQ(_log_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_mult_node.cc b/tests/googletest/feature_creation/parameterization/test_mult_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..c5d743e4852010ffbee087fbcdb63aa3b35c45c4 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_mult_node.cc @@ -0,0 +1,133 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/mult/parameterized_multiply.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class MultParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(-2.50, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = distribution_feats(generator); + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = distribution_feats(generator); + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("[-50.0, 50.0]"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("[-50.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::mult(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _mult_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(MultParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateMultParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (MultParamNode created with an absolute value above the upper bound)"; + + generateMultParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (MultParamNode created with an absolute value below the lower bound)"; + + generateMultParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(MultParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _mult_test = std::make_shared<MultParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (MultParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _mult_test = std::make_shared<MultParamNode>(_phi[0], _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (MultParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _mult_test = std::make_shared<MultParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _mult_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(MultParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _mult_test = std::make_shared<MultParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_mult_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::mult(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _mult_test->parameters()[0], _mult_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_mult_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_mult_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::mult(10, _phi[0]->test_value_ptr(), _phi[1]->test_value_ptr(), _mult_test->parameters()[0], _mult_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_mult_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_mult_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "0|1|mult:" <<_mult_test->parameters()[0] << ',' << _mult_test->parameters()[1]; + EXPECT_STREQ(_mult_test->unit().toString().c_str(), "m * s"); + EXPECT_STREQ(_mult_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_neg_exp_node.cc b/tests/googletest/feature_creation/parameterization/test_neg_exp_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..90117c855a91d15b89a7d169c3a82f9fa7bd98ad --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_neg_exp_node.cc @@ -0,0 +1,146 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/exp/parameterized_exponential.hpp> +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/log/parameterized_log.hpp> +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/parameterized_negative_exponential.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class NegExpParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::neg_exp(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _exp_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(NegExpParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateNegExpParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (NegExpParamNode created with an absolute value above the upper bound)"; + + generateNegExpParamNode(_phi, _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (NegExpParamNode created with an absolute value below the lower bound)"; + + // generateNegExpParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_EQ(_phi.size(), 2) << " (NegExpParamNode created with a negative valued feature in the denominator)"; + + generateNegExpParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(NegExpParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _exp_test = std::make_shared<NegExpParamNode>(_phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (NegExpParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _exp_test = std::make_shared<NegExpParamNode>(_phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (NegExpParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + // try + // { + // _exp_test = std::make_shared<NegExpParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_TRUE(false) << " (NegExpParamNode created with a negative valued feature in the denominator)"; + // } + // catch(const InvalidFeatureException& e) + // {} + + try + { + _exp_test = std::make_shared<NegExpParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _exp_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(NegExpParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _exp_test = std::make_shared<NegExpParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_exp_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::neg_exp(90, _phi[1]->value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::neg_exp(10, _phi[1]->test_value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|nexp:" <<_exp_test->parameters()[0] << ',' << _exp_test->parameters()[1]; + EXPECT_STREQ(_exp_test->unit().toString().c_str(), "Unitless"); + EXPECT_STREQ(_exp_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_sin_node.cc b/tests/googletest/feature_creation/parameterization/test_sin_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..54ed0a058f48eda0e12872fc7edfd1ef15a75de1 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_sin_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/cos/parameterized_cos.hpp> +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/sin/parameterized_sin.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class SinParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(900, 10, 3); + + _task_sizes_train = {900}; + + std::vector<double> value_1(900, 0.0); + std::vector<double> value_2(900, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-6.23, 6.23); + + for(int ii = 0; ii < 900; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = distribution_feats(generator); + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = distribution_feats(generator); + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-6.23, 6.23)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(-6.23, 6.23)"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = 0.143; + _alpha = 1.05; + _prop = std::vector<double>(900, 0.0); + allowed_op_funcs::sin(900, _phi[0]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _sin_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(SinParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateSinParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SinParamNode created with an absolute value above the upper bound)"; + + generateSinParamNode(_phi, _phi[0], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SinParamNode created with an absolute value below the lower bound)"; + + // generateSinParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_EQ(_phi.size(), 2) << " (SinParamNode created with a negative valued feature in the denominator)"; + + generateSinParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-5); + } + + TEST_F(SinParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _sin_test = std::make_shared<SinParamNode>(_phi[0], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (SinParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _sin_test = std::make_shared<SinParamNode>(_phi[0], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (SinParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + // try + // { + // _sin_test = std::make_shared<SinParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_TRUE(false) << " (SinParamNode created with a negative valued feature in the denominator)"; + // } + // catch(const InvalidFeatureException& e) + // {} + + try + { + _sin_test = std::make_shared<SinParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _sin_test->value_ptr(), 90), 1e-5); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(SinParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _sin_test = std::make_shared<SinParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_sin_test->rung(), 1); + + std::vector<double> expected_val(900, 0.0); + + allowed_op_funcs::sin(900, _phi[0]->value_ptr(), _sin_test->parameters()[0], _sin_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_sin_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_sin_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::sin(10, _phi[0]->test_value_ptr(), _sin_test->parameters()[0], _sin_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_sin_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_sin_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "0|sin:" <<_sin_test->parameters()[0] << ',' << _sin_test->parameters()[1]; + EXPECT_STREQ(_sin_test->unit().toString().c_str(), "Unitless"); + EXPECT_STREQ(_sin_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_six_pow_node.cc b/tests/googletest/feature_creation/parameterization/test_six_pow_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..62671fdd8f08c5d8f46c9644933e63280ba87f7b --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_six_pow_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/six_pow/parameterized_sixth_power.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class SixPowParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::sixth_pow(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _exp_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(SixPowParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateSixPowParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SixPowParamNode created with an absolute value above the upper bound)"; + + generateSixPowParamNode(_phi, _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SixPowParamNode created with an absolute value below the lower bound)"; + + // generateSixPowParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_EQ(_phi.size(), 2) << " (SixPowParamNode created with a negative valued feature in the denominator)"; + + generateSixPowParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(SixPowParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _exp_test = std::make_shared<SixPowParamNode>(_phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (SixPowParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _exp_test = std::make_shared<SixPowParamNode>(_phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (SixPowParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + // try + // { + // _exp_test = std::make_shared<SixPowParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_TRUE(false) << " (SixPowParamNode created with a negative valued feature in the denominator)"; + // } + // catch(const InvalidFeatureException& e) + // {} + + try + { + _exp_test = std::make_shared<SixPowParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _exp_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(SixPowParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _exp_test = std::make_shared<SixPowParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_exp_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::sixth_pow(90, _phi[1]->value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::sixth_pow(10, _phi[1]->test_value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|sp:" <<_exp_test->parameters()[0] << ',' << _exp_test->parameters()[1]; + EXPECT_STREQ(_exp_test->unit().toString().c_str(), "s^6"); + EXPECT_STREQ(_exp_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_sq_node.cc b/tests/googletest/feature_creation/parameterization/test_sq_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..11d640c3a6f25f8ea334c308482bb40b1d0dfb87 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_sq_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/sq/parameterized_square.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class SqParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::sq(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _exp_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(SqParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateSqParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SqParamNode created with an absolute value above the upper bound)"; + + generateSqParamNode(_phi, _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SqParamNode created with an absolute value below the lower bound)"; + + // generateSqParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_EQ(_phi.size(), 2) << " (SqParamNode created with a negative valued feature in the denominator)"; + + generateSqParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(SqParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _exp_test = std::make_shared<SqParamNode>(_phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (SqParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _exp_test = std::make_shared<SqParamNode>(_phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (SqParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + // try + // { + // _exp_test = std::make_shared<SqParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + // EXPECT_TRUE(false) << " (SqParamNode created with a negative valued feature in the denominator)"; + // } + // catch(const InvalidFeatureException& e) + // {} + + try + { + _exp_test = std::make_shared<SqParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _exp_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(SqParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _exp_test = std::make_shared<SqParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_exp_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::sq(90, _phi[1]->value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::sq(10, _phi[1]->test_value_ptr(), _exp_test->parameters()[0], _exp_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_exp_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_exp_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|sq:" <<_exp_test->parameters()[0] << ',' << _exp_test->parameters()[1]; + EXPECT_STREQ(_exp_test->unit().toString().c_str(), "s^2"); + EXPECT_STREQ(_exp_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc b/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..882de5340b2fd168cd7c56a9a70353b390db4ef4 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc @@ -0,0 +1,144 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/parameterized_square_root.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class SqrtParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(1e-10, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10; + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("(-inf, inf)"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("(0.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::sqrt(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _sqrt_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(SqrtParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateSqrtParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SqrtParamNode created with an absolute value above the upper bound)"; + + generateSqrtParamNode(_phi, _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SqrtParamNode created with an absolute value below the lower bound)"; + + generateSqrtParamNode(_phi, _phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SqrtParamNode created with a negative valued feature in the denominator)"; + + generateSqrtParamNode(_phi, _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(SqrtParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _sqrt_test = std::make_shared<SqrtParamNode>(_phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (SqrtParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _sqrt_test = std::make_shared<SqrtParamNode>(_phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_TRUE(false) << " (SqrtParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _sqrt_test = std::make_shared<SqrtParamNode>(_phi[0], feat_ind, 1e-50, 1e50, _prop); + EXPECT_TRUE(false) << " (SqrtParamNode created with a negative valued feature in the denominator)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _sqrt_test = std::make_shared<SqrtParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _sqrt_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(SqrtParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _sqrt_test = std::make_shared<SqrtParamNode>(_phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_sqrt_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::sqrt(90, _phi[1]->value_ptr(), _sqrt_test->parameters()[0], _sqrt_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_sqrt_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_sqrt_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::sqrt(10, _phi[1]->test_value_ptr(), _sqrt_test->parameters()[0], _sqrt_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_sqrt_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_sqrt_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "1|sqrt:" <<_sqrt_test->parameters()[0] << ',' << _sqrt_test->parameters()[1]; + EXPECT_STREQ(_sqrt_test->unit().toString().c_str(), "s^0.5"); + EXPECT_STREQ(_sqrt_test->postfix_expr().c_str(), postfix.str().c_str()); + } +} diff --git a/tests/googletest/feature_creation/parameterization/test_sub_node.cc b/tests/googletest/feature_creation/parameterization/test_sub_node.cc new file mode 100644 index 0000000000000000000000000000000000000000..d6cfb80d2202409ed7a939f6908823da5efffdf4 --- /dev/null +++ b/tests/googletest/feature_creation/parameterization/test_sub_node.cc @@ -0,0 +1,133 @@ +#include <feature_creation/node/operator_nodes/allowed_operator_nodes/sub/parameterized_subtract.hpp> +#include <feature_creation/node/value_storage/nodes_value_containers.hpp> +#include <feature_creation/node/FeatureNode.hpp> +#include "gtest/gtest.h" + +#include <random> + +namespace +{ + class SubParamNodeTest : public ::testing::Test + { + protected: + void SetUp() override + { + node_value_arrs::initialize_values_arr(90, 10, 3); + + _task_sizes_train = {90}; + + std::vector<double> value_1(90, 0.0); + std::vector<double> value_2(90, 0.0); + + std::vector<double> test_value_1(10, 0.0); + std::vector<double> test_value_2(10, 0.0); + + std::default_random_engine generator; + std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0); + std::uniform_real_distribution<double> distribution_params(-2.50, 2.50); + + for(int ii = 0; ii < 90; ++ii) + { + value_1[ii] = distribution_feats(generator); + value_2[ii] = distribution_feats(generator); + } + + for(int ii = 0; ii < 10; ++ii) + { + test_value_1[ii] = distribution_feats(generator); + test_value_2[ii] = distribution_feats(generator); + } + + _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Domain("[-50.0, 50.0]"), Unit("m")); + _feat_2 = std::make_shared<FeatureNode>(1, "B", value_2, test_value_2, Domain("[-50.0, 50.0]"), Unit("s")); + + _phi = {_feat_1, _feat_2}; + _a = distribution_params(generator); + _alpha = distribution_params(generator); + _prop = std::vector<double>(90, 0.0); + allowed_op_funcs::sub(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data()); + + nlopt_wrapper::set_objective("regression", _prop.data(), _task_sizes_train); + } + + node_ptr _feat_1; + node_ptr _feat_2; + node_ptr _sub_test; + + std::vector<node_ptr> _phi; + std::vector<double> _prop; + std::vector<int> _task_sizes_train; + + double _a; + double _alpha; + }; + + TEST_F(SubParamNodeTest, GeneratorTest) + { + int feat_ind = _phi.size(); + + generateSubParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SubParamNode created with an absolute value above the upper bound)"; + + generateSubParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e49, 1e50, _prop); + EXPECT_EQ(_phi.size(), 2) << " (SubParamNode created with an absolute value below the lower bound)"; + + generateSubParamNode(_phi, _phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_EQ(_phi.size(), 3) << " (Failure to create a valid feature)"; + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _phi.back()->value_ptr(), 90), 1e-10); + } + + TEST_F(SubParamNodeTest, ConstructorTest) + { + int feat_ind = _phi.size(); + + try + { + _sub_test = std::make_shared<SubParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e-40, _prop); + EXPECT_TRUE(false) << " (SubParamNode created with an absolute value above the upper bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _sub_test = std::make_shared<SubParamNode>(_phi[0], _phi[1], feat_ind, 1e3, 1e50, _prop); + EXPECT_TRUE(false) << " (SubParamNode created with an absolute value below the lower bound)"; + } + catch(const InvalidFeatureException& e) + {} + + try + { + _sub_test = std::make_shared<SubParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + EXPECT_LT(1.0 - util_funcs::r2(_prop.data(), _sub_test->value_ptr(), 90), 1e-10); + } + catch(const InvalidFeatureException& e) + { + EXPECT_TRUE(false) << " (Failure to create a valid feature)"; + } + } + + TEST_F(SubParamNodeTest, AttributesTest) + { + int feat_ind = _phi.size(); + _sub_test = std::make_shared<SubParamNode>(_phi[0], _phi[1], feat_ind, 1e-50, 1e50, _prop); + + EXPECT_EQ(_sub_test->rung(), 1); + + std::vector<double> expected_val(90, 0.0); + + allowed_op_funcs::sub(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _sub_test->parameters()[0], _sub_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_sub_test->value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_sub_test->value()[0] - expected_val[0]), 1e-10); + + allowed_op_funcs::sub(10, _phi[0]->test_value_ptr(), _phi[1]->test_value_ptr(), _sub_test->parameters()[0], _sub_test->parameters()[1], expected_val.data()); + EXPECT_LT(std::abs(_sub_test->test_value_ptr()[0] - expected_val[0]), 1e-10); + EXPECT_LT(std::abs(_sub_test->test_value()[0] - expected_val[0]), 1e-10); + + std::stringstream postfix; + postfix << "0|1|sub:" <<_sub_test->parameters()[0] << ',' << _sub_test->parameters()[1]; + EXPECT_STREQ(_sub_test->unit().toString().c_str(), "m"); + EXPECT_STREQ(_sub_test->postfix_expr().c_str(), postfix.str().c_str()); + } +}