From 6b1f9b3c3c31e59fe00b1a1a7054d9c3fd3a59b5 Mon Sep 17 00:00:00 2001
From: Thomas <purcell@fhi-berlin.mpg.de>
Date: Tue, 31 Aug 2021 09:21:55 +0200
Subject: [PATCH] Finialize all global variables after each google test

Prevent global variables persisting across all tests
---
 src/classification/prop_sorted_d_mat.cpp      | 19 +++++++++++---
 src/classification/prop_sorted_d_mat.hpp      |  9 +++++--
 .../solver/SISSOClassifier.cpp                |  2 +-
 .../value_storage/nodes_value_containers.cpp  |  2 +-
 .../value_storage/nodes_value_containers.hpp  |  2 +-
 src/loss_function/LossFunctionConvexHull.cpp  |  2 +-
 src/main.cpp                                  |  2 ++
 src/mpi_interface/MPI_Ops.cpp                 |  8 ++++++
 .../bindings_docstring_keyed.cpp              |  2 +-
 src/utils/compare_features.cpp                |  6 ++++-
 src/utils/compare_features.hpp                |  6 ++++-
 .../classification/test_convex_hull_1d.cc     |  6 ++++-
 .../classification/test_lp_wrapper.cc         | 12 +++++++--
 .../classification/test_prop_sorted_d_mat.cc  |  5 ++--
 .../classification/test_svm_wrapper.cc        |  5 ++++
 .../solver/test_sisso_classifier.cc           |  8 +++++-
 .../solver/test_sisso_log_regressor.cc        |  8 +++++-
 .../solver/test_sisso_regressor.cc            |  6 +++++
 .../feature_generation/test_abs_diff_node.cc  |  5 ++++
 .../feature_generation/test_abs_node.cc       |  5 ++++
 .../feature_generation/test_add_node.cc       |  5 ++++
 .../feature_generation/test_cb_node.cc        |  5 ++++
 .../feature_generation/test_cbrt_node.cc      |  5 ++++
 .../feature_generation/test_cos_node.cc       |  5 ++++
 .../feature_generation/test_div_node.cc       |  5 ++++
 .../feature_generation/test_exp_node.cc       |  5 ++++
 .../feature_generation/test_feat_node.cc      |  5 ++++
 .../feature_generation/test_inv_node.cc       |  5 ++++
 .../feature_generation/test_log_node.cc       |  5 ++++
 .../feature_generation/test_model_node.cc     |  5 ++++
 .../feature_generation/test_mult_node.cc      |  5 ++++
 .../feature_generation/test_neg_exp_node.cc   |  5 ++++
 .../feature_generation/test_sin_node.cc       |  5 ++++
 .../feature_generation/test_six_pow_node.cc   |  5 ++++
 .../feature_generation/test_sq_node.cc        |  5 ++++
 .../feature_generation/test_sqrt_node.cc      |  5 ++++
 .../feature_generation/test_sub_node.cc       |  5 ++++
 .../feature_space/test_feat_space.cc          | 12 ++++++---
 .../parameterization/test_abs_diff_node.cc    |  5 ++++
 .../parameterization/test_abs_node.cc         |  5 ++++
 .../parameterization/test_add_node.cc         |  5 ++++
 .../parameterization/test_cb_node.cc          |  5 ++++
 .../parameterization/test_cbrt_node.cc        |  5 ++++
 .../parameterization/test_cos_node.cc         |  5 ++++
 .../parameterization/test_div_node.cc         |  5 ++++
 .../parameterization/test_exp_node.cc         |  5 ++++
 .../parameterization/test_inv_node.cc         |  5 ++++
 .../parameterization/test_log_node.cc         |  5 ++++
 .../parameterization/test_mult_node.cc        |  5 ++++
 .../parameterization/test_neg_exp_node.cc     |  5 ++++
 .../parameterization/test_sin_node.cc         |  5 ++++
 .../parameterization/test_six_pow_node.cc     |  5 ++++
 .../parameterization/test_sq_node.cc          |  5 ++++
 .../parameterization/test_sqrt_node.cc        |  5 ++++
 .../parameterization/test_sub_node.cc         |  5 ++++
 .../feature_creation/utils/test_utils.cc      |  5 ++++
 .../value_storage/test_value_storage.cc       | 26 +++++++++++++++++++
 tests/googletest/inputs/input_parser.cc       | 12 ++++++---
 .../loss_function/test_convex_hull_loss.cc    | 11 ++++++++
 .../loss_function/test_log_pearson_loss.cc    |  5 ++++
 .../loss_function/test_pearson_loss.cc        |  5 ++++
 tests/googletest/nl_opt/nl_opt_classifier.cc  |  6 +++++
 .../googletest/nl_opt/nl_opt_log_regressor.cc |  6 +++++
 tests/googletest/nl_opt/nl_opt_regressor.cc   |  6 +++++
 .../googletest/utils/test_compare_features.cc |  1 +
 tests/googletest/utils/test_project.cc        |  1 +
 66 files changed, 360 insertions(+), 26 deletions(-)

diff --git a/src/classification/prop_sorted_d_mat.cpp b/src/classification/prop_sorted_d_mat.cpp
index 386ca307..8d10aa70 100644
--- a/src/classification/prop_sorted_d_mat.cpp
+++ b/src/classification/prop_sorted_d_mat.cpp
@@ -31,7 +31,7 @@ int prop_sorted_d_mat::N_CLASS = 0;
 int prop_sorted_d_mat::N_FEATURES = 0;
 int prop_sorted_d_mat::N_SAMPLES = 0;
 
-void prop_sorted_d_mat::initialize_sroted_d_matrix_arr(int n_feat, int n_task, int n_class, std::vector<int> n_samples_per_class)
+void prop_sorted_d_mat::initialize_sorted_d_matrix_arr(int n_feat, int n_task, int n_class, std::vector<int> n_samples_per_class)
 {
     if(n_samples_per_class.size() != n_task * n_class)
     {
@@ -51,11 +51,24 @@ void prop_sorted_d_mat::initialize_sroted_d_matrix_arr(int n_feat, int n_task, i
     }
 
     N_SAMPLES = std::accumulate(N_SAMPLES_PER_CLASS.begin(), N_SAMPLES_PER_CLASS.end(), 0);
-    SORTED_D_MATRIX.resize(N_FEATURES * N_SAMPLES);
+    SORTED_D_MATRIX = std::vector<double>(N_FEATURES * N_SAMPLES, 0.0);
 }
 
-void prop_sorted_d_mat::resize_sroted_d_matrix_arr(int n_feats)
+void prop_sorted_d_mat::resize_sorted_d_matrix_arr(int n_feats)
 {
     N_FEATURES = n_feats;
     SORTED_D_MATRIX.resize(N_FEATURES * N_SAMPLES);
 }
+
+void prop_sorted_d_mat::finalize_sorted_d_matrix_arr()
+{
+    SORTED_D_MATRIX.resize(0);
+
+    CLASS_START.resize(0);
+    N_SAMPLES_PER_CLASS.resize(0);
+
+    N_TASK = 0;
+    N_CLASS = 0;
+    N_FEATURES = 0;
+    N_SAMPLES = 0;
+}
diff --git a/src/classification/prop_sorted_d_mat.hpp b/src/classification/prop_sorted_d_mat.hpp
index acabd3b7..95a2725d 100644
--- a/src/classification/prop_sorted_d_mat.hpp
+++ b/src/classification/prop_sorted_d_mat.hpp
@@ -48,14 +48,19 @@ namespace prop_sorted_d_mat
      * @param n_class The number of classes
      * @param n_samples_per_class The number of samples in each class/task combination [task * N_TASK * N_CLASS + class]
      */
-    void initialize_sroted_d_matrix_arr(int n_feat, int n_task, int n_class, std::vector<int> n_samples_per_class);
+    void initialize_sorted_d_matrix_arr(int n_feat, int n_task, int n_class, std::vector<int> n_samples_per_class);
 
     /**
      * @brief Resize the descriptor matrix to match the current number of features
      *
      * @param n_feats Number of features to select
      */
-    void resize_sroted_d_matrix_arr(int n_feats);
+    void resize_sorted_d_matrix_arr(int n_feats);
+
+    /**
+     * @brief Restores all global variables to initial state
+     */
+    void finalize_sorted_d_matrix_arr();
 
     /**
      * @brief Get the number of samples in a particular task/class combination
diff --git a/src/descriptor_identifier/solver/SISSOClassifier.cpp b/src/descriptor_identifier/solver/SISSOClassifier.cpp
index 5af8e3ee..589d068f 100644
--- a/src/descriptor_identifier/solver/SISSOClassifier.cpp
+++ b/src/descriptor_identifier/solver/SISSOClassifier.cpp
@@ -100,7 +100,7 @@ int SISSOClassifier::get_max_error_ind(
 
 void SISSOClassifier::transfer_d_mat_to_sorted() const
 {
-    prop_sorted_d_mat::resize_sroted_d_matrix_arr(node_value_arrs::N_SELECTED);
+    prop_sorted_d_mat::resize_sorted_d_matrix_arr(node_value_arrs::N_SELECTED);
     for(auto& el : _sample_inds_to_sorted_dmat_inds)
     {
         dcopy_(
diff --git a/src/feature_creation/node/value_storage/nodes_value_containers.cpp b/src/feature_creation/node/value_storage/nodes_value_containers.cpp
index c7fa9e35..55f5d705 100644
--- a/src/feature_creation/node/value_storage/nodes_value_containers.cpp
+++ b/src/feature_creation/node/value_storage/nodes_value_containers.cpp
@@ -245,7 +245,7 @@ void node_value_arrs::resize_d_matrix_arr(const int n_select)
     D_MATRIX.shrink_to_fit();
 }
 
-void node_value_arrs::finialize_values_arr()
+void node_value_arrs::finalize_values_arr()
 {
     N_SELECTED = 0;
     N_SAMPLES = 0;
diff --git a/src/feature_creation/node/value_storage/nodes_value_containers.hpp b/src/feature_creation/node/value_storage/nodes_value_containers.hpp
index 6967d67f..0b793bfe 100644
--- a/src/feature_creation/node/value_storage/nodes_value_containers.hpp
+++ b/src/feature_creation/node/value_storage/nodes_value_containers.hpp
@@ -76,7 +76,7 @@ namespace node_value_arrs
     /**
      * @brief Resize all storage arrays to be empty
      */
-    void finialize_values_arr();
+    void finalize_values_arr();
 
     /**
      * @brief Initialize all central storage vectors/descriptive variables without changing MAX_RUNG
diff --git a/src/loss_function/LossFunctionConvexHull.cpp b/src/loss_function/LossFunctionConvexHull.cpp
index 6c0750d4..828b7618 100644
--- a/src/loss_function/LossFunctionConvexHull.cpp
+++ b/src/loss_function/LossFunctionConvexHull.cpp
@@ -228,7 +228,7 @@ void LossFunctionConvexHull::setup_lp(bool initialize_sorted_d_mat)
 
     if(prop_sorted_d_mat::N_FEATURES == 0)
     {
-        prop_sorted_d_mat::initialize_sroted_d_matrix_arr(0, _n_task, _n_class, n_samp_per_class);
+        prop_sorted_d_mat::initialize_sorted_d_matrix_arr(0, _n_task, _n_class, n_samp_per_class);
     }
 }
 
diff --git a/src/main.cpp b/src/main.cpp
index 471b6b3c..f9ea45f2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -121,6 +121,8 @@ int main(int argc, char const *argv[])
                 std::cout << sisso.models()[ii][0] << "\n" << std::endl;
             }
         }
+        prop_sorted_d_mat::finalize_sorted_d_matrix_arr();
+        comp_feats::reset_vectors();
     }
     mpi_setup::finalize_mpi_env();
     return 0;
diff --git a/src/mpi_interface/MPI_Ops.cpp b/src/mpi_interface/MPI_Ops.cpp
index dee6afba..f2b71fed 100644
--- a/src/mpi_interface/MPI_Ops.cpp
+++ b/src/mpi_interface/MPI_Ops.cpp
@@ -36,16 +36,24 @@ void mpi_reduce_op::set_op(std::string project_type, double cross_cor_max, int n
     if(project_type.compare("classification") == 0)
     {
         if(CROSS_COR_MAX < 0.99999)
+        {
             IS_VALID = comp_feats::valid_feature_against_selected_spearman_mpi_op;
+        }
         else
+        {
             IS_VALID = comp_feats::valid_feature_against_selected_spearman_max_corr_1_mpi_op;
+        }
     }
     else
     {
         if(CROSS_COR_MAX < 0.99999)
+        {
             IS_VALID = comp_feats::valid_feature_against_selected_pearson_mpi_op;
+        }
         else
+        {
             IS_VALID = comp_feats::valid_feature_against_selected_pearson_max_corr_1_mpi_op;
+        }
     }
 }
 
diff --git a/src/python/py_binding_cpp_def/bindings_docstring_keyed.cpp b/src/python/py_binding_cpp_def/bindings_docstring_keyed.cpp
index def747f6..524c2926 100644
--- a/src/python/py_binding_cpp_def/bindings_docstring_keyed.cpp
+++ b/src/python/py_binding_cpp_def/bindings_docstring_keyed.cpp
@@ -110,7 +110,7 @@ void sisso::register_all()
 
     def(
         "finalize_values_arr",
-        &node_value_arrs::finialize_values_arr,
+        &node_value_arrs::finalize_values_arr,
         "@DocString_node_vals_finalize@"
     );
 
diff --git a/src/utils/compare_features.cpp b/src/utils/compare_features.cpp
index 52860daa..619a6d7a 100644
--- a/src/utils/compare_features.cpp
+++ b/src/utils/compare_features.cpp
@@ -21,7 +21,6 @@
 
 #include "utils/compare_features.hpp"
 #include <iomanip>
-std::vector<double> comp_feats::CORR_CHECK;
 std::vector<double> comp_feats::RANK;
 std::vector<int> comp_feats::INDEX;
 
@@ -64,6 +63,11 @@ void comp_feats::set_is_valid_fxn(
     }
 }
 
+void comp_feats::reset_vectors()
+{
+    RANK.resize(0);
+    INDEX.resize(0);
+}
 
 bool comp_feats::valid_feature_against_selected_pearson_max_corr_1(
     const double* val_ptr,
diff --git a/src/utils/compare_features.hpp b/src/utils/compare_features.hpp
index 9573ae78..b0084cb2 100644
--- a/src/utils/compare_features.hpp
+++ b/src/utils/compare_features.hpp
@@ -30,7 +30,6 @@ typedef std::tuple<node_ptr, double> node_sc_pair;
 
 namespace comp_feats
 {
-    extern std::vector<double> CORR_CHECK; //!< Vector for storing cross_corelation values
     extern std::vector<double> RANK; //!< Global variable used to store the rank variables for Spearman correlation
     extern std::vector<int> INDEX; //!< Global variable used to store the sorting indexes for Spearman correlation
 
@@ -51,6 +50,11 @@ namespace comp_feats
         std::function<bool(const double*, const int, const double, const std::vector<node_ptr>&, const std::vector<double>&, const double)>& is_valid_feat_list
     );
 
+    /**
+     * @brief Reset the RANK and INDEX vectors to be size 0
+     */
+    void reset_vectors();
+
     /**
      * @brief Checks the feature to see if it is still valid against previously selected features (using the Pearson correlation coefficient with a maximum cross-correlation of 1.0)
      *
diff --git a/tests/googletest/classification/test_convex_hull_1d.cc b/tests/googletest/classification/test_convex_hull_1d.cc
index 6b353c52..bccf03a1 100644
--- a/tests/googletest/classification/test_convex_hull_1d.cc
+++ b/tests/googletest/classification/test_convex_hull_1d.cc
@@ -24,7 +24,6 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_d_matrix_arr();
             mpi_setup::init_mpi_env();
 
             _task_sizes_train = {40, 40};
@@ -68,6 +67,11 @@ namespace
             };
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<FeatureNode> _phi;
         std::vector<double> _prop;
         std::vector<int> _task_sizes_train;
diff --git a/tests/googletest/classification/test_lp_wrapper.cc b/tests/googletest/classification/test_lp_wrapper.cc
index 50efd6bd..60d18e15 100644
--- a/tests/googletest/classification/test_lp_wrapper.cc
+++ b/tests/googletest/classification/test_lp_wrapper.cc
@@ -25,13 +25,14 @@ namespace
     protected:
         void SetUp() override
         {
-            node_value_arrs::initialize_d_matrix_arr();
             mpi_setup::init_mpi_env();
 
             std::vector<int> task_sizes_train = {80};
             std::vector<int> task_sizes_test = {20};
 
             node_value_arrs::initialize_values_arr(task_sizes_train, task_sizes_test, 2, 2, false);
+            node_value_arrs::initialize_d_matrix_arr();
+            node_value_arrs::resize_d_matrix_arr(2);
 
             std::vector<double> value_1(task_sizes_train[0], 0.0);
             std::vector<double> value_2(task_sizes_train[0], 0.0);
@@ -93,6 +94,7 @@ namespace
                 FeatureNode(1, "B", value_2, test_value_2, Unit("m"))
             };
 
+            _tol = 1e-5;
             _error.resize(80, 0.0);
             _test_error.resize(20, 0.0);
             _task_num = 0;
@@ -104,11 +106,17 @@ namespace
             _samp_per_class = std::vector<int>(4, 20);
             _samp_per_class_test = std::vector<int>(4, 5);
 
-            prop_sorted_d_mat::initialize_sroted_d_matrix_arr(2, 1, 4, _samp_per_class);
+            prop_sorted_d_mat::initialize_sorted_d_matrix_arr(2, 1, 4, _samp_per_class);
             std::copy_n(value_1.data(), value_1.size(), prop_sorted_d_mat::access_sorted_d_matrix(0));
             std::copy_n(value_2.data(), value_2.size(),prop_sorted_d_mat::access_sorted_d_matrix(1));
         }
 
+        void TearDown() override
+        {
+            prop_sorted_d_mat::finalize_sorted_d_matrix_arr();
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<FeatureNode> _phi;
 
         std::vector<double> _error;
diff --git a/tests/googletest/classification/test_prop_sorted_d_mat.cc b/tests/googletest/classification/test_prop_sorted_d_mat.cc
index a6cf0b46..e61cf3f0 100644
--- a/tests/googletest/classification/test_prop_sorted_d_mat.cc
+++ b/tests/googletest/classification/test_prop_sorted_d_mat.cc
@@ -38,7 +38,7 @@ namespace
 
     TEST_F(PropSOrtedDMatTests, TestSortedDMat)
     {
-        prop_sorted_d_mat::initialize_sroted_d_matrix_arr(1, _n_task, _n_class, _n_samples_per_class);
+        prop_sorted_d_mat::initialize_sorted_d_matrix_arr(1, _n_task, _n_class, _n_samples_per_class);
         EXPECT_EQ(prop_sorted_d_mat::CLASS_START[1], 18);
         EXPECT_EQ(prop_sorted_d_mat::N_SAMPLES_PER_CLASS[1], 19);
         EXPECT_EQ(prop_sorted_d_mat::N_FEATURES, 1);
@@ -47,7 +47,7 @@ namespace
         EXPECT_EQ(prop_sorted_d_mat::N_SAMPLES, std::accumulate(_n_samples_per_class.begin(), _n_samples_per_class.end(), 0));
         EXPECT_EQ(prop_sorted_d_mat::SORTED_D_MATRIX.size(), 80);
 
-        prop_sorted_d_mat::resize_sroted_d_matrix_arr(_n_feat);
+        prop_sorted_d_mat::resize_sorted_d_matrix_arr(_n_feat);
         EXPECT_EQ(prop_sorted_d_mat::N_FEATURES, _n_feat);
         EXPECT_EQ(prop_sorted_d_mat::SORTED_D_MATRIX.size(), 80 * _n_feat);
 
@@ -61,5 +61,6 @@ namespace
 
         prop_sorted_d_mat::access_sample_sorted_d_matrix(2)[0] = 1.5;
         EXPECT_EQ(prop_sorted_d_mat::access_sample_sorted_d_matrix(2, 0, 0)[0], 1.5);
+        prop_sorted_d_mat::finalize_sorted_d_matrix_arr();
     }
 }
diff --git a/tests/googletest/classification/test_svm_wrapper.cc b/tests/googletest/classification/test_svm_wrapper.cc
index d9898c43..b55ee6bc 100644
--- a/tests/googletest/classification/test_svm_wrapper.cc
+++ b/tests/googletest/classification/test_svm_wrapper.cc
@@ -113,6 +113,11 @@ namespace
             std::fill_n(_prop_test.begin() + 15, 5, 3.0);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<FeatureNode> _phi;
 
         std::vector<double> _prop;
diff --git a/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc b/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc
index 84b3790a..10348360 100644
--- a/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc
+++ b/tests/googletest/descriptor_identification/solver/test_sisso_classifier.cc
@@ -24,13 +24,13 @@ namespace
         void SetUp() override
         {
             allowed_op_maps::set_node_maps();
-            node_value_arrs::initialize_d_matrix_arr();
             mpi_setup::init_mpi_env();
 
             std::vector<int> task_sizes_train = {80};
             std::vector<int> task_sizes_test = {20};
 
             node_value_arrs::initialize_values_arr(task_sizes_train, task_sizes_test, 3, 2, false);
+            node_value_arrs::initialize_d_matrix_arr();
 
             std::vector<std::string> sample_ids_train(task_sizes_train[0]);
             for(int ii = 0; ii < task_sizes_train[0]; ++ii)
@@ -161,6 +161,12 @@ namespace
             inputs.set_n_models_store(3);
         }
 
+        void TearDown() override
+        {
+            prop_sorted_d_mat::finalize_sorted_d_matrix_arr();
+            node_value_arrs::finalize_values_arr();
+        }
+
         InputParser inputs;
     };
 
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 35995fcb..c738b9a7 100644
--- a/tests/googletest/descriptor_identification/solver/test_sisso_log_regressor.cc
+++ b/tests/googletest/descriptor_identification/solver/test_sisso_log_regressor.cc
@@ -24,13 +24,13 @@ namespace
         void SetUp() override
         {
             allowed_op_maps::set_node_maps();
-            node_value_arrs::initialize_d_matrix_arr();
             mpi_setup::init_mpi_env();
 
             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);
+            node_value_arrs::initialize_d_matrix_arr();
 
             std::vector<int> leave_out_inds = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
@@ -121,6 +121,12 @@ namespace
             inputs.set_n_residual(2);
             inputs.set_n_models_store(3);
         }
+
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         InputParser inputs;
 
         std::vector<double> _prop;
diff --git a/tests/googletest/descriptor_identification/solver/test_sisso_regressor.cc b/tests/googletest/descriptor_identification/solver/test_sisso_regressor.cc
index 03cdd564..3018b0f6 100644
--- a/tests/googletest/descriptor_identification/solver/test_sisso_regressor.cc
+++ b/tests/googletest/descriptor_identification/solver/test_sisso_regressor.cc
@@ -147,6 +147,12 @@ namespace
             inputs.set_n_residual(2);
             inputs.set_n_models_store(3);
         }
+
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         InputParser inputs;
 
         std::vector<double> _prop;
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 9668bf16..e196bd19 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
@@ -46,6 +46,11 @@ namespace
             _phi.push_back(std::make_shared<SubNode>(_feat_1, _feat_2, 4, -1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 989b7500..d1d5440f 100644
--- a/tests/googletest/feature_creation/feature_generation/test_abs_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_abs_node.cc
@@ -43,6 +43,11 @@ namespace
             _phi.push_back(std::make_shared<AbsDiffNode>(_feat_1, _feat_3, 3, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 329bb0bc..b50c3774 100644
--- a/tests/googletest/feature_creation/feature_generation/test_add_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_add_node.cc
@@ -44,6 +44,11 @@ namespace
             _phi.push_back(std::make_shared<SubNode>(_feat_1, _feat_2, 4, -1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 a658d9de..0a2ebebe 100644
--- a/tests/googletest/feature_creation/feature_generation/test_cb_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_cb_node.cc
@@ -50,6 +50,11 @@ namespace
             _phi.push_back(std::make_shared<CbrtNode>(_feat_1, 11, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 8de70ccc..e556cd04 100644
--- a/tests/googletest/feature_creation/feature_generation/test_cbrt_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_cbrt_node.cc
@@ -52,6 +52,11 @@ namespace
             _phi.push_back(std::make_shared<SixPowNode>(_feat_1, 12, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 0b54bc0d..73ea5c78 100644
--- a/tests/googletest/feature_creation/feature_generation/test_cos_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_cos_node.cc
@@ -41,6 +41,11 @@ namespace
             _phi.push_back(std::make_shared<SinNode>(_feat_1, 3, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 a90af33f..162cb34a 100644
--- a/tests/googletest/feature_creation/feature_generation/test_div_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_div_node.cc
@@ -46,6 +46,11 @@ namespace
             _phi.push_back(std::make_shared<InvNode>(_feat_2, 5, -1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 1337adbc..cb3dff65 100644
--- a/tests/googletest/feature_creation/feature_generation/test_exp_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_exp_node.cc
@@ -48,6 +48,11 @@ namespace
             _phi.push_back(std::make_shared<SubNode>(_feat_1, _feat_3, 3, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 51480b42..ffa48c9a 100644
--- a/tests/googletest/feature_creation/feature_generation/test_feat_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_feat_node.cc
@@ -34,6 +34,11 @@ namespace
             _test_value_3 =  {5.0};
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<double> _value_1;
         std::vector<double> _test_value_1;
 
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 56f46c63..7eaa5cec 100644
--- a/tests/googletest/feature_creation/feature_generation/test_inv_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_inv_node.cc
@@ -51,6 +51,11 @@ namespace
             _phi.push_back(std::make_shared<DivNode>(_feat_1, _feat_3, 11, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 872d087d..87c67d1f 100644
--- a/tests/googletest/feature_creation/feature_generation/test_log_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_log_node.cc
@@ -64,6 +64,11 @@ namespace
             _phi.push_back(std::make_shared<SixPowNode>(_feat_1, 13, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 9b502069..8b45808d 100644
--- a/tests/googletest/feature_creation/feature_generation/test_model_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_model_node.cc
@@ -35,6 +35,11 @@ namespace
             _test_value_3 =  {5.0};
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<double> _value_1;
         std::vector<double> _test_value_1;
 
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 411902d3..eecf8f70 100644
--- a/tests/googletest/feature_creation/feature_generation/test_mult_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_mult_node.cc
@@ -44,6 +44,11 @@ namespace
             _phi.push_back(std::make_shared<DivNode>(_feat_1, _feat_2, 4, -1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 0ed9d1ca..55d5707a 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
@@ -48,6 +48,11 @@ namespace
             _phi.push_back(std::make_shared<SubNode>(_feat_1, _feat_3, 3, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 aa4263c5..b00850ba 100644
--- a/tests/googletest/feature_creation/feature_generation/test_sin_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_sin_node.cc
@@ -41,6 +41,11 @@ namespace
             _phi.push_back(std::make_shared<CosNode>(_feat_1, 3, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 e5d3d0d8..3c596968 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
@@ -54,6 +54,11 @@ namespace
             _phi.push_back(std::make_shared<CbNode>(_feat_1, 12, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 632899cc..5bf19280 100644
--- a/tests/googletest/feature_creation/feature_generation/test_sq_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_sq_node.cc
@@ -48,6 +48,11 @@ namespace
             _phi.push_back(std::make_shared<SqrtNode>(_feat_1, 11, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 254fc49d..0e47ee55 100644
--- a/tests/googletest/feature_creation/feature_generation/test_sqrt_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_sqrt_node.cc
@@ -54,6 +54,11 @@ namespace
             _phi.push_back(std::make_shared<SixPowNode>(_feat_1, 12, 1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 dc308a94..f4aad156 100644
--- a/tests/googletest/feature_creation/feature_generation/test_sub_node.cc
+++ b/tests/googletest/feature_creation/feature_generation/test_sub_node.cc
@@ -44,6 +44,11 @@ namespace
             _phi.push_back(std::make_shared<AddNode>(_feat_1, _feat_2, 4, -1e-50, 1e50));
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 1d30c91c..3d4bc533 100644
--- a/tests/googletest/feature_creation/feature_space/test_feat_space.cc
+++ b/tests/googletest/feature_creation/feature_space/test_feat_space.cc
@@ -23,16 +23,16 @@ namespace
         void SetUp() override
         {
             allowed_op_maps::set_node_maps();
-#ifdef PARAMETERIZE
+            #ifdef PARAMETERIZE
             allowed_op_maps::set_param_node_maps();
-#endif
-            node_value_arrs::initialize_d_matrix_arr();
+            #endif
             mpi_setup::init_mpi_env();
 
             std::vector<int> task_sizes = {5, 5};
             int n_samp = std::accumulate(task_sizes.begin(), task_sizes.end(), 0);
 
             node_value_arrs::initialize_values_arr(task_sizes, {0, 0}, 3, 2, false);
+            node_value_arrs::initialize_d_matrix_arr();
 
             std::vector<double> value_1(n_samp, 0.0);
             std::vector<double> value_2(n_samp, 0.0);
@@ -79,6 +79,11 @@ namespace
             _inputs.set_reparam_residual(false);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         InputParser _inputs;
         std::vector<double> _prop;
         std::vector<double> _prop_log_reg;
@@ -225,5 +230,6 @@ namespace
         EXPECT_LT(std::abs(feat_space.phi()[0]->value()[0] - _inputs.phi_0()[0].value()[0]), 1e-10);
 
         boost::filesystem::remove_all("feature_space/");
+        prop_sorted_d_mat::finalize_sorted_d_matrix_arr();
     }
 }
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 f0688b45..79ee8fbd 100644
--- a/tests/googletest/feature_creation/parameterization/test_abs_diff_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_abs_diff_node.cc
@@ -72,6 +72,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _abs_diff_test;
diff --git a/tests/googletest/feature_creation/parameterization/test_abs_node.cc b/tests/googletest/feature_creation/parameterization/test_abs_node.cc
index cf7bf7c6..a337b3dc 100644
--- a/tests/googletest/feature_creation/parameterization/test_abs_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_abs_node.cc
@@ -61,6 +61,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _abs_test;
 
diff --git a/tests/googletest/feature_creation/parameterization/test_add_node.cc b/tests/googletest/feature_creation/parameterization/test_add_node.cc
index 9399eacf..c9b3f000 100644
--- a/tests/googletest/feature_creation/parameterization/test_add_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_add_node.cc
@@ -72,6 +72,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _add_test;
diff --git a/tests/googletest/feature_creation/parameterization/test_cb_node.cc b/tests/googletest/feature_creation/parameterization/test_cb_node.cc
index 81e5d78d..42652870 100644
--- a/tests/googletest/feature_creation/parameterization/test_cb_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_cb_node.cc
@@ -75,6 +75,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _exp_test;
diff --git a/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc b/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc
index 6b3c1bef..80c1fcc5 100644
--- a/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_cbrt_node.cc
@@ -72,6 +72,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _cbrt_test;
diff --git a/tests/googletest/feature_creation/parameterization/test_cos_node.cc b/tests/googletest/feature_creation/parameterization/test_cos_node.cc
index e8e988ce..134b44ae 100644
--- a/tests/googletest/feature_creation/parameterization/test_cos_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_cos_node.cc
@@ -76,6 +76,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
diff --git a/tests/googletest/feature_creation/parameterization/test_div_node.cc b/tests/googletest/feature_creation/parameterization/test_div_node.cc
index 202b05e3..c498c9b1 100644
--- a/tests/googletest/feature_creation/parameterization/test_div_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_div_node.cc
@@ -72,6 +72,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _div_test;
diff --git a/tests/googletest/feature_creation/parameterization/test_exp_node.cc b/tests/googletest/feature_creation/parameterization/test_exp_node.cc
index 19008656..78940e6a 100644
--- a/tests/googletest/feature_creation/parameterization/test_exp_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_exp_node.cc
@@ -79,6 +79,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
diff --git a/tests/googletest/feature_creation/parameterization/test_inv_node.cc b/tests/googletest/feature_creation/parameterization/test_inv_node.cc
index cef2d1bb..1341e308 100644
--- a/tests/googletest/feature_creation/parameterization/test_inv_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_inv_node.cc
@@ -72,6 +72,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _inv_test;
diff --git a/tests/googletest/feature_creation/parameterization/test_log_node.cc b/tests/googletest/feature_creation/parameterization/test_log_node.cc
index dccbf234..4f5d3f42 100644
--- a/tests/googletest/feature_creation/parameterization/test_log_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_log_node.cc
@@ -81,6 +81,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
diff --git a/tests/googletest/feature_creation/parameterization/test_mult_node.cc b/tests/googletest/feature_creation/parameterization/test_mult_node.cc
index 9d6759d9..43a03876 100644
--- a/tests/googletest/feature_creation/parameterization/test_mult_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_mult_node.cc
@@ -72,6 +72,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _mult_test;
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 cb2ef047..b648a059 100644
--- a/tests/googletest/feature_creation/parameterization/test_neg_exp_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_neg_exp_node.cc
@@ -79,6 +79,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
diff --git a/tests/googletest/feature_creation/parameterization/test_sin_node.cc b/tests/googletest/feature_creation/parameterization/test_sin_node.cc
index 3e3e8f50..ff277add 100644
--- a/tests/googletest/feature_creation/parameterization/test_sin_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_sin_node.cc
@@ -76,6 +76,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _feat_3;
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 ca42f461..b9d7cbf5 100644
--- a/tests/googletest/feature_creation/parameterization/test_six_pow_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_six_pow_node.cc
@@ -71,6 +71,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _six_pow_test;
diff --git a/tests/googletest/feature_creation/parameterization/test_sq_node.cc b/tests/googletest/feature_creation/parameterization/test_sq_node.cc
index 770a0553..03826f66 100644
--- a/tests/googletest/feature_creation/parameterization/test_sq_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_sq_node.cc
@@ -71,6 +71,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _sq_test;
diff --git a/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc b/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc
index 91a13a8a..6df971e4 100644
--- a/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_sqrt_node.cc
@@ -71,6 +71,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _sqrt_test;
diff --git a/tests/googletest/feature_creation/parameterization/test_sub_node.cc b/tests/googletest/feature_creation/parameterization/test_sub_node.cc
index cb936433..4b74be54 100644
--- a/tests/googletest/feature_creation/parameterization/test_sub_node.cc
+++ b/tests/googletest/feature_creation/parameterization/test_sub_node.cc
@@ -71,6 +71,11 @@ namespace
             _optimizer = nlopt_wrapper::get_optimizer("regression",_task_sizes_train, _prop, 1);
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         node_ptr _feat_1;
         node_ptr _feat_2;
         node_ptr _sub_test;
diff --git a/tests/googletest/feature_creation/utils/test_utils.cc b/tests/googletest/feature_creation/utils/test_utils.cc
index 5db1d69e..58fa6e5f 100644
--- a/tests/googletest/feature_creation/utils/test_utils.cc
+++ b/tests/googletest/feature_creation/utils/test_utils.cc
@@ -41,6 +41,11 @@ namespace
             _feat_ind = 3;
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<node_ptr> _phi0;
         unsigned long int _feat_ind;
     };
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 edfbe6d0..3a6f4aa5 100644
--- a/tests/googletest/feature_creation/value_storage/test_value_storage.cc
+++ b/tests/googletest/feature_creation/value_storage/test_value_storage.cc
@@ -17,6 +17,7 @@
 
 namespace {
 
+
     //test mean calculations
     TEST(ValueStorage, ValueStorageTest)
     {
@@ -87,5 +88,30 @@ namespace {
         std::fill_n(node_value_arrs::TEMP_STORAGE_TEST_REG.data(), node_value_arrs::TEMP_STORAGE_REG.size(), 2.0);
         node_value_arrs::clear_temp_test_reg();
         EXPECT_EQ(node_value_arrs::TEMP_STORAGE_TEST_REG[0], -1);
+
+        node_value_arrs::finalize_values_arr();
+        EXPECT_EQ(node_value_arrs::VALUES_ARR.size(), 0);
+        EXPECT_EQ(node_value_arrs::TEST_VALUES_ARR.size(), 0);
+        EXPECT_EQ(node_value_arrs::TEMP_STORAGE_ARR.size(), 0);
+        EXPECT_EQ(node_value_arrs::TEMP_STORAGE_TEST_ARR.size(), 0);
+        EXPECT_EQ(node_value_arrs::TEMP_STORAGE_REG.size(), 0);
+        EXPECT_EQ(node_value_arrs::TEMP_STORAGE_TEST_REG.size(), 0);
+        EXPECT_EQ(node_value_arrs::PARAM_STORAGE_ARR.size(), 0);
+        EXPECT_EQ(node_value_arrs::PARAM_STORAGE_TEST_ARR.size(), 0);
+        EXPECT_EQ(node_value_arrs::D_MATRIX.size(), 0);
+        EXPECT_EQ(node_value_arrs::TASK_SZ_TRAIN.size(), 0);
+        EXPECT_EQ(node_value_arrs::TASK_START_TRAIN.size(), 0);
+        EXPECT_EQ(node_value_arrs::TASK_SZ_TEST.size(), 0);
+        EXPECT_EQ(node_value_arrs::N_SELECTED, 0);
+        EXPECT_EQ(node_value_arrs::N_SAMPLES, 0);
+        EXPECT_EQ(node_value_arrs::N_SAMPLES_TEST, 0);
+        EXPECT_EQ(node_value_arrs::N_PRIMARY_FEATURES, 0);
+        EXPECT_EQ(node_value_arrs::N_STORE_FEATURES, 0);
+        EXPECT_EQ(node_value_arrs::N_RUNGS_STORED, 0);
+        EXPECT_EQ(node_value_arrs::MAX_RUNG, 0);
+
+        EXPECT_EQ(node_value_arrs::MAX_N_THREADS, omp_get_max_threads());
+        EXPECT_EQ(node_value_arrs::N_OP_SLOTS, 0);
+        EXPECT_EQ(node_value_arrs::N_PARAM_OP_SLOTS, 0);
     }
 }
diff --git a/tests/googletest/inputs/input_parser.cc b/tests/googletest/inputs/input_parser.cc
index df2485dc..d3129f52 100644
--- a/tests/googletest/inputs/input_parser.cc
+++ b/tests/googletest/inputs/input_parser.cc
@@ -22,7 +22,6 @@ namespace
         void SetUp() override
         {
             std::vector<std::string> filepath = str_utils::split_string_trim(__FILE__, "/");
-            node_value_arrs::finialize_values_arr();
             _sample_ids_train = {"a", "b", "c"};
             _sample_ids_test = {"d"};
             _task_names = {"task_1", "task_2"};
@@ -55,7 +54,7 @@ namespace
 
             _fix_intercept = false;
 
-#ifdef PARAMETERIZE
+            #ifdef PARAMETERIZE
             _filename = (
                 str_utils::join("/", filepath.data(), filepath.size() - 1) +
                 "/sisso_param.json"
@@ -69,12 +68,17 @@ namespace
             _global_param_opt = true;
             _reparam_residual = true;
 
-#else
+            #else
             _filename = (
                 str_utils::join("/", filepath.data(), filepath.size() - 1) +
                 "/sisso.json"
             );
-#endif
+            #endif
+        }
+
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
         }
 
         std::vector<std::string> _sample_ids_train; //!< Vector storing all sample ids for the training samples
diff --git a/tests/googletest/loss_function/test_convex_hull_loss.cc b/tests/googletest/loss_function/test_convex_hull_loss.cc
index c6dfa722..d61e7ad8 100644
--- a/tests/googletest/loss_function/test_convex_hull_loss.cc
+++ b/tests/googletest/loss_function/test_convex_hull_loss.cc
@@ -31,6 +31,7 @@ namespace
             node_value_arrs::initialize_d_matrix_arr();
             node_value_arrs::resize_d_matrix_arr(2);
 
+
             std::vector<double> value_1(_task_sizes_train[0], 0.0);
             std::vector<double> value_2(_task_sizes_train[0], 0.0);
 
@@ -123,6 +124,16 @@ namespace
             std::fill_n(_prop_test.begin() +  5, 5, 1.0);
             std::fill_n(_prop_test.begin() + 10, 5, 2.0);
             std::fill_n(_prop_test.begin() + 15, 5, 3.0);
+
+            prop_sorted_d_mat::initialize_sorted_d_matrix_arr(2, _task_sizes_train.size(), 4, std::vector<int>(4, 20));
+            std::copy_n(value_1.data(), _task_sizes_train[0], prop_sorted_d_mat::access_sorted_d_matrix(0));
+            std::copy_n(value_2.data(), _task_sizes_train[0], prop_sorted_d_mat::access_sorted_d_matrix(1));
+        }
+
+        void TearDown() override
+        {
+            prop_sorted_d_mat::finalize_sorted_d_matrix_arr();
+            node_value_arrs::finalize_values_arr();
         }
 
         std::vector<node_ptr> _phi;
diff --git a/tests/googletest/loss_function/test_log_pearson_loss.cc b/tests/googletest/loss_function/test_log_pearson_loss.cc
index e1426d2c..85d95f6b 100644
--- a/tests/googletest/loss_function/test_log_pearson_loss.cc
+++ b/tests/googletest/loss_function/test_log_pearson_loss.cc
@@ -91,6 +91,11 @@ namespace
             std::transform(_prop_test_no_bias.begin(), _prop_test_no_bias.end(), _log_prop_test_no_bias.begin(), [](double p){return std::log(p);});
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<node_ptr> _phi;
         std::vector<model_node_ptr> _model_phi;
 
diff --git a/tests/googletest/loss_function/test_pearson_loss.cc b/tests/googletest/loss_function/test_pearson_loss.cc
index 7defcc8e..9148c0cd 100644
--- a/tests/googletest/loss_function/test_pearson_loss.cc
+++ b/tests/googletest/loss_function/test_pearson_loss.cc
@@ -78,6 +78,11 @@ namespace
             std::transform(test_value_1.begin(), test_value_1.end(), test_value_2.begin(), _prop_test_no_bias.begin(), [=](double v0, double v1){return a0 * v0 + a1 * v1;});
         }
 
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<node_ptr> _phi;
         std::vector<model_node_ptr> _model_phi;
 
diff --git a/tests/googletest/nl_opt/nl_opt_classifier.cc b/tests/googletest/nl_opt/nl_opt_classifier.cc
index f9716306..3e0648cc 100644
--- a/tests/googletest/nl_opt/nl_opt_classifier.cc
+++ b/tests/googletest/nl_opt/nl_opt_classifier.cc
@@ -59,6 +59,12 @@ namespace
 
             _params = {1.0, 7.5};
         }
+
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<int> _task_sizes_train;
         std::vector<double> _prop_train;
         std::vector<double> _params;
diff --git a/tests/googletest/nl_opt/nl_opt_log_regressor.cc b/tests/googletest/nl_opt/nl_opt_log_regressor.cc
index dd7970e0..b019e98e 100644
--- a/tests/googletest/nl_opt/nl_opt_log_regressor.cc
+++ b/tests/googletest/nl_opt/nl_opt_log_regressor.cc
@@ -53,6 +53,12 @@ namespace
                 [](double val){return std::log(val);}
             );
         }
+
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<int> _task_sizes_train;
         std::vector<double> _prop_train;
         std::vector<double> _params;
diff --git a/tests/googletest/nl_opt/nl_opt_regressor.cc b/tests/googletest/nl_opt/nl_opt_regressor.cc
index 670921a9..ac3e1152 100644
--- a/tests/googletest/nl_opt/nl_opt_regressor.cc
+++ b/tests/googletest/nl_opt/nl_opt_regressor.cc
@@ -48,6 +48,12 @@ namespace
             _params = {1.0, distribution_params(generator)};
             std::copy_n(_feat->value_ptr(_params.data()), _task_sizes_train[0], _prop_train.data());
         }
+
+        void TearDown() override
+        {
+            node_value_arrs::finalize_values_arr();
+        }
+
         std::vector<int> _task_sizes_train;
         std::vector<double> _prop_train;
         std::vector<double> _params;
diff --git a/tests/googletest/utils/test_compare_features.cc b/tests/googletest/utils/test_compare_features.cc
index 9826c79c..a976b723 100644
--- a/tests/googletest/utils/test_compare_features.cc
+++ b/tests/googletest/utils/test_compare_features.cc
@@ -43,5 +43,6 @@ namespace {
         EXPECT_TRUE(comp_feats::valid_feature_against_selected_pearson_max_corr_1_feat_list(val_2.data(), 4, 1.0, selected, scores, 0.9028289727756884));
         EXPECT_TRUE(comp_feats::valid_feature_against_selected_pearson(val_2.data(), 4, 1.0, scores, 0.9028289727756884, 1, 0));
         EXPECT_TRUE(comp_feats::valid_feature_against_selected_pearson_feat_list(val_2.data(), 4, 1.0, selected, scores, 0.9028289727756884));
+        node_value_arrs::finalize_values_arr();
     }
 }
diff --git a/tests/googletest/utils/test_project.cc b/tests/googletest/utils/test_project.cc
index 0f4b70dc..6abbf809 100644
--- a/tests/googletest/utils/test_project.cc
+++ b/tests/googletest/utils/test_project.cc
@@ -36,5 +36,6 @@ namespace {
         project_funcs::project_r_no_omp(prop.data(), scores.data(), phi, sizes, 1);
         EXPECT_LT(std::abs(-0.9028289727756884 - scores[0]), 1e-10);
         scores[0] = 0.0;
+        node_value_arrs::finalize_values_arr();
     }
 }
-- 
GitLab