From b79fa1ca18db05d2cb66dbeaf11d040c55beee7e Mon Sep 17 00:00:00 2001
From: Debo <debottam.bakshi.gupta@cern.ch>
Date: Tue, 2 Feb 2021 16:35:48 +0100
Subject: [PATCH 1/3] Adding an abstraction AthOnnxruntimeUtils over
 AthExOnnxRuntime

---
 .../ATLAS_CHECK_THREAD_SAFETY                 |  1 +
 .../AthOnnxruntimeUtils/FlattenInput.h        | 41 +++++++++++++++++
 Control/AthOnnxruntimeUtils/CMakeLists.txt    | 16 +++++++
 .../AthOnnxruntimeUtils/src/FlattenInput.cxx  | 24 ++++++++++
 .../AthOnnxruntimeUtils_entries.cxx           |  9 ++++
 .../AthExOnnxRuntime/CMakeLists.txt           |  2 +-
 .../share/AthExOnnxRuntime_jobOptions.py      |  1 +
 .../AthExOnnxRuntime/src/EvaluateModel.cxx    | 45 ++++++++++++++++++-
 .../AthExOnnxRuntime/src/EvaluateModel.h      |  3 +-
 9 files changed, 139 insertions(+), 3 deletions(-)
 create mode 100644 Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/ATLAS_CHECK_THREAD_SAFETY
 create mode 100644 Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
 create mode 100644 Control/AthOnnxruntimeUtils/CMakeLists.txt
 create mode 100644 Control/AthOnnxruntimeUtils/src/FlattenInput.cxx
 create mode 100644 Control/AthOnnxruntimeUtils/src/components/AthOnnxruntimeUtils_entries.cxx

diff --git a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/ATLAS_CHECK_THREAD_SAFETY b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/ATLAS_CHECK_THREAD_SAFETY
new file mode 100644
index 000000000000..584871312ff4
--- /dev/null
+++ b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/ATLAS_CHECK_THREAD_SAFETY
@@ -0,0 +1 @@
+Control/AthOnnxruntimeUtils
diff --git a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
new file mode 100644
index 000000000000..6ef6219fd61d
--- /dev/null
+++ b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
@@ -0,0 +1,41 @@
+// Dear emacs, this is -*- c++ -*-
+// Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+#ifndef FlattenInput_H
+#define FlattenInput_H
+
+#include <string>
+#include <iostream> 
+#include <fstream>
+#include <arpa/inet.h>
+#include <vector>
+#include <iterator>
+
+
+namespace AthONNX {
+
+/**  class FlattenInput {
+
+    std::vector<float> m_Flatten1D;
+
+    public:
+       constructor 
+      FlattenInput( std::vector<std::vector<float>> features);
+      ~FlattenInput();
+      std::vector<float> returnFlatten1D();
+   };
+}**/
+
+#endif // FlattenInput_H
+ inline std::vector<float> FlattenInput_1D(const std::vector<std::vector<float>> features){
+    std::vector<float> m_Flatten1D(28*28);
+    for(int 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]);
+        m_Flatten1D[r*n_cols+c] = a;
+      }
+    }
+   return m_Flatten1D;
+  }
+
+ }
diff --git a/Control/AthOnnxruntimeUtils/CMakeLists.txt b/Control/AthOnnxruntimeUtils/CMakeLists.txt
new file mode 100644
index 000000000000..fc5158b2f385
--- /dev/null
+++ b/Control/AthOnnxruntimeUtils/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+# Declare the package's name.
+atlas_subdir( AthOnnxruntimeUtils )
+
+# Component(s) in the package.
+atlas_add_library( AthOnnxruntimeUtilsLib
+   #src/*.cxx
+   INTERFACE
+   PUBLIC_HEADERS AthOnnxruntimeUtils
+   LINK_LIBRARIES AthenaKernel GaudiKernel )
+
+#atlas_add_component( AthOnnxruntimeUtils
+   #src/components/*.cxx
+ #  LINK_LIBRARIES AthOnnxruntimeUtilsLib )
+
diff --git a/Control/AthOnnxruntimeUtils/src/FlattenInput.cxx b/Control/AthOnnxruntimeUtils/src/FlattenInput.cxx
new file mode 100644
index 000000000000..38da0dac03c8
--- /dev/null
+++ b/Control/AthOnnxruntimeUtils/src/FlattenInput.cxx
@@ -0,0 +1,24 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthOnnxruntimeUtils/FlattenInput.h"
+
+namespace AthONNX {
+ 
+  FlattenInput::FlattenInput(const std::vector<std::vector<float>> features){
+
+    for(int r=0;r<features.size();++r){
+      int n_cols = features[r].size();
+      for(int c=0;c<n_cols;++c){
+        unsigned char temp=0;
+        m_Flatten1D[r*n_cols+c]=features[r][c];
+      }
+    }
+  }
+
+  FlattenInput::~FlattenInput(){}
+
+  std::vector<float> FlattenInput::returnFlatten1D(){return m_Flatten1D;}
+}
+
diff --git a/Control/AthOnnxruntimeUtils/src/components/AthOnnxruntimeUtils_entries.cxx b/Control/AthOnnxruntimeUtils/src/components/AthOnnxruntimeUtils_entries.cxx
new file mode 100644
index 000000000000..f1b6c6193f16
--- /dev/null
+++ b/Control/AthOnnxruntimeUtils/src/components/AthOnnxruntimeUtils_entries.cxx
@@ -0,0 +1,9 @@
+// Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+// Local include(s).
+#include "AthOnnxruntimeUtils/FlattenInput.h"
+
+// Declare the package's components.
+DECLARE_COMPONENT(AthONNX::FlattenInput )
+
+
diff --git a/Control/AthenaExamples/AthExOnnxRuntime/CMakeLists.txt b/Control/AthenaExamples/AthExOnnxRuntime/CMakeLists.txt
index 2cf4c6266bf7..5aa822732907 100644
--- a/Control/AthenaExamples/AthExOnnxRuntime/CMakeLists.txt
+++ b/Control/AthenaExamples/AthExOnnxRuntime/CMakeLists.txt
@@ -13,7 +13,7 @@ atlas_add_library( AthExOnnxRuntimeLib
 atlas_add_component( AthExOnnxRuntime
    src/*.h src/*.cxx src/components/*.cxx
    INCLUDE_DIRS ${ONNXRUNTIME_INCLUDE_DIRS}
-   LINK_LIBRARIES ${ONNXRUNTIME_LIBRARIES} AthExOnnxRuntimeLib AthenaBaseComps GaudiKernel PathResolver AthOnnxruntimeServiceLib)
+   LINK_LIBRARIES ${ONNXRUNTIME_LIBRARIES} AthExOnnxRuntimeLib AthenaBaseComps GaudiKernel PathResolver AthOnnxruntimeServiceLib AthOnnxruntimeUtilsLib)
 
 # Install files from the package.
 atlas_install_joboptions( share/*.py )
diff --git a/Control/AthenaExamples/AthExOnnxRuntime/share/AthExOnnxRuntime_jobOptions.py b/Control/AthenaExamples/AthExOnnxRuntime/share/AthExOnnxRuntime_jobOptions.py
index ac1beaef5aeb..65db94b13e03 100644
--- a/Control/AthenaExamples/AthExOnnxRuntime/share/AthExOnnxRuntime_jobOptions.py
+++ b/Control/AthenaExamples/AthExOnnxRuntime/share/AthExOnnxRuntime_jobOptions.py
@@ -20,6 +20,7 @@ AthONNX.TestSample = randint(0, 9999)
 AthONNX.DoBatches = False
 AthONNX.NumberOfBatches = 1
 AthONNX.SizeOfBatch = 1
+AthONNX.OutputLevel = DEBUG
 
 # Run for 10 "events".
 theApp.EvtMax = 2
diff --git a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx
index 90bcb63839f9..994e6e215f73 100644
--- a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx
+++ b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx
@@ -5,9 +5,44 @@
 
 // Framework include(s).
 #include "PathResolver/PathResolver.h"
+#include "AthOnnxruntimeUtils/FlattenInput.h"
 
+//class AthONNX::FlattenInput;
 namespace AthONNX {
 
+   //*******************************************************************
+   // for reading MNIST images
+   std::vector<std::vector<std::vector<float>>> read_mnist_pixel_notFlat(const std::string &full_path) //function to load test images
+   {
+     std::vector<std::vector<std::vector<float>>> input_tensor_values;
+     input_tensor_values.resize(10000, std::vector<std::vector<float> >(28,std::vector<float>(28)));
+     std::ifstream file (full_path.c_str(), std::ios::binary);
+     int magic_number=0;
+     int number_of_images=0;
+     int n_rows=0;
+     int n_cols=0;
+     file.read((char*)&magic_number,sizeof(magic_number));
+     magic_number= ntohl(magic_number);
+     file.read((char*)&number_of_images,sizeof(number_of_images));
+     number_of_images= ntohl(number_of_images);
+     file.read((char*)&n_rows,sizeof(n_rows));
+     n_rows= ntohl(n_rows);
+     file.read((char*)&n_cols,sizeof(n_cols));
+     n_cols= ntohl(n_cols);
+     for(int i=0;i<number_of_images;++i)
+     {
+      	for(int r=0;r<n_rows;++r)
+        {
+           for(int c=0;c<n_cols;++c)
+           {
+             unsigned char temp=0;
+             file.read((char*)&temp,sizeof(temp));
+             input_tensor_values[i][r][c]= float(temp)/255;
+           }
+	}
+     }
+     return input_tensor_values;
+   }
    //*******************************************************************
    // for reading MNIST images
    std::vector<std::vector<float>> read_mnist_pixel(const std::string &full_path) //function to load test images
@@ -96,8 +131,14 @@ namespace AthONNX {
                                                     sessionOptions );
       ATH_MSG_INFO( "Created the ONNX Runtime session" );
       m_input_tensor_values = read_mnist_pixel(pixelFileName);
+      m_input_tensor_values_notFlat = read_mnist_pixel_notFlat(pixelFileName);
       m_output_tensor_values = read_mnist_label(labelFileName);
-
+      ATH_MSG_DEBUG("Debo1...........................");
+      std::vector<std::vector<float>> c = m_input_tensor_values_notFlat[0];
+      ATH_MSG_DEBUG("Debo2...........................");
+     // AthONNX::FlattenInput flatten(c);
+      ATH_MSG_DEBUG("Debo3...........................");
+      m_flatten1D = AthONNX::FlattenInput_1D(c);      
       // Return gracefully.
       return StatusCode::SUCCESS;
    }
@@ -170,6 +211,8 @@ namespace AthONNX {
        
         // For a check that the sample dimension is fully flatten (1x28x28 = 784)
      	ATH_MSG_DEBUG("Size of Input tensor: "<<input_tensor_values.size()); 
+        ATH_MSG_DEBUG("Size of notFlat Input tensor: "<<m_input_tensor_values_notFlat[0][0].size());
+        ATH_MSG_DEBUG("Size of Flatten Input tensor: "<<m_flatten1D.size());
 
      	/************** Create input tensor object from input data values to feed into your model *********************/
      	Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, 
diff --git a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.h b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.h
index 59e0fc5933e6..d284f3cf9045 100644
--- a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.h
+++ b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.h
@@ -5,7 +5,6 @@
 
 // Local include(s).
 #include "AthOnnxruntimeService/IONNXRuntimeSvc.h"
-
 // Framework include(s).
 #include "AthenaBaseComps/AthReentrantAlgorithm.h"
 #include "GaudiKernel/ServiceHandle.h"
@@ -80,7 +79,9 @@ namespace AthONNX {
       /// The "session" of ONNX Runtime that we'll be using
       std::unique_ptr< Ort::Session > m_session;
       std::vector<std::vector<float>> m_input_tensor_values;
+      std::vector<std::vector<std::vector<float>>> m_input_tensor_values_notFlat;
       std::vector<int> m_output_tensor_values;
+      std::vector<float> m_flatten1D;
 
    }; // class EvaluateModel
 
-- 
GitLab


From 4759da6ea804fb09065d097ed3f2182bd5e491d8 Mon Sep 17 00:00:00 2001
From: Debo <debottam.bakshi.gupta@cern.ch>
Date: Tue, 16 Feb 2021 15:11:47 +0100
Subject: [PATCH 2/3] removing unnecessary .cxx files

---
 .../AthOnnxruntimeUtils/FlattenInput.h        | 14 +----------
 Control/AthOnnxruntimeUtils/CMakeLists.txt    |  5 ----
 .../AthOnnxruntimeUtils/src/FlattenInput.cxx  | 24 -------------------
 .../AthOnnxruntimeUtils_entries.cxx           |  9 -------
 4 files changed, 1 insertion(+), 51 deletions(-)
 delete mode 100644 Control/AthOnnxruntimeUtils/src/FlattenInput.cxx
 delete mode 100644 Control/AthOnnxruntimeUtils/src/components/AthOnnxruntimeUtils_entries.cxx

diff --git a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
index 6ef6219fd61d..c84204d23cad 100644
--- a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
+++ b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
@@ -13,19 +13,6 @@
 
 namespace AthONNX {
 
-/**  class FlattenInput {
-
-    std::vector<float> m_Flatten1D;
-
-    public:
-       constructor 
-      FlattenInput( std::vector<std::vector<float>> features);
-      ~FlattenInput();
-      std::vector<float> returnFlatten1D();
-   };
-}**/
-
-#endif // FlattenInput_H
  inline std::vector<float> FlattenInput_1D(const std::vector<std::vector<float>> features){
     std::vector<float> m_Flatten1D(28*28);
     for(int r=0;r<features.size();++r){
@@ -39,3 +26,4 @@ namespace AthONNX {
   }
 
  }
+#endif
diff --git a/Control/AthOnnxruntimeUtils/CMakeLists.txt b/Control/AthOnnxruntimeUtils/CMakeLists.txt
index fc5158b2f385..4889ec32ea92 100644
--- a/Control/AthOnnxruntimeUtils/CMakeLists.txt
+++ b/Control/AthOnnxruntimeUtils/CMakeLists.txt
@@ -5,12 +5,7 @@ atlas_subdir( AthOnnxruntimeUtils )
 
 # Component(s) in the package.
 atlas_add_library( AthOnnxruntimeUtilsLib
-   #src/*.cxx
    INTERFACE
    PUBLIC_HEADERS AthOnnxruntimeUtils
    LINK_LIBRARIES AthenaKernel GaudiKernel )
 
-#atlas_add_component( AthOnnxruntimeUtils
-   #src/components/*.cxx
- #  LINK_LIBRARIES AthOnnxruntimeUtilsLib )
-
diff --git a/Control/AthOnnxruntimeUtils/src/FlattenInput.cxx b/Control/AthOnnxruntimeUtils/src/FlattenInput.cxx
deleted file mode 100644
index 38da0dac03c8..000000000000
--- a/Control/AthOnnxruntimeUtils/src/FlattenInput.cxx
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-*/
-
-#include "AthOnnxruntimeUtils/FlattenInput.h"
-
-namespace AthONNX {
- 
-  FlattenInput::FlattenInput(const std::vector<std::vector<float>> features){
-
-    for(int r=0;r<features.size();++r){
-      int n_cols = features[r].size();
-      for(int c=0;c<n_cols;++c){
-        unsigned char temp=0;
-        m_Flatten1D[r*n_cols+c]=features[r][c];
-      }
-    }
-  }
-
-  FlattenInput::~FlattenInput(){}
-
-  std::vector<float> FlattenInput::returnFlatten1D(){return m_Flatten1D;}
-}
-
diff --git a/Control/AthOnnxruntimeUtils/src/components/AthOnnxruntimeUtils_entries.cxx b/Control/AthOnnxruntimeUtils/src/components/AthOnnxruntimeUtils_entries.cxx
deleted file mode 100644
index f1b6c6193f16..000000000000
--- a/Control/AthOnnxruntimeUtils/src/components/AthOnnxruntimeUtils_entries.cxx
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-// Local include(s).
-#include "AthOnnxruntimeUtils/FlattenInput.h"
-
-// Declare the package's components.
-DECLARE_COMPONENT(AthONNX::FlattenInput )
-
-
-- 
GitLab


From 4a6fdb6b5599b4975604ffc12d1133760f160784 Mon Sep 17 00:00:00 2001
From: Debo <debottam.bakshi.gupta@cern.ch>
Date: Fri, 26 Feb 2021 17:50:49 +0100
Subject: [PATCH 3/3] Some logical and C++ DEBUG

---
 .../AthOnnxruntimeUtils/FlattenInput.h        | 14 ++--
 .../AthExOnnxRuntime/src/EvaluateModel.cxx    | 69 ++++---------------
 .../AthExOnnxRuntime/src/EvaluateModel.h      |  2 -
 3 files changed, 22 insertions(+), 63 deletions(-)

diff --git a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
index c84204d23cad..0a4abfaf7970 100644
--- a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
+++ b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h
@@ -12,18 +12,18 @@
 
 
 namespace AthONNX {
-
- inline std::vector<float> FlattenInput_1D(const std::vector<std::vector<float>> features){
-    std::vector<float> m_Flatten1D(28*28);
-    for(int r=0;r<features.size();++r){
+ 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]);
-        m_Flatten1D[r*n_cols+c] = a;
+        Flatten1D[r*n_cols+c] = a;
       }
     }
-   return m_Flatten1D;
+   return Flatten1D;
   }
 
- }
+}
 #endif
diff --git a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx
index 994e6e215f73..98edd86c7d19 100644
--- a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx
+++ b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx
@@ -43,39 +43,6 @@ namespace AthONNX {
      }
      return input_tensor_values;
    }
-   //*******************************************************************
-   // for reading MNIST images
-   std::vector<std::vector<float>> read_mnist_pixel(const std::string &full_path) //function to load test images
-   {
-     std::vector<std::vector<float>> input_tensor_values;
-     input_tensor_values.resize(10000, std::vector<float>(28*28*1));  
-     std::ifstream file (full_path.c_str(), std::ios::binary);
-     int magic_number=0;
-     int number_of_images=0;
-     int n_rows=0;
-     int n_cols=0;
-     file.read((char*)&magic_number,sizeof(magic_number));
-     magic_number= ntohl(magic_number);
-     file.read((char*)&number_of_images,sizeof(number_of_images));
-     number_of_images= ntohl(number_of_images);
-     file.read((char*)&n_rows,sizeof(n_rows));
-     n_rows= ntohl(n_rows);
-     file.read((char*)&n_cols,sizeof(n_cols));
-     n_cols= ntohl(n_cols);
-     for(int i=0;i<number_of_images;++i)
-     {
-        for(int r=0;r<n_rows;++r)
-        {
-           for(int c=0;c<n_cols;++c)
-           {
-             unsigned char temp=0;
-             file.read((char*)&temp,sizeof(temp));
-             input_tensor_values[i][r*n_cols+c]= float(temp)/255;
-           }
-        }
-     }
-     return input_tensor_values;
-   }
 
    //********************************************************************************
    // for reading MNIST labels
@@ -130,15 +97,9 @@ namespace AthONNX {
                                                     modelFileName.c_str(),
                                                     sessionOptions );
       ATH_MSG_INFO( "Created the ONNX Runtime session" );
-      m_input_tensor_values = read_mnist_pixel(pixelFileName);
       m_input_tensor_values_notFlat = read_mnist_pixel_notFlat(pixelFileName);
-      m_output_tensor_values = read_mnist_label(labelFileName);
-      ATH_MSG_DEBUG("Debo1...........................");
       std::vector<std::vector<float>> c = m_input_tensor_values_notFlat[0];
-      ATH_MSG_DEBUG("Debo2...........................");
-     // AthONNX::FlattenInput flatten(c);
-      ATH_MSG_DEBUG("Debo3...........................");
-      m_flatten1D = AthONNX::FlattenInput_1D(c);      
+      m_output_tensor_values = read_mnist_label(labelFileName);    
       // Return gracefully.
       return StatusCode::SUCCESS;
    }
@@ -205,19 +166,18 @@ namespace AthONNX {
      	output_node_dims[0] = 1;
  
        /***************** Choose an example sample randomly ****************************/  
-     	std::vector<float> input_tensor_values = m_input_tensor_values[m_testSample];
+     	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);
         // 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];
        
         // For a check that the sample dimension is fully flatten (1x28x28 = 784)
-     	ATH_MSG_DEBUG("Size of Input tensor: "<<input_tensor_values.size()); 
-        ATH_MSG_DEBUG("Size of notFlat Input tensor: "<<m_input_tensor_values_notFlat[0][0].size());
-        ATH_MSG_DEBUG("Size of Flatten Input tensor: "<<m_flatten1D.size());
+        ATH_MSG_DEBUG("Size of Flatten Input tensor: "<<flatten.size());
 
      	/************** Create input tensor object from input data values to feed into your model *********************/
      	Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, 
-                                                                  input_tensor_values.data(), 
-                                                                  input_tensor_values.size(),  /*** 1x28x28 = 784 ***/ 
+                                                                  flatten.data(), 
+                                                                  flatten.size(),  /*** 1x28x28 = 784 ***/ 
                                                                   input_node_dims.data(), 
                                                                   input_node_dims.size());     /*** [1, 28, 28] = 3 ***/
 
@@ -269,14 +229,15 @@ namespace AthONNX {
      	output_node_dims[0] = m_sizeOfBatch;   
      
 	/************************** process multiple batches ********************************/
+        int l =0; /****** variable for distributing rows in m_input_tensor_values_notFlat equally into batches*****/ 
      	for (int i = 0; i < m_numberOfBatches; i++) {
      		ATH_MSG_DEBUG("Processing batch #" << i);
       		std::vector<float> batch_input_tensor_values;
-  
-      		for (int j = 0; j < m_sizeOfBatch; j++) {
-
+      		for (int j = l; j < l+m_sizeOfBatch; j++) {
+                         
+                        std::vector<float> flattened_input = AthONNX::FlattenInput2D_1D(m_input_tensor_values_notFlat[j],784);
                         /******************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(),m_input_tensor_values[j].begin(),m_input_tensor_values[j].end());
+        		batch_input_tensor_values.insert(batch_input_tensor_values.end(), flattened_input.begin(), flattened_input.end());
         	}   
 
         	Ort::Value batch_input_tensors = Ort::Value::CreateTensor<float>(memory_info,
@@ -306,9 +267,9 @@ namespace AthONNX {
         	float* floatarr = batch_output_tensors.front().GetTensorMutableData<float>();
      
      		// show  true label for the test input
-		for(int i = 0; i<m_sizeOfBatch; i++){
+		for(int i = l; i<l+m_sizeOfBatch; i++){
      			ATH_MSG_INFO("Label for the input test data  = "<<m_output_tensor_values[i]);
-                	int k = i*10;
+                	int k = (i-l)*10;
                 	float max = -999;
                 	int max_index = 0;
      			for (int j =k ; j < k+10; j++){
@@ -319,8 +280,8 @@ namespace AthONNX {
        				}
      			}
     	       	ATH_MSG_INFO("Class: "<<max_index-k<<" has the highest score: "<<floatarr[max_index]);
-      		} 
-
+       		} 
+           l = l+m_sizeOfBatch;
           }
      } // else/m_doBatches == True codition ends
     // Return gracefully.
diff --git a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.h b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.h
index d284f3cf9045..e4a3c0424cee 100644
--- a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.h
+++ b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.h
@@ -78,10 +78,8 @@ namespace AthONNX {
 
       /// The "session" of ONNX Runtime that we'll be using
       std::unique_ptr< Ort::Session > m_session;
-      std::vector<std::vector<float>> m_input_tensor_values;
       std::vector<std::vector<std::vector<float>>> m_input_tensor_values_notFlat;
       std::vector<int> m_output_tensor_values;
-      std::vector<float> m_flatten1D;
 
    }; // class EvaluateModel
 
-- 
GitLab