diff --git a/src/feature_creation/feature_space/FeatureSpace.cpp b/src/feature_creation/feature_space/FeatureSpace.cpp
index 86b41bbd3d988a5129e6166e42aa3054a7577770..57a66471c1550bb16b89a6b4544bff6144bf74df 100644
--- a/src/feature_creation/feature_space/FeatureSpace.cpp
+++ b/src/feature_creation/feature_space/FeatureSpace.cpp
@@ -472,14 +472,14 @@ void FeatureSpace::project_generated(double* prop, int size, std::vector<node_pt
                     if(scores_sel_private.size() == _n_sis_select)
                     {
                         generated_phi[inds[ii]]->reindex(node_value_arrs::N_STORE_FEATURES + worst_score_ind + _n_sis_select * (omp_get_thread_num() + _mpi_comm->size()));
-                        generated_phi[inds[ii]]->set_value();
+                        // generated_phi[inds[ii]]->set_value();
                         phi_sel_private[worst_score_ind] = generated_phi[inds[ii]];
                         scores_sel_private[worst_score_ind] = cur_score;
                     }
                     else
                     {
                         generated_phi[inds[ii]]->reindex(node_value_arrs::N_STORE_FEATURES + scores_sel_private.size() + _n_sis_select * (omp_get_thread_num() +  _mpi_comm->size()));
-                        generated_phi[inds[ii]]->set_value();
+                        // generated_phi[inds[ii]]->set_value();
                         phi_sel_private.push_back(generated_phi[inds[ii]]);
                         scores_sel_private.push_back(cur_score);
                     }
diff --git a/src/feature_creation/node/FeatureNode.hpp b/src/feature_creation/node/FeatureNode.hpp
index e672e211697f6120963f44f7fec534de54e935a3..fed7e9f7c82643ed272809f824a9bf43c3e475cc 100644
--- a/src/feature_creation/node/FeatureNode.hpp
+++ b/src/feature_creation/node/FeatureNode.hpp
@@ -167,7 +167,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    inline void set_value(int offset = -1){std::copy_n(_value.data(), _n_samp, value_ptr());}
+    inline void set_value(int offset=0){std::copy_n(_value.data(), _n_samp, value_ptr());}
 
     // DocString: feat_node_set_test_value
     /**
@@ -175,7 +175,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    inline void set_test_value(int offset = -1){if(!_selected) std::copy_n(_test_value.data(), _n_test_samp, test_value_ptr());}
+    inline void set_test_value(int offset=0){if(!_selected) std::copy_n(_test_value.data(), _n_test_samp, test_value_ptr());}
 
     // DocString: feat_node_is_nan
     /**
@@ -199,14 +199,14 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    inline double* value_ptr(int offset = 0){return _selected ? node_value_arrs::get_d_matrix_ptr(_d_mat_ind) : node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset);}
+    inline double* value_ptr(int offset=0){return _selected ? node_value_arrs::get_d_matrix_ptr(_d_mat_ind) : node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, 0, offset);}
 
     /**
      * @brief The pointer to where the feature's test data is stored
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    inline double* test_value_ptr(int offset = 0){return node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset);}
+    inline double* test_value_ptr(int offset=0){return node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, 0, offset);}
 
 
     // DocString: feat_node_rung
diff --git a/src/feature_creation/node/ModelNode.hpp b/src/feature_creation/node/ModelNode.hpp
index 28cd02d37c0c1bbf4b801e0268332aafbe21c6bd..4c65f29fb2ec119044d084628c99d0893eae727d 100644
--- a/src/feature_creation/node/ModelNode.hpp
+++ b/src/feature_creation/node/ModelNode.hpp
@@ -116,7 +116,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    inline void set_value(int offset = -1){return;}
+    inline void set_value(int offset=0){return;}
 
     // DocString: model_node_set_test_value
     /**
@@ -124,7 +124,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    inline void set_test_value(int offset = -1){return;}
+    inline void set_test_value(int offset=0){return;}
 
     // DocString: model_node_is_nan
     /**
@@ -148,14 +148,14 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    inline double* value_ptr(int offset = -1){return _value.data();}
+    inline double* value_ptr(int offset=0){return _value.data();}
 
     /**
      * @brief The pointer to where the feature's test data is stored
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    inline double* test_value_ptr(int offset = -1){return _test_value.data();}
+    inline double* test_value_ptr(int offset=0){return _test_value.data();}
 
     // DocString: model_node_rung
     /**
diff --git a/src/feature_creation/node/Node.hpp b/src/feature_creation/node/Node.hpp
index 084d59a2252d17f19fc4d779b0da710a005c29ce..49f746883fd9be7c7c44d86a7c10a00718ac7532 100644
--- a/src/feature_creation/node/Node.hpp
+++ b/src/feature_creation/node/Node.hpp
@@ -225,14 +225,14 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    virtual void set_value(int offset = -1) = 0;
+    virtual void set_value(int offset=0) = 0;
 
     /**
      * @brief The pointer to where the feature's training data is stored
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    virtual double* value_ptr(int offset = -1) = 0;
+    virtual double* value_ptr(int offset=0) = 0;
 
     // DocString: node_set_test_value
     /**
@@ -240,14 +240,14 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    virtual void set_test_value(int offset = -1) = 0;
+    virtual void set_test_value(int offset=0) = 0;
 
     /**
      * @brief The pointer to where the feature's test data is stored
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    virtual double* test_value_ptr(int offset = -1) = 0;
+    virtual double* test_value_ptr(int offset=0) = 0;
 
     // DocString: node_is_nan
     /**
diff --git a/src/feature_creation/node/operator_nodes/OperatorNode.hpp b/src/feature_creation/node/operator_nodes/OperatorNode.hpp
index 579717f4222b86d6eada3c1aaf43443d11c6e133..a3c80b1bee7272b906f2ce297b481167dab70e28 100644
--- a/src/feature_creation/node/operator_nodes/OperatorNode.hpp
+++ b/src/feature_creation/node/operator_nodes/OperatorNode.hpp
@@ -143,7 +143,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    virtual void set_value(int offset = -1) = 0;
+    virtual void set_value(int offset=0) = 0;
 
     // DocString: op_node_set_test_value
     /**
@@ -151,7 +151,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    virtual void set_test_value(int offset = -1) = 0;
+    virtual void set_test_value(int offset=0) = 0;
 
     /**
      * @brief Get the pointer to the feature's training data
@@ -161,18 +161,17 @@ public:
      *
      * @return pointer to the feature's training value
      */
-    double* value_ptr(int offset=-1)
+    double* value_ptr(int offset=0)
     {
         if(_selected)
             return node_value_arrs::get_d_matrix_ptr(_d_mat_ind);
 
-        offset = (offset == -1) ? rung() : offset;
-        if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_reg(_arr_ind, offset) != _feat_ind))
+        if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_reg(_arr_ind, rung(), offset) != _feat_ind))
         {
             set_value(offset);
         }
 
-        return node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset);
+        return node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset);
     }
 
     /**
@@ -183,15 +182,14 @@ public:
      *
      * @return pointer to the feature's test values
      */
-    double* test_value_ptr(int offset=-1)
+    double* test_value_ptr(int offset=0)
     {
-        offset = (offset == -1) ? rung() : offset;
-        if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_test_reg(_arr_ind, offset) != _feat_ind))
+        if((rung() > node_value_arrs::N_RUNGS_STORED) && (node_value_arrs::temp_storage_test_reg(_arr_ind, rung(), offset) != _feat_ind))
         {
             set_test_value(offset);
         }
 
-        return node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset);
+        return node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset);
     }
 
     // DocString: op_node_is_nan
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/absolute_value.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/absolute_value.cpp
index dc5f96b010c480acb4f2d6ce2ae07ebc1a1158a3..8807bb2b38567050846e00dc29208fa0ced00104 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/absolute_value.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/absolute_value.cpp
@@ -66,14 +66,12 @@ void AbsNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_lea
 void AbsNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::abs(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::abs(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::abs(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::abs(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void AbsNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::abs(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::abs(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/absolute_value.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/absolute_value.hpp
index 82de5a0fd1c76bcc77aab5215f973b949f74d29b..25f3cd9dcc9e3df0265a0ddfae3917fdaeb4462a 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/absolute_value.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs/absolute_value.hpp
@@ -86,7 +86,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: abs_node_set_test_value
     /**
@@ -94,7 +94,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: abs_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/absolute_difference.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/absolute_difference.cpp
index 91f8054fbeae5291534c2ad4c6df93611497a53c..7ec232c96023c58e0d990f2d3e67822d955be527 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/absolute_difference.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/absolute_difference.cpp
@@ -87,14 +87,12 @@ void AbsDiffNode::update_div_mult_leaves(std::map<std::string, double>& div_mult
 void AbsDiffNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::abs_diff(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::abs_diff(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::abs_diff(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::abs_diff(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void AbsDiffNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::abs_diff(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), _feats[1]->test_value_ptr(offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::abs_diff(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), _feats[1]->test_value_ptr(2 * offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/absolute_difference.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/absolute_difference.hpp
index 68a2ebc967d0e2d0aee26307faec89431f213b9b..330c7512b5896961e72797919bdfe942b2dd24f7 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/absolute_difference.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/abs_diff/absolute_difference.hpp
@@ -89,7 +89,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: abs_diff_node_set_test_value
     /**
@@ -97,7 +97,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: abs_diff_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/add.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/add.cpp
index e885764f5b90c3ce853145209d4e50535362bc28..dca9855669821a182a820c4969d717d043232db2 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/add.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/add.cpp
@@ -80,14 +80,12 @@ void AddNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_lea
 void AddNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::add(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::add(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::add(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::add(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void AddNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::add(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), _feats[1]->test_value_ptr(offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::add(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), _feats[1]->test_value_ptr(2 * offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/add.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/add.hpp
index c9e1842fadc99d16c8b4411b1a4d7711706fa038..3b3ca2faa5d8d4ab68bbc7aff020c663dbea9278 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/add.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/add/add.hpp
@@ -86,7 +86,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: add_node_set_test_value
     /**
@@ -94,7 +94,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: add_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/cube.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/cube.cpp
index 2db055bc28236bbbeb1a2b4b2cdb181ac5103e29..1a849f02fdf0341082cbea93c36c4febcecb491e 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/cube.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/cube.cpp
@@ -56,13 +56,11 @@ void CbNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_leav
 void CbNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::cb(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::cb(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::cb(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::cb(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 void CbNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::cb(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::cb(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/cube.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/cube.hpp
index e6ac61dd57712ab7fe3b94c1aaa9ac9fe78139ae..ecb49fa79cea512a1c251f617665075ffc989f35 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/cube.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cb/cube.hpp
@@ -84,7 +84,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: cb_node_set_test_value
     /**
@@ -92,7 +92,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: cb_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/cube_root.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/cube_root.cpp
index bb999ff82d07534d4a47de31c0a910f4b3e3ddd5..49a05fe909dd83c090a21ff93b4df3427dd9f922 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/cube_root.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/cube_root.cpp
@@ -55,14 +55,12 @@ void CbrtNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_le
 void CbrtNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::cbrt(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::cbrt(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::cbrt(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::cbrt(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void CbrtNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::cbrt(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::cbrt(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/cube_root.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/cube_root.hpp
index 0803b7cd2a41a90d8cbd21bd2b5773372ea1bbf3..e0284b3ca8bd5848f832e705137c1e5e4806d7d1 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/cube_root.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cbrt/cube_root.hpp
@@ -84,7 +84,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: cbrt_node_set_test_value
     /**
@@ -92,7 +92,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: cbrt_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/cos.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/cos.cpp
index 3ea3cf7ae0b3688ee223f455069dda6b680295ec..0cac2682551421e819dfebfa7064877b5458650c 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/cos.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/cos.cpp
@@ -61,14 +61,12 @@ void CosNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_lea
 void CosNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::cos(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::cos(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::cos(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::cos(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void CosNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::cos(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::cos(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/cos.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/cos.hpp
index 20cdf7fdbf08ab095baf43a3abe9527e4de5c656..523cb11b04e15f761ac9236eb002168266cb7130 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/cos.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/cos/cos.hpp
@@ -84,7 +84,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: cos_node_set_test_value
     /**
@@ -92,7 +92,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: cos_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/divide.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/divide.cpp
index 6ca45a438207aca79313f4352339778d241ff69b..f4a0e005ec6643c17be8fb2838dadbb88b52d2d7 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/divide.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/divide.cpp
@@ -81,14 +81,12 @@ void DivNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_lea
 void DivNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::div(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::div(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::div(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::div(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void DivNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::div(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), _feats[1]->test_value_ptr(offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::div(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), _feats[1]->test_value_ptr(2 * offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/divide.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/divide.hpp
index 52b9c79afc2422d86f6ff4c83bbd16637c7381bb..e5ef547b66ba04ab11a0de516b8136684ac363b6 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/divide.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/div/divide.hpp
@@ -86,7 +86,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: div_node_set_test_value
     /**
@@ -94,7 +94,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: div_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/exponential.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/exponential.cpp
index 6c1c01ea6b9c4721f6707bf2e547a3dde99b6c18..d844a60fe62adeafcce09794af9ccee5ce719649 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/exponential.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/exponential.cpp
@@ -63,14 +63,12 @@ void ExpNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_lea
 void ExpNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::exp(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::exp(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::exp(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::exp(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void ExpNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::exp(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::exp(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/exponential.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/exponential.hpp
index f87c9ce917a460fb948c4d403e1d31f4a1797f83..2d17a56735a21073ee735ff624796ab6ca01d37a 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/exponential.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/exp/exponential.hpp
@@ -84,7 +84,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: exp_node_set_test_value
     /**
@@ -92,7 +92,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: exp_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/inverse.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/inverse.cpp
index 1177493ec98ffdd6015c644719e7deef8935cd5b..aed5c35ec428269dc275f57e97147351a8472b4a 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/inverse.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/inverse.cpp
@@ -56,14 +56,12 @@ void InvNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_lea
 void InvNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::inv(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::inv(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::inv(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::inv(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void InvNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::inv(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::inv(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/inverse.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/inverse.hpp
index c6a7f3705a5ff1dce72eb431c1104eb356517a58..05c455e4b2ee0d668b4db1510546e11830ee81ac 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/inverse.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/inv/inverse.hpp
@@ -72,7 +72,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: inv_node_set_test_value
     /**
@@ -80,7 +80,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: inv_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/log.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/log.cpp
index 997a7d85bd5293ac1caae794d6fff831bbecf763..0343bbd2243e3da70051aee4cf7eae73c839c743 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/log.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/log.cpp
@@ -64,14 +64,12 @@ void LogNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_lea
 void LogNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::log(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::log(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::log(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::log(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void LogNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::log(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::log(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/log.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/log.hpp
index 92b61d4e92d7db7d6dbec9b001ad255857d79e0a..d21bc141d00704ec769197789bca87b049d3b37e 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/log.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/log/log.hpp
@@ -84,7 +84,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: log_node_set_test_value
     /**
@@ -92,7 +92,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: log_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/multiply.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/multiply.cpp
index 3e78a6fc1028d978bd9af939d9d25fc47276333f..2641379ba3fc7231cdfb63f2ae90d1def6dfc8a0 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/multiply.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/multiply.cpp
@@ -81,14 +81,12 @@ void MultNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_le
 void MultNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::mult(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::mult(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::mult(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::mult(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void MultNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::mult(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), _feats[1]->test_value_ptr(offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::mult(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), _feats[1]->test_value_ptr(2 * offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/multiply.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/multiply.hpp
index 42c06473e4070b675bf93d320430a9dfebb63dd9..b6c73ff72365365bf407d4c92eac457961f928c6 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/multiply.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/mult/multiply.hpp
@@ -87,7 +87,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: mult_node_set_test_value
     /**
@@ -95,7 +95,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: mult_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/negative_exponential.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/negative_exponential.cpp
index cdaebd91d3010ee7eef4fac4add8a77baa19caa6..1ba3d169d80be38e2cbd85536d8dae33cea9bb2e 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/negative_exponential.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/negative_exponential.cpp
@@ -64,14 +64,12 @@ void NegExpNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_
 void NegExpNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::neg_exp(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::neg_exp(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::neg_exp(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::neg_exp(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void NegExpNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::neg_exp(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::neg_exp(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/negative_exponential.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/negative_exponential.hpp
index 8175f0c80547b0098abe73005c38a60676608d27..24880adffa8ff1e0f87867df5ded08aa14fec59c 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/negative_exponential.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/neg_exp/negative_exponential.hpp
@@ -85,7 +85,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: neg_exp_node_set_test_value
     /**
@@ -93,7 +93,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: neg_exp_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/sin.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/sin.cpp
index d503053f2d1808b34e4f908caba603d0bc8986bf..1214263b275ba698bd2ac572f7893fed9b76995f 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/sin.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/sin.cpp
@@ -61,14 +61,12 @@ void SinNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_lea
 void SinNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::sin(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::sin(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sin(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sin(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void SinNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sin(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sin(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/sin.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/sin.hpp
index 0d7f66a4acc3fef12ab9a7f6f186c0e5ac51e954..3ad4f3de86d584db3462b28111f97483cbd9b108 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/sin.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sin/sin.hpp
@@ -85,7 +85,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: sin_node_set_test_value
     /**
@@ -93,7 +93,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: sin_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sp/sixth_power.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sp/sixth_power.cpp
index 7dd1f6b2d53879943e15aaf6dadd1cecd48231e7..3633e45675eb37407902444ce8236ec1693d5eed 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sp/sixth_power.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sp/sixth_power.cpp
@@ -52,14 +52,12 @@ void SixPowNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_
 void SixPowNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::sixth_pow(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::sixth_pow(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sixth_pow(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sixth_pow(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void SixPowNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sixth_pow(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sixth_pow(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sp/sixth_power.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sp/sixth_power.hpp
index 8c940862178b0acf354a745e6eee20fdbba066d3..524bc61d10591aefc426cc1fcacbc40fa1e3fce7 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sp/sixth_power.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sp/sixth_power.hpp
@@ -85,7 +85,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: six_pow_node_set_test_value
     /**
@@ -93,7 +93,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: six_pow_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/square.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/square.cpp
index 249e6f92b48f17c52e24597872a9b8a4269bd70d..62d6ae37596dd4645684f206632ec3d30eb3df22 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/square.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/square.cpp
@@ -53,14 +53,12 @@ void SqNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_leav
 void SqNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::sq(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::sq(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sq(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sq(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void SqNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sq(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sq(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/square.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/square.hpp
index ee67280aa7ed99a647d85cfc3b8839be36c9a0a7..b2e0097b479505504e43da06d9d8ce9d1ef015a4 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/square.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sq/square.hpp
@@ -84,7 +84,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: sq_node_set_test_value
     /**
@@ -92,7 +92,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: sq_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/square_root.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/square_root.cpp
index ea0fc8694e9a83af93af7be8da54101362fd45be..b549f3d5f17b1380dbd5acff534bd346d1953232 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/square_root.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/square_root.cpp
@@ -53,14 +53,12 @@ void SqrtNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_le
 void SqrtNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::sqrt(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::sqrt(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sqrt(_n_samp, _feats[0]->value_ptr(offset + 2), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sqrt(_n_samp, _feats[0]->value_ptr(2 * offset), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void SqrtNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sqrt(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sqrt(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/square_root.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/square_root.hpp
index 2ecb1d4b26ac35293d24eba70354af8f00c8df6c..fb89ad2778fb60062dceb09aa133b2a6bf9c6904 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/square_root.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sqrt/square_root.hpp
@@ -85,7 +85,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: sqrt_node_set_test_value
     /**
@@ -93,7 +93,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: sqrt_node_rung
     /**
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/subtract.cpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/subtract.cpp
index a338297a39a3960e2ebabb93ef6b94eb1bb9ed1d..eae864d3778ab96abab73627b80ee4c84073b8da 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/subtract.cpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/subtract.cpp
@@ -80,14 +80,12 @@ void SubNode::update_div_mult_leaves(std::map<std::string, double>& div_mult_lea
 void SubNode::set_value(int offset)
 {
     if(_selected)
-        allowed_op_funcs::sub(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
+        allowed_op_funcs::sub(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_d_matrix_ptr(_d_mat_ind));
 
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sub(_n_samp, _feats[0]->value_ptr(offset + 2), _feats[1]->value_ptr(offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sub(_n_samp, _feats[0]->value_ptr(2 * offset), _feats[1]->value_ptr(2 * offset + 1), node_value_arrs::get_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
 
 void SubNode::set_test_value(int offset)
 {
-    offset = (offset == -1) ? rung() : offset;
-    allowed_op_funcs::sub(_n_test_samp, _feats[0]->test_value_ptr(offset + 2), _feats[1]->test_value_ptr(offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, offset));
+    allowed_op_funcs::sub(_n_test_samp, _feats[0]->test_value_ptr(2 * offset), _feats[1]->test_value_ptr(2 * offset + 1), node_value_arrs::get_test_value_ptr(_arr_ind, _feat_ind, rung(), offset));
 }
diff --git a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/subtract.hpp b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/subtract.hpp
index fff6a8775fe2378314d3027c8785834832904636..54dc07b03ccd860d73b8b6a4ec0ab550c842c1dc 100644
--- a/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/subtract.hpp
+++ b/src/feature_creation/node/operator_nodes/allowed_operator_nodes/sub/subtract.hpp
@@ -87,7 +87,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_value(int offset = -1);
+    void set_value(int offset=0);
 
     // DocString: sub_node_set_test_value
     /**
@@ -95,7 +95,7 @@ public:
      *
      * @param offset(int) Key to determine which part of the temporary storage array to look into
      */
-    void set_test_value(int offset = -1);
+    void set_test_value(int offset=0);
 
     // DocString: sub_node_rung
     /**
diff --git a/src/feature_creation/node/value_storage/nodes_value_containers.cpp b/src/feature_creation/node/value_storage/nodes_value_containers.cpp
index c0c0e1255d51660db6d51e2564cf312c2d3ea0d4..69eb30249e360034d54e7406409cd6fab5d4a397 100644
--- a/src/feature_creation/node/value_storage/nodes_value_containers.cpp
+++ b/src/feature_creation/node/value_storage/nodes_value_containers.cpp
@@ -23,6 +23,12 @@ std::vector<double> node_value_arrs::TEMP_STORAGE_TEST_ARR;
 
 void node_value_arrs::initialize_values_arr(int n_samples, int n_samples_test, int n_primary_feat, int max_rung, bool set_task_sz)
 {
+    if(max_rung < 0)
+        throw std::logic_error("Maximum rung of the features is less than 0");
+
+    if(max_rung == 0)
+        std::cerr << "Warning requested calculation has a maximum rung of 0" << std::endl;
+
     if(set_task_sz)
         TASK_SZ_TRAIN = {n_samples};
 
@@ -76,6 +82,9 @@ void node_value_arrs::set_task_sz_test(std::vector<int> task_sz_test)
 
 void node_value_arrs::resize_values_arr(int n_dims, unsigned long int n_feat, bool use_temp)
 {
+    if(n_dims > MAX_RUNG)
+        throw std::logic_error("Requested rung is larger MAX_RUNG.");
+
     N_RUNGS_STORED = n_dims;
     N_STORE_FEATURES = n_feat;
     if(N_STORE_FEATURES == 0)
@@ -113,22 +122,24 @@ void node_value_arrs::resize_values_arr(int n_dims, unsigned long int n_feat, bo
     }
 }
 
-double* node_value_arrs::get_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int offset)
+double* node_value_arrs::get_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int rung, int offset)
 {
     if(arr_ind < N_STORE_FEATURES)
         return  access_value_arr(arr_ind);
+    int op_slot = get_op_slot(rung, offset);
 
-    temp_storage_reg(arr_ind, offset) = feat_ind;
-    return access_temp_storage((arr_ind % N_STORE_FEATURES) + (offset % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1));
+    temp_storage_reg(arr_ind, op_slot) = feat_ind;
+    return access_temp_storage((arr_ind % N_STORE_FEATURES) + (op_slot % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1));
 }
 
-double* node_value_arrs::get_test_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int offset)
+double* node_value_arrs::get_test_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int rung, int offset)
 {
     if(arr_ind < N_STORE_FEATURES)
         return  access_test_value_arr(arr_ind);
+    int op_slot = get_op_slot(rung, offset);
 
-    temp_storage_test_reg(arr_ind, offset) = feat_ind;
-    return access_temp_storage_test((arr_ind % N_STORE_FEATURES) + (offset % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1));
+    temp_storage_test_reg(arr_ind, op_slot) = feat_ind;
+    return access_temp_storage_test((arr_ind % N_STORE_FEATURES) + (op_slot % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1));
 }
 
 void node_value_arrs::initialize_d_matrix_arr()
diff --git a/src/feature_creation/node/value_storage/nodes_value_containers.hpp b/src/feature_creation/node/value_storage/nodes_value_containers.hpp
index 39f1572a86889039455873f8baa39366507f9b46..4a2f088113559a059277c3a4dbc1161173dc139e 100644
--- a/src/feature_creation/node/value_storage/nodes_value_containers.hpp
+++ b/src/feature_creation/node/value_storage/nodes_value_containers.hpp
@@ -54,19 +54,6 @@ namespace node_value_arrs
      */
     void initialize_values_arr(int n_samples, int n_samples_test, int n_primary_feat, int max_rung, bool et_task_sz);
 
-    /**
-     * @brief Initialize the node value arrays
-     * @details Using the size of the initial feature space constructor the storage arrays
-     *
-     * @param n_samples Number of training samples for each feature
-     * @param n_samples_test Number of test samples for each feature
-     * @param n_primary_feat Number of primary features
-     */
-    inline void initialize_values_arr(int n_samples, int n_samples_test, int n_primary_feat)
-    {
-        initialize_values_arr(n_samples, n_samples_test, n_primary_feat, 0, true);
-    }
-
     /**
      * @brief Initialize the node value arrays
      * @details Using the size of the initial feature space constructor the storage arrays
@@ -90,7 +77,7 @@ namespace node_value_arrs
      * @param n_primary_feat Number of primary features
      * @param max_rung Largest rung of a feature
      */
-    void initialize_values_arr(std::vector<int> task_sz_train, std::vector<int> task_sz_test, int n_primary_feat, int max_rung=0);
+    void initialize_values_arr(std::vector<int> task_sz_train, std::vector<int> task_sz_test, int n_primary_feat, int max_rung);
 
     /**
      * @brief Resize the node value arrays
@@ -131,25 +118,57 @@ namespace node_value_arrs
      */
     void set_task_sz_test(std::vector<int> task_sz_test);
 
+    /**
+     * @brief Get the operator slot associated with a given rung/offset
+     *
+     * @param rung Rung of the feature
+     * @param offset Offset used to prevent overwrites
+     *
+     * @return The operator slot to use
+     */
+    inline int get_op_slot(int rung, int offset){return std::abs(N_OP_SLOTS - static_cast<int>(std::pow(2, MAX_RUNG - rung)) - offset);}
+
+    /**
+     * @brief Get a reference slot/feature register of the training data
+     *
+     * @param ind The Node's arr_ind
+     * @param op_slot(int) Offset integer for TEMP_STORE_ARRAY
+     *
+     * @return The register element for a given feature index and op_slot
+     */
+    inline int& temp_storage_reg(unsigned long int ind, int op_slot = 0){return TEMP_STORAGE_REG[(ind % N_STORE_FEATURES) + (op_slot % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1)];}
+
+    /**
+     * @brief Get a reference slot/feature register of the test data
+     *
+     * @param ind The Node's arr_ind
+     * @param op_slot(int) Offset integer for TEMP_STORE_TEST_ARRAY
+     *
+     * @return The register element for a given feature index and op_slot
+     */
+    inline int& temp_storage_test_reg(unsigned long int ind, int op_slot = 0){return TEMP_STORAGE_TEST_REG[(ind % N_STORE_FEATURES) + (op_slot % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1)];}
+
     /**
      * @brief Get a reference slot/feature register of the training data
      *
      * @param ind The Node's arr_ind
-     * @param offset(int) Offset integer for TEMP_STORE_ARRAY
+     * @param rung Rung of the feature
+     * @param offset Offset used to prevent overwrites
      *
      * @return The register element for a given feature index and offset
      */
-    inline int& temp_storage_reg(unsigned long int ind, int offset = 0){return TEMP_STORAGE_REG[(ind % N_STORE_FEATURES) + (offset % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1)];}
+    inline int& temp_storage_reg(unsigned long int ind, int rung, int offset){return TEMP_STORAGE_REG[(ind % N_STORE_FEATURES) + (get_op_slot(rung, offset) % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1)];}
 
     /**
      * @brief Get a reference slot/feature register of the test data
      *
      * @param ind The Node's arr_ind
-     * @param offset(int) Offset integer for TEMP_STORE_TEST_ARRAY
+     * @param rung Rung of the feature
+     * @param offset Offset used to prevent overwrites
      *
      * @return The register element for a given feature index and offset
      */
-    inline int& temp_storage_test_reg(unsigned long int ind, int offset = 0){return TEMP_STORAGE_TEST_REG[(ind % N_STORE_FEATURES) + (offset % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1)];}
+    inline int& temp_storage_test_reg(unsigned long int ind, int rung, int offset){return TEMP_STORAGE_TEST_REG[(ind % N_STORE_FEATURES) + (get_op_slot(rung, offset) % N_OP_SLOTS) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * N_OP_SLOTS + 1)];}
 
     /**
      * @brief Access element of the permanent training data storage array
@@ -196,7 +215,7 @@ namespace node_value_arrs
      *
      * @return The value pointer
      */
-    double* get_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int offset = 0);
+    double* get_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int rung = 0, int offset = 0);
 
     /**
      * @brief Get a Node's test_value_ptr
@@ -207,7 +226,7 @@ namespace node_value_arrs
      *
      * @return The value pointer
      */
-    double* get_test_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int offset = 0);
+    double* get_test_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int rung = 0, int offset = 0);
 
     /**
      * @brief Get the pointer to a particular selected Node from sis
@@ -230,7 +249,7 @@ namespace node_value_arrs
      * @brief Flush the temporary storage register (training data)
      * @details Reset all slots in the register to -1
      */
-    inline void clear_temp_reg_thread(){std::fill_n(TEMP_STORAGE_REG.data() + N_STORE_FEATURES * 3 * omp_get_thread_num(), N_STORE_FEATURES * 3, -1);}
+    inline void clear_temp_reg_thread(){std::fill_n(TEMP_STORAGE_REG.data() + N_STORE_FEATURES * N_OP_SLOTS * omp_get_thread_num(), N_STORE_FEATURES * N_OP_SLOTS, -1);}
 
     /**
      * @brief Flush the temporary storage register (test data)
diff --git a/src/python/__init__.py b/src/python/__init__.py
index 46cee8168adacfe21493b014cfa226907cd69fdc..05479679c098285142aa6146ae4c667eac547a8e 100644
--- a/src/python/__init__.py
+++ b/src/python/__init__.py
@@ -53,7 +53,13 @@ def get_unit(header):
 
 
 def generate_phi_0_from_csv(
-    df, prop_key, cols="all", task_key=None, leave_out_frac=0.0, leave_out_inds=None
+    df,
+    prop_key,
+    cols="all",
+    task_key=None,
+    leave_out_frac=0.0,
+    leave_out_inds=None,
+    max_rung=None,
 ):
     """Create initial feature set from csv file
 
@@ -63,6 +69,7 @@ def generate_phi_0_from_csv(
         cols (list or str): The columns to include in the initial feature set
         task_key (str): The key corresponding to which column in the csv file the task differentiation is stored in
         leave_out_frac (list): List of indices to pull from the training data to act as a test set
+        max_rung (int): Maximum rung of a feature
 
     Returns:
         phi_0 (list of FeatureNodes): The list of primary features
@@ -73,6 +80,8 @@ def generate_phi_0_from_csv(
         leave_out_frac (float): Fraction of samples to leave out
         leave_out_inds (list): Indices to use as the test set
     """
+    if not max_rung:
+        raise ValueError("Maximum rung for the calculation is not defined.")
 
     # Load csv file
     if isinstance(df, str):
@@ -166,7 +175,7 @@ def generate_phi_0_from_csv(
     exprs = list([col.split("(")[0] for col in columns])
     units = list([get_unit(col) for col in columns])
 
-    initialize_values_arr(len(train_inds), len(leave_out_inds), len(columns))
+    initialize_values_arr(len(train_inds), len(leave_out_inds), len(columns), max_rung)
 
     test_values = df.to_numpy().T[:, leave_out_inds]
     values = df.to_numpy().T[:, train_inds]
@@ -295,6 +304,7 @@ def generate_fs_sr_from_csv(
         task_key=task_key,
         leave_out_frac=leave_out_frac,
         leave_out_inds=leave_out_inds,
+        max_rung=max_phi,
     )
 
     fs = generate_fs(
diff --git a/src/python/bindings_docstring_keyed.cpp b/src/python/bindings_docstring_keyed.cpp
index 32d5e90c14eca4a8f94f65640e8e720f5b9322d5..e2677c9c9f3a31567db39f3f46ca5dd20d44276f 100644
--- a/src/python/bindings_docstring_keyed.cpp
+++ b/src/python/bindings_docstring_keyed.cpp
@@ -37,7 +37,7 @@ void sisso::register_all()
     sisso::feature_creation::node::registerSqrtNode();
     sisso::feature_creation::node::registerSixPowNode();
 
-    void (*init_val_ar)(int, int, int) = &node_value_arrs::initialize_values_arr;
+    void (*init_val_ar)(int, int, int, int) = &node_value_arrs::initialize_values_arr;
 
     def("phi_selected_from_file", &str2node::phi_selected_from_file_py);
     def("initialize_values_arr", init_val_ar);
diff --git a/src/python/bindings_docstring_keyed.hpp b/src/python/bindings_docstring_keyed.hpp
index cee1f5b826787070c9818cd35aeafebc9b49fbee..1687d8074afc0f9a7ce48cdeedef87571709c914 100644
--- a/src/python/bindings_docstring_keyed.hpp
+++ b/src/python/bindings_docstring_keyed.hpp
@@ -42,10 +42,10 @@ namespace sisso
                 inline Unit unit(){return this->get_override("unit")();}
                 inline std::vector<double> value(){return this->get_override("value")();}
                 inline std::vector<double> test_value(){return this->get_override("test_value")();}
-                inline void set_value(int offset = -1){this->get_override("set_value")();}
-                inline double* value_ptr(int offset = -1){return this->get_override("value_ptr")();}
-                inline void set_test_value(int offset = -1){this->get_override("set_test_value")();}
-                inline double* test_value_ptr(int offset = -1){return this->get_override("test_value_ptr")();}
+                inline void set_value(int offset=0){this->get_override("set_value")();}
+                inline double* value_ptr(int offset=0){return this->get_override("value_ptr")();}
+                inline void set_test_value(int offset=0){this->get_override("set_test_value")();}
+                inline double* test_value_ptr(int offset=0){return this->get_override("test_value_ptr")();}
                 inline bool is_nan(){return this->get_override("is_nan")();}
                 inline bool is_const(){return this->get_override("is_const")();}
                 inline NODE_TYPE type(){return this->get_override("type")();}
@@ -65,8 +65,8 @@ namespace sisso
             template<int N>
             struct OperatorNodeWrap : OperatorNode<N>, py::wrapper<OperatorNode<N>>
             {
-                inline void set_value(int offset = -1){this->get_override("set_value")();}
-                inline void set_test_value(int offset = -1){this->get_override("set_test_value")();}
+                inline void set_value(int offset=0){this->get_override("set_value")();}
+                inline void set_test_value(int offset=0){this->get_override("set_test_value")();}
                 inline NODE_TYPE type(){return this->get_override("type")();}
                 inline int rung(int cur_rung = 0){return this->get_override("rung")();}
                 inline std::string expr(){return this->get_override("expr")();}
diff --git a/src/python/feature_creation/FeatureNode.cpp b/src/python/feature_creation/FeatureNode.cpp
index 6b23ab7edf5dca5ede8cc0484f7d8ad176d33fa0..81229abe5c77cf033687405f0ad467372d73025a 100644
--- a/src/python/feature_creation/FeatureNode.cpp
+++ b/src/python/feature_creation/FeatureNode.cpp
@@ -9,7 +9,7 @@ FeatureNode::FeatureNode(unsigned long int feat_ind, std::string expr, np::ndarr
 {
     // Automatically resize the storage arrays
     if(node_value_arrs::N_STORE_FEATURES == 0)
-        node_value_arrs::initialize_values_arr(_n_samp, _n_test_samp, 1);
+        node_value_arrs::initialize_values_arr(_n_samp, _n_test_samp, 1, 0);
     else if((_n_samp != node_value_arrs::N_SAMPLES) || (_n_test_samp != node_value_arrs::N_SAMPLES_TEST))
         throw std::logic_error("Number of samples in current feature is not the same as the others, (" + std::to_string(_n_samp) + " and " + std::to_string(_n_test_samp) + " vs. "  + std::to_string(node_value_arrs::N_SAMPLES) + " and " + std::to_string(node_value_arrs::N_SAMPLES_TEST) + ")");
     else if(feat_ind >= node_value_arrs::N_STORE_FEATURES)
@@ -29,7 +29,7 @@ FeatureNode::FeatureNode(unsigned long int feat_ind, std::string expr, py::list
 
     // Automatically resize the storage arrays
     if(node_value_arrs::N_STORE_FEATURES == 0)
-        node_value_arrs::initialize_values_arr(_n_samp, _n_test_samp, 1);
+        node_value_arrs::initialize_values_arr(_n_samp, _n_test_samp, 1, 0);
     else if((_n_samp != node_value_arrs::N_SAMPLES) || (_n_test_samp != node_value_arrs::N_SAMPLES_TEST))
         throw std::logic_error("Number of samples in current feature is not the same as the others, (" + std::to_string(_n_samp) + " and " + std::to_string(_n_test_samp) + " vs. "  + std::to_string(node_value_arrs::N_SAMPLES) + " and " + std::to_string(node_value_arrs::N_SAMPLES_TEST) + ")");
     else if(feat_ind >= node_value_arrs::N_STORE_FEATURES)
diff --git a/src/python/feature_creation/FeatureSpace.cpp b/src/python/feature_creation/FeatureSpace.cpp
index 11fe0d00b3b8775158bd06aa7b93e068c89559e0..a1aa8e84fa342e2cd5082339af15e3790bdabc4d 100644
--- a/src/python/feature_creation/FeatureSpace.cpp
+++ b/src/python/feature_creation/FeatureSpace.cpp
@@ -121,6 +121,7 @@ FeatureSpace::FeatureSpace(
 
     std::vector<int> rung_inds = util_funcs::argsort(rungs);
     _max_phi = *std::max_element(rungs.begin(), rungs.end());
+    node_value_arrs::MAX_RUNG = _max_phi;
     _phi[0] = phi_temp[rung_inds[0]];
     for(int ff = 1; ff < _n_feat; ++ff)
     {