blob: ef2ca48e04056fcafe6d563bb1d8de691378c029 [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,
Mike Kelly363b5722023-10-11 14:25:50 +01001311 m_flatBufferBuilder.CreateVector(flatBufferViewSizes),
1312 viewsDescriptor.HasAxis(),
1313 viewsDescriptor.GetAxis());
Jim Flynn18ce3382019-03-08 11:08:30 +00001314
1315 // Create FlatBuffer BaseLayer
1316 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1317
1318 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1319 flatBufferBaseLayer,
1320 flatBufferViewsDescriptor);
1321
1322 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1323}
1324
Finn Williamsb454c5c2021-02-09 15:56:23 +00001325void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001326 const armnn::NormalizationDescriptor& descriptor,
1327 const char* name)
1328{
Jan Eilers8eb25602020-03-09 12:13:48 +00001329 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001330
Nina Drozd57728782019-02-27 10:53:27 +00001331 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1332
1333 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1334 m_flatBufferBuilder,
1335 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1336 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1337 descriptor.m_NormSize,
1338 descriptor.m_Alpha,
1339 descriptor.m_Beta,
1340 descriptor.m_K,
1341 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1342
1343 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1344 fbNormalizationBaseLayer,
1345 fbNormalizationDescriptor);
1346
1347 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1348}
1349
Keith Davis3ae3f972021-05-21 16:33:48 +01001350void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1351 const char* name)
1352{
1353 IgnoreUnused(name);
1354
1355 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1356 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1357
1358 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1359}
1360
Finn Williamsb454c5c2021-02-09 15:56:23 +00001361void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001362 const armnn::StackDescriptor& stackDescriptor,
1363 const char* name)
1364{
Jan Eilers8eb25602020-03-09 12:13:48 +00001365 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001366
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001367 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1368
1369 std::vector<unsigned int> inputShape;
1370 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1371 {
1372 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1373 }
1374
1375 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1376 stackDescriptor.m_Axis,
1377 stackDescriptor.m_NumInputs,
1378 m_flatBufferBuilder.CreateVector(inputShape));
1379
1380 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1381 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001382}
1383
Finn Williamsb454c5c2021-02-09 15:56:23 +00001384void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001385 const armnn::StandInDescriptor& standInDescriptor,
1386 const char *name)
1387{
Jan Eilers8eb25602020-03-09 12:13:48 +00001388 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001389
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001390 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1391 standInDescriptor.m_NumInputs,
1392 standInDescriptor.m_NumOutputs);
1393
1394 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1395 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1396
1397 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001398}
1399
Finn Williamsb454c5c2021-02-09 15:56:23 +00001400void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001401 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1402 const char* name)
1403{
Jan Eilers8eb25602020-03-09 12:13:48 +00001404 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001405
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001406 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1407
1408 auto flatBufferDescriptor =
1409 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1410 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1411 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1412 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1413 stridedSliceDescriptor.m_BeginMask,
1414 stridedSliceDescriptor.m_EndMask,
1415 stridedSliceDescriptor.m_ShrinkAxisMask,
1416 stridedSliceDescriptor.m_EllipsisMask,
1417 stridedSliceDescriptor.m_NewAxisMask,
1418 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1419
1420 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1421 flatBufferBaseLayer,
1422 flatBufferDescriptor);
1423
1424 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1425}
1426
Finn Williamsb454c5c2021-02-09 15:56:23 +00001427void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001428{
Jan Eilers8eb25602020-03-09 12:13:48 +00001429 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001430
Conor Kennedyda1f9752019-03-01 14:37:12 +00001431 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1432 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1433
1434 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1435}
1436
Finn Williamsb454c5c2021-02-09 15:56:23 +00001437void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001438{
Jan Eilers8eb25602020-03-09 12:13:48 +00001439 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001440
Sadik Armaganeff363d2019-04-05 15:25:46 +01001441 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1442 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1443
1444 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1445}
1446
David Monahan616b22f2023-07-25 12:08:10 +01001447void SerializerStrategy::SerializeTileLayer(const armnn::IConnectableLayer* layer,
1448 const armnn::TileDescriptor& descriptor,
1449 const char* name)
1450{
1451 IgnoreUnused(name);
1452
1453 // Create FlatBuffer BaseLayer
1454 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Tile);
1455
1456 auto flatBufferDesc = serializer::CreateTileDescriptor(m_flatBufferBuilder,
1457 m_flatBufferBuilder.CreateVector(descriptor.m_Multiples));
1458
1459 // Create the FlatBuffer TileLayer
1460 auto flatBufferLayer = serializer::CreateTileLayer(m_flatBufferBuilder,
1461 flatBufferBaseLayer,
1462 flatBufferDesc);
1463
1464 // Add the AnyLayer to the FlatBufferLayers
1465 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TileLayer);
1466}
1467
Finn Williamsb454c5c2021-02-09 15:56:23 +00001468void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001469 const armnn::IConnectableLayer* layer,
1470 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001471 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001472 const char* name)
1473{
Jan Eilers8eb25602020-03-09 12:13:48 +00001474 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001475
Finn Williamsb454c5c2021-02-09 15:56:23 +00001476 const armnn::ConstTensor& weights = constants.at(0);
1477
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001478 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1479 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1480 descriptor.m_PadLeft,
1481 descriptor.m_PadRight,
1482 descriptor.m_PadTop,
1483 descriptor.m_PadBottom,
1484 descriptor.m_StrideX,
1485 descriptor.m_StrideY,
1486 descriptor.m_BiasEnabled,
1487 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1488
1489 // weights & biases
1490 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1491 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001492 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001493 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001494 const armnn::ConstTensor& biases = constants.at(1);
1495 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001496 }
1497
1498 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1499 fbBaseLayer,
1500 fbDescriptor,
1501 fbWeightsConstTensorInfo,
1502 fbBiasesConstTensorInfo);
1503
1504 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001505}
1506
Finn Williamsb454c5c2021-02-09 15:56:23 +00001507void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001508 const armnn::TransposeDescriptor& descriptor,
1509 const char* name)
1510{
Jan Eilers8eb25602020-03-09 12:13:48 +00001511 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001512
1513 // Create FlatBuffer BaseLayer
1514 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1515
1516 std::vector<unsigned int> dimMappings;
1517 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1518 {
1519 dimMappings.push_back(descriptor.m_DimMappings[i]);
1520 }
1521
1522 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1523 m_flatBufferBuilder.CreateVector(dimMappings));
1524
1525 // Create the FlatBuffer TransposeLayer
1526 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1527 flatBufferBaseLayer,
1528 flatBufferDesc);
1529
1530 // Add the AnyLayer to the FlatBufferLayers
1531 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1532}
1533
Finn Williamsb454c5c2021-02-09 15:56:23 +00001534void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1535 const armnn::QLstmDescriptor& descriptor,
1536 const std::vector<armnn::ConstTensor>& constants,
1537 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001538{
James Conroy8d333182020-05-13 10:27:58 +01001539 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001540
James Conroy8d333182020-05-13 10:27:58 +01001541 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1542
1543 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1544 m_flatBufferBuilder,
1545 descriptor.m_CifgEnabled,
1546 descriptor.m_PeepholeEnabled,
1547 descriptor.m_ProjectionEnabled,
1548 descriptor.m_LayerNormEnabled,
1549 descriptor.m_CellClip,
1550 descriptor.m_ProjectionClip,
1551 descriptor.m_InputIntermediateScale,
1552 descriptor.m_ForgetIntermediateScale,
1553 descriptor.m_CellIntermediateScale,
1554 descriptor.m_OutputIntermediateScale,
1555 descriptor.m_HiddenStateZeroPoint,
1556 descriptor.m_HiddenStateScale
1557 );
1558
Finn Williamsb454c5c2021-02-09 15:56:23 +00001559 // Index for constants vector
1560 std::size_t i = 0;
1561
James Conroy8d333182020-05-13 10:27:58 +01001562 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001563 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1564 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1565 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1566 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1567 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1568 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1569 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1570 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1571 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001572
1573 // CIFG
1574 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1575 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1576 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1577
1578 if (!descriptor.m_CifgEnabled)
1579 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001580 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1581 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1582 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001583 }
1584
1585 // Peephole
1586 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1587 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1588 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1589
1590 if (descriptor.m_PeepholeEnabled)
1591 {
1592 if (!descriptor.m_CifgEnabled)
1593 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001594 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001595 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001596 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1597 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1598 }
James Conroy8d333182020-05-13 10:27:58 +01001599
Finn Williamsb454c5c2021-02-09 15:56:23 +00001600 // Projection
1601 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1602 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1603
1604 if (descriptor.m_ProjectionEnabled)
1605 {
1606 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1607 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001608 }
1609
1610 // Layer norm
1611 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1612 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1613 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1614 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1615
1616 if (descriptor.m_LayerNormEnabled)
1617 {
1618 if (!descriptor.m_CifgEnabled)
1619 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001620 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001621 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001622 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1623 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1624 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001625 }
1626
1627 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1628 m_flatBufferBuilder,
1629 inputToForgetWeights,
1630 inputToCellWeights,
1631 inputToOutputWeights,
1632 recurrentToForgetWeights,
1633 recurrentToCellWeights,
1634 recurrentToOutputWeights,
1635 forgetGateBias,
1636 cellBias,
1637 outputGateBias,
1638 inputToInputWeights,
1639 recurrentToInputWeights,
1640 inputGateBias,
1641 projectionWeights,
1642 projectionBias,
1643 cellToInputWeights,
1644 cellToForgetWeights,
1645 cellToOutputWeights,
1646 inputLayerNormWeights,
1647 forgetLayerNormWeights,
1648 cellLayerNormWeights,
1649 outputLayerNormWeights);
1650
1651 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1652 m_flatBufferBuilder,
1653 fbQLstmBaseLayer,
1654 fbQLstmDescriptor,
1655 fbQLstmParams);
1656
1657 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001658}
1659
Finn Williamsb454c5c2021-02-09 15:56:23 +00001660void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1661 const std::vector<armnn::ConstTensor>& constants,
1662 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001663{
Jan Eilers8eb25602020-03-09 12:13:48 +00001664 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001665
Jan Eilers5b01a892019-07-23 09:47:43 +01001666 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1667
Finn Williamsb454c5c2021-02-09 15:56:23 +00001668 // index for constants vector
1669 size_t i = 0;
1670
Jan Eilers5b01a892019-07-23 09:47:43 +01001671 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001672 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1673 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1674 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1675 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001676
Finn Williamsb454c5c2021-02-09 15:56:23 +00001677 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1678 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1679 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1680 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001681
Finn Williamsb454c5c2021-02-09 15:56:23 +00001682 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1683 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1684 auto cellBias = CreateConstTensorInfo(constants[i++]);
1685 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001686
1687 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1688 m_flatBufferBuilder,
1689 inputToInputWeights,
1690 inputToForgetWeights,
1691 inputToCellWeights,
1692 inputToOutputWeights,
1693 recurrentToInputWeights,
1694 recurrentToForgetWeights,
1695 recurrentToCellWeights,
1696 recurrentToOutputWeights,
1697 inputGateBias,
1698 forgetGateBias,
1699 cellBias,
1700 outputGateBias);
1701
1702 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1703 m_flatBufferBuilder,
1704 fbQuantizedLstmBaseLayer,
1705 fbQuantizedLstmParams);
1706
1707 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001708}
1709
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001710void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1711 const armnn::IConnectableLayer* layer,
1712 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1713 const std::vector<armnn::ConstTensor>& constants,
1714 const char* name)
1715{
1716 IgnoreUnused(name);
1717
1718 auto fbUnidirectionalSequenceLstmBaseLayer =
1719 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1720
1721 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1722 m_flatBufferBuilder,
1723 descriptor.m_ActivationFunc,
1724 descriptor.m_ClippingThresCell,
1725 descriptor.m_ClippingThresProj,
1726 descriptor.m_CifgEnabled,
1727 descriptor.m_PeepholeEnabled,
1728 descriptor.m_ProjectionEnabled,
1729 descriptor.m_LayerNormEnabled,
1730 descriptor.m_TimeMajor);
1731
1732 // Index for constants vector
1733 std::size_t i = 0;
1734
1735 // Get mandatory/basic input parameters
1736 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1737 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1738 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1739 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1740 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1741 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1742 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1743 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1744 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1745
1746 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1747 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1748 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1749 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1750 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1751 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1752 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1753 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1754 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1755 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1756 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1757 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1758 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1759
1760 if (!descriptor.m_CifgEnabled)
1761 {
1762 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1763 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1764 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1765 }
1766
1767 if (descriptor.m_PeepholeEnabled)
1768 {
1769 if (!descriptor.m_CifgEnabled)
1770 {
1771 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1772 }
1773 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1774 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1775 }
1776
1777 if (descriptor.m_ProjectionEnabled)
1778 {
1779 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1780 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1781 }
1782
1783 if (descriptor.m_LayerNormEnabled)
1784 {
1785 if (!descriptor.m_CifgEnabled)
1786 {
1787 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1788 }
1789 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1790 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1791 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1792 }
1793
1794 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1795 m_flatBufferBuilder,
1796 inputToForgetWeights,
1797 inputToCellWeights,
1798 inputToOutputWeights,
1799 recurrentToForgetWeights,
1800 recurrentToCellWeights,
1801 recurrentToOutputWeights,
1802 forgetGateBias,
1803 cellBias,
1804 outputGateBias,
1805 inputToInputWeights,
1806 recurrentToInputWeights,
1807 cellToInputWeights,
1808 inputGateBias,
1809 projectionWeights,
1810 projectionBias,
1811 cellToForgetWeights,
1812 cellToOutputWeights,
1813 inputLayerNormWeights,
1814 forgetLayerNormWeights,
1815 cellLayerNormWeights,
1816 outputLayerNormWeights);
1817
1818 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1819 m_flatBufferBuilder,
1820 fbUnidirectionalSequenceLstmBaseLayer,
1821 fbUnidirectionalSequenceLstmDescriptor,
1822 fbUnidirectionalSequenceLstmParams);
1823
1824 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1825}
1826
Finn Williamsb454c5c2021-02-09 15:56:23 +00001827fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001828 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001829{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001830
Sadik Armagandb059fd2019-03-20 12:28:32 +00001831 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1832
Mike Kelly8c1701a2019-02-11 17:01:27 +00001833 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1834 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1835
1836 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001837 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001838 m_flatBufferBuilder.CreateString(layer->GetName()),
1839 layerType,
1840 m_flatBufferBuilder.CreateVector(inputSlots),
1841 m_flatBufferBuilder.CreateVector(outputSlots));
1842}
1843
Finn Williamsb454c5c2021-02-09 15:56:23 +00001844void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001845{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001846
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001847 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001848 m_serializedLayers.push_back(anyLayer);
1849}
1850
Mike Kellya0766c32019-02-19 17:22:07 +00001851template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001852flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001853{
1854 const T* buffer = reinterpret_cast<const T*>(memory);
1855 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1856 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1857 return fbVector;
1858}
1859
Finn Williamsb454c5c2021-02-09 15:56:23 +00001860flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001861{
Mike Kellya0766c32019-02-19 17:22:07 +00001862 // Get the dimensions
1863 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001864 std::vector<bool> specificity;
1865 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1866 // matches the size of dimensions.
1867 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1868 {
1869 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001870
1871 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1872 {
1873 shape.push_back(tensorInfo.GetShape()[dim]);
1874 }
1875 else
1876 {
1877 shape.push_back(0);
1878 }
Colm Donelan800b2812021-02-12 12:43:35 +00001879 }
1880
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001881 if (tensorInfo.HasPerAxisQuantization())
1882 {
1883 // Create FlatBuffer TensorInfo
1884 auto flatBufferTensorInfo =
1885 serializer::CreateTensorInfo(m_flatBufferBuilder,
1886 m_flatBufferBuilder.CreateVector(shape),
1887 GetFlatBufferDataType(tensorInfo.GetDataType()),
1888 tensorInfo.GetQuantizationScales()[0],
1889 tensorInfo.GetQuantizationOffset(),
1890 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001891 tensorInfo.GetQuantizationDim().value(),
1892 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001893 (tensorInfo.GetShape().GetDimensionality()),
1894 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001895 return flatBufferTensorInfo;
1896 }
1897
Mike Kellya0766c32019-02-19 17:22:07 +00001898 // Create FlatBuffer TensorInfo
1899 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1900 m_flatBufferBuilder.CreateVector(shape),
1901 GetFlatBufferDataType(tensorInfo.GetDataType()),
1902 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001903 tensorInfo.GetQuantizationOffset(),
1904 0,
1905 0,
1906 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001907 (tensorInfo.GetShape().GetDimensionality()),
1908 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001909 return flatBufferTensorInfo;
1910}
1911
1912flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001913 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001914{
1915 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1916
Mike Kellya0766c32019-02-19 17:22:07 +00001917 flatbuffers::Offset<void> fbPayload;
1918
1919 switch (tensorInfo.GetDataType())
1920 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001921 case armnn::DataType::Signed64:
1922 {
1923 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1924 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1925 m_flatBufferBuilder,
1926 fbVector);
1927 fbPayload = flatBuffersData.o;
1928 break;
1929 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001930 case armnn::DataType::Float32:
1931 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001932 {
1933 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1934 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1935 m_flatBufferBuilder,
1936 fbVector);
1937 fbPayload = flatBuffersData.o;
1938 break;
1939 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001940 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001941 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001942 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001943 {
1944 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1945 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1946 m_flatBufferBuilder,
1947 fbVector);
1948 fbPayload = flatBuffersData.o;
1949 break;
1950 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001951 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001952 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001953 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001954 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001955 default:
1956 {
1957 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1958 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1959 m_flatBufferBuilder,
1960 fbVector);
1961 fbPayload = flatBuffersData.o;
1962 }
1963 }
1964 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1965 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001966 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001967 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1968 fbPayload);
1969 return flatBufferConstTensor;
1970}
1971
Finn Williamsb454c5c2021-02-09 15:56:23 +00001972flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001973{
1974 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1975 serializer::CreateFeatureCompatibilityVersions(
1976 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001977 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001978 1, // Weights layout scheme version
1979 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001980 );
1981 return versionsTable;
1982}
1983
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001984std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001985 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001986{
Mike Kellya0766c32019-02-19 17:22:07 +00001987 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001988
1989 // Get the InputSlots
1990 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1991 {
1992 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1993
1994 // Get the Connection for the InputSlot
1995 const IOutputSlot* connection = inputSlot.GetConnection();
Mike Kelly4cc341c2023-07-07 15:43:06 +01001996 bool isOverridden = inputSlot.IsTensorInfoOverridden();
1997
1998 flatbuffers::Offset<TensorInfo> overriddenTensorInfo = CreateTensorInfo(inputSlot.GetTensorInfo());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001999
2000 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00002001 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
2002 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00002003 // Create FlatBuffer InputSlot
Mike Kelly4cc341c2023-07-07 15:43:06 +01002004 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn, isOverridden,
2005 overriddenTensorInfo));
Mike Kelly8c1701a2019-02-11 17:01:27 +00002006 }
2007 return inputSlots;
2008}
2009
Derek Lamberti0028d1b2019-02-20 13:57:42 +00002010std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00002011 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00002012{
2013 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
2014
2015 // Get the OutputSlots
2016 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
2017 {
2018 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00002019 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00002020
Mike Kelly8c1701a2019-02-11 17:01:27 +00002021 // Create FlatBuffer Outputslot
2022 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
2023 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00002024 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00002025 }
2026 return outputSlots;
2027}
2028
Finn Williamsb454c5c2021-02-09 15:56:23 +00002029void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
2030 const BaseDescriptor& descriptor,
2031 const std::vector<armnn::ConstTensor>& constants,
2032 const char* name,
2033 const armnn::LayerBindingId id)
2034{
2035 IgnoreUnused(constants);
2036
2037 switch (layer->GetType())
2038 {
2039 case armnn::LayerType::Activation :
2040 {
2041 const armnn::ActivationDescriptor& layerDescriptor =
2042 static_cast<const armnn::ActivationDescriptor&>(descriptor);
2043 SerializeActivationLayer(layer, layerDescriptor, name);
2044 break;
2045 }
2046 case armnn::LayerType::Addition :
2047 {
2048 SerializeAdditionLayer(layer, name);
2049 break;
2050 }
2051 case armnn::LayerType::ArgMinMax :
2052 {
2053 const armnn::ArgMinMaxDescriptor& layerDescriptor =
2054 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
2055 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
2056 break;
2057 }
Samuel Yapa04f4a12022-08-19 11:14:38 +01002058 case armnn::LayerType::BatchMatMul:
2059 {
2060 const armnn::BatchMatMulDescriptor& layerDescriptor =
2061 static_cast<const armnn::BatchMatMulDescriptor&>(descriptor);
2062 SerializeBatchMatMulLayer(layer,
2063 layerDescriptor,
2064 name);
2065 break;
2066 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002067 case armnn::LayerType::BatchNormalization :
2068 {
2069 const armnn::BatchNormalizationDescriptor& layerDescriptor =
2070 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
2071 SerializeBatchNormalizationLayer(layer,
2072 layerDescriptor,
2073 constants,
2074 name);
2075 break;
2076 }
2077 case armnn::LayerType::BatchToSpaceNd :
2078 {
2079 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2080 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2081 SerializeBatchToSpaceNdLayer(layer,
2082 layerDescriptor,
2083 name);
2084 break;
2085 }
mathad01b392e982021-04-07 12:07:30 +01002086 case armnn::LayerType::Cast :
2087 {
2088 SerializeCastLayer(layer, name);
2089 break;
2090 }
Simon Obute51f67772021-09-03 15:50:13 +01002091 case armnn::LayerType::ChannelShuffle :
2092 {
2093 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2094 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2095 SerializeChannelShuffleLayer(layer,
2096 layerDescriptor,
2097 name);
2098 break;
2099 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002100 case armnn::LayerType::Comparison :
2101 {
2102 const armnn::ComparisonDescriptor& layerDescriptor =
2103 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2104 SerializeComparisonLayer(layer,
2105 layerDescriptor,
2106 name);
2107 break;
2108 }
2109 case armnn::LayerType::Concat :
2110 {
2111 const armnn::ConcatDescriptor& layerDescriptor =
2112 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2113 SerializeConcatLayer(layer,
2114 layerDescriptor,
2115 name);
2116 break;
2117 }
2118 case armnn::LayerType::Constant :
2119 {
2120 SerializeConstantLayer(layer,
2121 constants,
2122 name);
2123 break;
2124 }
2125 case armnn::LayerType::Convolution2d :
2126 {
2127 const armnn::Convolution2dDescriptor& layerDescriptor =
2128 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2129 SerializeConvolution2dLayer(layer,
2130 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002131 name);
2132 break;
2133 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002134 case armnn::LayerType::Convolution3d :
2135 {
2136 const armnn::Convolution3dDescriptor& layerDescriptor =
2137 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2138 SerializeConvolution3dLayer(layer,
2139 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002140 name);
2141 break;
2142 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002143 case armnn::LayerType::DepthToSpace :
2144 {
2145 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2146 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2147 SerializeDepthToSpaceLayer(layer,
2148 layerDescriptor,
2149 name);
2150 break;
2151 }
2152 case armnn::LayerType::DepthwiseConvolution2d :
2153 {
2154 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2155 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2156 SerializeDepthwiseConvolution2dLayer(layer,
2157 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002158 name);
2159 break;
2160 }
2161 case armnn::LayerType::Dequantize :
2162 {
2163 SerializeDequantizeLayer(layer,
2164 name);
2165 break;
2166 }
2167 case armnn::LayerType::DetectionPostProcess :
2168 {
2169 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2170 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2171 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2172 break;
2173 }
2174 case armnn::LayerType::Division :
2175 {
2176 SerializeDivisionLayer(layer, name);
2177 break;
2178 }
Mike Kelly3ec30772023-03-08 13:47:17 +00002179 case armnn::LayerType::ElementwiseBinary :
2180 {
2181 const armnn::ElementwiseBinaryDescriptor& layerDescriptor =
2182 static_cast<const armnn::ElementwiseBinaryDescriptor&>(descriptor);
2183 SerializeElementwiseBinaryLayer(layer, layerDescriptor, name);
2184 break;
2185 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002186 case armnn::LayerType::ElementwiseUnary :
2187 {
2188 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2189 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2190 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2191 break;
2192 }
2193 case armnn::LayerType::Fill :
2194 {
2195 const armnn::FillDescriptor& layerDescriptor =
2196 static_cast<const armnn::FillDescriptor&>(descriptor);
2197 SerializeFillLayer(layer, layerDescriptor, name);
2198 break;
2199 }
2200 case armnn::LayerType::Floor :
2201 {
2202 SerializeFloorLayer(layer, name);
2203 break;
2204 }
2205 case armnn::LayerType::FullyConnected :
2206 {
2207 const armnn::FullyConnectedDescriptor& layerDescriptor =
2208 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002209 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002210 break;
2211 }
2212 case armnn::LayerType::Gather :
2213 {
2214 const armnn::GatherDescriptor& layerDescriptor =
2215 static_cast<const armnn::GatherDescriptor&>(descriptor);
2216 SerializeGatherLayer(layer, layerDescriptor, name);
2217 break;
2218 }
Teresa Charlin6966bfa2022-04-25 17:14:50 +01002219 case armnn::LayerType::GatherNd :
2220 {
2221 SerializeGatherNdLayer(layer, name);
2222 break;
2223 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002224 case armnn::LayerType::Input:
2225 {
2226 SerializeInputLayer(layer, id, name);
2227 break;
2228 }
2229 case armnn::LayerType::InstanceNormalization :
2230 {
2231 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2232 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2233 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2234 break;
2235 }
2236 case armnn::LayerType::L2Normalization :
2237 {
2238 const armnn::L2NormalizationDescriptor& layerDescriptor =
2239 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2240 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2241 break;
2242 }
2243 case armnn::LayerType::LogicalBinary :
2244 {
2245 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2246 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2247 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2248 break;
2249 }
2250 case armnn::LayerType::LogSoftmax :
2251 {
2252 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2253 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2254 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2255 break;
2256 }
2257 case armnn::LayerType::Lstm :
2258 {
2259 const armnn::LstmDescriptor& layerDescriptor =
2260 static_cast<const armnn::LstmDescriptor&>(descriptor);
2261 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2262 break;
2263 }
2264 case armnn::LayerType::QLstm :
2265 {
2266 const armnn::QLstmDescriptor& layerDescriptor =
2267 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2268 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2269 break;
2270 }
2271 case armnn::LayerType::Maximum :
2272 {
2273 SerializeMaximumLayer(layer, name);
2274 break;
2275 }
2276 case armnn::LayerType::Mean :
2277 {
2278 const armnn::MeanDescriptor& layerDescriptor =
2279 static_cast<const armnn::MeanDescriptor&>(descriptor);
2280 SerializeMeanLayer(layer, layerDescriptor, name);
2281 break;
2282 }
2283 case armnn::LayerType::Merge :
2284 {
2285 SerializeMergeLayer(layer, name);
2286 break;
2287 }
2288 case armnn::LayerType::Minimum :
2289 {
2290 SerializeMinimumLayer(layer, name);
2291 break;
2292 }
2293 case armnn::LayerType::Multiplication :
2294 {
2295 SerializeMultiplicationLayer(layer, name);
2296 break;
2297 }
2298 case armnn::LayerType::Normalization :
2299 {
2300 const armnn::NormalizationDescriptor& layerDescriptor =
2301 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2302 SerializeNormalizationLayer(layer, layerDescriptor, name);
2303 break;
2304 }
2305 case armnn::LayerType::Output:
2306 {
2307 SerializeOutputLayer(layer, id, name);
2308 break;
2309 }
2310 case armnn::LayerType::Pad :
2311 {
2312 const armnn::PadDescriptor& layerDescriptor =
2313 static_cast<const armnn::PadDescriptor&>(descriptor);
2314 SerializePadLayer(layer, layerDescriptor, name);
2315 break;
2316 }
2317 case armnn::LayerType::Permute :
2318 {
2319 const armnn::PermuteDescriptor& layerDescriptor =
2320 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2321 SerializePermuteLayer(layer, layerDescriptor, name);
2322 break;
2323 }
2324 case armnn::LayerType::Pooling2d :
2325 {
2326 const armnn::Pooling2dDescriptor& layerDescriptor =
2327 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2328 SerializePooling2dLayer(layer, layerDescriptor, name);
2329 break;
2330 }
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002331 case armnn::LayerType::Pooling3d :
2332 {
2333 const armnn::Pooling3dDescriptor& layerDescriptor =
2334 static_cast<const armnn::Pooling3dDescriptor&>(descriptor);
2335 SerializePooling3dLayer(layer, layerDescriptor, name);
2336 break;
2337 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002338 case armnn::LayerType::Prelu :
2339 {
2340 SerializePreluLayer(layer, name);
2341 break;
2342 }
2343 case armnn::LayerType::Quantize :
2344 {
2345 SerializeQuantizeLayer(layer, name);
2346 break;
2347 }
2348 case armnn::LayerType::QuantizedLstm:
2349 SerializeQuantizedLstmLayer(layer, constants, name);
2350 break;
2351 case armnn::LayerType::Reshape:
2352 {
2353 const armnn::ReshapeDescriptor &layerDescriptor =
2354 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2355 SerializeReshapeLayer(layer, layerDescriptor, name);
2356 break;
2357 }
2358 case armnn::LayerType::Rank:
2359 {
2360 SerializeRankLayer(layer, name);
2361 break;
2362 }
2363 case armnn::LayerType::Reduce:
2364 {
2365 const armnn::ReduceDescriptor& layerDescriptor =
2366 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2367 SerializeReduceLayer(layer, layerDescriptor, name);
2368 break;
2369 }
2370 case armnn::LayerType::Resize:
2371 {
2372 const armnn::ResizeDescriptor& layerDescriptor =
2373 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2374 SerializeResizeLayer(layer, layerDescriptor, name);
2375 break;
2376 }
Tracy Narine944fb502023-07-04 15:08:57 +01002377 case armnn::LayerType::ReverseV2:
2378 {
Tracy Narinebb8d7592023-07-13 16:50:54 +01002379 SerializeReverseV2Layer(layer, name);
Tracy Narine944fb502023-07-04 15:08:57 +01002380 break;
2381 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002382 case armnn::LayerType::Shape:
2383 {
2384 SerializeShapeLayer(layer, name);
2385 break;
2386 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002387 case armnn::LayerType::Slice:
2388 {
2389 const armnn::SliceDescriptor& layerDescriptor =
2390 static_cast<const armnn::SliceDescriptor&>(descriptor);
2391 SerializeSliceLayer(layer, layerDescriptor, name);
2392 break;
2393 }
2394 case armnn::LayerType::Softmax:
2395 {
2396 const armnn::SoftmaxDescriptor& layerDescriptor =
2397 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2398 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2399 break;
2400 }
2401 case armnn::LayerType::SpaceToBatchNd:
2402 {
2403 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2404 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2405 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2406 break;
2407 }
2408 case armnn::LayerType::SpaceToDepth:
2409 {
2410 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2411 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2412 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2413 break;
2414 }
2415 case armnn::LayerType::Splitter:
2416 {
2417 const armnn::SplitterDescriptor& layerDescriptor =
2418 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2419 SerializeSplitterLayer(layer, layerDescriptor, name);
2420 break;
2421 }
2422 case armnn::LayerType::Stack:
2423 {
2424 const armnn::StackDescriptor& layerDescriptor =
2425 static_cast<const armnn::StackDescriptor&>(descriptor);
2426 SerializeStackLayer(layer, layerDescriptor, name);
2427 break;
2428 }
2429 case armnn::LayerType::StandIn:
2430 {
2431 const armnn::StandInDescriptor& layerDescriptor =
2432 static_cast<const armnn::StandInDescriptor&>(descriptor);
2433 SerializeStandInLayer(layer, layerDescriptor, name);
2434 break;
2435 }
2436 case armnn::LayerType::StridedSlice:
2437 {
2438 const armnn::StridedSliceDescriptor& layerDescriptor =
2439 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2440 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2441 break;
2442 }
2443 case armnn::LayerType::Subtraction:
2444 {
2445 SerializeSubtractionLayer(layer, name);
2446 break;
2447 }
2448 case armnn::LayerType::Switch:
2449 {
2450 SerializeSwitchLayer(layer, name);
2451 break;
2452 }
David Monahan616b22f2023-07-25 12:08:10 +01002453 case armnn::LayerType::Tile:
2454 {
2455 const armnn::TileDescriptor& layerDescriptor =
2456 static_cast<const armnn::TileDescriptor&>(descriptor);
2457 SerializeTileLayer(layer, layerDescriptor, name);
2458 break;
2459 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002460 case armnn::LayerType::Transpose:
2461 {
2462 const armnn::TransposeDescriptor& layerDescriptor =
2463 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2464 SerializeTransposeLayer(layer, layerDescriptor, name);
2465 break;
2466 }
2467 case armnn::LayerType::TransposeConvolution2d:
2468 {
2469 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2470 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2471 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2472 break;
2473 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002474 case armnn::LayerType::UnidirectionalSequenceLstm :
2475 {
2476 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2477 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2478 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2479 break;
2480 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002481 default:
2482 {
2483 throw InvalidArgumentException(
2484 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2485 layer->GetName(),
2486 id));
2487 }
2488 }
2489}
2490
Finn Williams85d36712021-01-26 22:30:06 +00002491void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002492{
2493 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002494 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2495 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002496
2497 // Create FlatBuffer SerializedGraph
2498 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002499 fbBuilder,
2500 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2501 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2502 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2503 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002504
2505 // Serialize the graph
2506 fbBuilder.Finish(serializedGraph);
2507}
2508
Finn Williamsb454c5c2021-02-09 15:56:23 +00002509
Finn Williams85d36712021-01-26 22:30:06 +00002510bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002511{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002512 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002513
Matthew Sloyan0663d662020-09-14 11:47:26 +01002514 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002515 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002516 return !stream.bad();
2517}
2518
Finn Williams2605b232020-06-10 15:53:46 +01002519} // namespace armnnSerializer