blob: efaf9f81cde984835367bffe5bbef8974e502afc [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
Finn Williamsb454c5c2021-02-09 15:56:23 +0000158void SerializerStrategy::SerializeAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
Kevin May868eb142019-09-04 17:29:31 +0100159{
Jan Eilers8eb25602020-03-09 12:13:48 +0000160 IgnoreUnused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100161 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
162 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
163
164 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100165}
166
Mike Kellyaf484012019-02-20 16:53:11 +0000167// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000168void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
169 const armnn::ActivationDescriptor& descriptor,
170 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000171{
Jan Eilers8eb25602020-03-09 12:13:48 +0000172 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000173
Mike Kellyaf484012019-02-20 16:53:11 +0000174 // Create FlatBuffer BaseLayer
175 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
176
177 // Create the FlatBuffer ActivationDescriptor
178 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
179 GetFlatBufferActivationFunction(descriptor.m_Function),
180 descriptor.m_A,
181 descriptor.m_B);
182
183 // Create the FlatBuffer ActivationLayer
184 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
185 flatBufferBaseLayer,
186 flatBufferDescriptor);
187
188 // Add the AnyLayer to the FlatBufferLayers
189 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
190}
191
Mike Kelly8c1701a2019-02-11 17:01:27 +0000192// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000193void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000194{
Jan Eilers8eb25602020-03-09 12:13:48 +0000195 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000196
Mike Kelly8c1701a2019-02-11 17:01:27 +0000197 // Create FlatBuffer BaseLayer
198 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
199
200 // Create the FlatBuffer AdditionLayer
201 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
202
203 // Add the AnyLayer to the FlatBufferLayers
204 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
205}
206
Nikhil Rajee391d52019-09-05 17:50:44 +0100207// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000208void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
209 const armnn::ArgMinMaxDescriptor& descriptor,
210 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100211{
Jan Eilers8eb25602020-03-09 12:13:48 +0000212 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000213
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100214 // Create FlatBuffer BaseLayer
215 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
216
217 // Create FlatBuffer Descriptor
218 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
219 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
220 descriptor.m_Axis);
221
222 // Create FlatBuffer ArgMinMaxLayer
223 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
224 flatBufferBaseLayer,
225 flatBufferDescriptor);
226
227 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100228}
229
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000230// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000231void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
232 const armnn::BatchToSpaceNdDescriptor& descriptor,
233 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000234{
Jan Eilers8eb25602020-03-09 12:13:48 +0000235 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000236
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000237 // Create FlatBuffer BaseLayer
238 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
239
240 std::vector<unsigned int> crops;
241 crops.reserve(descriptor.m_Crops.size() * 2);
242 for (auto& crop : descriptor.m_Crops)
243 {
244 crops.push_back(crop.first);
245 crops.push_back(crop.second);
246 }
247
248 auto flatBufferDescriptor =
249 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
250 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
251 m_flatBufferBuilder.CreateVector(crops),
252 GetFlatBufferDataLayout(descriptor.m_DataLayout));
253
254 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
255 flatBufferBaseLayer,
256 flatBufferDescriptor);
257
258 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
259}
260
Finn Williamsb454c5c2021-02-09 15:56:23 +0000261void SerializerStrategy::SerializeBatchNormalizationLayer(
262 const armnn::IConnectableLayer* layer,
263 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
264 const std::vector<armnn::ConstTensor>& constants,
265 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000266{
Jan Eilers8eb25602020-03-09 12:13:48 +0000267 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000268
Finn Williamsb454c5c2021-02-09 15:56:23 +0000269 const armnn::ConstTensor& mean = constants[0];
270 const armnn::ConstTensor& variance = constants[1];
271 const armnn::ConstTensor& beta = constants[2];
272 const armnn::ConstTensor& gamma = constants[3];
273
ruoyan018e7fa232019-02-28 15:09:07 +0000274 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
275 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
276 m_flatBufferBuilder,
277 batchNormDescriptor.m_Eps,
278 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
279
280 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
281 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
282 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
283 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
284 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
285 fbBatchNormalizationBaseLayer,
286 fbBatchNormalizationDescriptor,
287 fbMeanConstTensorInfo,
288 fbVarianceConstTensorInfo,
289 fbBetaConstTensorInfo,
290 fbGammaConstTensorInfo);
291
292 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
293}
294
mathad01b392e982021-04-07 12:07:30 +0100295void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
296 const char* name)
297{
298 IgnoreUnused(name);
299
300 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
301 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
302 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
303}
304
Simon Obute51f67772021-09-03 15:50:13 +0100305void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
306 const armnn::ChannelShuffleDescriptor& descriptor,
307 const char* name)
308{
309 IgnoreUnused(name);
310 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
311 descriptor.m_Axis,
312 descriptor.m_NumGroups);
313 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
314 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
315 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
316}
317
Finn Williamsb454c5c2021-02-09 15:56:23 +0000318void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100319 const armnn::ComparisonDescriptor& descriptor,
320 const char* name)
321{
Jan Eilers8eb25602020-03-09 12:13:48 +0000322 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000323
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100324 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
325 auto fbDescriptor = serializer::CreateComparisonDescriptor(
326 m_flatBufferBuilder,
327 GetFlatBufferComparisonOperation(descriptor.m_Operation));
328
329 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
330 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100331}
332
Conor Kennedy76277882019-02-26 08:29:54 +0000333// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000334void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
335 const std::vector<armnn::ConstTensor>& constants,
336 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000337{
Jan Eilers8eb25602020-03-09 12:13:48 +0000338 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000339
Finn Williamsb454c5c2021-02-09 15:56:23 +0000340 armnn::ConstTensor input = constants[0];
341
Conor Kennedy76277882019-02-26 08:29:54 +0000342 // Create FlatBuffer BaseLayer
343 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
344
345 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
346
347 // Create the FlatBuffer ConstantLayer
348 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
349 flatBufferConstantBaseLayer,
350 flatBufferConstTensorInfo);
351
352 // Add the AnyLayer to the FlatBufferLayers
353 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
354}
355
Mike Kellya0766c32019-02-19 17:22:07 +0000356// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000357void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
358 const armnn::Convolution2dDescriptor& descriptor,
359 const std::vector<armnn::ConstTensor>& constants,
360 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000361{
Jan Eilers8eb25602020-03-09 12:13:48 +0000362 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000363
Finn Williamsb454c5c2021-02-09 15:56:23 +0000364 const armnn::ConstTensor weights = constants[0];
365
Mike Kellya0766c32019-02-19 17:22:07 +0000366 // Create FlatBuffer BaseLayer
367 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
368
369 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
370 descriptor.m_PadLeft,
371 descriptor.m_PadRight,
372 descriptor.m_PadTop,
373 descriptor.m_PadBottom,
374 descriptor.m_StrideX,
375 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100376 descriptor.m_DilationX,
377 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000378 descriptor.m_BiasEnabled,
379 GetFlatBufferDataLayout(descriptor.m_DataLayout));
380 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
381 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
382
Finn Williamsb454c5c2021-02-09 15:56:23 +0000383 if (constants.size() > 1)
Mike Kellya0766c32019-02-19 17:22:07 +0000384 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000385 const armnn::ConstTensor biases = constants[1];
386 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Mike Kellya0766c32019-02-19 17:22:07 +0000387 }
388
389 // Create the FlatBuffer Convolution2dLayer
390 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
391 flatBufferBaseLayer,
392 flatBufferDescriptor,
393 flatBufferWeightsConstTensorInfo,
394 flatBufferBiasesConstTensorInfo);
395
396 // Add the AnyLayer to the FlatBufferLayers
397 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
398}
399
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100400// Build FlatBuffer for Convolution2dLayer
401void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
402 const armnn::Convolution3dDescriptor& descriptor,
403 const std::vector<armnn::ConstTensor>& constants,
404 const char* name)
405{
406 IgnoreUnused(name);
407
408 const armnn::ConstTensor weights = constants[0];
409
410 // Create FlatBuffer BaseLayer
411 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
412
413 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
414 descriptor.m_PadLeft,
415 descriptor.m_PadRight,
416 descriptor.m_PadTop,
417 descriptor.m_PadBottom,
418 descriptor.m_PadFront,
419 descriptor.m_PadBack,
420 descriptor.m_StrideX,
421 descriptor.m_StrideY,
422 descriptor.m_StrideZ,
423 descriptor.m_DilationX,
424 descriptor.m_DilationY,
425 descriptor.m_DilationZ,
426 descriptor.m_BiasEnabled,
427 GetFlatBufferDataLayout(descriptor.m_DataLayout));
428 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
429 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
430
431 if (constants.size() > 1)
432 {
433 const armnn::ConstTensor biases = constants[1];
434 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases);
435 }
436
437 // Create the FlatBuffer Convolution2dLayer
438 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
439 flatBufferBaseLayer,
440 flatBufferDescriptor,
441 flatBufferWeightsConstTensorInfo,
442 flatBufferBiasesConstTensorInfo);
443
444 // Add the AnyLayer to the FlatBufferLayers
445 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
446}
447
Finn Williamsb454c5c2021-02-09 15:56:23 +0000448void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100449 const armnn::DepthToSpaceDescriptor& descriptor,
450 const char* name)
451{
Jan Eilers8eb25602020-03-09 12:13:48 +0000452 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000453
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100454 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
455 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
456 descriptor.m_BlockSize,
457 GetFlatBufferDataLayout(descriptor.m_DataLayout));
458
459 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
460
461 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100462}
463
Finn Williamsb454c5c2021-02-09 15:56:23 +0000464void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
465 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
466 const std::vector<armnn::ConstTensor>& constants,
467 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000468{
Jan Eilers8eb25602020-03-09 12:13:48 +0000469 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000470
Finn Williamsb454c5c2021-02-09 15:56:23 +0000471 const armnn::ConstTensor& weights = constants[0];
472
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000473 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
474 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
475 descriptor.m_PadLeft,
476 descriptor.m_PadRight,
477 descriptor.m_PadTop,
478 descriptor.m_PadBottom,
479 descriptor.m_StrideX,
480 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100481 descriptor.m_DilationX,
482 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000483 descriptor.m_BiasEnabled,
484 GetFlatBufferDataLayout(descriptor.m_DataLayout));
485
486 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
487 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000488
489 if (constants.size() > 1)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000490 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000491 const armnn::ConstTensor& biases = constants[1];
492 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000493 }
494
495 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
496 fbBaseLayer,
497 fbDescriptor,
498 fbWeightsConstTensorInfo,
499 fbBiasesConstTensorInfo);
500
501 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
502}
503
Finn Williamsb454c5c2021-02-09 15:56:23 +0000504void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000505 const char* name)
506{
Jan Eilers8eb25602020-03-09 12:13:48 +0000507 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000508
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000509 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
510 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
511
512 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
513}
514
Finn Williamsb454c5c2021-02-09 15:56:23 +0000515void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
516 const armnn::DetectionPostProcessDescriptor& descriptor,
517 const std::vector<armnn::ConstTensor>& constants,
518 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000519{
Jan Eilers8eb25602020-03-09 12:13:48 +0000520 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000521
Finn Williamsb454c5c2021-02-09 15:56:23 +0000522 const armnn::ConstTensor& anchors = constants[0];
523
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000524 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
525 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
526 descriptor.m_MaxDetections,
527 descriptor.m_MaxClassesPerDetection,
528 descriptor.m_DetectionsPerClass,
529 descriptor.m_NmsScoreThreshold,
530 descriptor.m_NmsIouThreshold,
531 descriptor.m_NumClasses,
532 descriptor.m_UseRegularNms,
533 descriptor.m_ScaleX,
534 descriptor.m_ScaleY,
535 descriptor.m_ScaleW,
536 descriptor.m_ScaleH);
537
538 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
539
540 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
541 fbBaseLayer,
542 fbDescriptor,
543 fbAnchorsConstTensorInfo);
544
545 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
546}
547
Finn Williamsb454c5c2021-02-09 15:56:23 +0000548void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000549{
Jan Eilers8eb25602020-03-09 12:13:48 +0000550 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000551
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000552 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
553 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000554
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000555 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
556}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000557
Finn Williamsb454c5c2021-02-09 15:56:23 +0000558void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600559 const armnn::ElementwiseUnaryDescriptor& descriptor,
560 const char* name)
561{
Jan Eilers8eb25602020-03-09 12:13:48 +0000562 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600563
564 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
565 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
566 m_flatBufferBuilder,
567 GetFlatBufferUnaryOperation(descriptor.m_Operation));
568
569 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
570 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
571}
572
Finn Williamsb454c5c2021-02-09 15:56:23 +0000573void SerializerStrategy::SerializeEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000574{
Jan Eilers8eb25602020-03-09 12:13:48 +0000575 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000576
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000577 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
578 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
579
580 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
581}
582
Finn Williamsb454c5c2021-02-09 15:56:23 +0000583void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100584 const armnn::FillDescriptor& fillDescriptor,
585 const char* name)
586{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100587 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100588
589 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
590
591 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
592
593 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
594
595 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100596}
597
Finn Williamsb454c5c2021-02-09 15:56:23 +0000598void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000599{
Jan Eilers8eb25602020-03-09 12:13:48 +0000600 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000601
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000602 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
603 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
604
605 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
606}
607
Finn Williamsb454c5c2021-02-09 15:56:23 +0000608void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100609 const armnn::GatherDescriptor& gatherDescriptor,
610 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000611{
Jan Eilers8eb25602020-03-09 12:13:48 +0000612 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000613
Teresa Charlin52664732020-06-29 16:27:03 +0100614 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
615 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000616 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100617 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000618
619 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
620}
621
Finn Williamsb454c5c2021-02-09 15:56:23 +0000622
623void SerializerStrategy::SerializeGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000624{
Jan Eilers8eb25602020-03-09 12:13:48 +0000625 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000626
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000627 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000628 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000629
630 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
631}
632
Finn Williamsb454c5c2021-02-09 15:56:23 +0000633void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100634 const armnn::IConnectableLayer* layer,
635 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
636 const char* name)
637{
Jan Eilers8eb25602020-03-09 12:13:48 +0000638 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000639
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100640 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
641 m_flatBufferBuilder,
642 instanceNormalizationDescriptor.m_Gamma,
643 instanceNormalizationDescriptor.m_Beta,
644 instanceNormalizationDescriptor.m_Eps,
645 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
646
647 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
648 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
649
650 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100651}
652
Finn Williamsb454c5c2021-02-09 15:56:23 +0000653void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000654 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
655 const char* name)
656{
Jan Eilers8eb25602020-03-09 12:13:48 +0000657 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000658
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000659 // Create FlatBuffer BaseLayer
660 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
661
662 // Create the FlatBuffer L2Normalization Descriptor
663 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100664 m_flatBufferBuilder,
665 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
666 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000667
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100668 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000669 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
670
671 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
672}
673
Finn Williamsb454c5c2021-02-09 15:56:23 +0000674void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000675 const armnn::LogicalBinaryDescriptor& descriptor,
676 const char* name)
677{
678 IgnoreUnused(name);
679
680 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
681 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
682 m_flatBufferBuilder,
683 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
684
685 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
686 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
687}
688
Finn Williamsb454c5c2021-02-09 15:56:23 +0000689void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100690 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
691 const char* name)
692{
Jan Eilers8eb25602020-03-09 12:13:48 +0000693 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000694
Sadik Armagan26257852019-10-14 13:00:47 +0100695 // Create FlatBuffer BaseLayer
696 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
697
698 // Create the FlatBuffer LogSoftmaxDescriptor
699 auto flatBufferLogSoftmaxDesc =
700 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
701 logSoftmaxDescriptor.m_Beta,
702 logSoftmaxDescriptor.m_Axis);
703
704 // Create the FlatBuffer LogSoftmaxLayer
705 auto flatBufferLogSoftmaxLayer =
706 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
707 flatBufferLogSoftmaxBaseLayer,
708 flatBufferLogSoftmaxDesc);
709
710 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100711}
712
Finn Williamsb454c5c2021-02-09 15:56:23 +0000713void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
714 const armnn::LstmDescriptor& descriptor,
715 const std::vector<armnn::ConstTensor>& constants,
716 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000717{
Jan Eilers8eb25602020-03-09 12:13:48 +0000718 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000719
Jim Flynn11af3752019-03-19 17:22:29 +0000720 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
721
722 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
723 m_flatBufferBuilder,
724 descriptor.m_ActivationFunc,
725 descriptor.m_ClippingThresCell,
726 descriptor.m_ClippingThresProj,
727 descriptor.m_CifgEnabled,
728 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100729 descriptor.m_ProjectionEnabled,
730 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000731
Finn Williamsb454c5c2021-02-09 15:56:23 +0000732 // Index for constants vector
733 std::size_t i = 0;
734
735 // Get mandatory/basic input parameters
736 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
737 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
738 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
739 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
740 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
741 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
742 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
743 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
744 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
745
746
Jim Flynn11af3752019-03-19 17:22:29 +0000747
748 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
749 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
750 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
751 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
752 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
753 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
754 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
755 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
756 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100757 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
758 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
759 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
760 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000761
762 if (!descriptor.m_CifgEnabled)
763 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000764 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
765 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
766 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000767 }
768
769 if (descriptor.m_PeepholeEnabled)
770 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000771 if (!descriptor.m_CifgEnabled)
772 {
773 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
774 }
775 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
776 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
777 }
778
779 if (descriptor.m_ProjectionEnabled)
780 {
781 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
782 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000783 }
784
Jan Eilersf8c62972019-07-17 11:07:49 +0100785 if (descriptor.m_LayerNormEnabled)
786 {
787 if (!descriptor.m_CifgEnabled)
788 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000789 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100790 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000791 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
792 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
793 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100794 }
795
Jim Flynn11af3752019-03-19 17:22:29 +0000796 auto fbLstmParams = serializer::CreateLstmInputParams(
797 m_flatBufferBuilder,
798 inputToForgetWeights,
799 inputToCellWeights,
800 inputToOutputWeights,
801 recurrentToForgetWeights,
802 recurrentToCellWeights,
803 recurrentToOutputWeights,
804 forgetGateBias,
805 cellBias,
806 outputGateBias,
807 inputToInputWeights,
808 recurrentToInputWeights,
809 cellToInputWeights,
810 inputGateBias,
811 projectionWeights,
812 projectionBias,
813 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100814 cellToOutputWeights,
815 inputLayerNormWeights,
816 forgetLayerNormWeights,
817 cellLayerNormWeights,
818 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000819
820 auto fbLstmLayer = serializer::CreateLstmLayer(
821 m_flatBufferBuilder,
822 fbLstmBaseLayer,
823 fbLstmDescriptor,
824 fbLstmParams);
825
826 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
827}
828
Finn Williamsb454c5c2021-02-09 15:56:23 +0000829void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000830{
Jan Eilers8eb25602020-03-09 12:13:48 +0000831 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000832
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000833 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
834 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
835
836 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
837}
838
Finn Williamsb454c5c2021-02-09 15:56:23 +0000839void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000840 const armnn::MeanDescriptor& descriptor,
841 const char* name)
842{
Jan Eilers8eb25602020-03-09 12:13:48 +0000843 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000844
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000845 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
846 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
847 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
848 descriptor.m_KeepDims);
849
850 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
851 fbMeanBaseLayer,
852 fbMeanDescriptor);
853
854 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
855}
856
Finn Williamsb454c5c2021-02-09 15:56:23 +0000857void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000858{
Jan Eilers8eb25602020-03-09 12:13:48 +0000859 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000860
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000861 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
862 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
863
864 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
865}
866
Finn Williamsb454c5c2021-02-09 15:56:23 +0000867void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100868{
Jan Eilers8eb25602020-03-09 12:13:48 +0000869 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000870
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100871 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
872 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
873
874 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
875}
876
Finn Williamsb454c5c2021-02-09 15:56:23 +0000877void SerializerStrategy::SerializeMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100878 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000879 const char* name)
880{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000881 SerializeConcatLayer(layer, mergerDescriptor, name);
Jim Flynne242f2d2019-05-22 14:24:13 +0100882}
883
Finn Williamsb454c5c2021-02-09 15:56:23 +0000884void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100885 const armnn::ConcatDescriptor& concatDescriptor,
886 const char* name)
887{
Jan Eilers8eb25602020-03-09 12:13:48 +0000888 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000889
Jim Flynne242f2d2019-05-22 14:24:13 +0100890 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000891
892 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100893 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000894 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100895 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000896 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100897 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000898 {
899 origins.push_back(origin[d]);
900 }
901 auto view = m_flatBufferBuilder.CreateVector(origins);
902 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
903 views.push_back(uintVector);
904 }
905
Jim Flynne242f2d2019-05-22 14:24:13 +0100906 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
907 concatDescriptor.GetConcatAxis(),
908 concatDescriptor.GetNumViews(),
909 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000910 m_flatBufferBuilder.CreateVector(views));
911
Jim Flynne242f2d2019-05-22 14:24:13 +0100912 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
913 flatBufferConcatBaseLayer,
914 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000915
Jim Flynne242f2d2019-05-22 14:24:13 +0100916 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000917}
918
Finn Williamsb454c5c2021-02-09 15:56:23 +0000919void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000920{
Jan Eilers8eb25602020-03-09 12:13:48 +0000921 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000922
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000923 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
924 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
925 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000926
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000927 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000928}
929
Finn Williamsb454c5c2021-02-09 15:56:23 +0000930void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000931 const armnn::PadDescriptor& padDescriptor,
932 const char* name)
933{
Jan Eilers8eb25602020-03-09 12:13:48 +0000934 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000935
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000936 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
937
938 std::vector<unsigned int> padList;
939 for (auto& p: padDescriptor.m_PadList)
940 {
941 padList.push_back(p.first);
942 padList.push_back(p.second);
943 }
944
945 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100946 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100947 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000948
949 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
950 flatBufferBaseLayer,
951 flatBufferPadDesc);
952
953 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
954}
955
Finn Williamsb454c5c2021-02-09 15:56:23 +0000956void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000957 const armnn::PermuteDescriptor& permuteDescriptor,
958 const char* name)
959{
Jan Eilers8eb25602020-03-09 12:13:48 +0000960 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000961
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000962 // Create FlatBuffer BaseLayer
963 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
964
965 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100966 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000967 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100968 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000969 }
970
971 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
972 m_flatBufferBuilder.CreateVector(dimMappings));
973
974 // Create the FlatBuffer PermuteLayer
975 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
976 flatBufferPermuteBaseLayer,
977 flatBufferPermuteDesc);
978
979 // Add the AnyLayer to the FlatBufferLayers
980 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
981}
982
Finn Williams2605b232020-06-10 15:53:46 +0100983// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000984void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100985 const char* name)
986{
987 IgnoreUnused(name);
988 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
989 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
990
991 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
992}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000993
Finn Williamsb454c5c2021-02-09 15:56:23 +0000994void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
995 const armnn::ReduceDescriptor& reduceDescriptor,
996 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000997{
998 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
999 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001000 reduceDescriptor.m_KeepDims,
1001 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
1002 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
1003 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
1004 fbReduceBaseLayer,
1005 fbDescriptor);
1006
1007 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
1008}
1009
Saoirse Stewart263829c2019-02-19 15:54:14 +00001010// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001011void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +00001012 const armnn::ReshapeDescriptor& reshapeDescriptor,
1013 const char* name)
1014{
Jan Eilers8eb25602020-03-09 12:13:48 +00001015 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001016
Saoirse Stewart263829c2019-02-19 15:54:14 +00001017 // Create FlatBuffer BaseLayer
1018 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
1019
1020 std::vector<unsigned int> targetShape;
1021 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
1022 {
1023 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
1024 }
1025
1026 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
1027 m_flatBufferBuilder.CreateVector(targetShape));
1028
1029 // Create the FlatBuffer ReshapeLayer
1030 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
1031 flatBufferReshapeDesc);
1032
1033 // Add the AnyLayer to the FlatBufferLayers
1034 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
1035}
1036
Finn Williamsb454c5c2021-02-09 15:56:23 +00001037void SerializerStrategy::SerializeResizeBilinearLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +00001038 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
1039 const char* name)
1040{
Jan Eilers8eb25602020-03-09 12:13:48 +00001041 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001042
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +00001043 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
1044
1045 auto flatBufferDescriptor =
1046 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
1047 resizeDescriptor.m_TargetWidth,
1048 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +01001049 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1050 resizeDescriptor.m_AlignCorners,
1051 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +00001052
1053 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
1054 flatBufferBaseLayer,
1055 flatBufferDescriptor);
1056
1057 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
1058}
1059
Finn Williamsb454c5c2021-02-09 15:56:23 +00001060void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +01001061 const armnn::ResizeDescriptor& resizeDescriptor,
1062 const char* name)
1063{
Jan Eilers8eb25602020-03-09 12:13:48 +00001064 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001065
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001066 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1067
1068 auto flatBufferDescriptor =
1069 CreateResizeDescriptor(m_flatBufferBuilder,
1070 resizeDescriptor.m_TargetHeight,
1071 resizeDescriptor.m_TargetWidth,
1072 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001073 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1074 resizeDescriptor.m_AlignCorners,
1075 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001076
1077 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1078 flatBufferBaseLayer,
1079 flatBufferDescriptor);
1080
1081 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001082}
1083
Finn Williamsb454c5c2021-02-09 15:56:23 +00001084void SerializerStrategy::SerializeRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan8b42a382019-03-01 14:24:49 +00001085{
Jan Eilers8eb25602020-03-09 12:13:48 +00001086 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001087
Sadik Armagan8b42a382019-03-01 14:24:49 +00001088 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
1089 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
1090
1091 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
1092}
1093
Finn Williamsb454c5c2021-02-09 15:56:23 +00001094void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001095 const armnn::SliceDescriptor& sliceDescriptor,
1096 const char* name)
1097{
Jan Eilers8eb25602020-03-09 12:13:48 +00001098 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001099
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001100 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1101 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1102 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1103 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1104
1105 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1106
1107 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001108}
1109
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001110// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001111void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001112 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001113 const char* name)
1114{
Jan Eilers8eb25602020-03-09 12:13:48 +00001115 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001116
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001117 // Create FlatBuffer BaseLayer
1118 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1119
1120 // Create the FlatBuffer SoftmaxDescriptor
1121 auto flatBufferSoftmaxDesc =
1122 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
1123
1124 // Create the FlatBuffer SoftmaxLayer
1125 auto flatBufferSoftmaxLayer =
1126 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1127 flatBufferSoftmaxBaseLayer,
1128 flatBufferSoftmaxDesc);
1129
1130 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1131}
1132
Finn Williamsb454c5c2021-02-09 15:56:23 +00001133void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001134 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001135 const char* name)
1136{
Jan Eilers8eb25602020-03-09 12:13:48 +00001137 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001138
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001139 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1140 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1141 m_flatBufferBuilder,
1142 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1143 pooling2dDescriptor.m_PadLeft,
1144 pooling2dDescriptor.m_PadRight,
1145 pooling2dDescriptor.m_PadTop,
1146 pooling2dDescriptor.m_PadBottom,
1147 pooling2dDescriptor.m_PoolWidth,
1148 pooling2dDescriptor.m_PoolHeight,
1149 pooling2dDescriptor.m_StrideX,
1150 pooling2dDescriptor.m_StrideY,
1151 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1152 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1153 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1154
1155 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1156 fbPooling2dBaseLayer,
1157 fbPooling2dDescriptor);
1158
1159 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1160}
1161
Finn Williamsb454c5c2021-02-09 15:56:23 +00001162void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001163 const char* name)
1164{
Jan Eilers8eb25602020-03-09 12:13:48 +00001165 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001166
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001167 // Create FlatBuffer BaseLayer
1168 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1169
1170 // Create the FlatBuffer AdditionLayer
1171 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1172
1173 // Add the AnyLayer to the FlatBufferLayers
1174 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001175}
1176
Finn Williamsb454c5c2021-02-09 15:56:23 +00001177void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001178{
Jan Eilers8eb25602020-03-09 12:13:48 +00001179 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001180
Derek Lamberti87acb272019-03-27 16:51:31 +00001181 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1182 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1183 fbQuantizeBaseLayer);
1184 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1185}
1186
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001187// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001188void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1189 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001190 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001191{
1192 // Create FlatBuffer BaseLayer
1193 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1194
1195 // Create FlatBuffer FullyConnectedDescriptor
1196 auto flatBufferDescriptor =
1197 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1198 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001199 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1200 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001201
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001202 // Create FlatBuffer FullyConnectedLayer
1203 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1204 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001205 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001206
1207 // Add created FullyConnectedLayer to the FlatBufferLayers
1208 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1209}
1210
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001211// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001212void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001213 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1214 const char* name)
1215{
Jan Eilers8eb25602020-03-09 12:13:48 +00001216 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001217
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001218 // Create FlatBuffer BaseLayer
1219 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1220
1221 std::vector<unsigned int> padList;
1222 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1223 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1224 {
1225 padList.push_back(pad.first);
1226 padList.push_back(pad.second);
1227 }
1228
1229 auto flatBufferDescriptor =
1230 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1231 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1232 m_flatBufferBuilder.CreateVector(padList),
1233 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1234
1235 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1236 flatBufferBaseLayer,
1237 flatBufferDescriptor);
1238
1239 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1240}
1241
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001242// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001243void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001244 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1245 const char* name)
1246{
Jan Eilers8eb25602020-03-09 12:13:48 +00001247 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001248
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001249 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1250 auto flatBufferDescriptor =
1251 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1252 spaceToDepthDescriptor.m_BlockSize,
1253 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1254
1255 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1256 flatBufferBaseLayer,
1257 flatBufferDescriptor);
1258
1259 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001260}
1261
Jim Flynn18ce3382019-03-08 11:08:30 +00001262// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001263void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001264 const armnn::ViewsDescriptor& viewsDescriptor,
1265 const char* name)
1266{
Jan Eilers8eb25602020-03-09 12:13:48 +00001267 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001268
Jim Flynn18ce3382019-03-08 11:08:30 +00001269 // Create FlatBuffer ViewOrigins
1270 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1271 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1272
1273 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1274 {
1275 std::vector<uint32_t> viewOrigin;
1276 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1277
1278 // Copy vector
1279 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1280 {
1281 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1282 }
1283
1284 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1285 m_flatBufferBuilder.CreateVector(viewOrigin)));
1286 }
1287
1288 // Create FlatBuffer OriginsDescriptor
1289 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1290 viewsDescriptor.GetOrigins().GetConcatAxis(),
1291 viewsDescriptor.GetOrigins().GetNumViews(),
1292 viewsDescriptor.GetOrigins().GetNumDimensions(),
1293 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1294
1295 // Create FlatBuffer ViewOrigins
1296 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1297 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1298
1299 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1300 {
1301 std::vector<uint32_t> viewSize;
1302 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1303
1304 // Copy vector
1305 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1306 {
1307 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1308 }
1309
1310 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1311 m_flatBufferBuilder.CreateVector(viewSize)));
1312 }
1313
1314 // Create FlatBuffer ViewsDescriptor
1315 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1316 flatBufferOriginDescriptor,
1317 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1318
1319 // Create FlatBuffer BaseLayer
1320 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1321
1322 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1323 flatBufferBaseLayer,
1324 flatBufferViewsDescriptor);
1325
1326 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1327}
1328
Finn Williamsb454c5c2021-02-09 15:56:23 +00001329void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001330 const armnn::NormalizationDescriptor& descriptor,
1331 const char* name)
1332{
Jan Eilers8eb25602020-03-09 12:13:48 +00001333 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001334
Nina Drozd57728782019-02-27 10:53:27 +00001335 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1336
1337 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1338 m_flatBufferBuilder,
1339 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1340 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1341 descriptor.m_NormSize,
1342 descriptor.m_Alpha,
1343 descriptor.m_Beta,
1344 descriptor.m_K,
1345 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1346
1347 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1348 fbNormalizationBaseLayer,
1349 fbNormalizationDescriptor);
1350
1351 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1352}
1353
Keith Davis3ae3f972021-05-21 16:33:48 +01001354void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1355 const char* name)
1356{
1357 IgnoreUnused(name);
1358
1359 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1360 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1361
1362 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1363}
1364
Finn Williamsb454c5c2021-02-09 15:56:23 +00001365void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001366 const armnn::StackDescriptor& stackDescriptor,
1367 const char* name)
1368{
Jan Eilers8eb25602020-03-09 12:13:48 +00001369 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001370
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001371 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1372
1373 std::vector<unsigned int> inputShape;
1374 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1375 {
1376 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1377 }
1378
1379 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1380 stackDescriptor.m_Axis,
1381 stackDescriptor.m_NumInputs,
1382 m_flatBufferBuilder.CreateVector(inputShape));
1383
1384 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1385 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001386}
1387
Finn Williamsb454c5c2021-02-09 15:56:23 +00001388void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001389 const armnn::StandInDescriptor& standInDescriptor,
1390 const char *name)
1391{
Jan Eilers8eb25602020-03-09 12:13:48 +00001392 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001393
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001394 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1395 standInDescriptor.m_NumInputs,
1396 standInDescriptor.m_NumOutputs);
1397
1398 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1399 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1400
1401 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001402}
1403
Finn Williamsb454c5c2021-02-09 15:56:23 +00001404void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001405 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1406 const char* name)
1407{
Jan Eilers8eb25602020-03-09 12:13:48 +00001408 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001409
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001410 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1411
1412 auto flatBufferDescriptor =
1413 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1414 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1415 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1416 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1417 stridedSliceDescriptor.m_BeginMask,
1418 stridedSliceDescriptor.m_EndMask,
1419 stridedSliceDescriptor.m_ShrinkAxisMask,
1420 stridedSliceDescriptor.m_EllipsisMask,
1421 stridedSliceDescriptor.m_NewAxisMask,
1422 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1423
1424 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1425 flatBufferBaseLayer,
1426 flatBufferDescriptor);
1427
1428 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1429}
1430
Finn Williamsb454c5c2021-02-09 15:56:23 +00001431void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001432{
Jan Eilers8eb25602020-03-09 12:13:48 +00001433 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001434
Conor Kennedyda1f9752019-03-01 14:37:12 +00001435 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1436 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1437
1438 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1439}
1440
Finn Williamsb454c5c2021-02-09 15:56:23 +00001441void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001442{
Jan Eilers8eb25602020-03-09 12:13:48 +00001443 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001444
Sadik Armaganeff363d2019-04-05 15:25:46 +01001445 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1446 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1447
1448 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1449}
1450
Finn Williamsb454c5c2021-02-09 15:56:23 +00001451void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001452 const armnn::IConnectableLayer* layer,
1453 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001454 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001455 const char* name)
1456{
Jan Eilers8eb25602020-03-09 12:13:48 +00001457 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001458
Finn Williamsb454c5c2021-02-09 15:56:23 +00001459 const armnn::ConstTensor& weights = constants.at(0);
1460
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001461 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1462 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1463 descriptor.m_PadLeft,
1464 descriptor.m_PadRight,
1465 descriptor.m_PadTop,
1466 descriptor.m_PadBottom,
1467 descriptor.m_StrideX,
1468 descriptor.m_StrideY,
1469 descriptor.m_BiasEnabled,
1470 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1471
1472 // weights & biases
1473 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1474 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001475 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001476 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001477 const armnn::ConstTensor& biases = constants.at(1);
1478 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001479 }
1480
1481 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1482 fbBaseLayer,
1483 fbDescriptor,
1484 fbWeightsConstTensorInfo,
1485 fbBiasesConstTensorInfo);
1486
1487 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001488}
1489
Finn Williamsb454c5c2021-02-09 15:56:23 +00001490void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001491 const armnn::TransposeDescriptor& descriptor,
1492 const char* name)
1493{
Jan Eilers8eb25602020-03-09 12:13:48 +00001494 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001495
1496 // Create FlatBuffer BaseLayer
1497 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1498
1499 std::vector<unsigned int> dimMappings;
1500 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1501 {
1502 dimMappings.push_back(descriptor.m_DimMappings[i]);
1503 }
1504
1505 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1506 m_flatBufferBuilder.CreateVector(dimMappings));
1507
1508 // Create the FlatBuffer TransposeLayer
1509 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1510 flatBufferBaseLayer,
1511 flatBufferDesc);
1512
1513 // Add the AnyLayer to the FlatBufferLayers
1514 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1515}
1516
Finn Williamsb454c5c2021-02-09 15:56:23 +00001517void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1518 const armnn::QLstmDescriptor& descriptor,
1519 const std::vector<armnn::ConstTensor>& constants,
1520 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001521{
James Conroy8d333182020-05-13 10:27:58 +01001522 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001523
James Conroy8d333182020-05-13 10:27:58 +01001524 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1525
1526 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1527 m_flatBufferBuilder,
1528 descriptor.m_CifgEnabled,
1529 descriptor.m_PeepholeEnabled,
1530 descriptor.m_ProjectionEnabled,
1531 descriptor.m_LayerNormEnabled,
1532 descriptor.m_CellClip,
1533 descriptor.m_ProjectionClip,
1534 descriptor.m_InputIntermediateScale,
1535 descriptor.m_ForgetIntermediateScale,
1536 descriptor.m_CellIntermediateScale,
1537 descriptor.m_OutputIntermediateScale,
1538 descriptor.m_HiddenStateZeroPoint,
1539 descriptor.m_HiddenStateScale
1540 );
1541
Finn Williamsb454c5c2021-02-09 15:56:23 +00001542 // Index for constants vector
1543 std::size_t i = 0;
1544
James Conroy8d333182020-05-13 10:27:58 +01001545 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001546 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1547 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1548 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1549 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1550 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1551 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1552 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1553 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1554 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001555
1556 // CIFG
1557 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1558 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1559 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1560
1561 if (!descriptor.m_CifgEnabled)
1562 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001563 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1564 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1565 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001566 }
1567
1568 // Peephole
1569 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1570 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1571 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1572
1573 if (descriptor.m_PeepholeEnabled)
1574 {
1575 if (!descriptor.m_CifgEnabled)
1576 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001577 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001578 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001579 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1580 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1581 }
James Conroy8d333182020-05-13 10:27:58 +01001582
Finn Williamsb454c5c2021-02-09 15:56:23 +00001583 // Projection
1584 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1585 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1586
1587 if (descriptor.m_ProjectionEnabled)
1588 {
1589 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1590 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001591 }
1592
1593 // Layer norm
1594 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1595 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1596 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1597 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1598
1599 if (descriptor.m_LayerNormEnabled)
1600 {
1601 if (!descriptor.m_CifgEnabled)
1602 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001603 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001604 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001605 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1606 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1607 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001608 }
1609
1610 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1611 m_flatBufferBuilder,
1612 inputToForgetWeights,
1613 inputToCellWeights,
1614 inputToOutputWeights,
1615 recurrentToForgetWeights,
1616 recurrentToCellWeights,
1617 recurrentToOutputWeights,
1618 forgetGateBias,
1619 cellBias,
1620 outputGateBias,
1621 inputToInputWeights,
1622 recurrentToInputWeights,
1623 inputGateBias,
1624 projectionWeights,
1625 projectionBias,
1626 cellToInputWeights,
1627 cellToForgetWeights,
1628 cellToOutputWeights,
1629 inputLayerNormWeights,
1630 forgetLayerNormWeights,
1631 cellLayerNormWeights,
1632 outputLayerNormWeights);
1633
1634 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1635 m_flatBufferBuilder,
1636 fbQLstmBaseLayer,
1637 fbQLstmDescriptor,
1638 fbQLstmParams);
1639
1640 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001641}
1642
Finn Williamsb454c5c2021-02-09 15:56:23 +00001643void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1644 const std::vector<armnn::ConstTensor>& constants,
1645 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001646{
Jan Eilers8eb25602020-03-09 12:13:48 +00001647 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001648
Jan Eilers5b01a892019-07-23 09:47:43 +01001649 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1650
Finn Williamsb454c5c2021-02-09 15:56:23 +00001651 // index for constants vector
1652 size_t i = 0;
1653
Jan Eilers5b01a892019-07-23 09:47:43 +01001654 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001655 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1656 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1657 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1658 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001659
Finn Williamsb454c5c2021-02-09 15:56:23 +00001660 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1661 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1662 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1663 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001664
Finn Williamsb454c5c2021-02-09 15:56:23 +00001665 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1666 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1667 auto cellBias = CreateConstTensorInfo(constants[i++]);
1668 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001669
1670 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1671 m_flatBufferBuilder,
1672 inputToInputWeights,
1673 inputToForgetWeights,
1674 inputToCellWeights,
1675 inputToOutputWeights,
1676 recurrentToInputWeights,
1677 recurrentToForgetWeights,
1678 recurrentToCellWeights,
1679 recurrentToOutputWeights,
1680 inputGateBias,
1681 forgetGateBias,
1682 cellBias,
1683 outputGateBias);
1684
1685 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1686 m_flatBufferBuilder,
1687 fbQuantizedLstmBaseLayer,
1688 fbQuantizedLstmParams);
1689
1690 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001691}
1692
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001693void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1694 const armnn::IConnectableLayer* layer,
1695 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1696 const std::vector<armnn::ConstTensor>& constants,
1697 const char* name)
1698{
1699 IgnoreUnused(name);
1700
1701 auto fbUnidirectionalSequenceLstmBaseLayer =
1702 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1703
1704 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1705 m_flatBufferBuilder,
1706 descriptor.m_ActivationFunc,
1707 descriptor.m_ClippingThresCell,
1708 descriptor.m_ClippingThresProj,
1709 descriptor.m_CifgEnabled,
1710 descriptor.m_PeepholeEnabled,
1711 descriptor.m_ProjectionEnabled,
1712 descriptor.m_LayerNormEnabled,
1713 descriptor.m_TimeMajor);
1714
1715 // Index for constants vector
1716 std::size_t i = 0;
1717
1718 // Get mandatory/basic input parameters
1719 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1720 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1721 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1722 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1723 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1724 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1725 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1726 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1727 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1728
1729 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1730 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1731 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1732 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1733 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1734 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1735 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1736 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1737 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1738 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1739 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1740 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1741 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1742
1743 if (!descriptor.m_CifgEnabled)
1744 {
1745 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1746 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1747 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1748 }
1749
1750 if (descriptor.m_PeepholeEnabled)
1751 {
1752 if (!descriptor.m_CifgEnabled)
1753 {
1754 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1755 }
1756 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1757 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1758 }
1759
1760 if (descriptor.m_ProjectionEnabled)
1761 {
1762 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1763 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1764 }
1765
1766 if (descriptor.m_LayerNormEnabled)
1767 {
1768 if (!descriptor.m_CifgEnabled)
1769 {
1770 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1771 }
1772 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1773 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1774 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1775 }
1776
1777 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1778 m_flatBufferBuilder,
1779 inputToForgetWeights,
1780 inputToCellWeights,
1781 inputToOutputWeights,
1782 recurrentToForgetWeights,
1783 recurrentToCellWeights,
1784 recurrentToOutputWeights,
1785 forgetGateBias,
1786 cellBias,
1787 outputGateBias,
1788 inputToInputWeights,
1789 recurrentToInputWeights,
1790 cellToInputWeights,
1791 inputGateBias,
1792 projectionWeights,
1793 projectionBias,
1794 cellToForgetWeights,
1795 cellToOutputWeights,
1796 inputLayerNormWeights,
1797 forgetLayerNormWeights,
1798 cellLayerNormWeights,
1799 outputLayerNormWeights);
1800
1801 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1802 m_flatBufferBuilder,
1803 fbUnidirectionalSequenceLstmBaseLayer,
1804 fbUnidirectionalSequenceLstmDescriptor,
1805 fbUnidirectionalSequenceLstmParams);
1806
1807 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1808}
1809
Finn Williamsb454c5c2021-02-09 15:56:23 +00001810fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001811 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001812{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001813
Sadik Armagandb059fd2019-03-20 12:28:32 +00001814 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1815
Mike Kelly8c1701a2019-02-11 17:01:27 +00001816 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1817 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1818
1819 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001820 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001821 m_flatBufferBuilder.CreateString(layer->GetName()),
1822 layerType,
1823 m_flatBufferBuilder.CreateVector(inputSlots),
1824 m_flatBufferBuilder.CreateVector(outputSlots));
1825}
1826
Finn Williamsb454c5c2021-02-09 15:56:23 +00001827void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001828{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001829
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001830 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001831 m_serializedLayers.push_back(anyLayer);
1832}
1833
Mike Kellya0766c32019-02-19 17:22:07 +00001834template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001835flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001836{
1837 const T* buffer = reinterpret_cast<const T*>(memory);
1838 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1839 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1840 return fbVector;
1841}
1842
Finn Williamsb454c5c2021-02-09 15:56:23 +00001843flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001844{
Mike Kellya0766c32019-02-19 17:22:07 +00001845 // Get the dimensions
1846 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001847 std::vector<bool> specificity;
1848 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1849 // matches the size of dimensions.
1850 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1851 {
1852 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001853
1854 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1855 {
1856 shape.push_back(tensorInfo.GetShape()[dim]);
1857 }
1858 else
1859 {
1860 shape.push_back(0);
1861 }
Colm Donelan800b2812021-02-12 12:43:35 +00001862 }
1863
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001864 if (tensorInfo.HasPerAxisQuantization())
1865 {
1866 // Create FlatBuffer TensorInfo
1867 auto flatBufferTensorInfo =
1868 serializer::CreateTensorInfo(m_flatBufferBuilder,
1869 m_flatBufferBuilder.CreateVector(shape),
1870 GetFlatBufferDataType(tensorInfo.GetDataType()),
1871 tensorInfo.GetQuantizationScales()[0],
1872 tensorInfo.GetQuantizationOffset(),
1873 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001874 tensorInfo.GetQuantizationDim().value(),
1875 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001876 (tensorInfo.GetShape().GetDimensionality()),
1877 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001878 return flatBufferTensorInfo;
1879 }
1880
Mike Kellya0766c32019-02-19 17:22:07 +00001881 // Create FlatBuffer TensorInfo
1882 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1883 m_flatBufferBuilder.CreateVector(shape),
1884 GetFlatBufferDataType(tensorInfo.GetDataType()),
1885 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001886 tensorInfo.GetQuantizationOffset(),
1887 0,
1888 0,
1889 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001890 (tensorInfo.GetShape().GetDimensionality()),
1891 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001892 return flatBufferTensorInfo;
1893}
1894
1895flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001896 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001897{
1898 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1899
Mike Kellya0766c32019-02-19 17:22:07 +00001900 flatbuffers::Offset<void> fbPayload;
1901
1902 switch (tensorInfo.GetDataType())
1903 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001904 case armnn::DataType::Signed64:
1905 {
1906 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1907 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1908 m_flatBufferBuilder,
1909 fbVector);
1910 fbPayload = flatBuffersData.o;
1911 break;
1912 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001913 case armnn::DataType::Float32:
1914 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001915 {
1916 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1917 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1918 m_flatBufferBuilder,
1919 fbVector);
1920 fbPayload = flatBuffersData.o;
1921 break;
1922 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001923 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001924 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001925 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001926 {
1927 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1928 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1929 m_flatBufferBuilder,
1930 fbVector);
1931 fbPayload = flatBuffersData.o;
1932 break;
1933 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001934 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001935 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001936 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001937 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001938 default:
1939 {
1940 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1941 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1942 m_flatBufferBuilder,
1943 fbVector);
1944 fbPayload = flatBuffersData.o;
1945 }
1946 }
1947 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1948 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001949 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001950 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1951 fbPayload);
1952 return flatBufferConstTensor;
1953}
1954
Finn Williamsb454c5c2021-02-09 15:56:23 +00001955flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001956{
1957 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1958 serializer::CreateFeatureCompatibilityVersions(
1959 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001960 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001961 1, // Weights layout scheme version
1962 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001963 );
1964 return versionsTable;
1965}
1966
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001967std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001968 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001969{
Mike Kellya0766c32019-02-19 17:22:07 +00001970 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001971
1972 // Get the InputSlots
1973 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1974 {
1975 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1976
1977 // Get the Connection for the InputSlot
1978 const IOutputSlot* connection = inputSlot.GetConnection();
1979
1980 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001981 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1982 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001983 // Create FlatBuffer InputSlot
1984 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1985 }
1986 return inputSlots;
1987}
1988
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001989std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001990 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001991{
1992 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1993
1994 // Get the OutputSlots
1995 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1996 {
1997 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001998 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001999
Mike Kelly8c1701a2019-02-11 17:01:27 +00002000 // Create FlatBuffer Outputslot
2001 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
2002 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00002003 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00002004 }
2005 return outputSlots;
2006}
2007
Finn Williamsb454c5c2021-02-09 15:56:23 +00002008void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
2009 const BaseDescriptor& descriptor,
2010 const std::vector<armnn::ConstTensor>& constants,
2011 const char* name,
2012 const armnn::LayerBindingId id)
2013{
2014 IgnoreUnused(constants);
2015
2016 switch (layer->GetType())
2017 {
2018 case armnn::LayerType::Activation :
2019 {
2020 const armnn::ActivationDescriptor& layerDescriptor =
2021 static_cast<const armnn::ActivationDescriptor&>(descriptor);
2022 SerializeActivationLayer(layer, layerDescriptor, name);
2023 break;
2024 }
2025 case armnn::LayerType::Addition :
2026 {
2027 SerializeAdditionLayer(layer, name);
2028 break;
2029 }
2030 case armnn::LayerType::ArgMinMax :
2031 {
2032 const armnn::ArgMinMaxDescriptor& layerDescriptor =
2033 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
2034 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
2035 break;
2036 }
2037 case armnn::LayerType::BatchNormalization :
2038 {
2039 const armnn::BatchNormalizationDescriptor& layerDescriptor =
2040 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
2041 SerializeBatchNormalizationLayer(layer,
2042 layerDescriptor,
2043 constants,
2044 name);
2045 break;
2046 }
2047 case armnn::LayerType::BatchToSpaceNd :
2048 {
2049 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2050 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2051 SerializeBatchToSpaceNdLayer(layer,
2052 layerDescriptor,
2053 name);
2054 break;
2055 }
mathad01b392e982021-04-07 12:07:30 +01002056 case armnn::LayerType::Cast :
2057 {
2058 SerializeCastLayer(layer, name);
2059 break;
2060 }
Simon Obute51f67772021-09-03 15:50:13 +01002061 case armnn::LayerType::ChannelShuffle :
2062 {
2063 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2064 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2065 SerializeChannelShuffleLayer(layer,
2066 layerDescriptor,
2067 name);
2068 break;
2069 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002070 case armnn::LayerType::Comparison :
2071 {
2072 const armnn::ComparisonDescriptor& layerDescriptor =
2073 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2074 SerializeComparisonLayer(layer,
2075 layerDescriptor,
2076 name);
2077 break;
2078 }
2079 case armnn::LayerType::Concat :
2080 {
2081 const armnn::ConcatDescriptor& layerDescriptor =
2082 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2083 SerializeConcatLayer(layer,
2084 layerDescriptor,
2085 name);
2086 break;
2087 }
2088 case armnn::LayerType::Constant :
2089 {
2090 SerializeConstantLayer(layer,
2091 constants,
2092 name);
2093 break;
2094 }
2095 case armnn::LayerType::Convolution2d :
2096 {
2097 const armnn::Convolution2dDescriptor& layerDescriptor =
2098 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2099 SerializeConvolution2dLayer(layer,
2100 layerDescriptor,
2101 constants,
2102 name);
2103 break;
2104 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002105 case armnn::LayerType::Convolution3d :
2106 {
2107 const armnn::Convolution3dDescriptor& layerDescriptor =
2108 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2109 SerializeConvolution3dLayer(layer,
2110 layerDescriptor,
2111 constants,
2112 name);
2113 break;
2114 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002115 case armnn::LayerType::DepthToSpace :
2116 {
2117 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2118 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2119 SerializeDepthToSpaceLayer(layer,
2120 layerDescriptor,
2121 name);
2122 break;
2123 }
2124 case armnn::LayerType::DepthwiseConvolution2d :
2125 {
2126 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2127 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2128 SerializeDepthwiseConvolution2dLayer(layer,
2129 layerDescriptor,
2130 constants,
2131 name);
2132 break;
2133 }
2134 case armnn::LayerType::Dequantize :
2135 {
2136 SerializeDequantizeLayer(layer,
2137 name);
2138 break;
2139 }
2140 case armnn::LayerType::DetectionPostProcess :
2141 {
2142 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2143 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2144 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2145 break;
2146 }
2147 case armnn::LayerType::Division :
2148 {
2149 SerializeDivisionLayer(layer, name);
2150 break;
2151 }
2152 case armnn::LayerType::ElementwiseUnary :
2153 {
2154 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2155 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2156 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2157 break;
2158 }
2159 case armnn::LayerType::Fill :
2160 {
2161 const armnn::FillDescriptor& layerDescriptor =
2162 static_cast<const armnn::FillDescriptor&>(descriptor);
2163 SerializeFillLayer(layer, layerDescriptor, name);
2164 break;
2165 }
2166 case armnn::LayerType::Floor :
2167 {
2168 SerializeFloorLayer(layer, name);
2169 break;
2170 }
2171 case armnn::LayerType::FullyConnected :
2172 {
2173 const armnn::FullyConnectedDescriptor& layerDescriptor =
2174 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002175 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002176 break;
2177 }
2178 case armnn::LayerType::Gather :
2179 {
2180 const armnn::GatherDescriptor& layerDescriptor =
2181 static_cast<const armnn::GatherDescriptor&>(descriptor);
2182 SerializeGatherLayer(layer, layerDescriptor, name);
2183 break;
2184 }
2185 case armnn::LayerType::Input:
2186 {
2187 SerializeInputLayer(layer, id, name);
2188 break;
2189 }
2190 case armnn::LayerType::InstanceNormalization :
2191 {
2192 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2193 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2194 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2195 break;
2196 }
2197 case armnn::LayerType::L2Normalization :
2198 {
2199 const armnn::L2NormalizationDescriptor& layerDescriptor =
2200 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2201 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2202 break;
2203 }
2204 case armnn::LayerType::LogicalBinary :
2205 {
2206 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2207 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2208 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2209 break;
2210 }
2211 case armnn::LayerType::LogSoftmax :
2212 {
2213 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2214 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2215 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2216 break;
2217 }
2218 case armnn::LayerType::Lstm :
2219 {
2220 const armnn::LstmDescriptor& layerDescriptor =
2221 static_cast<const armnn::LstmDescriptor&>(descriptor);
2222 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2223 break;
2224 }
2225 case armnn::LayerType::QLstm :
2226 {
2227 const armnn::QLstmDescriptor& layerDescriptor =
2228 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2229 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2230 break;
2231 }
2232 case armnn::LayerType::Maximum :
2233 {
2234 SerializeMaximumLayer(layer, name);
2235 break;
2236 }
2237 case armnn::LayerType::Mean :
2238 {
2239 const armnn::MeanDescriptor& layerDescriptor =
2240 static_cast<const armnn::MeanDescriptor&>(descriptor);
2241 SerializeMeanLayer(layer, layerDescriptor, name);
2242 break;
2243 }
2244 case armnn::LayerType::Merge :
2245 {
2246 SerializeMergeLayer(layer, name);
2247 break;
2248 }
2249 case armnn::LayerType::Minimum :
2250 {
2251 SerializeMinimumLayer(layer, name);
2252 break;
2253 }
2254 case armnn::LayerType::Multiplication :
2255 {
2256 SerializeMultiplicationLayer(layer, name);
2257 break;
2258 }
2259 case armnn::LayerType::Normalization :
2260 {
2261 const armnn::NormalizationDescriptor& layerDescriptor =
2262 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2263 SerializeNormalizationLayer(layer, layerDescriptor, name);
2264 break;
2265 }
2266 case armnn::LayerType::Output:
2267 {
2268 SerializeOutputLayer(layer, id, name);
2269 break;
2270 }
2271 case armnn::LayerType::Pad :
2272 {
2273 const armnn::PadDescriptor& layerDescriptor =
2274 static_cast<const armnn::PadDescriptor&>(descriptor);
2275 SerializePadLayer(layer, layerDescriptor, name);
2276 break;
2277 }
2278 case armnn::LayerType::Permute :
2279 {
2280 const armnn::PermuteDescriptor& layerDescriptor =
2281 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2282 SerializePermuteLayer(layer, layerDescriptor, name);
2283 break;
2284 }
2285 case armnn::LayerType::Pooling2d :
2286 {
2287 const armnn::Pooling2dDescriptor& layerDescriptor =
2288 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2289 SerializePooling2dLayer(layer, layerDescriptor, name);
2290 break;
2291 }
2292 case armnn::LayerType::Prelu :
2293 {
2294 SerializePreluLayer(layer, name);
2295 break;
2296 }
2297 case armnn::LayerType::Quantize :
2298 {
2299 SerializeQuantizeLayer(layer, name);
2300 break;
2301 }
2302 case armnn::LayerType::QuantizedLstm:
2303 SerializeQuantizedLstmLayer(layer, constants, name);
2304 break;
2305 case armnn::LayerType::Reshape:
2306 {
2307 const armnn::ReshapeDescriptor &layerDescriptor =
2308 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2309 SerializeReshapeLayer(layer, layerDescriptor, name);
2310 break;
2311 }
2312 case armnn::LayerType::Rank:
2313 {
2314 SerializeRankLayer(layer, name);
2315 break;
2316 }
2317 case armnn::LayerType::Reduce:
2318 {
2319 const armnn::ReduceDescriptor& layerDescriptor =
2320 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2321 SerializeReduceLayer(layer, layerDescriptor, name);
2322 break;
2323 }
2324 case armnn::LayerType::Resize:
2325 {
2326 const armnn::ResizeDescriptor& layerDescriptor =
2327 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2328 SerializeResizeLayer(layer, layerDescriptor, name);
2329 break;
2330 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002331 case armnn::LayerType::Shape:
2332 {
2333 SerializeShapeLayer(layer, name);
2334 break;
2335 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002336 case armnn::LayerType::Slice:
2337 {
2338 const armnn::SliceDescriptor& layerDescriptor =
2339 static_cast<const armnn::SliceDescriptor&>(descriptor);
2340 SerializeSliceLayer(layer, layerDescriptor, name);
2341 break;
2342 }
2343 case armnn::LayerType::Softmax:
2344 {
2345 const armnn::SoftmaxDescriptor& layerDescriptor =
2346 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2347 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2348 break;
2349 }
2350 case armnn::LayerType::SpaceToBatchNd:
2351 {
2352 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2353 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2354 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2355 break;
2356 }
2357 case armnn::LayerType::SpaceToDepth:
2358 {
2359 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2360 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2361 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2362 break;
2363 }
2364 case armnn::LayerType::Splitter:
2365 {
2366 const armnn::SplitterDescriptor& layerDescriptor =
2367 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2368 SerializeSplitterLayer(layer, layerDescriptor, name);
2369 break;
2370 }
2371 case armnn::LayerType::Stack:
2372 {
2373 const armnn::StackDescriptor& layerDescriptor =
2374 static_cast<const armnn::StackDescriptor&>(descriptor);
2375 SerializeStackLayer(layer, layerDescriptor, name);
2376 break;
2377 }
2378 case armnn::LayerType::StandIn:
2379 {
2380 const armnn::StandInDescriptor& layerDescriptor =
2381 static_cast<const armnn::StandInDescriptor&>(descriptor);
2382 SerializeStandInLayer(layer, layerDescriptor, name);
2383 break;
2384 }
2385 case armnn::LayerType::StridedSlice:
2386 {
2387 const armnn::StridedSliceDescriptor& layerDescriptor =
2388 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2389 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2390 break;
2391 }
2392 case armnn::LayerType::Subtraction:
2393 {
2394 SerializeSubtractionLayer(layer, name);
2395 break;
2396 }
2397 case armnn::LayerType::Switch:
2398 {
2399 SerializeSwitchLayer(layer, name);
2400 break;
2401 }
2402 case armnn::LayerType::Transpose:
2403 {
2404 const armnn::TransposeDescriptor& layerDescriptor =
2405 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2406 SerializeTransposeLayer(layer, layerDescriptor, name);
2407 break;
2408 }
2409 case armnn::LayerType::TransposeConvolution2d:
2410 {
2411 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2412 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2413 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2414 break;
2415 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002416 case armnn::LayerType::UnidirectionalSequenceLstm :
2417 {
2418 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2419 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2420 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2421 break;
2422 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002423 default:
2424 {
2425 throw InvalidArgumentException(
2426 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2427 layer->GetName(),
2428 id));
2429 }
2430 }
2431}
2432
Finn Williams85d36712021-01-26 22:30:06 +00002433void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002434{
2435 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002436 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2437 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002438
2439 // Create FlatBuffer SerializedGraph
2440 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002441 fbBuilder,
2442 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2443 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2444 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2445 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002446
2447 // Serialize the graph
2448 fbBuilder.Finish(serializedGraph);
2449}
2450
Finn Williamsb454c5c2021-02-09 15:56:23 +00002451
Finn Williams85d36712021-01-26 22:30:06 +00002452bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002453{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002454 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002455
Matthew Sloyan0663d662020-09-14 11:47:26 +01002456 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002457 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002458 return !stream.bad();
2459}
2460
Finn Williams2605b232020-06-10 15:53:46 +01002461} // namespace armnnSerializer