From d6d4f35d6f6f8fda3420005725fbeb15b422774e Mon Sep 17 00:00:00 2001
From: Thomas <purcell@fhi-berlin.mpg.de>
Date: Wed, 18 Aug 2021 09:56:58 +0200
Subject: [PATCH] Update GTest files to not use sample based initializers

Use task_size explictly
---
 .../solver/test_sisso_classifier.cc           | 26 ++++++------
 .../solver/test_sisso_log_regressor.cc        | 37 ++++++++---------
 .../solver/test_sisso_regressor.cc            | 40 ++++++++++---------
 .../feature_generation/test_abs_diff_node.cc  |  2 +-
 .../feature_generation/test_abs_node.cc       |  2 +-
 .../feature_generation/test_add_node.cc       |  2 +-
 .../feature_generation/test_cb_node.cc        |  2 +-
 .../feature_generation/test_cbrt_node.cc      |  2 +-
 .../feature_generation/test_cos_node.cc       |  2 +-
 .../feature_generation/test_div_node.cc       |  2 +-
 .../feature_generation/test_exp_node.cc       |  2 +-
 .../feature_generation/test_feat_node.cc      |  2 +-
 .../feature_generation/test_inv_node.cc       |  2 +-
 .../feature_generation/test_log_node.cc       |  2 +-
 .../feature_generation/test_model_node.cc     |  2 +-
 .../feature_generation/test_mult_node.cc      |  2 +-
 .../feature_generation/test_neg_exp_node.cc   |  2 +-
 .../feature_generation/test_sin_node.cc       |  2 +-
 .../feature_generation/test_six_pow_node.cc   |  2 +-
 .../feature_generation/test_sq_node.cc        |  2 +-
 .../feature_generation/test_sqrt_node.cc      |  2 +-
 .../feature_generation/test_sub_node.cc       |  2 +-
 .../feature_space/test_feat_space.cc          | 36 ++++++++++++-----
 .../parameterization/test_abs_diff_node.cc    | 23 ++++++-----
 .../parameterization/test_abs_node.cc         | 17 ++++----
 .../parameterization/test_add_node.cc         | 22 +++++-----
 .../parameterization/test_cb_node.cc          | 23 ++++++-----
 .../parameterization/test_cbrt_node.cc        | 22 +++++-----
 .../parameterization/test_cos_node.cc         | 22 +++++-----
 .../parameterization/test_div_node.cc         | 23 ++++++-----
 .../parameterization/test_exp_node.cc         | 21 +++++-----
 .../parameterization/test_inv_node.cc         | 23 ++++++-----
 .../parameterization/test_log_node.cc         | 26 ++++++------
 .../parameterization/test_mult_node.cc        | 22 +++++-----
 .../parameterization/test_neg_exp_node.cc     | 22 +++++-----
 .../parameterization/test_sin_node.cc         | 22 +++++-----
 .../parameterization/test_six_pow_node.cc     | 22 +++++-----
 .../parameterization/test_sq_node.cc          | 22 +++++-----
 .../parameterization/test_sqrt_node.cc        | 22 +++++-----
 .../parameterization/test_sub_node.cc         | 22 +++++-----
 .../feature_creation/utils/test_utils.cc      |  2 +-
 .../value_storage/test_value_storage.cc       |  2 +-
 .../googletest/utils/test_compare_features.cc |  2 +-
 tests/googletest/utils/test_project.cc        |  2 +-
 44 files changed, 309 insertions(+), 252 deletions(-)

diff --git a/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc b/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc
index ef1ca360..6beaf8e8 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 9162bebb..35995fcb 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 c8c99816..03cdd564 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 2f007388..15db40a5 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 d9550d0d..24ec3033 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 d979f111..7a721416 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 efe0b392..dcb9552d 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 0375b79a..6317a29e 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 11208163..23da36c2 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 beabdaa2..5a4997ed 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 7e86b633..ea994d69 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 f6a29ca1..852a8395 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 ec761238..3d844655 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 39170816..f7a94884 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 52922540..d1ad4c00 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 46803bb5..ce8839c7 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 f106502b..a894434d 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 07409e51..5e3f541d 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 4ac48a2a..f7ae6b71 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 f2e53670..ac56f17a 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 54b808b4..16d9dd29 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 4d8e0464..ab5559d7 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 1157df43..716bb824 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 bf271c28..4a398043 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 10f6ed07..37055655 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 d94fb5d5..185d5ca2 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 e975d4b2..34cb54cd 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 0535e6f4..4139dc43 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 a6f44556..34c554e6 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 fa853656..f5b50f5d 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 0e5d28bd..6e91b250 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 d05ebaf0..e1f8ecca 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 07216f4d..f716721b 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 af26be88..65e8e036 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 da2ead06..ff9ad5cc 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 083656ad..dd19a4e3 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 9aa141fb..25369ffd 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 fc8a88af..63c3f241 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 14427a90..6b2dc24f 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 7d97ed99..b7da5988 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 edd112a4..5db1d69e 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 b80cfffa..0957078b 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 c7fad834..9826c79c 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 93fd5a14..e5b0c0d1 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};
-- 
GitLab