From 56770f2233814db64e8b79bc37a7c356e980073c Mon Sep 17 00:00:00 2001
From: Debottam Bakshi Gupta <debottam.bakshi.gupta@cern.ch>
Date: Thu, 8 Jul 2021 18:11:41 +0000
Subject: [PATCH] improving Flattening algorithm from 2Dto1D to multiDto1D

---
 .../AthOnnxruntimeUtils/FlattenInput.h        | 24 ++++++++++++-------
 .../AthExOnnxRuntime/src/EvaluateModel.cxx    |  4 ++--
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
index 0a4abfaf7970..3d472dc3a6c4 100644
--- a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
+++ b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
@@ -13,15 +13,21 @@
 
 namespace AthONNX {
  template<typename T>
- inline std::vector<T> FlattenInput2D_1D( std::vector<std::vector<T>> features, int size){
-    std::vector<float> Flatten1D(size);
-    for(std::size_t r=0;r<features.size();++r){
-      int n_cols = features[r].size();
-      for(int c=0;c<n_cols;++c){
-        float a = float(features[r][c]);
-        Flatten1D[r*n_cols+c] = a;
-      }
-    }
+
+ inline std::vector<T> FlattenInput_multiD_1D( std::vector<std::vector<T>> features){
+    // 1. Compute the total size required.
+    int total_size = 0;
+    for (auto& feature : features) total_size += feature.size();
+    
+    // 2. Create a vector to hold the data.
+    std::vector<T> Flatten1D;
+    Flatten1D.reserve(total_size);
+
+    // 3. Fill it
+    for (auto& feature : features)
+      for (auto& elem : feature)
+        Flatten1D.push_back(elem);
+ 
    return Flatten1D;
   }
 
diff --git a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx
index 98edd86c7d19..45200d5e44da 100644
--- a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx
+++ b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx
@@ -167,7 +167,7 @@ namespace AthONNX {
  
        /***************** Choose an example sample randomly ****************************/  
      	std::vector<std::vector<float>> input_tensor_values = m_input_tensor_values_notFlat[m_testSample];
-        std::vector<float> flatten = AthONNX::FlattenInput2D_1D(input_tensor_values, 784);
+        std::vector<float> flatten = AthONNX::FlattenInput_multiD_1D(input_tensor_values);
         // Output label of corresponding m_input_tensor_values[m_testSample]; e.g 0, 1, 2, 3 etc
         int output_tensor_values = m_output_tensor_values[m_testSample];
        
@@ -235,7 +235,7 @@ namespace AthONNX {
       		std::vector<float> batch_input_tensor_values;
       		for (int j = l; j < l+m_sizeOfBatch; j++) {
                          
-                        std::vector<float> flattened_input = AthONNX::FlattenInput2D_1D(m_input_tensor_values_notFlat[j],784);
+                        std::vector<float> flattened_input = AthONNX::FlattenInput_multiD_1D(m_input_tensor_values_notFlat[j]);
                         /******************For each batch we need a flattened (5 x 28 x 28 = 3920) 1D array******************************/
         		batch_input_tensor_values.insert(batch_input_tensor_values.end(), flattened_input.begin(), flattened_input.end());
         	}   
-- 
GitLab