diff --git a/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc b/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc
index ef1ca360a3eaf83b9c0ceedfc779cf63b5720108..6beaf8e83fff889e588949e21a2bef40f384652d 100644
--- a/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc
+++ b/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc
@@ -27,20 +27,20 @@ namespace
             node_value_arrs::initialize_d_matrix_arr();
             mpi_setup::init_mpi_env();
 
-            node_value_arrs::initialize_values_arr(80, 20, 2, 2, true, false);
-
             std::vector<int> task_sizes_train = {80};
             std::vector<int> task_sizes_test = {20};
 
-            std::vector<std::string> sample_ids_train(80);
-            for(int ii = 0; ii < 80; ++ii)
+            node_value_arrs::initialize_values_arr(task_sizes_train, task_sizes_test, 2, 2, false);
+
+            std::vector<std::string> sample_ids_train(task_sizes_train[0]);
+            for(int ii = 0; ii < task_sizes_train[0]; ++ii)
             {
                 sample_ids_train[ii] = std::to_string(ii);
             }
 
-            std::vector<std::string> sample_ids_test(20);
-            std::vector<int> leave_out_inds(20);
-            for(int ii = 0; ii < 20; ++ii)
+            std::vector<std::string> sample_ids_test(task_sizes_test[0]);
+            std::vector<int> leave_out_inds(task_sizes_test[0]);
+            for(int ii = 0; ii < task_sizes_test[0]; ++ii)
             {
                 sample_ids_test[ii] = std::to_string(ii);
                 leave_out_inds[ii] = ii;
@@ -48,11 +48,11 @@ namespace
 
             std::vector<std::string> task_names = {"all"};
 
-            std::vector<double> value_1(80, 0.0);
-            std::vector<double> value_2(80, 0.0);
+            std::vector<double> value_1(task_sizes_train[0], 0.0);
+            std::vector<double> value_2(task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(20, 0.0);
-            std::vector<double> test_value_2(20, 0.0);
+            std::vector<double> test_value_1(task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_12_pos(1.0, 2.0);
@@ -107,8 +107,8 @@ namespace
             FeatureNode feat_1(0, "A", value_1, test_value_1, Unit("m"));
             FeatureNode feat_2(1, "B", value_2, test_value_2, Unit("m"));
 
-            std::vector<double> prop = std::vector<double>(80, 0.0);
-            std::vector<double> prop_test = std::vector<double>(20, 0.0);
+            std::vector<double> prop = std::vector<double>(task_sizes_train[0], 0.0);
+            std::vector<double> prop_test = std::vector<double>(task_sizes_test[0], 0.0);
 
             std::fill_n(prop.begin() + 20, 20, 1.0);
             std::fill_n(prop.begin() + 40, 20, 2.0);
diff --git a/tests/googletest/descriptor_identification/solver/test_sisso_log_regressor.cc b/tests/googletest/descriptor_identification/solver/test_sisso_log_regressor.cc
index 9162bebb395b455b365bff894b6dc8d8fbf35fe6..35995fcb574b8abb6fcec474d795792f6e7958e3 100644
--- a/tests/googletest/descriptor_identification/solver/test_sisso_log_regressor.cc
+++ b/tests/googletest/descriptor_identification/solver/test_sisso_log_regressor.cc
@@ -27,45 +27,46 @@ namespace
             node_value_arrs::initialize_d_matrix_arr();
             mpi_setup::init_mpi_env();
 
-            node_value_arrs::initialize_values_arr(90, 10, 3, 2, true, false);
-
             std::vector<int> task_sizes_train = {90};
             std::vector<int> task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(task_sizes_train, task_sizes_test, 3, 2, false);
+
             std::vector<int> leave_out_inds = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
             std::vector<std::string> task_names = {"all"};
-            std::vector<std::string> sample_ids_train(90);
-            for(int ii = 0; ii < 90; ++ii)
+            std::vector<std::string> sample_ids_train(task_sizes_train[0]);
+            for(int ii = 0; ii < task_sizes_train[0]; ++ii)
             {
                 sample_ids_train[ii] = std::to_string(ii);
             }
 
-            std::vector<std::string> sample_ids_test(10);
-            for(int ii = 0; ii < 10; ++ii)
+            std::vector<std::string> sample_ids_test(task_sizes_test[0]);
+            for(int ii = 0; ii < task_sizes_test[0]; ++ii)
             {
                 sample_ids_test[ii] = std::to_string(ii);
             }
 
-            std::vector<double> value_1(90, 0.0);
-            std::vector<double> value_2(90, 0.0);
-            std::vector<double> value_3(90, 0.0);
+            std::vector<double> value_1(task_sizes_train[0], 0.0);
+            std::vector<double> value_2(task_sizes_train[0], 0.0);
+            std::vector<double> value_3(task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
-            std::vector<double> test_value_3(10, 0.0);
+            std::vector<double> test_value_1(task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(task_sizes_test[0], 0.0);
+            std::vector<double> test_value_3(task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(0.01, 100.0);
             std::uniform_real_distribution<double> distribution_params(0.9, 1.1);
 
-            for(int ii = 0; ii < 90; ++ii)
+            for(int ii = 0; ii < task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = distribution_feats(generator);
                 value_3[ii] = distribution_feats(generator);
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = distribution_feats(generator);
@@ -82,16 +83,16 @@ namespace
             double a10 = distribution_params(generator);
             double c00 = distribution_feats(generator);
 
-            _prop = std::vector<double>(90, 0.0);
+            _prop = std::vector<double>(task_sizes_train[0], 0.0);
             std::transform(value_1.begin(), value_1.end(), value_2.begin(), _prop.begin(), [&c00, &a00, &a10](double v1, double v2){return c00 * std::pow(v1 * v1, a00) * std::pow(v2, a10);});
 
-            _prop_test = std::vector<double>(10, 0.0);
+            _prop_test = std::vector<double>(task_sizes_test[0], 0.0);
             std::transform(test_value_1.begin(), test_value_1.end(), test_value_2.begin(), _prop_test.begin(), [&c00, &a00, &a10](double v1, double v2){return c00 * std::pow(v1 * v1, a00) * std::pow(v2, a10);});
 
-            _prop_zero_int = std::vector<double>(90, 0.0);
+            _prop_zero_int = std::vector<double>(task_sizes_train[0], 0.0);
             std::transform(value_1.begin(), value_1.end(), value_2.begin(), _prop_zero_int.begin(), [&a00, &a10](double v1, double v2){return std::pow(v1 * v1, a00) * std::pow(v2, a10);});
 
-            _prop_test_zero_int = std::vector<double>(10, 0.0);
+            _prop_test_zero_int = std::vector<double>(task_sizes_test[0], 0.0);
             std::transform(test_value_1.begin(), test_value_1.end(), test_value_2.begin(), _prop_test_zero_int.begin(), [&a00, &a10](double v1, double v2){return std::pow(v1 * v1, a00) * std::pow(v2, a10);});
 
             std::vector<std::string> allowed_ops = {"div", "add", "mult", "sub"};
diff --git a/tests/googletest/descriptor_identification/solver/test_sisso_regressor.cc b/tests/googletest/descriptor_identification/solver/test_sisso_regressor.cc
index c8c99816a71dca93c7a535c94a48ef23a3c687d4..03cdd564a9e1e7aa289208967d0e4b9bb5c5141c 100644
--- a/tests/googletest/descriptor_identification/solver/test_sisso_regressor.cc
+++ b/tests/googletest/descriptor_identification/solver/test_sisso_regressor.cc
@@ -27,44 +27,48 @@ namespace
             node_value_arrs::initialize_d_matrix_arr();
             mpi_setup::init_mpi_env();
 
-            node_value_arrs::initialize_values_arr(90, 10, 3, 2, true, false);
-
             std::vector<int> task_sizes_train = {36, 54};
             std::vector<int> task_sizes_test = {4, 6};
+
+            int n_samp_train = std::accumulate(task_sizes_train.begin(), task_sizes_train.end(), 0);
+            int n_samp_test = std::accumulate(task_sizes_test.begin(), task_sizes_test.end(), 0);
+
+            node_value_arrs::initialize_values_arr(task_sizes_train, task_sizes_test, 3, 2, false);
+
             std::vector<int> leave_out_inds = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
-            std::vector<std::string> sample_ids_train(90);
-            for(int ii = 0; ii < 90; ++ii)
+            std::vector<std::string> sample_ids_train(n_samp_train);
+            for(int ii = 0; ii < n_samp_train; ++ii)
             {
                 sample_ids_train[ii] = std::to_string(ii);
             }
 
-            std::vector<std::string> sample_ids_test(10);
-            for(int ii = 0; ii < 10; ++ii)
+            std::vector<std::string> sample_ids_test(n_samp_test);
+            for(int ii = 0; ii < n_samp_test; ++ii)
             {
                 sample_ids_test[ii] = std::to_string(ii);
             }
 
-            std::vector<double> value_1(90, 0.0);
-            std::vector<double> value_2(90, 0.0);
-            std::vector<double> value_3(90, 0.0);
+            std::vector<double> value_1(n_samp_train, 0.0);
+            std::vector<double> value_2(n_samp_train, 0.0);
+            std::vector<double> value_3(n_samp_train, 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
-            std::vector<double> test_value_3(10, 0.0);
+            std::vector<double> test_value_1(n_samp_test, 0.0);
+            std::vector<double> test_value_2(n_samp_test, 0.0);
+            std::vector<double> test_value_3(n_samp_test, 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0);
             std::uniform_real_distribution<double> distribution_params(-2.50, 2.50);
 
-            for(int ii = 0; ii < 90; ++ii)
+            for(int ii = 0; ii < n_samp_train; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = distribution_feats(generator);
                 value_3[ii] = distribution_feats(generator);
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < n_samp_test; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = distribution_feats(generator);
@@ -86,28 +90,28 @@ namespace
             double c00 = distribution_params(generator);
             double c01 = distribution_params(generator);
 
-            _prop = std::vector<double>(90, 0.0);
+            _prop = std::vector<double>(n_samp_train, 0.0);
             std::transform(value_1.begin(), value_1.begin() + task_sizes_train[0], value_2.begin(), _prop.begin(), [&c00, &a00](double v1, double v2){return c00 + a00 * (v1 - v2) * (v1 - v2);});
             std::transform(value_1.begin() + task_sizes_train[0], value_1.end(), value_2.begin() + task_sizes_train[0], _prop.begin() + task_sizes_train[0], [&c01, &a01](double v1, double v2){return c01 + a01 * (v1 - v2) * (v1 - v2);});
 
             std::transform(value_3.begin(), value_3.begin() + task_sizes_train[0], _prop.begin(), _prop.begin(), [&a10](double v3, double p){return p + a10 * v3;});
             std::transform(value_3.begin() + task_sizes_train[0], value_3.end(), _prop.begin() + task_sizes_train[0], _prop.begin() + task_sizes_train[0], [&a11](double v3, double p){return p + a11 * v3;});
 
-            _prop_test = std::vector<double>(10, 0.0);
+            _prop_test = std::vector<double>(n_samp_test, 0.0);
             std::transform(test_value_1.begin(), test_value_1.begin() + task_sizes_test[0], test_value_2.begin(), _prop_test.begin(), [&c00, &a00](double v1, double v2){return c00 + a00 * (v1 - v2) * (v1 - v2);});
             std::transform(test_value_1.begin() + task_sizes_test[0], test_value_1.end(), test_value_2.begin() + task_sizes_test[0], _prop_test.begin() + task_sizes_test[0], [&c01, &a01](double v1, double v2){return c01 + a01 * (v1 - v2) * (v1 - v2);});
 
             std::transform(test_value_3.begin(), test_value_3.begin() + task_sizes_test[0], _prop_test.begin(), _prop_test.begin(), [&a10](double v3, double p){return p + a10 * v3;});
             std::transform(test_value_3.begin() + task_sizes_test[0], test_value_3.end(), _prop_test.begin() + task_sizes_test[0], _prop_test.begin() + task_sizes_test[0], [&a11](double v3, double p){return p + a11 * v3;});
 
-            _prop_zero_int = std::vector<double>(90, 0.0);
+            _prop_zero_int = std::vector<double>(n_samp_train, 0.0);
             std::transform(value_1.begin(), value_1.begin() + task_sizes_train[0], value_2.begin(), _prop_zero_int.begin(), [&a00](double v1, double v2){return a00 * (v1 - v2) * (v1 - v2);});
             std::transform(value_1.begin() + task_sizes_train[0], value_1.end(), value_2.begin() + task_sizes_train[0], _prop_zero_int.begin() + task_sizes_train[0], [&a01](double v1, double v2){return a01 * (v1 - v2) * (v1 - v2);});
 
             std::transform(value_3.begin(), value_3.begin() + task_sizes_train[0], _prop_zero_int.begin(), _prop_zero_int.begin(), [&a10](double v3, double p){return p + a10 * v3;});
             std::transform(value_3.begin() + task_sizes_train[0], value_3.end(), _prop_zero_int.begin() + task_sizes_train[0], _prop_zero_int.begin() + task_sizes_train[0], [&a11](double v3, double p){return p + a11 * v3;});
 
-            _prop_test_zero_int = std::vector<double>(10, 0.0);
+            _prop_test_zero_int = std::vector<double>(n_samp_test, 0.0);
             std::transform(test_value_1.begin(), test_value_1.begin() + task_sizes_test[0], test_value_2.begin(), _prop_test_zero_int.begin(), [&a00](double v1, double v2){return  a00 * (v1 - v2) * (v1 - v2);});
             std::transform(test_value_1.begin() + task_sizes_test[0], test_value_1.end(), test_value_2.begin() + task_sizes_test[0], _prop_test_zero_int.begin() + task_sizes_test[0], [&a01](double v1, double v2){return a01 * (v1 - v2) * (v1 - v2);});
 
diff --git a/tests/googletest/feature_creation/feature_generation/test_abs_diff_node.cc b/tests/googletest/feature_creation/feature_generation/test_abs_diff_node.cc
index 2f00738828072bb5645479ebab07c21c93d62cec..15db40a58c96c5e629f5ccbf74569acf2d1e205d 100644
--- a/tests/googletest/feature_creation/feature_generation/test_abs_diff_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_abs_diff_node.cc
@@ -25,7 +25,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {5.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_abs_node.cc b/tests/googletest/feature_creation/feature_generation/test_abs_node.cc
index d9550d0dab03551b18b17bad9614f0c811e8d2b4..24ec3033d94c4037efc74d44f2af8dc22a271ce0 100644
--- a/tests/googletest/feature_creation/feature_generation/test_abs_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_abs_node.cc
@@ -24,7 +24,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {-1.0, -2.0, -3.0, -4.0};
             std::vector<double> test_value_1 =  {50.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_add_node.cc b/tests/googletest/feature_creation/feature_generation/test_add_node.cc
index d979f111593695086fd610a9abd54d205c8ff9bd..7a721416b9952e6cb0f73808b1e09f1cd1cafe8f 100644
--- a/tests/googletest/feature_creation/feature_generation/test_add_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_add_node.cc
@@ -24,7 +24,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {5.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_cb_node.cc b/tests/googletest/feature_creation/feature_generation/test_cb_node.cc
index efe0b392d7b016f8e3ddde599fb67c7a0c87e0e8..dcb9552d4ea84f4411a82c3b9942bf30290cb086 100644
--- a/tests/googletest/feature_creation/feature_generation/test_cb_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_cb_node.cc
@@ -28,7 +28,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 8.0};
             std::vector<double> test_value_1 =  {2.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_cbrt_node.cc b/tests/googletest/feature_creation/feature_generation/test_cbrt_node.cc
index 0375b79a57423a38f6adbd138b993b798b03f3d9..6317a29e917b1836b2880422ce222ac83d306ba7 100644
--- a/tests/googletest/feature_creation/feature_generation/test_cbrt_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_cbrt_node.cc
@@ -29,7 +29,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 8.0};
             std::vector<double> test_value_1 =  {8.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_cos_node.cc b/tests/googletest/feature_creation/feature_generation/test_cos_node.cc
index 11208163a041e629d1db0f1e5dabae96d387027d..23da36c272f47ea70bc699b069854a3667ddf3fb 100644
--- a/tests/googletest/feature_creation/feature_generation/test_cos_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_cos_node.cc
@@ -25,7 +25,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {0.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {0.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_div_node.cc b/tests/googletest/feature_creation/feature_generation/test_div_node.cc
index beabdaa28234832cd175f838cc2989ec24b9325d..5a4997ed351d7fd15bf1953f6bb4cd69bad200fa 100644
--- a/tests/googletest/feature_creation/feature_generation/test_div_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_div_node.cc
@@ -25,7 +25,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {5.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_exp_node.cc b/tests/googletest/feature_creation/feature_generation/test_exp_node.cc
index 7e86b6336fd68525e9e448d5dc1eeca4f4330854..ea994d6994b84ec3de3791310495a5279df7bf3b 100644
--- a/tests/googletest/feature_creation/feature_generation/test_exp_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_exp_node.cc
@@ -29,7 +29,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 3, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 3, 2, false);
 
             std::vector<double> value_1 = {0.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {0.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_feat_node.cc b/tests/googletest/feature_creation/feature_generation/test_feat_node.cc
index f6a29ca1d51f472f68f246265960f2d58ee02385..852a83952f7cce3d36ed75eb18e1d480b1f8e1e5 100644
--- a/tests/googletest/feature_creation/feature_generation/test_feat_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_feat_node.cc
@@ -23,7 +23,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 3, 0);
+            node_value_arrs::initialize_values_arr({4}, {1}, 3, 0, false);
 
             _value_1 = {1.0, 2.0, 3.0, 4.0};
             _test_value_1 =  {5.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_inv_node.cc b/tests/googletest/feature_creation/feature_generation/test_inv_node.cc
index ec761238b2d235518bccab62c0d3dca927f17138..3d844655e9e701dcea4b64eb3195a0ce3686f657 100644
--- a/tests/googletest/feature_creation/feature_generation/test_inv_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_inv_node.cc
@@ -29,7 +29,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 8.0};
             std::vector<double> test_value_1 =  {2.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_log_node.cc b/tests/googletest/feature_creation/feature_generation/test_log_node.cc
index 391708165bf7331cf2db23ac5ab16b17d84780f0..f7a948841804684aae885dc97274e7a3f635eb06 100644
--- a/tests/googletest/feature_creation/feature_generation/test_log_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_log_node.cc
@@ -35,7 +35,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {1.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_model_node.cc b/tests/googletest/feature_creation/feature_generation/test_model_node.cc
index 52922540b9390e522388b435b929af16e5214a83..d1ad4c00dfc5f0b67ca9f02d0322f971bd7234a3 100644
--- a/tests/googletest/feature_creation/feature_generation/test_model_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_model_node.cc
@@ -23,7 +23,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 3, 0);
+            node_value_arrs::initialize_values_arr({4}, {1}, 3, 0, false);
 
             _value_1 = {1.0, 2.0, 3.0, 4.0};
             _test_value_1 =  {5.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_mult_node.cc b/tests/googletest/feature_creation/feature_generation/test_mult_node.cc
index 46803bb5074512a8ef50258b5f4319ea9567cda2..ce8839c70318671da39a0656740f495bbe6ddf23 100644
--- a/tests/googletest/feature_creation/feature_generation/test_mult_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_mult_node.cc
@@ -24,7 +24,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {5.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_neg_exp_node.cc b/tests/googletest/feature_creation/feature_generation/test_neg_exp_node.cc
index f106502bd9e0253ca94f5379e9dbc9fe44ee25c9..a894434d3e3cfed66de9430394de62bc03112fc7 100644
--- a/tests/googletest/feature_creation/feature_generation/test_neg_exp_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_neg_exp_node.cc
@@ -29,7 +29,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 3, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 3, 2, false);
 
             std::vector<double> value_1 = {0.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {0.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_sin_node.cc b/tests/googletest/feature_creation/feature_generation/test_sin_node.cc
index 07409e51ccc1aca5f411409ccde8d13411935f45..5e3f541d355bf0ce22aa4ead3b88a5cc88637616 100644
--- a/tests/googletest/feature_creation/feature_generation/test_sin_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_sin_node.cc
@@ -25,7 +25,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {0.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {0.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_six_pow_node.cc b/tests/googletest/feature_creation/feature_generation/test_six_pow_node.cc
index 4ac48a2a82226f32d2ab6a80161402e494aacc0d..f7ae6b719cb9e2a5ea1a22a03da7c08d2328ac68 100644
--- a/tests/googletest/feature_creation/feature_generation/test_six_pow_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_six_pow_node.cc
@@ -30,7 +30,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {2.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_sq_node.cc b/tests/googletest/feature_creation/feature_generation/test_sq_node.cc
index f2e5367054745693e708f550f9ec2f9df8926149..ac56f17a6a831e20421cc96c319d0a9cbe7873ab 100644
--- a/tests/googletest/feature_creation/feature_generation/test_sq_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_sq_node.cc
@@ -27,7 +27,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 8.0};
             std::vector<double> test_value_1 =  {2.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_sqrt_node.cc b/tests/googletest/feature_creation/feature_generation/test_sqrt_node.cc
index 54b808b42f68531cb8bd3e202457cfeccdcbb74f..16d9dd291ed942e75291cca3d5387ae1fb7d6fa2 100644
--- a/tests/googletest/feature_creation/feature_generation/test_sqrt_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_sqrt_node.cc
@@ -30,7 +30,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {4.0};
diff --git a/tests/googletest/feature_creation/feature_generation/test_sub_node.cc b/tests/googletest/feature_creation/feature_generation/test_sub_node.cc
index 4d8e046480c359d53160bf320bdde1304be4fa99..ab5559d790214a0f63be7ee743730d21ba01ef1f 100644
--- a/tests/googletest/feature_creation/feature_generation/test_sub_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_sub_node.cc
@@ -24,7 +24,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 4, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 4, 2, false);
 
             std::vector<double> value_1 = {1.0, 2.0, 3.0, 4.0};
             std::vector<double> test_value_1 =  {5.0};
diff --git a/tests/googletest/feature_creation/feature_space/test_feat_space.cc b/tests/googletest/feature_creation/feature_space/test_feat_space.cc
index 1157df438832a8b59b1a4390d50eba8dac79c2a1..716bb824da01e050d2dd59bace3d0b11a627b4f8 100644
--- a/tests/googletest/feature_creation/feature_space/test_feat_space.cc
+++ b/tests/googletest/feature_creation/feature_space/test_feat_space.cc
@@ -30,26 +30,40 @@ namespace
             mpi_setup::init_mpi_env();
 
             std::vector<int> task_sizes = {5, 5};
-            node_value_arrs::initialize_values_arr(10, 0, 3, 2, true, false);
+            int n_samp = std::accumulate(task_sizes.begin(), task_sizes.end(), 0);
 
-            std::vector<double> value_1 = {3.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
-            std::vector<double> value_2 = {1.10, 2.20, 3.10, 4.20, 5.10, 6.20, 7.10, 8.20, 9.10, 10.20};
-            std::vector<double> value_3 = {3.0, -3.0, 5.0, -7.0, 9.0, -2.0, 4.0, -6.0, 8.0, -10.0};
+            node_value_arrs::initialize_values_arr(task_sizes, {0, 0}, 3, 2, false);
 
-            FeatureNode feat_1(0, "A", value_1, std::vector<double>(), Unit("m"));
-            FeatureNode feat_2(1, "B", value_2, std::vector<double>(), Unit("m"));
-            FeatureNode feat_3(2, "C", value_3, std::vector<double>(), Unit("s"));
+            std::vector<double> value_1(n_samp, 0.0);
+            std::vector<double> value_2(n_samp, 0.0);
+            std::vector<double> value_3(n_samp, 0.0);
 
-            std::vector<FeatureNode> phi_0 = {feat_1, feat_2, feat_3};
+            _prop = std::vector<double>(n_samp, 0.0);
+            _prop_class = std::vector<double>(n_samp, 0.0);
+            _prop_log_reg = std::vector<double>(n_samp, 0.0);
+
+            for(int ii = 0; ii < n_samp; ++ ii)
+            {
+                _prop_class[ii] = ii % 2;
+                value_1[ii] = static_cast<double>(ii + 1);
+                value_2[ii] = static_cast<double>(ii + 1) + 0.1 + 0.1 * (ii % 2);
+                value_3[ii] = static_cast<double>(2 * ii + 1) * std::pow(-1, ii);
+            }
+
+            value_1[0] = 3.0;
+            value_3[0] = 3.0;
 
-            _prop = std::vector<double>(10, 0.0);
-            _prop_class = {0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0};
-            _prop_log_reg = std::vector<double>(10, 0.0);
             std::transform(value_2.begin(), value_2.begin() + task_sizes[0], value_3.begin(), _prop.begin(), [](double v1, double v2){return v1 / (v2 * v2);});
             std::transform(value_2.begin() + task_sizes[0], value_2.end(), value_3.begin() + task_sizes[0], _prop.begin() + task_sizes[0], [](double v1, double v2){return -6.5 + 1.25 * v1 / (v2 * v2);});
 
             std::transform(value_2.begin(), value_2.end(), value_3.begin(), _prop_log_reg.begin(), [](double v1, double v2){return v1 / (v2 * v2);});
 
+            FeatureNode feat_1(0, "A", value_1, std::vector<double>(), Unit("m"));
+            FeatureNode feat_2(1, "B", value_2, std::vector<double>(), Unit("m"));
+            FeatureNode feat_3(2, "C", value_3, std::vector<double>(), Unit("s"));
+
+            std::vector<FeatureNode> phi_0 = {feat_1, feat_2, feat_3};
+
             _inputs.set_phi_0(phi_0);
             _inputs.set_task_sizes_train(task_sizes);
             _inputs.set_allowed_ops({"sq", "cb", "div", "add"});
diff --git a/tests/googletest/feature_creation/parameterization/test_abs_diff_node.cc b/tests/googletest/feature_creation/parameterization/test_abs_diff_node.cc
index bf271c283738a711ce1828d380c6e08caddb84f8..4a39804331815cebd145f1a08c85eaea2a1949e0 100644
--- a/tests/googletest/feature_creation/parameterization/test_abs_diff_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_abs_diff_node.cc
@@ -28,27 +28,29 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(90, 10, 2, 2, true, true);
-
             _task_sizes_train = {90};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
+
 
-            std::vector<double> value_1(90, 0.0);
-            std::vector<double> value_2(90, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-10.0, 10.0);
             std::uniform_real_distribution<double> distribution_params(-2.50, 2.50);
 
-            for(int ii = 0; ii < 90; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = distribution_feats(generator);
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = distribution_feats(generator);
@@ -60,9 +62,9 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(90, 0.0);
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
 
-            allowed_op_funcs::abs_diff(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            allowed_op_funcs::abs_diff(_task_sizes_train[0], _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -74,6 +76,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_abs_node.cc b/tests/googletest/feature_creation/parameterization/test_abs_node.cc
index 10f6ed07532c1770c51c1af36fc86d6ff320c02b..3705565571cabc9f9249a039795de9e2bab51426 100644
--- a/tests/googletest/feature_creation/parameterization/test_abs_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_abs_node.cc
@@ -28,22 +28,22 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(900, 10, 1, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
 
-            std::vector<double> value_1(900, 0.0);
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 1, 2, true);
 
-            std::vector<double> test_value_1(10, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0);
             std::uniform_real_distribution<double> distribution_params(-2.50, 2.50);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
                 value_1[ii] = distribution_feats(generator);
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
                 test_value_1[ii] = distribution_feats(generator);
 
             _feat_1 = std::make_shared<FeatureNode>(0, "A", value_1, test_value_1, Unit("m"));
@@ -52,8 +52,8 @@ namespace
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
 
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::abs(900, _phi[0]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::abs(_task_sizes_train[0], _phi[0]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -64,6 +64,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_add_node.cc b/tests/googletest/feature_creation/parameterization/test_add_node.cc
index d94fb5d5638a52b0d1eee2c15e4b8f54aa547501..185d5ca2dfeb740e5fee1775787a5329bb9decc6 100644
--- a/tests/googletest/feature_creation/parameterization/test_add_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_add_node.cc
@@ -29,27 +29,28 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(90, 10, 2, 2, true, true);
-
             _task_sizes_train = {90};
+            _task_sizes_test = {10};
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
+
 
-            std::vector<double> value_1(90, 0.0);
-            std::vector<double> value_2(90, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0);
             std::uniform_real_distribution<double> distribution_params(-2.50, 2.50);
 
-            for(int ii = 0; ii < 90; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = distribution_feats(generator);
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = distribution_feats(generator);
@@ -61,8 +62,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(90, 0.0);
-            allowed_op_funcs::add(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::add(_task_sizes_train[0], _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -74,6 +75,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_cb_node.cc b/tests/googletest/feature_creation/parameterization/test_cb_node.cc
index e975d4b23fb85d0572a1183e5d54b39db6e94cc2..34cb54cdd87e43e423773a2880105d3de91dc680 100644
--- a/tests/googletest/feature_creation/parameterization/test_cb_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_cb_node.cc
@@ -29,28 +29,30 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(900, 10, 2, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
+
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-500.0, 500.0);
             std::uniform_real_distribution<double> distribution_params(1e-10, 1.50);
             std::normal_distribution<double> distribution_err(0.0, 0.01);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
@@ -62,8 +64,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::cb(900, _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::cb(_task_sizes_train[0], _phi[1]->value_ptr(), _alpha, _a, _prop.data());
             std::transform(_prop.begin(), _prop.end(), _prop.begin(), [&](double p){return p + distribution_err(generator);});
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
@@ -76,6 +78,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc b/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc
index 0535e6f4b7ebc37cc86e6b7442d23364021ff1b3..4139dc438141be35735f3831ecf6cb5beaf3ea62 100644
--- a/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc
@@ -29,27 +29,28 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(900, 10, 2, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
+
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(10.0, 5000.0);
             std::uniform_real_distribution<double> distribution_params(0.5, 1.50);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
@@ -61,8 +62,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = std::pow(distribution_params(generator), 3.0);
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::cbrt(900, _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::cbrt(_task_sizes_train[0], _phi[1]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -74,6 +75,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_cos_node.cc b/tests/googletest/feature_creation/parameterization/test_cos_node.cc
index a6f445561cf622a44e45b7020c877b44f494b5f4..34c554e6a2fe9688de4c377c0a1e14d9df032447 100644
--- a/tests/googletest/feature_creation/parameterization/test_cos_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_cos_node.cc
@@ -30,26 +30,27 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(900, 10, 3, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 3, 2, true);
+
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-6.23, 6.23);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = distribution_feats(generator);
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = distribution_feats(generator);
@@ -65,8 +66,8 @@ namespace
 
             _a = 0.143;
             _alpha = 1.05;
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::cos(900, _phi[0]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::cos(_task_sizes_train[0], _phi[0]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -79,6 +80,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_div_node.cc b/tests/googletest/feature_creation/parameterization/test_div_node.cc
index fa85365646170513432e88cabc69805236d82fc3..f5b50f5dfebbef5e3d63e039f4e715313e0bbf83 100644
--- a/tests/googletest/feature_creation/parameterization/test_div_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_div_node.cc
@@ -28,27 +28,29 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(90, 10, 2, 2, true, true);
-
             _task_sizes_train = {90};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
+
 
-            std::vector<double> value_1(90, 0.0);
-            std::vector<double> value_2(90, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0);
             std::uniform_real_distribution<double> distribution_params(1e-10, 2.50);
 
-            for(int ii = 0; ii < 90; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
@@ -60,8 +62,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(90, 0.0);
-            allowed_op_funcs::div(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::div(_task_sizes_train[0], _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -73,6 +75,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_exp_node.cc b/tests/googletest/feature_creation/parameterization/test_exp_node.cc
index 0e5d28bde730a7f44a9df3894650ffe59796876f..6e91b250171bd1c85579e31809aaae95baf2b486 100644
--- a/tests/googletest/feature_creation/parameterization/test_exp_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_exp_node.cc
@@ -30,27 +30,29 @@ namespace
         void SetUp() override
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
-            node_value_arrs::initialize_values_arr(900, 10, 3, 2, true, true);
 
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 3, 2, true);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
+
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-2.0, 2.0);
             std::uniform_real_distribution<double> distribution_params(0.75, 1.25);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
@@ -67,8 +69,8 @@ namespace
 
             _a = std::log(distribution_params(generator));
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::exp(900, _phi[0]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::exp(_task_sizes_train[0], _phi[0]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -81,6 +83,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_inv_node.cc b/tests/googletest/feature_creation/parameterization/test_inv_node.cc
index d05ebaf073268026c3bc6d4e1d156ca63b66116f..e1f8ecca477927a1ec0129ce6b9747a2e974537b 100644
--- a/tests/googletest/feature_creation/parameterization/test_inv_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_inv_node.cc
@@ -28,27 +28,29 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(90, 10, 2, 2, true, true);
-
             _task_sizes_train = {90};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
+
 
-            std::vector<double> value_1(90, 0.0);
-            std::vector<double> value_2(90, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0);
             std::uniform_real_distribution<double> distribution_params(1e-10, 2.50);
 
-            for(int ii = 0; ii < 90; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
@@ -60,8 +62,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(90, 0.0);
-            allowed_op_funcs::inv(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::inv(_task_sizes_train[0], _phi[1]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -73,6 +75,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_log_node.cc b/tests/googletest/feature_creation/parameterization/test_log_node.cc
index 07216f4d70ff65adb99d602ccb05673b467b58d9..f716721b344558dde98c0fdc2f506cd76f90e262 100644
--- a/tests/googletest/feature_creation/parameterization/test_log_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_log_node.cc
@@ -29,30 +29,31 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(900, 10, 3, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 3, 2, true);
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
-            std::vector<double> value_3(900, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
+            std::vector<double> value_3(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
-            std::vector<double> test_value_3(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_3(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-10.0, 10.0);
             std::uniform_real_distribution<double> distribution_params(0.1, 1.50);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = distribution_feats(generator);
                 value_3[ii] = std::exp(distribution_feats(generator));
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = distribution_feats(generator);
@@ -70,8 +71,8 @@ namespace
 
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::log(900, _phi[2]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::log(_task_sizes_train[0], _phi[2]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -84,6 +85,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_mult_node.cc b/tests/googletest/feature_creation/parameterization/test_mult_node.cc
index af26be8822b124edd6f39b779c9607269698ce9e..65e8e036c22b179380d1b8992f15f023fdfed6f1 100644
--- a/tests/googletest/feature_creation/parameterization/test_mult_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_mult_node.cc
@@ -28,27 +28,28 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(900, 10, 2, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0);
             std::uniform_real_distribution<double> distribution_params(-2.50, 2.50);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = distribution_feats(generator);
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = distribution_feats(generator);
@@ -60,8 +61,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::mult(900, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::mult(_task_sizes_train[0], _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -73,6 +74,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_neg_exp_node.cc b/tests/googletest/feature_creation/parameterization/test_neg_exp_node.cc
index da2ead06f7d22af3b1e7dad8c30d373893f68ca8..ff9ad5cc52b6a8ff9d9f480fdeea481fef0d2fdd 100644
--- a/tests/googletest/feature_creation/parameterization/test_neg_exp_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_neg_exp_node.cc
@@ -31,27 +31,28 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(900, 10, 3, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 3, 2, true);
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-2.0, 2.0);
             std::uniform_real_distribution<double> distribution_params(0.75, 1.25);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
@@ -68,8 +69,8 @@ namespace
 
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::neg_exp(900, _phi[0]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::neg_exp(_task_sizes_train[0], _phi[0]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -82,6 +83,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_sin_node.cc b/tests/googletest/feature_creation/parameterization/test_sin_node.cc
index 083656ad6ce243aa0065553dcadba5de4c814498..dd19a4e34221adc5fdc36f089b3527d7312fde76 100644
--- a/tests/googletest/feature_creation/parameterization/test_sin_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_sin_node.cc
@@ -30,26 +30,27 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(900, 10, 3, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 3, 2, true);
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-6.23, 6.23);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = distribution_feats(generator);
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = distribution_feats(generator);
@@ -65,8 +66,8 @@ namespace
 
             _a = 0.143;
             _alpha = 1.05;
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::sin(900, _phi[0]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::sin(_task_sizes_train[0], _phi[0]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -79,6 +80,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_six_pow_node.cc b/tests/googletest/feature_creation/parameterization/test_six_pow_node.cc
index 9aa141fb291f8b136ad656c027ada1909dc96828..25369ffdc5080cf5d8b2d82cd0f35d93e7a1cc90 100644
--- a/tests/googletest/feature_creation/parameterization/test_six_pow_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_six_pow_node.cc
@@ -28,27 +28,28 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(900, 10, 2, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-50.00, 50.00);
             std::uniform_real_distribution<double> distribution_params(1e-10, 2.00);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
@@ -60,8 +61,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::sixth_pow(900, _phi[0]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::sixth_pow(_task_sizes_train[0], _phi[0]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -73,6 +74,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_sq_node.cc b/tests/googletest/feature_creation/parameterization/test_sq_node.cc
index fc8a88af0387061b64cf9112cdb41d467822f7a6..63c3f241d17622f30cee468b7df39825bcb1d17f 100644
--- a/tests/googletest/feature_creation/parameterization/test_sq_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_sq_node.cc
@@ -28,27 +28,28 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(90, 10, 2, 2, true, true);
-
             _task_sizes_train = {90};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
 
-            std::vector<double> value_1(90, 0.0);
-            std::vector<double> value_2(90, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0);
             std::uniform_real_distribution<double> distribution_params(1e-10, 2.50);
 
-            for(int ii = 0; ii < 90; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
@@ -60,8 +61,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(90, 0.0);
-            allowed_op_funcs::sq(90, _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::sq(_task_sizes_train[0], _phi[1]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -73,6 +74,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc b/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc
index 14427a905196c6392ab5dc1fcf6913dd13a959e4..6b2dc24f2665650d0e9b7fb6bc9f6faf91154393 100644
--- a/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc
@@ -28,27 +28,28 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(900, 10, 2, 2, true, true);
-
             _task_sizes_train = {900};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
 
-            std::vector<double> value_1(900, 0.0);
-            std::vector<double> value_2(900, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(1.0, 500.0);
             std::uniform_real_distribution<double> distribution_params(0.5, 1.50);
 
-            for(int ii = 0; ii < 900; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = std::abs(distribution_feats(generator)) + 1e-10;
@@ -60,8 +61,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = std::pow(distribution_params(generator), 2.0);
-            _prop = std::vector<double>(900, 0.0);
-            allowed_op_funcs::sqrt(900, _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::sqrt(_task_sizes_train[0], _phi[1]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -73,6 +74,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/parameterization/test_sub_node.cc b/tests/googletest/feature_creation/parameterization/test_sub_node.cc
index 7d97ed99e37520fa61149df86b10c32a08777bb0..b7da5988ab2550bf168995587b33f7ca1b970bbb 100644
--- a/tests/googletest/feature_creation/parameterization/test_sub_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_sub_node.cc
@@ -28,27 +28,28 @@ namespace
         {
             nlopt_wrapper::MAX_PARAM_DEPTH = 1;
 
-            node_value_arrs::initialize_values_arr(90, 10, 2, 2, true, true);
-
             _task_sizes_train = {90};
+            _task_sizes_test = {10};
+
+            node_value_arrs::initialize_values_arr(_task_sizes_train, _task_sizes_test, 2, 2, true);
 
-            std::vector<double> value_1(90, 0.0);
-            std::vector<double> value_2(90, 0.0);
+            std::vector<double> value_1(_task_sizes_train[0], 0.0);
+            std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
-            std::vector<double> test_value_1(10, 0.0);
-            std::vector<double> test_value_2(10, 0.0);
+            std::vector<double> test_value_1(_task_sizes_test[0], 0.0);
+            std::vector<double> test_value_2(_task_sizes_test[0], 0.0);
 
             std::default_random_engine generator;
             std::uniform_real_distribution<double> distribution_feats(-50.0, 50.0);
             std::uniform_real_distribution<double> distribution_params(-2.50, 2.50);
 
-            for(int ii = 0; ii < 90; ++ii)
+            for(int ii = 0; ii < _task_sizes_train[0]; ++ii)
             {
                 value_1[ii] = distribution_feats(generator);
                 value_2[ii] = distribution_feats(generator);
             }
 
-            for(int ii = 0; ii < 10; ++ii)
+            for(int ii = 0; ii < _task_sizes_test[0]; ++ii)
             {
                 test_value_1[ii] = distribution_feats(generator);
                 test_value_2[ii] = distribution_feats(generator);
@@ -60,8 +61,8 @@ namespace
             _phi = {_feat_1, _feat_2};
             _a = distribution_params(generator);
             _alpha = distribution_params(generator);
-            _prop = std::vector<double>(90, 0.0);
-            allowed_op_funcs::sub(90, _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
+            _prop = std::vector<double>(_task_sizes_train[0], 0.0);
+            allowed_op_funcs::sub(_task_sizes_train[0], _phi[0]->value_ptr(), _phi[1]->value_ptr(), _alpha, _a, _prop.data());
 
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
@@ -73,6 +74,7 @@ namespace
         std::vector<node_ptr> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
+        std::vector<int> _task_sizes_test;
 
         double _a;
         double _alpha;
diff --git a/tests/googletest/feature_creation/utils/test_utils.cc b/tests/googletest/feature_creation/utils/test_utils.cc
index edd112a436281c78409f20a1c8f8a3244fd6ac65..5db1d69eca9d6e615d82d5ce05ff52ce12f9b64e 100644
--- a/tests/googletest/feature_creation/utils/test_utils.cc
+++ b/tests/googletest/feature_creation/utils/test_utils.cc
@@ -22,7 +22,7 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_values_arr(4, 1, 3, 2);
+            node_value_arrs::initialize_values_arr({4}, {1}, 3, 2, false);
 
             std::vector<double> value_1 = {-1.0, -2.0, -3.0, -4.0};
             std::vector<double> test_value_1 =  {50.0};
diff --git a/tests/googletest/feature_creation/value_storage/test_value_storage.cc b/tests/googletest/feature_creation/value_storage/test_value_storage.cc
index b80cfffa98997b0f0fa1f4235713a44d8e990005..0957078b110ceb7ab69fd0fac740eccb8bd45905 100644
--- a/tests/googletest/feature_creation/value_storage/test_value_storage.cc
+++ b/tests/googletest/feature_creation/value_storage/test_value_storage.cc
@@ -20,7 +20,7 @@ namespace {
     //test mean calculations
     TEST(ValueStorage, ValueStorageTest)
     {
-        node_value_arrs::initialize_values_arr(5, 2, 1, 2, true, true);
+        node_value_arrs::initialize_values_arr({5}, {2}, 1, 2, true);
         EXPECT_EQ(node_value_arrs::N_SAMPLES, 5);
         EXPECT_EQ(node_value_arrs::N_SAMPLES_TEST, 2);
         EXPECT_EQ(node_value_arrs::N_RUNGS_STORED, 0);
diff --git a/tests/googletest/utils/test_compare_features.cc b/tests/googletest/utils/test_compare_features.cc
index c7fad834c2487682320e96b8c36e49811a284dfb..9826c79cbf010a02b24d1aed2ee1f57d68032d51 100644
--- a/tests/googletest/utils/test_compare_features.cc
+++ b/tests/googletest/utils/test_compare_features.cc
@@ -26,7 +26,7 @@ namespace {
         std::vector<double> scores = {0.9897782665572893};
         std::vector<node_ptr> selected(1);
 
-        node_value_arrs::initialize_values_arr(4, 0, 1, 0, true, false);
+        node_value_arrs::initialize_values_arr({4}, {0}, 1, 0, false);
         selected[0] = std::make_shared<FeatureNode>(0, "A", val_3, std::vector<double>(), Unit());
 
         node_value_arrs::initialize_d_matrix_arr();
diff --git a/tests/googletest/utils/test_project.cc b/tests/googletest/utils/test_project.cc
index 93fd5a141ba53f27973f7c37cb53dec3fc64239b..e5b0c0d15e589fc5f6015ced1f1ea3f04276b1c8 100644
--- a/tests/googletest/utils/test_project.cc
+++ b/tests/googletest/utils/test_project.cc
@@ -20,7 +20,7 @@ namespace {
     //test mean calculations
     TEST(Project, ProjectTest)
     {
-        node_value_arrs::initialize_values_arr(4, 0, 1, 0, true, false);
+        node_value_arrs::initialize_values_arr({4}, {0}, 1, 0, true, false);
         std::vector<double> prop = {1.0, 3.0, 5.0, 6.0};
         std::vector<double> prop_class = {0.0, 0.0, 0.0, 1.0};
         std::vector<double> val = {2.0, 2.0, 3.0, 4.0};