blob: c08784352d59af81614b529dc2c624efe69aa342 [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
Mike Kelly8c1701a2019-02-11 17:01:27 +00005#include "Serializer.hpp"
Finn Williamsb454c5c2021-02-09 15:56:23 +00006#include "SerializerUtils.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>
Jan Eilers8eb25602020-03-09 12:13:48 +000011#include <armnn/utility/IgnoreUnused.hpp>
Matthew Sloyan0663d662020-09-14 11:47:26 +010012#include <armnn/utility/NumericCast.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Finn Williamsb454c5c2021-02-09 15:56:23 +000014#include <fmt/format.h>
Mike Kelly8c1701a2019-02-11 17:01:27 +000015#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000016
Mike Kelly8c1701a2019-02-11 17:01:27 +000017using namespace armnn;
18namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000019namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000020
21namespace armnnSerializer
22{
23
Finn Williams85d36712021-01-26 22:30:06 +000024ISerializer::ISerializer() : pSerializerImpl(new SerializerImpl())
25{
26}
27
28ISerializer::~ISerializer() = default;
29
30ISerializer* ISerializer::CreateRaw()
31{
32 return new ISerializer();
33}
34
35ISerializerPtr ISerializer::Create()
36{
37 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
38}
39
40void ISerializer::Destroy(ISerializer* serializer)
41{
42 delete serializer;
43}
44
45void ISerializer::Serialize(const armnn::INetwork& inNetwork)
46{
47 pSerializerImpl->Serialize(inNetwork);
48}
49
50bool ISerializer::SaveSerializedToStream(std::ostream& stream)
51{
52 return pSerializerImpl->SaveSerializedToStream(stream);
53}
54
Mike Kellyaf484012019-02-20 16:53:11 +000055serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
56{
57 switch (function)
58 {
59 case armnn::ActivationFunction::Sigmoid:
60 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
61 case armnn::ActivationFunction::TanH:
62 return serializer::ActivationFunction::ActivationFunction_TanH;
63 case armnn::ActivationFunction::Linear:
64 return serializer::ActivationFunction::ActivationFunction_Linear;
65 case armnn::ActivationFunction::ReLu:
66 return serializer::ActivationFunction::ActivationFunction_ReLu;
67 case armnn::ActivationFunction::BoundedReLu:
68 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
69 case armnn::ActivationFunction::LeakyReLu:
70 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
71 case armnn::ActivationFunction::Abs:
72 return serializer::ActivationFunction::ActivationFunction_Abs;
73 case armnn::ActivationFunction::Sqrt:
74 return serializer::ActivationFunction::ActivationFunction_Sqrt;
75 case armnn::ActivationFunction::Square:
76 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000077 case armnn::ActivationFunction::Elu:
78 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000079 case armnn::ActivationFunction::HardSwish:
80 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Mike Kellyaf484012019-02-20 16:53:11 +000081 default:
82 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
83 }
84}
85
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010086serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
87{
88 switch (function)
89 {
90 case armnn::ArgMinMaxFunction::Max:
91 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
92 case armnn::ArgMinMaxFunction::Min:
93 default:
94 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
95 }
96}
97
Finn Williamsb454c5c2021-02-09 15:56:23 +000098uint32_t SerializerStrategy::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000099{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000100 if (m_guidMap.empty())
101 {
janeil013fec1ea2019-11-07 09:47:20 +0000102 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000103 }
104 else if (m_guidMap.find(guid) == m_guidMap.end())
105 {
janeil013fec1ea2019-11-07 09:47:20 +0000106 ++m_layerId;
107 m_guidMap.insert(std::make_pair(guid, m_layerId));
108
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000109 return m_layerId;
110 }
Saoirse Stewart30211042019-02-18 17:19:16 +0000111 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000112}
113
Mike Kelly8c1701a2019-02-11 17:01:27 +0000114// Build FlatBuffer for Input Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000115void SerializerStrategy::SerializeInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000116{
Jan Eilers8eb25602020-03-09 12:13:48 +0000117 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000118
Mike Kelly8c1701a2019-02-11 17:01:27 +0000119 // Create FlatBuffer BaseLayer
120 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
121
122 // Create FlatBuffer BindableBaseLayer
123 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
124 flatBufferInputBaseLayer,
125 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000126 // Push layer binding id to outputIds.
127 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000128
129 // Create the FlatBuffer InputLayer
130 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
131
132 // Add the AnyLayer to the FlatBufferLayers
133 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
134}
135
136// Build FlatBuffer for Output Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000137void SerializerStrategy::SerializeOutputLayer(const armnn::IConnectableLayer* layer,
138 LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000139{
Jan Eilers8eb25602020-03-09 12:13:48 +0000140 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000141
Mike Kelly8c1701a2019-02-11 17:01:27 +0000142 // Create FlatBuffer BaseLayer
143 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
144
145 // Create FlatBuffer BindableBaseLayer
146 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
147 flatBufferOutputBaseLayer,
148 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000149 // Push layer binding id to outputIds.
150 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000151
152 // Create the FlatBuffer OutputLayer
153 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
154 // Add the AnyLayer to the FlatBufferLayers
155 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
156}
157
Mike Kellyaf484012019-02-20 16:53:11 +0000158// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000159void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
160 const armnn::ActivationDescriptor& descriptor,
161 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000162{
Jan Eilers8eb25602020-03-09 12:13:48 +0000163 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000164
Mike Kellyaf484012019-02-20 16:53:11 +0000165 // Create FlatBuffer BaseLayer
166 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
167
168 // Create the FlatBuffer ActivationDescriptor
169 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
170 GetFlatBufferActivationFunction(descriptor.m_Function),
171 descriptor.m_A,
172 descriptor.m_B);
173
174 // Create the FlatBuffer ActivationLayer
175 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
176 flatBufferBaseLayer,
177 flatBufferDescriptor);
178
179 // Add the AnyLayer to the FlatBufferLayers
180 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
181}
182
Mike Kelly8c1701a2019-02-11 17:01:27 +0000183// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000184void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000185{
Jan Eilers8eb25602020-03-09 12:13:48 +0000186 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000187
Mike Kelly8c1701a2019-02-11 17:01:27 +0000188 // Create FlatBuffer BaseLayer
189 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
190
191 // Create the FlatBuffer AdditionLayer
192 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
193
194 // Add the AnyLayer to the FlatBufferLayers
195 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
196}
197
Nikhil Rajee391d52019-09-05 17:50:44 +0100198// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000199void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
200 const armnn::ArgMinMaxDescriptor& descriptor,
201 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100202{
Jan Eilers8eb25602020-03-09 12:13:48 +0000203 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000204
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100205 // Create FlatBuffer BaseLayer
206 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
207
208 // Create FlatBuffer Descriptor
209 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
210 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
211 descriptor.m_Axis);
212
213 // Create FlatBuffer ArgMinMaxLayer
214 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
215 flatBufferBaseLayer,
216 flatBufferDescriptor);
217
218 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100219}
220
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000221// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000222void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
223 const armnn::BatchToSpaceNdDescriptor& descriptor,
224 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000225{
Jan Eilers8eb25602020-03-09 12:13:48 +0000226 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000227
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000228 // Create FlatBuffer BaseLayer
229 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
230
231 std::vector<unsigned int> crops;
232 crops.reserve(descriptor.m_Crops.size() * 2);
233 for (auto& crop : descriptor.m_Crops)
234 {
235 crops.push_back(crop.first);
236 crops.push_back(crop.second);
237 }
238
239 auto flatBufferDescriptor =
240 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
241 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
242 m_flatBufferBuilder.CreateVector(crops),
243 GetFlatBufferDataLayout(descriptor.m_DataLayout));
244
245 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
246 flatBufferBaseLayer,
247 flatBufferDescriptor);
248
249 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
250}
251
Finn Williamsb454c5c2021-02-09 15:56:23 +0000252void SerializerStrategy::SerializeBatchNormalizationLayer(
253 const armnn::IConnectableLayer* layer,
254 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
255 const std::vector<armnn::ConstTensor>& constants,
256 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000257{
Jan Eilers8eb25602020-03-09 12:13:48 +0000258 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000259
Finn Williamsb454c5c2021-02-09 15:56:23 +0000260 const armnn::ConstTensor& mean = constants[0];
261 const armnn::ConstTensor& variance = constants[1];
262 const armnn::ConstTensor& beta = constants[2];
263 const armnn::ConstTensor& gamma = constants[3];
264
ruoyan018e7fa232019-02-28 15:09:07 +0000265 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
266 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
267 m_flatBufferBuilder,
268 batchNormDescriptor.m_Eps,
269 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
270
271 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
272 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
273 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
274 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
275 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
276 fbBatchNormalizationBaseLayer,
277 fbBatchNormalizationDescriptor,
278 fbMeanConstTensorInfo,
279 fbVarianceConstTensorInfo,
280 fbBetaConstTensorInfo,
281 fbGammaConstTensorInfo);
282
283 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
284}
285
mathad01b392e982021-04-07 12:07:30 +0100286void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
287 const char* name)
288{
289 IgnoreUnused(name);
290
291 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
292 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
293 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
294}
295
Simon Obute51f67772021-09-03 15:50:13 +0100296void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
297 const armnn::ChannelShuffleDescriptor& descriptor,
298 const char* name)
299{
300 IgnoreUnused(name);
301 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
302 descriptor.m_Axis,
303 descriptor.m_NumGroups);
304 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
305 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
306 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
307}
308
Finn Williamsb454c5c2021-02-09 15:56:23 +0000309void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100310 const armnn::ComparisonDescriptor& descriptor,
311 const char* name)
312{
Jan Eilers8eb25602020-03-09 12:13:48 +0000313 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000314
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100315 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
316 auto fbDescriptor = serializer::CreateComparisonDescriptor(
317 m_flatBufferBuilder,
318 GetFlatBufferComparisonOperation(descriptor.m_Operation));
319
320 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
321 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100322}
323
Conor Kennedy76277882019-02-26 08:29:54 +0000324// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000325void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
326 const std::vector<armnn::ConstTensor>& constants,
327 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000328{
Jan Eilers8eb25602020-03-09 12:13:48 +0000329 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000330
Finn Williamsb454c5c2021-02-09 15:56:23 +0000331 armnn::ConstTensor input = constants[0];
332
Conor Kennedy76277882019-02-26 08:29:54 +0000333 // Create FlatBuffer BaseLayer
334 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
335
336 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
337
338 // Create the FlatBuffer ConstantLayer
339 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
340 flatBufferConstantBaseLayer,
341 flatBufferConstTensorInfo);
342
343 // Add the AnyLayer to the FlatBufferLayers
344 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
345}
346
Mike Kellya0766c32019-02-19 17:22:07 +0000347// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000348void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
349 const armnn::Convolution2dDescriptor& descriptor,
350 const std::vector<armnn::ConstTensor>& constants,
351 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000352{
Jan Eilers8eb25602020-03-09 12:13:48 +0000353 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000354
Finn Williamsb454c5c2021-02-09 15:56:23 +0000355 const armnn::ConstTensor weights = constants[0];
356
Mike Kellya0766c32019-02-19 17:22:07 +0000357 // Create FlatBuffer BaseLayer
358 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
359
360 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
361 descriptor.m_PadLeft,
362 descriptor.m_PadRight,
363 descriptor.m_PadTop,
364 descriptor.m_PadBottom,
365 descriptor.m_StrideX,
366 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100367 descriptor.m_DilationX,
368 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000369 descriptor.m_BiasEnabled,
370 GetFlatBufferDataLayout(descriptor.m_DataLayout));
371 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
372 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
373
Finn Williamsb454c5c2021-02-09 15:56:23 +0000374 if (constants.size() > 1)
Mike Kellya0766c32019-02-19 17:22:07 +0000375 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000376 const armnn::ConstTensor biases = constants[1];
377 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Mike Kellya0766c32019-02-19 17:22:07 +0000378 }
379
380 // Create the FlatBuffer Convolution2dLayer
381 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
382 flatBufferBaseLayer,
383 flatBufferDescriptor,
384 flatBufferWeightsConstTensorInfo,
385 flatBufferBiasesConstTensorInfo);
386
387 // Add the AnyLayer to the FlatBufferLayers
388 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
389}
390
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100391// Build FlatBuffer for Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100392void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
393 const armnn::Convolution3dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100394 const char* name)
395{
396 IgnoreUnused(name);
397
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100398 // Create FlatBuffer BaseLayer
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100399 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100400
401 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
402 descriptor.m_PadLeft,
403 descriptor.m_PadRight,
404 descriptor.m_PadTop,
405 descriptor.m_PadBottom,
406 descriptor.m_PadFront,
407 descriptor.m_PadBack,
408 descriptor.m_StrideX,
409 descriptor.m_StrideY,
410 descriptor.m_StrideZ,
411 descriptor.m_DilationX,
412 descriptor.m_DilationY,
413 descriptor.m_DilationZ,
414 descriptor.m_BiasEnabled,
415 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100416
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100417 // Create the FlatBuffer Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100418 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
419 flatBufferBaseLayer,
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100420 flatBufferDescriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100421
422 // Add the AnyLayer to the FlatBufferLayers
423 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
424}
425
Finn Williamsb454c5c2021-02-09 15:56:23 +0000426void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100427 const armnn::DepthToSpaceDescriptor& descriptor,
428 const char* name)
429{
Jan Eilers8eb25602020-03-09 12:13:48 +0000430 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000431
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100432 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
433 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
434 descriptor.m_BlockSize,
435 GetFlatBufferDataLayout(descriptor.m_DataLayout));
436
437 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
438
439 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100440}
441
Finn Williamsb454c5c2021-02-09 15:56:23 +0000442void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
443 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
444 const std::vector<armnn::ConstTensor>& constants,
445 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000446{
Jan Eilers8eb25602020-03-09 12:13:48 +0000447 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000448
Finn Williamsb454c5c2021-02-09 15:56:23 +0000449 const armnn::ConstTensor& weights = constants[0];
450
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000451 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
452 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
453 descriptor.m_PadLeft,
454 descriptor.m_PadRight,
455 descriptor.m_PadTop,
456 descriptor.m_PadBottom,
457 descriptor.m_StrideX,
458 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100459 descriptor.m_DilationX,
460 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000461 descriptor.m_BiasEnabled,
462 GetFlatBufferDataLayout(descriptor.m_DataLayout));
463
464 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
465 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000466
467 if (constants.size() > 1)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000468 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000469 const armnn::ConstTensor& biases = constants[1];
470 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000471 }
472
473 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
474 fbBaseLayer,
475 fbDescriptor,
476 fbWeightsConstTensorInfo,
477 fbBiasesConstTensorInfo);
478
479 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
480}
481
Finn Williamsb454c5c2021-02-09 15:56:23 +0000482void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000483 const char* name)
484{
Jan Eilers8eb25602020-03-09 12:13:48 +0000485 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000486
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000487 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
488 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
489
490 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
491}
492
Finn Williamsb454c5c2021-02-09 15:56:23 +0000493void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
494 const armnn::DetectionPostProcessDescriptor& descriptor,
495 const std::vector<armnn::ConstTensor>& constants,
496 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000497{
Jan Eilers8eb25602020-03-09 12:13:48 +0000498 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000499
Finn Williamsb454c5c2021-02-09 15:56:23 +0000500 const armnn::ConstTensor& anchors = constants[0];
501
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000502 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
503 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
504 descriptor.m_MaxDetections,
505 descriptor.m_MaxClassesPerDetection,
506 descriptor.m_DetectionsPerClass,
507 descriptor.m_NmsScoreThreshold,
508 descriptor.m_NmsIouThreshold,
509 descriptor.m_NumClasses,
510 descriptor.m_UseRegularNms,
511 descriptor.m_ScaleX,
512 descriptor.m_ScaleY,
513 descriptor.m_ScaleW,
514 descriptor.m_ScaleH);
515
516 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
517
518 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
519 fbBaseLayer,
520 fbDescriptor,
521 fbAnchorsConstTensorInfo);
522
523 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
524}
525
Finn Williamsb454c5c2021-02-09 15:56:23 +0000526void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000527{
Jan Eilers8eb25602020-03-09 12:13:48 +0000528 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000529
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000530 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
531 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000532
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000533 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
534}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000535
Finn Williamsb454c5c2021-02-09 15:56:23 +0000536void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600537 const armnn::ElementwiseUnaryDescriptor& descriptor,
538 const char* name)
539{
Jan Eilers8eb25602020-03-09 12:13:48 +0000540 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600541
542 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
543 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
544 m_flatBufferBuilder,
545 GetFlatBufferUnaryOperation(descriptor.m_Operation));
546
547 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
548 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
549}
550
Finn Williamsb454c5c2021-02-09 15:56:23 +0000551void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100552 const armnn::FillDescriptor& fillDescriptor,
553 const char* name)
554{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100555 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100556
557 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
558
559 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
560
561 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
562
563 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100564}
565
Finn Williamsb454c5c2021-02-09 15:56:23 +0000566void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000567{
Jan Eilers8eb25602020-03-09 12:13:48 +0000568 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000569
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000570 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
571 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
572
573 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
574}
575
Finn Williamsb454c5c2021-02-09 15:56:23 +0000576void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100577 const armnn::GatherDescriptor& gatherDescriptor,
578 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000579{
Jan Eilers8eb25602020-03-09 12:13:48 +0000580 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000581
Teresa Charlin52664732020-06-29 16:27:03 +0100582 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
583 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000584 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100585 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000586
587 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
588}
589
Finn Williamsb454c5c2021-02-09 15:56:23 +0000590void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100591 const armnn::IConnectableLayer* layer,
592 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
593 const char* name)
594{
Jan Eilers8eb25602020-03-09 12:13:48 +0000595 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000596
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100597 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
598 m_flatBufferBuilder,
599 instanceNormalizationDescriptor.m_Gamma,
600 instanceNormalizationDescriptor.m_Beta,
601 instanceNormalizationDescriptor.m_Eps,
602 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
603
604 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
605 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
606
607 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100608}
609
Finn Williamsb454c5c2021-02-09 15:56:23 +0000610void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000611 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
612 const char* name)
613{
Jan Eilers8eb25602020-03-09 12:13:48 +0000614 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000615
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000616 // Create FlatBuffer BaseLayer
617 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
618
619 // Create the FlatBuffer L2Normalization Descriptor
620 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100621 m_flatBufferBuilder,
622 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
623 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000624
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100625 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000626 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
627
628 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
629}
630
Finn Williamsb454c5c2021-02-09 15:56:23 +0000631void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000632 const armnn::LogicalBinaryDescriptor& descriptor,
633 const char* name)
634{
635 IgnoreUnused(name);
636
637 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
638 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
639 m_flatBufferBuilder,
640 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
641
642 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
643 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
644}
645
Finn Williamsb454c5c2021-02-09 15:56:23 +0000646void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100647 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
648 const char* name)
649{
Jan Eilers8eb25602020-03-09 12:13:48 +0000650 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000651
Sadik Armagan26257852019-10-14 13:00:47 +0100652 // Create FlatBuffer BaseLayer
653 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
654
655 // Create the FlatBuffer LogSoftmaxDescriptor
656 auto flatBufferLogSoftmaxDesc =
657 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
658 logSoftmaxDescriptor.m_Beta,
659 logSoftmaxDescriptor.m_Axis);
660
661 // Create the FlatBuffer LogSoftmaxLayer
662 auto flatBufferLogSoftmaxLayer =
663 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
664 flatBufferLogSoftmaxBaseLayer,
665 flatBufferLogSoftmaxDesc);
666
667 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100668}
669
Finn Williamsb454c5c2021-02-09 15:56:23 +0000670void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
671 const armnn::LstmDescriptor& descriptor,
672 const std::vector<armnn::ConstTensor>& constants,
673 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000674{
Jan Eilers8eb25602020-03-09 12:13:48 +0000675 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000676
Jim Flynn11af3752019-03-19 17:22:29 +0000677 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
678
679 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
680 m_flatBufferBuilder,
681 descriptor.m_ActivationFunc,
682 descriptor.m_ClippingThresCell,
683 descriptor.m_ClippingThresProj,
684 descriptor.m_CifgEnabled,
685 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100686 descriptor.m_ProjectionEnabled,
687 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000688
Finn Williamsb454c5c2021-02-09 15:56:23 +0000689 // Index for constants vector
690 std::size_t i = 0;
691
692 // Get mandatory/basic input parameters
693 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
694 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
695 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
696 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
697 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
698 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
699 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
700 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
701 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
702
703
Jim Flynn11af3752019-03-19 17:22:29 +0000704
705 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
706 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
707 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
708 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
709 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
710 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
711 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
712 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
713 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100714 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
715 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
716 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
717 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000718
719 if (!descriptor.m_CifgEnabled)
720 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000721 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
722 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
723 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000724 }
725
726 if (descriptor.m_PeepholeEnabled)
727 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000728 if (!descriptor.m_CifgEnabled)
729 {
730 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
731 }
732 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
733 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
734 }
735
736 if (descriptor.m_ProjectionEnabled)
737 {
738 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
739 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000740 }
741
Jan Eilersf8c62972019-07-17 11:07:49 +0100742 if (descriptor.m_LayerNormEnabled)
743 {
744 if (!descriptor.m_CifgEnabled)
745 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000746 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100747 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000748 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
749 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
750 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100751 }
752
Jim Flynn11af3752019-03-19 17:22:29 +0000753 auto fbLstmParams = serializer::CreateLstmInputParams(
754 m_flatBufferBuilder,
755 inputToForgetWeights,
756 inputToCellWeights,
757 inputToOutputWeights,
758 recurrentToForgetWeights,
759 recurrentToCellWeights,
760 recurrentToOutputWeights,
761 forgetGateBias,
762 cellBias,
763 outputGateBias,
764 inputToInputWeights,
765 recurrentToInputWeights,
766 cellToInputWeights,
767 inputGateBias,
768 projectionWeights,
769 projectionBias,
770 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100771 cellToOutputWeights,
772 inputLayerNormWeights,
773 forgetLayerNormWeights,
774 cellLayerNormWeights,
775 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000776
777 auto fbLstmLayer = serializer::CreateLstmLayer(
778 m_flatBufferBuilder,
779 fbLstmBaseLayer,
780 fbLstmDescriptor,
781 fbLstmParams);
782
783 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
784}
785
Finn Williamsb454c5c2021-02-09 15:56:23 +0000786void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000787{
Jan Eilers8eb25602020-03-09 12:13:48 +0000788 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000789
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000790 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
791 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
792
793 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
794}
795
Finn Williamsb454c5c2021-02-09 15:56:23 +0000796void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000797 const armnn::MeanDescriptor& descriptor,
798 const char* name)
799{
Jan Eilers8eb25602020-03-09 12:13:48 +0000800 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000801
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000802 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
803 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
804 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
805 descriptor.m_KeepDims);
806
807 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
808 fbMeanBaseLayer,
809 fbMeanDescriptor);
810
811 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
812}
813
Finn Williamsb454c5c2021-02-09 15:56:23 +0000814void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000815{
Jan Eilers8eb25602020-03-09 12:13:48 +0000816 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000817
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000818 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
819 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
820
821 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
822}
823
Finn Williamsb454c5c2021-02-09 15:56:23 +0000824void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100825{
Jan Eilers8eb25602020-03-09 12:13:48 +0000826 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000827
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100828 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
829 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
830
831 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
832}
833
Finn Williamsb454c5c2021-02-09 15:56:23 +0000834void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100835 const armnn::ConcatDescriptor& concatDescriptor,
836 const char* name)
837{
Jan Eilers8eb25602020-03-09 12:13:48 +0000838 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000839
Jim Flynne242f2d2019-05-22 14:24:13 +0100840 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000841
842 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100843 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000844 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100845 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000846 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100847 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000848 {
849 origins.push_back(origin[d]);
850 }
851 auto view = m_flatBufferBuilder.CreateVector(origins);
852 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
853 views.push_back(uintVector);
854 }
855
Jim Flynne242f2d2019-05-22 14:24:13 +0100856 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
857 concatDescriptor.GetConcatAxis(),
858 concatDescriptor.GetNumViews(),
859 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000860 m_flatBufferBuilder.CreateVector(views));
861
Jim Flynne242f2d2019-05-22 14:24:13 +0100862 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
863 flatBufferConcatBaseLayer,
864 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000865
Jim Flynne242f2d2019-05-22 14:24:13 +0100866 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000867}
868
Finn Williamsb454c5c2021-02-09 15:56:23 +0000869void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000870{
Jan Eilers8eb25602020-03-09 12:13:48 +0000871 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000872
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000873 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
874 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
875 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000876
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000877 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000878}
879
Finn Williamsb454c5c2021-02-09 15:56:23 +0000880void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000881 const armnn::PadDescriptor& padDescriptor,
882 const char* name)
883{
Jan Eilers8eb25602020-03-09 12:13:48 +0000884 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000885
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000886 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
887
888 std::vector<unsigned int> padList;
889 for (auto& p: padDescriptor.m_PadList)
890 {
891 padList.push_back(p.first);
892 padList.push_back(p.second);
893 }
894
895 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100896 m_flatBufferBuilder.CreateVector(padList),
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +0100897 padDescriptor.m_PadValue,
898 GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000899
900 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
901 flatBufferBaseLayer,
902 flatBufferPadDesc);
903
904 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
905}
906
Finn Williamsb454c5c2021-02-09 15:56:23 +0000907void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000908 const armnn::PermuteDescriptor& permuteDescriptor,
909 const char* name)
910{
Jan Eilers8eb25602020-03-09 12:13:48 +0000911 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000912
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000913 // Create FlatBuffer BaseLayer
914 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
915
916 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100917 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000918 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100919 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000920 }
921
922 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
923 m_flatBufferBuilder.CreateVector(dimMappings));
924
925 // Create the FlatBuffer PermuteLayer
926 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
927 flatBufferPermuteBaseLayer,
928 flatBufferPermuteDesc);
929
930 // Add the AnyLayer to the FlatBufferLayers
931 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
932}
933
Finn Williams2605b232020-06-10 15:53:46 +0100934// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000935void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100936 const char* name)
937{
938 IgnoreUnused(name);
939 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
940 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
941
942 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
943}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000944
Finn Williamsb454c5c2021-02-09 15:56:23 +0000945void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
946 const armnn::ReduceDescriptor& reduceDescriptor,
947 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000948{
949 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
950 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000951 reduceDescriptor.m_KeepDims,
952 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
953 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
954 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
955 fbReduceBaseLayer,
956 fbDescriptor);
957
958 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
959}
960
Saoirse Stewart263829c2019-02-19 15:54:14 +0000961// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000962void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000963 const armnn::ReshapeDescriptor& reshapeDescriptor,
964 const char* name)
965{
Jan Eilers8eb25602020-03-09 12:13:48 +0000966 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000967
Saoirse Stewart263829c2019-02-19 15:54:14 +0000968 // Create FlatBuffer BaseLayer
969 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
970
971 std::vector<unsigned int> targetShape;
972 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
973 {
974 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
975 }
976
977 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
978 m_flatBufferBuilder.CreateVector(targetShape));
979
980 // Create the FlatBuffer ReshapeLayer
981 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
982 flatBufferReshapeDesc);
983
984 // Add the AnyLayer to the FlatBufferLayers
985 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
986}
987
Finn Williamsb454c5c2021-02-09 15:56:23 +0000988void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +0100989 const armnn::ResizeDescriptor& resizeDescriptor,
990 const char* name)
991{
Jan Eilers8eb25602020-03-09 12:13:48 +0000992 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000993
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100994 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
995
996 auto flatBufferDescriptor =
997 CreateResizeDescriptor(m_flatBufferBuilder,
998 resizeDescriptor.m_TargetHeight,
999 resizeDescriptor.m_TargetWidth,
1000 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001001 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1002 resizeDescriptor.m_AlignCorners,
1003 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001004
1005 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1006 flatBufferBaseLayer,
1007 flatBufferDescriptor);
1008
1009 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001010}
1011
Finn Williamsb454c5c2021-02-09 15:56:23 +00001012void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001013 const armnn::SliceDescriptor& sliceDescriptor,
1014 const char* name)
1015{
Jan Eilers8eb25602020-03-09 12:13:48 +00001016 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001017
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001018 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1019 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1020 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1021 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1022
1023 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1024
1025 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001026}
1027
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001028// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001029void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001030 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001031 const char* name)
1032{
Jan Eilers8eb25602020-03-09 12:13:48 +00001033 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001034
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001035 // Create FlatBuffer BaseLayer
1036 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1037
1038 // Create the FlatBuffer SoftmaxDescriptor
1039 auto flatBufferSoftmaxDesc =
1040 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
1041
1042 // Create the FlatBuffer SoftmaxLayer
1043 auto flatBufferSoftmaxLayer =
1044 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1045 flatBufferSoftmaxBaseLayer,
1046 flatBufferSoftmaxDesc);
1047
1048 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1049}
1050
Finn Williamsb454c5c2021-02-09 15:56:23 +00001051void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001052 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001053 const char* name)
1054{
Jan Eilers8eb25602020-03-09 12:13:48 +00001055 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001056
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001057 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1058 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1059 m_flatBufferBuilder,
1060 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1061 pooling2dDescriptor.m_PadLeft,
1062 pooling2dDescriptor.m_PadRight,
1063 pooling2dDescriptor.m_PadTop,
1064 pooling2dDescriptor.m_PadBottom,
1065 pooling2dDescriptor.m_PoolWidth,
1066 pooling2dDescriptor.m_PoolHeight,
1067 pooling2dDescriptor.m_StrideX,
1068 pooling2dDescriptor.m_StrideY,
1069 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1070 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1071 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1072
1073 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1074 fbPooling2dBaseLayer,
1075 fbPooling2dDescriptor);
1076
1077 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1078}
1079
Finn Williamsb454c5c2021-02-09 15:56:23 +00001080void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001081 const char* name)
1082{
Jan Eilers8eb25602020-03-09 12:13:48 +00001083 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001084
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001085 // Create FlatBuffer BaseLayer
1086 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1087
1088 // Create the FlatBuffer AdditionLayer
1089 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1090
1091 // Add the AnyLayer to the FlatBufferLayers
1092 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001093}
1094
Finn Williamsb454c5c2021-02-09 15:56:23 +00001095void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001096{
Jan Eilers8eb25602020-03-09 12:13:48 +00001097 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001098
Derek Lamberti87acb272019-03-27 16:51:31 +00001099 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1100 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1101 fbQuantizeBaseLayer);
1102 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1103}
1104
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001105// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001106void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1107 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001108 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001109{
1110 // Create FlatBuffer BaseLayer
1111 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1112
1113 // Create FlatBuffer FullyConnectedDescriptor
1114 auto flatBufferDescriptor =
1115 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1116 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001117 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1118 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001119
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001120 // Create FlatBuffer FullyConnectedLayer
1121 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1122 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001123 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001124
1125 // Add created FullyConnectedLayer to the FlatBufferLayers
1126 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1127}
1128
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001129// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001130void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001131 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1132 const char* name)
1133{
Jan Eilers8eb25602020-03-09 12:13:48 +00001134 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001135
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001136 // Create FlatBuffer BaseLayer
1137 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1138
1139 std::vector<unsigned int> padList;
1140 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1141 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1142 {
1143 padList.push_back(pad.first);
1144 padList.push_back(pad.second);
1145 }
1146
1147 auto flatBufferDescriptor =
1148 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1149 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1150 m_flatBufferBuilder.CreateVector(padList),
1151 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1152
1153 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1154 flatBufferBaseLayer,
1155 flatBufferDescriptor);
1156
1157 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1158}
1159
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001160// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001161void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001162 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1163 const char* name)
1164{
Jan Eilers8eb25602020-03-09 12:13:48 +00001165 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001166
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001167 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1168 auto flatBufferDescriptor =
1169 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1170 spaceToDepthDescriptor.m_BlockSize,
1171 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1172
1173 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1174 flatBufferBaseLayer,
1175 flatBufferDescriptor);
1176
1177 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001178}
1179
Jim Flynn18ce3382019-03-08 11:08:30 +00001180// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001181void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001182 const armnn::ViewsDescriptor& viewsDescriptor,
1183 const char* name)
1184{
Jan Eilers8eb25602020-03-09 12:13:48 +00001185 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001186
Jim Flynn18ce3382019-03-08 11:08:30 +00001187 // Create FlatBuffer ViewOrigins
1188 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1189 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1190
1191 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1192 {
1193 std::vector<uint32_t> viewOrigin;
1194 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1195
1196 // Copy vector
1197 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1198 {
1199 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1200 }
1201
1202 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1203 m_flatBufferBuilder.CreateVector(viewOrigin)));
1204 }
1205
1206 // Create FlatBuffer OriginsDescriptor
1207 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1208 viewsDescriptor.GetOrigins().GetConcatAxis(),
1209 viewsDescriptor.GetOrigins().GetNumViews(),
1210 viewsDescriptor.GetOrigins().GetNumDimensions(),
1211 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1212
1213 // Create FlatBuffer ViewOrigins
1214 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1215 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1216
1217 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1218 {
1219 std::vector<uint32_t> viewSize;
1220 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1221
1222 // Copy vector
1223 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1224 {
1225 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1226 }
1227
1228 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1229 m_flatBufferBuilder.CreateVector(viewSize)));
1230 }
1231
1232 // Create FlatBuffer ViewsDescriptor
1233 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1234 flatBufferOriginDescriptor,
1235 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1236
1237 // Create FlatBuffer BaseLayer
1238 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1239
1240 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1241 flatBufferBaseLayer,
1242 flatBufferViewsDescriptor);
1243
1244 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1245}
1246
Finn Williamsb454c5c2021-02-09 15:56:23 +00001247void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001248 const armnn::NormalizationDescriptor& descriptor,
1249 const char* name)
1250{
Jan Eilers8eb25602020-03-09 12:13:48 +00001251 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001252
Nina Drozd57728782019-02-27 10:53:27 +00001253 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1254
1255 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1256 m_flatBufferBuilder,
1257 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1258 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1259 descriptor.m_NormSize,
1260 descriptor.m_Alpha,
1261 descriptor.m_Beta,
1262 descriptor.m_K,
1263 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1264
1265 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1266 fbNormalizationBaseLayer,
1267 fbNormalizationDescriptor);
1268
1269 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1270}
1271
Keith Davis3ae3f972021-05-21 16:33:48 +01001272void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1273 const char* name)
1274{
1275 IgnoreUnused(name);
1276
1277 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1278 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1279
1280 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1281}
1282
Finn Williamsb454c5c2021-02-09 15:56:23 +00001283void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001284 const armnn::StackDescriptor& stackDescriptor,
1285 const char* name)
1286{
Jan Eilers8eb25602020-03-09 12:13:48 +00001287 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001288
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001289 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1290
1291 std::vector<unsigned int> inputShape;
1292 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1293 {
1294 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1295 }
1296
1297 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1298 stackDescriptor.m_Axis,
1299 stackDescriptor.m_NumInputs,
1300 m_flatBufferBuilder.CreateVector(inputShape));
1301
1302 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1303 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001304}
1305
Finn Williamsb454c5c2021-02-09 15:56:23 +00001306void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001307 const armnn::StandInDescriptor& standInDescriptor,
1308 const char *name)
1309{
Jan Eilers8eb25602020-03-09 12:13:48 +00001310 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001311
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001312 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1313 standInDescriptor.m_NumInputs,
1314 standInDescriptor.m_NumOutputs);
1315
1316 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1317 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1318
1319 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001320}
1321
Finn Williamsb454c5c2021-02-09 15:56:23 +00001322void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001323 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1324 const char* name)
1325{
Jan Eilers8eb25602020-03-09 12:13:48 +00001326 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001327
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001328 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1329
1330 auto flatBufferDescriptor =
1331 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1332 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1333 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1334 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1335 stridedSliceDescriptor.m_BeginMask,
1336 stridedSliceDescriptor.m_EndMask,
1337 stridedSliceDescriptor.m_ShrinkAxisMask,
1338 stridedSliceDescriptor.m_EllipsisMask,
1339 stridedSliceDescriptor.m_NewAxisMask,
1340 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1341
1342 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1343 flatBufferBaseLayer,
1344 flatBufferDescriptor);
1345
1346 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1347}
1348
Finn Williamsb454c5c2021-02-09 15:56:23 +00001349void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001350{
Jan Eilers8eb25602020-03-09 12:13:48 +00001351 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001352
Conor Kennedyda1f9752019-03-01 14:37:12 +00001353 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1354 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1355
1356 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1357}
1358
Finn Williamsb454c5c2021-02-09 15:56:23 +00001359void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001360{
Jan Eilers8eb25602020-03-09 12:13:48 +00001361 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001362
Sadik Armaganeff363d2019-04-05 15:25:46 +01001363 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1364 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1365
1366 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1367}
1368
Finn Williamsb454c5c2021-02-09 15:56:23 +00001369void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001370 const armnn::IConnectableLayer* layer,
1371 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001372 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001373 const char* name)
1374{
Jan Eilers8eb25602020-03-09 12:13:48 +00001375 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001376
Finn Williamsb454c5c2021-02-09 15:56:23 +00001377 const armnn::ConstTensor& weights = constants.at(0);
1378
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001379 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1380 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1381 descriptor.m_PadLeft,
1382 descriptor.m_PadRight,
1383 descriptor.m_PadTop,
1384 descriptor.m_PadBottom,
1385 descriptor.m_StrideX,
1386 descriptor.m_StrideY,
1387 descriptor.m_BiasEnabled,
1388 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1389
1390 // weights & biases
1391 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1392 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001393 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001394 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001395 const armnn::ConstTensor& biases = constants.at(1);
1396 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001397 }
1398
1399 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1400 fbBaseLayer,
1401 fbDescriptor,
1402 fbWeightsConstTensorInfo,
1403 fbBiasesConstTensorInfo);
1404
1405 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001406}
1407
Finn Williamsb454c5c2021-02-09 15:56:23 +00001408void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001409 const armnn::TransposeDescriptor& descriptor,
1410 const char* name)
1411{
Jan Eilers8eb25602020-03-09 12:13:48 +00001412 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001413
1414 // Create FlatBuffer BaseLayer
1415 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1416
1417 std::vector<unsigned int> dimMappings;
1418 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1419 {
1420 dimMappings.push_back(descriptor.m_DimMappings[i]);
1421 }
1422
1423 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1424 m_flatBufferBuilder.CreateVector(dimMappings));
1425
1426 // Create the FlatBuffer TransposeLayer
1427 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1428 flatBufferBaseLayer,
1429 flatBufferDesc);
1430
1431 // Add the AnyLayer to the FlatBufferLayers
1432 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1433}
1434
Finn Williamsb454c5c2021-02-09 15:56:23 +00001435void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1436 const armnn::QLstmDescriptor& descriptor,
1437 const std::vector<armnn::ConstTensor>& constants,
1438 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001439{
James Conroy8d333182020-05-13 10:27:58 +01001440 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001441
James Conroy8d333182020-05-13 10:27:58 +01001442 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1443
1444 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1445 m_flatBufferBuilder,
1446 descriptor.m_CifgEnabled,
1447 descriptor.m_PeepholeEnabled,
1448 descriptor.m_ProjectionEnabled,
1449 descriptor.m_LayerNormEnabled,
1450 descriptor.m_CellClip,
1451 descriptor.m_ProjectionClip,
1452 descriptor.m_InputIntermediateScale,
1453 descriptor.m_ForgetIntermediateScale,
1454 descriptor.m_CellIntermediateScale,
1455 descriptor.m_OutputIntermediateScale,
1456 descriptor.m_HiddenStateZeroPoint,
1457 descriptor.m_HiddenStateScale
1458 );
1459
Finn Williamsb454c5c2021-02-09 15:56:23 +00001460 // Index for constants vector
1461 std::size_t i = 0;
1462
James Conroy8d333182020-05-13 10:27:58 +01001463 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001464 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1465 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1466 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1467 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1468 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1469 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1470 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1471 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1472 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001473
1474 // CIFG
1475 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1476 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1477 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1478
1479 if (!descriptor.m_CifgEnabled)
1480 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001481 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1482 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1483 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001484 }
1485
1486 // Peephole
1487 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1488 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1489 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1490
1491 if (descriptor.m_PeepholeEnabled)
1492 {
1493 if (!descriptor.m_CifgEnabled)
1494 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001495 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001496 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001497 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1498 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1499 }
James Conroy8d333182020-05-13 10:27:58 +01001500
Finn Williamsb454c5c2021-02-09 15:56:23 +00001501 // Projection
1502 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1503 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1504
1505 if (descriptor.m_ProjectionEnabled)
1506 {
1507 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1508 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001509 }
1510
1511 // Layer norm
1512 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1513 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1514 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1515 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1516
1517 if (descriptor.m_LayerNormEnabled)
1518 {
1519 if (!descriptor.m_CifgEnabled)
1520 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001521 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001522 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001523 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1524 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1525 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001526 }
1527
1528 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1529 m_flatBufferBuilder,
1530 inputToForgetWeights,
1531 inputToCellWeights,
1532 inputToOutputWeights,
1533 recurrentToForgetWeights,
1534 recurrentToCellWeights,
1535 recurrentToOutputWeights,
1536 forgetGateBias,
1537 cellBias,
1538 outputGateBias,
1539 inputToInputWeights,
1540 recurrentToInputWeights,
1541 inputGateBias,
1542 projectionWeights,
1543 projectionBias,
1544 cellToInputWeights,
1545 cellToForgetWeights,
1546 cellToOutputWeights,
1547 inputLayerNormWeights,
1548 forgetLayerNormWeights,
1549 cellLayerNormWeights,
1550 outputLayerNormWeights);
1551
1552 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1553 m_flatBufferBuilder,
1554 fbQLstmBaseLayer,
1555 fbQLstmDescriptor,
1556 fbQLstmParams);
1557
1558 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001559}
1560
Finn Williamsb454c5c2021-02-09 15:56:23 +00001561void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1562 const std::vector<armnn::ConstTensor>& constants,
1563 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001564{
Jan Eilers8eb25602020-03-09 12:13:48 +00001565 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001566
Jan Eilers5b01a892019-07-23 09:47:43 +01001567 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1568
Finn Williamsb454c5c2021-02-09 15:56:23 +00001569 // index for constants vector
1570 size_t i = 0;
1571
Jan Eilers5b01a892019-07-23 09:47:43 +01001572 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001573 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1574 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1575 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1576 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001577
Finn Williamsb454c5c2021-02-09 15:56:23 +00001578 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1579 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1580 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1581 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001582
Finn Williamsb454c5c2021-02-09 15:56:23 +00001583 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1584 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1585 auto cellBias = CreateConstTensorInfo(constants[i++]);
1586 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001587
1588 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1589 m_flatBufferBuilder,
1590 inputToInputWeights,
1591 inputToForgetWeights,
1592 inputToCellWeights,
1593 inputToOutputWeights,
1594 recurrentToInputWeights,
1595 recurrentToForgetWeights,
1596 recurrentToCellWeights,
1597 recurrentToOutputWeights,
1598 inputGateBias,
1599 forgetGateBias,
1600 cellBias,
1601 outputGateBias);
1602
1603 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1604 m_flatBufferBuilder,
1605 fbQuantizedLstmBaseLayer,
1606 fbQuantizedLstmParams);
1607
1608 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001609}
1610
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001611void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1612 const armnn::IConnectableLayer* layer,
1613 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1614 const std::vector<armnn::ConstTensor>& constants,
1615 const char* name)
1616{
1617 IgnoreUnused(name);
1618
1619 auto fbUnidirectionalSequenceLstmBaseLayer =
1620 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1621
1622 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1623 m_flatBufferBuilder,
1624 descriptor.m_ActivationFunc,
1625 descriptor.m_ClippingThresCell,
1626 descriptor.m_ClippingThresProj,
1627 descriptor.m_CifgEnabled,
1628 descriptor.m_PeepholeEnabled,
1629 descriptor.m_ProjectionEnabled,
1630 descriptor.m_LayerNormEnabled,
1631 descriptor.m_TimeMajor);
1632
1633 // Index for constants vector
1634 std::size_t i = 0;
1635
1636 // Get mandatory/basic input parameters
1637 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1638 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1639 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1640 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1641 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1642 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1643 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1644 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1645 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1646
1647 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1648 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1649 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1650 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1651 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1652 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1653 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1654 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1655 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1656 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1657 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1658 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1659 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1660
1661 if (!descriptor.m_CifgEnabled)
1662 {
1663 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1664 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1665 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1666 }
1667
1668 if (descriptor.m_PeepholeEnabled)
1669 {
1670 if (!descriptor.m_CifgEnabled)
1671 {
1672 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1673 }
1674 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1675 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1676 }
1677
1678 if (descriptor.m_ProjectionEnabled)
1679 {
1680 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1681 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1682 }
1683
1684 if (descriptor.m_LayerNormEnabled)
1685 {
1686 if (!descriptor.m_CifgEnabled)
1687 {
1688 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1689 }
1690 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1691 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1692 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1693 }
1694
1695 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1696 m_flatBufferBuilder,
1697 inputToForgetWeights,
1698 inputToCellWeights,
1699 inputToOutputWeights,
1700 recurrentToForgetWeights,
1701 recurrentToCellWeights,
1702 recurrentToOutputWeights,
1703 forgetGateBias,
1704 cellBias,
1705 outputGateBias,
1706 inputToInputWeights,
1707 recurrentToInputWeights,
1708 cellToInputWeights,
1709 inputGateBias,
1710 projectionWeights,
1711 projectionBias,
1712 cellToForgetWeights,
1713 cellToOutputWeights,
1714 inputLayerNormWeights,
1715 forgetLayerNormWeights,
1716 cellLayerNormWeights,
1717 outputLayerNormWeights);
1718
1719 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1720 m_flatBufferBuilder,
1721 fbUnidirectionalSequenceLstmBaseLayer,
1722 fbUnidirectionalSequenceLstmDescriptor,
1723 fbUnidirectionalSequenceLstmParams);
1724
1725 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1726}
1727
Finn Williamsb454c5c2021-02-09 15:56:23 +00001728fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001729 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001730{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001731
Sadik Armagandb059fd2019-03-20 12:28:32 +00001732 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1733
Mike Kelly8c1701a2019-02-11 17:01:27 +00001734 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1735 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1736
1737 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001738 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001739 m_flatBufferBuilder.CreateString(layer->GetName()),
1740 layerType,
1741 m_flatBufferBuilder.CreateVector(inputSlots),
1742 m_flatBufferBuilder.CreateVector(outputSlots));
1743}
1744
Finn Williamsb454c5c2021-02-09 15:56:23 +00001745void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001746{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001747
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001748 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001749 m_serializedLayers.push_back(anyLayer);
1750}
1751
Mike Kellya0766c32019-02-19 17:22:07 +00001752template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001753flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001754{
1755 const T* buffer = reinterpret_cast<const T*>(memory);
1756 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1757 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1758 return fbVector;
1759}
1760
Finn Williamsb454c5c2021-02-09 15:56:23 +00001761flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001762{
Mike Kellya0766c32019-02-19 17:22:07 +00001763 // Get the dimensions
1764 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001765 std::vector<bool> specificity;
1766 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1767 // matches the size of dimensions.
1768 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1769 {
1770 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001771
1772 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1773 {
1774 shape.push_back(tensorInfo.GetShape()[dim]);
1775 }
1776 else
1777 {
1778 shape.push_back(0);
1779 }
Colm Donelan800b2812021-02-12 12:43:35 +00001780 }
1781
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001782 if (tensorInfo.HasPerAxisQuantization())
1783 {
1784 // Create FlatBuffer TensorInfo
1785 auto flatBufferTensorInfo =
1786 serializer::CreateTensorInfo(m_flatBufferBuilder,
1787 m_flatBufferBuilder.CreateVector(shape),
1788 GetFlatBufferDataType(tensorInfo.GetDataType()),
1789 tensorInfo.GetQuantizationScales()[0],
1790 tensorInfo.GetQuantizationOffset(),
1791 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001792 tensorInfo.GetQuantizationDim().value(),
1793 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001794 (tensorInfo.GetShape().GetDimensionality()),
1795 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001796 return flatBufferTensorInfo;
1797 }
1798
Mike Kellya0766c32019-02-19 17:22:07 +00001799 // Create FlatBuffer TensorInfo
1800 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1801 m_flatBufferBuilder.CreateVector(shape),
1802 GetFlatBufferDataType(tensorInfo.GetDataType()),
1803 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001804 tensorInfo.GetQuantizationOffset(),
1805 0,
1806 0,
1807 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001808 (tensorInfo.GetShape().GetDimensionality()),
1809 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001810 return flatBufferTensorInfo;
1811}
1812
1813flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001814 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001815{
1816 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1817
Mike Kellya0766c32019-02-19 17:22:07 +00001818 flatbuffers::Offset<void> fbPayload;
1819
1820 switch (tensorInfo.GetDataType())
1821 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001822 case armnn::DataType::Signed64:
1823 {
1824 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1825 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1826 m_flatBufferBuilder,
1827 fbVector);
1828 fbPayload = flatBuffersData.o;
1829 break;
1830 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001831 case armnn::DataType::Float32:
1832 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001833 {
1834 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1835 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1836 m_flatBufferBuilder,
1837 fbVector);
1838 fbPayload = flatBuffersData.o;
1839 break;
1840 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001841 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001842 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001843 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001844 {
1845 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1846 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1847 m_flatBufferBuilder,
1848 fbVector);
1849 fbPayload = flatBuffersData.o;
1850 break;
1851 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001852 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001853 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001854 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001855 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001856 default:
1857 {
1858 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1859 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1860 m_flatBufferBuilder,
1861 fbVector);
1862 fbPayload = flatBuffersData.o;
1863 }
1864 }
1865 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1866 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001867 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001868 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1869 fbPayload);
1870 return flatBufferConstTensor;
1871}
1872
Finn Williamsb454c5c2021-02-09 15:56:23 +00001873flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001874{
1875 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1876 serializer::CreateFeatureCompatibilityVersions(
1877 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001878 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001879 1, // Weights layout scheme version
1880 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001881 );
1882 return versionsTable;
1883}
1884
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001885std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001886 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001887{
Mike Kellya0766c32019-02-19 17:22:07 +00001888 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001889
1890 // Get the InputSlots
1891 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1892 {
1893 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1894
1895 // Get the Connection for the InputSlot
1896 const IOutputSlot* connection = inputSlot.GetConnection();
1897
1898 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001899 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1900 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001901 // Create FlatBuffer InputSlot
1902 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1903 }
1904 return inputSlots;
1905}
1906
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001907std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001908 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001909{
1910 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1911
1912 // Get the OutputSlots
1913 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1914 {
1915 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001916 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001917
Mike Kelly8c1701a2019-02-11 17:01:27 +00001918 // Create FlatBuffer Outputslot
1919 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1920 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001921 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001922 }
1923 return outputSlots;
1924}
1925
Finn Williamsb454c5c2021-02-09 15:56:23 +00001926void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1927 const BaseDescriptor& descriptor,
1928 const std::vector<armnn::ConstTensor>& constants,
1929 const char* name,
1930 const armnn::LayerBindingId id)
1931{
1932 IgnoreUnused(constants);
1933
1934 switch (layer->GetType())
1935 {
1936 case armnn::LayerType::Activation :
1937 {
1938 const armnn::ActivationDescriptor& layerDescriptor =
1939 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1940 SerializeActivationLayer(layer, layerDescriptor, name);
1941 break;
1942 }
1943 case armnn::LayerType::Addition :
1944 {
1945 SerializeAdditionLayer(layer, name);
1946 break;
1947 }
1948 case armnn::LayerType::ArgMinMax :
1949 {
1950 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1951 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1952 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1953 break;
1954 }
1955 case armnn::LayerType::BatchNormalization :
1956 {
1957 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1958 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1959 SerializeBatchNormalizationLayer(layer,
1960 layerDescriptor,
1961 constants,
1962 name);
1963 break;
1964 }
1965 case armnn::LayerType::BatchToSpaceNd :
1966 {
1967 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
1968 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
1969 SerializeBatchToSpaceNdLayer(layer,
1970 layerDescriptor,
1971 name);
1972 break;
1973 }
mathad01b392e982021-04-07 12:07:30 +01001974 case armnn::LayerType::Cast :
1975 {
1976 SerializeCastLayer(layer, name);
1977 break;
1978 }
Simon Obute51f67772021-09-03 15:50:13 +01001979 case armnn::LayerType::ChannelShuffle :
1980 {
1981 const armnn::ChannelShuffleDescriptor& layerDescriptor =
1982 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
1983 SerializeChannelShuffleLayer(layer,
1984 layerDescriptor,
1985 name);
1986 break;
1987 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001988 case armnn::LayerType::Comparison :
1989 {
1990 const armnn::ComparisonDescriptor& layerDescriptor =
1991 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
1992 SerializeComparisonLayer(layer,
1993 layerDescriptor,
1994 name);
1995 break;
1996 }
1997 case armnn::LayerType::Concat :
1998 {
1999 const armnn::ConcatDescriptor& layerDescriptor =
2000 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2001 SerializeConcatLayer(layer,
2002 layerDescriptor,
2003 name);
2004 break;
2005 }
2006 case armnn::LayerType::Constant :
2007 {
2008 SerializeConstantLayer(layer,
2009 constants,
2010 name);
2011 break;
2012 }
2013 case armnn::LayerType::Convolution2d :
2014 {
2015 const armnn::Convolution2dDescriptor& layerDescriptor =
2016 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2017 SerializeConvolution2dLayer(layer,
2018 layerDescriptor,
2019 constants,
2020 name);
2021 break;
2022 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002023 case armnn::LayerType::Convolution3d :
2024 {
2025 const armnn::Convolution3dDescriptor& layerDescriptor =
2026 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2027 SerializeConvolution3dLayer(layer,
2028 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002029 name);
2030 break;
2031 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002032 case armnn::LayerType::DepthToSpace :
2033 {
2034 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2035 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2036 SerializeDepthToSpaceLayer(layer,
2037 layerDescriptor,
2038 name);
2039 break;
2040 }
2041 case armnn::LayerType::DepthwiseConvolution2d :
2042 {
2043 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2044 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2045 SerializeDepthwiseConvolution2dLayer(layer,
2046 layerDescriptor,
2047 constants,
2048 name);
2049 break;
2050 }
2051 case armnn::LayerType::Dequantize :
2052 {
2053 SerializeDequantizeLayer(layer,
2054 name);
2055 break;
2056 }
2057 case armnn::LayerType::DetectionPostProcess :
2058 {
2059 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2060 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2061 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2062 break;
2063 }
2064 case armnn::LayerType::Division :
2065 {
2066 SerializeDivisionLayer(layer, name);
2067 break;
2068 }
2069 case armnn::LayerType::ElementwiseUnary :
2070 {
2071 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2072 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2073 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2074 break;
2075 }
2076 case armnn::LayerType::Fill :
2077 {
2078 const armnn::FillDescriptor& layerDescriptor =
2079 static_cast<const armnn::FillDescriptor&>(descriptor);
2080 SerializeFillLayer(layer, layerDescriptor, name);
2081 break;
2082 }
2083 case armnn::LayerType::Floor :
2084 {
2085 SerializeFloorLayer(layer, name);
2086 break;
2087 }
2088 case armnn::LayerType::FullyConnected :
2089 {
2090 const armnn::FullyConnectedDescriptor& layerDescriptor =
2091 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002092 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002093 break;
2094 }
2095 case armnn::LayerType::Gather :
2096 {
2097 const armnn::GatherDescriptor& layerDescriptor =
2098 static_cast<const armnn::GatherDescriptor&>(descriptor);
2099 SerializeGatherLayer(layer, layerDescriptor, name);
2100 break;
2101 }
2102 case armnn::LayerType::Input:
2103 {
2104 SerializeInputLayer(layer, id, name);
2105 break;
2106 }
2107 case armnn::LayerType::InstanceNormalization :
2108 {
2109 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2110 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2111 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2112 break;
2113 }
2114 case armnn::LayerType::L2Normalization :
2115 {
2116 const armnn::L2NormalizationDescriptor& layerDescriptor =
2117 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2118 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2119 break;
2120 }
2121 case armnn::LayerType::LogicalBinary :
2122 {
2123 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2124 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2125 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2126 break;
2127 }
2128 case armnn::LayerType::LogSoftmax :
2129 {
2130 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2131 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2132 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2133 break;
2134 }
2135 case armnn::LayerType::Lstm :
2136 {
2137 const armnn::LstmDescriptor& layerDescriptor =
2138 static_cast<const armnn::LstmDescriptor&>(descriptor);
2139 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2140 break;
2141 }
2142 case armnn::LayerType::QLstm :
2143 {
2144 const armnn::QLstmDescriptor& layerDescriptor =
2145 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2146 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2147 break;
2148 }
2149 case armnn::LayerType::Maximum :
2150 {
2151 SerializeMaximumLayer(layer, name);
2152 break;
2153 }
2154 case armnn::LayerType::Mean :
2155 {
2156 const armnn::MeanDescriptor& layerDescriptor =
2157 static_cast<const armnn::MeanDescriptor&>(descriptor);
2158 SerializeMeanLayer(layer, layerDescriptor, name);
2159 break;
2160 }
2161 case armnn::LayerType::Merge :
2162 {
2163 SerializeMergeLayer(layer, name);
2164 break;
2165 }
2166 case armnn::LayerType::Minimum :
2167 {
2168 SerializeMinimumLayer(layer, name);
2169 break;
2170 }
2171 case armnn::LayerType::Multiplication :
2172 {
2173 SerializeMultiplicationLayer(layer, name);
2174 break;
2175 }
2176 case armnn::LayerType::Normalization :
2177 {
2178 const armnn::NormalizationDescriptor& layerDescriptor =
2179 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2180 SerializeNormalizationLayer(layer, layerDescriptor, name);
2181 break;
2182 }
2183 case armnn::LayerType::Output:
2184 {
2185 SerializeOutputLayer(layer, id, name);
2186 break;
2187 }
2188 case armnn::LayerType::Pad :
2189 {
2190 const armnn::PadDescriptor& layerDescriptor =
2191 static_cast<const armnn::PadDescriptor&>(descriptor);
2192 SerializePadLayer(layer, layerDescriptor, name);
2193 break;
2194 }
2195 case armnn::LayerType::Permute :
2196 {
2197 const armnn::PermuteDescriptor& layerDescriptor =
2198 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2199 SerializePermuteLayer(layer, layerDescriptor, name);
2200 break;
2201 }
2202 case armnn::LayerType::Pooling2d :
2203 {
2204 const armnn::Pooling2dDescriptor& layerDescriptor =
2205 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2206 SerializePooling2dLayer(layer, layerDescriptor, name);
2207 break;
2208 }
2209 case armnn::LayerType::Prelu :
2210 {
2211 SerializePreluLayer(layer, name);
2212 break;
2213 }
2214 case armnn::LayerType::Quantize :
2215 {
2216 SerializeQuantizeLayer(layer, name);
2217 break;
2218 }
2219 case armnn::LayerType::QuantizedLstm:
2220 SerializeQuantizedLstmLayer(layer, constants, name);
2221 break;
2222 case armnn::LayerType::Reshape:
2223 {
2224 const armnn::ReshapeDescriptor &layerDescriptor =
2225 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2226 SerializeReshapeLayer(layer, layerDescriptor, name);
2227 break;
2228 }
2229 case armnn::LayerType::Rank:
2230 {
2231 SerializeRankLayer(layer, name);
2232 break;
2233 }
2234 case armnn::LayerType::Reduce:
2235 {
2236 const armnn::ReduceDescriptor& layerDescriptor =
2237 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2238 SerializeReduceLayer(layer, layerDescriptor, name);
2239 break;
2240 }
2241 case armnn::LayerType::Resize:
2242 {
2243 const armnn::ResizeDescriptor& layerDescriptor =
2244 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2245 SerializeResizeLayer(layer, layerDescriptor, name);
2246 break;
2247 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002248 case armnn::LayerType::Shape:
2249 {
2250 SerializeShapeLayer(layer, name);
2251 break;
2252 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002253 case armnn::LayerType::Slice:
2254 {
2255 const armnn::SliceDescriptor& layerDescriptor =
2256 static_cast<const armnn::SliceDescriptor&>(descriptor);
2257 SerializeSliceLayer(layer, layerDescriptor, name);
2258 break;
2259 }
2260 case armnn::LayerType::Softmax:
2261 {
2262 const armnn::SoftmaxDescriptor& layerDescriptor =
2263 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2264 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2265 break;
2266 }
2267 case armnn::LayerType::SpaceToBatchNd:
2268 {
2269 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2270 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2271 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2272 break;
2273 }
2274 case armnn::LayerType::SpaceToDepth:
2275 {
2276 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2277 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2278 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2279 break;
2280 }
2281 case armnn::LayerType::Splitter:
2282 {
2283 const armnn::SplitterDescriptor& layerDescriptor =
2284 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2285 SerializeSplitterLayer(layer, layerDescriptor, name);
2286 break;
2287 }
2288 case armnn::LayerType::Stack:
2289 {
2290 const armnn::StackDescriptor& layerDescriptor =
2291 static_cast<const armnn::StackDescriptor&>(descriptor);
2292 SerializeStackLayer(layer, layerDescriptor, name);
2293 break;
2294 }
2295 case armnn::LayerType::StandIn:
2296 {
2297 const armnn::StandInDescriptor& layerDescriptor =
2298 static_cast<const armnn::StandInDescriptor&>(descriptor);
2299 SerializeStandInLayer(layer, layerDescriptor, name);
2300 break;
2301 }
2302 case armnn::LayerType::StridedSlice:
2303 {
2304 const armnn::StridedSliceDescriptor& layerDescriptor =
2305 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2306 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2307 break;
2308 }
2309 case armnn::LayerType::Subtraction:
2310 {
2311 SerializeSubtractionLayer(layer, name);
2312 break;
2313 }
2314 case armnn::LayerType::Switch:
2315 {
2316 SerializeSwitchLayer(layer, name);
2317 break;
2318 }
2319 case armnn::LayerType::Transpose:
2320 {
2321 const armnn::TransposeDescriptor& layerDescriptor =
2322 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2323 SerializeTransposeLayer(layer, layerDescriptor, name);
2324 break;
2325 }
2326 case armnn::LayerType::TransposeConvolution2d:
2327 {
2328 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2329 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2330 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2331 break;
2332 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002333 case armnn::LayerType::UnidirectionalSequenceLstm :
2334 {
2335 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2336 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2337 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2338 break;
2339 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002340 default:
2341 {
2342 throw InvalidArgumentException(
2343 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2344 layer->GetName(),
2345 id));
2346 }
2347 }
2348}
2349
Finn Williams85d36712021-01-26 22:30:06 +00002350void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002351{
2352 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002353 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2354 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002355
2356 // Create FlatBuffer SerializedGraph
2357 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002358 fbBuilder,
2359 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2360 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2361 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2362 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002363
2364 // Serialize the graph
2365 fbBuilder.Finish(serializedGraph);
2366}
2367
Finn Williamsb454c5c2021-02-09 15:56:23 +00002368
Finn Williams85d36712021-01-26 22:30:06 +00002369bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002370{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002371 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002372
Matthew Sloyan0663d662020-09-14 11:47:26 +01002373 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002374 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002375 return !stream.bad();
2376}
2377
Finn Williams2605b232020-06-10 15:53:46 +01002378} // namespace armnnSerializer