Fix various uses of non-standard C++:
[platform/upstream/armnn.git] / src / backends / reference / workloads / Debug.cpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #include "Debug.hpp"
6
7 #include <boost/numeric/conversion/cast.hpp>
8
9 #include <algorithm>
10 #include <iostream>
11
12 namespace armnn
13 {
14
15 template <typename T>
16 void Debug(const TensorInfo& inputInfo,
17            const T* inputData,
18            LayerGuid guid,
19            const std::string& layerName,
20            unsigned int slotIndex)
21 {
22     const unsigned int numDims = inputInfo.GetNumDimensions();
23     const unsigned int numElements = inputInfo.GetNumElements();
24     const TensorShape& inputShape = inputInfo.GetShape();
25
26     std::vector<unsigned int> strides(numDims, 0);
27     strides[numDims - 1] = inputShape[numDims - 1];
28
29     for (unsigned int i = 2; i <= numDims; i++)
30     {
31         strides[numDims - i] = strides[numDims - i + 1] * inputShape[numDims - i];
32     }
33
34     std::cout << "{ ";
35     std::cout << "\"layerGuid\": " << guid << ", ";
36     std::cout << "\"layerName\": \"" << layerName << "\", ";
37     std::cout << "\"outputSlot\": " << slotIndex << ", ";
38     std::cout << "\"shape\": ";
39
40     std::cout << "[";
41     for (unsigned int i = 0; i < numDims; i++)
42     {
43         std::cout << inputShape[i];
44         if (i != numDims - 1)
45         {
46             std::cout << ", ";
47         }
48     }
49     std::cout << "], ";
50
51     std::cout << "\"min\": "
52         << boost::numeric_cast<float>(*std::min_element(inputData, inputData + numElements)) << ", ";
53
54     std::cout << "\"max\": "
55         << boost::numeric_cast<float>(*std::max_element(inputData, inputData + numElements)) << ", ";
56
57     std::cout << "\"data\": ";
58
59     for (unsigned int i = 0; i < numElements; i++)
60     {
61         for (unsigned int j = 0; j < numDims; j++)
62         {
63             if (i % strides[j] == 0)
64             {
65                 std::cout << "[" ;
66             }
67         }
68
69         std::cout << boost::numeric_cast<float>(inputData[i]);
70
71         for (unsigned int j = 0; j < numDims; j++)
72         {
73             if ((i+1) % strides[j] == 0)
74             {
75                 std::cout << "]" ;
76             }
77         }
78
79         if (i != numElements - 1)
80         {
81             std::cout << ", ";
82         }
83     }
84
85     std::cout << " }" << std::endl;
86 }
87
88 template void Debug<float>(const TensorInfo& inputInfo,
89                            const float* inputData,
90                            LayerGuid guid,
91                            const std::string& layerName,
92                            unsigned int slotIndex);
93
94 template void Debug<uint8_t>(const TensorInfo& inputInfo,
95                              const uint8_t* inputData,
96                              LayerGuid guid,
97                              const std::string& layerName,
98                              unsigned int slotIndex);
99
100 template void Debug<int16_t>(const TensorInfo& inputInfo,
101                              const int16_t* inputData,
102                              LayerGuid guid,
103                              const std::string& layerName,
104                              unsigned int slotIndex);
105 } // namespace armnn