MLCE-347 'REDUCE_MIN, REDUCE_MAX, REDUCE_SUM Support'
[platform/upstream/armnn.git] / tests / Cifar10Database.cpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #include "Cifar10Database.hpp"
6
7 #include <armnn/Logging.hpp>
8 #include <armnn/utility/NumericCast.hpp>
9
10 #include <fstream>
11 #include <vector>
12
13 constexpr unsigned int g_kCifar10ImageByteSize = 1 + 3 * 32 * 32;
14
15 Cifar10Database::Cifar10Database(const std::string& binaryFileDirectory, bool rgbPack)
16     : m_BinaryDirectory(binaryFileDirectory), m_RgbPack(rgbPack)
17 {
18 }
19
20 std::unique_ptr<Cifar10Database::TTestCaseData> Cifar10Database::GetTestCaseData(unsigned int testCaseId)
21 {
22     std::vector<unsigned char> I(g_kCifar10ImageByteSize);
23
24     std::string fullpath = m_BinaryDirectory + std::string("test_batch.bin");
25
26     std::ifstream fileStream(fullpath, std::ios::binary);
27     if (!fileStream.is_open())
28     {
29         ARMNN_LOG(fatal) << "Failed to load " << fullpath;
30         return nullptr;
31     }
32
33     fileStream.seekg(testCaseId * g_kCifar10ImageByteSize, std::ios_base::beg);
34     fileStream.read(reinterpret_cast<char*>(&I[0]), g_kCifar10ImageByteSize);
35
36     if (!fileStream.good())
37     {
38         ARMNN_LOG(fatal) << "Failed to read " << fullpath;
39         return nullptr;
40     }
41
42
43     std::vector<float> inputImageData;
44     inputImageData.resize(g_kCifar10ImageByteSize - 1);
45
46     unsigned int step;
47     unsigned int countR_o;
48     unsigned int countG_o;
49     unsigned int countB_o;
50     unsigned int countR = 1;
51     unsigned int countG = 1 + 32 * 32;
52     unsigned int countB = 1 + 2 * 32 * 32;
53
54     if (m_RgbPack)
55     {
56         countR_o = 0;
57         countG_o = 1;
58         countB_o = 2;
59         step = 3;
60     }
61     else
62     {
63         countR_o = 0;
64         countG_o = 32 * 32;
65         countB_o = 2 * 32 * 32;
66         step = 1;
67     }
68
69     for (unsigned int h = 0; h < 32; h++)
70     {
71         for (unsigned int w = 0; w < 32; w++)
72         {
73             // Static_cast of unsigned char is safe with float
74             inputImageData[countR_o] = static_cast<float>(I[countR++]);
75             inputImageData[countG_o] = static_cast<float>(I[countG++]);
76             inputImageData[countB_o] = static_cast<float>(I[countB++]);
77
78             countR_o += step;
79             countG_o += step;
80             countB_o += step;
81         }
82     }
83
84     const unsigned int label = armnn::numeric_cast<unsigned int>(I[0]);
85     return std::make_unique<TTestCaseData>(label, std::move(inputImageData));
86 }