blob: 0df675d1db4645e952e859defc1fc622e3b412fa [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Mike Kelly3ec30772023-03-08 13:47:17 +00002// Copyright © 2017,2019-2023 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
Mike Kelly8c1701a2019-02-11 17:01:27 +00005#include "Serializer.hpp"
Finn Williamsb454c5c2021-02-09 15:56:23 +00006#include "SerializerUtils.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
Matthew Benthamff130e22020-01-17 11:47:42 +00008#include <armnn/Descriptors.hpp>
9#include <armnn/LstmParams.hpp>
10#include <armnn/QuantizedLstmParams.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000011#include <armnn/utility/IgnoreUnused.hpp>
Matthew Sloyan0663d662020-09-14 11:47:26 +010012#include <armnn/utility/NumericCast.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Finn Williamsb454c5c2021-02-09 15:56:23 +000014#include <fmt/format.h>
Mike Kelly8c1701a2019-02-11 17:01:27 +000015#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000016
Mike Kelly8c1701a2019-02-11 17:01:27 +000017using namespace armnn;
18namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000019namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000020
21namespace armnnSerializer
22{
23
Finn Williams85d36712021-01-26 22:30:06 +000024ISerializer::ISerializer() : pSerializerImpl(new SerializerImpl())
25{
26}
27
28ISerializer::~ISerializer() = default;
29
30ISerializer* ISerializer::CreateRaw()
31{
32 return new ISerializer();
33}
34
35ISerializerPtr ISerializer::Create()
36{
37 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
38}
39
40void ISerializer::Destroy(ISerializer* serializer)
41{
42 delete serializer;
43}
44
45void ISerializer::Serialize(const armnn::INetwork& inNetwork)
46{
47 pSerializerImpl->Serialize(inNetwork);
48}
49
50bool ISerializer::SaveSerializedToStream(std::ostream& stream)
51{
52 return pSerializerImpl->SaveSerializedToStream(stream);
53}
54
Mike Kellyaf484012019-02-20 16:53:11 +000055serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
56{
57 switch (function)
58 {
59 case armnn::ActivationFunction::Sigmoid:
60 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
61 case armnn::ActivationFunction::TanH:
62 return serializer::ActivationFunction::ActivationFunction_TanH;
63 case armnn::ActivationFunction::Linear:
64 return serializer::ActivationFunction::ActivationFunction_Linear;
65 case armnn::ActivationFunction::ReLu:
66 return serializer::ActivationFunction::ActivationFunction_ReLu;
67 case armnn::ActivationFunction::BoundedReLu:
68 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
69 case armnn::ActivationFunction::LeakyReLu:
70 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
71 case armnn::ActivationFunction::Abs:
72 return serializer::ActivationFunction::ActivationFunction_Abs;
73 case armnn::ActivationFunction::Sqrt:
74 return serializer::ActivationFunction::ActivationFunction_Sqrt;
75 case armnn::ActivationFunction::Square:
76 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000077 case armnn::ActivationFunction::Elu:
78 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000079 case armnn::ActivationFunction::HardSwish:
80 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Teresa Charlin077cddb2023-09-15 15:19:21 +010081 case armnn::ActivationFunction::Gelu:
82 return serializer::ActivationFunction::ActivationFunction_Gelu;
Mike Kellyaf484012019-02-20 16:53:11 +000083 default:
84 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
85 }
86}
87
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010088serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
89{
90 switch (function)
91 {
92 case armnn::ArgMinMaxFunction::Max:
93 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
94 case armnn::ArgMinMaxFunction::Min:
95 default:
96 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
97 }
98}
99
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000100uint32_t SerializerStrategy::GetSerializedId(LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000101{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000102 if (m_guidMap.empty())
103 {
janeil013fec1ea2019-11-07 09:47:20 +0000104 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000105 }
106 else if (m_guidMap.find(guid) == m_guidMap.end())
107 {
janeil013fec1ea2019-11-07 09:47:20 +0000108 ++m_layerId;
109 m_guidMap.insert(std::make_pair(guid, m_layerId));
110
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000111 return m_layerId;
112 }
Saoirse Stewart30211042019-02-18 17:19:16 +0000113 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000114}
115
Mike Kelly8c1701a2019-02-11 17:01:27 +0000116// Build FlatBuffer for Input Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000117void SerializerStrategy::SerializeInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000118{
Jan Eilers8eb25602020-03-09 12:13:48 +0000119 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000120
Mike Kelly8c1701a2019-02-11 17:01:27 +0000121 // Create FlatBuffer BaseLayer
122 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
123
124 // Create FlatBuffer BindableBaseLayer
125 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
126 flatBufferInputBaseLayer,
127 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000128 // Push layer binding id to outputIds.
129 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000130
131 // Create the FlatBuffer InputLayer
132 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
133
134 // Add the AnyLayer to the FlatBufferLayers
135 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
136}
137
138// Build FlatBuffer for Output Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000139void SerializerStrategy::SerializeOutputLayer(const armnn::IConnectableLayer* layer,
140 LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000141{
Jan Eilers8eb25602020-03-09 12:13:48 +0000142 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000143
Mike Kelly8c1701a2019-02-11 17:01:27 +0000144 // Create FlatBuffer BaseLayer
145 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
146
147 // Create FlatBuffer BindableBaseLayer
148 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
149 flatBufferOutputBaseLayer,
150 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000151 // Push layer binding id to outputIds.
152 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000153
154 // Create the FlatBuffer OutputLayer
155 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
156 // Add the AnyLayer to the FlatBufferLayers
157 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
158}
159
Mike Kellyaf484012019-02-20 16:53:11 +0000160// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000161void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
162 const armnn::ActivationDescriptor& descriptor,
163 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000164{
Jan Eilers8eb25602020-03-09 12:13:48 +0000165 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000166
Mike Kellyaf484012019-02-20 16:53:11 +0000167 // Create FlatBuffer BaseLayer
168 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
169
170 // Create the FlatBuffer ActivationDescriptor
171 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
172 GetFlatBufferActivationFunction(descriptor.m_Function),
173 descriptor.m_A,
174 descriptor.m_B);
175
176 // Create the FlatBuffer ActivationLayer
177 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
178 flatBufferBaseLayer,
179 flatBufferDescriptor);
180
181 // Add the AnyLayer to the FlatBufferLayers
182 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
183}
184
Mike Kelly8c1701a2019-02-11 17:01:27 +0000185// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000186void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000187{
Jan Eilers8eb25602020-03-09 12:13:48 +0000188 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000189
Mike Kelly8c1701a2019-02-11 17:01:27 +0000190 // Create FlatBuffer BaseLayer
191 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
192
193 // Create the FlatBuffer AdditionLayer
194 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
195
196 // Add the AnyLayer to the FlatBufferLayers
197 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
198}
199
Nikhil Rajee391d52019-09-05 17:50:44 +0100200// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000201void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
202 const armnn::ArgMinMaxDescriptor& descriptor,
203 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100204{
Jan Eilers8eb25602020-03-09 12:13:48 +0000205 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000206
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100207 // Create FlatBuffer BaseLayer
208 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
209
210 // Create FlatBuffer Descriptor
211 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
212 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
213 descriptor.m_Axis);
214
215 // Create FlatBuffer ArgMinMaxLayer
216 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
217 flatBufferBaseLayer,
218 flatBufferDescriptor);
219
220 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100221}
222
Samuel Yapa04f4a12022-08-19 11:14:38 +0100223void SerializerStrategy::SerializeBatchMatMulLayer(const armnn::IConnectableLayer* layer,
224 const armnn::BatchMatMulDescriptor& descriptor,
225 const char* name)
226{
227 IgnoreUnused(name);
228
229 // Create FlatBuffer BaseLayer
230 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchMatMul);
231
232 // Create the FlatBuffer BatchMatMulDescriptor
233 auto flatBufferDescriptor = CreateBatchMatMulDescriptor(m_flatBufferBuilder,
234 descriptor.m_TransposeX,
235 descriptor.m_TransposeY,
236 descriptor.m_AdjointX,
237 descriptor.m_AdjointY,
238 GetFlatBufferDataLayout(descriptor.m_DataLayoutX),
239 GetFlatBufferDataLayout(descriptor.m_DataLayoutY));
240
241 // Create the FlatBuffer BatchMatMulLayer
242 auto flatBufferBatchMatMulLayer = CreateBatchMatMulLayer(m_flatBufferBuilder,
243 flatBufferBaseLayer,
244 flatBufferDescriptor);
245
246 // Add the AnyLayer to the FlatBufferLayers
247 CreateAnyLayer(flatBufferBatchMatMulLayer.o, serializer::Layer::Layer_BatchMatMulLayer);
248}
249
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000250// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000251void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
252 const armnn::BatchToSpaceNdDescriptor& descriptor,
253 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000254{
Jan Eilers8eb25602020-03-09 12:13:48 +0000255 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000256
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000257 // Create FlatBuffer BaseLayer
258 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
259
260 std::vector<unsigned int> crops;
261 crops.reserve(descriptor.m_Crops.size() * 2);
262 for (auto& crop : descriptor.m_Crops)
263 {
264 crops.push_back(crop.first);
265 crops.push_back(crop.second);
266 }
267
268 auto flatBufferDescriptor =
269 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
270 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
271 m_flatBufferBuilder.CreateVector(crops),
272 GetFlatBufferDataLayout(descriptor.m_DataLayout));
273
274 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
275 flatBufferBaseLayer,
276 flatBufferDescriptor);
277
278 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
279}
280
Finn Williamsb454c5c2021-02-09 15:56:23 +0000281void SerializerStrategy::SerializeBatchNormalizationLayer(
282 const armnn::IConnectableLayer* layer,
283 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
284 const std::vector<armnn::ConstTensor>& constants,
285 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000286{
Jan Eilers8eb25602020-03-09 12:13:48 +0000287 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000288
Finn Williamsb454c5c2021-02-09 15:56:23 +0000289 const armnn::ConstTensor& mean = constants[0];
290 const armnn::ConstTensor& variance = constants[1];
291 const armnn::ConstTensor& beta = constants[2];
292 const armnn::ConstTensor& gamma = constants[3];
293
ruoyan018e7fa232019-02-28 15:09:07 +0000294 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
295 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
296 m_flatBufferBuilder,
297 batchNormDescriptor.m_Eps,
298 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
299
300 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
301 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
302 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
303 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
304 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
305 fbBatchNormalizationBaseLayer,
306 fbBatchNormalizationDescriptor,
307 fbMeanConstTensorInfo,
308 fbVarianceConstTensorInfo,
309 fbBetaConstTensorInfo,
310 fbGammaConstTensorInfo);
311
312 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
313}
314
mathad01b392e982021-04-07 12:07:30 +0100315void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
316 const char* name)
317{
318 IgnoreUnused(name);
319
320 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
321 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
322 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
323}
324
Simon Obute51f67772021-09-03 15:50:13 +0100325void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
326 const armnn::ChannelShuffleDescriptor& descriptor,
327 const char* name)
328{
329 IgnoreUnused(name);
330 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
331 descriptor.m_Axis,
332 descriptor.m_NumGroups);
333 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
334 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
335 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
336}
337
Finn Williamsb454c5c2021-02-09 15:56:23 +0000338void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100339 const armnn::ComparisonDescriptor& descriptor,
340 const char* name)
341{
Jan Eilers8eb25602020-03-09 12:13:48 +0000342 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000343
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100344 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
345 auto fbDescriptor = serializer::CreateComparisonDescriptor(
346 m_flatBufferBuilder,
347 GetFlatBufferComparisonOperation(descriptor.m_Operation));
348
349 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
350 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100351}
352
Conor Kennedy76277882019-02-26 08:29:54 +0000353// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000354void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
355 const std::vector<armnn::ConstTensor>& constants,
356 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000357{
Jan Eilers8eb25602020-03-09 12:13:48 +0000358 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000359
Finn Williamsb454c5c2021-02-09 15:56:23 +0000360 armnn::ConstTensor input = constants[0];
361
Conor Kennedy76277882019-02-26 08:29:54 +0000362 // Create FlatBuffer BaseLayer
363 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
364
365 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
366
367 // Create the FlatBuffer ConstantLayer
368 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
369 flatBufferConstantBaseLayer,
370 flatBufferConstTensorInfo);
371
372 // Add the AnyLayer to the FlatBufferLayers
373 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
374}
375
Mike Kellya0766c32019-02-19 17:22:07 +0000376// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000377void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
378 const armnn::Convolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000379 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000380{
Jan Eilers8eb25602020-03-09 12:13:48 +0000381 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000382
Mike Kellya0766c32019-02-19 17:22:07 +0000383 // Create FlatBuffer BaseLayer
384 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
385
386 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
387 descriptor.m_PadLeft,
388 descriptor.m_PadRight,
389 descriptor.m_PadTop,
390 descriptor.m_PadBottom,
391 descriptor.m_StrideX,
392 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100393 descriptor.m_DilationX,
394 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000395 descriptor.m_BiasEnabled,
396 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Mike Kellya0766c32019-02-19 17:22:07 +0000397
398 // Create the FlatBuffer Convolution2dLayer
399 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
400 flatBufferBaseLayer,
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100401 flatBufferDescriptor);
Mike Kellya0766c32019-02-19 17:22:07 +0000402
403 // Add the AnyLayer to the FlatBufferLayers
404 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
405}
406
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100407// Build FlatBuffer for Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100408void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
409 const armnn::Convolution3dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100410 const char* name)
411{
412 IgnoreUnused(name);
413
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100414 // Create FlatBuffer BaseLayer
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100415 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100416
417 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
418 descriptor.m_PadLeft,
419 descriptor.m_PadRight,
420 descriptor.m_PadTop,
421 descriptor.m_PadBottom,
422 descriptor.m_PadFront,
423 descriptor.m_PadBack,
424 descriptor.m_StrideX,
425 descriptor.m_StrideY,
426 descriptor.m_StrideZ,
427 descriptor.m_DilationX,
428 descriptor.m_DilationY,
429 descriptor.m_DilationZ,
430 descriptor.m_BiasEnabled,
431 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100432
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100433 // Create the FlatBuffer Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100434 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
435 flatBufferBaseLayer,
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100436 flatBufferDescriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100437
438 // Add the AnyLayer to the FlatBufferLayers
439 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
440}
441
Finn Williamsb454c5c2021-02-09 15:56:23 +0000442void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100443 const armnn::DepthToSpaceDescriptor& descriptor,
444 const char* name)
445{
Jan Eilers8eb25602020-03-09 12:13:48 +0000446 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000447
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100448 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
449 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
450 descriptor.m_BlockSize,
451 GetFlatBufferDataLayout(descriptor.m_DataLayout));
452
453 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
454
455 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100456}
457
Finn Williamsb454c5c2021-02-09 15:56:23 +0000458void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
459 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000460 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000461{
Jan Eilers8eb25602020-03-09 12:13:48 +0000462 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000463
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000464 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
465 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
466 descriptor.m_PadLeft,
467 descriptor.m_PadRight,
468 descriptor.m_PadTop,
469 descriptor.m_PadBottom,
470 descriptor.m_StrideX,
471 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100472 descriptor.m_DilationX,
473 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000474 descriptor.m_BiasEnabled,
475 GetFlatBufferDataLayout(descriptor.m_DataLayout));
476
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000477 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
478 fbBaseLayer,
Cathal Corbett06902652022-04-14 17:55:11 +0100479 fbDescriptor);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000480
481 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
482}
483
Finn Williamsb454c5c2021-02-09 15:56:23 +0000484void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000485 const char* name)
486{
Jan Eilers8eb25602020-03-09 12:13:48 +0000487 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000488
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000489 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
490 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
491
492 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
493}
494
Finn Williamsb454c5c2021-02-09 15:56:23 +0000495void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
496 const armnn::DetectionPostProcessDescriptor& descriptor,
497 const std::vector<armnn::ConstTensor>& constants,
498 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000499{
Jan Eilers8eb25602020-03-09 12:13:48 +0000500 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000501
Finn Williamsb454c5c2021-02-09 15:56:23 +0000502 const armnn::ConstTensor& anchors = constants[0];
503
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000504 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
505 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
506 descriptor.m_MaxDetections,
507 descriptor.m_MaxClassesPerDetection,
508 descriptor.m_DetectionsPerClass,
509 descriptor.m_NmsScoreThreshold,
510 descriptor.m_NmsIouThreshold,
511 descriptor.m_NumClasses,
512 descriptor.m_UseRegularNms,
513 descriptor.m_ScaleX,
514 descriptor.m_ScaleY,
515 descriptor.m_ScaleW,
516 descriptor.m_ScaleH);
517
518 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
519
520 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
521 fbBaseLayer,
522 fbDescriptor,
523 fbAnchorsConstTensorInfo);
524
525 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
526}
527
Finn Williamsb454c5c2021-02-09 15:56:23 +0000528void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000529{
Jan Eilers8eb25602020-03-09 12:13:48 +0000530 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000531
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000532 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
533 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000534
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000535 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
536}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000537
Mike Kelly3ec30772023-03-08 13:47:17 +0000538void SerializerStrategy::SerializeElementwiseBinaryLayer(const armnn::IConnectableLayer* layer,
539 const armnn::ElementwiseBinaryDescriptor& descriptor,
540 const char* name)
541{
542 IgnoreUnused(name);
543
544 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseBinary);
545 auto fbDescriptor = serializer::CreateElementwiseBinaryDescriptor(
546 m_flatBufferBuilder,
547 GetFlatBufferBinaryOperation(descriptor.m_Operation));
548
549 auto fbLayer = serializer::CreateElementwiseBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
550 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseBinaryLayer);
551}
552
Finn Williamsb454c5c2021-02-09 15:56:23 +0000553void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600554 const armnn::ElementwiseUnaryDescriptor& descriptor,
555 const char* name)
556{
Jan Eilers8eb25602020-03-09 12:13:48 +0000557 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600558
559 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
560 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
561 m_flatBufferBuilder,
562 GetFlatBufferUnaryOperation(descriptor.m_Operation));
563
564 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
565 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
566}
567
Finn Williamsb454c5c2021-02-09 15:56:23 +0000568void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100569 const armnn::FillDescriptor& fillDescriptor,
570 const char* name)
571{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100572 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100573
574 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
575
576 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
577
578 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
579
580 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100581}
582
Finn Williamsb454c5c2021-02-09 15:56:23 +0000583void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000584{
Jan Eilers8eb25602020-03-09 12:13:48 +0000585 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000586
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000587 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
588 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
589
590 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
591}
592
Finn Williamsb454c5c2021-02-09 15:56:23 +0000593void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100594 const armnn::GatherDescriptor& gatherDescriptor,
595 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000596{
Jan Eilers8eb25602020-03-09 12:13:48 +0000597 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000598
Teresa Charlin52664732020-06-29 16:27:03 +0100599 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
600 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000601 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100602 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000603
604 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
605}
606
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100607void SerializerStrategy::SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
608 const char* name)
609{
610 IgnoreUnused(name);
611
612 auto fbGatherNdBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_GatherNd);
613 auto flatBufferLayer = serializer::CreateGatherNdLayer(m_flatBufferBuilder, fbGatherNdBaseLayer);
614
615 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherNdLayer);
616}
617
Finn Williamsb454c5c2021-02-09 15:56:23 +0000618void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100619 const armnn::IConnectableLayer* layer,
620 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
621 const char* name)
622{
Jan Eilers8eb25602020-03-09 12:13:48 +0000623 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000624
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100625 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
626 m_flatBufferBuilder,
627 instanceNormalizationDescriptor.m_Gamma,
628 instanceNormalizationDescriptor.m_Beta,
629 instanceNormalizationDescriptor.m_Eps,
630 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
631
632 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
633 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
634
635 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100636}
637
Finn Williamsb454c5c2021-02-09 15:56:23 +0000638void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000639 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
640 const char* name)
641{
Jan Eilers8eb25602020-03-09 12:13:48 +0000642 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000643
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000644 // Create FlatBuffer BaseLayer
645 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
646
647 // Create the FlatBuffer L2Normalization Descriptor
648 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100649 m_flatBufferBuilder,
650 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
651 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000652
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100653 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000654 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
655
656 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
657}
658
Finn Williamsb454c5c2021-02-09 15:56:23 +0000659void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000660 const armnn::LogicalBinaryDescriptor& descriptor,
661 const char* name)
662{
663 IgnoreUnused(name);
664
665 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
666 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
667 m_flatBufferBuilder,
668 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
669
670 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
671 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
672}
673
Finn Williamsb454c5c2021-02-09 15:56:23 +0000674void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100675 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
676 const char* name)
677{
Jan Eilers8eb25602020-03-09 12:13:48 +0000678 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000679
Sadik Armagan26257852019-10-14 13:00:47 +0100680 // Create FlatBuffer BaseLayer
681 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
682
683 // Create the FlatBuffer LogSoftmaxDescriptor
684 auto flatBufferLogSoftmaxDesc =
685 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
686 logSoftmaxDescriptor.m_Beta,
687 logSoftmaxDescriptor.m_Axis);
688
689 // Create the FlatBuffer LogSoftmaxLayer
690 auto flatBufferLogSoftmaxLayer =
691 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
692 flatBufferLogSoftmaxBaseLayer,
693 flatBufferLogSoftmaxDesc);
694
695 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100696}
697
Finn Williamsb454c5c2021-02-09 15:56:23 +0000698void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
699 const armnn::LstmDescriptor& descriptor,
700 const std::vector<armnn::ConstTensor>& constants,
701 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000702{
Jan Eilers8eb25602020-03-09 12:13:48 +0000703 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000704
Jim Flynn11af3752019-03-19 17:22:29 +0000705 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
706
707 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
708 m_flatBufferBuilder,
709 descriptor.m_ActivationFunc,
710 descriptor.m_ClippingThresCell,
711 descriptor.m_ClippingThresProj,
712 descriptor.m_CifgEnabled,
713 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100714 descriptor.m_ProjectionEnabled,
715 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000716
Finn Williamsb454c5c2021-02-09 15:56:23 +0000717 // Index for constants vector
718 std::size_t i = 0;
719
720 // Get mandatory/basic input parameters
721 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
722 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
723 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
724 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
725 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
726 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
727 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
728 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
729 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
730
731
Jim Flynn11af3752019-03-19 17:22:29 +0000732
733 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
734 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
735 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
736 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
737 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
738 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
739 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
740 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
741 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100742 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
743 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
744 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
745 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000746
747 if (!descriptor.m_CifgEnabled)
748 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000749 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
750 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
751 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000752 }
753
754 if (descriptor.m_PeepholeEnabled)
755 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000756 if (!descriptor.m_CifgEnabled)
757 {
758 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
759 }
760 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
761 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
762 }
763
764 if (descriptor.m_ProjectionEnabled)
765 {
766 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
767 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000768 }
769
Jan Eilersf8c62972019-07-17 11:07:49 +0100770 if (descriptor.m_LayerNormEnabled)
771 {
772 if (!descriptor.m_CifgEnabled)
773 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000774 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100775 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000776 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
777 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
778 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100779 }
780
Jim Flynn11af3752019-03-19 17:22:29 +0000781 auto fbLstmParams = serializer::CreateLstmInputParams(
782 m_flatBufferBuilder,
783 inputToForgetWeights,
784 inputToCellWeights,
785 inputToOutputWeights,
786 recurrentToForgetWeights,
787 recurrentToCellWeights,
788 recurrentToOutputWeights,
789 forgetGateBias,
790 cellBias,
791 outputGateBias,
792 inputToInputWeights,
793 recurrentToInputWeights,
794 cellToInputWeights,
795 inputGateBias,
796 projectionWeights,
797 projectionBias,
798 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100799 cellToOutputWeights,
800 inputLayerNormWeights,
801 forgetLayerNormWeights,
802 cellLayerNormWeights,
803 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000804
805 auto fbLstmLayer = serializer::CreateLstmLayer(
806 m_flatBufferBuilder,
807 fbLstmBaseLayer,
808 fbLstmDescriptor,
809 fbLstmParams);
810
811 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
812}
813
Finn Williamsb454c5c2021-02-09 15:56:23 +0000814void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000815{
Jan Eilers8eb25602020-03-09 12:13:48 +0000816 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000817
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000818 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
819 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
820
821 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
822}
823
Finn Williamsb454c5c2021-02-09 15:56:23 +0000824void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000825 const armnn::MeanDescriptor& descriptor,
826 const char* name)
827{
Jan Eilers8eb25602020-03-09 12:13:48 +0000828 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000829
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000830 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
831 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
832 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
833 descriptor.m_KeepDims);
834
835 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
836 fbMeanBaseLayer,
837 fbMeanDescriptor);
838
839 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
840}
841
Finn Williamsb454c5c2021-02-09 15:56:23 +0000842void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000843{
Jan Eilers8eb25602020-03-09 12:13:48 +0000844 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000845
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000846 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
847 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
848
849 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
850}
851
Finn Williamsb454c5c2021-02-09 15:56:23 +0000852void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100853{
Jan Eilers8eb25602020-03-09 12:13:48 +0000854 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000855
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100856 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
857 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
858
859 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
860}
861
Finn Williamsb454c5c2021-02-09 15:56:23 +0000862void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100863 const armnn::ConcatDescriptor& concatDescriptor,
864 const char* name)
865{
Jan Eilers8eb25602020-03-09 12:13:48 +0000866 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000867
Jim Flynne242f2d2019-05-22 14:24:13 +0100868 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000869
870 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100871 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000872 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100873 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000874 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100875 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000876 {
877 origins.push_back(origin[d]);
878 }
879 auto view = m_flatBufferBuilder.CreateVector(origins);
880 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
881 views.push_back(uintVector);
882 }
883
Jim Flynne242f2d2019-05-22 14:24:13 +0100884 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
885 concatDescriptor.GetConcatAxis(),
886 concatDescriptor.GetNumViews(),
887 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000888 m_flatBufferBuilder.CreateVector(views));
889
Jim Flynne242f2d2019-05-22 14:24:13 +0100890 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
891 flatBufferConcatBaseLayer,
892 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000893
Jim Flynne242f2d2019-05-22 14:24:13 +0100894 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000895}
896
Finn Williamsb454c5c2021-02-09 15:56:23 +0000897void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000898{
Jan Eilers8eb25602020-03-09 12:13:48 +0000899 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000900
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000901 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
902 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
903 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000904
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000905 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000906}
907
Finn Williamsb454c5c2021-02-09 15:56:23 +0000908void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000909 const armnn::PadDescriptor& padDescriptor,
910 const char* name)
911{
Jan Eilers8eb25602020-03-09 12:13:48 +0000912 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000913
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000914 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
915
916 std::vector<unsigned int> padList;
917 for (auto& p: padDescriptor.m_PadList)
918 {
919 padList.push_back(p.first);
920 padList.push_back(p.second);
921 }
922
923 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100924 m_flatBufferBuilder.CreateVector(padList),
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +0100925 padDescriptor.m_PadValue,
926 GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000927
928 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
929 flatBufferBaseLayer,
930 flatBufferPadDesc);
931
932 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
933}
934
Finn Williamsb454c5c2021-02-09 15:56:23 +0000935void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000936 const armnn::PermuteDescriptor& permuteDescriptor,
937 const char* name)
938{
Jan Eilers8eb25602020-03-09 12:13:48 +0000939 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000940
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000941 // Create FlatBuffer BaseLayer
942 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
943
944 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100945 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000946 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100947 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000948 }
949
950 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
951 m_flatBufferBuilder.CreateVector(dimMappings));
952
953 // Create the FlatBuffer PermuteLayer
954 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
955 flatBufferPermuteBaseLayer,
956 flatBufferPermuteDesc);
957
958 // Add the AnyLayer to the FlatBufferLayers
959 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
960}
961
Finn Williams2605b232020-06-10 15:53:46 +0100962// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000963void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100964 const char* name)
965{
966 IgnoreUnused(name);
967 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
968 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
969
970 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
971}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000972
Finn Williamsb454c5c2021-02-09 15:56:23 +0000973void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
974 const armnn::ReduceDescriptor& reduceDescriptor,
975 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000976{
977 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
978 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000979 reduceDescriptor.m_KeepDims,
980 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
981 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
982 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
983 fbReduceBaseLayer,
984 fbDescriptor);
985
986 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
987}
988
Saoirse Stewart263829c2019-02-19 15:54:14 +0000989// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000990void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000991 const armnn::ReshapeDescriptor& reshapeDescriptor,
992 const char* name)
993{
Jan Eilers8eb25602020-03-09 12:13:48 +0000994 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000995
Saoirse Stewart263829c2019-02-19 15:54:14 +0000996 // Create FlatBuffer BaseLayer
997 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
998
999 std::vector<unsigned int> targetShape;
1000 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
1001 {
1002 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
1003 }
1004
1005 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
1006 m_flatBufferBuilder.CreateVector(targetShape));
1007
1008 // Create the FlatBuffer ReshapeLayer
1009 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
1010 flatBufferReshapeDesc);
1011
1012 // Add the AnyLayer to the FlatBufferLayers
1013 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
1014}
1015
Finn Williamsb454c5c2021-02-09 15:56:23 +00001016void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +01001017 const armnn::ResizeDescriptor& resizeDescriptor,
1018 const char* name)
1019{
Jan Eilers8eb25602020-03-09 12:13:48 +00001020 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001021
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001022 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1023
1024 auto flatBufferDescriptor =
1025 CreateResizeDescriptor(m_flatBufferBuilder,
1026 resizeDescriptor.m_TargetHeight,
1027 resizeDescriptor.m_TargetWidth,
1028 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001029 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1030 resizeDescriptor.m_AlignCorners,
1031 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001032
1033 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1034 flatBufferBaseLayer,
1035 flatBufferDescriptor);
1036
1037 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001038}
1039
Tracy Narine944fb502023-07-04 15:08:57 +01001040void SerializerStrategy::SerializeReverseV2Layer(const armnn::IConnectableLayer* layer,
Tracy Narinebb8d7592023-07-13 16:50:54 +01001041 const char* name)
Tracy Narine944fb502023-07-04 15:08:57 +01001042{
1043 IgnoreUnused(name);
1044
1045 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ReverseV2);
1046
Tracy Narine944fb502023-07-04 15:08:57 +01001047 auto flatBufferLayer = serializer::CreateReverseV2Layer(m_flatBufferBuilder,
Tracy Narinebb8d7592023-07-13 16:50:54 +01001048 flatBufferBaseLayer);
Tracy Narine944fb502023-07-04 15:08:57 +01001049
1050 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ReverseV2Layer);
1051}
1052
Finn Williamsb454c5c2021-02-09 15:56:23 +00001053void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001054 const armnn::SliceDescriptor& sliceDescriptor,
1055 const char* name)
1056{
Jan Eilers8eb25602020-03-09 12:13:48 +00001057 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001058
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001059 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1060 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1061 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1062 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1063
1064 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1065
1066 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001067}
1068
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001069// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001070void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001071 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001072 const char* name)
1073{
Jan Eilers8eb25602020-03-09 12:13:48 +00001074 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001075
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001076 // Create FlatBuffer BaseLayer
1077 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1078
1079 // Create the FlatBuffer SoftmaxDescriptor
1080 auto flatBufferSoftmaxDesc =
Sadik Armaganfd0cae32021-11-08 17:18:31 +00001081 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder,
1082 softmaxDescriptor.m_Beta,
1083 softmaxDescriptor.m_Axis);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001084
1085 // Create the FlatBuffer SoftmaxLayer
1086 auto flatBufferSoftmaxLayer =
1087 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1088 flatBufferSoftmaxBaseLayer,
1089 flatBufferSoftmaxDesc);
1090
1091 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1092}
1093
Finn Williamsb454c5c2021-02-09 15:56:23 +00001094void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001095 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001096 const char* name)
1097{
Jan Eilers8eb25602020-03-09 12:13:48 +00001098 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001099
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001100 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1101 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1102 m_flatBufferBuilder,
1103 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1104 pooling2dDescriptor.m_PadLeft,
1105 pooling2dDescriptor.m_PadRight,
1106 pooling2dDescriptor.m_PadTop,
1107 pooling2dDescriptor.m_PadBottom,
1108 pooling2dDescriptor.m_PoolWidth,
1109 pooling2dDescriptor.m_PoolHeight,
1110 pooling2dDescriptor.m_StrideX,
1111 pooling2dDescriptor.m_StrideY,
1112 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1113 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1114 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1115
1116 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1117 fbPooling2dBaseLayer,
1118 fbPooling2dDescriptor);
1119
1120 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1121}
1122
Tamas Nyirid998a1c2021-11-05 14:55:33 +00001123void SerializerStrategy::SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
1124 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
1125 const char* name)
1126{
1127 IgnoreUnused(name);
1128
1129 auto fbPooling3dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling3d);
1130 auto fbPooling3dDescriptor = serializer::CreatePooling3dDescriptor(
1131 m_flatBufferBuilder,
1132 GetFlatBufferPoolingAlgorithm(pooling3dDescriptor.m_PoolType),
1133 pooling3dDescriptor.m_PadLeft,
1134 pooling3dDescriptor.m_PadRight,
1135 pooling3dDescriptor.m_PadTop,
1136 pooling3dDescriptor.m_PadBottom,
1137 pooling3dDescriptor.m_PadFront,
1138 pooling3dDescriptor.m_PadBack,
1139 pooling3dDescriptor.m_PoolWidth,
1140 pooling3dDescriptor.m_PoolHeight,
1141 pooling3dDescriptor.m_PoolDepth,
1142 pooling3dDescriptor.m_StrideX,
1143 pooling3dDescriptor.m_StrideY,
1144 pooling3dDescriptor.m_StrideZ,
1145 GetFlatBufferOutputShapeRounding(pooling3dDescriptor.m_OutputShapeRounding),
1146 GetFlatBufferPaddingMethod(pooling3dDescriptor.m_PaddingMethod),
1147 GetFlatBufferDataLayout(pooling3dDescriptor.m_DataLayout));
1148
1149 auto fbPooling3dLayer = serializer::CreatePooling3dLayer(m_flatBufferBuilder,
1150 fbPooling3dBaseLayer,
1151 fbPooling3dDescriptor);
1152
1153 CreateAnyLayer(fbPooling3dLayer.o, serializer::Layer::Layer_Pooling3dLayer);
1154}
1155
Finn Williamsb454c5c2021-02-09 15:56:23 +00001156void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001157 const char* name)
1158{
Jan Eilers8eb25602020-03-09 12:13:48 +00001159 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001160
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001161 // Create FlatBuffer BaseLayer
1162 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1163
1164 // Create the FlatBuffer AdditionLayer
1165 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1166
1167 // Add the AnyLayer to the FlatBufferLayers
1168 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001169}
1170
Finn Williamsb454c5c2021-02-09 15:56:23 +00001171void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001172{
Jan Eilers8eb25602020-03-09 12:13:48 +00001173 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001174
Derek Lamberti87acb272019-03-27 16:51:31 +00001175 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1176 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1177 fbQuantizeBaseLayer);
1178 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1179}
1180
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001181// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001182void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1183 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001184 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001185{
1186 // Create FlatBuffer BaseLayer
1187 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1188
1189 // Create FlatBuffer FullyConnectedDescriptor
1190 auto flatBufferDescriptor =
1191 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1192 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001193 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1194 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001195
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001196 // Create FlatBuffer FullyConnectedLayer
1197 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1198 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001199 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001200
1201 // Add created FullyConnectedLayer to the FlatBufferLayers
1202 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1203}
1204
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001205// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001206void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001207 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1208 const char* name)
1209{
Jan Eilers8eb25602020-03-09 12:13:48 +00001210 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001211
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001212 // Create FlatBuffer BaseLayer
1213 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1214
1215 std::vector<unsigned int> padList;
1216 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1217 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1218 {
1219 padList.push_back(pad.first);
1220 padList.push_back(pad.second);
1221 }
1222
1223 auto flatBufferDescriptor =
1224 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1225 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1226 m_flatBufferBuilder.CreateVector(padList),
1227 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1228
1229 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1230 flatBufferBaseLayer,
1231 flatBufferDescriptor);
1232
1233 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1234}
1235
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001236// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001237void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001238 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1239 const char* name)
1240{
Jan Eilers8eb25602020-03-09 12:13:48 +00001241 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001242
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001243 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1244 auto flatBufferDescriptor =
1245 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1246 spaceToDepthDescriptor.m_BlockSize,
1247 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1248
1249 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1250 flatBufferBaseLayer,
1251 flatBufferDescriptor);
1252
1253 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001254}
1255
Jim Flynn18ce3382019-03-08 11:08:30 +00001256// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001257void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001258 const armnn::ViewsDescriptor& viewsDescriptor,
1259 const char* name)
1260{
Jan Eilers8eb25602020-03-09 12:13:48 +00001261 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001262
Jim Flynn18ce3382019-03-08 11:08:30 +00001263 // Create FlatBuffer ViewOrigins
1264 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1265 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1266
1267 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1268 {
1269 std::vector<uint32_t> viewOrigin;
1270 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1271
1272 // Copy vector
1273 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1274 {
1275 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1276 }
1277
1278 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1279 m_flatBufferBuilder.CreateVector(viewOrigin)));
1280 }
1281
1282 // Create FlatBuffer OriginsDescriptor
1283 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1284 viewsDescriptor.GetOrigins().GetConcatAxis(),
1285 viewsDescriptor.GetOrigins().GetNumViews(),
1286 viewsDescriptor.GetOrigins().GetNumDimensions(),
1287 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1288
1289 // Create FlatBuffer ViewOrigins
1290 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1291 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1292
1293 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1294 {
1295 std::vector<uint32_t> viewSize;
1296 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1297
1298 // Copy vector
1299 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1300 {
1301 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1302 }
1303
1304 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1305 m_flatBufferBuilder.CreateVector(viewSize)));
1306 }
1307
1308 // Create FlatBuffer ViewsDescriptor
1309 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1310 flatBufferOriginDescriptor,
Nikhil Raj Arm008270f2023-08-11 08:55:21 +00001311 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
Jim Flynn18ce3382019-03-08 11:08:30 +00001312
1313 // Create FlatBuffer BaseLayer
1314 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1315
1316 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1317 flatBufferBaseLayer,
1318 flatBufferViewsDescriptor);
1319
1320 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1321}
1322
Finn Williamsb454c5c2021-02-09 15:56:23 +00001323void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001324 const armnn::NormalizationDescriptor& descriptor,
1325 const char* name)
1326{
Jan Eilers8eb25602020-03-09 12:13:48 +00001327 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001328
Nina Drozd57728782019-02-27 10:53:27 +00001329 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1330
1331 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1332 m_flatBufferBuilder,
1333 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1334 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1335 descriptor.m_NormSize,
1336 descriptor.m_Alpha,
1337 descriptor.m_Beta,
1338 descriptor.m_K,
1339 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1340
1341 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1342 fbNormalizationBaseLayer,
1343 fbNormalizationDescriptor);
1344
1345 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1346}
1347
Keith Davis3ae3f972021-05-21 16:33:48 +01001348void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1349 const char* name)
1350{
1351 IgnoreUnused(name);
1352
1353 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1354 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1355
1356 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1357}
1358
Finn Williamsb454c5c2021-02-09 15:56:23 +00001359void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001360 const armnn::StackDescriptor& stackDescriptor,
1361 const char* name)
1362{
Jan Eilers8eb25602020-03-09 12:13:48 +00001363 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001364
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001365 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1366
1367 std::vector<unsigned int> inputShape;
1368 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1369 {
1370 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1371 }
1372
1373 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1374 stackDescriptor.m_Axis,
1375 stackDescriptor.m_NumInputs,
1376 m_flatBufferBuilder.CreateVector(inputShape));
1377
1378 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1379 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001380}
1381
Finn Williamsb454c5c2021-02-09 15:56:23 +00001382void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001383 const armnn::StandInDescriptor& standInDescriptor,
1384 const char *name)
1385{
Jan Eilers8eb25602020-03-09 12:13:48 +00001386 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001387
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001388 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1389 standInDescriptor.m_NumInputs,
1390 standInDescriptor.m_NumOutputs);
1391
1392 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1393 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1394
1395 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001396}
1397
Finn Williamsb454c5c2021-02-09 15:56:23 +00001398void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001399 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1400 const char* name)
1401{
Jan Eilers8eb25602020-03-09 12:13:48 +00001402 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001403
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001404 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1405
1406 auto flatBufferDescriptor =
1407 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1408 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1409 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1410 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1411 stridedSliceDescriptor.m_BeginMask,
1412 stridedSliceDescriptor.m_EndMask,
1413 stridedSliceDescriptor.m_ShrinkAxisMask,
1414 stridedSliceDescriptor.m_EllipsisMask,
1415 stridedSliceDescriptor.m_NewAxisMask,
1416 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1417
1418 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1419 flatBufferBaseLayer,
1420 flatBufferDescriptor);
1421
1422 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1423}
1424
Finn Williamsb454c5c2021-02-09 15:56:23 +00001425void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001426{
Jan Eilers8eb25602020-03-09 12:13:48 +00001427 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001428
Conor Kennedyda1f9752019-03-01 14:37:12 +00001429 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1430 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1431
1432 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1433}
1434
Finn Williamsb454c5c2021-02-09 15:56:23 +00001435void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001436{
Jan Eilers8eb25602020-03-09 12:13:48 +00001437 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001438
Sadik Armaganeff363d2019-04-05 15:25:46 +01001439 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1440 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1441
1442 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1443}
1444
David Monahan616b22f2023-07-25 12:08:10 +01001445void SerializerStrategy::SerializeTileLayer(const armnn::IConnectableLayer* layer,
1446 const armnn::TileDescriptor& descriptor,
1447 const char* name)
1448{
1449 IgnoreUnused(name);
1450
1451 // Create FlatBuffer BaseLayer
1452 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Tile);
1453
1454 auto flatBufferDesc = serializer::CreateTileDescriptor(m_flatBufferBuilder,
1455 m_flatBufferBuilder.CreateVector(descriptor.m_Multiples));
1456
1457 // Create the FlatBuffer TileLayer
1458 auto flatBufferLayer = serializer::CreateTileLayer(m_flatBufferBuilder,
1459 flatBufferBaseLayer,
1460 flatBufferDesc);
1461
1462 // Add the AnyLayer to the FlatBufferLayers
1463 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TileLayer);
1464}
1465
Finn Williamsb454c5c2021-02-09 15:56:23 +00001466void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001467 const armnn::IConnectableLayer* layer,
1468 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001469 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001470 const char* name)
1471{
Jan Eilers8eb25602020-03-09 12:13:48 +00001472 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001473
Finn Williamsb454c5c2021-02-09 15:56:23 +00001474 const armnn::ConstTensor& weights = constants.at(0);
1475
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001476 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1477 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1478 descriptor.m_PadLeft,
1479 descriptor.m_PadRight,
1480 descriptor.m_PadTop,
1481 descriptor.m_PadBottom,
1482 descriptor.m_StrideX,
1483 descriptor.m_StrideY,
1484 descriptor.m_BiasEnabled,
1485 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1486
1487 // weights & biases
1488 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1489 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001490 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001491 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001492 const armnn::ConstTensor& biases = constants.at(1);
1493 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001494 }
1495
1496 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1497 fbBaseLayer,
1498 fbDescriptor,
1499 fbWeightsConstTensorInfo,
1500 fbBiasesConstTensorInfo);
1501
1502 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001503}
1504
Finn Williamsb454c5c2021-02-09 15:56:23 +00001505void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001506 const armnn::TransposeDescriptor& descriptor,
1507 const char* name)
1508{
Jan Eilers8eb25602020-03-09 12:13:48 +00001509 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001510
1511 // Create FlatBuffer BaseLayer
1512 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1513
1514 std::vector<unsigned int> dimMappings;
1515 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1516 {
1517 dimMappings.push_back(descriptor.m_DimMappings[i]);
1518 }
1519
1520 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1521 m_flatBufferBuilder.CreateVector(dimMappings));
1522
1523 // Create the FlatBuffer TransposeLayer
1524 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1525 flatBufferBaseLayer,
1526 flatBufferDesc);
1527
1528 // Add the AnyLayer to the FlatBufferLayers
1529 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1530}
1531
Finn Williamsb454c5c2021-02-09 15:56:23 +00001532void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1533 const armnn::QLstmDescriptor& descriptor,
1534 const std::vector<armnn::ConstTensor>& constants,
1535 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001536{
James Conroy8d333182020-05-13 10:27:58 +01001537 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001538
James Conroy8d333182020-05-13 10:27:58 +01001539 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1540
1541 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1542 m_flatBufferBuilder,
1543 descriptor.m_CifgEnabled,
1544 descriptor.m_PeepholeEnabled,
1545 descriptor.m_ProjectionEnabled,
1546 descriptor.m_LayerNormEnabled,
1547 descriptor.m_CellClip,
1548 descriptor.m_ProjectionClip,
1549 descriptor.m_InputIntermediateScale,
1550 descriptor.m_ForgetIntermediateScale,
1551 descriptor.m_CellIntermediateScale,
1552 descriptor.m_OutputIntermediateScale,
1553 descriptor.m_HiddenStateZeroPoint,
1554 descriptor.m_HiddenStateScale
1555 );
1556
Finn Williamsb454c5c2021-02-09 15:56:23 +00001557 // Index for constants vector
1558 std::size_t i = 0;
1559
James Conroy8d333182020-05-13 10:27:58 +01001560 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001561 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1562 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1563 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1564 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1565 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1566 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1567 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1568 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1569 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001570
1571 // CIFG
1572 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1573 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1574 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1575
1576 if (!descriptor.m_CifgEnabled)
1577 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001578 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1579 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1580 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001581 }
1582
1583 // Peephole
1584 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1585 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1586 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1587
1588 if (descriptor.m_PeepholeEnabled)
1589 {
1590 if (!descriptor.m_CifgEnabled)
1591 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001592 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001593 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001594 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1595 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1596 }
James Conroy8d333182020-05-13 10:27:58 +01001597
Finn Williamsb454c5c2021-02-09 15:56:23 +00001598 // Projection
1599 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1600 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1601
1602 if (descriptor.m_ProjectionEnabled)
1603 {
1604 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1605 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001606 }
1607
1608 // Layer norm
1609 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1610 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1611 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1612 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1613
1614 if (descriptor.m_LayerNormEnabled)
1615 {
1616 if (!descriptor.m_CifgEnabled)
1617 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001618 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001619 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001620 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1621 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1622 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001623 }
1624
1625 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1626 m_flatBufferBuilder,
1627 inputToForgetWeights,
1628 inputToCellWeights,
1629 inputToOutputWeights,
1630 recurrentToForgetWeights,
1631 recurrentToCellWeights,
1632 recurrentToOutputWeights,
1633 forgetGateBias,
1634 cellBias,
1635 outputGateBias,
1636 inputToInputWeights,
1637 recurrentToInputWeights,
1638 inputGateBias,
1639 projectionWeights,
1640 projectionBias,
1641 cellToInputWeights,
1642 cellToForgetWeights,
1643 cellToOutputWeights,
1644 inputLayerNormWeights,
1645 forgetLayerNormWeights,
1646 cellLayerNormWeights,
1647 outputLayerNormWeights);
1648
1649 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1650 m_flatBufferBuilder,
1651 fbQLstmBaseLayer,
1652 fbQLstmDescriptor,
1653 fbQLstmParams);
1654
1655 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001656}
1657
Finn Williamsb454c5c2021-02-09 15:56:23 +00001658void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1659 const std::vector<armnn::ConstTensor>& constants,
1660 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001661{
Jan Eilers8eb25602020-03-09 12:13:48 +00001662 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001663
Jan Eilers5b01a892019-07-23 09:47:43 +01001664 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1665
Finn Williamsb454c5c2021-02-09 15:56:23 +00001666 // index for constants vector
1667 size_t i = 0;
1668
Jan Eilers5b01a892019-07-23 09:47:43 +01001669 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001670 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1671 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1672 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1673 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001674
Finn Williamsb454c5c2021-02-09 15:56:23 +00001675 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1676 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1677 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1678 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001679
Finn Williamsb454c5c2021-02-09 15:56:23 +00001680 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1681 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1682 auto cellBias = CreateConstTensorInfo(constants[i++]);
1683 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001684
1685 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1686 m_flatBufferBuilder,
1687 inputToInputWeights,
1688 inputToForgetWeights,
1689 inputToCellWeights,
1690 inputToOutputWeights,
1691 recurrentToInputWeights,
1692 recurrentToForgetWeights,
1693 recurrentToCellWeights,
1694 recurrentToOutputWeights,
1695 inputGateBias,
1696 forgetGateBias,
1697 cellBias,
1698 outputGateBias);
1699
1700 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1701 m_flatBufferBuilder,
1702 fbQuantizedLstmBaseLayer,
1703 fbQuantizedLstmParams);
1704
1705 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001706}
1707
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001708void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1709 const armnn::IConnectableLayer* layer,
1710 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1711 const std::vector<armnn::ConstTensor>& constants,
1712 const char* name)
1713{
1714 IgnoreUnused(name);
1715
1716 auto fbUnidirectionalSequenceLstmBaseLayer =
1717 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1718
1719 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1720 m_flatBufferBuilder,
1721 descriptor.m_ActivationFunc,
1722 descriptor.m_ClippingThresCell,
1723 descriptor.m_ClippingThresProj,
1724 descriptor.m_CifgEnabled,
1725 descriptor.m_PeepholeEnabled,
1726 descriptor.m_ProjectionEnabled,
1727 descriptor.m_LayerNormEnabled,
1728 descriptor.m_TimeMajor);
1729
1730 // Index for constants vector
1731 std::size_t i = 0;
1732
1733 // Get mandatory/basic input parameters
1734 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1735 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1736 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1737 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1738 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1739 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1740 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1741 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1742 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1743
1744 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1745 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1746 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1747 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1748 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1749 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1750 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1751 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1752 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1753 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1754 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1755 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1756 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1757
1758 if (!descriptor.m_CifgEnabled)
1759 {
1760 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1761 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1762 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1763 }
1764
1765 if (descriptor.m_PeepholeEnabled)
1766 {
1767 if (!descriptor.m_CifgEnabled)
1768 {
1769 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1770 }
1771 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1772 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1773 }
1774
1775 if (descriptor.m_ProjectionEnabled)
1776 {
1777 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1778 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1779 }
1780
1781 if (descriptor.m_LayerNormEnabled)
1782 {
1783 if (!descriptor.m_CifgEnabled)
1784 {
1785 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1786 }
1787 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1788 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1789 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1790 }
1791
1792 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1793 m_flatBufferBuilder,
1794 inputToForgetWeights,
1795 inputToCellWeights,
1796 inputToOutputWeights,
1797 recurrentToForgetWeights,
1798 recurrentToCellWeights,
1799 recurrentToOutputWeights,
1800 forgetGateBias,
1801 cellBias,
1802 outputGateBias,
1803 inputToInputWeights,
1804 recurrentToInputWeights,
1805 cellToInputWeights,
1806 inputGateBias,
1807 projectionWeights,
1808 projectionBias,
1809 cellToForgetWeights,
1810 cellToOutputWeights,
1811 inputLayerNormWeights,
1812 forgetLayerNormWeights,
1813 cellLayerNormWeights,
1814 outputLayerNormWeights);
1815
1816 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1817 m_flatBufferBuilder,
1818 fbUnidirectionalSequenceLstmBaseLayer,
1819 fbUnidirectionalSequenceLstmDescriptor,
1820 fbUnidirectionalSequenceLstmParams);
1821
1822 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1823}
1824
Finn Williamsb454c5c2021-02-09 15:56:23 +00001825fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001826 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001827{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001828
Sadik Armagandb059fd2019-03-20 12:28:32 +00001829 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1830
Mike Kelly8c1701a2019-02-11 17:01:27 +00001831 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1832 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1833
1834 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001835 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001836 m_flatBufferBuilder.CreateString(layer->GetName()),
1837 layerType,
1838 m_flatBufferBuilder.CreateVector(inputSlots),
1839 m_flatBufferBuilder.CreateVector(outputSlots));
1840}
1841
Finn Williamsb454c5c2021-02-09 15:56:23 +00001842void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001843{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001844
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001845 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001846 m_serializedLayers.push_back(anyLayer);
1847}
1848
Mike Kellya0766c32019-02-19 17:22:07 +00001849template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001850flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001851{
1852 const T* buffer = reinterpret_cast<const T*>(memory);
1853 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1854 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1855 return fbVector;
1856}
1857
Finn Williamsb454c5c2021-02-09 15:56:23 +00001858flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001859{
Mike Kellya0766c32019-02-19 17:22:07 +00001860 // Get the dimensions
1861 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001862 std::vector<bool> specificity;
1863 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1864 // matches the size of dimensions.
1865 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1866 {
1867 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001868
1869 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1870 {
1871 shape.push_back(tensorInfo.GetShape()[dim]);
1872 }
1873 else
1874 {
1875 shape.push_back(0);
1876 }
Colm Donelan800b2812021-02-12 12:43:35 +00001877 }
1878
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001879 if (tensorInfo.HasPerAxisQuantization())
1880 {
1881 // Create FlatBuffer TensorInfo
1882 auto flatBufferTensorInfo =
1883 serializer::CreateTensorInfo(m_flatBufferBuilder,
1884 m_flatBufferBuilder.CreateVector(shape),
1885 GetFlatBufferDataType(tensorInfo.GetDataType()),
1886 tensorInfo.GetQuantizationScales()[0],
1887 tensorInfo.GetQuantizationOffset(),
1888 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001889 tensorInfo.GetQuantizationDim().value(),
1890 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001891 (tensorInfo.GetShape().GetDimensionality()),
1892 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001893 return flatBufferTensorInfo;
1894 }
1895
Mike Kellya0766c32019-02-19 17:22:07 +00001896 // Create FlatBuffer TensorInfo
1897 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1898 m_flatBufferBuilder.CreateVector(shape),
1899 GetFlatBufferDataType(tensorInfo.GetDataType()),
1900 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001901 tensorInfo.GetQuantizationOffset(),
1902 0,
1903 0,
1904 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001905 (tensorInfo.GetShape().GetDimensionality()),
1906 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001907 return flatBufferTensorInfo;
1908}
1909
1910flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001911 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001912{
1913 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1914
Mike Kellya0766c32019-02-19 17:22:07 +00001915 flatbuffers::Offset<void> fbPayload;
1916
1917 switch (tensorInfo.GetDataType())
1918 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001919 case armnn::DataType::Signed64:
1920 {
1921 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1922 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1923 m_flatBufferBuilder,
1924 fbVector);
1925 fbPayload = flatBuffersData.o;
1926 break;
1927 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001928 case armnn::DataType::Float32:
1929 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001930 {
1931 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1932 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1933 m_flatBufferBuilder,
1934 fbVector);
1935 fbPayload = flatBuffersData.o;
1936 break;
1937 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001938 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001939 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001940 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001941 {
1942 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1943 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1944 m_flatBufferBuilder,
1945 fbVector);
1946 fbPayload = flatBuffersData.o;
1947 break;
1948 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001949 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001950 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001951 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001952 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001953 default:
1954 {
1955 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1956 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1957 m_flatBufferBuilder,
1958 fbVector);
1959 fbPayload = flatBuffersData.o;
1960 }
1961 }
1962 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1963 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001964 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001965 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1966 fbPayload);
1967 return flatBufferConstTensor;
1968}
1969
Finn Williamsb454c5c2021-02-09 15:56:23 +00001970flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001971{
1972 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1973 serializer::CreateFeatureCompatibilityVersions(
1974 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001975 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001976 1, // Weights layout scheme version
1977 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001978 );
1979 return versionsTable;
1980}
1981
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001982std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001983 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001984{
Mike Kellya0766c32019-02-19 17:22:07 +00001985 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001986
1987 // Get the InputSlots
1988 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1989 {
1990 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1991
1992 // Get the Connection for the InputSlot
1993 const IOutputSlot* connection = inputSlot.GetConnection();
Mike Kelly4cc341c2023-07-07 15:43:06 +01001994 bool isOverridden = inputSlot.IsTensorInfoOverridden();
1995
1996 flatbuffers::Offset<TensorInfo> overriddenTensorInfo = CreateTensorInfo(inputSlot.GetTensorInfo());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001997
1998 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001999 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
2000 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00002001 // Create FlatBuffer InputSlot
Mike Kelly4cc341c2023-07-07 15:43:06 +01002002 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn, isOverridden,
2003 overriddenTensorInfo));
Mike Kelly8c1701a2019-02-11 17:01:27 +00002004 }
2005 return inputSlots;
2006}
2007
Derek Lamberti0028d1b2019-02-20 13:57:42 +00002008std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00002009 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00002010{
2011 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
2012
2013 // Get the OutputSlots
2014 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
2015 {
2016 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00002017 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00002018
Mike Kelly8c1701a2019-02-11 17:01:27 +00002019 // Create FlatBuffer Outputslot
2020 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
2021 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00002022 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00002023 }
2024 return outputSlots;
2025}
2026
Finn Williamsb454c5c2021-02-09 15:56:23 +00002027void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
2028 const BaseDescriptor& descriptor,
2029 const std::vector<armnn::ConstTensor>& constants,
2030 const char* name,
2031 const armnn::LayerBindingId id)
2032{
2033 IgnoreUnused(constants);
2034
2035 switch (layer->GetType())
2036 {
2037 case armnn::LayerType::Activation :
2038 {
2039 const armnn::ActivationDescriptor& layerDescriptor =
2040 static_cast<const armnn::ActivationDescriptor&>(descriptor);
2041 SerializeActivationLayer(layer, layerDescriptor, name);
2042 break;
2043 }
2044 case armnn::LayerType::Addition :
2045 {
2046 SerializeAdditionLayer(layer, name);
2047 break;
2048 }
2049 case armnn::LayerType::ArgMinMax :
2050 {
2051 const armnn::ArgMinMaxDescriptor& layerDescriptor =
2052 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
2053 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
2054 break;
2055 }
Samuel Yapa04f4a12022-08-19 11:14:38 +01002056 case armnn::LayerType::BatchMatMul:
2057 {
2058 const armnn::BatchMatMulDescriptor& layerDescriptor =
2059 static_cast<const armnn::BatchMatMulDescriptor&>(descriptor);
2060 SerializeBatchMatMulLayer(layer,
2061 layerDescriptor,
2062 name);
2063 break;
2064 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002065 case armnn::LayerType::BatchNormalization :
2066 {
2067 const armnn::BatchNormalizationDescriptor& layerDescriptor =
2068 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
2069 SerializeBatchNormalizationLayer(layer,
2070 layerDescriptor,
2071 constants,
2072 name);
2073 break;
2074 }
2075 case armnn::LayerType::BatchToSpaceNd :
2076 {
2077 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2078 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2079 SerializeBatchToSpaceNdLayer(layer,
2080 layerDescriptor,
2081 name);
2082 break;
2083 }
mathad01b392e982021-04-07 12:07:30 +01002084 case armnn::LayerType::Cast :
2085 {
2086 SerializeCastLayer(layer, name);
2087 break;
2088 }
Simon Obute51f67772021-09-03 15:50:13 +01002089 case armnn::LayerType::ChannelShuffle :
2090 {
2091 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2092 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2093 SerializeChannelShuffleLayer(layer,
2094 layerDescriptor,
2095 name);
2096 break;
2097 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002098 case armnn::LayerType::Comparison :
2099 {
2100 const armnn::ComparisonDescriptor& layerDescriptor =
2101 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2102 SerializeComparisonLayer(layer,
2103 layerDescriptor,
2104 name);
2105 break;
2106 }
2107 case armnn::LayerType::Concat :
2108 {
2109 const armnn::ConcatDescriptor& layerDescriptor =
2110 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2111 SerializeConcatLayer(layer,
2112 layerDescriptor,
2113 name);
2114 break;
2115 }
2116 case armnn::LayerType::Constant :
2117 {
2118 SerializeConstantLayer(layer,
2119 constants,
2120 name);
2121 break;
2122 }
2123 case armnn::LayerType::Convolution2d :
2124 {
2125 const armnn::Convolution2dDescriptor& layerDescriptor =
2126 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2127 SerializeConvolution2dLayer(layer,
2128 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002129 name);
2130 break;
2131 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002132 case armnn::LayerType::Convolution3d :
2133 {
2134 const armnn::Convolution3dDescriptor& layerDescriptor =
2135 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2136 SerializeConvolution3dLayer(layer,
2137 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002138 name);
2139 break;
2140 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002141 case armnn::LayerType::DepthToSpace :
2142 {
2143 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2144 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2145 SerializeDepthToSpaceLayer(layer,
2146 layerDescriptor,
2147 name);
2148 break;
2149 }
2150 case armnn::LayerType::DepthwiseConvolution2d :
2151 {
2152 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2153 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2154 SerializeDepthwiseConvolution2dLayer(layer,
2155 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002156 name);
2157 break;
2158 }
2159 case armnn::LayerType::Dequantize :
2160 {
2161 SerializeDequantizeLayer(layer,
2162 name);
2163 break;
2164 }
2165 case armnn::LayerType::DetectionPostProcess :
2166 {
2167 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2168 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2169 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2170 break;
2171 }
2172 case armnn::LayerType::Division :
2173 {
2174 SerializeDivisionLayer(layer, name);
2175 break;
2176 }
Mike Kelly3ec30772023-03-08 13:47:17 +00002177 case armnn::LayerType::ElementwiseBinary :
2178 {
2179 const armnn::ElementwiseBinaryDescriptor& layerDescriptor =
2180 static_cast<const armnn::ElementwiseBinaryDescriptor&>(descriptor);
2181 SerializeElementwiseBinaryLayer(layer, layerDescriptor, name);
2182 break;
2183 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002184 case armnn::LayerType::ElementwiseUnary :
2185 {
2186 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2187 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2188 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2189 break;
2190 }
2191 case armnn::LayerType::Fill :
2192 {
2193 const armnn::FillDescriptor& layerDescriptor =
2194 static_cast<const armnn::FillDescriptor&>(descriptor);
2195 SerializeFillLayer(layer, layerDescriptor, name);
2196 break;
2197 }
2198 case armnn::LayerType::Floor :
2199 {
2200 SerializeFloorLayer(layer, name);
2201 break;
2202 }
2203 case armnn::LayerType::FullyConnected :
2204 {
2205 const armnn::FullyConnectedDescriptor& layerDescriptor =
2206 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002207 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002208 break;
2209 }
2210 case armnn::LayerType::Gather :
2211 {
2212 const armnn::GatherDescriptor& layerDescriptor =
2213 static_cast<const armnn::GatherDescriptor&>(descriptor);
2214 SerializeGatherLayer(layer, layerDescriptor, name);
2215 break;
2216 }
Teresa Charlin6966bfa2022-04-25 17:14:50 +01002217 case armnn::LayerType::GatherNd :
2218 {
2219 SerializeGatherNdLayer(layer, name);
2220 break;
2221 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002222 case armnn::LayerType::Input:
2223 {
2224 SerializeInputLayer(layer, id, name);
2225 break;
2226 }
2227 case armnn::LayerType::InstanceNormalization :
2228 {
2229 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2230 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2231 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2232 break;
2233 }
2234 case armnn::LayerType::L2Normalization :
2235 {
2236 const armnn::L2NormalizationDescriptor& layerDescriptor =
2237 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2238 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2239 break;
2240 }
2241 case armnn::LayerType::LogicalBinary :
2242 {
2243 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2244 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2245 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2246 break;
2247 }
2248 case armnn::LayerType::LogSoftmax :
2249 {
2250 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2251 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2252 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2253 break;
2254 }
2255 case armnn::LayerType::Lstm :
2256 {
2257 const armnn::LstmDescriptor& layerDescriptor =
2258 static_cast<const armnn::LstmDescriptor&>(descriptor);
2259 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2260 break;
2261 }
2262 case armnn::LayerType::QLstm :
2263 {
2264 const armnn::QLstmDescriptor& layerDescriptor =
2265 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2266 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2267 break;
2268 }
2269 case armnn::LayerType::Maximum :
2270 {
2271 SerializeMaximumLayer(layer, name);
2272 break;
2273 }
2274 case armnn::LayerType::Mean :
2275 {
2276 const armnn::MeanDescriptor& layerDescriptor =
2277 static_cast<const armnn::MeanDescriptor&>(descriptor);
2278 SerializeMeanLayer(layer, layerDescriptor, name);
2279 break;
2280 }
2281 case armnn::LayerType::Merge :
2282 {
2283 SerializeMergeLayer(layer, name);
2284 break;
2285 }
2286 case armnn::LayerType::Minimum :
2287 {
2288 SerializeMinimumLayer(layer, name);
2289 break;
2290 }
2291 case armnn::LayerType::Multiplication :
2292 {
2293 SerializeMultiplicationLayer(layer, name);
2294 break;
2295 }
2296 case armnn::LayerType::Normalization :
2297 {
2298 const armnn::NormalizationDescriptor& layerDescriptor =
2299 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2300 SerializeNormalizationLayer(layer, layerDescriptor, name);
2301 break;
2302 }
2303 case armnn::LayerType::Output:
2304 {
2305 SerializeOutputLayer(layer, id, name);
2306 break;
2307 }
2308 case armnn::LayerType::Pad :
2309 {
2310 const armnn::PadDescriptor& layerDescriptor =
2311 static_cast<const armnn::PadDescriptor&>(descriptor);
2312 SerializePadLayer(layer, layerDescriptor, name);
2313 break;
2314 }
2315 case armnn::LayerType::Permute :
2316 {
2317 const armnn::PermuteDescriptor& layerDescriptor =
2318 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2319 SerializePermuteLayer(layer, layerDescriptor, name);
2320 break;
2321 }
2322 case armnn::LayerType::Pooling2d :
2323 {
2324 const armnn::Pooling2dDescriptor& layerDescriptor =
2325 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2326 SerializePooling2dLayer(layer, layerDescriptor, name);
2327 break;
2328 }
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002329 case armnn::LayerType::Pooling3d :
2330 {
2331 const armnn::Pooling3dDescriptor& layerDescriptor =
2332 static_cast<const armnn::Pooling3dDescriptor&>(descriptor);
2333 SerializePooling3dLayer(layer, layerDescriptor, name);
2334 break;
2335 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002336 case armnn::LayerType::Prelu :
2337 {
2338 SerializePreluLayer(layer, name);
2339 break;
2340 }
2341 case armnn::LayerType::Quantize :
2342 {
2343 SerializeQuantizeLayer(layer, name);
2344 break;
2345 }
2346 case armnn::LayerType::QuantizedLstm:
2347 SerializeQuantizedLstmLayer(layer, constants, name);
2348 break;
2349 case armnn::LayerType::Reshape:
2350 {
2351 const armnn::ReshapeDescriptor &layerDescriptor =
2352 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2353 SerializeReshapeLayer(layer, layerDescriptor, name);
2354 break;
2355 }
2356 case armnn::LayerType::Rank:
2357 {
2358 SerializeRankLayer(layer, name);
2359 break;
2360 }
2361 case armnn::LayerType::Reduce:
2362 {
2363 const armnn::ReduceDescriptor& layerDescriptor =
2364 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2365 SerializeReduceLayer(layer, layerDescriptor, name);
2366 break;
2367 }
2368 case armnn::LayerType::Resize:
2369 {
2370 const armnn::ResizeDescriptor& layerDescriptor =
2371 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2372 SerializeResizeLayer(layer, layerDescriptor, name);
2373 break;
2374 }
Tracy Narine944fb502023-07-04 15:08:57 +01002375 case armnn::LayerType::ReverseV2:
2376 {
Tracy Narinebb8d7592023-07-13 16:50:54 +01002377 SerializeReverseV2Layer(layer, name);
Tracy Narine944fb502023-07-04 15:08:57 +01002378 break;
2379 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002380 case armnn::LayerType::Shape:
2381 {
2382 SerializeShapeLayer(layer, name);
2383 break;
2384 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002385 case armnn::LayerType::Slice:
2386 {
2387 const armnn::SliceDescriptor& layerDescriptor =
2388 static_cast<const armnn::SliceDescriptor&>(descriptor);
2389 SerializeSliceLayer(layer, layerDescriptor, name);
2390 break;
2391 }
2392 case armnn::LayerType::Softmax:
2393 {
2394 const armnn::SoftmaxDescriptor& layerDescriptor =
2395 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2396 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2397 break;
2398 }
2399 case armnn::LayerType::SpaceToBatchNd:
2400 {
2401 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2402 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2403 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2404 break;
2405 }
2406 case armnn::LayerType::SpaceToDepth:
2407 {
2408 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2409 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2410 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2411 break;
2412 }
2413 case armnn::LayerType::Splitter:
2414 {
2415 const armnn::SplitterDescriptor& layerDescriptor =
2416 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2417 SerializeSplitterLayer(layer, layerDescriptor, name);
2418 break;
2419 }
2420 case armnn::LayerType::Stack:
2421 {
2422 const armnn::StackDescriptor& layerDescriptor =
2423 static_cast<const armnn::StackDescriptor&>(descriptor);
2424 SerializeStackLayer(layer, layerDescriptor, name);
2425 break;
2426 }
2427 case armnn::LayerType::StandIn:
2428 {
2429 const armnn::StandInDescriptor& layerDescriptor =
2430 static_cast<const armnn::StandInDescriptor&>(descriptor);
2431 SerializeStandInLayer(layer, layerDescriptor, name);
2432 break;
2433 }
2434 case armnn::LayerType::StridedSlice:
2435 {
2436 const armnn::StridedSliceDescriptor& layerDescriptor =
2437 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2438 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2439 break;
2440 }
2441 case armnn::LayerType::Subtraction:
2442 {
2443 SerializeSubtractionLayer(layer, name);
2444 break;
2445 }
2446 case armnn::LayerType::Switch:
2447 {
2448 SerializeSwitchLayer(layer, name);
2449 break;
2450 }
David Monahan616b22f2023-07-25 12:08:10 +01002451 case armnn::LayerType::Tile:
2452 {
2453 const armnn::TileDescriptor& layerDescriptor =
2454 static_cast<const armnn::TileDescriptor&>(descriptor);
2455 SerializeTileLayer(layer, layerDescriptor, name);
2456 break;
2457 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002458 case armnn::LayerType::Transpose:
2459 {
2460 const armnn::TransposeDescriptor& layerDescriptor =
2461 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2462 SerializeTransposeLayer(layer, layerDescriptor, name);
2463 break;
2464 }
2465 case armnn::LayerType::TransposeConvolution2d:
2466 {
2467 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2468 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2469 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2470 break;
2471 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002472 case armnn::LayerType::UnidirectionalSequenceLstm :
2473 {
2474 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2475 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2476 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2477 break;
2478 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002479 default:
2480 {
2481 throw InvalidArgumentException(
2482 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2483 layer->GetName(),
2484 id));
2485 }
2486 }
2487}
2488
Finn Williams85d36712021-01-26 22:30:06 +00002489void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002490{
2491 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002492 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2493 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002494
2495 // Create FlatBuffer SerializedGraph
2496 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002497 fbBuilder,
2498 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2499 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2500 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2501 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002502
2503 // Serialize the graph
2504 fbBuilder.Finish(serializedGraph);
2505}
2506
Finn Williamsb454c5c2021-02-09 15:56:23 +00002507
Finn Williams85d36712021-01-26 22:30:06 +00002508bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002509{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002510 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002511
Matthew Sloyan0663d662020-09-14 11:47:26 +01002512 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002513 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002514 return !stream.bad();
2515}
2516
Finn Williams2605b232020-06-10 15:53:46 +01002517} // namespace armnnSerializer