blob: 39df0c2a7f0ac068459c80624b50c0af11e3d1ec [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 "Serializer.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
Matthew Benthamff130e22020-01-17 11:47:42 +00008#include <armnn/Descriptors.hpp>
9#include <armnn/LstmParams.hpp>
10#include <armnn/QuantizedLstmParams.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000011
Mike Kelly8c1701a2019-02-11 17:01:27 +000012#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Derek Lamberti859f9ce2019-12-10 22:05:21 +000014#include <boost/core/ignore_unused.hpp>
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010015#include <boost/numeric/conversion/cast.hpp>
Mike Kelly8c1701a2019-02-11 17:01:27 +000016#include <flatbuffers/util.h>
17
Matthew Benthamff130e22020-01-17 11:47:42 +000018#include "SerializerUtils.hpp"
19
Mike Kelly8c1701a2019-02-11 17:01:27 +000020using namespace armnn;
21namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000022namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000023
24namespace armnnSerializer
25{
26
Mike Kellyaf484012019-02-20 16:53:11 +000027serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
28{
29 switch (function)
30 {
31 case armnn::ActivationFunction::Sigmoid:
32 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
33 case armnn::ActivationFunction::TanH:
34 return serializer::ActivationFunction::ActivationFunction_TanH;
35 case armnn::ActivationFunction::Linear:
36 return serializer::ActivationFunction::ActivationFunction_Linear;
37 case armnn::ActivationFunction::ReLu:
38 return serializer::ActivationFunction::ActivationFunction_ReLu;
39 case armnn::ActivationFunction::BoundedReLu:
40 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
41 case armnn::ActivationFunction::LeakyReLu:
42 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
43 case armnn::ActivationFunction::Abs:
44 return serializer::ActivationFunction::ActivationFunction_Abs;
45 case armnn::ActivationFunction::Sqrt:
46 return serializer::ActivationFunction::ActivationFunction_Sqrt;
47 case armnn::ActivationFunction::Square:
48 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000049 case armnn::ActivationFunction::Elu:
50 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000051 case armnn::ActivationFunction::HardSwish:
52 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Mike Kellyaf484012019-02-20 16:53:11 +000053 default:
54 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
55 }
56}
57
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010058serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
59{
60 switch (function)
61 {
62 case armnn::ArgMinMaxFunction::Max:
63 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
64 case armnn::ArgMinMaxFunction::Min:
65 default:
66 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
67 }
68}
69
janeil013fec1ea2019-11-07 09:47:20 +000070uint32_t SerializerVisitor::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000071{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000072 if (m_guidMap.empty())
73 {
janeil013fec1ea2019-11-07 09:47:20 +000074 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000075 }
76 else if (m_guidMap.find(guid) == m_guidMap.end())
77 {
janeil013fec1ea2019-11-07 09:47:20 +000078 ++m_layerId;
79 m_guidMap.insert(std::make_pair(guid, m_layerId));
80
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000081 return m_layerId;
82 }
Saoirse Stewart30211042019-02-18 17:19:16 +000083 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000084}
85
Mike Kelly8c1701a2019-02-11 17:01:27 +000086// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000087void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000088{
Derek Lamberti859f9ce2019-12-10 22:05:21 +000089 boost::ignore_unused(name);
90
Mike Kelly8c1701a2019-02-11 17:01:27 +000091 // Create FlatBuffer BaseLayer
92 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
93
94 // Create FlatBuffer BindableBaseLayer
95 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
96 flatBufferInputBaseLayer,
97 id);
Tee Jungaa920c52019-11-05 10:48:25 +000098 // Push layer binding id to outputIds.
99 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000100
101 // Create the FlatBuffer InputLayer
102 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
103
104 // Add the AnyLayer to the FlatBufferLayers
105 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
106}
107
108// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000109void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000110{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000111 boost::ignore_unused(name);
112
Mike Kelly8c1701a2019-02-11 17:01:27 +0000113 // Create FlatBuffer BaseLayer
114 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
115
116 // Create FlatBuffer BindableBaseLayer
117 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
118 flatBufferOutputBaseLayer,
119 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000120 // Push layer binding id to outputIds.
121 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000122
123 // Create the FlatBuffer OutputLayer
124 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
125 // Add the AnyLayer to the FlatBufferLayers
126 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
127}
128
Kevin May868eb142019-09-04 17:29:31 +0100129void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
130{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000131 boost::ignore_unused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100132 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
133 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
134
135 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100136}
137
Mike Kellyaf484012019-02-20 16:53:11 +0000138// Build FlatBuffer for Activation Layer
139void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
140 const armnn::ActivationDescriptor& descriptor,
141 const char* name)
142{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000143 boost::ignore_unused(name);
144
Mike Kellyaf484012019-02-20 16:53:11 +0000145 // Create FlatBuffer BaseLayer
146 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
147
148 // Create the FlatBuffer ActivationDescriptor
149 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
150 GetFlatBufferActivationFunction(descriptor.m_Function),
151 descriptor.m_A,
152 descriptor.m_B);
153
154 // Create the FlatBuffer ActivationLayer
155 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
156 flatBufferBaseLayer,
157 flatBufferDescriptor);
158
159 // Add the AnyLayer to the FlatBufferLayers
160 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
161}
162
Mike Kelly8c1701a2019-02-11 17:01:27 +0000163// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000164void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000165{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000166 boost::ignore_unused(name);
167
Mike Kelly8c1701a2019-02-11 17:01:27 +0000168 // Create FlatBuffer BaseLayer
169 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
170
171 // Create the FlatBuffer AdditionLayer
172 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
173
174 // Add the AnyLayer to the FlatBufferLayers
175 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
176}
177
Nikhil Rajee391d52019-09-05 17:50:44 +0100178// Build FlatBuffer for ArgMinMax Layer
179void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
180 const armnn::ArgMinMaxDescriptor& descriptor,
181 const char *name)
182{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000183 boost::ignore_unused(name);
184
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100185 // Create FlatBuffer BaseLayer
186 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
187
188 // Create FlatBuffer Descriptor
189 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
190 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
191 descriptor.m_Axis);
192
193 // Create FlatBuffer ArgMinMaxLayer
194 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
195 flatBufferBaseLayer,
196 flatBufferDescriptor);
197
198 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100199}
200
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000201// Build FlatBuffer for BatchToSpaceNd Layer
202void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
203 const armnn::BatchToSpaceNdDescriptor& descriptor,
204 const char* name)
205{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000206 boost::ignore_unused(name);
207
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000208 // Create FlatBuffer BaseLayer
209 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
210
211 std::vector<unsigned int> crops;
212 crops.reserve(descriptor.m_Crops.size() * 2);
213 for (auto& crop : descriptor.m_Crops)
214 {
215 crops.push_back(crop.first);
216 crops.push_back(crop.second);
217 }
218
219 auto flatBufferDescriptor =
220 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
221 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
222 m_flatBufferBuilder.CreateVector(crops),
223 GetFlatBufferDataLayout(descriptor.m_DataLayout));
224
225 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
226 flatBufferBaseLayer,
227 flatBufferDescriptor);
228
229 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
230}
231
ruoyan018e7fa232019-02-28 15:09:07 +0000232void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
233 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
234 const armnn::ConstTensor& mean,
235 const armnn::ConstTensor& variance,
236 const armnn::ConstTensor& beta,
237 const armnn::ConstTensor& gamma,
238 const char* name)
239{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000240 boost::ignore_unused(name);
241
ruoyan018e7fa232019-02-28 15:09:07 +0000242 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
243 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
244 m_flatBufferBuilder,
245 batchNormDescriptor.m_Eps,
246 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
247
248 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
249 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
250 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
251 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
252 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
253 fbBatchNormalizationBaseLayer,
254 fbBatchNormalizationDescriptor,
255 fbMeanConstTensorInfo,
256 fbVarianceConstTensorInfo,
257 fbBetaConstTensorInfo,
258 fbGammaConstTensorInfo);
259
260 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
261}
262
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100263void SerializerVisitor::VisitComparisonLayer(const armnn::IConnectableLayer* layer,
264 const armnn::ComparisonDescriptor& descriptor,
265 const char* name)
266{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000267 boost::ignore_unused(name);
268
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100269 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
270 auto fbDescriptor = serializer::CreateComparisonDescriptor(
271 m_flatBufferBuilder,
272 GetFlatBufferComparisonOperation(descriptor.m_Operation));
273
274 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
275 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100276}
277
Conor Kennedy76277882019-02-26 08:29:54 +0000278// Build FlatBuffer for Constant Layer
279void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
280 const armnn::ConstTensor& input,
281 const char* name)
282{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000283 boost::ignore_unused(name);
284
Conor Kennedy76277882019-02-26 08:29:54 +0000285 // Create FlatBuffer BaseLayer
286 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
287
288 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
289
290 // Create the FlatBuffer ConstantLayer
291 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
292 flatBufferConstantBaseLayer,
293 flatBufferConstTensorInfo);
294
295 // Add the AnyLayer to the FlatBufferLayers
296 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
297}
298
Mike Kellya0766c32019-02-19 17:22:07 +0000299// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000300void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
301 const armnn::Convolution2dDescriptor& descriptor,
302 const armnn::ConstTensor& weights,
303 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000304 const char* name)
305{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000306 boost::ignore_unused(name);
307
Mike Kellya0766c32019-02-19 17:22:07 +0000308 // Create FlatBuffer BaseLayer
309 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
310
311 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
312 descriptor.m_PadLeft,
313 descriptor.m_PadRight,
314 descriptor.m_PadTop,
315 descriptor.m_PadBottom,
316 descriptor.m_StrideX,
317 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100318 descriptor.m_DilationX,
319 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000320 descriptor.m_BiasEnabled,
321 GetFlatBufferDataLayout(descriptor.m_DataLayout));
322 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
323 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
324
325 if (biases.has_value())
326 {
327 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
328 }
329
330 // Create the FlatBuffer Convolution2dLayer
331 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
332 flatBufferBaseLayer,
333 flatBufferDescriptor,
334 flatBufferWeightsConstTensorInfo,
335 flatBufferBiasesConstTensorInfo);
336
337 // Add the AnyLayer to the FlatBufferLayers
338 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
339}
340
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100341void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
342 const armnn::DepthToSpaceDescriptor& descriptor,
343 const char* name)
344{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000345 boost::ignore_unused(name);
346
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100347 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
348 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
349 descriptor.m_BlockSize,
350 GetFlatBufferDataLayout(descriptor.m_DataLayout));
351
352 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
353
354 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100355}
356
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000357void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
358 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
359 const armnn::ConstTensor& weights,
360 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000361 const char* name)
362{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000363 boost::ignore_unused(name);
364
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000365 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
366 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
367 descriptor.m_PadLeft,
368 descriptor.m_PadRight,
369 descriptor.m_PadTop,
370 descriptor.m_PadBottom,
371 descriptor.m_StrideX,
372 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100373 descriptor.m_DilationX,
374 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000375 descriptor.m_BiasEnabled,
376 GetFlatBufferDataLayout(descriptor.m_DataLayout));
377
378 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
379 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
380 if (biases.has_value())
381 {
382 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
383 }
384
385 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
386 fbBaseLayer,
387 fbDescriptor,
388 fbWeightsConstTensorInfo,
389 fbBiasesConstTensorInfo);
390
391 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
392}
393
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000394void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
395 const char* name)
396{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000397 boost::ignore_unused(name);
398
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000399 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
400 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
401
402 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
403}
404
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000405void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
406 const armnn::DetectionPostProcessDescriptor& descriptor,
407 const armnn::ConstTensor& anchors,
408 const char* name)
409{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000410 boost::ignore_unused(name);
411
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000412 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
413 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
414 descriptor.m_MaxDetections,
415 descriptor.m_MaxClassesPerDetection,
416 descriptor.m_DetectionsPerClass,
417 descriptor.m_NmsScoreThreshold,
418 descriptor.m_NmsIouThreshold,
419 descriptor.m_NumClasses,
420 descriptor.m_UseRegularNms,
421 descriptor.m_ScaleX,
422 descriptor.m_ScaleY,
423 descriptor.m_ScaleW,
424 descriptor.m_ScaleH);
425
426 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
427
428 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
429 fbBaseLayer,
430 fbDescriptor,
431 fbAnchorsConstTensorInfo);
432
433 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
434}
435
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000436void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
437{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000438 boost::ignore_unused(name);
439
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000440 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
441 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000442
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000443 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
444}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000445
josh minor4a3c6102020-01-06 16:40:46 -0600446void SerializerVisitor::VisitElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
447 const armnn::ElementwiseUnaryDescriptor& descriptor,
448 const char* name)
449{
450 boost::ignore_unused(name);
451
452 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
453 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
454 m_flatBufferBuilder,
455 GetFlatBufferUnaryOperation(descriptor.m_Operation));
456
457 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
458 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
459}
460
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000461void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
462{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000463 boost::ignore_unused(name);
464
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000465 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
466 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
467
468 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
469}
470
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000471void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
472{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000473 boost::ignore_unused(name);
474
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000475 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
476 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
477
478 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
479}
480
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000481void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
482{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000483 boost::ignore_unused(name);
484
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000485 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
486 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000487
488 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
489}
490
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000491void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
492{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000493 boost::ignore_unused(name);
494
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000495 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000496 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000497
498 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
499}
500
Kevin Mayce5045a2019-10-02 14:07:47 +0100501void SerializerVisitor::VisitInstanceNormalizationLayer(
502 const armnn::IConnectableLayer* layer,
503 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
504 const char* name)
505{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000506 boost::ignore_unused(name);
507
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100508 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
509 m_flatBufferBuilder,
510 instanceNormalizationDescriptor.m_Gamma,
511 instanceNormalizationDescriptor.m_Beta,
512 instanceNormalizationDescriptor.m_Eps,
513 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
514
515 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
516 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
517
518 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100519}
520
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000521void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
522 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
523 const char* name)
524{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000525 boost::ignore_unused(name);
526
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000527 // Create FlatBuffer BaseLayer
528 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
529
530 // Create the FlatBuffer L2Normalization Descriptor
531 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100532 m_flatBufferBuilder,
533 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
534 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000535
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100536 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000537 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
538
539 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
540}
541
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100542void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
543 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
544 const char* name)
545{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000546 boost::ignore_unused(name);
547
Sadik Armagan26257852019-10-14 13:00:47 +0100548 // Create FlatBuffer BaseLayer
549 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
550
551 // Create the FlatBuffer LogSoftmaxDescriptor
552 auto flatBufferLogSoftmaxDesc =
553 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
554 logSoftmaxDescriptor.m_Beta,
555 logSoftmaxDescriptor.m_Axis);
556
557 // Create the FlatBuffer LogSoftmaxLayer
558 auto flatBufferLogSoftmaxLayer =
559 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
560 flatBufferLogSoftmaxBaseLayer,
561 flatBufferLogSoftmaxDesc);
562
563 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100564}
565
566void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
567 const armnn::LstmDescriptor& descriptor,
568 const armnn::LstmInputParams& params,
569 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000570{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000571 boost::ignore_unused(name);
572
Jim Flynn11af3752019-03-19 17:22:29 +0000573 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
574
575 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
576 m_flatBufferBuilder,
577 descriptor.m_ActivationFunc,
578 descriptor.m_ClippingThresCell,
579 descriptor.m_ClippingThresProj,
580 descriptor.m_CifgEnabled,
581 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100582 descriptor.m_ProjectionEnabled,
583 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000584
585 // Get mandatory input parameters
586 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
587 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
588 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
589 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
590 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
591 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
592 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
593 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
594 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
595
596 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
597 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
598 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
599 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
600 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
601 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
602 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
603 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
604 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100605 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
606 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
607 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
608 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000609
610 if (!descriptor.m_CifgEnabled)
611 {
612 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
613 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
614 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
615 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
616 }
617
618 if (descriptor.m_ProjectionEnabled)
619 {
620 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
621 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
622 }
623
624 if (descriptor.m_PeepholeEnabled)
625 {
626 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
627 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
628 }
629
Jan Eilersf8c62972019-07-17 11:07:49 +0100630 if (descriptor.m_LayerNormEnabled)
631 {
632 if (!descriptor.m_CifgEnabled)
633 {
634 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
635 }
636 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
637 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
638 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
639 }
640
Jim Flynn11af3752019-03-19 17:22:29 +0000641 auto fbLstmParams = serializer::CreateLstmInputParams(
642 m_flatBufferBuilder,
643 inputToForgetWeights,
644 inputToCellWeights,
645 inputToOutputWeights,
646 recurrentToForgetWeights,
647 recurrentToCellWeights,
648 recurrentToOutputWeights,
649 forgetGateBias,
650 cellBias,
651 outputGateBias,
652 inputToInputWeights,
653 recurrentToInputWeights,
654 cellToInputWeights,
655 inputGateBias,
656 projectionWeights,
657 projectionBias,
658 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100659 cellToOutputWeights,
660 inputLayerNormWeights,
661 forgetLayerNormWeights,
662 cellLayerNormWeights,
663 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000664
665 auto fbLstmLayer = serializer::CreateLstmLayer(
666 m_flatBufferBuilder,
667 fbLstmBaseLayer,
668 fbLstmDescriptor,
669 fbLstmParams);
670
671 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
672}
673
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000674void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
675{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000676 boost::ignore_unused(name);
677
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000678 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
679 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
680
681 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
682}
683
684void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
685 const armnn::MeanDescriptor& descriptor,
686 const char* name)
687{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000688 boost::ignore_unused(name);
689
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000690 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
691 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
692 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
693 descriptor.m_KeepDims);
694
695 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
696 fbMeanBaseLayer,
697 fbMeanDescriptor);
698
699 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
700}
701
702void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
703{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000704 boost::ignore_unused(name);
705
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000706 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
707 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
708
709 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
710}
711
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100712void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
713{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000714 boost::ignore_unused(name);
715
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100716 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
717 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
718
719 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
720}
721
Jim Flynnac25a1b2019-02-28 10:40:49 +0000722void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100723 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000724 const char* name)
725{
Jim Flynne242f2d2019-05-22 14:24:13 +0100726 VisitConcatLayer(layer, mergerDescriptor, name);
727}
728
729void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
730 const armnn::ConcatDescriptor& concatDescriptor,
731 const char* name)
732{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000733 boost::ignore_unused(name);
734
Jim Flynne242f2d2019-05-22 14:24:13 +0100735 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000736
737 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100738 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000739 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100740 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000741 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100742 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000743 {
744 origins.push_back(origin[d]);
745 }
746 auto view = m_flatBufferBuilder.CreateVector(origins);
747 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
748 views.push_back(uintVector);
749 }
750
Jim Flynne242f2d2019-05-22 14:24:13 +0100751 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
752 concatDescriptor.GetConcatAxis(),
753 concatDescriptor.GetNumViews(),
754 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000755 m_flatBufferBuilder.CreateVector(views));
756
Jim Flynne242f2d2019-05-22 14:24:13 +0100757 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
758 flatBufferConcatBaseLayer,
759 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000760
Jim Flynne242f2d2019-05-22 14:24:13 +0100761 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000762}
763
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000764void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000765{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000766 boost::ignore_unused(name);
767
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000768 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
769 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
770 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000771
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000772 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000773}
774
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000775void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
776 const armnn::PadDescriptor& padDescriptor,
777 const char* name)
778{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000779 boost::ignore_unused(name);
780
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000781 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
782
783 std::vector<unsigned int> padList;
784 for (auto& p: padDescriptor.m_PadList)
785 {
786 padList.push_back(p.first);
787 padList.push_back(p.second);
788 }
789
790 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100791 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100792 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000793
794 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
795 flatBufferBaseLayer,
796 flatBufferPadDesc);
797
798 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
799}
800
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000801void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
802 const armnn::PermuteDescriptor& permuteDescriptor,
803 const char* name)
804{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000805 boost::ignore_unused(name);
806
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000807 // Create FlatBuffer BaseLayer
808 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
809
810 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100811 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000812 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100813 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000814 }
815
816 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
817 m_flatBufferBuilder.CreateVector(dimMappings));
818
819 // Create the FlatBuffer PermuteLayer
820 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
821 flatBufferPermuteBaseLayer,
822 flatBufferPermuteDesc);
823
824 // Add the AnyLayer to the FlatBufferLayers
825 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
826}
827
Saoirse Stewart263829c2019-02-19 15:54:14 +0000828// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000829void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000830 const armnn::ReshapeDescriptor& reshapeDescriptor,
831 const char* name)
832{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000833 boost::ignore_unused(name);
834
Saoirse Stewart263829c2019-02-19 15:54:14 +0000835 // Create FlatBuffer BaseLayer
836 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
837
838 std::vector<unsigned int> targetShape;
839 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
840 {
841 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
842 }
843
844 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
845 m_flatBufferBuilder.CreateVector(targetShape));
846
847 // Create the FlatBuffer ReshapeLayer
848 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
849 flatBufferReshapeDesc);
850
851 // Add the AnyLayer to the FlatBufferLayers
852 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
853}
854
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000855void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
856 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
857 const char* name)
858{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000859 boost::ignore_unused(name);
860
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000861 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
862
863 auto flatBufferDescriptor =
864 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
865 resizeDescriptor.m_TargetWidth,
866 resizeDescriptor.m_TargetHeight,
867 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
868
869 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
870 flatBufferBaseLayer,
871 flatBufferDescriptor);
872
873 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
874}
875
Teresa Charlina9075df2019-06-27 15:41:57 +0100876void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
877 const armnn::ResizeDescriptor& resizeDescriptor,
878 const char* name)
879{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000880 boost::ignore_unused(name);
881
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100882 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
883
884 auto flatBufferDescriptor =
885 CreateResizeDescriptor(m_flatBufferBuilder,
886 resizeDescriptor.m_TargetHeight,
887 resizeDescriptor.m_TargetWidth,
888 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
889 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
890
891 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
892 flatBufferBaseLayer,
893 flatBufferDescriptor);
894
895 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100896}
897
Sadik Armagan8b42a382019-03-01 14:24:49 +0000898void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
899{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000900 boost::ignore_unused(name);
901
Sadik Armagan8b42a382019-03-01 14:24:49 +0000902 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
903 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
904
905 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
906}
907
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100908void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
909 const armnn::SliceDescriptor& sliceDescriptor,
910 const char* name)
911{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000912 boost::ignore_unused(name);
913
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100914 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
915 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
916 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
917 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
918
919 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
920
921 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100922}
923
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000924// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000925void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
926 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000927 const char* name)
928{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000929 boost::ignore_unused(name);
930
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000931 // Create FlatBuffer BaseLayer
932 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
933
934 // Create the FlatBuffer SoftmaxDescriptor
935 auto flatBufferSoftmaxDesc =
936 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
937
938 // Create the FlatBuffer SoftmaxLayer
939 auto flatBufferSoftmaxLayer =
940 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
941 flatBufferSoftmaxBaseLayer,
942 flatBufferSoftmaxDesc);
943
944 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
945}
946
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000947void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
948 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000949 const char* name)
950{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000951 boost::ignore_unused(name);
952
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000953 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
954 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
955 m_flatBufferBuilder,
956 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
957 pooling2dDescriptor.m_PadLeft,
958 pooling2dDescriptor.m_PadRight,
959 pooling2dDescriptor.m_PadTop,
960 pooling2dDescriptor.m_PadBottom,
961 pooling2dDescriptor.m_PoolWidth,
962 pooling2dDescriptor.m_PoolHeight,
963 pooling2dDescriptor.m_StrideX,
964 pooling2dDescriptor.m_StrideY,
965 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
966 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
967 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
968
969 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
970 fbPooling2dBaseLayer,
971 fbPooling2dDescriptor);
972
973 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
974}
975
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100976void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
977 const char* name)
978{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000979 boost::ignore_unused(name);
980
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100981 // Create FlatBuffer BaseLayer
982 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
983
984 // Create the FlatBuffer AdditionLayer
985 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
986
987 // Add the AnyLayer to the FlatBufferLayers
988 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100989}
990
Derek Lamberti87acb272019-03-27 16:51:31 +0000991void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
992{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000993 boost::ignore_unused(name);
994
Derek Lamberti87acb272019-03-27 16:51:31 +0000995 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
996 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
997 fbQuantizeBaseLayer);
998 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
999}
1000
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001001// Build FlatBuffer for FullyConnected Layer
1002void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1003 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1004 const armnn::ConstTensor& weights,
1005 const armnn::Optional<armnn::ConstTensor>& biases,
1006 const char* name)
1007{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001008 boost::ignore_unused(name);
1009
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001010 // Create FlatBuffer BaseLayer
1011 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1012
1013 // Create FlatBuffer FullyConnectedDescriptor
1014 auto flatBufferDescriptor =
1015 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1016 fullyConnectedDescriptor.m_BiasEnabled,
1017 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1018
1019 // Create FlatBuffer weights data
1020 auto flatBufferWeights = CreateConstTensorInfo(weights);
1021
1022 // Create FlatBuffer bias data
1023 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1024 if (fullyConnectedDescriptor.m_BiasEnabled)
1025 {
1026 flatBufferBiases = CreateConstTensorInfo(biases.value());
1027 }
1028
1029 // Create FlatBuffer FullyConnectedLayer
1030 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1031 flatBufferBaseLayer,
1032 flatBufferDescriptor,
1033 flatBufferWeights,
1034 flatBufferBiases);
1035
1036 // Add created FullyConnectedLayer to the FlatBufferLayers
1037 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1038}
1039
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001040// Build FlatBuffer for SpaceToBatchNd Layer
1041void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1042 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1043 const char* name)
1044{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001045 boost::ignore_unused(name);
1046
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001047 // Create FlatBuffer BaseLayer
1048 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1049
1050 std::vector<unsigned int> padList;
1051 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1052 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1053 {
1054 padList.push_back(pad.first);
1055 padList.push_back(pad.second);
1056 }
1057
1058 auto flatBufferDescriptor =
1059 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1060 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1061 m_flatBufferBuilder.CreateVector(padList),
1062 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1063
1064 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1065 flatBufferBaseLayer,
1066 flatBufferDescriptor);
1067
1068 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1069}
1070
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001071// Build FlatBuffer for SpaceToDepthLayer
1072void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1073 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1074 const char* name)
1075{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001076 boost::ignore_unused(name);
1077
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001078 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1079 auto flatBufferDescriptor =
1080 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1081 spaceToDepthDescriptor.m_BlockSize,
1082 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1083
1084 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1085 flatBufferBaseLayer,
1086 flatBufferDescriptor);
1087
1088 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001089}
1090
Jim Flynn18ce3382019-03-08 11:08:30 +00001091// Build FlatBuffer for Splitter Layer
1092void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1093 const armnn::ViewsDescriptor& viewsDescriptor,
1094 const char* name)
1095{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001096 boost::ignore_unused(name);
1097
Jim Flynn18ce3382019-03-08 11:08:30 +00001098 // Create FlatBuffer ViewOrigins
1099 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1100 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1101
1102 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1103 {
1104 std::vector<uint32_t> viewOrigin;
1105 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1106
1107 // Copy vector
1108 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1109 {
1110 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1111 }
1112
1113 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1114 m_flatBufferBuilder.CreateVector(viewOrigin)));
1115 }
1116
1117 // Create FlatBuffer OriginsDescriptor
1118 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1119 viewsDescriptor.GetOrigins().GetConcatAxis(),
1120 viewsDescriptor.GetOrigins().GetNumViews(),
1121 viewsDescriptor.GetOrigins().GetNumDimensions(),
1122 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1123
1124 // Create FlatBuffer ViewOrigins
1125 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1126 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1127
1128 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1129 {
1130 std::vector<uint32_t> viewSize;
1131 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1132
1133 // Copy vector
1134 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1135 {
1136 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1137 }
1138
1139 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1140 m_flatBufferBuilder.CreateVector(viewSize)));
1141 }
1142
1143 // Create FlatBuffer ViewsDescriptor
1144 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1145 flatBufferOriginDescriptor,
1146 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1147
1148 // Create FlatBuffer BaseLayer
1149 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1150
1151 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1152 flatBufferBaseLayer,
1153 flatBufferViewsDescriptor);
1154
1155 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1156}
1157
Nina Drozd57728782019-02-27 10:53:27 +00001158void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1159 const armnn::NormalizationDescriptor& descriptor,
1160 const char* name)
1161{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001162 boost::ignore_unused(name);
1163
Nina Drozd57728782019-02-27 10:53:27 +00001164 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1165
1166 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1167 m_flatBufferBuilder,
1168 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1169 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1170 descriptor.m_NormSize,
1171 descriptor.m_Alpha,
1172 descriptor.m_Beta,
1173 descriptor.m_K,
1174 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1175
1176 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1177 fbNormalizationBaseLayer,
1178 fbNormalizationDescriptor);
1179
1180 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1181}
1182
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001183void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1184 const armnn::StackDescriptor& stackDescriptor,
1185 const char* name)
1186{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001187 boost::ignore_unused(name);
1188
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001189 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1190
1191 std::vector<unsigned int> inputShape;
1192 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1193 {
1194 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1195 }
1196
1197 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1198 stackDescriptor.m_Axis,
1199 stackDescriptor.m_NumInputs,
1200 m_flatBufferBuilder.CreateVector(inputShape));
1201
1202 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1203 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001204}
1205
Derek Lamberti013c3902019-10-21 10:46:16 +01001206void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1207 const armnn::StandInDescriptor& standInDescriptor,
1208 const char *name)
1209{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001210 boost::ignore_unused(name);
1211
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001212 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1213 standInDescriptor.m_NumInputs,
1214 standInDescriptor.m_NumOutputs);
1215
1216 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1217 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1218
1219 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001220}
1221
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001222void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1223 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1224 const char* name)
1225{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001226 boost::ignore_unused(name);
1227
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001228 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1229
1230 auto flatBufferDescriptor =
1231 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1232 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1233 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1234 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1235 stridedSliceDescriptor.m_BeginMask,
1236 stridedSliceDescriptor.m_EndMask,
1237 stridedSliceDescriptor.m_ShrinkAxisMask,
1238 stridedSliceDescriptor.m_EllipsisMask,
1239 stridedSliceDescriptor.m_NewAxisMask,
1240 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1241
1242 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1243 flatBufferBaseLayer,
1244 flatBufferDescriptor);
1245
1246 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1247}
1248
Conor Kennedyda1f9752019-03-01 14:37:12 +00001249void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1250{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001251 boost::ignore_unused(name);
1252
Conor Kennedyda1f9752019-03-01 14:37:12 +00001253 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1254 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1255
1256 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1257}
1258
Sadik Armaganeff363d2019-04-05 15:25:46 +01001259void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1260{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001261 boost::ignore_unused(name);
1262
Sadik Armaganeff363d2019-04-05 15:25:46 +01001263 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1264 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1265
1266 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1267}
1268
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001269void SerializerVisitor::VisitTransposeConvolution2dLayer(
1270 const armnn::IConnectableLayer* layer,
1271 const armnn::TransposeConvolution2dDescriptor& descriptor,
1272 const armnn::ConstTensor& weights,
1273 const armnn::Optional<armnn::ConstTensor>& biases,
1274 const char* name)
1275{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001276 boost::ignore_unused(name);
1277
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001278 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1279 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1280 descriptor.m_PadLeft,
1281 descriptor.m_PadRight,
1282 descriptor.m_PadTop,
1283 descriptor.m_PadBottom,
1284 descriptor.m_StrideX,
1285 descriptor.m_StrideY,
1286 descriptor.m_BiasEnabled,
1287 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1288
1289 // weights & biases
1290 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1291 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1292 if (biases.has_value())
1293 {
1294 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1295 }
1296
1297 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1298 fbBaseLayer,
1299 fbDescriptor,
1300 fbWeightsConstTensorInfo,
1301 fbBiasesConstTensorInfo);
1302
1303 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001304}
1305
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001306void SerializerVisitor::VisitTransposeLayer(const armnn::IConnectableLayer* layer,
1307 const armnn::TransposeDescriptor& descriptor,
1308 const char* name)
1309{
1310 boost::ignore_unused(name);
1311
1312 // Create FlatBuffer BaseLayer
1313 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1314
1315 std::vector<unsigned int> dimMappings;
1316 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1317 {
1318 dimMappings.push_back(descriptor.m_DimMappings[i]);
1319 }
1320
1321 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1322 m_flatBufferBuilder.CreateVector(dimMappings));
1323
1324 // Create the FlatBuffer TransposeLayer
1325 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1326 flatBufferBaseLayer,
1327 flatBufferDesc);
1328
1329 // Add the AnyLayer to the FlatBufferLayers
1330 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1331}
1332
James Conroyee18dc82019-07-17 11:27:46 +01001333void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1334 const armnn::QuantizedLstmInputParams& params,
1335 const char* name)
1336{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001337 boost::ignore_unused(name);
1338
Jan Eilers5b01a892019-07-23 09:47:43 +01001339 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1340
1341 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001342 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1343 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1344 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1345 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001346
Francis Murtaghbb590b42019-08-14 09:51:36 +01001347 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1348 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1349 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1350 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001351
Francis Murtaghbb590b42019-08-14 09:51:36 +01001352 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1353 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1354 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1355 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001356
1357 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1358 m_flatBufferBuilder,
1359 inputToInputWeights,
1360 inputToForgetWeights,
1361 inputToCellWeights,
1362 inputToOutputWeights,
1363 recurrentToInputWeights,
1364 recurrentToForgetWeights,
1365 recurrentToCellWeights,
1366 recurrentToOutputWeights,
1367 inputGateBias,
1368 forgetGateBias,
1369 cellBias,
1370 outputGateBias);
1371
1372 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1373 m_flatBufferBuilder,
1374 fbQuantizedLstmBaseLayer,
1375 fbQuantizedLstmParams);
1376
1377 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001378}
1379
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001380fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001381 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001382{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001383
Sadik Armagandb059fd2019-03-20 12:28:32 +00001384 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1385
Mike Kelly8c1701a2019-02-11 17:01:27 +00001386 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1387 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1388
1389 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001390 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001391 m_flatBufferBuilder.CreateString(layer->GetName()),
1392 layerType,
1393 m_flatBufferBuilder.CreateVector(inputSlots),
1394 m_flatBufferBuilder.CreateVector(outputSlots));
1395}
1396
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001397void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001398{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001399
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001400 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001401 m_serializedLayers.push_back(anyLayer);
1402}
1403
Mike Kellya0766c32019-02-19 17:22:07 +00001404template <typename T>
1405flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1406{
1407 const T* buffer = reinterpret_cast<const T*>(memory);
1408 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1409 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1410 return fbVector;
1411}
1412
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001413flatbuffers::Offset<serializer::ConstTensor>
1414 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001415{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001416 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001417
1418 // Get the dimensions
1419 std::vector<unsigned int> shape;
1420
1421 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1422 {
1423 shape.push_back(tensorInfo.GetShape()[dim]);
1424 }
1425
1426 // Create FlatBuffer TensorInfo
1427 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1428 m_flatBufferBuilder.CreateVector(shape),
1429 GetFlatBufferDataType(tensorInfo.GetDataType()),
1430 tensorInfo.GetQuantizationScale(),
1431 tensorInfo.GetQuantizationOffset());
1432 flatbuffers::Offset<void> fbPayload;
1433
1434 switch (tensorInfo.GetDataType())
1435 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001436 case armnn::DataType::Float32:
1437 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001438 {
1439 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1440 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1441 m_flatBufferBuilder,
1442 fbVector);
1443 fbPayload = flatBuffersData.o;
1444 break;
1445 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001446 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001447 {
1448 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1449 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1450 m_flatBufferBuilder,
1451 fbVector);
1452 fbPayload = flatBuffersData.o;
1453 break;
1454 }
Derek Lambertif90c56d2020-01-10 17:14:08 +00001455 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001456 {
1457 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1458 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1459 m_flatBufferBuilder,
1460 fbVector);
1461 fbPayload = flatBuffersData.o;
1462 break;
1463 }
Derek Lambertif90c56d2020-01-10 17:14:08 +00001464 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001465 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001466 default:
1467 {
1468 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1469 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1470 m_flatBufferBuilder,
1471 fbVector);
1472 fbPayload = flatBuffersData.o;
1473 }
1474 }
1475 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1476 m_flatBufferBuilder,
1477 flatBufferTensorInfo,
1478 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1479 fbPayload);
1480 return flatBufferConstTensor;
1481}
1482
Tee Jungaa920c52019-11-05 10:48:25 +00001483flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1484{
1485 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1486 serializer::CreateFeatureCompatibilityVersions(
1487 m_flatBufferBuilder,
1488 1 // Binding ids scheme version
1489 );
1490 return versionsTable;
1491}
1492
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001493std::vector<fb::Offset<serializer::InputSlot>>
1494 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001495{
Mike Kellya0766c32019-02-19 17:22:07 +00001496 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001497
1498 // Get the InputSlots
1499 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1500 {
1501 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1502
1503 // Get the Connection for the InputSlot
1504 const IOutputSlot* connection = inputSlot.GetConnection();
1505
1506 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001507 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1508 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001509 // Create FlatBuffer InputSlot
1510 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1511 }
1512 return inputSlots;
1513}
1514
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001515std::vector<fb::Offset<serializer::OutputSlot>>
1516 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001517{
1518 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1519
1520 // Get the OutputSlots
1521 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1522 {
1523 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001524 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001525
1526 // Get the dimensions
1527 std::vector<unsigned int> shape;
1528 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1529 {
1530 shape.push_back(tensorInfo.GetShape()[dim]);
1531 }
1532
1533 // Create FlatBuffer TensorInfo
1534 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1535 m_flatBufferBuilder.CreateVector(shape),
1536 GetFlatBufferDataType(tensorInfo.GetDataType()),
1537 tensorInfo.GetQuantizationScale(),
1538 tensorInfo.GetQuantizationOffset());
1539
1540 // Create FlatBuffer Outputslot
1541 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1542 slotIndex,
1543 flatBufferTensorInfo));
1544 }
1545 return outputSlots;
1546}
1547
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001548
1549ISerializer* ISerializer::CreateRaw()
1550{
1551 return new Serializer();
1552}
1553
1554ISerializerPtr ISerializer::Create()
1555{
1556 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1557}
1558
1559void ISerializer::Destroy(ISerializer* serializer)
1560{
1561 delete serializer;
1562}
1563
1564void Serializer::Serialize(const INetwork& inNetwork)
1565{
1566 // Iterate through to network
1567 inNetwork.Accept(m_SerializerVisitor);
1568 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1569
1570 // Create FlatBuffer SerializedGraph
1571 auto serializedGraph = serializer::CreateSerializedGraph(
1572 fbBuilder,
1573 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1574 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001575 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1576 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001577
1578 // Serialize the graph
1579 fbBuilder.Finish(serializedGraph);
1580}
1581
1582bool Serializer::SaveSerializedToStream(std::ostream& stream)
1583{
1584 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1585
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001586 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1587 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001588 return !stream.bad();
1589}
1590
Matteo Martincighec333912019-02-13 15:12:39 +00001591} // namespace armnnSerializer