2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // See LICENSE file in the project root for full license information.
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);
25 BOOST_AUTO_TEST_CASE(GetDataTypeTest)
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));
32 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithTooManyMappings)
34 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 1u, 2u, 3u, 4u }), armnn::InvalidArgumentException);
37 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings1d)
39 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 1u }), armnn::InvalidArgumentException);
42 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings2d)
44 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 2u, 0u }), armnn::InvalidArgumentException);
47 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings3d)
49 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 3u, 1u }), armnn::InvalidArgumentException);
52 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithInvalidMappings4d)
54 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 0u, 1u, 2u, 4u }), armnn::InvalidArgumentException);
57 BOOST_AUTO_TEST_CASE(PermuteDescriptorWithDuplicatedMappings)
59 BOOST_CHECK_THROW(armnn::PermuteDescriptor({ 1u, 1u, 0u }), armnn::InvalidArgumentException);
62 BOOST_AUTO_TEST_CASE(HalfType)
64 using namespace half_float::literal;
65 armnn::Half a = 1.0_h;
71 BOOST_CHECK_EQUAL(a, b);
72 BOOST_CHECK_EQUAL(sizeof(c), 2);
74 // Test half type is floating point type
75 BOOST_CHECK(std::is_floating_point<armnn::Half>::value);
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);
82 armnn::DataType dt = armnn::GetDataType<armnn::Half>();
83 BOOST_CHECK(dt == armnn::DataType::Float16);
85 //Test utility functions return correct size
86 BOOST_CHECK(GetDataTypeSize(armnn::DataType::Float16) == 2);
88 //Test utility functions return correct name
89 BOOST_CHECK((GetDataTypeName(armnn::DataType::Float16) == std::string("Float16")));
92 BOOST_AUTO_TEST_CASE(GraphTopologicalSortSimpleTest)
94 std::map<int, std::vector<int>> graph;
103 auto getNodeInputs = [graph](int node) -> std::vector<int>
105 return graph.find(node)->second;
108 std::vector<int> targetNodes = {0, 1};
110 std::vector<int> output;
111 bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
113 BOOST_TEST(sortCompleted);
115 std::vector<int> correctResult = {5, 4, 2, 0, 3, 1};
116 BOOST_CHECK_EQUAL_COLLECTIONS(output.begin(), output.end(), correctResult.begin(), correctResult.end());
119 BOOST_AUTO_TEST_CASE(GraphTopologicalSortVariantTest)
121 std::map<int, std::vector<int>> graph;
131 auto getNodeInputs = [graph](int node) -> std::vector<int>
133 return graph.find(node)->second;
136 std::vector<int> targetNodes = {0, 1};
138 std::vector<int> output;
139 bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
141 BOOST_TEST(sortCompleted);
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());
147 BOOST_AUTO_TEST_CASE(CyclicalGraphTopologicalSortTest)
149 std::map<int, std::vector<int>> graph;
155 auto getNodeInputs = [graph](int node) -> std::vector<int>
157 return graph.find(node)->second;
160 std::vector<int> targetNodes = {0};
162 std::vector<int> output;
163 bool sortCompleted = armnnUtils::GraphTopologicalSort<int>(targetNodes, getNodeInputs, output);
165 BOOST_TEST(!sortCompleted);
168 BOOST_AUTO_TEST_SUITE_END()