diff --git a/src/feature_creation/node/FeatureNode.hpp b/src/feature_creation/node/FeatureNode.hpp
index f6504d49fea7af6a8d408231bb0992ef5ea4e28c..20562e86052d40c9a8778e0c11f08e272f810f99 100644
--- a/src/feature_creation/node/FeatureNode.hpp
+++ b/src/feature_creation/node/FeatureNode.hpp
@@ -124,8 +124,6 @@ public:
      */
     inline int rung(int cur_rung = 0){return cur_rung;}
 
-    inline std::vector<node_ptr> feats(){return {};}
-
     /**
      * @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 d3d60fadcadb1f9d42e4b2fa479586b93b611c25..a4602172f0ef079f85a3c79d7379d507f568500c 100644
--- a/src/feature_creation/node/Node.hpp
+++ b/src/feature_creation/node/Node.hpp
@@ -118,8 +118,6 @@ public:
      */
     virtual std::vector<double> test_value() = 0;
 
-    virtual std::vector<std::shared_ptr<Node>> feats() = 0;
-
     /**
      * @brief Set the value for the feature
      */
diff --git a/src/feature_creation/node/operator_nodes/OperatorNode.cpp b/src/feature_creation/node/operator_nodes/OperatorNode.cpp
index 80b6ea1321f02bf68049e31356744fd8309c12bb..df0a67d2cc0bc8286970748695986d7d1fc1548d 100644
--- a/src/feature_creation/node/operator_nodes/OperatorNode.cpp
+++ b/src/feature_creation/node/operator_nodes/OperatorNode.cpp
@@ -1,52 +1,52 @@
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-OperatorNode::OperatorNode()
-{}
-
-OperatorNode::OperatorNode(std::vector<node_ptr> feats, int rung, int feat_ind) :
-    Node(feat_ind, feats[0]->n_samp(), feats[0]->n_test_samp()),
-    _feats(feats)
-{}
-
-OperatorNode::~OperatorNode()
-{}
-
-double* OperatorNode::value_ptr(int offset)
-{
-    offset = (offset == -1) ? rung() : offset;
-    if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_reg(_arr_ind, offset) != _arr_ind))
-    {
-        set_value(offset);
-        node_value_arrs::temp_storage_reg(_arr_ind, offset) = _arr_ind;
-    }
-
-    return node_value_arrs::get_value_ptr(_arr_ind, offset);
-}
-
-double* OperatorNode::test_value_ptr(int offset)
-{
-    offset = (offset == -1) ? rung() : offset;
-    if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_test_reg(_arr_ind, offset) != _arr_ind))
-    {
-        set_test_value(offset);
-        node_value_arrs::temp_storage_test_reg(_arr_ind, offset) = _arr_ind;
-    }
-
-    return node_value_arrs::get_test_value_ptr(_arr_ind, offset);
-}
-
-std::vector<double> OperatorNode::value()
-{
-    std::vector<double> val(_n_samp, 0.0);
-    std::copy_n(value_ptr(), _n_samp, val.data());
-    return val;
-}
-
-std::vector<double> OperatorNode::test_value()
-{
-    std::vector<double> val(_n_test_samp, 0.0);
-    std::copy_n(test_value_ptr(), _n_test_samp, val.data());
-    return val;
-}
+// OperatorNode::OperatorNode()
+// {}
+
+// OperatorNode::OperatorNode(std::array<node_ptr, 1> feats, int rung, int feat_ind) :
+//     Node(feat_ind, feats[0]->n_samp(), feats[0]->n_test_samp()),
+//     _feats(feats)
+// {}
+
+// OperatorNode::~OperatorNode()
+// {}
+
+// double* OperatorNode::value_ptr(int offset)
+// {
+//     offset = (offset == -1) ? rung() : offset;
+//     if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_reg(_arr_ind, offset) != _arr_ind))
+//     {
+//         set_value(offset);
+//         node_value_arrs::temp_storage_reg(_arr_ind, offset) = _arr_ind;
+//     }
+
+//     return node_value_arrs::get_value_ptr(_arr_ind, offset);
+// }
+
+// double* OperatorNode::test_value_ptr(int offset)
+// {
+//     offset = (offset == -1) ? rung() : offset;
+//     if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_test_reg(_arr_ind, offset) != _arr_ind))
+//     {
+//         set_test_value(offset);
+//         node_value_arrs::temp_storage_test_reg(_arr_ind, offset) = _arr_ind;
+//     }
+
+//     return node_value_arrs::get_test_value_ptr(_arr_ind, offset);
+// }
+
+// std::vector<double> OperatorNode::value()
+// {
+//     std::vector<double> val(_n_samp, 0.0);
+//     std::copy_n(value_ptr(), _n_samp, val.data());
+//     return val;
+// }
+
+// std::vector<double> OperatorNode::test_value()
+// {
+//     std::vector<double> val(_n_test_samp, 0.0);
+//     std::copy_n(test_value_ptr(), _n_test_samp, val.data());
+//     return val;
+// }
 
 BOOST_SERIALIZATION_ASSUME_ABSTRACT(OperatorNode)
diff --git a/src/feature_creation/node/operator_nodes/OperatorNode.hpp b/src/feature_creation/node/operator_nodes/OperatorNode.hpp
index d8aaa8bba8767fdea3f2171440f461e4d02736b1..bf7ce32f157b3184b84ee79784f64f7e79e2a2fe 100644
--- a/src/feature_creation/node/operator_nodes/OperatorNode.hpp
+++ b/src/feature_creation/node/operator_nodes/OperatorNode.hpp
@@ -17,6 +17,7 @@
  * @details
  *
  */
+template<int N>
 class OperatorNode: public Node
 {
     friend class boost::serialization::access;
@@ -28,14 +29,15 @@ class OperatorNode: public Node
         ar & _feats;
     }
 protected:
-    std::vector<node_ptr> _feats;
+    std::array<node_ptr, N> _feats;
 
 public:
     /**
      * @brief Base Constructor
      * @details This is only used for serialization
      */
-    OperatorNode();
+    OperatorNode()
+    {}
 
     /**
      * @brief Constructor
@@ -45,19 +47,31 @@ public:
      * @param rung run the feature is on (depth of the tree)
      * @param feat_ind index of the feature
      */
-    OperatorNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    OperatorNode(std::array<node_ptr, N> feats, int rung, int feat_ind) :
+        Node(feat_ind, feats[0]->n_samp(), feats[0]->n_test_samp()),
+        _feats(feats)
+    {}
 
-    virtual ~OperatorNode();
+    virtual ~OperatorNode()
+    {}
 
     virtual std::string expr() = 0;
 
     virtual Unit unit() = 0;
 
-    std::vector<double> value();
-
-    std::vector<double> test_value();
+    std::vector<double> value()
+    {
+        std::vector<double> val(_n_samp, 0.0);
+        std::copy_n(value_ptr(), _n_samp, val.data());
+        return val;
+    }
 
-    inline std::vector<node_ptr> feats(){return _feats;}
+    std::vector<double> test_value()
+    {
+        std::vector<double> val(_n_test_samp, 0.0);
+        std::copy_n(test_value_ptr(), _n_test_samp, val.data());
+        return val;
+    }
 
     virtual void set_value(int offset = -1) = 0;
 
@@ -71,7 +85,17 @@ public:
      *
      * @return pointer to the feature's value
      */
-    double* value_ptr(int offset=-1);
+    double* value_ptr(int offset=-1)
+    {
+        offset = (offset == -1) ? rung() : offset;
+        if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_reg(_arr_ind, offset) != _arr_ind))
+        {
+            set_value(offset);
+            node_value_arrs::temp_storage_reg(_arr_ind, offset) = _arr_ind;
+        }
+
+        return node_value_arrs::get_value_ptr(_arr_ind, offset);
+    }
 
     /**
      * @brief Get the pointer to the feature's data
@@ -81,7 +105,17 @@ public:
      *
      * @return pointer to the feature's test values
      */
-    double* test_value_ptr(int offset=-1);
+    double* test_value_ptr(int offset=-1)
+    {
+        offset = (offset == -1) ? rung() : offset;
+        if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_test_reg(_arr_ind, offset) != _arr_ind))
+        {
+            set_test_value(offset);
+            node_value_arrs::temp_storage_test_reg(_arr_ind, offset) = _arr_ind;
+        }
+
+        return node_value_arrs::get_test_value_ptr(_arr_ind, offset);
+    }
 
     /**
      * @brief Check if the feature contains NaN
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_difference.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_difference.cpp
index ae7ee26ae67cfa0a0c30b9262d6ab2a293ea102c..881891f84daf6192aec33b5b91174d1d463c2a43 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_difference.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_difference.cpp
@@ -5,7 +5,7 @@
 AbsDiffNode::AbsDiffNode()
 {}
 
-AbsDiffNode::AbsDiffNode(std::vector<node_ptr> feats, int rung, int feat_ind) :
+AbsDiffNode::AbsDiffNode(std::array<node_ptr, 2> feats, int rung, int feat_ind) :
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->unit() != feats[1]->unit())
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_difference.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_difference.hpp
index 7434f27edd2bf9b2004216e58da2ac506041f240..e6a4d9ad6a01d7470c006f19d189ff38c9458278 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_difference.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_difference.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class AbsDiffNode: public OperatorNode
+class AbsDiffNode: public OperatorNode<2>
 {
     friend class boost::serialization::access;
 
@@ -16,7 +16,7 @@ class AbsDiffNode: public OperatorNode
 public:
     AbsDiffNode();
 
-    AbsDiffNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    AbsDiffNode(std::array<node_ptr, 2> feats, int rung, int feat_ind);
 
     AbsDiffNode(node_ptr feat_1, node_ptr feat_2, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_value.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_value.cpp
index 7c01d21a57593bbdec591d607f9d7c45573b3baf..65873d33f8c848fa0c3c47cb50b95aff69f5a3e3 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_value.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_value.cpp
@@ -5,7 +5,7 @@
 AbsNode::AbsNode()
 {}
 
-AbsNode::AbsNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+AbsNode::AbsNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     set_value();
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_value.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_value.hpp
index 11cb5c7c60863ea11e960ffa0e7334a38c202bb0..092acd3ccfed3ad20b24b086df74e7b26ee2b18a 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_value.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/absolute_value.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class AbsNode: public OperatorNode
+class AbsNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -15,7 +15,7 @@ class AbsNode: public OperatorNode
 public:
     AbsNode();
 
-    AbsNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    AbsNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     AbsNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add.cpp
index 0a4742b5dc365a8f3920be53700f268fcd34164e..9b8751a8972e93ef8f59d9875766b1df08cc686a 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add.cpp
@@ -3,7 +3,7 @@
 AddNode::AddNode()
 {}
 
-AddNode::AddNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+AddNode::AddNode(std::array<node_ptr, 2> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->unit() != feats[1]->unit())
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add.hpp
index de207aa7c99bcb29b201c976b05f3821cf9d343c..2b09833e3a9b44d5799c46decf076df3ff486027 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class AddNode: public OperatorNode
+class AddNode: public OperatorNode<2>
 {
     friend class boost::serialization::access;
 
@@ -15,7 +15,7 @@ class AddNode: public OperatorNode
 public:
     AddNode();
 
-    AddNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    AddNode(std::array<node_ptr, 2> feats, int rung, int feat_ind);
 
     AddNode(node_ptr feat_1, node_ptr feat_2, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos.cpp
index 697094e2529677b64f7e3eb448d32c43431db713..d1fa2e0a8e6b0c48fef161b801f6794934c0e38a 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos.cpp
@@ -3,7 +3,7 @@
 CosNode::CosNode()
 {}
 
-CosNode::CosNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+CosNode::CosNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->unit() != Unit())
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos.hpp
index 97eda826f5f9bdface43dba53db42fcea8b63e01..be84327bddaba869b46114c2946971b3ddb7b128 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class CosNode: public OperatorNode
+class CosNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -15,7 +15,7 @@ class CosNode: public OperatorNode
 public:
     CosNode();
 
-    CosNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    CosNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     CosNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube.cpp
index d98cc3e332a600651b28b731bd43ed558162ef33..a49c519588952cddb34ec83482093b8a6f6c449a 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube.cpp
@@ -3,7 +3,7 @@
 CbNode::CbNode()
 {}
 
-CbNode::CbNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+CbNode::CbNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->type() == NODE_TYPE::CBRT)
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube.hpp
index 420af5caa4873eb90dedad72de6a552840e604f6..3afa8b20099d20ee27254c3cba0bb931d97c6e90 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class CbNode: public OperatorNode
+class CbNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -15,7 +15,7 @@ class CbNode: public OperatorNode
 public:
     CbNode();
 
-    CbNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    CbNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     CbNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube_root.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube_root.cpp
index b824bec6e26a80d4a6593ad292ea09393172524b..20cde3f9e3a3cf20056184f52eb6ebc4ea7d5486 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube_root.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube_root.cpp
@@ -3,7 +3,7 @@
 CbrtNode::CbrtNode()
 {}
 
-CbrtNode::CbrtNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+CbrtNode::CbrtNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->type() == NODE_TYPE::CB)
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube_root.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube_root.hpp
index b69afd46e9bd2dbb3976fa61c46f49a15b0caac4..1152fd2afe5229aeb02129cd94909a483c0c4d78 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube_root.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cube_root.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class CbrtNode: public OperatorNode
+class CbrtNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -15,7 +15,7 @@ class CbrtNode: public OperatorNode
 public:
     CbrtNode();
 
-    CbrtNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    CbrtNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     CbrtNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/divide.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/divide.cpp
index 6aa3db9390ac6cbd5fee4f1b95041f6474888898..837fb44b48c92e71a662a95c1ed25fb2a7280222 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/divide.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/divide.cpp
@@ -3,7 +3,7 @@
 DivNode::DivNode()
 {}
 
-DivNode::DivNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+DivNode::DivNode(std::array<node_ptr, 2> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if((feats[0]->type() == NODE_TYPE::INV) || (feats[1]->type() == NODE_TYPE::INV))
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/divide.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/divide.hpp
index 7b06b84e83b1a47a9dcb1c26968ae654375c9128..89738715630f6c3046e4c5a5ec7c700360a0db49 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/divide.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/divide.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class DivNode: public OperatorNode
+class DivNode: public OperatorNode<2>
 {
     friend class boost::serialization::access;
 
@@ -15,7 +15,7 @@ class DivNode: public OperatorNode
 public:
     DivNode();
 
-    DivNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    DivNode(std::array<node_ptr, 2> feats, int rung, int feat_ind);
 
     DivNode(node_ptr feat_1, node_ptr feat_2, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exponential.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exponential.cpp
index c12d2397ac1c84168f6e49ebc091e8fa57bf4dd2..c4691ed9951b48a0da9eb39ad929adaefcb93ac0 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exponential.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exponential.cpp
@@ -3,7 +3,7 @@
 ExpNode::ExpNode()
 {}
 
-ExpNode::ExpNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+ExpNode::ExpNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->unit() != Unit())
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exponential.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exponential.hpp
index 4903e366c55490298b06b102bb8af7c4c5525153..c35f8ee0c998e6e60d089556ac02e14272e23260 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exponential.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exponential.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class ExpNode: public OperatorNode
+class ExpNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -15,7 +15,7 @@ class ExpNode: public OperatorNode
 public:
     ExpNode();
 
-    ExpNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    ExpNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     ExpNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inverse.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inverse.cpp
index b8f0e456dfd30f19b71f61c4e027f62acfea645b..d39a8d6a3c1e04069e6c0d64b9cec4c26f7d2209 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inverse.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inverse.cpp
@@ -3,7 +3,7 @@
 InvNode::InvNode()
 {}
 
-InvNode::InvNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+InvNode::InvNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if((feats[0]->type() == NODE_TYPE::DIV) || (feats[0]->type() == NODE_TYPE::EXP) || (feats[0]->type() == NODE_TYPE::NEG_EXP))
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inverse.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inverse.hpp
index 8147863dce3db3d49666dc13a229e815916c87e6..8a8f69be48c00560a6b98d39f8f62adf495bed9d 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inverse.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inverse.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class InvNode: public OperatorNode
+class InvNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -16,7 +16,7 @@ class InvNode: public OperatorNode
 public:
     InvNode();
 
-    InvNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    InvNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     InvNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log.cpp
index d0af28396c424cf0870f67e980095f583431b249..8d8c3b10e1b11f04f35a37e90a7f21fe732ae3ab 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log.cpp
@@ -3,7 +3,7 @@
 LogNode::LogNode()
 {}
 
-LogNode::LogNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+LogNode::LogNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->unit() != Unit())
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log.hpp
index 864b60c7c69368c877d831086aa82a397e1cc594..5c194abc8a34e3cc90f8fbf1a8b9f8790b25b337 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class LogNode: public OperatorNode
+class LogNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -15,7 +15,7 @@ class LogNode: public OperatorNode
 public:
     LogNode();
 
-    LogNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    LogNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     LogNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/multiply.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/multiply.cpp
index bc0e13faf34eeb8c41a33ac67627e47232afc98f..fa6c8245ba1f754706289b63d1cd216b66fffc4b 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/multiply.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/multiply.cpp
@@ -3,7 +3,7 @@
 MultNode::MultNode()
 {}
 
-MultNode::MultNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+MultNode::MultNode(std::array<node_ptr, 2> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     std::map<std::string, double> div_mult_leaves;
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/multiply.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/multiply.hpp
index f78a0ed7679013503edbeb990d66a229eeaf0a4f..a25cce6508de33907c257b1d05f5efedc0b3b479 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/multiply.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/multiply.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class MultNode: public OperatorNode
+class MultNode: public OperatorNode<2>
 {
     friend class boost::serialization::access;
 
@@ -16,7 +16,7 @@ class MultNode: public OperatorNode
 public:
     MultNode();
 
-    MultNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    MultNode(std::array<node_ptr, 2> feats, int rung, int feat_ind);
 
     MultNode(node_ptr feat_1, node_ptr feat_2, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.cpp
index df28a9e1323bba4c8a871cbed338d44dd6978074..fdf125f2916c4a381ea49e4e99218eced58f63d9 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.cpp
@@ -3,7 +3,7 @@
 NegExpNode::NegExpNode()
 {}
 
-NegExpNode::NegExpNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+NegExpNode::NegExpNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->unit() != Unit())
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.hpp
index c7dde942319d4bc0970fba8be818350923216d71..6b6f4f1a1e333ced2b4361e7936ae6ae3f87fd02 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/negative_exponential.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class NegExpNode: public OperatorNode
+class NegExpNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -16,7 +16,7 @@ class NegExpNode: public OperatorNode
 public:
     NegExpNode();
 
-    NegExpNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    NegExpNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     NegExpNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.cpp
index 3aedd0737f4551f9f106fc5721045e937344cfdc..4c9bbc4bf492ea686ae8ae8acbaadb8f8b8e55e6 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.cpp
@@ -3,7 +3,7 @@
 SinNode::SinNode()
 {}
 
-SinNode::SinNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+SinNode::SinNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->unit() != Unit())
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.hpp
index cb606b1032ef75c91e94ef2e87d84fe0b291d0cf..d048df822f3cc9795f6f9459297fd95167039b0a 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class SinNode: public OperatorNode
+class SinNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -16,7 +16,7 @@ class SinNode: public OperatorNode
 public:
     SinNode();
 
-    SinNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    SinNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     SinNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sixth_power.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sixth_power.cpp
index a74ef6d6e41de4accc5d087ec3d59717268b1c30..5fe889b4d138954feac959bd9a6e41768ce300f9 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sixth_power.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sixth_power.cpp
@@ -3,7 +3,7 @@
 SixPowNode::SixPowNode()
 {}
 
-SixPowNode::SixPowNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+SixPowNode::SixPowNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if((feats[0]->type() == NODE_TYPE::CBRT) || (feats[0]->type() == NODE_TYPE::SQRT))
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sixth_power.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sixth_power.hpp
index 8fb575b4b8ffa585324e1db21fd3b3ff92f93a0e..d21b1b230905afb170c0a7e7af75504d7dc86dde 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sixth_power.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sixth_power.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class SixPowNode: public OperatorNode
+class SixPowNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -16,7 +16,7 @@ class SixPowNode: public OperatorNode
 public:
     SixPowNode();
 
-    SixPowNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    SixPowNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     SixPowNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square.cpp
index 7bfb9c6ef0e47b2e24209a0a4f1b4d1a6da93a1d..2251bddc7408abed7798a6f8267e50cdd922999a 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square.cpp
@@ -3,7 +3,7 @@
 SqNode::SqNode()
 {}
 
-SqNode::SqNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+SqNode::SqNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->type() == NODE_TYPE::SQRT)
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square.hpp
index dc5a7acc532e47998f70292ced14dffc6d1f7b7d..64ecd33a3bf201a367a44f07e77de134babeb1da 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class SqNode: public OperatorNode
+class SqNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -15,7 +15,7 @@ class SqNode: public OperatorNode
 public:
     SqNode();
 
-    SqNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    SqNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     SqNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square_root.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square_root.cpp
index 0f30bb2b1065fd81d2bdfeb86c32068dce7aa8be..fb8241386ce21952547d6d89a0af54f83f5413e0 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square_root.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square_root.cpp
@@ -3,7 +3,7 @@
 SqrtNode::SqrtNode()
 {}
 
-SqrtNode::SqrtNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+SqrtNode::SqrtNode(std::array<node_ptr, 1> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->type() == NODE_TYPE::SQRT)
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square_root.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square_root.hpp
index 07d2736ef2e544d4136236f588ae1ee616530e6f..ae76c2d2f5e7167277084925f5d5961ccf8ec86b 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square_root.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/square_root.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class SqrtNode: public OperatorNode
+class SqrtNode: public OperatorNode<1>
 {
     friend class boost::serialization::access;
 
@@ -16,7 +16,7 @@ class SqrtNode: public OperatorNode
 public:
     SqrtNode();
 
-    SqrtNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    SqrtNode(std::array<node_ptr, 1> feats, int rung, int feat_ind);
 
     SqrtNode(node_ptr feat, int rung, int feat_ind);
 
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.cpp
index 0760bc8bd947be1bc09a796c125ed100a8799941..0b98078d000730c4c3f655e18e3b3fd40371e897 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.cpp
@@ -3,7 +3,7 @@
 SubNode::SubNode()
 {}
 
-SubNode::SubNode(std::vector<node_ptr> feats, int rung, int feat_ind):
+SubNode::SubNode(std::array<node_ptr, 2> feats, int rung, int feat_ind):
     OperatorNode(feats, rung, feat_ind)
 {
     if(feats[0]->unit() != feats[1]->unit())
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.hpp
index 8883fe3e55e768d6821b63581745fb6f4b184a1d..469864a3cb1fb9bed41033a79fc93277f9959306 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/subtract.hpp
@@ -3,7 +3,7 @@
 
 #include <feature_creation/node/operator_nodes/OperatorNode.hpp>
 
-class SubNode: public OperatorNode
+class SubNode: public OperatorNode<2>
 {
     friend class boost::serialization::access;
 
@@ -16,7 +16,7 @@ class SubNode: public OperatorNode
 public:
     SubNode();
 
-    SubNode(std::vector<node_ptr> feats, int rung, int feat_ind);
+    SubNode(std::array<node_ptr, 2> feats, int rung, int feat_ind);
 
     SubNode(node_ptr feat_1, node_ptr feat_2, int rung, int feat_ind);