blob: 2268aa31e2abf64bcea3a558d1bea8503e807d90 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// See LICENSE file in the project root for full license information.
4//
5#include <boost/test/unit_test.hpp>
6
telsoa01c577f2c2018-08-31 09:22:23 +01007
telsoa014fcda012018-03-09 14:13:49 +00008#include <armnn/Utils.hpp>
9#include <armnn/Types.hpp>
10#include <armnn/TypesUtils.hpp>
11#include <armnn/Descriptors.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +010012#include <GraphTopologicalSort.hpp>
13#include <Graph.hpp>
14#include "TypeUtils.hpp"
telsoa014fcda012018-03-09 14:13:49 +000015
16BOOST_AUTO_TEST_SUITE(Utils)
17
18BOOST_AUTO_TEST_CASE(DataTypeSize)
19{
20 BOOST_TEST(armnn::GetDataTypeSize(armnn::DataType::Float32) == 4);
21 BOOST_TEST(armnn::GetDataTypeSize(armnn::DataType::QuantisedAsymm8) == 1);
22 BOOST_TEST(armnn::GetDataTypeSize(armnn::DataType::Signed32) == 4);
23}
24
25BOOST_AUTO_TEST_CASE(GetDataTypeTest)
26{
27 BOOST_TEST((armnn::GetDataType<float>() == armnn::DataType::Float32));
28 BOOST_TEST((armnn::GetDataType<uint8_t>() == armnn::DataType::QuantisedAsymm8));
29 BOOST_TEST((armnn::GetDataType<int32_t>() == armnn::DataType::Signed32));
30}
31
32BOOST_AUTO_TEST_CASE(PermuteDescriptorWithTooManyMappings)
33{
34 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 1u, 2u, 3u, 4u }), armnn::InvalidArgumentException);
35}
36
37BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings1d)
38{
39 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 1u }), armnn::InvalidArgumentException);
40}
41
42BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings2d)
43{
44 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 2u, 0u }), armnn::InvalidArgumentException);
45}
46
47BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings3d)
48{
49 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 3u, 1u }), armnn::InvalidArgumentException);
50}
51
52BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings4d)
53{
54 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 1u, 2u, 4u }), armnn::InvalidArgumentException);
55}
56
57BOOST_AUTO_TEST_CASE(PermuteDescriptorWithDuplicatedMappings)
58{
59 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 1u, 1u, 0u }), armnn::InvalidArgumentException);
60}
61
telsoa01c577f2c2018-08-31 09:22:23 +010062BOOST_AUTO_TEST_CASE(HalfType)
63{
64 using namespace half_float::literal;
65 armnn::Half a = 1.0_h;
66
67 float b = 1.0f;
68 armnn::Half c(b);
69
70 // Test half type
71 BOOST_CHECK_EQUAL(a, b);
72 BOOST_CHECK_EQUAL(sizeof(c), 2);
73
74 // Test half type is floating point type
75 BOOST_CHECK(std::is_floating_point<armnn::Half>::value);
76
77 // Test utility function returns correct type.
78 using ResolvedType = armnn::ResolveType<armnn::DataType::Float16>;
79 constexpr bool isHalfType = std::is_same<armnn::Half, ResolvedType>::value;
80 BOOST_CHECK(isHalfType);
81
82 armnn::DataType dt = armnn::GetDataType<armnn::Half>();
83 BOOST_CHECK(dt == armnn::DataType::Float16);
84
85 //Test utility functions return correct size
86 BOOST_CHECK(GetDataTypeSize(armnn::DataType::Float16) == 2);
87
88 //Test utility functions return correct name
89 BOOST_CHECK((GetDataTypeName(armnn::DataType::Float16) == std::string("Float16")));
90}
91
92BOOST_AUTO_TEST_CASE(GraphTopologicalSortSimpleTest)
93{
94 std::map<int, std::vector<int>> graph;
95
96 graph[0] = {2};
97 graph[1] = {3};
98 graph[2] = {4};
99 graph[3] = {4};
100 graph[4] = {5};
101 graph[5] = {};
102
103 auto getNodeInputs = [graph](int node) -> std::vector<int>
104 {
105 return graph.find(node)->second;
106 };
107
108 std::vector<int> targetNodes = {0, 1};
109
110 std::vector<int> output;
111 bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
112
113 BOOST_TEST(sortCompleted);
114
115 std::vector<int> correctResult = {5, 4, 2, 0, 3, 1};
116 BOOST_CHECK_EQUAL_COLLECTIONS(output.begin(), output.end(), correctResult.begin(), correctResult.end());
117}
118
119BOOST_AUTO_TEST_CASE(GraphTopologicalSortVariantTest)
120{
121 std::map<int, std::vector<int>> graph;
122
123 graph[0] = {2};
124 graph[1] = {2};
125 graph[2] = {3, 4};
126 graph[3] = {5};
127 graph[4] = {5};
128 graph[5] = {6};
129 graph[6] = {};
130
131 auto getNodeInputs = [graph](int node) -> std::vector<int>
132 {
133 return graph.find(node)->second;
134 };
135
136 std::vector<int> targetNodes = {0, 1};
137
138 std::vector<int> output;
139 bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
140
141 BOOST_TEST(sortCompleted);
142
143 std::vector<int> correctResult = {6, 5, 3, 4, 2, 0, 1};
144 BOOST_CHECK_EQUAL_COLLECTIONS(output.begin(), output.end(), correctResult.begin(), correctResult.end());
145}
146
147BOOST_AUTO_TEST_CASE(CyclicalGraphTopologicalSortTest)
148{
149 std::map<int, std::vector<int>> graph;
150
151 graph[0] = {1};
152 graph[1] = {2};
153 graph[2] = {0};
154
155 auto getNodeInputs = [graph](int node) -> std::vector<int>
156 {
157 return graph.find(node)->second;
158 };
159
160 std::vector<int> targetNodes = {0};
161
162 std::vector<int> output;
163 bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
164
165 BOOST_TEST(!sortCompleted);
166}
167
telsoa014fcda012018-03-09 14:13:49 +0000168BOOST_AUTO_TEST_SUITE_END()