blob: c9a3022b8d97d83fabd0453610809ac5a9ece072 [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
Mike Kelly8c1701a2019-02-11 17:01:27 +00005#include "Serializer.hpp"
Finn Williamsb454c5c2021-02-09 15:56:23 +00006#include "SerializerUtils.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
Matthew Benthamff130e22020-01-17 11:47:42 +00008#include <armnn/Descriptors.hpp>
9#include <armnn/LstmParams.hpp>
10#include <armnn/QuantizedLstmParams.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000011#include <armnn/utility/IgnoreUnused.hpp>
Matthew Sloyan0663d662020-09-14 11:47:26 +010012#include <armnn/utility/NumericCast.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Finn Williamsb454c5c2021-02-09 15:56:23 +000014#include <fmt/format.h>
Mike Kelly8c1701a2019-02-11 17:01:27 +000015#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000016
Mike Kelly8c1701a2019-02-11 17:01:27 +000017using namespace armnn;
18namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000019namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000020
21namespace armnnSerializer
22{
23
Finn Williams85d36712021-01-26 22:30:06 +000024ISerializer::ISerializer() : pSerializerImpl(new SerializerImpl())
25{
26}
27
28ISerializer::~ISerializer() = default;
29
30ISerializer* ISerializer::CreateRaw()
31{
32 return new ISerializer();
33}
34
35ISerializerPtr ISerializer::Create()
36{
37 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
38}
39
40void ISerializer::Destroy(ISerializer* serializer)
41{
42 delete serializer;
43}
44
45void ISerializer::Serialize(const armnn::INetwork& inNetwork)
46{
47 pSerializerImpl->Serialize(inNetwork);
48}
49
50bool ISerializer::SaveSerializedToStream(std::ostream& stream)
51{
52 return pSerializerImpl->SaveSerializedToStream(stream);
53}
54
Mike Kellyaf484012019-02-20 16:53:11 +000055serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
56{
57 switch (function)
58 {
59 case armnn::ActivationFunction::Sigmoid:
60 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
61 case armnn::ActivationFunction::TanH:
62 return serializer::ActivationFunction::ActivationFunction_TanH;
63 case armnn::ActivationFunction::Linear:
64 return serializer::ActivationFunction::ActivationFunction_Linear;
65 case armnn::ActivationFunction::ReLu:
66 return serializer::ActivationFunction::ActivationFunction_ReLu;
67 case armnn::ActivationFunction::BoundedReLu:
68 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
69 case armnn::ActivationFunction::LeakyReLu:
70 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
71 case armnn::ActivationFunction::Abs:
72 return serializer::ActivationFunction::ActivationFunction_Abs;
73 case armnn::ActivationFunction::Sqrt:
74 return serializer::ActivationFunction::ActivationFunction_Sqrt;
75 case armnn::ActivationFunction::Square:
76 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000077 case armnn::ActivationFunction::Elu:
78 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000079 case armnn::ActivationFunction::HardSwish:
80 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Mike Kellyaf484012019-02-20 16:53:11 +000081 default:
82 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
83 }
84}
85
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010086serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
87{
88 switch (function)
89 {
90 case armnn::ArgMinMaxFunction::Max:
91 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
92 case armnn::ArgMinMaxFunction::Min:
93 default:
94 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
95 }
96}
97
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000098uint32_t SerializerStrategy::GetSerializedId(LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000099{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000100 if (m_guidMap.empty())
101 {
janeil013fec1ea2019-11-07 09:47:20 +0000102 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000103 }
104 else if (m_guidMap.find(guid) == m_guidMap.end())
105 {
janeil013fec1ea2019-11-07 09:47:20 +0000106 ++m_layerId;
107 m_guidMap.insert(std::make_pair(guid, m_layerId));
108
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000109 return m_layerId;
110 }
Saoirse Stewart30211042019-02-18 17:19:16 +0000111 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000112}
113
Mike Kelly8c1701a2019-02-11 17:01:27 +0000114// Build FlatBuffer for Input Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000115void SerializerStrategy::SerializeInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000116{
Jan Eilers8eb25602020-03-09 12:13:48 +0000117 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000118
Mike Kelly8c1701a2019-02-11 17:01:27 +0000119 // Create FlatBuffer BaseLayer
120 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
121
122 // Create FlatBuffer BindableBaseLayer
123 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
124 flatBufferInputBaseLayer,
125 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000126 // Push layer binding id to outputIds.
127 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000128
129 // Create the FlatBuffer InputLayer
130 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
131
132 // Add the AnyLayer to the FlatBufferLayers
133 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
134}
135
136// Build FlatBuffer for Output Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000137void SerializerStrategy::SerializeOutputLayer(const armnn::IConnectableLayer* layer,
138 LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000139{
Jan Eilers8eb25602020-03-09 12:13:48 +0000140 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000141
Mike Kelly8c1701a2019-02-11 17:01:27 +0000142 // Create FlatBuffer BaseLayer
143 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
144
145 // Create FlatBuffer BindableBaseLayer
146 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
147 flatBufferOutputBaseLayer,
148 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000149 // Push layer binding id to outputIds.
150 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000151
152 // Create the FlatBuffer OutputLayer
153 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
154 // Add the AnyLayer to the FlatBufferLayers
155 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
156}
157
Mike Kellyaf484012019-02-20 16:53:11 +0000158// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000159void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
160 const armnn::ActivationDescriptor& descriptor,
161 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000162{
Jan Eilers8eb25602020-03-09 12:13:48 +0000163 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000164
Mike Kellyaf484012019-02-20 16:53:11 +0000165 // Create FlatBuffer BaseLayer
166 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
167
168 // Create the FlatBuffer ActivationDescriptor
169 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
170 GetFlatBufferActivationFunction(descriptor.m_Function),
171 descriptor.m_A,
172 descriptor.m_B);
173
174 // Create the FlatBuffer ActivationLayer
175 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
176 flatBufferBaseLayer,
177 flatBufferDescriptor);
178
179 // Add the AnyLayer to the FlatBufferLayers
180 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
181}
182
Mike Kelly8c1701a2019-02-11 17:01:27 +0000183// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000184void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000185{
Jan Eilers8eb25602020-03-09 12:13:48 +0000186 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000187
Mike Kelly8c1701a2019-02-11 17:01:27 +0000188 // Create FlatBuffer BaseLayer
189 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
190
191 // Create the FlatBuffer AdditionLayer
192 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
193
194 // Add the AnyLayer to the FlatBufferLayers
195 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
196}
197
Nikhil Rajee391d52019-09-05 17:50:44 +0100198// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000199void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
200 const armnn::ArgMinMaxDescriptor& descriptor,
201 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100202{
Jan Eilers8eb25602020-03-09 12:13:48 +0000203 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000204
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100205 // Create FlatBuffer BaseLayer
206 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
207
208 // Create FlatBuffer Descriptor
209 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
210 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
211 descriptor.m_Axis);
212
213 // Create FlatBuffer ArgMinMaxLayer
214 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
215 flatBufferBaseLayer,
216 flatBufferDescriptor);
217
218 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100219}
220
Samuel Yapb9e6b5c2022-08-19 11:14:38 +0100221void SerializerStrategy::SerializeBatchMatMulLayer(const armnn::IConnectableLayer* layer,
222 const armnn::BatchMatMulDescriptor& descriptor,
223 const char* name)
224{
225 IgnoreUnused(name);
226
227 // Create FlatBuffer BaseLayer
228 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchMatMul);
229
230 // Create the FlatBuffer BatchMatMulDescriptor
231 auto flatBufferDescriptor = CreateBatchMatMulDescriptor(m_flatBufferBuilder,
232 descriptor.m_TransposeX,
233 descriptor.m_TransposeY,
234 descriptor.m_AdjointX,
235 descriptor.m_AdjointY,
236 GetFlatBufferDataLayout(descriptor.m_DataLayoutX),
237 GetFlatBufferDataLayout(descriptor.m_DataLayoutY));
238
239 // Create the FlatBuffer BatchMatMulLayer
240 auto flatBufferBatchMatMulLayer = CreateBatchMatMulLayer(m_flatBufferBuilder,
241 flatBufferBaseLayer,
242 flatBufferDescriptor);
243
244 // Add the AnyLayer to the FlatBufferLayers
245 CreateAnyLayer(flatBufferBatchMatMulLayer.o, serializer::Layer::Layer_BatchMatMulLayer);
246}
247
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000248// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000249void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
250 const armnn::BatchToSpaceNdDescriptor& descriptor,
251 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000252{
Jan Eilers8eb25602020-03-09 12:13:48 +0000253 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000254
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000255 // Create FlatBuffer BaseLayer
256 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
257
258 std::vector<unsigned int> crops;
259 crops.reserve(descriptor.m_Crops.size() * 2);
260 for (auto& crop : descriptor.m_Crops)
261 {
262 crops.push_back(crop.first);
263 crops.push_back(crop.second);
264 }
265
266 auto flatBufferDescriptor =
267 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
268 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
269 m_flatBufferBuilder.CreateVector(crops),
270 GetFlatBufferDataLayout(descriptor.m_DataLayout));
271
272 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
273 flatBufferBaseLayer,
274 flatBufferDescriptor);
275
276 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
277}
278
Finn Williamsb454c5c2021-02-09 15:56:23 +0000279void SerializerStrategy::SerializeBatchNormalizationLayer(
280 const armnn::IConnectableLayer* layer,
281 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
282 const std::vector<armnn::ConstTensor>& constants,
283 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000284{
Jan Eilers8eb25602020-03-09 12:13:48 +0000285 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000286
Finn Williamsb454c5c2021-02-09 15:56:23 +0000287 const armnn::ConstTensor& mean = constants[0];
288 const armnn::ConstTensor& variance = constants[1];
289 const armnn::ConstTensor& beta = constants[2];
290 const armnn::ConstTensor& gamma = constants[3];
291
ruoyan018e7fa232019-02-28 15:09:07 +0000292 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
293 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
294 m_flatBufferBuilder,
295 batchNormDescriptor.m_Eps,
296 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
297
298 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
299 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
300 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
301 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
302 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
303 fbBatchNormalizationBaseLayer,
304 fbBatchNormalizationDescriptor,
305 fbMeanConstTensorInfo,
306 fbVarianceConstTensorInfo,
307 fbBetaConstTensorInfo,
308 fbGammaConstTensorInfo);
309
310 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
311}
312
mathad01b392e982021-04-07 12:07:30 +0100313void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
314 const char* name)
315{
316 IgnoreUnused(name);
317
318 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
319 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
320 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
321}
322
Simon Obute51f67772021-09-03 15:50:13 +0100323void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
324 const armnn::ChannelShuffleDescriptor& descriptor,
325 const char* name)
326{
327 IgnoreUnused(name);
328 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
329 descriptor.m_Axis,
330 descriptor.m_NumGroups);
331 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
332 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
333 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
334}
335
Finn Williamsb454c5c2021-02-09 15:56:23 +0000336void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100337 const armnn::ComparisonDescriptor& descriptor,
338 const char* name)
339{
Jan Eilers8eb25602020-03-09 12:13:48 +0000340 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000341
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100342 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
343 auto fbDescriptor = serializer::CreateComparisonDescriptor(
344 m_flatBufferBuilder,
345 GetFlatBufferComparisonOperation(descriptor.m_Operation));
346
347 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
348 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100349}
350
Conor Kennedy76277882019-02-26 08:29:54 +0000351// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000352void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
353 const std::vector<armnn::ConstTensor>& constants,
354 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000355{
Jan Eilers8eb25602020-03-09 12:13:48 +0000356 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000357
Finn Williamsb454c5c2021-02-09 15:56:23 +0000358 armnn::ConstTensor input = constants[0];
359
Conor Kennedy76277882019-02-26 08:29:54 +0000360 // Create FlatBuffer BaseLayer
361 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
362
363 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
364
365 // Create the FlatBuffer ConstantLayer
366 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
367 flatBufferConstantBaseLayer,
368 flatBufferConstTensorInfo);
369
370 // Add the AnyLayer to the FlatBufferLayers
371 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
372}
373
Mike Kellya0766c32019-02-19 17:22:07 +0000374// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000375void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
376 const armnn::Convolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000377 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000378{
Jan Eilers8eb25602020-03-09 12:13:48 +0000379 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000380
Mike Kellya0766c32019-02-19 17:22:07 +0000381 // Create FlatBuffer BaseLayer
382 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
383
384 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
385 descriptor.m_PadLeft,
386 descriptor.m_PadRight,
387 descriptor.m_PadTop,
388 descriptor.m_PadBottom,
389 descriptor.m_StrideX,
390 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100391 descriptor.m_DilationX,
392 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000393 descriptor.m_BiasEnabled,
394 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Mike Kellya0766c32019-02-19 17:22:07 +0000395
396 // Create the FlatBuffer Convolution2dLayer
397 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
398 flatBufferBaseLayer,
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100399 flatBufferDescriptor);
Mike Kellya0766c32019-02-19 17:22:07 +0000400
401 // Add the AnyLayer to the FlatBufferLayers
402 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
403}
404
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100405// Build FlatBuffer for Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100406void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
407 const armnn::Convolution3dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100408 const char* name)
409{
410 IgnoreUnused(name);
411
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100412 // Create FlatBuffer BaseLayer
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100413 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100414
415 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
416 descriptor.m_PadLeft,
417 descriptor.m_PadRight,
418 descriptor.m_PadTop,
419 descriptor.m_PadBottom,
420 descriptor.m_PadFront,
421 descriptor.m_PadBack,
422 descriptor.m_StrideX,
423 descriptor.m_StrideY,
424 descriptor.m_StrideZ,
425 descriptor.m_DilationX,
426 descriptor.m_DilationY,
427 descriptor.m_DilationZ,
428 descriptor.m_BiasEnabled,
429 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100430
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100431 // Create the FlatBuffer Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100432 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
433 flatBufferBaseLayer,
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100434 flatBufferDescriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100435
436 // Add the AnyLayer to the FlatBufferLayers
437 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
438}
439
Finn Williamsb454c5c2021-02-09 15:56:23 +0000440void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100441 const armnn::DepthToSpaceDescriptor& descriptor,
442 const char* name)
443{
Jan Eilers8eb25602020-03-09 12:13:48 +0000444 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000445
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100446 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
447 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
448 descriptor.m_BlockSize,
449 GetFlatBufferDataLayout(descriptor.m_DataLayout));
450
451 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
452
453 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100454}
455
Finn Williamsb454c5c2021-02-09 15:56:23 +0000456void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
457 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000458 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000459{
Jan Eilers8eb25602020-03-09 12:13:48 +0000460 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000461
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000462 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
463 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
464 descriptor.m_PadLeft,
465 descriptor.m_PadRight,
466 descriptor.m_PadTop,
467 descriptor.m_PadBottom,
468 descriptor.m_StrideX,
469 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100470 descriptor.m_DilationX,
471 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000472 descriptor.m_BiasEnabled,
473 GetFlatBufferDataLayout(descriptor.m_DataLayout));
474
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000475 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
476 fbBaseLayer,
Cathal Corbett06902652022-04-14 17:55:11 +0100477 fbDescriptor);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000478
479 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
480}
481
Finn Williamsb454c5c2021-02-09 15:56:23 +0000482void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000483 const char* name)
484{
Jan Eilers8eb25602020-03-09 12:13:48 +0000485 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000486
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000487 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
488 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
489
490 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
491}
492
Finn Williamsb454c5c2021-02-09 15:56:23 +0000493void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
494 const armnn::DetectionPostProcessDescriptor& descriptor,
495 const std::vector<armnn::ConstTensor>& constants,
496 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000497{
Jan Eilers8eb25602020-03-09 12:13:48 +0000498 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000499
Finn Williamsb454c5c2021-02-09 15:56:23 +0000500 const armnn::ConstTensor& anchors = constants[0];
501
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000502 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
503 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
504 descriptor.m_MaxDetections,
505 descriptor.m_MaxClassesPerDetection,
506 descriptor.m_DetectionsPerClass,
507 descriptor.m_NmsScoreThreshold,
508 descriptor.m_NmsIouThreshold,
509 descriptor.m_NumClasses,
510 descriptor.m_UseRegularNms,
511 descriptor.m_ScaleX,
512 descriptor.m_ScaleY,
513 descriptor.m_ScaleW,
514 descriptor.m_ScaleH);
515
516 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
517
518 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
519 fbBaseLayer,
520 fbDescriptor,
521 fbAnchorsConstTensorInfo);
522
523 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
524}
525
Finn Williamsb454c5c2021-02-09 15:56:23 +0000526void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000527{
Jan Eilers8eb25602020-03-09 12:13:48 +0000528 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000529
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000530 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
531 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000532
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000533 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
534}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000535
Finn Williamsb454c5c2021-02-09 15:56:23 +0000536void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600537 const armnn::ElementwiseUnaryDescriptor& descriptor,
538 const char* name)
539{
Jan Eilers8eb25602020-03-09 12:13:48 +0000540 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600541
542 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
543 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
544 m_flatBufferBuilder,
545 GetFlatBufferUnaryOperation(descriptor.m_Operation));
546
547 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
548 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
549}
550
Finn Williamsb454c5c2021-02-09 15:56:23 +0000551void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100552 const armnn::FillDescriptor& fillDescriptor,
553 const char* name)
554{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100555 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100556
557 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
558
559 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
560
561 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
562
563 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100564}
565
Finn Williamsb454c5c2021-02-09 15:56:23 +0000566void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000567{
Jan Eilers8eb25602020-03-09 12:13:48 +0000568 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000569
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000570 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
571 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
572
573 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
574}
575
Finn Williamsb454c5c2021-02-09 15:56:23 +0000576void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100577 const armnn::GatherDescriptor& gatherDescriptor,
578 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000579{
Jan Eilers8eb25602020-03-09 12:13:48 +0000580 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000581
Teresa Charlin52664732020-06-29 16:27:03 +0100582 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
583 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000584 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100585 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000586
587 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
588}
589
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100590void SerializerStrategy::SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
591 const char* name)
592{
593 IgnoreUnused(name);
594
595 auto fbGatherNdBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_GatherNd);
596 auto flatBufferLayer = serializer::CreateGatherNdLayer(m_flatBufferBuilder, fbGatherNdBaseLayer);
597
598 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherNdLayer);
599}
600
Finn Williamsb454c5c2021-02-09 15:56:23 +0000601void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100602 const armnn::IConnectableLayer* layer,
603 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
604 const char* name)
605{
Jan Eilers8eb25602020-03-09 12:13:48 +0000606 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000607
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100608 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
609 m_flatBufferBuilder,
610 instanceNormalizationDescriptor.m_Gamma,
611 instanceNormalizationDescriptor.m_Beta,
612 instanceNormalizationDescriptor.m_Eps,
613 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
614
615 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
616 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
617
618 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100619}
620
Finn Williamsb454c5c2021-02-09 15:56:23 +0000621void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000622 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
623 const char* name)
624{
Jan Eilers8eb25602020-03-09 12:13:48 +0000625 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000626
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000627 // Create FlatBuffer BaseLayer
628 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
629
630 // Create the FlatBuffer L2Normalization Descriptor
631 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100632 m_flatBufferBuilder,
633 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
634 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000635
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100636 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000637 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
638
639 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
640}
641
Finn Williamsb454c5c2021-02-09 15:56:23 +0000642void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000643 const armnn::LogicalBinaryDescriptor& descriptor,
644 const char* name)
645{
646 IgnoreUnused(name);
647
648 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
649 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
650 m_flatBufferBuilder,
651 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
652
653 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
654 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
655}
656
Finn Williamsb454c5c2021-02-09 15:56:23 +0000657void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100658 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
659 const char* name)
660{
Jan Eilers8eb25602020-03-09 12:13:48 +0000661 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000662
Sadik Armagan26257852019-10-14 13:00:47 +0100663 // Create FlatBuffer BaseLayer
664 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
665
666 // Create the FlatBuffer LogSoftmaxDescriptor
667 auto flatBufferLogSoftmaxDesc =
668 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
669 logSoftmaxDescriptor.m_Beta,
670 logSoftmaxDescriptor.m_Axis);
671
672 // Create the FlatBuffer LogSoftmaxLayer
673 auto flatBufferLogSoftmaxLayer =
674 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
675 flatBufferLogSoftmaxBaseLayer,
676 flatBufferLogSoftmaxDesc);
677
678 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100679}
680
Finn Williamsb454c5c2021-02-09 15:56:23 +0000681void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
682 const armnn::LstmDescriptor& descriptor,
683 const std::vector<armnn::ConstTensor>& constants,
684 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000685{
Jan Eilers8eb25602020-03-09 12:13:48 +0000686 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000687
Jim Flynn11af3752019-03-19 17:22:29 +0000688 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
689
690 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
691 m_flatBufferBuilder,
692 descriptor.m_ActivationFunc,
693 descriptor.m_ClippingThresCell,
694 descriptor.m_ClippingThresProj,
695 descriptor.m_CifgEnabled,
696 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100697 descriptor.m_ProjectionEnabled,
698 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000699
Finn Williamsb454c5c2021-02-09 15:56:23 +0000700 // Index for constants vector
701 std::size_t i = 0;
702
703 // Get mandatory/basic input parameters
704 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
705 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
706 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
707 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
708 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
709 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
710 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
711 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
712 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
713
714
Jim Flynn11af3752019-03-19 17:22:29 +0000715
716 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
717 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
718 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
719 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
720 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
721 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
722 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
723 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
724 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100725 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
726 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
727 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
728 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000729
730 if (!descriptor.m_CifgEnabled)
731 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000732 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
733 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
734 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000735 }
736
737 if (descriptor.m_PeepholeEnabled)
738 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000739 if (!descriptor.m_CifgEnabled)
740 {
741 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
742 }
743 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
744 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
745 }
746
747 if (descriptor.m_ProjectionEnabled)
748 {
749 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
750 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000751 }
752
Jan Eilersf8c62972019-07-17 11:07:49 +0100753 if (descriptor.m_LayerNormEnabled)
754 {
755 if (!descriptor.m_CifgEnabled)
756 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000757 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100758 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000759 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
760 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
761 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100762 }
763
Jim Flynn11af3752019-03-19 17:22:29 +0000764 auto fbLstmParams = serializer::CreateLstmInputParams(
765 m_flatBufferBuilder,
766 inputToForgetWeights,
767 inputToCellWeights,
768 inputToOutputWeights,
769 recurrentToForgetWeights,
770 recurrentToCellWeights,
771 recurrentToOutputWeights,
772 forgetGateBias,
773 cellBias,
774 outputGateBias,
775 inputToInputWeights,
776 recurrentToInputWeights,
777 cellToInputWeights,
778 inputGateBias,
779 projectionWeights,
780 projectionBias,
781 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100782 cellToOutputWeights,
783 inputLayerNormWeights,
784 forgetLayerNormWeights,
785 cellLayerNormWeights,
786 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000787
788 auto fbLstmLayer = serializer::CreateLstmLayer(
789 m_flatBufferBuilder,
790 fbLstmBaseLayer,
791 fbLstmDescriptor,
792 fbLstmParams);
793
794 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
795}
796
Finn Williamsb454c5c2021-02-09 15:56:23 +0000797void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000798{
Jan Eilers8eb25602020-03-09 12:13:48 +0000799 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000800
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000801 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
802 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
803
804 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
805}
806
Finn Williamsb454c5c2021-02-09 15:56:23 +0000807void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000808 const armnn::MeanDescriptor& descriptor,
809 const char* name)
810{
Jan Eilers8eb25602020-03-09 12:13:48 +0000811 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000812
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000813 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
814 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
815 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
816 descriptor.m_KeepDims);
817
818 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
819 fbMeanBaseLayer,
820 fbMeanDescriptor);
821
822 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
823}
824
Finn Williamsb454c5c2021-02-09 15:56:23 +0000825void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000826{
Jan Eilers8eb25602020-03-09 12:13:48 +0000827 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000828
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000829 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
830 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
831
832 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
833}
834
Finn Williamsb454c5c2021-02-09 15:56:23 +0000835void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100836{
Jan Eilers8eb25602020-03-09 12:13:48 +0000837 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000838
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100839 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
840 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
841
842 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
843}
844
Finn Williamsb454c5c2021-02-09 15:56:23 +0000845void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100846 const armnn::ConcatDescriptor& concatDescriptor,
847 const char* name)
848{
Jan Eilers8eb25602020-03-09 12:13:48 +0000849 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000850
Jim Flynne242f2d2019-05-22 14:24:13 +0100851 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000852
853 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100854 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000855 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100856 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000857 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100858 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000859 {
860 origins.push_back(origin[d]);
861 }
862 auto view = m_flatBufferBuilder.CreateVector(origins);
863 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
864 views.push_back(uintVector);
865 }
866
Jim Flynne242f2d2019-05-22 14:24:13 +0100867 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
868 concatDescriptor.GetConcatAxis(),
869 concatDescriptor.GetNumViews(),
870 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000871 m_flatBufferBuilder.CreateVector(views));
872
Jim Flynne242f2d2019-05-22 14:24:13 +0100873 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
874 flatBufferConcatBaseLayer,
875 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000876
Jim Flynne242f2d2019-05-22 14:24:13 +0100877 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000878}
879
Finn Williamsb454c5c2021-02-09 15:56:23 +0000880void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000881{
Jan Eilers8eb25602020-03-09 12:13:48 +0000882 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000883
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000884 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
885 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
886 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000887
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000888 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000889}
890
Finn Williamsb454c5c2021-02-09 15:56:23 +0000891void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000892 const armnn::PadDescriptor& padDescriptor,
893 const char* name)
894{
Jan Eilers8eb25602020-03-09 12:13:48 +0000895 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000896
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000897 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
898
899 std::vector<unsigned int> padList;
900 for (auto& p: padDescriptor.m_PadList)
901 {
902 padList.push_back(p.first);
903 padList.push_back(p.second);
904 }
905
906 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100907 m_flatBufferBuilder.CreateVector(padList),
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +0100908 padDescriptor.m_PadValue,
909 GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000910
911 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
912 flatBufferBaseLayer,
913 flatBufferPadDesc);
914
915 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
916}
917
Finn Williamsb454c5c2021-02-09 15:56:23 +0000918void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000919 const armnn::PermuteDescriptor& permuteDescriptor,
920 const char* name)
921{
Jan Eilers8eb25602020-03-09 12:13:48 +0000922 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000923
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000924 // Create FlatBuffer BaseLayer
925 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
926
927 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100928 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000929 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100930 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000931 }
932
933 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
934 m_flatBufferBuilder.CreateVector(dimMappings));
935
936 // Create the FlatBuffer PermuteLayer
937 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
938 flatBufferPermuteBaseLayer,
939 flatBufferPermuteDesc);
940
941 // Add the AnyLayer to the FlatBufferLayers
942 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
943}
944
Finn Williams2605b232020-06-10 15:53:46 +0100945// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000946void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100947 const char* name)
948{
949 IgnoreUnused(name);
950 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
951 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
952
953 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
954}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000955
Finn Williamsb454c5c2021-02-09 15:56:23 +0000956void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
957 const armnn::ReduceDescriptor& reduceDescriptor,
958 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000959{
960 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
961 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000962 reduceDescriptor.m_KeepDims,
963 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
964 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
965 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
966 fbReduceBaseLayer,
967 fbDescriptor);
968
969 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
970}
971
Saoirse Stewart263829c2019-02-19 15:54:14 +0000972// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000973void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000974 const armnn::ReshapeDescriptor& reshapeDescriptor,
975 const char* name)
976{
Jan Eilers8eb25602020-03-09 12:13:48 +0000977 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000978
Saoirse Stewart263829c2019-02-19 15:54:14 +0000979 // Create FlatBuffer BaseLayer
980 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
981
982 std::vector<unsigned int> targetShape;
983 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
984 {
985 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
986 }
987
988 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
989 m_flatBufferBuilder.CreateVector(targetShape));
990
991 // Create the FlatBuffer ReshapeLayer
992 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
993 flatBufferReshapeDesc);
994
995 // Add the AnyLayer to the FlatBufferLayers
996 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
997}
998
Finn Williamsb454c5c2021-02-09 15:56:23 +0000999void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +01001000 const armnn::ResizeDescriptor& resizeDescriptor,
1001 const char* name)
1002{
Jan Eilers8eb25602020-03-09 12:13:48 +00001003 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001004
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001005 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1006
1007 auto flatBufferDescriptor =
1008 CreateResizeDescriptor(m_flatBufferBuilder,
1009 resizeDescriptor.m_TargetHeight,
1010 resizeDescriptor.m_TargetWidth,
1011 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001012 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1013 resizeDescriptor.m_AlignCorners,
1014 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001015
1016 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1017 flatBufferBaseLayer,
1018 flatBufferDescriptor);
1019
1020 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001021}
1022
Finn Williamsb454c5c2021-02-09 15:56:23 +00001023void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001024 const armnn::SliceDescriptor& sliceDescriptor,
1025 const char* name)
1026{
Jan Eilers8eb25602020-03-09 12:13:48 +00001027 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001028
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001029 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1030 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1031 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1032 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1033
1034 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1035
1036 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001037}
1038
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001039// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001040void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001041 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001042 const char* name)
1043{
Jan Eilers8eb25602020-03-09 12:13:48 +00001044 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001045
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001046 // Create FlatBuffer BaseLayer
1047 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1048
1049 // Create the FlatBuffer SoftmaxDescriptor
1050 auto flatBufferSoftmaxDesc =
Sadik Armaganfd0cae32021-11-08 17:18:31 +00001051 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder,
1052 softmaxDescriptor.m_Beta,
1053 softmaxDescriptor.m_Axis);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001054
1055 // Create the FlatBuffer SoftmaxLayer
1056 auto flatBufferSoftmaxLayer =
1057 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1058 flatBufferSoftmaxBaseLayer,
1059 flatBufferSoftmaxDesc);
1060
1061 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1062}
1063
Finn Williamsb454c5c2021-02-09 15:56:23 +00001064void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001065 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001066 const char* name)
1067{
Jan Eilers8eb25602020-03-09 12:13:48 +00001068 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001069
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001070 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1071 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1072 m_flatBufferBuilder,
1073 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1074 pooling2dDescriptor.m_PadLeft,
1075 pooling2dDescriptor.m_PadRight,
1076 pooling2dDescriptor.m_PadTop,
1077 pooling2dDescriptor.m_PadBottom,
1078 pooling2dDescriptor.m_PoolWidth,
1079 pooling2dDescriptor.m_PoolHeight,
1080 pooling2dDescriptor.m_StrideX,
1081 pooling2dDescriptor.m_StrideY,
1082 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1083 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1084 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1085
1086 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1087 fbPooling2dBaseLayer,
1088 fbPooling2dDescriptor);
1089
1090 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1091}
1092
Tamas Nyirid998a1c2021-11-05 14:55:33 +00001093void SerializerStrategy::SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
1094 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
1095 const char* name)
1096{
1097 IgnoreUnused(name);
1098
1099 auto fbPooling3dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling3d);
1100 auto fbPooling3dDescriptor = serializer::CreatePooling3dDescriptor(
1101 m_flatBufferBuilder,
1102 GetFlatBufferPoolingAlgorithm(pooling3dDescriptor.m_PoolType),
1103 pooling3dDescriptor.m_PadLeft,
1104 pooling3dDescriptor.m_PadRight,
1105 pooling3dDescriptor.m_PadTop,
1106 pooling3dDescriptor.m_PadBottom,
1107 pooling3dDescriptor.m_PadFront,
1108 pooling3dDescriptor.m_PadBack,
1109 pooling3dDescriptor.m_PoolWidth,
1110 pooling3dDescriptor.m_PoolHeight,
1111 pooling3dDescriptor.m_PoolDepth,
1112 pooling3dDescriptor.m_StrideX,
1113 pooling3dDescriptor.m_StrideY,
1114 pooling3dDescriptor.m_StrideZ,
1115 GetFlatBufferOutputShapeRounding(pooling3dDescriptor.m_OutputShapeRounding),
1116 GetFlatBufferPaddingMethod(pooling3dDescriptor.m_PaddingMethod),
1117 GetFlatBufferDataLayout(pooling3dDescriptor.m_DataLayout));
1118
1119 auto fbPooling3dLayer = serializer::CreatePooling3dLayer(m_flatBufferBuilder,
1120 fbPooling3dBaseLayer,
1121 fbPooling3dDescriptor);
1122
1123 CreateAnyLayer(fbPooling3dLayer.o, serializer::Layer::Layer_Pooling3dLayer);
1124}
1125
Finn Williamsb454c5c2021-02-09 15:56:23 +00001126void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001127 const char* name)
1128{
Jan Eilers8eb25602020-03-09 12:13:48 +00001129 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001130
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001131 // Create FlatBuffer BaseLayer
1132 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1133
1134 // Create the FlatBuffer AdditionLayer
1135 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1136
1137 // Add the AnyLayer to the FlatBufferLayers
1138 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001139}
1140
Finn Williamsb454c5c2021-02-09 15:56:23 +00001141void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001142{
Jan Eilers8eb25602020-03-09 12:13:48 +00001143 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001144
Derek Lamberti87acb272019-03-27 16:51:31 +00001145 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1146 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1147 fbQuantizeBaseLayer);
1148 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1149}
1150
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001151// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001152void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1153 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001154 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001155{
1156 // Create FlatBuffer BaseLayer
1157 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1158
1159 // Create FlatBuffer FullyConnectedDescriptor
1160 auto flatBufferDescriptor =
1161 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1162 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001163 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1164 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001165
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001166 // Create FlatBuffer FullyConnectedLayer
1167 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1168 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001169 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001170
1171 // Add created FullyConnectedLayer to the FlatBufferLayers
1172 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1173}
1174
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001175// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001176void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001177 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1178 const char* name)
1179{
Jan Eilers8eb25602020-03-09 12:13:48 +00001180 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001181
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001182 // Create FlatBuffer BaseLayer
1183 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1184
1185 std::vector<unsigned int> padList;
1186 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1187 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1188 {
1189 padList.push_back(pad.first);
1190 padList.push_back(pad.second);
1191 }
1192
1193 auto flatBufferDescriptor =
1194 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1195 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1196 m_flatBufferBuilder.CreateVector(padList),
1197 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1198
1199 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1200 flatBufferBaseLayer,
1201 flatBufferDescriptor);
1202
1203 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1204}
1205
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001206// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001207void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001208 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1209 const char* name)
1210{
Jan Eilers8eb25602020-03-09 12:13:48 +00001211 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001212
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001213 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1214 auto flatBufferDescriptor =
1215 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1216 spaceToDepthDescriptor.m_BlockSize,
1217 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1218
1219 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1220 flatBufferBaseLayer,
1221 flatBufferDescriptor);
1222
1223 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001224}
1225
Jim Flynn18ce3382019-03-08 11:08:30 +00001226// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001227void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001228 const armnn::ViewsDescriptor& viewsDescriptor,
1229 const char* name)
1230{
Jan Eilers8eb25602020-03-09 12:13:48 +00001231 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001232
Jim Flynn18ce3382019-03-08 11:08:30 +00001233 // Create FlatBuffer ViewOrigins
1234 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1235 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1236
1237 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1238 {
1239 std::vector<uint32_t> viewOrigin;
1240 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1241
1242 // Copy vector
1243 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1244 {
1245 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1246 }
1247
1248 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1249 m_flatBufferBuilder.CreateVector(viewOrigin)));
1250 }
1251
1252 // Create FlatBuffer OriginsDescriptor
1253 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1254 viewsDescriptor.GetOrigins().GetConcatAxis(),
1255 viewsDescriptor.GetOrigins().GetNumViews(),
1256 viewsDescriptor.GetOrigins().GetNumDimensions(),
1257 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1258
1259 // Create FlatBuffer ViewOrigins
1260 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1261 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1262
1263 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1264 {
1265 std::vector<uint32_t> viewSize;
1266 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1267
1268 // Copy vector
1269 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1270 {
1271 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1272 }
1273
1274 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1275 m_flatBufferBuilder.CreateVector(viewSize)));
1276 }
1277
1278 // Create FlatBuffer ViewsDescriptor
1279 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1280 flatBufferOriginDescriptor,
1281 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1282
1283 // Create FlatBuffer BaseLayer
1284 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1285
1286 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1287 flatBufferBaseLayer,
1288 flatBufferViewsDescriptor);
1289
1290 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1291}
1292
Finn Williamsb454c5c2021-02-09 15:56:23 +00001293void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001294 const armnn::NormalizationDescriptor& descriptor,
1295 const char* name)
1296{
Jan Eilers8eb25602020-03-09 12:13:48 +00001297 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001298
Nina Drozd57728782019-02-27 10:53:27 +00001299 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1300
1301 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1302 m_flatBufferBuilder,
1303 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1304 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1305 descriptor.m_NormSize,
1306 descriptor.m_Alpha,
1307 descriptor.m_Beta,
1308 descriptor.m_K,
1309 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1310
1311 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1312 fbNormalizationBaseLayer,
1313 fbNormalizationDescriptor);
1314
1315 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1316}
1317
Keith Davis3ae3f972021-05-21 16:33:48 +01001318void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1319 const char* name)
1320{
1321 IgnoreUnused(name);
1322
1323 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1324 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1325
1326 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1327}
1328
Finn Williamsb454c5c2021-02-09 15:56:23 +00001329void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001330 const armnn::StackDescriptor& stackDescriptor,
1331 const char* name)
1332{
Jan Eilers8eb25602020-03-09 12:13:48 +00001333 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001334
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001335 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1336
1337 std::vector<unsigned int> inputShape;
1338 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1339 {
1340 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1341 }
1342
1343 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1344 stackDescriptor.m_Axis,
1345 stackDescriptor.m_NumInputs,
1346 m_flatBufferBuilder.CreateVector(inputShape));
1347
1348 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1349 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001350}
1351
Finn Williamsb454c5c2021-02-09 15:56:23 +00001352void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001353 const armnn::StandInDescriptor& standInDescriptor,
1354 const char *name)
1355{
Jan Eilers8eb25602020-03-09 12:13:48 +00001356 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001357
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001358 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1359 standInDescriptor.m_NumInputs,
1360 standInDescriptor.m_NumOutputs);
1361
1362 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1363 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1364
1365 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001366}
1367
Finn Williamsb454c5c2021-02-09 15:56:23 +00001368void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001369 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1370 const char* name)
1371{
Jan Eilers8eb25602020-03-09 12:13:48 +00001372 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001373
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001374 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1375
1376 auto flatBufferDescriptor =
1377 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1378 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1379 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1380 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1381 stridedSliceDescriptor.m_BeginMask,
1382 stridedSliceDescriptor.m_EndMask,
1383 stridedSliceDescriptor.m_ShrinkAxisMask,
1384 stridedSliceDescriptor.m_EllipsisMask,
1385 stridedSliceDescriptor.m_NewAxisMask,
1386 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1387
1388 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1389 flatBufferBaseLayer,
1390 flatBufferDescriptor);
1391
1392 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1393}
1394
Finn Williamsb454c5c2021-02-09 15:56:23 +00001395void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001396{
Jan Eilers8eb25602020-03-09 12:13:48 +00001397 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001398
Conor Kennedyda1f9752019-03-01 14:37:12 +00001399 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1400 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1401
1402 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1403}
1404
Finn Williamsb454c5c2021-02-09 15:56:23 +00001405void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001406{
Jan Eilers8eb25602020-03-09 12:13:48 +00001407 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001408
Sadik Armaganeff363d2019-04-05 15:25:46 +01001409 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1410 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1411
1412 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1413}
1414
Finn Williamsb454c5c2021-02-09 15:56:23 +00001415void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001416 const armnn::IConnectableLayer* layer,
1417 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001418 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001419 const char* name)
1420{
Jan Eilers8eb25602020-03-09 12:13:48 +00001421 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001422
Finn Williamsb454c5c2021-02-09 15:56:23 +00001423 const armnn::ConstTensor& weights = constants.at(0);
1424
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001425 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1426 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1427 descriptor.m_PadLeft,
1428 descriptor.m_PadRight,
1429 descriptor.m_PadTop,
1430 descriptor.m_PadBottom,
1431 descriptor.m_StrideX,
1432 descriptor.m_StrideY,
1433 descriptor.m_BiasEnabled,
1434 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1435
1436 // weights & biases
1437 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1438 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001439 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001440 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001441 const armnn::ConstTensor& biases = constants.at(1);
1442 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001443 }
1444
1445 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1446 fbBaseLayer,
1447 fbDescriptor,
1448 fbWeightsConstTensorInfo,
1449 fbBiasesConstTensorInfo);
1450
1451 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001452}
1453
Finn Williamsb454c5c2021-02-09 15:56:23 +00001454void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001455 const armnn::TransposeDescriptor& descriptor,
1456 const char* name)
1457{
Jan Eilers8eb25602020-03-09 12:13:48 +00001458 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001459
1460 // Create FlatBuffer BaseLayer
1461 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1462
1463 std::vector<unsigned int> dimMappings;
1464 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1465 {
1466 dimMappings.push_back(descriptor.m_DimMappings[i]);
1467 }
1468
1469 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1470 m_flatBufferBuilder.CreateVector(dimMappings));
1471
1472 // Create the FlatBuffer TransposeLayer
1473 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1474 flatBufferBaseLayer,
1475 flatBufferDesc);
1476
1477 // Add the AnyLayer to the FlatBufferLayers
1478 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1479}
1480
Finn Williamsb454c5c2021-02-09 15:56:23 +00001481void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1482 const armnn::QLstmDescriptor& descriptor,
1483 const std::vector<armnn::ConstTensor>& constants,
1484 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001485{
James Conroy8d333182020-05-13 10:27:58 +01001486 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001487
James Conroy8d333182020-05-13 10:27:58 +01001488 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1489
1490 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1491 m_flatBufferBuilder,
1492 descriptor.m_CifgEnabled,
1493 descriptor.m_PeepholeEnabled,
1494 descriptor.m_ProjectionEnabled,
1495 descriptor.m_LayerNormEnabled,
1496 descriptor.m_CellClip,
1497 descriptor.m_ProjectionClip,
1498 descriptor.m_InputIntermediateScale,
1499 descriptor.m_ForgetIntermediateScale,
1500 descriptor.m_CellIntermediateScale,
1501 descriptor.m_OutputIntermediateScale,
1502 descriptor.m_HiddenStateZeroPoint,
1503 descriptor.m_HiddenStateScale
1504 );
1505
Finn Williamsb454c5c2021-02-09 15:56:23 +00001506 // Index for constants vector
1507 std::size_t i = 0;
1508
James Conroy8d333182020-05-13 10:27:58 +01001509 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001510 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1511 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1512 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1513 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1514 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1515 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1516 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1517 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1518 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001519
1520 // CIFG
1521 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1522 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1523 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1524
1525 if (!descriptor.m_CifgEnabled)
1526 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001527 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1528 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1529 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001530 }
1531
1532 // Peephole
1533 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1534 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1535 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1536
1537 if (descriptor.m_PeepholeEnabled)
1538 {
1539 if (!descriptor.m_CifgEnabled)
1540 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001541 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001542 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001543 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1544 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1545 }
James Conroy8d333182020-05-13 10:27:58 +01001546
Finn Williamsb454c5c2021-02-09 15:56:23 +00001547 // Projection
1548 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1549 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1550
1551 if (descriptor.m_ProjectionEnabled)
1552 {
1553 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1554 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001555 }
1556
1557 // Layer norm
1558 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1559 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1560 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1561 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1562
1563 if (descriptor.m_LayerNormEnabled)
1564 {
1565 if (!descriptor.m_CifgEnabled)
1566 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001567 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001568 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001569 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1570 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1571 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001572 }
1573
1574 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1575 m_flatBufferBuilder,
1576 inputToForgetWeights,
1577 inputToCellWeights,
1578 inputToOutputWeights,
1579 recurrentToForgetWeights,
1580 recurrentToCellWeights,
1581 recurrentToOutputWeights,
1582 forgetGateBias,
1583 cellBias,
1584 outputGateBias,
1585 inputToInputWeights,
1586 recurrentToInputWeights,
1587 inputGateBias,
1588 projectionWeights,
1589 projectionBias,
1590 cellToInputWeights,
1591 cellToForgetWeights,
1592 cellToOutputWeights,
1593 inputLayerNormWeights,
1594 forgetLayerNormWeights,
1595 cellLayerNormWeights,
1596 outputLayerNormWeights);
1597
1598 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1599 m_flatBufferBuilder,
1600 fbQLstmBaseLayer,
1601 fbQLstmDescriptor,
1602 fbQLstmParams);
1603
1604 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001605}
1606
Finn Williamsb454c5c2021-02-09 15:56:23 +00001607void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1608 const std::vector<armnn::ConstTensor>& constants,
1609 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001610{
Jan Eilers8eb25602020-03-09 12:13:48 +00001611 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001612
Jan Eilers5b01a892019-07-23 09:47:43 +01001613 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1614
Finn Williamsb454c5c2021-02-09 15:56:23 +00001615 // index for constants vector
1616 size_t i = 0;
1617
Jan Eilers5b01a892019-07-23 09:47:43 +01001618 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001619 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1620 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1621 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1622 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001623
Finn Williamsb454c5c2021-02-09 15:56:23 +00001624 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1625 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1626 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1627 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001628
Finn Williamsb454c5c2021-02-09 15:56:23 +00001629 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1630 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1631 auto cellBias = CreateConstTensorInfo(constants[i++]);
1632 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001633
1634 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1635 m_flatBufferBuilder,
1636 inputToInputWeights,
1637 inputToForgetWeights,
1638 inputToCellWeights,
1639 inputToOutputWeights,
1640 recurrentToInputWeights,
1641 recurrentToForgetWeights,
1642 recurrentToCellWeights,
1643 recurrentToOutputWeights,
1644 inputGateBias,
1645 forgetGateBias,
1646 cellBias,
1647 outputGateBias);
1648
1649 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1650 m_flatBufferBuilder,
1651 fbQuantizedLstmBaseLayer,
1652 fbQuantizedLstmParams);
1653
1654 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001655}
1656
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001657void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1658 const armnn::IConnectableLayer* layer,
1659 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1660 const std::vector<armnn::ConstTensor>& constants,
1661 const char* name)
1662{
1663 IgnoreUnused(name);
1664
1665 auto fbUnidirectionalSequenceLstmBaseLayer =
1666 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1667
1668 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1669 m_flatBufferBuilder,
1670 descriptor.m_ActivationFunc,
1671 descriptor.m_ClippingThresCell,
1672 descriptor.m_ClippingThresProj,
1673 descriptor.m_CifgEnabled,
1674 descriptor.m_PeepholeEnabled,
1675 descriptor.m_ProjectionEnabled,
1676 descriptor.m_LayerNormEnabled,
1677 descriptor.m_TimeMajor);
1678
1679 // Index for constants vector
1680 std::size_t i = 0;
1681
1682 // Get mandatory/basic input parameters
1683 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1684 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1685 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1686 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1687 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1688 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1689 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1690 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1691 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1692
1693 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1694 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1695 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1696 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1697 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1698 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1699 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1700 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1701 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1702 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1703 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1704 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1705 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1706
1707 if (!descriptor.m_CifgEnabled)
1708 {
1709 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1710 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1711 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1712 }
1713
1714 if (descriptor.m_PeepholeEnabled)
1715 {
1716 if (!descriptor.m_CifgEnabled)
1717 {
1718 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1719 }
1720 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1721 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1722 }
1723
1724 if (descriptor.m_ProjectionEnabled)
1725 {
1726 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1727 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1728 }
1729
1730 if (descriptor.m_LayerNormEnabled)
1731 {
1732 if (!descriptor.m_CifgEnabled)
1733 {
1734 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1735 }
1736 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1737 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1738 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1739 }
1740
1741 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1742 m_flatBufferBuilder,
1743 inputToForgetWeights,
1744 inputToCellWeights,
1745 inputToOutputWeights,
1746 recurrentToForgetWeights,
1747 recurrentToCellWeights,
1748 recurrentToOutputWeights,
1749 forgetGateBias,
1750 cellBias,
1751 outputGateBias,
1752 inputToInputWeights,
1753 recurrentToInputWeights,
1754 cellToInputWeights,
1755 inputGateBias,
1756 projectionWeights,
1757 projectionBias,
1758 cellToForgetWeights,
1759 cellToOutputWeights,
1760 inputLayerNormWeights,
1761 forgetLayerNormWeights,
1762 cellLayerNormWeights,
1763 outputLayerNormWeights);
1764
1765 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1766 m_flatBufferBuilder,
1767 fbUnidirectionalSequenceLstmBaseLayer,
1768 fbUnidirectionalSequenceLstmDescriptor,
1769 fbUnidirectionalSequenceLstmParams);
1770
1771 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1772}
1773
Finn Williamsb454c5c2021-02-09 15:56:23 +00001774fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001775 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001776{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001777
Sadik Armagandb059fd2019-03-20 12:28:32 +00001778 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1779
Mike Kelly8c1701a2019-02-11 17:01:27 +00001780 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1781 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1782
1783 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001784 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001785 m_flatBufferBuilder.CreateString(layer->GetName()),
1786 layerType,
1787 m_flatBufferBuilder.CreateVector(inputSlots),
1788 m_flatBufferBuilder.CreateVector(outputSlots));
1789}
1790
Finn Williamsb454c5c2021-02-09 15:56:23 +00001791void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001792{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001793
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001794 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001795 m_serializedLayers.push_back(anyLayer);
1796}
1797
Mike Kellya0766c32019-02-19 17:22:07 +00001798template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001799flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001800{
1801 const T* buffer = reinterpret_cast<const T*>(memory);
1802 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1803 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1804 return fbVector;
1805}
1806
Finn Williamsb454c5c2021-02-09 15:56:23 +00001807flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001808{
Mike Kellya0766c32019-02-19 17:22:07 +00001809 // Get the dimensions
1810 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001811 std::vector<bool> specificity;
1812 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1813 // matches the size of dimensions.
1814 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1815 {
1816 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001817
1818 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1819 {
1820 shape.push_back(tensorInfo.GetShape()[dim]);
1821 }
1822 else
1823 {
1824 shape.push_back(0);
1825 }
Colm Donelan800b2812021-02-12 12:43:35 +00001826 }
1827
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001828 if (tensorInfo.HasPerAxisQuantization())
1829 {
1830 // Create FlatBuffer TensorInfo
1831 auto flatBufferTensorInfo =
1832 serializer::CreateTensorInfo(m_flatBufferBuilder,
1833 m_flatBufferBuilder.CreateVector(shape),
1834 GetFlatBufferDataType(tensorInfo.GetDataType()),
1835 tensorInfo.GetQuantizationScales()[0],
1836 tensorInfo.GetQuantizationOffset(),
1837 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001838 tensorInfo.GetQuantizationDim().value(),
1839 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001840 (tensorInfo.GetShape().GetDimensionality()),
1841 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001842 return flatBufferTensorInfo;
1843 }
1844
Mike Kellya0766c32019-02-19 17:22:07 +00001845 // Create FlatBuffer TensorInfo
1846 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1847 m_flatBufferBuilder.CreateVector(shape),
1848 GetFlatBufferDataType(tensorInfo.GetDataType()),
1849 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001850 tensorInfo.GetQuantizationOffset(),
1851 0,
1852 0,
1853 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001854 (tensorInfo.GetShape().GetDimensionality()),
1855 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001856 return flatBufferTensorInfo;
1857}
1858
1859flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001860 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001861{
1862 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1863
Mike Kellya0766c32019-02-19 17:22:07 +00001864 flatbuffers::Offset<void> fbPayload;
1865
1866 switch (tensorInfo.GetDataType())
1867 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001868 case armnn::DataType::Signed64:
1869 {
1870 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1871 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1872 m_flatBufferBuilder,
1873 fbVector);
1874 fbPayload = flatBuffersData.o;
1875 break;
1876 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001877 case armnn::DataType::Float32:
1878 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001879 {
1880 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1881 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1882 m_flatBufferBuilder,
1883 fbVector);
1884 fbPayload = flatBuffersData.o;
1885 break;
1886 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001887 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001888 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001889 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001890 {
1891 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1892 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1893 m_flatBufferBuilder,
1894 fbVector);
1895 fbPayload = flatBuffersData.o;
1896 break;
1897 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001898 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001899 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001900 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001901 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001902 default:
1903 {
1904 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1905 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1906 m_flatBufferBuilder,
1907 fbVector);
1908 fbPayload = flatBuffersData.o;
1909 }
1910 }
1911 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1912 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001913 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001914 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1915 fbPayload);
1916 return flatBufferConstTensor;
1917}
1918
Finn Williamsb454c5c2021-02-09 15:56:23 +00001919flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001920{
1921 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1922 serializer::CreateFeatureCompatibilityVersions(
1923 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001924 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001925 1, // Weights layout scheme version
1926 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001927 );
1928 return versionsTable;
1929}
1930
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001931std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001932 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001933{
Mike Kellya0766c32019-02-19 17:22:07 +00001934 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001935
1936 // Get the InputSlots
1937 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1938 {
1939 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1940
1941 // Get the Connection for the InputSlot
1942 const IOutputSlot* connection = inputSlot.GetConnection();
1943
1944 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001945 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1946 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001947 // Create FlatBuffer InputSlot
1948 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1949 }
1950 return inputSlots;
1951}
1952
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001953std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001954 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001955{
1956 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1957
1958 // Get the OutputSlots
1959 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1960 {
1961 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001962 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001963
Mike Kelly8c1701a2019-02-11 17:01:27 +00001964 // Create FlatBuffer Outputslot
1965 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1966 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001967 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001968 }
1969 return outputSlots;
1970}
1971
Finn Williamsb454c5c2021-02-09 15:56:23 +00001972void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1973 const BaseDescriptor& descriptor,
1974 const std::vector<armnn::ConstTensor>& constants,
1975 const char* name,
1976 const armnn::LayerBindingId id)
1977{
1978 IgnoreUnused(constants);
1979
1980 switch (layer->GetType())
1981 {
1982 case armnn::LayerType::Activation :
1983 {
1984 const armnn::ActivationDescriptor& layerDescriptor =
1985 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1986 SerializeActivationLayer(layer, layerDescriptor, name);
1987 break;
1988 }
1989 case armnn::LayerType::Addition :
1990 {
1991 SerializeAdditionLayer(layer, name);
1992 break;
1993 }
1994 case armnn::LayerType::ArgMinMax :
1995 {
1996 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1997 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1998 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1999 break;
2000 }
Samuel Yapb9e6b5c2022-08-19 11:14:38 +01002001 case armnn::LayerType::BatchMatMul:
2002 {
2003 const armnn::BatchMatMulDescriptor& layerDescriptor =
2004 static_cast<const armnn::BatchMatMulDescriptor&>(descriptor);
2005 SerializeBatchMatMulLayer(layer,
2006 layerDescriptor,
2007 name);
2008 break;
2009 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002010 case armnn::LayerType::BatchNormalization :
2011 {
2012 const armnn::BatchNormalizationDescriptor& layerDescriptor =
2013 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
2014 SerializeBatchNormalizationLayer(layer,
2015 layerDescriptor,
2016 constants,
2017 name);
2018 break;
2019 }
2020 case armnn::LayerType::BatchToSpaceNd :
2021 {
2022 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2023 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2024 SerializeBatchToSpaceNdLayer(layer,
2025 layerDescriptor,
2026 name);
2027 break;
2028 }
mathad01b392e982021-04-07 12:07:30 +01002029 case armnn::LayerType::Cast :
2030 {
2031 SerializeCastLayer(layer, name);
2032 break;
2033 }
Simon Obute51f67772021-09-03 15:50:13 +01002034 case armnn::LayerType::ChannelShuffle :
2035 {
2036 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2037 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2038 SerializeChannelShuffleLayer(layer,
2039 layerDescriptor,
2040 name);
2041 break;
2042 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002043 case armnn::LayerType::Comparison :
2044 {
2045 const armnn::ComparisonDescriptor& layerDescriptor =
2046 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2047 SerializeComparisonLayer(layer,
2048 layerDescriptor,
2049 name);
2050 break;
2051 }
2052 case armnn::LayerType::Concat :
2053 {
2054 const armnn::ConcatDescriptor& layerDescriptor =
2055 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2056 SerializeConcatLayer(layer,
2057 layerDescriptor,
2058 name);
2059 break;
2060 }
2061 case armnn::LayerType::Constant :
2062 {
2063 SerializeConstantLayer(layer,
2064 constants,
2065 name);
2066 break;
2067 }
2068 case armnn::LayerType::Convolution2d :
2069 {
2070 const armnn::Convolution2dDescriptor& layerDescriptor =
2071 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2072 SerializeConvolution2dLayer(layer,
2073 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002074 name);
2075 break;
2076 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002077 case armnn::LayerType::Convolution3d :
2078 {
2079 const armnn::Convolution3dDescriptor& layerDescriptor =
2080 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2081 SerializeConvolution3dLayer(layer,
2082 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002083 name);
2084 break;
2085 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002086 case armnn::LayerType::DepthToSpace :
2087 {
2088 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2089 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2090 SerializeDepthToSpaceLayer(layer,
2091 layerDescriptor,
2092 name);
2093 break;
2094 }
2095 case armnn::LayerType::DepthwiseConvolution2d :
2096 {
2097 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2098 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2099 SerializeDepthwiseConvolution2dLayer(layer,
2100 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002101 name);
2102 break;
2103 }
2104 case armnn::LayerType::Dequantize :
2105 {
2106 SerializeDequantizeLayer(layer,
2107 name);
2108 break;
2109 }
2110 case armnn::LayerType::DetectionPostProcess :
2111 {
2112 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2113 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2114 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2115 break;
2116 }
2117 case armnn::LayerType::Division :
2118 {
2119 SerializeDivisionLayer(layer, name);
2120 break;
2121 }
2122 case armnn::LayerType::ElementwiseUnary :
2123 {
2124 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2125 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2126 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2127 break;
2128 }
2129 case armnn::LayerType::Fill :
2130 {
2131 const armnn::FillDescriptor& layerDescriptor =
2132 static_cast<const armnn::FillDescriptor&>(descriptor);
2133 SerializeFillLayer(layer, layerDescriptor, name);
2134 break;
2135 }
2136 case armnn::LayerType::Floor :
2137 {
2138 SerializeFloorLayer(layer, name);
2139 break;
2140 }
2141 case armnn::LayerType::FullyConnected :
2142 {
2143 const armnn::FullyConnectedDescriptor& layerDescriptor =
2144 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002145 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002146 break;
2147 }
2148 case armnn::LayerType::Gather :
2149 {
2150 const armnn::GatherDescriptor& layerDescriptor =
2151 static_cast<const armnn::GatherDescriptor&>(descriptor);
2152 SerializeGatherLayer(layer, layerDescriptor, name);
2153 break;
2154 }
Teresa Charlin6966bfa2022-04-25 17:14:50 +01002155 case armnn::LayerType::GatherNd :
2156 {
2157 SerializeGatherNdLayer(layer, name);
2158 break;
2159 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002160 case armnn::LayerType::Input:
2161 {
2162 SerializeInputLayer(layer, id, name);
2163 break;
2164 }
2165 case armnn::LayerType::InstanceNormalization :
2166 {
2167 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2168 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2169 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2170 break;
2171 }
2172 case armnn::LayerType::L2Normalization :
2173 {
2174 const armnn::L2NormalizationDescriptor& layerDescriptor =
2175 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2176 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2177 break;
2178 }
2179 case armnn::LayerType::LogicalBinary :
2180 {
2181 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2182 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2183 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2184 break;
2185 }
2186 case armnn::LayerType::LogSoftmax :
2187 {
2188 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2189 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2190 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2191 break;
2192 }
2193 case armnn::LayerType::Lstm :
2194 {
2195 const armnn::LstmDescriptor& layerDescriptor =
2196 static_cast<const armnn::LstmDescriptor&>(descriptor);
2197 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2198 break;
2199 }
2200 case armnn::LayerType::QLstm :
2201 {
2202 const armnn::QLstmDescriptor& layerDescriptor =
2203 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2204 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2205 break;
2206 }
2207 case armnn::LayerType::Maximum :
2208 {
2209 SerializeMaximumLayer(layer, name);
2210 break;
2211 }
2212 case armnn::LayerType::Mean :
2213 {
2214 const armnn::MeanDescriptor& layerDescriptor =
2215 static_cast<const armnn::MeanDescriptor&>(descriptor);
2216 SerializeMeanLayer(layer, layerDescriptor, name);
2217 break;
2218 }
2219 case armnn::LayerType::Merge :
2220 {
2221 SerializeMergeLayer(layer, name);
2222 break;
2223 }
2224 case armnn::LayerType::Minimum :
2225 {
2226 SerializeMinimumLayer(layer, name);
2227 break;
2228 }
2229 case armnn::LayerType::Multiplication :
2230 {
2231 SerializeMultiplicationLayer(layer, name);
2232 break;
2233 }
2234 case armnn::LayerType::Normalization :
2235 {
2236 const armnn::NormalizationDescriptor& layerDescriptor =
2237 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2238 SerializeNormalizationLayer(layer, layerDescriptor, name);
2239 break;
2240 }
2241 case armnn::LayerType::Output:
2242 {
2243 SerializeOutputLayer(layer, id, name);
2244 break;
2245 }
2246 case armnn::LayerType::Pad :
2247 {
2248 const armnn::PadDescriptor& layerDescriptor =
2249 static_cast<const armnn::PadDescriptor&>(descriptor);
2250 SerializePadLayer(layer, layerDescriptor, name);
2251 break;
2252 }
2253 case armnn::LayerType::Permute :
2254 {
2255 const armnn::PermuteDescriptor& layerDescriptor =
2256 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2257 SerializePermuteLayer(layer, layerDescriptor, name);
2258 break;
2259 }
2260 case armnn::LayerType::Pooling2d :
2261 {
2262 const armnn::Pooling2dDescriptor& layerDescriptor =
2263 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2264 SerializePooling2dLayer(layer, layerDescriptor, name);
2265 break;
2266 }
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002267 case armnn::LayerType::Pooling3d :
2268 {
2269 const armnn::Pooling3dDescriptor& layerDescriptor =
2270 static_cast<const armnn::Pooling3dDescriptor&>(descriptor);
2271 SerializePooling3dLayer(layer, layerDescriptor, name);
2272 break;
2273 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002274 case armnn::LayerType::Prelu :
2275 {
2276 SerializePreluLayer(layer, name);
2277 break;
2278 }
2279 case armnn::LayerType::Quantize :
2280 {
2281 SerializeQuantizeLayer(layer, name);
2282 break;
2283 }
2284 case armnn::LayerType::QuantizedLstm:
2285 SerializeQuantizedLstmLayer(layer, constants, name);
2286 break;
2287 case armnn::LayerType::Reshape:
2288 {
2289 const armnn::ReshapeDescriptor &layerDescriptor =
2290 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2291 SerializeReshapeLayer(layer, layerDescriptor, name);
2292 break;
2293 }
2294 case armnn::LayerType::Rank:
2295 {
2296 SerializeRankLayer(layer, name);
2297 break;
2298 }
2299 case armnn::LayerType::Reduce:
2300 {
2301 const armnn::ReduceDescriptor& layerDescriptor =
2302 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2303 SerializeReduceLayer(layer, layerDescriptor, name);
2304 break;
2305 }
2306 case armnn::LayerType::Resize:
2307 {
2308 const armnn::ResizeDescriptor& layerDescriptor =
2309 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2310 SerializeResizeLayer(layer, layerDescriptor, name);
2311 break;
2312 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002313 case armnn::LayerType::Shape:
2314 {
2315 SerializeShapeLayer(layer, name);
2316 break;
2317 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002318 case armnn::LayerType::Slice:
2319 {
2320 const armnn::SliceDescriptor& layerDescriptor =
2321 static_cast<const armnn::SliceDescriptor&>(descriptor);
2322 SerializeSliceLayer(layer, layerDescriptor, name);
2323 break;
2324 }
2325 case armnn::LayerType::Softmax:
2326 {
2327 const armnn::SoftmaxDescriptor& layerDescriptor =
2328 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2329 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2330 break;
2331 }
2332 case armnn::LayerType::SpaceToBatchNd:
2333 {
2334 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2335 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2336 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2337 break;
2338 }
2339 case armnn::LayerType::SpaceToDepth:
2340 {
2341 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2342 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2343 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2344 break;
2345 }
2346 case armnn::LayerType::Splitter:
2347 {
2348 const armnn::SplitterDescriptor& layerDescriptor =
2349 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2350 SerializeSplitterLayer(layer, layerDescriptor, name);
2351 break;
2352 }
2353 case armnn::LayerType::Stack:
2354 {
2355 const armnn::StackDescriptor& layerDescriptor =
2356 static_cast<const armnn::StackDescriptor&>(descriptor);
2357 SerializeStackLayer(layer, layerDescriptor, name);
2358 break;
2359 }
2360 case armnn::LayerType::StandIn:
2361 {
2362 const armnn::StandInDescriptor& layerDescriptor =
2363 static_cast<const armnn::StandInDescriptor&>(descriptor);
2364 SerializeStandInLayer(layer, layerDescriptor, name);
2365 break;
2366 }
2367 case armnn::LayerType::StridedSlice:
2368 {
2369 const armnn::StridedSliceDescriptor& layerDescriptor =
2370 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2371 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2372 break;
2373 }
2374 case armnn::LayerType::Subtraction:
2375 {
2376 SerializeSubtractionLayer(layer, name);
2377 break;
2378 }
2379 case armnn::LayerType::Switch:
2380 {
2381 SerializeSwitchLayer(layer, name);
2382 break;
2383 }
2384 case armnn::LayerType::Transpose:
2385 {
2386 const armnn::TransposeDescriptor& layerDescriptor =
2387 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2388 SerializeTransposeLayer(layer, layerDescriptor, name);
2389 break;
2390 }
2391 case armnn::LayerType::TransposeConvolution2d:
2392 {
2393 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2394 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2395 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2396 break;
2397 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002398 case armnn::LayerType::UnidirectionalSequenceLstm :
2399 {
2400 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2401 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2402 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2403 break;
2404 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002405 default:
2406 {
2407 throw InvalidArgumentException(
2408 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2409 layer->GetName(),
2410 id));
2411 }
2412 }
2413}
2414
Finn Williams85d36712021-01-26 22:30:06 +00002415void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002416{
2417 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002418 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2419 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002420
2421 // Create FlatBuffer SerializedGraph
2422 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002423 fbBuilder,
2424 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2425 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2426 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2427 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002428
2429 // Serialize the graph
2430 fbBuilder.Finish(serializedGraph);
2431}
2432
Finn Williamsb454c5c2021-02-09 15:56:23 +00002433
Finn Williams85d36712021-01-26 22:30:06 +00002434bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002435{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002436 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002437
Matthew Sloyan0663d662020-09-14 11:47:26 +01002438 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002439 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002440 return !stream.bad();
2441}
2442
Finn Williams2605b232020-06-10 15:53:46 +01002443} // namespace armnnSerializer