blob: ffdac438862335df5a90ba30d97b9d63492af4ff [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Kevin Maye3cc7162024-02-26 09:12:23 +00002// Copyright © 2017,2019-2024 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;
Teresa Charlin077cddb2023-09-15 15:19:21 +010081 case armnn::ActivationFunction::Gelu:
82 return serializer::ActivationFunction::ActivationFunction_Gelu;
Mike Kellyaf484012019-02-20 16:53:11 +000083 default:
84 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
85 }
86}
87
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010088serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
89{
90 switch (function)
91 {
92 case armnn::ArgMinMaxFunction::Max:
93 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
94 case armnn::ArgMinMaxFunction::Min:
95 default:
96 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
97 }
98}
99
Kevin Maye3cc7162024-02-26 09:12:23 +0000100serializer::ScatterNdFunction GetFlatBufferScatterNdFunction(armnn::ScatterNdFunction function)
101{
102 switch (function)
103 {
104 case armnn::ScatterNdFunction::Update:
105 return serializer::ScatterNdFunction::ScatterNdFunction_Update;
106 case armnn::ScatterNdFunction::Add:
107 return serializer::ScatterNdFunction::ScatterNdFunction_Add;
108 case armnn::ScatterNdFunction::Sub:
109 return serializer::ScatterNdFunction::ScatterNdFunction_Sub;
110 case armnn::ScatterNdFunction::Max:
111 return serializer::ScatterNdFunction::ScatterNdFunction_Max;
112 case armnn::ScatterNdFunction::Min:
113 return serializer::ScatterNdFunction::ScatterNdFunction_Min;
114 default:
115 return serializer::ScatterNdFunction::ScatterNdFunction_Update;
116 }
117}
118
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000119uint32_t SerializerStrategy::GetSerializedId(LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000120{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000121 if (m_guidMap.empty())
122 {
janeil013fec1ea2019-11-07 09:47:20 +0000123 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000124 }
125 else if (m_guidMap.find(guid) == m_guidMap.end())
126 {
janeil013fec1ea2019-11-07 09:47:20 +0000127 ++m_layerId;
128 m_guidMap.insert(std::make_pair(guid, m_layerId));
129
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000130 return m_layerId;
131 }
Saoirse Stewart30211042019-02-18 17:19:16 +0000132 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000133}
134
Mike Kelly8c1701a2019-02-11 17:01:27 +0000135// Build FlatBuffer for Input Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000136void SerializerStrategy::SerializeInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000137{
Jan Eilers8eb25602020-03-09 12:13:48 +0000138 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000139
Mike Kelly8c1701a2019-02-11 17:01:27 +0000140 // Create FlatBuffer BaseLayer
141 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
142
143 // Create FlatBuffer BindableBaseLayer
144 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
145 flatBufferInputBaseLayer,
146 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000147 // Push layer binding id to outputIds.
148 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000149
150 // Create the FlatBuffer InputLayer
151 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
152
153 // Add the AnyLayer to the FlatBufferLayers
154 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
155}
156
157// Build FlatBuffer for Output Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000158void SerializerStrategy::SerializeOutputLayer(const armnn::IConnectableLayer* layer,
159 LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000160{
Jan Eilers8eb25602020-03-09 12:13:48 +0000161 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000162
Mike Kelly8c1701a2019-02-11 17:01:27 +0000163 // Create FlatBuffer BaseLayer
164 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
165
166 // Create FlatBuffer BindableBaseLayer
167 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
168 flatBufferOutputBaseLayer,
169 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000170 // Push layer binding id to outputIds.
171 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000172
173 // Create the FlatBuffer OutputLayer
174 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
175 // Add the AnyLayer to the FlatBufferLayers
176 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
177}
178
Mike Kellyaf484012019-02-20 16:53:11 +0000179// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000180void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
181 const armnn::ActivationDescriptor& descriptor,
182 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000183{
Jan Eilers8eb25602020-03-09 12:13:48 +0000184 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000185
Mike Kellyaf484012019-02-20 16:53:11 +0000186 // Create FlatBuffer BaseLayer
187 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
188
189 // Create the FlatBuffer ActivationDescriptor
190 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
191 GetFlatBufferActivationFunction(descriptor.m_Function),
192 descriptor.m_A,
193 descriptor.m_B);
194
195 // Create the FlatBuffer ActivationLayer
196 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
197 flatBufferBaseLayer,
198 flatBufferDescriptor);
199
200 // Add the AnyLayer to the FlatBufferLayers
201 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
202}
203
Mike Kelly8c1701a2019-02-11 17:01:27 +0000204// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000205void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000206{
Jan Eilers8eb25602020-03-09 12:13:48 +0000207 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000208
Mike Kelly8c1701a2019-02-11 17:01:27 +0000209 // Create FlatBuffer BaseLayer
210 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
211
212 // Create the FlatBuffer AdditionLayer
213 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
214
215 // Add the AnyLayer to the FlatBufferLayers
216 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
217}
218
Nikhil Rajee391d52019-09-05 17:50:44 +0100219// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000220void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
221 const armnn::ArgMinMaxDescriptor& descriptor,
222 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100223{
Jan Eilers8eb25602020-03-09 12:13:48 +0000224 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000225
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100226 // Create FlatBuffer BaseLayer
227 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
228
229 // Create FlatBuffer Descriptor
230 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
231 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
232 descriptor.m_Axis);
233
234 // Create FlatBuffer ArgMinMaxLayer
235 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
236 flatBufferBaseLayer,
237 flatBufferDescriptor);
238
239 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100240}
241
Samuel Yapa04f4a12022-08-19 11:14:38 +0100242void SerializerStrategy::SerializeBatchMatMulLayer(const armnn::IConnectableLayer* layer,
243 const armnn::BatchMatMulDescriptor& descriptor,
244 const char* name)
245{
246 IgnoreUnused(name);
247
248 // Create FlatBuffer BaseLayer
249 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchMatMul);
250
251 // Create the FlatBuffer BatchMatMulDescriptor
252 auto flatBufferDescriptor = CreateBatchMatMulDescriptor(m_flatBufferBuilder,
253 descriptor.m_TransposeX,
254 descriptor.m_TransposeY,
255 descriptor.m_AdjointX,
256 descriptor.m_AdjointY,
257 GetFlatBufferDataLayout(descriptor.m_DataLayoutX),
258 GetFlatBufferDataLayout(descriptor.m_DataLayoutY));
259
260 // Create the FlatBuffer BatchMatMulLayer
261 auto flatBufferBatchMatMulLayer = CreateBatchMatMulLayer(m_flatBufferBuilder,
262 flatBufferBaseLayer,
263 flatBufferDescriptor);
264
265 // Add the AnyLayer to the FlatBufferLayers
266 CreateAnyLayer(flatBufferBatchMatMulLayer.o, serializer::Layer::Layer_BatchMatMulLayer);
267}
268
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000269// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000270void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
271 const armnn::BatchToSpaceNdDescriptor& descriptor,
272 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000273{
Jan Eilers8eb25602020-03-09 12:13:48 +0000274 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000275
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000276 // Create FlatBuffer BaseLayer
277 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
278
279 std::vector<unsigned int> crops;
280 crops.reserve(descriptor.m_Crops.size() * 2);
281 for (auto& crop : descriptor.m_Crops)
282 {
283 crops.push_back(crop.first);
284 crops.push_back(crop.second);
285 }
286
287 auto flatBufferDescriptor =
288 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
289 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
290 m_flatBufferBuilder.CreateVector(crops),
291 GetFlatBufferDataLayout(descriptor.m_DataLayout));
292
293 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
294 flatBufferBaseLayer,
295 flatBufferDescriptor);
296
297 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
298}
299
Finn Williamsb454c5c2021-02-09 15:56:23 +0000300void SerializerStrategy::SerializeBatchNormalizationLayer(
301 const armnn::IConnectableLayer* layer,
302 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
303 const std::vector<armnn::ConstTensor>& constants,
304 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000305{
Jan Eilers8eb25602020-03-09 12:13:48 +0000306 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000307
Finn Williamsb454c5c2021-02-09 15:56:23 +0000308 const armnn::ConstTensor& mean = constants[0];
309 const armnn::ConstTensor& variance = constants[1];
310 const armnn::ConstTensor& beta = constants[2];
311 const armnn::ConstTensor& gamma = constants[3];
312
ruoyan018e7fa232019-02-28 15:09:07 +0000313 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
314 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
315 m_flatBufferBuilder,
316 batchNormDescriptor.m_Eps,
317 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
318
319 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
320 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
321 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
322 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
323 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
324 fbBatchNormalizationBaseLayer,
325 fbBatchNormalizationDescriptor,
326 fbMeanConstTensorInfo,
327 fbVarianceConstTensorInfo,
328 fbBetaConstTensorInfo,
329 fbGammaConstTensorInfo);
330
331 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
332}
333
mathad01b392e982021-04-07 12:07:30 +0100334void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
335 const char* name)
336{
337 IgnoreUnused(name);
338
339 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
340 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
341 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
342}
343
Simon Obute51f67772021-09-03 15:50:13 +0100344void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
345 const armnn::ChannelShuffleDescriptor& descriptor,
346 const char* name)
347{
348 IgnoreUnused(name);
349 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
350 descriptor.m_Axis,
351 descriptor.m_NumGroups);
352 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
353 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
354 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
355}
356
Finn Williamsb454c5c2021-02-09 15:56:23 +0000357void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100358 const armnn::ComparisonDescriptor& descriptor,
359 const char* name)
360{
Jan Eilers8eb25602020-03-09 12:13:48 +0000361 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000362
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100363 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
364 auto fbDescriptor = serializer::CreateComparisonDescriptor(
365 m_flatBufferBuilder,
366 GetFlatBufferComparisonOperation(descriptor.m_Operation));
367
368 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
369 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100370}
371
Conor Kennedy76277882019-02-26 08:29:54 +0000372// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000373void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
374 const std::vector<armnn::ConstTensor>& constants,
375 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000376{
Jan Eilers8eb25602020-03-09 12:13:48 +0000377 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000378
Finn Williamsb454c5c2021-02-09 15:56:23 +0000379 armnn::ConstTensor input = constants[0];
380
Conor Kennedy76277882019-02-26 08:29:54 +0000381 // Create FlatBuffer BaseLayer
382 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
383
384 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
385
386 // Create the FlatBuffer ConstantLayer
387 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
388 flatBufferConstantBaseLayer,
389 flatBufferConstTensorInfo);
390
391 // Add the AnyLayer to the FlatBufferLayers
392 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
393}
394
Mike Kellya0766c32019-02-19 17:22:07 +0000395// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000396void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
397 const armnn::Convolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000398 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000399{
Jan Eilers8eb25602020-03-09 12:13:48 +0000400 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000401
Mike Kellya0766c32019-02-19 17:22:07 +0000402 // Create FlatBuffer BaseLayer
403 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
404
405 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
406 descriptor.m_PadLeft,
407 descriptor.m_PadRight,
408 descriptor.m_PadTop,
409 descriptor.m_PadBottom,
410 descriptor.m_StrideX,
411 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100412 descriptor.m_DilationX,
413 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000414 descriptor.m_BiasEnabled,
415 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Mike Kellya0766c32019-02-19 17:22:07 +0000416
417 // Create the FlatBuffer Convolution2dLayer
418 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
419 flatBufferBaseLayer,
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100420 flatBufferDescriptor);
Mike Kellya0766c32019-02-19 17:22:07 +0000421
422 // Add the AnyLayer to the FlatBufferLayers
423 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
424}
425
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100426// Build FlatBuffer for Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100427void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
428 const armnn::Convolution3dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100429 const char* name)
430{
431 IgnoreUnused(name);
432
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100433 // Create FlatBuffer BaseLayer
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100434 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100435
436 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
437 descriptor.m_PadLeft,
438 descriptor.m_PadRight,
439 descriptor.m_PadTop,
440 descriptor.m_PadBottom,
441 descriptor.m_PadFront,
442 descriptor.m_PadBack,
443 descriptor.m_StrideX,
444 descriptor.m_StrideY,
445 descriptor.m_StrideZ,
446 descriptor.m_DilationX,
447 descriptor.m_DilationY,
448 descriptor.m_DilationZ,
449 descriptor.m_BiasEnabled,
450 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100451
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100452 // Create the FlatBuffer Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100453 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
454 flatBufferBaseLayer,
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100455 flatBufferDescriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100456
457 // Add the AnyLayer to the FlatBufferLayers
458 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
459}
460
Finn Williamsb454c5c2021-02-09 15:56:23 +0000461void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100462 const armnn::DepthToSpaceDescriptor& descriptor,
463 const char* name)
464{
Jan Eilers8eb25602020-03-09 12:13:48 +0000465 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000466
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100467 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
468 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
469 descriptor.m_BlockSize,
470 GetFlatBufferDataLayout(descriptor.m_DataLayout));
471
472 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
473
474 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100475}
476
Finn Williamsb454c5c2021-02-09 15:56:23 +0000477void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
478 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000479 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000480{
Jan Eilers8eb25602020-03-09 12:13:48 +0000481 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000482
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000483 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
484 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
485 descriptor.m_PadLeft,
486 descriptor.m_PadRight,
487 descriptor.m_PadTop,
488 descriptor.m_PadBottom,
489 descriptor.m_StrideX,
490 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100491 descriptor.m_DilationX,
492 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000493 descriptor.m_BiasEnabled,
494 GetFlatBufferDataLayout(descriptor.m_DataLayout));
495
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000496 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
497 fbBaseLayer,
Cathal Corbett06902652022-04-14 17:55:11 +0100498 fbDescriptor);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000499
500 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
501}
502
Finn Williamsb454c5c2021-02-09 15:56:23 +0000503void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000504 const char* name)
505{
Jan Eilers8eb25602020-03-09 12:13:48 +0000506 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000507
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000508 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
509 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
510
511 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
512}
513
Finn Williamsb454c5c2021-02-09 15:56:23 +0000514void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
515 const armnn::DetectionPostProcessDescriptor& descriptor,
516 const std::vector<armnn::ConstTensor>& constants,
517 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000518{
Jan Eilers8eb25602020-03-09 12:13:48 +0000519 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000520
Finn Williamsb454c5c2021-02-09 15:56:23 +0000521 const armnn::ConstTensor& anchors = constants[0];
522
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000523 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
524 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
525 descriptor.m_MaxDetections,
526 descriptor.m_MaxClassesPerDetection,
527 descriptor.m_DetectionsPerClass,
528 descriptor.m_NmsScoreThreshold,
529 descriptor.m_NmsIouThreshold,
530 descriptor.m_NumClasses,
531 descriptor.m_UseRegularNms,
532 descriptor.m_ScaleX,
533 descriptor.m_ScaleY,
534 descriptor.m_ScaleW,
535 descriptor.m_ScaleH);
536
537 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
538
539 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
540 fbBaseLayer,
541 fbDescriptor,
542 fbAnchorsConstTensorInfo);
543
544 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
545}
546
Finn Williamsb454c5c2021-02-09 15:56:23 +0000547void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000548{
Jan Eilers8eb25602020-03-09 12:13:48 +0000549 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000550
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000551 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
552 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000553
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000554 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
555}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000556
Mike Kelly3ec30772023-03-08 13:47:17 +0000557void SerializerStrategy::SerializeElementwiseBinaryLayer(const armnn::IConnectableLayer* layer,
558 const armnn::ElementwiseBinaryDescriptor& descriptor,
559 const char* name)
560{
561 IgnoreUnused(name);
562
563 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseBinary);
564 auto fbDescriptor = serializer::CreateElementwiseBinaryDescriptor(
565 m_flatBufferBuilder,
566 GetFlatBufferBinaryOperation(descriptor.m_Operation));
567
568 auto fbLayer = serializer::CreateElementwiseBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
569 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseBinaryLayer);
570}
571
Finn Williamsb454c5c2021-02-09 15:56:23 +0000572void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600573 const armnn::ElementwiseUnaryDescriptor& descriptor,
574 const char* name)
575{
Jan Eilers8eb25602020-03-09 12:13:48 +0000576 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600577
578 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
579 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
580 m_flatBufferBuilder,
581 GetFlatBufferUnaryOperation(descriptor.m_Operation));
582
583 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
584 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
585}
586
Finn Williamsb454c5c2021-02-09 15:56:23 +0000587void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100588 const armnn::FillDescriptor& fillDescriptor,
589 const char* name)
590{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100591 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100592
593 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
594
595 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
596
597 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
598
599 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100600}
601
Finn Williamsb454c5c2021-02-09 15:56:23 +0000602void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000603{
Jan Eilers8eb25602020-03-09 12:13:48 +0000604 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000605
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000606 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
607 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
608
609 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
610}
611
Finn Williamsb454c5c2021-02-09 15:56:23 +0000612void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100613 const armnn::GatherDescriptor& gatherDescriptor,
614 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000615{
Jan Eilers8eb25602020-03-09 12:13:48 +0000616 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000617
Teresa Charlin52664732020-06-29 16:27:03 +0100618 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
619 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000620 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100621 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000622
623 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
624}
625
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100626void SerializerStrategy::SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
627 const char* name)
628{
629 IgnoreUnused(name);
630
631 auto fbGatherNdBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_GatherNd);
632 auto flatBufferLayer = serializer::CreateGatherNdLayer(m_flatBufferBuilder, fbGatherNdBaseLayer);
633
634 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherNdLayer);
635}
636
Finn Williamsb454c5c2021-02-09 15:56:23 +0000637void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100638 const armnn::IConnectableLayer* layer,
639 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
640 const char* name)
641{
Jan Eilers8eb25602020-03-09 12:13:48 +0000642 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000643
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100644 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
645 m_flatBufferBuilder,
646 instanceNormalizationDescriptor.m_Gamma,
647 instanceNormalizationDescriptor.m_Beta,
648 instanceNormalizationDescriptor.m_Eps,
649 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
650
651 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
652 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
653
654 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100655}
656
Finn Williamsb454c5c2021-02-09 15:56:23 +0000657void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000658 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
659 const char* name)
660{
Jan Eilers8eb25602020-03-09 12:13:48 +0000661 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000662
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000663 // Create FlatBuffer BaseLayer
664 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
665
666 // Create the FlatBuffer L2Normalization Descriptor
667 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100668 m_flatBufferBuilder,
669 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
670 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000671
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100672 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000673 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
674
675 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
676}
677
Finn Williamsb454c5c2021-02-09 15:56:23 +0000678void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000679 const armnn::LogicalBinaryDescriptor& descriptor,
680 const char* name)
681{
682 IgnoreUnused(name);
683
684 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
685 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
686 m_flatBufferBuilder,
687 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
688
689 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
690 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
691}
692
Finn Williamsb454c5c2021-02-09 15:56:23 +0000693void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100694 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
695 const char* name)
696{
Jan Eilers8eb25602020-03-09 12:13:48 +0000697 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000698
Sadik Armagan26257852019-10-14 13:00:47 +0100699 // Create FlatBuffer BaseLayer
700 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
701
702 // Create the FlatBuffer LogSoftmaxDescriptor
703 auto flatBufferLogSoftmaxDesc =
704 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
705 logSoftmaxDescriptor.m_Beta,
706 logSoftmaxDescriptor.m_Axis);
707
708 // Create the FlatBuffer LogSoftmaxLayer
709 auto flatBufferLogSoftmaxLayer =
710 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
711 flatBufferLogSoftmaxBaseLayer,
712 flatBufferLogSoftmaxDesc);
713
714 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100715}
716
Finn Williamsb454c5c2021-02-09 15:56:23 +0000717void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
718 const armnn::LstmDescriptor& descriptor,
719 const std::vector<armnn::ConstTensor>& constants,
720 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000721{
Jan Eilers8eb25602020-03-09 12:13:48 +0000722 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000723
Jim Flynn11af3752019-03-19 17:22:29 +0000724 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
725
726 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
727 m_flatBufferBuilder,
728 descriptor.m_ActivationFunc,
729 descriptor.m_ClippingThresCell,
730 descriptor.m_ClippingThresProj,
731 descriptor.m_CifgEnabled,
732 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100733 descriptor.m_ProjectionEnabled,
734 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000735
Finn Williamsb454c5c2021-02-09 15:56:23 +0000736 // Index for constants vector
737 std::size_t i = 0;
738
739 // Get mandatory/basic input parameters
740 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
741 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
742 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
743 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
744 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
745 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
746 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
747 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
748 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
749
750
Jim Flynn11af3752019-03-19 17:22:29 +0000751
752 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
753 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
754 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
755 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
756 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
757 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
758 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
759 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
760 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100761 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
762 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
763 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
764 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000765
766 if (!descriptor.m_CifgEnabled)
767 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000768 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
769 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
770 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000771 }
772
773 if (descriptor.m_PeepholeEnabled)
774 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000775 if (!descriptor.m_CifgEnabled)
776 {
777 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
778 }
779 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
780 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
781 }
782
783 if (descriptor.m_ProjectionEnabled)
784 {
785 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
786 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000787 }
788
Jan Eilersf8c62972019-07-17 11:07:49 +0100789 if (descriptor.m_LayerNormEnabled)
790 {
791 if (!descriptor.m_CifgEnabled)
792 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000793 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100794 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000795 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
796 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
797 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100798 }
799
Jim Flynn11af3752019-03-19 17:22:29 +0000800 auto fbLstmParams = serializer::CreateLstmInputParams(
801 m_flatBufferBuilder,
802 inputToForgetWeights,
803 inputToCellWeights,
804 inputToOutputWeights,
805 recurrentToForgetWeights,
806 recurrentToCellWeights,
807 recurrentToOutputWeights,
808 forgetGateBias,
809 cellBias,
810 outputGateBias,
811 inputToInputWeights,
812 recurrentToInputWeights,
813 cellToInputWeights,
814 inputGateBias,
815 projectionWeights,
816 projectionBias,
817 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100818 cellToOutputWeights,
819 inputLayerNormWeights,
820 forgetLayerNormWeights,
821 cellLayerNormWeights,
822 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000823
824 auto fbLstmLayer = serializer::CreateLstmLayer(
825 m_flatBufferBuilder,
826 fbLstmBaseLayer,
827 fbLstmDescriptor,
828 fbLstmParams);
829
830 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
831}
832
Finn Williamsb454c5c2021-02-09 15:56:23 +0000833void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000834{
Jan Eilers8eb25602020-03-09 12:13:48 +0000835 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000836
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000837 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
838 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
839
840 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
841}
842
Finn Williamsb454c5c2021-02-09 15:56:23 +0000843void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000844 const armnn::MeanDescriptor& descriptor,
845 const char* name)
846{
Jan Eilers8eb25602020-03-09 12:13:48 +0000847 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000848
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000849 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
850 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
851 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
852 descriptor.m_KeepDims);
853
854 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
855 fbMeanBaseLayer,
856 fbMeanDescriptor);
857
858 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
859}
860
Finn Williamsb454c5c2021-02-09 15:56:23 +0000861void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000862{
Jan Eilers8eb25602020-03-09 12:13:48 +0000863 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000864
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000865 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
866 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
867
868 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
869}
870
Finn Williamsb454c5c2021-02-09 15:56:23 +0000871void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100872{
Jan Eilers8eb25602020-03-09 12:13:48 +0000873 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000874
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100875 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
876 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
877
878 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
879}
880
Finn Williamsb454c5c2021-02-09 15:56:23 +0000881void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100882 const armnn::ConcatDescriptor& concatDescriptor,
883 const char* name)
884{
Jan Eilers8eb25602020-03-09 12:13:48 +0000885 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000886
Jim Flynne242f2d2019-05-22 14:24:13 +0100887 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000888
889 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100890 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000891 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100892 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000893 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100894 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000895 {
896 origins.push_back(origin[d]);
897 }
898 auto view = m_flatBufferBuilder.CreateVector(origins);
899 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
900 views.push_back(uintVector);
901 }
902
Jim Flynne242f2d2019-05-22 14:24:13 +0100903 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
904 concatDescriptor.GetConcatAxis(),
905 concatDescriptor.GetNumViews(),
906 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000907 m_flatBufferBuilder.CreateVector(views));
908
Jim Flynne242f2d2019-05-22 14:24:13 +0100909 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
910 flatBufferConcatBaseLayer,
911 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000912
Jim Flynne242f2d2019-05-22 14:24:13 +0100913 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000914}
915
Finn Williamsb454c5c2021-02-09 15:56:23 +0000916void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000917{
Jan Eilers8eb25602020-03-09 12:13:48 +0000918 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000919
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000920 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
921 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
922 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000923
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000924 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000925}
926
Finn Williamsb454c5c2021-02-09 15:56:23 +0000927void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000928 const armnn::PadDescriptor& padDescriptor,
929 const char* name)
930{
Jan Eilers8eb25602020-03-09 12:13:48 +0000931 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000932
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000933 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
934
935 std::vector<unsigned int> padList;
936 for (auto& p: padDescriptor.m_PadList)
937 {
938 padList.push_back(p.first);
939 padList.push_back(p.second);
940 }
941
942 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100943 m_flatBufferBuilder.CreateVector(padList),
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +0100944 padDescriptor.m_PadValue,
945 GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000946
947 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
948 flatBufferBaseLayer,
949 flatBufferPadDesc);
950
951 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
952}
953
Finn Williamsb454c5c2021-02-09 15:56:23 +0000954void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000955 const armnn::PermuteDescriptor& permuteDescriptor,
956 const char* name)
957{
Jan Eilers8eb25602020-03-09 12:13:48 +0000958 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000959
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000960 // Create FlatBuffer BaseLayer
961 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
962
963 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100964 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000965 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100966 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000967 }
968
969 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
970 m_flatBufferBuilder.CreateVector(dimMappings));
971
972 // Create the FlatBuffer PermuteLayer
973 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
974 flatBufferPermuteBaseLayer,
975 flatBufferPermuteDesc);
976
977 // Add the AnyLayer to the FlatBufferLayers
978 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
979}
980
Finn Williams2605b232020-06-10 15:53:46 +0100981// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000982void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100983 const char* name)
984{
985 IgnoreUnused(name);
986 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
987 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
988
989 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
990}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000991
Finn Williamsb454c5c2021-02-09 15:56:23 +0000992void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
993 const armnn::ReduceDescriptor& reduceDescriptor,
994 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000995{
996 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
997 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000998 reduceDescriptor.m_KeepDims,
999 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
1000 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
1001 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
1002 fbReduceBaseLayer,
1003 fbDescriptor);
1004
1005 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
1006}
1007
Saoirse Stewart263829c2019-02-19 15:54:14 +00001008// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001009void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +00001010 const armnn::ReshapeDescriptor& reshapeDescriptor,
1011 const char* name)
1012{
Jan Eilers8eb25602020-03-09 12:13:48 +00001013 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001014
Saoirse Stewart263829c2019-02-19 15:54:14 +00001015 // Create FlatBuffer BaseLayer
1016 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
1017
1018 std::vector<unsigned int> targetShape;
1019 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
1020 {
1021 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
1022 }
1023
1024 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
1025 m_flatBufferBuilder.CreateVector(targetShape));
1026
1027 // Create the FlatBuffer ReshapeLayer
1028 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
1029 flatBufferReshapeDesc);
1030
1031 // Add the AnyLayer to the FlatBufferLayers
1032 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
1033}
1034
Finn Williamsb454c5c2021-02-09 15:56:23 +00001035void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +01001036 const armnn::ResizeDescriptor& resizeDescriptor,
1037 const char* name)
1038{
Jan Eilers8eb25602020-03-09 12:13:48 +00001039 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001040
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001041 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1042
1043 auto flatBufferDescriptor =
1044 CreateResizeDescriptor(m_flatBufferBuilder,
1045 resizeDescriptor.m_TargetHeight,
1046 resizeDescriptor.m_TargetWidth,
1047 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001048 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1049 resizeDescriptor.m_AlignCorners,
1050 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001051
1052 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1053 flatBufferBaseLayer,
1054 flatBufferDescriptor);
1055
1056 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001057}
1058
Tracy Narine944fb502023-07-04 15:08:57 +01001059void SerializerStrategy::SerializeReverseV2Layer(const armnn::IConnectableLayer* layer,
Tracy Narinebb8d7592023-07-13 16:50:54 +01001060 const char* name)
Tracy Narine944fb502023-07-04 15:08:57 +01001061{
1062 IgnoreUnused(name);
1063
1064 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ReverseV2);
1065
Tracy Narine944fb502023-07-04 15:08:57 +01001066 auto flatBufferLayer = serializer::CreateReverseV2Layer(m_flatBufferBuilder,
Tracy Narinebb8d7592023-07-13 16:50:54 +01001067 flatBufferBaseLayer);
Tracy Narine944fb502023-07-04 15:08:57 +01001068
1069 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ReverseV2Layer);
1070}
1071
Finn Williamsb454c5c2021-02-09 15:56:23 +00001072void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001073 const armnn::SliceDescriptor& sliceDescriptor,
1074 const char* name)
1075{
Jan Eilers8eb25602020-03-09 12:13:48 +00001076 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001077
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001078 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1079 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1080 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1081 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1082
1083 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1084
1085 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001086}
1087
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001088// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001089void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001090 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001091 const char* name)
1092{
Jan Eilers8eb25602020-03-09 12:13:48 +00001093 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001094
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001095 // Create FlatBuffer BaseLayer
1096 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1097
1098 // Create the FlatBuffer SoftmaxDescriptor
1099 auto flatBufferSoftmaxDesc =
Sadik Armaganfd0cae32021-11-08 17:18:31 +00001100 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder,
1101 softmaxDescriptor.m_Beta,
1102 softmaxDescriptor.m_Axis);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001103
1104 // Create the FlatBuffer SoftmaxLayer
1105 auto flatBufferSoftmaxLayer =
1106 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1107 flatBufferSoftmaxBaseLayer,
1108 flatBufferSoftmaxDesc);
1109
1110 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1111}
1112
Finn Williamsb454c5c2021-02-09 15:56:23 +00001113void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001114 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001115 const char* name)
1116{
Jan Eilers8eb25602020-03-09 12:13:48 +00001117 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001118
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001119 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1120 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1121 m_flatBufferBuilder,
1122 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1123 pooling2dDescriptor.m_PadLeft,
1124 pooling2dDescriptor.m_PadRight,
1125 pooling2dDescriptor.m_PadTop,
1126 pooling2dDescriptor.m_PadBottom,
1127 pooling2dDescriptor.m_PoolWidth,
1128 pooling2dDescriptor.m_PoolHeight,
1129 pooling2dDescriptor.m_StrideX,
1130 pooling2dDescriptor.m_StrideY,
1131 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1132 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1133 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1134
1135 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1136 fbPooling2dBaseLayer,
1137 fbPooling2dDescriptor);
1138
1139 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1140}
1141
Tamas Nyirid998a1c2021-11-05 14:55:33 +00001142void SerializerStrategy::SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
1143 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
1144 const char* name)
1145{
1146 IgnoreUnused(name);
1147
1148 auto fbPooling3dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling3d);
1149 auto fbPooling3dDescriptor = serializer::CreatePooling3dDescriptor(
1150 m_flatBufferBuilder,
1151 GetFlatBufferPoolingAlgorithm(pooling3dDescriptor.m_PoolType),
1152 pooling3dDescriptor.m_PadLeft,
1153 pooling3dDescriptor.m_PadRight,
1154 pooling3dDescriptor.m_PadTop,
1155 pooling3dDescriptor.m_PadBottom,
1156 pooling3dDescriptor.m_PadFront,
1157 pooling3dDescriptor.m_PadBack,
1158 pooling3dDescriptor.m_PoolWidth,
1159 pooling3dDescriptor.m_PoolHeight,
1160 pooling3dDescriptor.m_PoolDepth,
1161 pooling3dDescriptor.m_StrideX,
1162 pooling3dDescriptor.m_StrideY,
1163 pooling3dDescriptor.m_StrideZ,
1164 GetFlatBufferOutputShapeRounding(pooling3dDescriptor.m_OutputShapeRounding),
1165 GetFlatBufferPaddingMethod(pooling3dDescriptor.m_PaddingMethod),
1166 GetFlatBufferDataLayout(pooling3dDescriptor.m_DataLayout));
1167
1168 auto fbPooling3dLayer = serializer::CreatePooling3dLayer(m_flatBufferBuilder,
1169 fbPooling3dBaseLayer,
1170 fbPooling3dDescriptor);
1171
1172 CreateAnyLayer(fbPooling3dLayer.o, serializer::Layer::Layer_Pooling3dLayer);
1173}
1174
Finn Williamsb454c5c2021-02-09 15:56:23 +00001175void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001176 const char* name)
1177{
Jan Eilers8eb25602020-03-09 12:13:48 +00001178 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001179
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001180 // Create FlatBuffer BaseLayer
1181 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1182
1183 // Create the FlatBuffer AdditionLayer
1184 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1185
1186 // Add the AnyLayer to the FlatBufferLayers
1187 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001188}
1189
Finn Williamsb454c5c2021-02-09 15:56:23 +00001190void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001191{
Jan Eilers8eb25602020-03-09 12:13:48 +00001192 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001193
Derek Lamberti87acb272019-03-27 16:51:31 +00001194 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1195 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1196 fbQuantizeBaseLayer);
1197 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1198}
1199
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001200// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001201void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1202 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001203 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001204{
1205 // Create FlatBuffer BaseLayer
1206 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1207
1208 // Create FlatBuffer FullyConnectedDescriptor
1209 auto flatBufferDescriptor =
1210 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1211 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001212 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1213 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001214
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001215 // Create FlatBuffer FullyConnectedLayer
1216 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1217 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001218 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001219
1220 // Add created FullyConnectedLayer to the FlatBufferLayers
1221 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1222}
1223
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001224// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001225void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001226 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1227 const char* name)
1228{
Jan Eilers8eb25602020-03-09 12:13:48 +00001229 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001230
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001231 // Create FlatBuffer BaseLayer
1232 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1233
1234 std::vector<unsigned int> padList;
1235 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1236 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1237 {
1238 padList.push_back(pad.first);
1239 padList.push_back(pad.second);
1240 }
1241
1242 auto flatBufferDescriptor =
1243 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1244 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1245 m_flatBufferBuilder.CreateVector(padList),
1246 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1247
1248 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1249 flatBufferBaseLayer,
1250 flatBufferDescriptor);
1251
1252 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1253}
1254
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001255// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001256void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001257 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1258 const char* name)
1259{
Jan Eilers8eb25602020-03-09 12:13:48 +00001260 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001261
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001262 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1263 auto flatBufferDescriptor =
1264 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1265 spaceToDepthDescriptor.m_BlockSize,
1266 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1267
1268 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1269 flatBufferBaseLayer,
1270 flatBufferDescriptor);
1271
1272 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001273}
1274
Jim Flynn18ce3382019-03-08 11:08:30 +00001275// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001276void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001277 const armnn::ViewsDescriptor& viewsDescriptor,
1278 const char* name)
1279{
Jan Eilers8eb25602020-03-09 12:13:48 +00001280 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001281
Jim Flynn18ce3382019-03-08 11:08:30 +00001282 // Create FlatBuffer ViewOrigins
1283 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1284 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1285
1286 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1287 {
1288 std::vector<uint32_t> viewOrigin;
1289 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1290
1291 // Copy vector
1292 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1293 {
1294 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1295 }
1296
1297 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1298 m_flatBufferBuilder.CreateVector(viewOrigin)));
1299 }
1300
1301 // Create FlatBuffer OriginsDescriptor
1302 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1303 viewsDescriptor.GetOrigins().GetConcatAxis(),
1304 viewsDescriptor.GetOrigins().GetNumViews(),
1305 viewsDescriptor.GetOrigins().GetNumDimensions(),
1306 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1307
1308 // Create FlatBuffer ViewOrigins
1309 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1310 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1311
1312 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1313 {
1314 std::vector<uint32_t> viewSize;
1315 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1316
1317 // Copy vector
1318 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1319 {
1320 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1321 }
1322
1323 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1324 m_flatBufferBuilder.CreateVector(viewSize)));
1325 }
1326
1327 // Create FlatBuffer ViewsDescriptor
1328 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1329 flatBufferOriginDescriptor,
Mike Kelly363b5722023-10-11 14:25:50 +01001330 m_flatBufferBuilder.CreateVector(flatBufferViewSizes),
1331 viewsDescriptor.HasAxis(),
1332 viewsDescriptor.GetAxis());
Jim Flynn18ce3382019-03-08 11:08:30 +00001333
1334 // Create FlatBuffer BaseLayer
1335 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1336
1337 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1338 flatBufferBaseLayer,
1339 flatBufferViewsDescriptor);
1340
1341 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1342}
1343
Finn Williamsb454c5c2021-02-09 15:56:23 +00001344void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001345 const armnn::NormalizationDescriptor& descriptor,
1346 const char* name)
1347{
Jan Eilers8eb25602020-03-09 12:13:48 +00001348 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001349
Nina Drozd57728782019-02-27 10:53:27 +00001350 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1351
1352 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1353 m_flatBufferBuilder,
1354 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1355 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1356 descriptor.m_NormSize,
1357 descriptor.m_Alpha,
1358 descriptor.m_Beta,
1359 descriptor.m_K,
1360 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1361
1362 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1363 fbNormalizationBaseLayer,
1364 fbNormalizationDescriptor);
1365
1366 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1367}
1368
Kevin Maye3cc7162024-02-26 09:12:23 +00001369void SerializerStrategy::SerializeScatterNdLayer(const armnn::IConnectableLayer* layer,
1370 const armnn::ScatterNdDescriptor& descriptor,
1371 const char* name)
1372{
1373 IgnoreUnused(name);
1374
1375 // Create FlatBuffer BaseLayer
1376 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ScatterNd);
1377
1378 auto flatBufferDesc = serializer::CreateScatterNdDescriptor(
1379 m_flatBufferBuilder,
1380 GetFlatBufferScatterNdFunction(descriptor.m_Function),
1381 descriptor.m_InputEnabled,
1382 descriptor.m_Axis,
1383 descriptor.m_AxisEnabled);
1384
1385 // Create the FlatBuffer TileLayer
1386 auto flatBufferLayer = serializer::CreateScatterNdLayer(
1387 m_flatBufferBuilder,
1388 flatBufferBaseLayer,
1389 flatBufferDesc);
1390
1391 // Add the AnyLayer to the FlatBufferLayers
1392 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ScatterNdLayer);
1393}
1394
Keith Davis3ae3f972021-05-21 16:33:48 +01001395void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1396 const char* name)
1397{
1398 IgnoreUnused(name);
1399
1400 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1401 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1402
1403 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1404}
1405
Finn Williamsb454c5c2021-02-09 15:56:23 +00001406void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001407 const armnn::StackDescriptor& stackDescriptor,
1408 const char* name)
1409{
Jan Eilers8eb25602020-03-09 12:13:48 +00001410 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001411
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001412 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1413
1414 std::vector<unsigned int> inputShape;
1415 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1416 {
1417 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1418 }
1419
1420 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1421 stackDescriptor.m_Axis,
1422 stackDescriptor.m_NumInputs,
1423 m_flatBufferBuilder.CreateVector(inputShape));
1424
1425 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1426 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001427}
1428
Finn Williamsb454c5c2021-02-09 15:56:23 +00001429void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001430 const armnn::StandInDescriptor& standInDescriptor,
1431 const char *name)
1432{
Jan Eilers8eb25602020-03-09 12:13:48 +00001433 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001434
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001435 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1436 standInDescriptor.m_NumInputs,
1437 standInDescriptor.m_NumOutputs);
1438
1439 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1440 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1441
1442 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001443}
1444
Finn Williamsb454c5c2021-02-09 15:56:23 +00001445void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001446 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1447 const char* name)
1448{
Jan Eilers8eb25602020-03-09 12:13:48 +00001449 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001450
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001451 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1452
1453 auto flatBufferDescriptor =
1454 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1455 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1456 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1457 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1458 stridedSliceDescriptor.m_BeginMask,
1459 stridedSliceDescriptor.m_EndMask,
1460 stridedSliceDescriptor.m_ShrinkAxisMask,
1461 stridedSliceDescriptor.m_EllipsisMask,
1462 stridedSliceDescriptor.m_NewAxisMask,
1463 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1464
1465 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1466 flatBufferBaseLayer,
1467 flatBufferDescriptor);
1468
1469 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1470}
1471
Finn Williamsb454c5c2021-02-09 15:56:23 +00001472void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001473{
Jan Eilers8eb25602020-03-09 12:13:48 +00001474 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001475
Conor Kennedyda1f9752019-03-01 14:37:12 +00001476 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1477 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1478
1479 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1480}
1481
Finn Williamsb454c5c2021-02-09 15:56:23 +00001482void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001483{
Jan Eilers8eb25602020-03-09 12:13:48 +00001484 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001485
Sadik Armaganeff363d2019-04-05 15:25:46 +01001486 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1487 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1488
1489 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1490}
1491
David Monahan616b22f2023-07-25 12:08:10 +01001492void SerializerStrategy::SerializeTileLayer(const armnn::IConnectableLayer* layer,
1493 const armnn::TileDescriptor& descriptor,
1494 const char* name)
1495{
1496 IgnoreUnused(name);
1497
1498 // Create FlatBuffer BaseLayer
1499 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Tile);
1500
1501 auto flatBufferDesc = serializer::CreateTileDescriptor(m_flatBufferBuilder,
1502 m_flatBufferBuilder.CreateVector(descriptor.m_Multiples));
1503
1504 // Create the FlatBuffer TileLayer
1505 auto flatBufferLayer = serializer::CreateTileLayer(m_flatBufferBuilder,
1506 flatBufferBaseLayer,
1507 flatBufferDesc);
1508
1509 // Add the AnyLayer to the FlatBufferLayers
1510 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TileLayer);
1511}
1512
Finn Williamsb454c5c2021-02-09 15:56:23 +00001513void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001514 const armnn::IConnectableLayer* layer,
1515 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001516 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001517 const char* name)
1518{
Jan Eilers8eb25602020-03-09 12:13:48 +00001519 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001520
Finn Williamsb454c5c2021-02-09 15:56:23 +00001521 const armnn::ConstTensor& weights = constants.at(0);
1522
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001523 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1524 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1525 descriptor.m_PadLeft,
1526 descriptor.m_PadRight,
1527 descriptor.m_PadTop,
1528 descriptor.m_PadBottom,
1529 descriptor.m_StrideX,
1530 descriptor.m_StrideY,
1531 descriptor.m_BiasEnabled,
1532 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1533
1534 // weights & biases
1535 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1536 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001537 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001538 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001539 const armnn::ConstTensor& biases = constants.at(1);
1540 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001541 }
1542
1543 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1544 fbBaseLayer,
1545 fbDescriptor,
1546 fbWeightsConstTensorInfo,
1547 fbBiasesConstTensorInfo);
1548
1549 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001550}
1551
Finn Williamsb454c5c2021-02-09 15:56:23 +00001552void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001553 const armnn::TransposeDescriptor& descriptor,
1554 const char* name)
1555{
Jan Eilers8eb25602020-03-09 12:13:48 +00001556 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001557
1558 // Create FlatBuffer BaseLayer
1559 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1560
1561 std::vector<unsigned int> dimMappings;
1562 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1563 {
1564 dimMappings.push_back(descriptor.m_DimMappings[i]);
1565 }
1566
1567 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1568 m_flatBufferBuilder.CreateVector(dimMappings));
1569
1570 // Create the FlatBuffer TransposeLayer
1571 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1572 flatBufferBaseLayer,
1573 flatBufferDesc);
1574
1575 // Add the AnyLayer to the FlatBufferLayers
1576 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1577}
1578
Finn Williamsb454c5c2021-02-09 15:56:23 +00001579void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1580 const armnn::QLstmDescriptor& descriptor,
1581 const std::vector<armnn::ConstTensor>& constants,
1582 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001583{
James Conroy8d333182020-05-13 10:27:58 +01001584 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001585
James Conroy8d333182020-05-13 10:27:58 +01001586 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1587
1588 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1589 m_flatBufferBuilder,
1590 descriptor.m_CifgEnabled,
1591 descriptor.m_PeepholeEnabled,
1592 descriptor.m_ProjectionEnabled,
1593 descriptor.m_LayerNormEnabled,
1594 descriptor.m_CellClip,
1595 descriptor.m_ProjectionClip,
1596 descriptor.m_InputIntermediateScale,
1597 descriptor.m_ForgetIntermediateScale,
1598 descriptor.m_CellIntermediateScale,
1599 descriptor.m_OutputIntermediateScale,
1600 descriptor.m_HiddenStateZeroPoint,
1601 descriptor.m_HiddenStateScale
1602 );
1603
Finn Williamsb454c5c2021-02-09 15:56:23 +00001604 // Index for constants vector
1605 std::size_t i = 0;
1606
James Conroy8d333182020-05-13 10:27:58 +01001607 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001608 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1609 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1610 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1611 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1612 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1613 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1614 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1615 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1616 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001617
1618 // CIFG
1619 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1620 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1621 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1622
1623 if (!descriptor.m_CifgEnabled)
1624 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001625 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1626 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1627 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001628 }
1629
1630 // Peephole
1631 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1632 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1633 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1634
1635 if (descriptor.m_PeepholeEnabled)
1636 {
1637 if (!descriptor.m_CifgEnabled)
1638 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001639 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001640 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001641 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1642 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1643 }
James Conroy8d333182020-05-13 10:27:58 +01001644
Finn Williamsb454c5c2021-02-09 15:56:23 +00001645 // Projection
1646 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1647 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1648
1649 if (descriptor.m_ProjectionEnabled)
1650 {
1651 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1652 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001653 }
1654
1655 // Layer norm
1656 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1657 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1658 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1659 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1660
1661 if (descriptor.m_LayerNormEnabled)
1662 {
1663 if (!descriptor.m_CifgEnabled)
1664 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001665 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001666 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001667 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1668 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1669 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001670 }
1671
1672 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1673 m_flatBufferBuilder,
1674 inputToForgetWeights,
1675 inputToCellWeights,
1676 inputToOutputWeights,
1677 recurrentToForgetWeights,
1678 recurrentToCellWeights,
1679 recurrentToOutputWeights,
1680 forgetGateBias,
1681 cellBias,
1682 outputGateBias,
1683 inputToInputWeights,
1684 recurrentToInputWeights,
1685 inputGateBias,
1686 projectionWeights,
1687 projectionBias,
1688 cellToInputWeights,
1689 cellToForgetWeights,
1690 cellToOutputWeights,
1691 inputLayerNormWeights,
1692 forgetLayerNormWeights,
1693 cellLayerNormWeights,
1694 outputLayerNormWeights);
1695
1696 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1697 m_flatBufferBuilder,
1698 fbQLstmBaseLayer,
1699 fbQLstmDescriptor,
1700 fbQLstmParams);
1701
1702 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001703}
1704
Finn Williamsb454c5c2021-02-09 15:56:23 +00001705void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1706 const std::vector<armnn::ConstTensor>& constants,
1707 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001708{
Jan Eilers8eb25602020-03-09 12:13:48 +00001709 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001710
Jan Eilers5b01a892019-07-23 09:47:43 +01001711 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1712
Finn Williamsb454c5c2021-02-09 15:56:23 +00001713 // index for constants vector
1714 size_t i = 0;
1715
Jan Eilers5b01a892019-07-23 09:47:43 +01001716 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001717 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1718 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1719 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1720 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001721
Finn Williamsb454c5c2021-02-09 15:56:23 +00001722 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1723 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1724 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1725 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001726
Finn Williamsb454c5c2021-02-09 15:56:23 +00001727 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1728 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1729 auto cellBias = CreateConstTensorInfo(constants[i++]);
1730 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001731
1732 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1733 m_flatBufferBuilder,
1734 inputToInputWeights,
1735 inputToForgetWeights,
1736 inputToCellWeights,
1737 inputToOutputWeights,
1738 recurrentToInputWeights,
1739 recurrentToForgetWeights,
1740 recurrentToCellWeights,
1741 recurrentToOutputWeights,
1742 inputGateBias,
1743 forgetGateBias,
1744 cellBias,
1745 outputGateBias);
1746
1747 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1748 m_flatBufferBuilder,
1749 fbQuantizedLstmBaseLayer,
1750 fbQuantizedLstmParams);
1751
1752 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001753}
1754
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001755void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1756 const armnn::IConnectableLayer* layer,
1757 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1758 const std::vector<armnn::ConstTensor>& constants,
1759 const char* name)
1760{
1761 IgnoreUnused(name);
1762
1763 auto fbUnidirectionalSequenceLstmBaseLayer =
1764 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1765
1766 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1767 m_flatBufferBuilder,
1768 descriptor.m_ActivationFunc,
1769 descriptor.m_ClippingThresCell,
1770 descriptor.m_ClippingThresProj,
1771 descriptor.m_CifgEnabled,
1772 descriptor.m_PeepholeEnabled,
1773 descriptor.m_ProjectionEnabled,
1774 descriptor.m_LayerNormEnabled,
1775 descriptor.m_TimeMajor);
1776
1777 // Index for constants vector
1778 std::size_t i = 0;
1779
1780 // Get mandatory/basic input parameters
1781 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1782 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1783 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1784 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1785 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1786 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1787 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1788 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1789 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1790
1791 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1792 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1793 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1794 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1795 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1796 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1797 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1798 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1799 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1800 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1801 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1802 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1803 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1804
1805 if (!descriptor.m_CifgEnabled)
1806 {
1807 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1808 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1809 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1810 }
1811
1812 if (descriptor.m_PeepholeEnabled)
1813 {
1814 if (!descriptor.m_CifgEnabled)
1815 {
1816 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1817 }
1818 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1819 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1820 }
1821
1822 if (descriptor.m_ProjectionEnabled)
1823 {
1824 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1825 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1826 }
1827
1828 if (descriptor.m_LayerNormEnabled)
1829 {
1830 if (!descriptor.m_CifgEnabled)
1831 {
1832 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1833 }
1834 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1835 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1836 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1837 }
1838
1839 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1840 m_flatBufferBuilder,
1841 inputToForgetWeights,
1842 inputToCellWeights,
1843 inputToOutputWeights,
1844 recurrentToForgetWeights,
1845 recurrentToCellWeights,
1846 recurrentToOutputWeights,
1847 forgetGateBias,
1848 cellBias,
1849 outputGateBias,
1850 inputToInputWeights,
1851 recurrentToInputWeights,
1852 cellToInputWeights,
1853 inputGateBias,
1854 projectionWeights,
1855 projectionBias,
1856 cellToForgetWeights,
1857 cellToOutputWeights,
1858 inputLayerNormWeights,
1859 forgetLayerNormWeights,
1860 cellLayerNormWeights,
1861 outputLayerNormWeights);
1862
1863 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1864 m_flatBufferBuilder,
1865 fbUnidirectionalSequenceLstmBaseLayer,
1866 fbUnidirectionalSequenceLstmDescriptor,
1867 fbUnidirectionalSequenceLstmParams);
1868
1869 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1870}
1871
Finn Williamsb454c5c2021-02-09 15:56:23 +00001872fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001873 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001874{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001875
Sadik Armagandb059fd2019-03-20 12:28:32 +00001876 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1877
Mike Kelly8c1701a2019-02-11 17:01:27 +00001878 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1879 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1880
1881 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001882 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001883 m_flatBufferBuilder.CreateString(layer->GetName()),
1884 layerType,
1885 m_flatBufferBuilder.CreateVector(inputSlots),
1886 m_flatBufferBuilder.CreateVector(outputSlots));
1887}
1888
Finn Williamsb454c5c2021-02-09 15:56:23 +00001889void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001890{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001891
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001892 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001893 m_serializedLayers.push_back(anyLayer);
1894}
1895
Mike Kellya0766c32019-02-19 17:22:07 +00001896template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001897flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001898{
1899 const T* buffer = reinterpret_cast<const T*>(memory);
1900 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1901 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1902 return fbVector;
1903}
1904
Finn Williamsb454c5c2021-02-09 15:56:23 +00001905flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001906{
Mike Kellya0766c32019-02-19 17:22:07 +00001907 // Get the dimensions
1908 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001909 std::vector<bool> specificity;
1910 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1911 // matches the size of dimensions.
1912 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1913 {
1914 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001915
1916 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1917 {
1918 shape.push_back(tensorInfo.GetShape()[dim]);
1919 }
1920 else
1921 {
1922 shape.push_back(0);
1923 }
Colm Donelan800b2812021-02-12 12:43:35 +00001924 }
1925
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001926 if (tensorInfo.HasPerAxisQuantization())
1927 {
1928 // Create FlatBuffer TensorInfo
1929 auto flatBufferTensorInfo =
1930 serializer::CreateTensorInfo(m_flatBufferBuilder,
1931 m_flatBufferBuilder.CreateVector(shape),
1932 GetFlatBufferDataType(tensorInfo.GetDataType()),
1933 tensorInfo.GetQuantizationScales()[0],
1934 tensorInfo.GetQuantizationOffset(),
1935 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001936 tensorInfo.GetQuantizationDim().value(),
1937 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001938 (tensorInfo.GetShape().GetDimensionality()),
1939 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001940 return flatBufferTensorInfo;
1941 }
1942
Mike Kellya0766c32019-02-19 17:22:07 +00001943 // Create FlatBuffer TensorInfo
1944 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1945 m_flatBufferBuilder.CreateVector(shape),
1946 GetFlatBufferDataType(tensorInfo.GetDataType()),
1947 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001948 tensorInfo.GetQuantizationOffset(),
1949 0,
1950 0,
1951 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001952 (tensorInfo.GetShape().GetDimensionality()),
1953 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001954 return flatBufferTensorInfo;
1955}
1956
1957flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001958 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001959{
1960 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1961
Mike Kellya0766c32019-02-19 17:22:07 +00001962 flatbuffers::Offset<void> fbPayload;
1963
1964 switch (tensorInfo.GetDataType())
1965 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001966 case armnn::DataType::Signed64:
1967 {
1968 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1969 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1970 m_flatBufferBuilder,
1971 fbVector);
1972 fbPayload = flatBuffersData.o;
1973 break;
1974 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001975 case armnn::DataType::Float32:
1976 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001977 {
1978 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1979 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1980 m_flatBufferBuilder,
1981 fbVector);
1982 fbPayload = flatBuffersData.o;
1983 break;
1984 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001985 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001986 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001987 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001988 {
1989 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1990 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1991 m_flatBufferBuilder,
1992 fbVector);
1993 fbPayload = flatBuffersData.o;
1994 break;
1995 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001996 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001997 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001998 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001999 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00002000 default:
2001 {
2002 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
2003 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
2004 m_flatBufferBuilder,
2005 fbVector);
2006 fbPayload = flatBuffersData.o;
2007 }
2008 }
2009 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
2010 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00002011 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00002012 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
2013 fbPayload);
2014 return flatBufferConstTensor;
2015}
2016
Finn Williamsb454c5c2021-02-09 15:56:23 +00002017flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00002018{
2019 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
2020 serializer::CreateFeatureCompatibilityVersions(
2021 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01002022 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01002023 1, // Weights layout scheme version
2024 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00002025 );
2026 return versionsTable;
2027}
2028
Derek Lamberti0028d1b2019-02-20 13:57:42 +00002029std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00002030 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00002031{
Mike Kellya0766c32019-02-19 17:22:07 +00002032 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00002033
2034 // Get the InputSlots
2035 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
2036 {
2037 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
2038
2039 // Get the Connection for the InputSlot
2040 const IOutputSlot* connection = inputSlot.GetConnection();
Mike Kelly4cc341c2023-07-07 15:43:06 +01002041 bool isOverridden = inputSlot.IsTensorInfoOverridden();
2042
2043 flatbuffers::Offset<TensorInfo> overriddenTensorInfo = CreateTensorInfo(inputSlot.GetTensorInfo());
Mike Kelly8c1701a2019-02-11 17:01:27 +00002044
2045 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00002046 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
2047 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00002048 // Create FlatBuffer InputSlot
Mike Kelly4cc341c2023-07-07 15:43:06 +01002049 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn, isOverridden,
2050 overriddenTensorInfo));
Mike Kelly8c1701a2019-02-11 17:01:27 +00002051 }
2052 return inputSlots;
2053}
2054
Derek Lamberti0028d1b2019-02-20 13:57:42 +00002055std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00002056 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00002057{
2058 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
2059
2060 // Get the OutputSlots
2061 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
2062 {
2063 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00002064 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00002065
Mike Kelly8c1701a2019-02-11 17:01:27 +00002066 // Create FlatBuffer Outputslot
2067 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
2068 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00002069 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00002070 }
2071 return outputSlots;
2072}
2073
Finn Williamsb454c5c2021-02-09 15:56:23 +00002074void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
2075 const BaseDescriptor& descriptor,
2076 const std::vector<armnn::ConstTensor>& constants,
2077 const char* name,
2078 const armnn::LayerBindingId id)
2079{
2080 IgnoreUnused(constants);
2081
2082 switch (layer->GetType())
2083 {
2084 case armnn::LayerType::Activation :
2085 {
2086 const armnn::ActivationDescriptor& layerDescriptor =
2087 static_cast<const armnn::ActivationDescriptor&>(descriptor);
2088 SerializeActivationLayer(layer, layerDescriptor, name);
2089 break;
2090 }
2091 case armnn::LayerType::Addition :
2092 {
2093 SerializeAdditionLayer(layer, name);
2094 break;
2095 }
2096 case armnn::LayerType::ArgMinMax :
2097 {
2098 const armnn::ArgMinMaxDescriptor& layerDescriptor =
2099 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
2100 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
2101 break;
2102 }
Samuel Yapa04f4a12022-08-19 11:14:38 +01002103 case armnn::LayerType::BatchMatMul:
2104 {
2105 const armnn::BatchMatMulDescriptor& layerDescriptor =
2106 static_cast<const armnn::BatchMatMulDescriptor&>(descriptor);
2107 SerializeBatchMatMulLayer(layer,
2108 layerDescriptor,
2109 name);
2110 break;
2111 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002112 case armnn::LayerType::BatchNormalization :
2113 {
2114 const armnn::BatchNormalizationDescriptor& layerDescriptor =
2115 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
2116 SerializeBatchNormalizationLayer(layer,
2117 layerDescriptor,
2118 constants,
2119 name);
2120 break;
2121 }
2122 case armnn::LayerType::BatchToSpaceNd :
2123 {
2124 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2125 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2126 SerializeBatchToSpaceNdLayer(layer,
2127 layerDescriptor,
2128 name);
2129 break;
2130 }
mathad01b392e982021-04-07 12:07:30 +01002131 case armnn::LayerType::Cast :
2132 {
2133 SerializeCastLayer(layer, name);
2134 break;
2135 }
Simon Obute51f67772021-09-03 15:50:13 +01002136 case armnn::LayerType::ChannelShuffle :
2137 {
2138 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2139 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2140 SerializeChannelShuffleLayer(layer,
2141 layerDescriptor,
2142 name);
2143 break;
2144 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002145 case armnn::LayerType::Comparison :
2146 {
2147 const armnn::ComparisonDescriptor& layerDescriptor =
2148 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2149 SerializeComparisonLayer(layer,
2150 layerDescriptor,
2151 name);
2152 break;
2153 }
2154 case armnn::LayerType::Concat :
2155 {
2156 const armnn::ConcatDescriptor& layerDescriptor =
2157 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2158 SerializeConcatLayer(layer,
2159 layerDescriptor,
2160 name);
2161 break;
2162 }
2163 case armnn::LayerType::Constant :
2164 {
2165 SerializeConstantLayer(layer,
2166 constants,
2167 name);
2168 break;
2169 }
2170 case armnn::LayerType::Convolution2d :
2171 {
2172 const armnn::Convolution2dDescriptor& layerDescriptor =
2173 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2174 SerializeConvolution2dLayer(layer,
2175 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002176 name);
2177 break;
2178 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002179 case armnn::LayerType::Convolution3d :
2180 {
2181 const armnn::Convolution3dDescriptor& layerDescriptor =
2182 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2183 SerializeConvolution3dLayer(layer,
2184 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002185 name);
2186 break;
2187 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002188 case armnn::LayerType::DepthToSpace :
2189 {
2190 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2191 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2192 SerializeDepthToSpaceLayer(layer,
2193 layerDescriptor,
2194 name);
2195 break;
2196 }
2197 case armnn::LayerType::DepthwiseConvolution2d :
2198 {
2199 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2200 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2201 SerializeDepthwiseConvolution2dLayer(layer,
2202 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002203 name);
2204 break;
2205 }
2206 case armnn::LayerType::Dequantize :
2207 {
2208 SerializeDequantizeLayer(layer,
2209 name);
2210 break;
2211 }
2212 case armnn::LayerType::DetectionPostProcess :
2213 {
2214 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2215 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2216 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2217 break;
2218 }
2219 case armnn::LayerType::Division :
2220 {
2221 SerializeDivisionLayer(layer, name);
2222 break;
2223 }
Mike Kelly3ec30772023-03-08 13:47:17 +00002224 case armnn::LayerType::ElementwiseBinary :
2225 {
2226 const armnn::ElementwiseBinaryDescriptor& layerDescriptor =
2227 static_cast<const armnn::ElementwiseBinaryDescriptor&>(descriptor);
2228 SerializeElementwiseBinaryLayer(layer, layerDescriptor, name);
2229 break;
2230 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002231 case armnn::LayerType::ElementwiseUnary :
2232 {
2233 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2234 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2235 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2236 break;
2237 }
2238 case armnn::LayerType::Fill :
2239 {
2240 const armnn::FillDescriptor& layerDescriptor =
2241 static_cast<const armnn::FillDescriptor&>(descriptor);
2242 SerializeFillLayer(layer, layerDescriptor, name);
2243 break;
2244 }
2245 case armnn::LayerType::Floor :
2246 {
2247 SerializeFloorLayer(layer, name);
2248 break;
2249 }
2250 case armnn::LayerType::FullyConnected :
2251 {
2252 const armnn::FullyConnectedDescriptor& layerDescriptor =
2253 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002254 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002255 break;
2256 }
2257 case armnn::LayerType::Gather :
2258 {
2259 const armnn::GatherDescriptor& layerDescriptor =
2260 static_cast<const armnn::GatherDescriptor&>(descriptor);
2261 SerializeGatherLayer(layer, layerDescriptor, name);
2262 break;
2263 }
Teresa Charlin6966bfa2022-04-25 17:14:50 +01002264 case armnn::LayerType::GatherNd :
2265 {
2266 SerializeGatherNdLayer(layer, name);
2267 break;
2268 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002269 case armnn::LayerType::Input:
2270 {
2271 SerializeInputLayer(layer, id, name);
2272 break;
2273 }
2274 case armnn::LayerType::InstanceNormalization :
2275 {
2276 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2277 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2278 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2279 break;
2280 }
2281 case armnn::LayerType::L2Normalization :
2282 {
2283 const armnn::L2NormalizationDescriptor& layerDescriptor =
2284 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2285 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2286 break;
2287 }
2288 case armnn::LayerType::LogicalBinary :
2289 {
2290 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2291 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2292 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2293 break;
2294 }
2295 case armnn::LayerType::LogSoftmax :
2296 {
2297 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2298 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2299 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2300 break;
2301 }
2302 case armnn::LayerType::Lstm :
2303 {
2304 const armnn::LstmDescriptor& layerDescriptor =
2305 static_cast<const armnn::LstmDescriptor&>(descriptor);
2306 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2307 break;
2308 }
2309 case armnn::LayerType::QLstm :
2310 {
2311 const armnn::QLstmDescriptor& layerDescriptor =
2312 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2313 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2314 break;
2315 }
2316 case armnn::LayerType::Maximum :
2317 {
2318 SerializeMaximumLayer(layer, name);
2319 break;
2320 }
2321 case armnn::LayerType::Mean :
2322 {
2323 const armnn::MeanDescriptor& layerDescriptor =
2324 static_cast<const armnn::MeanDescriptor&>(descriptor);
2325 SerializeMeanLayer(layer, layerDescriptor, name);
2326 break;
2327 }
2328 case armnn::LayerType::Merge :
2329 {
2330 SerializeMergeLayer(layer, name);
2331 break;
2332 }
2333 case armnn::LayerType::Minimum :
2334 {
2335 SerializeMinimumLayer(layer, name);
2336 break;
2337 }
2338 case armnn::LayerType::Multiplication :
2339 {
2340 SerializeMultiplicationLayer(layer, name);
2341 break;
2342 }
2343 case armnn::LayerType::Normalization :
2344 {
2345 const armnn::NormalizationDescriptor& layerDescriptor =
2346 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2347 SerializeNormalizationLayer(layer, layerDescriptor, name);
2348 break;
2349 }
2350 case armnn::LayerType::Output:
2351 {
2352 SerializeOutputLayer(layer, id, name);
2353 break;
2354 }
2355 case armnn::LayerType::Pad :
2356 {
2357 const armnn::PadDescriptor& layerDescriptor =
2358 static_cast<const armnn::PadDescriptor&>(descriptor);
2359 SerializePadLayer(layer, layerDescriptor, name);
2360 break;
2361 }
2362 case armnn::LayerType::Permute :
2363 {
2364 const armnn::PermuteDescriptor& layerDescriptor =
2365 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2366 SerializePermuteLayer(layer, layerDescriptor, name);
2367 break;
2368 }
2369 case armnn::LayerType::Pooling2d :
2370 {
2371 const armnn::Pooling2dDescriptor& layerDescriptor =
2372 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2373 SerializePooling2dLayer(layer, layerDescriptor, name);
2374 break;
2375 }
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002376 case armnn::LayerType::Pooling3d :
2377 {
2378 const armnn::Pooling3dDescriptor& layerDescriptor =
2379 static_cast<const armnn::Pooling3dDescriptor&>(descriptor);
2380 SerializePooling3dLayer(layer, layerDescriptor, name);
2381 break;
2382 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002383 case armnn::LayerType::Prelu :
2384 {
2385 SerializePreluLayer(layer, name);
2386 break;
2387 }
2388 case armnn::LayerType::Quantize :
2389 {
2390 SerializeQuantizeLayer(layer, name);
2391 break;
2392 }
2393 case armnn::LayerType::QuantizedLstm:
2394 SerializeQuantizedLstmLayer(layer, constants, name);
2395 break;
2396 case armnn::LayerType::Reshape:
2397 {
2398 const armnn::ReshapeDescriptor &layerDescriptor =
2399 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2400 SerializeReshapeLayer(layer, layerDescriptor, name);
2401 break;
2402 }
2403 case armnn::LayerType::Rank:
2404 {
2405 SerializeRankLayer(layer, name);
2406 break;
2407 }
2408 case armnn::LayerType::Reduce:
2409 {
2410 const armnn::ReduceDescriptor& layerDescriptor =
2411 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2412 SerializeReduceLayer(layer, layerDescriptor, name);
2413 break;
2414 }
2415 case armnn::LayerType::Resize:
2416 {
2417 const armnn::ResizeDescriptor& layerDescriptor =
2418 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2419 SerializeResizeLayer(layer, layerDescriptor, name);
2420 break;
2421 }
Tracy Narine944fb502023-07-04 15:08:57 +01002422 case armnn::LayerType::ReverseV2:
2423 {
Tracy Narinebb8d7592023-07-13 16:50:54 +01002424 SerializeReverseV2Layer(layer, name);
Tracy Narine944fb502023-07-04 15:08:57 +01002425 break;
2426 }
Kevin Maye3cc7162024-02-26 09:12:23 +00002427 case armnn::LayerType::ScatterNd:
2428 {
2429 const armnn::ScatterNdDescriptor& layerDescriptor =
2430 static_cast<const armnn::ScatterNdDescriptor&>(descriptor);
2431 SerializeScatterNdLayer(layer, layerDescriptor, name);
2432 break;
2433 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002434 case armnn::LayerType::Shape:
2435 {
2436 SerializeShapeLayer(layer, name);
2437 break;
2438 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002439 case armnn::LayerType::Slice:
2440 {
2441 const armnn::SliceDescriptor& layerDescriptor =
2442 static_cast<const armnn::SliceDescriptor&>(descriptor);
2443 SerializeSliceLayer(layer, layerDescriptor, name);
2444 break;
2445 }
2446 case armnn::LayerType::Softmax:
2447 {
2448 const armnn::SoftmaxDescriptor& layerDescriptor =
2449 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2450 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2451 break;
2452 }
2453 case armnn::LayerType::SpaceToBatchNd:
2454 {
2455 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2456 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2457 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2458 break;
2459 }
2460 case armnn::LayerType::SpaceToDepth:
2461 {
2462 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2463 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2464 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2465 break;
2466 }
2467 case armnn::LayerType::Splitter:
2468 {
2469 const armnn::SplitterDescriptor& layerDescriptor =
2470 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2471 SerializeSplitterLayer(layer, layerDescriptor, name);
2472 break;
2473 }
2474 case armnn::LayerType::Stack:
2475 {
2476 const armnn::StackDescriptor& layerDescriptor =
2477 static_cast<const armnn::StackDescriptor&>(descriptor);
2478 SerializeStackLayer(layer, layerDescriptor, name);
2479 break;
2480 }
2481 case armnn::LayerType::StandIn:
2482 {
2483 const armnn::StandInDescriptor& layerDescriptor =
2484 static_cast<const armnn::StandInDescriptor&>(descriptor);
2485 SerializeStandInLayer(layer, layerDescriptor, name);
2486 break;
2487 }
2488 case armnn::LayerType::StridedSlice:
2489 {
2490 const armnn::StridedSliceDescriptor& layerDescriptor =
2491 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2492 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2493 break;
2494 }
2495 case armnn::LayerType::Subtraction:
2496 {
2497 SerializeSubtractionLayer(layer, name);
2498 break;
2499 }
2500 case armnn::LayerType::Switch:
2501 {
2502 SerializeSwitchLayer(layer, name);
2503 break;
2504 }
David Monahan616b22f2023-07-25 12:08:10 +01002505 case armnn::LayerType::Tile:
2506 {
2507 const armnn::TileDescriptor& layerDescriptor =
2508 static_cast<const armnn::TileDescriptor&>(descriptor);
2509 SerializeTileLayer(layer, layerDescriptor, name);
2510 break;
2511 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002512 case armnn::LayerType::Transpose:
2513 {
2514 const armnn::TransposeDescriptor& layerDescriptor =
2515 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2516 SerializeTransposeLayer(layer, layerDescriptor, name);
2517 break;
2518 }
2519 case armnn::LayerType::TransposeConvolution2d:
2520 {
2521 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2522 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2523 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2524 break;
2525 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002526 case armnn::LayerType::UnidirectionalSequenceLstm :
2527 {
2528 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2529 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2530 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2531 break;
2532 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002533 default:
2534 {
2535 throw InvalidArgumentException(
2536 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2537 layer->GetName(),
2538 id));
2539 }
2540 }
2541}
2542
Finn Williams85d36712021-01-26 22:30:06 +00002543void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002544{
2545 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002546 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2547 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002548
2549 // Create FlatBuffer SerializedGraph
2550 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002551 fbBuilder,
2552 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2553 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2554 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2555 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002556
2557 // Serialize the graph
2558 fbBuilder.Finish(serializedGraph);
2559}
2560
Finn Williamsb454c5c2021-02-09 15:56:23 +00002561
Finn Williams85d36712021-01-26 22:30:06 +00002562bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002563{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002564 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002565
Matthew Sloyan0663d662020-09-14 11:47:26 +01002566 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002567 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002568 return !stream.bad();
2569}
2570
Finn Williams2605b232020-06-10 15:53:46 +01002571} // namespace armnnSerializer