ArmNN
 20.11
InputOutputTensorNames.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include <boost/test/unit_test.hpp>
8 #include "../TfLiteParser.hpp"
9 
10 BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
11 
12 struct EmptyNetworkFixture : public ParserFlatbuffersFixture
13 {
14  explicit EmptyNetworkFixture() {
15  m_JsonString = R"(
16  {
17  "version": 3,
18  "operator_codes": [],
19  "subgraphs": [ {} ]
20  })";
21  }
22 };
23 
24 BOOST_FIXTURE_TEST_CASE(EmptyNetworkHasNoInputsAndOutputs, EmptyNetworkFixture)
25 {
26  Setup();
27  BOOST_TEST(m_Parser->GetSubgraphCount() == 1);
28  BOOST_TEST(m_Parser->GetSubgraphInputTensorNames(0).size() == 0);
29  BOOST_TEST(m_Parser->GetSubgraphOutputTensorNames(0).size() == 0);
30 }
31 
32 struct MissingTensorsFixture : public ParserFlatbuffersFixture
33 {
34  explicit MissingTensorsFixture()
35  {
36  m_JsonString = R"(
37  {
38  "version": 3,
39  "operator_codes": [],
40  "subgraphs": [{
41  "inputs" : [ 0, 1 ],
42  "outputs" : [ 2, 3 ],
43  }]
44  })";
45  }
46 };
47 
48 BOOST_FIXTURE_TEST_CASE(MissingTensorsThrowException, MissingTensorsFixture)
49 {
50  // this throws because it cannot do the input output tensor connections
51  BOOST_CHECK_THROW(Setup(), armnn::ParseException);
52 }
53 
54 struct InvalidTensorsFixture : public ParserFlatbuffersFixture
55 {
56  explicit InvalidTensorsFixture()
57  {
58  m_JsonString = R"(
59  {
60  "version": 3,
61  "operator_codes": [ ],
62  "subgraphs": [{
63  "tensors": [ {
64  "shape": [ 1, 1, 1, 1, 1, 1 ],
65  "type": "FLOAT32",
66  "name": "In",
67  "buffer": 0
68  }, {
69  "shape": [ 1, 1, 1, 1, 1, 1 ],
70  "type": "FLOAT32",
71  "name": "Out",
72  "buffer": 1
73  }],
74  "inputs" : [ 0 ],
75  "outputs" : [ 1 ],
76  }]
77  })";
78  }
79 };
80 
81 BOOST_FIXTURE_TEST_CASE(InvalidTensorsThrowException, InvalidTensorsFixture)
82 {
83  // Tensor numDimensions must be less than or equal to MaxNumOfTensorDimensions
84  static_assert(armnn::MaxNumOfTensorDimensions == 5, "Please update InvalidTensorsFixture");
85  BOOST_CHECK_THROW(Setup(), armnn::InvalidArgumentException);
86 }
87 
88 struct ValidTensorsFixture : public ParserFlatbuffersFixture
89 {
90  explicit ValidTensorsFixture()
91  {
92  m_JsonString = R"(
93  {
94  "version": 3,
95  "operator_codes": [ { "builtin_code": "AVERAGE_POOL_2D" } ],
96  "subgraphs": [{
97  "tensors": [ {
98  "shape": [ 1, 1, 1, 1 ],
99  "type": "FLOAT32",
100  "name": "In",
101  "buffer": 0,
102  }, {
103  "shape": [ 1, 1, 1, 1 ],
104  "type": "FLOAT32",
105  "name": "Out",
106  "buffer": 1,
107  }],
108  "inputs" : [ 0 ],
109  "outputs" : [ 1 ],
110  "operators": [{
111  "opcode_index": 0,
112  "inputs": [ 0 ],
113  "outputs": [ 1 ],
114  "builtin_options_type": "Pool2DOptions",
115  "builtin_options":
116  {
117  "padding": "VALID",
118  "stride_w": 1,
119  "stride_h": 1,
120  "filter_width": 1,
121  "filter_height": 1,
122  "fused_activation_function": "NONE"
123  },
124  "custom_options_format": "FLEXBUFFERS"
125  }]
126  }]
127  })";
128  }
129 };
130 
131 BOOST_FIXTURE_TEST_CASE(GetValidInputOutputTensorNames, ValidTensorsFixture)
132 {
133  Setup();
134  BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0).size(), 1u);
135  BOOST_CHECK_EQUAL(m_Parser->GetSubgraphOutputTensorNames(0).size(), 1u);
136  BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0)[0], "In");
137  BOOST_CHECK_EQUAL(m_Parser->GetSubgraphOutputTensorNames(0)[0], "Out");
138 }
139 
140 BOOST_FIXTURE_TEST_CASE(ThrowIfSubgraphIdInvalidForInOutNames, ValidTensorsFixture)
141 {
142  Setup();
143 
144  // these throw because of the invalid subgraph id
145  BOOST_CHECK_THROW(m_Parser->GetSubgraphInputTensorNames(1), armnn::ParseException);
146  BOOST_CHECK_THROW(m_Parser->GetSubgraphOutputTensorNames(1), armnn::ParseException);
147 }
148 
149 struct Rank0TensorFixture : public ParserFlatbuffersFixture
150 {
151  explicit Rank0TensorFixture()
152  {
153  m_JsonString = R"(
154  {
155  "version": 3,
156  "operator_codes": [ { "builtin_code": "MINIMUM" } ],
157  "subgraphs": [{
158  "tensors": [ {
159  "shape": [ ],
160  "type": "FLOAT32",
161  "name": "In0",
162  "buffer": 0,
163  }, {
164  "shape": [ ],
165  "type": "FLOAT32",
166  "name": "In1",
167  "buffer": 1,
168  }, {
169  "shape": [ ],
170  "type": "FLOAT32",
171  "name": "Out",
172  "buffer": 2,
173  }],
174  "inputs" : [ 0, 1 ],
175  "outputs" : [ 2 ],
176  "operators": [{
177  "opcode_index": 0,
178  "inputs": [ 0, 1 ],
179  "outputs": [ 2 ],
180  "custom_options_format": "FLEXBUFFERS"
181  }]
182  }]
183  }
184  )";
185  }
186 };
187 
188 BOOST_FIXTURE_TEST_CASE(Rank0Tensor, Rank0TensorFixture)
189 {
190  Setup();
191  BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0).size(), 2u);
192  BOOST_CHECK_EQUAL(m_Parser->GetSubgraphOutputTensorNames(0).size(), 1u);
193  BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0)[0], "In0");
194  BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0)[1], "In1");
195  BOOST_CHECK_EQUAL(m_Parser->GetSubgraphOutputTensorNames(0)[0], "Out");
196 }
197 
BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
BOOST_FIXTURE_TEST_CASE(EmptyNetworkHasNoInputsAndOutputs, EmptyNetworkFixture)
BOOST_AUTO_TEST_SUITE_END()
constexpr unsigned int MaxNumOfTensorDimensions
Definition: Types.hpp:18