ArmNN
 20.02
UtilsTests.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #include <boost/test/unit_test.hpp>
6 
7 
8 #include <armnn/Utils.hpp>
9 #include <armnn/Types.hpp>
10 #include <armnn/TypesUtils.hpp>
11 #include <armnn/Descriptors.hpp>
12 #include <GraphTopologicalSort.hpp>
13 #include <Graph.hpp>
14 #include <ResolveType.hpp>
15 
17 
18 BOOST_AUTO_TEST_CASE(DataTypeSize)
19 {
24 }
25 
26 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithTooManyMappings)
27 {
28  BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 1u, 2u, 3u, 4u, 5u }), armnn::InvalidArgumentException);
29 }
30 
31 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings1d)
32 {
34 }
35 
36 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings2d)
37 {
38  BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 2u, 0u }), armnn::InvalidArgumentException);
39 }
40 
41 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings3d)
42 {
43  BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 3u, 1u }), armnn::InvalidArgumentException);
44 }
45 
46 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings4d)
47 {
48  BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 1u, 2u, 4u }), armnn::InvalidArgumentException);
49 }
50 
51 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings5d)
52 {
53  BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 1u, 2u, 3u, 5u }), armnn::InvalidArgumentException);
54 }
55 
56 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithDuplicatedMappings)
57 {
58  BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 1u, 1u, 0u }), armnn::InvalidArgumentException);
59 }
60 
62 {
63  using namespace half_float::literal;
64  armnn::Half a = 1.0_h;
65 
66  float b = 1.0f;
67  armnn::Half c(b);
68 
69  // Test half type
70  BOOST_CHECK_EQUAL(a, b);
71  BOOST_CHECK_EQUAL(sizeof(c), 2);
72 
73  // Test half type is floating point type
74  BOOST_CHECK(std::is_floating_point<armnn::Half>::value);
75 
76  // Test utility function returns correct type.
78  constexpr bool isHalfType = std::is_same<armnn::Half, ResolvedType>::value;
79  BOOST_CHECK(isHalfType);
80 
81  //Test utility functions return correct size
83 
84  //Test utility functions return correct name
85  BOOST_CHECK((GetDataTypeName(armnn::DataType::Float16) == std::string("Float16")));
86 }
87 
89 {
90  uint16_t v = 16256;
91  armnn::BFloat16 a(v);
92  armnn::BFloat16 b(1.0f);
93  armnn::BFloat16 zero;
94 
95  // Test BFloat16 type
96  BOOST_CHECK_EQUAL(sizeof(a), 2);
97  BOOST_CHECK_EQUAL(a, b);
98  BOOST_CHECK_EQUAL(a.Val(), v);
99  BOOST_CHECK_EQUAL(a, 1.0f);
100  BOOST_CHECK_EQUAL(zero, 0.0f);
101 
102  // Infinity
103  float infFloat = std::numeric_limits<float>::infinity();
104  armnn::BFloat16 infBF(infFloat);
105  BOOST_CHECK_EQUAL(infBF, armnn::BFloat16::Inf());
106 
107  // NaN
108  float nan = std::numeric_limits<float>::quiet_NaN();
109  armnn::BFloat16 nanBF(nan);
110  BOOST_CHECK_EQUAL(nanBF, armnn::BFloat16::Nan());
111 
112  // Test utility function returns correct type.
114  constexpr bool isBFloat16Type = std::is_same<armnn::BFloat16, ResolvedType>::value;
115  BOOST_CHECK(isBFloat16Type);
116 
117  //Test utility functions return correct size
119 
120  //Test utility functions return correct name
121  BOOST_CHECK((GetDataTypeName(armnn::DataType::BFloat16) == std::string("BFloat16")));
122 }
123 
124 BOOST_AUTO_TEST_CASE(Float32ToBFloat16Test)
125 {
126  // LSB = 0, R = 0 -> round down
127  armnn::BFloat16 roundDown0 = armnn::BFloat16::Float32ToBFloat16(1.704735E38f); // 0x7F004000
128  BOOST_CHECK_EQUAL(roundDown0.Val(), 0x7F00);
129  // LSB = 1, R = 0 -> round down
130  armnn::BFloat16 roundDown1 = armnn::BFloat16::Float32ToBFloat16(9.18355E-41f); // 0x00010000
131  BOOST_CHECK_EQUAL(roundDown1.Val(), 0x0001);
132  // LSB = 0, R = 1 all 0 -> round down
133  armnn::BFloat16 roundDown2 = armnn::BFloat16::Float32ToBFloat16(1.14794E-40f); // 0x00014000
134  BOOST_CHECK_EQUAL(roundDown2.Val(), 0x0001);
135  // LSB = 1, R = 1 -> round up
136  armnn::BFloat16 roundUp = armnn::BFloat16::Float32ToBFloat16(-2.0234377f); // 0xC0018001
137  BOOST_CHECK_EQUAL(roundUp.Val(), 0xC002);
138  // LSB = 0, R = 1 -> round up
139  armnn::BFloat16 roundUp1 = armnn::BFloat16::Float32ToBFloat16(4.843037E-35f); // 0x0680C000
140  BOOST_CHECK_EQUAL(roundUp1.Val(), 0x0681);
141  // Max positive value -> infinity
142  armnn::BFloat16 maxPositive = armnn::BFloat16::Float32ToBFloat16(3.4028235E38f); // 0x7F7FFFFF
143  BOOST_CHECK_EQUAL(maxPositive, armnn::BFloat16::Inf());
144  // Max negative value -> -infinity
145  armnn::BFloat16 maxNeg = armnn::BFloat16::Float32ToBFloat16(-3.4028235E38f); // 0xFF7FFFFF
146  BOOST_CHECK_EQUAL(maxNeg.Val(), 0xFF80);
147  // Min positive value
148  armnn::BFloat16 minPositive = armnn::BFloat16::Float32ToBFloat16(1.1754942E-38f); // 0x007FFFFF
149  BOOST_CHECK_EQUAL(minPositive.Val(), 0x0080);
150  // Min negative value
151  armnn::BFloat16 minNeg = armnn::BFloat16::Float32ToBFloat16(-1.1754942E-38f); // 0x807FFFFF
152  BOOST_CHECK_EQUAL(minNeg.Val(), 0x8080);
153 }
154 
155 BOOST_AUTO_TEST_CASE(BFloat16ToFloat32Test)
156 {
157  armnn::BFloat16 bf0(1.5f);
158  BOOST_CHECK_EQUAL(bf0.ToFloat32(), 1.5f);
159  armnn::BFloat16 bf1(-5.525308E-25f);
160  BOOST_CHECK_EQUAL(bf1.ToFloat32(), -5.525308E-25f);
161  armnn::BFloat16 bf2(-2.0625f);
162  BOOST_CHECK_EQUAL(bf2.ToFloat32(), -2.0625f);
163  uint16_t v = 32639;
164  armnn::BFloat16 bf3(v);
165  BOOST_CHECK_EQUAL(bf3.ToFloat32(), 3.3895314E38f);
166  // Infinity
167  BOOST_CHECK_EQUAL(armnn::BFloat16::Inf().ToFloat32(), std::numeric_limits<float>::infinity());
168  // NaN
169  BOOST_CHECK(std::isnan(armnn::BFloat16::Nan().ToFloat32()));
170 }
171 
172 BOOST_AUTO_TEST_CASE(GraphTopologicalSortSimpleTest)
173 {
174  std::map<int, std::vector<int>> graph;
175 
176  graph[0] = {2};
177  graph[1] = {3};
178  graph[2] = {4};
179  graph[3] = {4};
180  graph[4] = {5};
181  graph[5] = {};
182 
183  auto getNodeInputs = [graph](int node) -> std::vector<int>
184  {
185  return graph.find(node)->second;
186  };
187 
188  std::vector<int> targetNodes = {0, 1};
189 
190  std::vector<int> output;
191  bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
192 
193  BOOST_TEST(sortCompleted);
194 
195  std::vector<int> correctResult = {5, 4, 2, 0, 3, 1};
196  BOOST_CHECK_EQUAL_COLLECTIONS(output.begin(), output.end(), correctResult.begin(), correctResult.end());
197 }
198 
199 BOOST_AUTO_TEST_CASE(GraphTopologicalSortVariantTest)
200 {
201  std::map<int, std::vector<int>> graph;
202 
203  graph[0] = {2};
204  graph[1] = {2};
205  graph[2] = {3, 4};
206  graph[3] = {5};
207  graph[4] = {5};
208  graph[5] = {6};
209  graph[6] = {};
210 
211  auto getNodeInputs = [graph](int node) -> std::vector<int>
212  {
213  return graph.find(node)->second;
214  };
215 
216  std::vector<int> targetNodes = {0, 1};
217 
218  std::vector<int> output;
219  bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
220 
221  BOOST_TEST(sortCompleted);
222 
223  std::vector<int> correctResult = {6, 5, 3, 4, 2, 0, 1};
224  BOOST_CHECK_EQUAL_COLLECTIONS(output.begin(), output.end(), correctResult.begin(), correctResult.end());
225 }
226 
227 BOOST_AUTO_TEST_CASE(CyclicalGraphTopologicalSortTest)
228 {
229  std::map<int, std::vector<int>> graph;
230 
231  graph[0] = {1};
232  graph[1] = {2};
233  graph[2] = {0};
234 
235  auto getNodeInputs = [graph](int node) -> std::vector<int>
236  {
237  return graph.find(node)->second;
238  };
239 
240  std::vector<int> targetNodes = {0};
241 
242  std::vector<int> output;
243  bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
244 
245  BOOST_TEST(!sortCompleted);
246 }
247 
BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
float ToFloat32() const
Definition: BFloat16.hpp:87
typename ResolveTypeImpl< DT >::Type ResolveType
Definition: ResolveType.hpp:73
BOOST_CHECK(profilingService.GetCurrentState()==ProfilingState::WaitingForAck)
static BFloat16 Inf()
Definition: BFloat16.hpp:111
constexpr const char * GetDataTypeName(DataType dataType)
Definition: TypesUtils.hpp:168
BOOST_AUTO_TEST_CASE(DataTypeSize)
Definition: UtilsTests.cpp:18
uint16_t Val() const
Definition: BFloat16.hpp:94
static BFloat16 Float32ToBFloat16(const float v)
Definition: BFloat16.hpp:52
BOOST_AUTO_TEST_SUITE_END()
static BFloat16 Nan()
Definition: BFloat16.hpp:105
half_float::half Half
Definition: Half.hpp:16
constexpr unsigned int GetDataTypeSize(DataType dataType)
Definition: TypesUtils.hpp:115
A PermuteDescriptor for the PermuteLayer.