2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
5 #include <boost/test/unit_test.hpp>
8 #include <armnn/Utils.hpp>
9 #include <armnn/Types.hpp>
10 #include <armnn/TypesUtils.hpp>
11 #include <armnn/Descriptors.hpp>
12 #include <GraphTopologicalSort.hpp>
14 #include "TypeUtils.hpp"
16 BOOST_AUTO_TEST_SUITE(Utils)
18 BOOST_AUTO_TEST_CASE(DataTypeSize)
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 BOOST_TEST(armnn::GetDataTypeSize(armnn::DataType::Boolean) == 1);
26 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithTooManyMappings)
28 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 1u, 2u, 3u, 4u }), armnn::InvalidArgumentException);
31 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings1d)
33 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 1u }), armnn::InvalidArgumentException);
36 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings2d)
38 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 2u, 0u }), armnn::InvalidArgumentException);
41 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings3d)
43 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 3u, 1u }), armnn::InvalidArgumentException);
46 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings4d)
48 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 1u, 2u, 4u }), armnn::InvalidArgumentException);
51 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithDuplicatedMappings)
53 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 1u, 1u, 0u }), armnn::InvalidArgumentException);
56 BOOST_AUTO_TEST_CASE(HalfType)
58 using namespace half_float::literal;
59 armnn::Half a = 1.0_h;
65 BOOST_CHECK_EQUAL(a, b);
66 BOOST_CHECK_EQUAL(sizeof(c), 2);
68 // Test half type is floating point type
69 BOOST_CHECK(std::is_floating_point<armnn::Half>::value);
71 // Test utility function returns correct type.
72 using ResolvedType = armnn::ResolveType<armnn::DataType::Float16>;
73 constexpr bool isHalfType = std::is_same<armnn::Half, ResolvedType>::value;
74 BOOST_CHECK(isHalfType);
76 //Test utility functions return correct size
77 BOOST_CHECK(GetDataTypeSize(armnn::DataType::Float16) == 2);
79 //Test utility functions return correct name
80 BOOST_CHECK((GetDataTypeName(armnn::DataType::Float16) == std::string("Float16")));
83 BOOST_AUTO_TEST_CASE(GraphTopologicalSortSimpleTest)
85 std::map<int, std::vector<int>> graph;
94 auto getNodeInputs = [graph](int node) -> std::vector<int>
96 return graph.find(node)->second;
99 std::vector<int> targetNodes = {0, 1};
101 std::vector<int> output;
102 bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
104 BOOST_TEST(sortCompleted);
106 std::vector<int> correctResult = {5, 4, 2, 0, 3, 1};
107 BOOST_CHECK_EQUAL_COLLECTIONS(output.begin(), output.end(), correctResult.begin(), correctResult.end());
110 BOOST_AUTO_TEST_CASE(GraphTopologicalSortVariantTest)
112 std::map<int, std::vector<int>> graph;
122 auto getNodeInputs = [graph](int node) -> std::vector<int>
124 return graph.find(node)->second;
127 std::vector<int> targetNodes = {0, 1};
129 std::vector<int> output;
130 bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
132 BOOST_TEST(sortCompleted);
134 std::vector<int> correctResult = {6, 5, 3, 4, 2, 0, 1};
135 BOOST_CHECK_EQUAL_COLLECTIONS(output.begin(), output.end(), correctResult.begin(), correctResult.end());
138 BOOST_AUTO_TEST_CASE(CyclicalGraphTopologicalSortTest)
140 std::map<int, std::vector<int>> graph;
146 auto getNodeInputs = [graph](int node) -> std::vector<int>
148 return graph.find(node)->second;
151 std::vector<int> targetNodes = {0};
153 std::vector<int> output;
154 bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
156 BOOST_TEST(!sortCompleted);
159 BOOST_AUTO_TEST_SUITE_END()