From 9c0dead824a5ffe87a042325ff5d776a2427ca54 Mon Sep 17 00:00:00 2001
From: Thomas <purcell@fhi-berlin.mpg.de>
Date: Mon, 19 Apr 2021 09:03:49 +0200
Subject: [PATCH] Fix Bug in MPI ops

When passing into it have the right sized vector
---
 src/feature_creation/feature_space/FeatureSpace.cpp |  4 +++-
 src/mpi_interface/MPI_ops.cpp                       | 10 ++++++----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/feature_creation/feature_space/FeatureSpace.cpp b/src/feature_creation/feature_space/FeatureSpace.cpp
index 938abef6..6a4900af 100644
--- a/src/feature_creation/feature_space/FeatureSpace.cpp
+++ b/src/feature_creation/feature_space/FeatureSpace.cpp
@@ -923,7 +923,9 @@ void FeatureSpace::sis(const std::vector<double>& prop)
         // Collect the best features from all ranks
         std::vector<node_sc_pair> local_sel(_n_sis_select, std::make_tuple<node_ptr, double>(nullptr, std::numeric_limits<double>::max()));
         for(int ff = 0; ff < phi_sel.size(); ++ff)
-            local_sel.push_back(mpi_reduce_op::make_node_sc_pair(phi_sel[ff], scores_sel[ff]));
+        {
+            local_sel[ff] = mpi_reduce_op::make_node_sc_pair(phi_sel[ff], scores_sel[ff]);
+        }
 
         std::vector<node_sc_pair> selected(_n_sis_select);
         mpi::all_reduce(
diff --git a/src/mpi_interface/MPI_ops.cpp b/src/mpi_interface/MPI_ops.cpp
index d0426008..ff2f11f1 100644
--- a/src/mpi_interface/MPI_ops.cpp
+++ b/src/mpi_interface/MPI_ops.cpp
@@ -28,12 +28,14 @@ void mpi_reduce_op::set_op(std::string project_type, double cross_cor_max, int n
 
 std::vector<node_sc_pair> mpi_reduce_op::select_top_feats(std::vector<node_sc_pair> in_vec_1, std::vector<node_sc_pair> in_vec_2)
 {
-    std::vector<node_sc_pair> out_vec;
-    out_vec.reserve(N_SIS_SELECT);
-    in_vec_2.insert(in_vec_2.end(), in_vec_1.begin(), in_vec_1.end());
+    // Set up an output vector
+    std::vector<node_sc_pair> out_vec(N_SIS_SELECT);
 
+    // Merge input vectors and sort
+    in_vec_2.insert(in_vec_2.end(), in_vec_1.begin(), in_vec_1.end());
     std::sort(in_vec_2.begin(), in_vec_2.end(), my_sorter);
 
+    // Populate the output vector
     int ff = 0;
     int out_ind = 0;
     while((out_ind < N_SIS_SELECT) && (ff < in_vec_2.size()))
@@ -41,7 +43,7 @@ std::vector<node_sc_pair> mpi_reduce_op::select_top_feats(std::vector<node_sc_pa
         const node_ptr cur_node = std::get<0>(in_vec_2[ff]);
         if(cur_node && IS_VALID(cur_node->value_ptr(), cur_node->n_samp(), CROSS_COR_MAX, out_vec, std::get<1>(in_vec_2[ff])))
         {
-            out_vec.push_back(in_vec_2[ff]);
+            out_vec[out_ind] = in_vec_2[ff];
             ++out_ind;
         }
         ++ff;
-- 
GitLab