From c77a4ecbbb61492a6ecd5395ff3b8576c17f1145 Mon Sep 17 00:00:00 2001 From: Thomas Purcell <purcell@fhi-berlin.mpg.de> Date: Fri, 28 Aug 2020 17:34:21 +0200 Subject: [PATCH] Bug Fix Feature selected on a particular rank but not overall were not set selected to false --- .../feature_space/FeatureSpace.cpp | 6 ++++++ src/feature_creation/node/FeatureNode.hpp | 21 +++++++++++++++++++ src/feature_creation/node/Node.hpp | 15 +++++++++++++ .../node/operator_nodes/OperatorNode.hpp | 21 +++++++++++++++++++ src/python/bindings_docstring_keyed.cpp | 2 ++ src/python/bindings_docstring_keyed.hpp | 5 +++++ 6 files changed, 70 insertions(+) diff --git a/src/feature_creation/feature_space/FeatureSpace.cpp b/src/feature_creation/feature_space/FeatureSpace.cpp index 5cebdc24..79488437 100644 --- a/src/feature_creation/feature_space/FeatureSpace.cpp +++ b/src/feature_creation/feature_space/FeatureSpace.cpp @@ -540,6 +540,12 @@ void FeatureSpace::sis(std::vector<double>& prop) node_value_arrs::clear_temp_test_reg(); } + for(auto& feat : phi_sel) + { + feat->set_selected(false); + feat->set_d_mat_ind(-1); + } + // If we are only on one process then phi_sel are the selected features if(_mpi_comm->size() > 1) { diff --git a/src/feature_creation/node/FeatureNode.hpp b/src/feature_creation/node/FeatureNode.hpp index abf9086b..265e0695 100644 --- a/src/feature_creation/node/FeatureNode.hpp +++ b/src/feature_creation/node/FeatureNode.hpp @@ -243,6 +243,27 @@ public: */ inline std::string get_postfix_term(){return std::to_string(_feat_ind);} + //DocString: feat_node_nfeats + /** + * @brief Number of features used for an operator node + * @return the number of features for an operator node + */ + inline int n_feats(){return 0;} + + //DocString: feat_node_feat + /** + * @brief Return the ind node_ptr in the operator node's feat list + * + * @param ind the index of the node to access + * @return the ind feature in feature_list + */ + inline node_ptr feat(int ind) + { + if(ind > 0) + throw std::logic_error("Index not found in _feats"); + return nullptr; + } + /** * @brief update the dictionary used to check if an Add/Sub node is valid * diff --git a/src/feature_creation/node/Node.hpp b/src/feature_creation/node/Node.hpp index ef7e7b51..c7cb6be0 100644 --- a/src/feature_creation/node/Node.hpp +++ b/src/feature_creation/node/Node.hpp @@ -316,6 +316,21 @@ public: */ virtual void update_div_mult_leaves(std::map<std::string, double>& div_mult_leaves, double fact, double& expected_abs_tot) = 0; + //DocString: node_nfeats + /** + * @brief Number of features used for an operator node + * @return the number of features for an operator node + */ + virtual int n_feats() = 0; + + //DocString: node_feat + /** + * @brief Return the ind node_ptr in the operator node's feat list + * + * @param ind the index of the node to access + * @return the ind feature in feature_list + */ + virtual std::shared_ptr<Node> feat(int ind) = 0; #ifdef PY_BINDINGS diff --git a/src/feature_creation/node/operator_nodes/OperatorNode.hpp b/src/feature_creation/node/operator_nodes/OperatorNode.hpp index 41edc4dd..5c5c97f1 100644 --- a/src/feature_creation/node/operator_nodes/OperatorNode.hpp +++ b/src/feature_creation/node/operator_nodes/OperatorNode.hpp @@ -255,6 +255,27 @@ public: */ virtual std::string get_postfix_term() = 0; + //DocString: op_node_nfeats + /** + * @brief Number of features used for an operator node + * @return the number of features for an operator node + */ + inline int n_feats(){return N;} + + //DocString: op_node_feat + /** + * @brief Return the ind node_ptr in the operator node's feat list + * + * @param ind the index of the node to access + * @return the ind feature in feature_list + */ + inline node_ptr feat(int ind) + { + if(ind > N) + throw std::logic_error("Index not found in _feats"); + return _feats[ind]; + } + /** * @brief update the dictionary used to check if an Add/Sub node is valid * diff --git a/src/python/bindings_docstring_keyed.cpp b/src/python/bindings_docstring_keyed.cpp index 803c5597..4cd21828 100644 --- a/src/python/bindings_docstring_keyed.cpp +++ b/src/python/bindings_docstring_keyed.cpp @@ -112,6 +112,8 @@ void sisso::feature_creation::node::registerNode() .def("is_nan", pure_virtual(&Node::is_nan), "@DocString_node_is_nan@") .def("is_const", pure_virtual(&Node::is_const), "@DocString_node_is_const@") .def("rung", pure_virtual(&Node::rung), "@DocString_node_rung@") + .def("n_feats", pure_virtual(&Node::n_feats), "@DocString_node_n_feats@") + .def("feat", pure_virtual(&Node::feat), "@DocString_node_feat@") ; } diff --git a/src/python/bindings_docstring_keyed.hpp b/src/python/bindings_docstring_keyed.hpp index e11568b8..1ebc81b5 100644 --- a/src/python/bindings_docstring_keyed.hpp +++ b/src/python/bindings_docstring_keyed.hpp @@ -52,6 +52,8 @@ namespace sisso std::string get_postfix_term(){return this->get_override("get_postfix_term")();} inline void update_add_sub_leaves(std::map<std::string, int>& add_sub_leaves, int pl_mn, int& expected_abs_tot){this->get_override("update_add_sub_leaves");} inline void update_div_mult_leaves(std::map<std::string, double>& div_mult_leaves, double fact, double& expected_abs_tot){this->get_override("update_div_mult_leaves");} + inline int n_feats(){this->get_override("n_feats");} + inline std::shared_ptr<Node> feat(int ind){this->get_override("feat");} }; /** * @brief struct used wrap an OperatorNode object for conversion @@ -99,6 +101,9 @@ namespace sisso .def("rung", py::pure_virtual(&OperatorNode<N>::rung), "@DocString_op_node_rung@") .def("expr", py::pure_virtual(&OperatorNode<N>::expr), "@DocString_op_node_expr@") .def("unit", py::pure_virtual(&OperatorNode<N>::unit), "@DocString_op_node_unit@") + .add_property("n_feats", &OperatorNode<N>::n_feats, "@DocString_op_node_n_feats@") + .add_property("feat", &OperatorNode<N>::feat, "@DocString_op_node_feat@") + ; } -- GitLab