blob: 1d65b1bbfbe2c832aa1a63d305024d02ee7d3bab [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include <armnn/ArmNN.hpp>
7#include <armnn/INetwork.hpp>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00008
Mike Kelly8c1701a2019-02-11 17:01:27 +00009#include "../Serializer.hpp"
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000010
Derek Lamberti0028d1b2019-02-20 13:57:42 +000011#include <armnnDeserializer/IDeserializer.hpp>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000012
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000013#include <random>
Mike Kelly8c1701a2019-02-11 17:01:27 +000014#include <sstream>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000015#include <vector>
16
Mike Kelly8c1701a2019-02-11 17:01:27 +000017#include <boost/test/unit_test.hpp>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000018#include <flatbuffers/idl.h>
19
Derek Lamberti0028d1b2019-02-20 13:57:42 +000020using armnnDeserializer::IDeserializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000021
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000022namespace
23{
24
25armnn::INetworkPtr DeserializeNetwork(const std::string& serializerString)
26{
27 std::vector<std::uint8_t> const serializerVector{serializerString.begin(), serializerString.end()};
Derek Lamberti0028d1b2019-02-20 13:57:42 +000028 return IDeserializer::Create()->CreateNetworkFromBinary(serializerVector);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000029}
30
31std::string SerializeNetwork(const armnn::INetwork& network)
32{
33 armnnSerializer::Serializer serializer;
34 serializer.Serialize(network);
35
36 std::stringstream stream;
37 serializer.SaveSerializedToStream(stream);
38
39 std::string serializerString{stream.str()};
40 return serializerString;
41}
42
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000043template<typename DataType>
44static std::vector<DataType> GenerateRandomData(size_t size)
45{
46 constexpr bool isIntegerType = std::is_integral<DataType>::value;
47 using Distribution =
48 typename std::conditional<isIntegerType,
49 std::uniform_int_distribution<DataType>,
50 std::uniform_real_distribution<DataType>>::type;
51
52 static constexpr DataType lowerLimit = std::numeric_limits<DataType>::min();
53 static constexpr DataType upperLimit = std::numeric_limits<DataType>::max();
54
55 static Distribution distribution(lowerLimit, upperLimit);
56 static std::default_random_engine generator;
57
58 std::vector<DataType> randomData(size);
59 std::generate(randomData.begin(), randomData.end(), []() { return distribution(generator); });
60
61 return randomData;
62}
63
64void CheckDeserializedNetworkAgainstOriginal(const armnn::INetwork& deserializedNetwork,
65 const armnn::INetwork& originalNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +000066 const std::vector<armnn::TensorShape>& inputShapes,
67 const std::vector<armnn::TensorShape>& outputShapes,
68 const std::vector<armnn::LayerBindingId>& inputBindingIds = {0},
69 const std::vector<armnn::LayerBindingId>& outputBindingIds = {0})
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000070{
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +000071 BOOST_CHECK(inputShapes.size() == inputBindingIds.size());
72 BOOST_CHECK(outputShapes.size() == outputBindingIds.size());
73
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000074 armnn::IRuntime::CreationOptions options;
75 armnn::IRuntimePtr runtime = armnn::IRuntime::Create(options);
76
77 std::vector<armnn::BackendId> preferredBackends = { armnn::BackendId("CpuRef") };
78
79 // Optimize original network
80 armnn::IOptimizedNetworkPtr optimizedOriginalNetwork =
81 armnn::Optimize(originalNetwork, preferredBackends, runtime->GetDeviceSpec());
82 BOOST_CHECK(optimizedOriginalNetwork);
83
84 // Optimize deserialized network
85 armnn::IOptimizedNetworkPtr optimizedDeserializedNetwork =
86 armnn::Optimize(deserializedNetwork, preferredBackends, runtime->GetDeviceSpec());
87 BOOST_CHECK(optimizedDeserializedNetwork);
88
89 armnn::NetworkId networkId1;
90 armnn::NetworkId networkId2;
91
92 // Load original and deserialized network
93 armnn::Status status1 = runtime->LoadNetwork(networkId1, std::move(optimizedOriginalNetwork));
94 BOOST_CHECK(status1 == armnn::Status::Success);
95
96 armnn::Status status2 = runtime->LoadNetwork(networkId2, std::move(optimizedDeserializedNetwork));
97 BOOST_CHECK(status2 == armnn::Status::Success);
98
99 // Generate some input data
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000100 armnn::InputTensors inputTensors1;
101 armnn::InputTensors inputTensors2;
102 std::vector<std::vector<float>> inputData;
103 inputData.reserve(inputShapes.size());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000104
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000105 for (unsigned int i = 0; i < inputShapes.size(); i++)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000106 {
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000107 inputData.push_back(GenerateRandomData<float>(inputShapes[i].GetNumElements()));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000108
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000109 inputTensors1.emplace_back(
110 i, armnn::ConstTensor(runtime->GetInputTensorInfo(networkId1, inputBindingIds[i]), inputData[i].data()));
111
112 inputTensors2.emplace_back(
113 i, armnn::ConstTensor(runtime->GetInputTensorInfo(networkId2, inputBindingIds[i]), inputData[i].data()));
114 }
115
116 armnn::OutputTensors outputTensors1;
117 armnn::OutputTensors outputTensors2;
118 std::vector<std::vector<float>> outputData1;
119 std::vector<std::vector<float>> outputData2;
120 outputData1.reserve(outputShapes.size());
121 outputData2.reserve(outputShapes.size());
122
123 for (unsigned int i = 0; i < outputShapes.size(); i++)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000124 {
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000125 outputData1.emplace_back(outputShapes[i].GetNumElements());
126 outputData2.emplace_back(outputShapes[i].GetNumElements());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000127
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000128 outputTensors1.emplace_back(
129 i, armnn::Tensor(runtime->GetOutputTensorInfo(networkId1, outputBindingIds[i]), outputData1[i].data()));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000130
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000131 outputTensors2.emplace_back(
132 i, armnn::Tensor(runtime->GetOutputTensorInfo(networkId2, outputBindingIds[i]), outputData2[i].data()));
133 }
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000134
135 // Run original and deserialized network
136 runtime->EnqueueWorkload(networkId1, inputTensors1, outputTensors1);
137 runtime->EnqueueWorkload(networkId2, inputTensors2, outputTensors2);
138
139 // Compare output data
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000140 for (unsigned int i = 0; i < outputShapes.size(); i++)
141 {
142 BOOST_CHECK_EQUAL_COLLECTIONS(
143 outputData1[i].begin(), outputData1[i].end(), outputData2[i].begin(), outputData2[i].end());
144 }
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000145}
146
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000147} // anonymous namespace
148
149BOOST_AUTO_TEST_SUITE(SerializerTests)
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000150
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000151BOOST_AUTO_TEST_CASE(SerializeAddition)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000152{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000153 class VerifyAdditionName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
154 {
155 public:
156 void VisitAdditionLayer(const armnn::IConnectableLayer*, const char* name) override
157 {
158 BOOST_TEST(name == "addition");
159 }
160 };
161
Mike Kelly8c1701a2019-02-11 17:01:27 +0000162 armnn::INetworkPtr network = armnn::INetwork::Create();
163 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
164 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
165
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000166 armnn::IConnectableLayer* const additionLayer = network->AddAdditionLayer("addition");
167 inputLayer0->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(0));
168 inputLayer1->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(1));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000169
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000170 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
171 additionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000172
Jim Flynn3091b062019-02-15 14:45:04 +0000173 armnn::TensorShape shape{1U};
174 armnn::TensorInfo info(shape, armnn::DataType::Float32);
175 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
176 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000177 additionLayer->GetOutputSlot(0).SetTensorInfo(info);
Jim Flynn3091b062019-02-15 14:45:04 +0000178
Mike Kelly8c1701a2019-02-11 17:01:27 +0000179 armnnSerializer::Serializer serializer;
180 serializer.Serialize(*network);
181
182 std::stringstream stream;
183 serializer.SaveSerializedToStream(stream);
184 BOOST_TEST(stream.str().length() > 0);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000185
186 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
187 BOOST_CHECK(deserializedNetwork);
188
189 VerifyAdditionName nameChecker;
190 deserializedNetwork->Accept(nameChecker);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000191}
192
Conor Kennedy76277882019-02-26 08:29:54 +0000193BOOST_AUTO_TEST_CASE(SerializeConstant)
194{
195 armnn::INetworkPtr network = armnn::INetwork::Create();
196
197 armnn::ConstTensor inputTensor;
198
199 armnn::IConnectableLayer* const inputLayer0 = network->AddConstantLayer(inputTensor, "constant");
200 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
201
202 inputLayer0->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
203
204 armnnSerializer::Serializer serializer;
205 serializer.Serialize(*network);
206
207 std::stringstream stream;
208 serializer.SaveSerializedToStream(stream);
209 BOOST_TEST(stream.str().length() > 0);
210 BOOST_TEST(stream.str().find("constant") != stream.str().npos);
211}
212
213BOOST_AUTO_TEST_CASE(SerializeDeserializeConstant)
214{
215 class VerifyConstantName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
216 {
217 public:
218 void VisitConstantLayer(const armnn::IConnectableLayer*, const armnn::ConstTensor&, const char* name) override
219 {
220 BOOST_TEST(name == "constant");
221 }
222 };
223
224 armnn::TensorInfo commonTensorInfo({ 2, 3 }, armnn::DataType::Float32);
225
226 std::vector<float> constantData = GenerateRandomData<float>(commonTensorInfo.GetNumElements());
227 armnn::ConstTensor constTensor(commonTensorInfo, constantData);
228
229 // Builds up the structure of the network.
230 armnn::INetworkPtr net(armnn::INetwork::Create());
231
232 armnn::IConnectableLayer* input = net->AddInputLayer(0);
233 armnn::IConnectableLayer* constant = net->AddConstantLayer(constTensor, "constant");
234 armnn::IConnectableLayer* add = net->AddAdditionLayer();
235 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
236
237 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
238 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
239 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
240
241 // Sets the tensors in the network.
242 input->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
243 constant->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
244 add->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
245
246 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*net));
247 BOOST_CHECK(deserializedNetwork);
248
249 VerifyConstantName nameChecker;
250 deserializedNetwork->Accept(nameChecker);
251
252 CheckDeserializedNetworkAgainstOriginal(*net,
253 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000254 {commonTensorInfo.GetShape()},
255 {commonTensorInfo.GetShape()});
Conor Kennedy76277882019-02-26 08:29:54 +0000256}
257
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000258BOOST_AUTO_TEST_CASE(SerializeMinimum)
259{
260 class VerifyMinimumName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
261 {
262 public:
263 explicit VerifyMinimumName(const std::string& expectedMinimumLayerName)
264 : m_ExpectedMinimumLayerName(expectedMinimumLayerName) {}
265
266 void VisitMinimumLayer(const armnn::IConnectableLayer*, const char* name) override
267 {
268 BOOST_TEST(name == m_ExpectedMinimumLayerName.c_str());
269 }
270
271 private:
272 std::string m_ExpectedMinimumLayerName;
273 };
274
275 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
276
277 armnn::INetworkPtr network = armnn::INetwork::Create();
278 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
279 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
280
281 const std::string minimumLayerName("minimum");
282
283 armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(minimumLayerName.c_str());
284 inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
285 inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
286
287 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
288 minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
289
290 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
291 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
292 minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
293
294 armnnSerializer::Serializer serializer;
295 serializer.Serialize(*network);
296
297 std::stringstream stream;
298 serializer.SaveSerializedToStream(stream);
299 BOOST_TEST(stream.str().length() > 0);
300 BOOST_TEST(stream.str().find(minimumLayerName) != stream.str().npos);
301
302 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
303 BOOST_CHECK(deserializedNetwork);
304
305 VerifyMinimumName nameChecker(minimumLayerName);
306 deserializedNetwork->Accept(nameChecker);
307}
308
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000309BOOST_AUTO_TEST_CASE(SerializeMultiplication)
Sadik Armagan5f450272019-02-12 14:31:45 +0000310{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000311 class VerifyMultiplicationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
312 {
313 public:
314 void VisitMultiplicationLayer(const armnn::IConnectableLayer*, const char* name) override
315 {
316 BOOST_TEST(name == "multiplication");
317 }
318 };
319
Sadik Armagan5f450272019-02-12 14:31:45 +0000320 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
321
322 armnn::INetworkPtr network = armnn::INetwork::Create();
323 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
324 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
325
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000326 const char* multLayerName = "multiplication";
Sadik Armagan5f450272019-02-12 14:31:45 +0000327
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000328 armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(multLayerName);
329 inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
330 inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
Sadik Armagan5f450272019-02-12 14:31:45 +0000331
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000332 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
333 multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Sadik Armagan5f450272019-02-12 14:31:45 +0000334
Jim Flynn3091b062019-02-15 14:45:04 +0000335 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
336 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000337 multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
Jim Flynn3091b062019-02-15 14:45:04 +0000338
Sadik Armagan5f450272019-02-12 14:31:45 +0000339 armnnSerializer::Serializer serializer;
340 serializer.Serialize(*network);
341
342 std::stringstream stream;
343 serializer.SaveSerializedToStream(stream);
344 BOOST_TEST(stream.str().length() > 0);
345 BOOST_TEST(stream.str().find(multLayerName) != stream.str().npos);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000346
347 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
348 BOOST_CHECK(deserializedNetwork);
349
350 VerifyMultiplicationName nameChecker;
351 deserializedNetwork->Accept(nameChecker);
Sadik Armagan5f450272019-02-12 14:31:45 +0000352}
353
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000354BOOST_AUTO_TEST_CASE(SerializeDeserializeConvolution2d)
Saoirse Stewart263829c2019-02-19 15:54:14 +0000355{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000356
357 class VerifyConvolution2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
358 {
359 public:
360 void VisitConvolution2dLayer(const armnn::IConnectableLayer*,
361 const armnn::Convolution2dDescriptor&,
362 const armnn::ConstTensor&,
363 const armnn::Optional<armnn::ConstTensor>&,
364 const char* name) override
365 {
366 BOOST_TEST(name == "convolution");
367 }
368 };
369
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000370 armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
371 armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000372
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000373 armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
374 armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
375
376 // Construct network
377 armnn::INetworkPtr network = armnn::INetwork::Create();
378
379 armnn::Convolution2dDescriptor descriptor;
380 descriptor.m_PadLeft = 1;
381 descriptor.m_PadRight = 1;
382 descriptor.m_PadTop = 1;
383 descriptor.m_PadBottom = 1;
384 descriptor.m_StrideX = 2;
385 descriptor.m_StrideY = 2;
386 descriptor.m_BiasEnabled = true;
387 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
388
389 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
390 armnn::ConstTensor weights(weightsInfo, weightsData);
391
392 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
393 armnn::ConstTensor biases(biasesInfo, biasesData);
394
395 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0, "input");
396 armnn::IConnectableLayer* const convLayer =
397 network->AddConvolution2dLayer(descriptor, weights, biases, "convolution");
398 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0, "output");
399
400 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
401 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
402
403 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
404 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
405
406 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
407 BOOST_CHECK(deserializedNetwork);
408
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000409 VerifyConvolution2dName nameChecker;
410 deserializedNetwork->Accept(nameChecker);
411
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000412 CheckDeserializedNetworkAgainstOriginal(*network,
413 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000414 {inputInfo.GetShape()},
415 {outputInfo.GetShape()});
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000416}
417
418BOOST_AUTO_TEST_CASE(SerializeDeserializeReshape)
419{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000420 class VerifyReshapeName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
421 {
422 public:
423 void VisitReshapeLayer(const armnn::IConnectableLayer*, const armnn::ReshapeDescriptor&, const char* name)
424 {
425 BOOST_TEST(name == "reshape");
426 }
427 };
428
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000429 unsigned int inputShape[] = { 1, 9 };
430 unsigned int outputShape[] = { 3, 3 };
Saoirse Stewart263829c2019-02-19 15:54:14 +0000431
432 auto inputTensorInfo = armnn::TensorInfo(2, inputShape, armnn::DataType::Float32);
433 auto outputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Float32);
434 auto reshapeOutputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Float32);
435
436 armnn::ReshapeDescriptor reshapeDescriptor;
437 reshapeDescriptor.m_TargetShape = reshapeOutputTensorInfo.GetShape();
438
439 armnn::INetworkPtr network = armnn::INetwork::Create();
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000440 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
441 armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(reshapeDescriptor, "reshape");
442 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000443
444 inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
445 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
446 reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
447 reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
448
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000449 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
450 BOOST_CHECK(deserializedNetwork);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000451
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000452 VerifyReshapeName nameChecker;
453 deserializedNetwork->Accept(nameChecker);
454
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000455 CheckDeserializedNetworkAgainstOriginal(*network,
456 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000457 {inputTensorInfo.GetShape()},
458 {outputTensorInfo.GetShape()});
Saoirse Stewart263829c2019-02-19 15:54:14 +0000459}
460
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000461BOOST_AUTO_TEST_CASE(SerializeDeserializeDepthwiseConvolution2d)
462{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000463 class VerifyDepthwiseConvolution2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
464 {
465 public:
466 void VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer*,
467 const armnn::DepthwiseConvolution2dDescriptor&,
468 const armnn::ConstTensor&,
469 const armnn::Optional<armnn::ConstTensor>&,
470 const char* name) override
471 {
472 BOOST_TEST(name == "depthwise_convolution");
473 }
474 };
475
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000476 armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
477 armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
478
479 armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
480 armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
481
482 armnn::DepthwiseConvolution2dDescriptor descriptor;
483 descriptor.m_StrideX = 1;
484 descriptor.m_StrideY = 1;
485 descriptor.m_BiasEnabled = true;
486 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
487
488 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
489 armnn::ConstTensor weights(weightsInfo, weightsData);
490
491 std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
492 armnn::ConstTensor biases(biasesInfo, biasesData);
493
494 armnn::INetworkPtr network = armnn::INetwork::Create();
495 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
496 armnn::IConnectableLayer* const depthwiseConvLayer =
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000497 network->AddDepthwiseConvolution2dLayer(descriptor, weights, biases, "depthwise_convolution");
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000498 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
499
500 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
501 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
502 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
503 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
504
505 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
506 BOOST_CHECK(deserializedNetwork);
507
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000508 VerifyDepthwiseConvolution2dName nameChecker;
509 deserializedNetwork->Accept(nameChecker);
510
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000511 CheckDeserializedNetworkAgainstOriginal(*network,
512 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000513 {inputInfo.GetShape()},
514 {outputInfo.GetShape()});
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000515}
516
517BOOST_AUTO_TEST_CASE(SerializeDeserializeSoftmax)
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000518{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000519 class VerifySoftmaxName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
520 {
521 public:
522 void VisitSoftmaxLayer(const armnn::IConnectableLayer*, const armnn::SoftmaxDescriptor&, const char* name)
523 {
524 BOOST_TEST(name == "softmax");
525 }
526 };
527
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000528 armnn::TensorInfo tensorInfo({1, 10}, armnn::DataType::Float32);
529
530 armnn::SoftmaxDescriptor descriptor;
531 descriptor.m_Beta = 1.0f;
532
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000533 armnn::INetworkPtr network = armnn::INetwork::Create();
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000534 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
535 armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, "softmax");
536 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000537
538 inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
539 inputLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
540 softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
541 softmaxLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
542
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000543 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000544 BOOST_CHECK(deserializedNetwork);
545
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000546 VerifySoftmaxName nameChecker;
547 deserializedNetwork->Accept(nameChecker);
548
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000549 CheckDeserializedNetworkAgainstOriginal(*network,
550 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000551 {tensorInfo.GetShape()},
552 {tensorInfo.GetShape()});
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000553}
554
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000555BOOST_AUTO_TEST_CASE(SerializeDeserializePooling2d)
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000556{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000557 class VerifyPooling2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
558 {
559 void VisitPooling2dLayer(const armnn::IConnectableLayer*, const armnn::Pooling2dDescriptor&, const char* name)
560 {
561 BOOST_TEST(name == "pooling2d");
562 }
563 };
564
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000565 unsigned int inputShape[] = {1, 2, 2, 1};
566 unsigned int outputShape[] = {1, 1, 1, 1};
567
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000568 auto inputInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
569 auto outputInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000570
571 armnn::Pooling2dDescriptor desc;
572 desc.m_DataLayout = armnn::DataLayout::NHWC;
573 desc.m_PadTop = 0;
574 desc.m_PadBottom = 0;
575 desc.m_PadLeft = 0;
576 desc.m_PadRight = 0;
577 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
578 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
579 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
580 desc.m_PoolHeight = 2;
581 desc.m_PoolWidth = 2;
582 desc.m_StrideX = 2;
583 desc.m_StrideY = 2;
584
585 armnn::INetworkPtr network = armnn::INetwork::Create();
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000586 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
587 armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, "pooling2d");
588 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000589
590 inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000591 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000592 pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000593 pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000594
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000595 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
596 BOOST_CHECK(deserializedNetwork);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000597
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000598 VerifyPooling2dName nameChecker;
599 deserializedNetwork->Accept(nameChecker);
600
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000601 CheckDeserializedNetworkAgainstOriginal(*network,
602 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000603 {inputInfo.GetShape()},
604 {outputInfo.GetShape()});
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000605}
606
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000607BOOST_AUTO_TEST_CASE(SerializeDeserializePermute)
608{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000609 class VerifyPermuteName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
610 {
611 public:
612 void VisitPermuteLayer(const armnn::IConnectableLayer*, const armnn::PermuteDescriptor&, const char* name)
613 {
614 BOOST_TEST(name == "permute");
615 }
616 };
617
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000618 unsigned int inputShape[] = { 4, 3, 2, 1 };
619 unsigned int outputShape[] = { 1, 2, 3, 4 };
620 unsigned int dimsMapping[] = { 3, 2, 1, 0 };
621
622 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
623 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
624
625 armnn::PermuteDescriptor permuteDescriptor(armnn::PermutationVector(dimsMapping, 4));
626
627 armnn::INetworkPtr network = armnn::INetwork::Create();
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000628 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
629 armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(permuteDescriptor, "permute");
630 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000631
632 inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
633 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
634 permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
635 permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
636
637 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
638 BOOST_CHECK(deserializedNetwork);
639
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000640 VerifyPermuteName nameChecker;
641 deserializedNetwork->Accept(nameChecker);
642
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000643 CheckDeserializedNetworkAgainstOriginal(*network,
644 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000645 {inputTensorInfo.GetShape()},
646 {outputTensorInfo.GetShape()});
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000647}
648
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000649BOOST_AUTO_TEST_CASE(SerializeDeserializeFullyConnected)
650{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000651 class VerifyFullyConnectedName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
652 {
653 public:
654 void VisitFullyConnectedLayer(const armnn::IConnectableLayer*,
655 const armnn::FullyConnectedDescriptor&,
656 const armnn::ConstTensor&,
657 const armnn::Optional<armnn::ConstTensor>&,
658 const char* name) override
659 {
660 BOOST_TEST(name == "fully_connected");
661 }
662 };
663
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000664 armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
665 armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
666
667 armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
668 armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
669
670 armnn::FullyConnectedDescriptor descriptor;
671 descriptor.m_BiasEnabled = true;
672 descriptor.m_TransposeWeightMatrix = false;
673
674 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
675 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
676
677 armnn::ConstTensor weights(weightsInfo, weightsData);
678 armnn::ConstTensor biases(biasesInfo, biasesData);
679
680 armnn::INetworkPtr network = armnn::INetwork::Create();
681 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0, "input");
682 armnn::IConnectableLayer* const fullyConnectedLayer = network->AddFullyConnectedLayer(descriptor,
683 weights,
684 biases,
685 "fully_connected");
686 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0, "output");
687
688 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
689 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
690
691 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
692 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
693
694 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
695 BOOST_CHECK(deserializedNetwork);
696
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000697 VerifyFullyConnectedName nameChecker;
698 deserializedNetwork->Accept(nameChecker);
699
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000700 CheckDeserializedNetworkAgainstOriginal(*network,
701 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000702 {inputInfo.GetShape()},
703 {outputInfo.GetShape()});
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000704}
705
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000706BOOST_AUTO_TEST_CASE(SerializeDeserializeSpaceToBatchNd)
707{
708 class VerifySpaceToBatchNdName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
709 {
710 public:
711 void VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer*,
712 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
713 const char* name) override
714 {
715 BOOST_TEST(name == "SpaceToBatchNdLayer");
716 }
717 };
718
719 unsigned int inputShape[] = {2, 1, 2, 4};
720 unsigned int outputShape[] = {8, 1, 1, 3};
721
722 armnn::SpaceToBatchNdDescriptor desc;
723 desc.m_DataLayout = armnn::DataLayout::NCHW;
724 desc.m_BlockShape = {2, 2};
725 desc.m_PadList = {{0, 0}, {2, 0}};
726
727 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
728 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
729
730 armnn::INetworkPtr network = armnn::INetwork::Create();
731 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
732 armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, "SpaceToBatchNdLayer");
733 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
734
735 inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
736 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
737 spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
738 spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
739
740 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
741 BOOST_CHECK(deserializedNetwork);
742
743 VerifySpaceToBatchNdName nameChecker;
744 deserializedNetwork->Accept(nameChecker);
745
746 CheckDeserializedNetworkAgainstOriginal(*network,
747 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000748 {inputTensorInfo.GetShape()},
749 {outputTensorInfo.GetShape()});
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000750}
751
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000752BOOST_AUTO_TEST_CASE(SerializeDeserializeBatchToSpaceNd)
753{
754 class VerifyBatchToSpaceNdName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
755 {
756 public:
757 void VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer*,
758 const armnn::BatchToSpaceNdDescriptor& descriptor,
759 const char* name) override
760 {
761 BOOST_TEST(name == "BatchToSpaceNdLayer");
762 }
763 };
764
765 unsigned int inputShape[] = {4, 1, 2, 2};
766 unsigned int outputShape[] = {1, 1, 4, 4};
767
768 armnn::BatchToSpaceNdDescriptor desc;
769 desc.m_DataLayout = armnn::DataLayout::NCHW;
770 desc.m_BlockShape = {2, 2};
771 desc.m_Crops = {{0, 0}, {0, 0}};
772
773 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
774 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
775
776 armnn::INetworkPtr network = armnn::INetwork::Create();
777 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
778 armnn::IConnectableLayer* const batchToSpaceNdLayer = network->AddBatchToSpaceNdLayer(desc, "BatchToSpaceNdLayer");
779 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
780
781 inputLayer->GetOutputSlot(0).Connect(batchToSpaceNdLayer->GetInputSlot(0));
782 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
783 batchToSpaceNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
784 batchToSpaceNdLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
785
786 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
787 BOOST_CHECK(deserializedNetwork);
788
789 VerifyBatchToSpaceNdName nameChecker;
790 deserializedNetwork->Accept(nameChecker);
791
792 CheckDeserializedNetworkAgainstOriginal(*network,
793 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000794 {inputTensorInfo.GetShape()},
795 {outputTensorInfo.GetShape()});
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000796}
797
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000798BOOST_AUTO_TEST_CASE(SerializeDivision)
799{
800 class VerifyDivisionName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
801 {
802 public:
803 void VisitDivisionLayer(const armnn::IConnectableLayer*, const char* name) override
804 {
805 BOOST_TEST(name == "division");
806 }
807 };
808
809 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
810
811 armnn::INetworkPtr network = armnn::INetwork::Create();
812 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
813 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
814
815 const char* divLayerName = "division";
816
817 armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(divLayerName);
818 inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
819 inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
820
821 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
822 divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
823
824 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
825 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
826 divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
827
828 armnnSerializer::Serializer serializer;
829 serializer.Serialize(*network);
830
831 std::stringstream stream;
832 serializer.SaveSerializedToStream(stream);
833 BOOST_TEST(stream.str().length() > 0);
834 BOOST_TEST(stream.str().find(divLayerName) != stream.str().npos);
835
836 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
837 BOOST_CHECK(deserializedNetwork);
838
839 VerifyDivisionName nameChecker;
840 deserializedNetwork->Accept(nameChecker);
841}
842
Nattapat Chaimanowong235cea52019-02-28 16:27:30 +0000843BOOST_AUTO_TEST_CASE(SerializeDeserializeEqual)
844{
845 class VerifyEqualName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
846 {
847 public:
848 void VisitEqualLayer(const armnn::IConnectableLayer*,
849 const char* name) override
850 {
851 BOOST_TEST(name == "EqualLayer");
852 }
853 };
854
855 const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
856 const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
857 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
858
859 armnn::INetworkPtr network = armnn::INetwork::Create();
860 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
861 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
862 armnn::IConnectableLayer* const equalLayer = network->AddEqualLayer("EqualLayer");
863 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
864
865 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
866 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
867 inputLayer2->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
868 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
869 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
870 equalLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
871
872 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
873 BOOST_CHECK(deserializedNetwork);
874
875 VerifyEqualName nameChecker;
876 deserializedNetwork->Accept(nameChecker);
877
878 CheckDeserializedNetworkAgainstOriginal(*network,
879 *deserializedNetwork,
880 {inputTensorInfo1.GetShape(), inputTensorInfo2.GetShape()},
881 {outputTensorInfo.GetShape()},
882 {0, 1});
883}
884
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000885BOOST_AUTO_TEST_SUITE_END()