blob: 9a3a270de5c70b28b23f97082e5fc4b6b4f1fcf4 [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
Mike Kelly8c1701a2019-02-11 17:01:27 +00005#include "Serializer.hpp"
Finn Williamsb454c5c2021-02-09 15:56:23 +00006#include "SerializerUtils.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
Matthew Benthamff130e22020-01-17 11:47:42 +00008#include <armnn/Descriptors.hpp>
9#include <armnn/LstmParams.hpp>
10#include <armnn/QuantizedLstmParams.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000011#include <armnn/utility/IgnoreUnused.hpp>
Matthew Sloyan0663d662020-09-14 11:47:26 +010012#include <armnn/utility/NumericCast.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Finn Williamsb454c5c2021-02-09 15:56:23 +000014#include <fmt/format.h>
Mike Kelly8c1701a2019-02-11 17:01:27 +000015#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000016
Mike Kelly8c1701a2019-02-11 17:01:27 +000017using namespace armnn;
18namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000019namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000020
21namespace armnnSerializer
22{
23
Finn Williams85d36712021-01-26 22:30:06 +000024ISerializer::ISerializer() : pSerializerImpl(new SerializerImpl())
25{
26}
27
28ISerializer::~ISerializer() = default;
29
30ISerializer* ISerializer::CreateRaw()
31{
32 return new ISerializer();
33}
34
35ISerializerPtr ISerializer::Create()
36{
37 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
38}
39
40void ISerializer::Destroy(ISerializer* serializer)
41{
42 delete serializer;
43}
44
45void ISerializer::Serialize(const armnn::INetwork& inNetwork)
46{
47 pSerializerImpl->Serialize(inNetwork);
48}
49
50bool ISerializer::SaveSerializedToStream(std::ostream& stream)
51{
52 return pSerializerImpl->SaveSerializedToStream(stream);
53}
54
Mike Kellyaf484012019-02-20 16:53:11 +000055serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
56{
57 switch (function)
58 {
59 case armnn::ActivationFunction::Sigmoid:
60 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
61 case armnn::ActivationFunction::TanH:
62 return serializer::ActivationFunction::ActivationFunction_TanH;
63 case armnn::ActivationFunction::Linear:
64 return serializer::ActivationFunction::ActivationFunction_Linear;
65 case armnn::ActivationFunction::ReLu:
66 return serializer::ActivationFunction::ActivationFunction_ReLu;
67 case armnn::ActivationFunction::BoundedReLu:
68 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
69 case armnn::ActivationFunction::LeakyReLu:
70 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
71 case armnn::ActivationFunction::Abs:
72 return serializer::ActivationFunction::ActivationFunction_Abs;
73 case armnn::ActivationFunction::Sqrt:
74 return serializer::ActivationFunction::ActivationFunction_Sqrt;
75 case armnn::ActivationFunction::Square:
76 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000077 case armnn::ActivationFunction::Elu:
78 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000079 case armnn::ActivationFunction::HardSwish:
80 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Mike Kellyaf484012019-02-20 16:53:11 +000081 default:
82 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
83 }
84}
85
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010086serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
87{
88 switch (function)
89 {
90 case armnn::ArgMinMaxFunction::Max:
91 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
92 case armnn::ArgMinMaxFunction::Min:
93 default:
94 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
95 }
96}
97
Finn Williamsb454c5c2021-02-09 15:56:23 +000098uint32_t SerializerStrategy::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000099{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000100 if (m_guidMap.empty())
101 {
janeil013fec1ea2019-11-07 09:47:20 +0000102 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000103 }
104 else if (m_guidMap.find(guid) == m_guidMap.end())
105 {
janeil013fec1ea2019-11-07 09:47:20 +0000106 ++m_layerId;
107 m_guidMap.insert(std::make_pair(guid, m_layerId));
108
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000109 return m_layerId;
110 }
Saoirse Stewart30211042019-02-18 17:19:16 +0000111 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000112}
113
Mike Kelly8c1701a2019-02-11 17:01:27 +0000114// Build FlatBuffer for Input Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000115void SerializerStrategy::SerializeInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000116{
Jan Eilers8eb25602020-03-09 12:13:48 +0000117 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000118
Mike Kelly8c1701a2019-02-11 17:01:27 +0000119 // Create FlatBuffer BaseLayer
120 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
121
122 // Create FlatBuffer BindableBaseLayer
123 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
124 flatBufferInputBaseLayer,
125 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000126 // Push layer binding id to outputIds.
127 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000128
129 // Create the FlatBuffer InputLayer
130 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
131
132 // Add the AnyLayer to the FlatBufferLayers
133 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
134}
135
136// Build FlatBuffer for Output Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000137void SerializerStrategy::SerializeOutputLayer(const armnn::IConnectableLayer* layer,
138 LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000139{
Jan Eilers8eb25602020-03-09 12:13:48 +0000140 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000141
Mike Kelly8c1701a2019-02-11 17:01:27 +0000142 // Create FlatBuffer BaseLayer
143 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
144
145 // Create FlatBuffer BindableBaseLayer
146 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
147 flatBufferOutputBaseLayer,
148 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000149 // Push layer binding id to outputIds.
150 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000151
152 // Create the FlatBuffer OutputLayer
153 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
154 // Add the AnyLayer to the FlatBufferLayers
155 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
156}
157
Finn Williamsb454c5c2021-02-09 15:56:23 +0000158void SerializerStrategy::SerializeAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
Kevin May868eb142019-09-04 17:29:31 +0100159{
Jan Eilers8eb25602020-03-09 12:13:48 +0000160 IgnoreUnused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100161 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
162 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
163
164 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100165}
166
Mike Kellyaf484012019-02-20 16:53:11 +0000167// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000168void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
169 const armnn::ActivationDescriptor& descriptor,
170 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000171{
Jan Eilers8eb25602020-03-09 12:13:48 +0000172 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000173
Mike Kellyaf484012019-02-20 16:53:11 +0000174 // Create FlatBuffer BaseLayer
175 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
176
177 // Create the FlatBuffer ActivationDescriptor
178 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
179 GetFlatBufferActivationFunction(descriptor.m_Function),
180 descriptor.m_A,
181 descriptor.m_B);
182
183 // Create the FlatBuffer ActivationLayer
184 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
185 flatBufferBaseLayer,
186 flatBufferDescriptor);
187
188 // Add the AnyLayer to the FlatBufferLayers
189 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
190}
191
Mike Kelly8c1701a2019-02-11 17:01:27 +0000192// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000193void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000194{
Jan Eilers8eb25602020-03-09 12:13:48 +0000195 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000196
Mike Kelly8c1701a2019-02-11 17:01:27 +0000197 // Create FlatBuffer BaseLayer
198 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
199
200 // Create the FlatBuffer AdditionLayer
201 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
202
203 // Add the AnyLayer to the FlatBufferLayers
204 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
205}
206
Nikhil Rajee391d52019-09-05 17:50:44 +0100207// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000208void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
209 const armnn::ArgMinMaxDescriptor& descriptor,
210 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100211{
Jan Eilers8eb25602020-03-09 12:13:48 +0000212 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000213
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100214 // Create FlatBuffer BaseLayer
215 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
216
217 // Create FlatBuffer Descriptor
218 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
219 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
220 descriptor.m_Axis);
221
222 // Create FlatBuffer ArgMinMaxLayer
223 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
224 flatBufferBaseLayer,
225 flatBufferDescriptor);
226
227 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100228}
229
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000230// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000231void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
232 const armnn::BatchToSpaceNdDescriptor& descriptor,
233 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000234{
Jan Eilers8eb25602020-03-09 12:13:48 +0000235 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000236
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000237 // Create FlatBuffer BaseLayer
238 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
239
240 std::vector<unsigned int> crops;
241 crops.reserve(descriptor.m_Crops.size() * 2);
242 for (auto& crop : descriptor.m_Crops)
243 {
244 crops.push_back(crop.first);
245 crops.push_back(crop.second);
246 }
247
248 auto flatBufferDescriptor =
249 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
250 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
251 m_flatBufferBuilder.CreateVector(crops),
252 GetFlatBufferDataLayout(descriptor.m_DataLayout));
253
254 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
255 flatBufferBaseLayer,
256 flatBufferDescriptor);
257
258 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
259}
260
Finn Williamsb454c5c2021-02-09 15:56:23 +0000261void SerializerStrategy::SerializeBatchNormalizationLayer(
262 const armnn::IConnectableLayer* layer,
263 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
264 const std::vector<armnn::ConstTensor>& constants,
265 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000266{
Jan Eilers8eb25602020-03-09 12:13:48 +0000267 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000268
Finn Williamsb454c5c2021-02-09 15:56:23 +0000269 const armnn::ConstTensor& mean = constants[0];
270 const armnn::ConstTensor& variance = constants[1];
271 const armnn::ConstTensor& beta = constants[2];
272 const armnn::ConstTensor& gamma = constants[3];
273
ruoyan018e7fa232019-02-28 15:09:07 +0000274 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
275 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
276 m_flatBufferBuilder,
277 batchNormDescriptor.m_Eps,
278 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
279
280 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
281 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
282 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
283 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
284 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
285 fbBatchNormalizationBaseLayer,
286 fbBatchNormalizationDescriptor,
287 fbMeanConstTensorInfo,
288 fbVarianceConstTensorInfo,
289 fbBetaConstTensorInfo,
290 fbGammaConstTensorInfo);
291
292 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
293}
294
mathad01b392e982021-04-07 12:07:30 +0100295void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
296 const char* name)
297{
298 IgnoreUnused(name);
299
300 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
301 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
302 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
303}
304
Simon Obute51f67772021-09-03 15:50:13 +0100305void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
306 const armnn::ChannelShuffleDescriptor& descriptor,
307 const char* name)
308{
309 IgnoreUnused(name);
310 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
311 descriptor.m_Axis,
312 descriptor.m_NumGroups);
313 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
314 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
315 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
316}
317
Finn Williamsb454c5c2021-02-09 15:56:23 +0000318void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100319 const armnn::ComparisonDescriptor& descriptor,
320 const char* name)
321{
Jan Eilers8eb25602020-03-09 12:13:48 +0000322 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000323
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100324 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
325 auto fbDescriptor = serializer::CreateComparisonDescriptor(
326 m_flatBufferBuilder,
327 GetFlatBufferComparisonOperation(descriptor.m_Operation));
328
329 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
330 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100331}
332
Conor Kennedy76277882019-02-26 08:29:54 +0000333// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000334void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
335 const std::vector<armnn::ConstTensor>& constants,
336 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000337{
Jan Eilers8eb25602020-03-09 12:13:48 +0000338 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000339
Finn Williamsb454c5c2021-02-09 15:56:23 +0000340 armnn::ConstTensor input = constants[0];
341
Conor Kennedy76277882019-02-26 08:29:54 +0000342 // Create FlatBuffer BaseLayer
343 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
344
345 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
346
347 // Create the FlatBuffer ConstantLayer
348 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
349 flatBufferConstantBaseLayer,
350 flatBufferConstTensorInfo);
351
352 // Add the AnyLayer to the FlatBufferLayers
353 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
354}
355
Mike Kellya0766c32019-02-19 17:22:07 +0000356// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000357void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
358 const armnn::Convolution2dDescriptor& descriptor,
359 const std::vector<armnn::ConstTensor>& constants,
360 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000361{
Jan Eilers8eb25602020-03-09 12:13:48 +0000362 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000363
Finn Williamsb454c5c2021-02-09 15:56:23 +0000364 const armnn::ConstTensor weights = constants[0];
365
Mike Kellya0766c32019-02-19 17:22:07 +0000366 // Create FlatBuffer BaseLayer
367 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
368
369 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
370 descriptor.m_PadLeft,
371 descriptor.m_PadRight,
372 descriptor.m_PadTop,
373 descriptor.m_PadBottom,
374 descriptor.m_StrideX,
375 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100376 descriptor.m_DilationX,
377 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000378 descriptor.m_BiasEnabled,
379 GetFlatBufferDataLayout(descriptor.m_DataLayout));
380 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
381 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
382
Finn Williamsb454c5c2021-02-09 15:56:23 +0000383 if (constants.size() > 1)
Mike Kellya0766c32019-02-19 17:22:07 +0000384 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000385 const armnn::ConstTensor biases = constants[1];
386 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Mike Kellya0766c32019-02-19 17:22:07 +0000387 }
388
389 // Create the FlatBuffer Convolution2dLayer
390 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
391 flatBufferBaseLayer,
392 flatBufferDescriptor,
393 flatBufferWeightsConstTensorInfo,
394 flatBufferBiasesConstTensorInfo);
395
396 // Add the AnyLayer to the FlatBufferLayers
397 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
398}
399
Finn Williamsb454c5c2021-02-09 15:56:23 +0000400void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100401 const armnn::DepthToSpaceDescriptor& descriptor,
402 const char* name)
403{
Jan Eilers8eb25602020-03-09 12:13:48 +0000404 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000405
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100406 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
407 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
408 descriptor.m_BlockSize,
409 GetFlatBufferDataLayout(descriptor.m_DataLayout));
410
411 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
412
413 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100414}
415
Finn Williamsb454c5c2021-02-09 15:56:23 +0000416void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
417 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
418 const std::vector<armnn::ConstTensor>& constants,
419 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000420{
Jan Eilers8eb25602020-03-09 12:13:48 +0000421 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000422
Finn Williamsb454c5c2021-02-09 15:56:23 +0000423 const armnn::ConstTensor& weights = constants[0];
424
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000425 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
426 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
427 descriptor.m_PadLeft,
428 descriptor.m_PadRight,
429 descriptor.m_PadTop,
430 descriptor.m_PadBottom,
431 descriptor.m_StrideX,
432 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100433 descriptor.m_DilationX,
434 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000435 descriptor.m_BiasEnabled,
436 GetFlatBufferDataLayout(descriptor.m_DataLayout));
437
438 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
439 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000440
441 if (constants.size() > 1)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000442 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000443 const armnn::ConstTensor& biases = constants[1];
444 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000445 }
446
447 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
448 fbBaseLayer,
449 fbDescriptor,
450 fbWeightsConstTensorInfo,
451 fbBiasesConstTensorInfo);
452
453 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
454}
455
Finn Williamsb454c5c2021-02-09 15:56:23 +0000456void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000457 const char* name)
458{
Jan Eilers8eb25602020-03-09 12:13:48 +0000459 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000460
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000461 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
462 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
463
464 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
465}
466
Finn Williamsb454c5c2021-02-09 15:56:23 +0000467void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
468 const armnn::DetectionPostProcessDescriptor& descriptor,
469 const std::vector<armnn::ConstTensor>& constants,
470 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000471{
Jan Eilers8eb25602020-03-09 12:13:48 +0000472 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000473
Finn Williamsb454c5c2021-02-09 15:56:23 +0000474 const armnn::ConstTensor& anchors = constants[0];
475
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000476 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
477 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
478 descriptor.m_MaxDetections,
479 descriptor.m_MaxClassesPerDetection,
480 descriptor.m_DetectionsPerClass,
481 descriptor.m_NmsScoreThreshold,
482 descriptor.m_NmsIouThreshold,
483 descriptor.m_NumClasses,
484 descriptor.m_UseRegularNms,
485 descriptor.m_ScaleX,
486 descriptor.m_ScaleY,
487 descriptor.m_ScaleW,
488 descriptor.m_ScaleH);
489
490 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
491
492 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
493 fbBaseLayer,
494 fbDescriptor,
495 fbAnchorsConstTensorInfo);
496
497 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
498}
499
Finn Williamsb454c5c2021-02-09 15:56:23 +0000500void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000501{
Jan Eilers8eb25602020-03-09 12:13:48 +0000502 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000503
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000504 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
505 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000506
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000507 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
508}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000509
Finn Williamsb454c5c2021-02-09 15:56:23 +0000510void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600511 const armnn::ElementwiseUnaryDescriptor& descriptor,
512 const char* name)
513{
Jan Eilers8eb25602020-03-09 12:13:48 +0000514 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600515
516 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
517 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
518 m_flatBufferBuilder,
519 GetFlatBufferUnaryOperation(descriptor.m_Operation));
520
521 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
522 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
523}
524
Finn Williamsb454c5c2021-02-09 15:56:23 +0000525void SerializerStrategy::SerializeEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000526{
Jan Eilers8eb25602020-03-09 12:13:48 +0000527 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000528
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000529 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
530 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
531
532 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
533}
534
Finn Williamsb454c5c2021-02-09 15:56:23 +0000535void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100536 const armnn::FillDescriptor& fillDescriptor,
537 const char* name)
538{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100539 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100540
541 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
542
543 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
544
545 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
546
547 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100548}
549
Finn Williamsb454c5c2021-02-09 15:56:23 +0000550void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000551{
Jan Eilers8eb25602020-03-09 12:13:48 +0000552 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000553
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000554 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
555 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
556
557 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
558}
559
Finn Williamsb454c5c2021-02-09 15:56:23 +0000560void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100561 const armnn::GatherDescriptor& gatherDescriptor,
562 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000563{
Jan Eilers8eb25602020-03-09 12:13:48 +0000564 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000565
Teresa Charlin52664732020-06-29 16:27:03 +0100566 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
567 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000568 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100569 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000570
571 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
572}
573
Finn Williamsb454c5c2021-02-09 15:56:23 +0000574
575void SerializerStrategy::SerializeGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000576{
Jan Eilers8eb25602020-03-09 12:13:48 +0000577 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000578
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000579 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000580 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000581
582 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
583}
584
Finn Williamsb454c5c2021-02-09 15:56:23 +0000585void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100586 const armnn::IConnectableLayer* layer,
587 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
588 const char* name)
589{
Jan Eilers8eb25602020-03-09 12:13:48 +0000590 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000591
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100592 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
593 m_flatBufferBuilder,
594 instanceNormalizationDescriptor.m_Gamma,
595 instanceNormalizationDescriptor.m_Beta,
596 instanceNormalizationDescriptor.m_Eps,
597 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
598
599 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
600 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
601
602 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100603}
604
Finn Williamsb454c5c2021-02-09 15:56:23 +0000605void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000606 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
607 const char* name)
608{
Jan Eilers8eb25602020-03-09 12:13:48 +0000609 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000610
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000611 // Create FlatBuffer BaseLayer
612 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
613
614 // Create the FlatBuffer L2Normalization Descriptor
615 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100616 m_flatBufferBuilder,
617 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
618 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000619
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100620 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000621 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
622
623 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
624}
625
Finn Williamsb454c5c2021-02-09 15:56:23 +0000626void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000627 const armnn::LogicalBinaryDescriptor& descriptor,
628 const char* name)
629{
630 IgnoreUnused(name);
631
632 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
633 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
634 m_flatBufferBuilder,
635 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
636
637 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
638 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
639}
640
Finn Williamsb454c5c2021-02-09 15:56:23 +0000641void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100642 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
643 const char* name)
644{
Jan Eilers8eb25602020-03-09 12:13:48 +0000645 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000646
Sadik Armagan26257852019-10-14 13:00:47 +0100647 // Create FlatBuffer BaseLayer
648 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
649
650 // Create the FlatBuffer LogSoftmaxDescriptor
651 auto flatBufferLogSoftmaxDesc =
652 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
653 logSoftmaxDescriptor.m_Beta,
654 logSoftmaxDescriptor.m_Axis);
655
656 // Create the FlatBuffer LogSoftmaxLayer
657 auto flatBufferLogSoftmaxLayer =
658 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
659 flatBufferLogSoftmaxBaseLayer,
660 flatBufferLogSoftmaxDesc);
661
662 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100663}
664
Finn Williamsb454c5c2021-02-09 15:56:23 +0000665void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
666 const armnn::LstmDescriptor& descriptor,
667 const std::vector<armnn::ConstTensor>& constants,
668 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000669{
Jan Eilers8eb25602020-03-09 12:13:48 +0000670 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000671
Jim Flynn11af3752019-03-19 17:22:29 +0000672 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
673
674 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
675 m_flatBufferBuilder,
676 descriptor.m_ActivationFunc,
677 descriptor.m_ClippingThresCell,
678 descriptor.m_ClippingThresProj,
679 descriptor.m_CifgEnabled,
680 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100681 descriptor.m_ProjectionEnabled,
682 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000683
Finn Williamsb454c5c2021-02-09 15:56:23 +0000684 // Index for constants vector
685 std::size_t i = 0;
686
687 // Get mandatory/basic input parameters
688 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
689 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
690 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
691 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
692 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
693 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
694 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
695 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
696 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
697
698
Jim Flynn11af3752019-03-19 17:22:29 +0000699
700 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
701 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
702 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
703 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
704 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
705 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
706 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
707 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
708 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100709 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
710 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
711 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
712 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000713
714 if (!descriptor.m_CifgEnabled)
715 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000716 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
717 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
718 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000719 }
720
721 if (descriptor.m_PeepholeEnabled)
722 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000723 if (!descriptor.m_CifgEnabled)
724 {
725 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
726 }
727 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
728 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
729 }
730
731 if (descriptor.m_ProjectionEnabled)
732 {
733 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
734 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000735 }
736
Jan Eilersf8c62972019-07-17 11:07:49 +0100737 if (descriptor.m_LayerNormEnabled)
738 {
739 if (!descriptor.m_CifgEnabled)
740 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000741 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100742 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000743 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
744 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
745 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100746 }
747
Jim Flynn11af3752019-03-19 17:22:29 +0000748 auto fbLstmParams = serializer::CreateLstmInputParams(
749 m_flatBufferBuilder,
750 inputToForgetWeights,
751 inputToCellWeights,
752 inputToOutputWeights,
753 recurrentToForgetWeights,
754 recurrentToCellWeights,
755 recurrentToOutputWeights,
756 forgetGateBias,
757 cellBias,
758 outputGateBias,
759 inputToInputWeights,
760 recurrentToInputWeights,
761 cellToInputWeights,
762 inputGateBias,
763 projectionWeights,
764 projectionBias,
765 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100766 cellToOutputWeights,
767 inputLayerNormWeights,
768 forgetLayerNormWeights,
769 cellLayerNormWeights,
770 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000771
772 auto fbLstmLayer = serializer::CreateLstmLayer(
773 m_flatBufferBuilder,
774 fbLstmBaseLayer,
775 fbLstmDescriptor,
776 fbLstmParams);
777
778 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
779}
780
Finn Williamsb454c5c2021-02-09 15:56:23 +0000781void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000782{
Jan Eilers8eb25602020-03-09 12:13:48 +0000783 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000784
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000785 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
786 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
787
788 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
789}
790
Finn Williamsb454c5c2021-02-09 15:56:23 +0000791void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000792 const armnn::MeanDescriptor& descriptor,
793 const char* name)
794{
Jan Eilers8eb25602020-03-09 12:13:48 +0000795 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000796
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000797 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
798 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
799 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
800 descriptor.m_KeepDims);
801
802 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
803 fbMeanBaseLayer,
804 fbMeanDescriptor);
805
806 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
807}
808
Finn Williamsb454c5c2021-02-09 15:56:23 +0000809void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000810{
Jan Eilers8eb25602020-03-09 12:13:48 +0000811 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000812
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000813 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
814 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
815
816 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
817}
818
Finn Williamsb454c5c2021-02-09 15:56:23 +0000819void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100820{
Jan Eilers8eb25602020-03-09 12:13:48 +0000821 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000822
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100823 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
824 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
825
826 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
827}
828
Finn Williamsb454c5c2021-02-09 15:56:23 +0000829void SerializerStrategy::SerializeMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100830 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000831 const char* name)
832{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000833 SerializeConcatLayer(layer, mergerDescriptor, name);
Jim Flynne242f2d2019-05-22 14:24:13 +0100834}
835
Finn Williamsb454c5c2021-02-09 15:56:23 +0000836void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100837 const armnn::ConcatDescriptor& concatDescriptor,
838 const char* name)
839{
Jan Eilers8eb25602020-03-09 12:13:48 +0000840 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000841
Jim Flynne242f2d2019-05-22 14:24:13 +0100842 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000843
844 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100845 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000846 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100847 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000848 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100849 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000850 {
851 origins.push_back(origin[d]);
852 }
853 auto view = m_flatBufferBuilder.CreateVector(origins);
854 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
855 views.push_back(uintVector);
856 }
857
Jim Flynne242f2d2019-05-22 14:24:13 +0100858 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
859 concatDescriptor.GetConcatAxis(),
860 concatDescriptor.GetNumViews(),
861 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000862 m_flatBufferBuilder.CreateVector(views));
863
Jim Flynne242f2d2019-05-22 14:24:13 +0100864 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
865 flatBufferConcatBaseLayer,
866 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000867
Jim Flynne242f2d2019-05-22 14:24:13 +0100868 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000869}
870
Finn Williamsb454c5c2021-02-09 15:56:23 +0000871void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000872{
Jan Eilers8eb25602020-03-09 12:13:48 +0000873 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000874
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000875 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
876 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
877 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000878
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000879 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000880}
881
Finn Williamsb454c5c2021-02-09 15:56:23 +0000882void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000883 const armnn::PadDescriptor& padDescriptor,
884 const char* name)
885{
Jan Eilers8eb25602020-03-09 12:13:48 +0000886 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000887
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000888 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
889
890 std::vector<unsigned int> padList;
891 for (auto& p: padDescriptor.m_PadList)
892 {
893 padList.push_back(p.first);
894 padList.push_back(p.second);
895 }
896
897 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100898 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100899 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000900
901 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
902 flatBufferBaseLayer,
903 flatBufferPadDesc);
904
905 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
906}
907
Finn Williamsb454c5c2021-02-09 15:56:23 +0000908void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000909 const armnn::PermuteDescriptor& permuteDescriptor,
910 const char* name)
911{
Jan Eilers8eb25602020-03-09 12:13:48 +0000912 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000913
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000914 // Create FlatBuffer BaseLayer
915 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
916
917 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100918 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000919 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100920 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000921 }
922
923 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
924 m_flatBufferBuilder.CreateVector(dimMappings));
925
926 // Create the FlatBuffer PermuteLayer
927 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
928 flatBufferPermuteBaseLayer,
929 flatBufferPermuteDesc);
930
931 // Add the AnyLayer to the FlatBufferLayers
932 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
933}
934
Finn Williams2605b232020-06-10 15:53:46 +0100935// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000936void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100937 const char* name)
938{
939 IgnoreUnused(name);
940 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
941 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
942
943 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
944}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000945
Finn Williamsb454c5c2021-02-09 15:56:23 +0000946void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
947 const armnn::ReduceDescriptor& reduceDescriptor,
948 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000949{
950 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
951 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000952 reduceDescriptor.m_KeepDims,
953 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
954 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
955 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
956 fbReduceBaseLayer,
957 fbDescriptor);
958
959 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
960}
961
Saoirse Stewart263829c2019-02-19 15:54:14 +0000962// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000963void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000964 const armnn::ReshapeDescriptor& reshapeDescriptor,
965 const char* name)
966{
Jan Eilers8eb25602020-03-09 12:13:48 +0000967 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000968
Saoirse Stewart263829c2019-02-19 15:54:14 +0000969 // Create FlatBuffer BaseLayer
970 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
971
972 std::vector<unsigned int> targetShape;
973 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
974 {
975 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
976 }
977
978 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
979 m_flatBufferBuilder.CreateVector(targetShape));
980
981 // Create the FlatBuffer ReshapeLayer
982 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
983 flatBufferReshapeDesc);
984
985 // Add the AnyLayer to the FlatBufferLayers
986 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
987}
988
Finn Williamsb454c5c2021-02-09 15:56:23 +0000989void SerializerStrategy::SerializeResizeBilinearLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000990 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
991 const char* name)
992{
Jan Eilers8eb25602020-03-09 12:13:48 +0000993 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000994
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000995 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
996
997 auto flatBufferDescriptor =
998 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
999 resizeDescriptor.m_TargetWidth,
1000 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +01001001 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1002 resizeDescriptor.m_AlignCorners,
1003 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +00001004
1005 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
1006 flatBufferBaseLayer,
1007 flatBufferDescriptor);
1008
1009 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
1010}
1011
Finn Williamsb454c5c2021-02-09 15:56:23 +00001012void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +01001013 const armnn::ResizeDescriptor& resizeDescriptor,
1014 const char* name)
1015{
Jan Eilers8eb25602020-03-09 12:13:48 +00001016 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001017
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001018 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1019
1020 auto flatBufferDescriptor =
1021 CreateResizeDescriptor(m_flatBufferBuilder,
1022 resizeDescriptor.m_TargetHeight,
1023 resizeDescriptor.m_TargetWidth,
1024 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001025 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1026 resizeDescriptor.m_AlignCorners,
1027 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001028
1029 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1030 flatBufferBaseLayer,
1031 flatBufferDescriptor);
1032
1033 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001034}
1035
Finn Williamsb454c5c2021-02-09 15:56:23 +00001036void SerializerStrategy::SerializeRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan8b42a382019-03-01 14:24:49 +00001037{
Jan Eilers8eb25602020-03-09 12:13:48 +00001038 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001039
Sadik Armagan8b42a382019-03-01 14:24:49 +00001040 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
1041 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
1042
1043 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
1044}
1045
Finn Williamsb454c5c2021-02-09 15:56:23 +00001046void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001047 const armnn::SliceDescriptor& sliceDescriptor,
1048 const char* name)
1049{
Jan Eilers8eb25602020-03-09 12:13:48 +00001050 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001051
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001052 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1053 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1054 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1055 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1056
1057 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1058
1059 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001060}
1061
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001062// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001063void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001064 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001065 const char* name)
1066{
Jan Eilers8eb25602020-03-09 12:13:48 +00001067 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001068
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001069 // Create FlatBuffer BaseLayer
1070 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1071
1072 // Create the FlatBuffer SoftmaxDescriptor
1073 auto flatBufferSoftmaxDesc =
1074 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
1075
1076 // Create the FlatBuffer SoftmaxLayer
1077 auto flatBufferSoftmaxLayer =
1078 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1079 flatBufferSoftmaxBaseLayer,
1080 flatBufferSoftmaxDesc);
1081
1082 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1083}
1084
Finn Williamsb454c5c2021-02-09 15:56:23 +00001085void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001086 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001087 const char* name)
1088{
Jan Eilers8eb25602020-03-09 12:13:48 +00001089 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001090
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001091 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1092 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1093 m_flatBufferBuilder,
1094 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1095 pooling2dDescriptor.m_PadLeft,
1096 pooling2dDescriptor.m_PadRight,
1097 pooling2dDescriptor.m_PadTop,
1098 pooling2dDescriptor.m_PadBottom,
1099 pooling2dDescriptor.m_PoolWidth,
1100 pooling2dDescriptor.m_PoolHeight,
1101 pooling2dDescriptor.m_StrideX,
1102 pooling2dDescriptor.m_StrideY,
1103 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1104 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1105 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1106
1107 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1108 fbPooling2dBaseLayer,
1109 fbPooling2dDescriptor);
1110
1111 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1112}
1113
Finn Williamsb454c5c2021-02-09 15:56:23 +00001114void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001115 const char* name)
1116{
Jan Eilers8eb25602020-03-09 12:13:48 +00001117 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001118
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001119 // Create FlatBuffer BaseLayer
1120 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1121
1122 // Create the FlatBuffer AdditionLayer
1123 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1124
1125 // Add the AnyLayer to the FlatBufferLayers
1126 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001127}
1128
Finn Williamsb454c5c2021-02-09 15:56:23 +00001129void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001130{
Jan Eilers8eb25602020-03-09 12:13:48 +00001131 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001132
Derek Lamberti87acb272019-03-27 16:51:31 +00001133 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1134 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1135 fbQuantizeBaseLayer);
1136 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1137}
1138
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001139// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001140void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1141 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001142 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001143{
1144 // Create FlatBuffer BaseLayer
1145 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1146
1147 // Create FlatBuffer FullyConnectedDescriptor
1148 auto flatBufferDescriptor =
1149 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1150 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001151 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1152 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001153
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001154 // Create FlatBuffer FullyConnectedLayer
1155 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1156 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001157 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001158
1159 // Add created FullyConnectedLayer to the FlatBufferLayers
1160 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1161}
1162
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001163// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001164void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001165 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1166 const char* name)
1167{
Jan Eilers8eb25602020-03-09 12:13:48 +00001168 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001169
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001170 // Create FlatBuffer BaseLayer
1171 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1172
1173 std::vector<unsigned int> padList;
1174 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1175 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1176 {
1177 padList.push_back(pad.first);
1178 padList.push_back(pad.second);
1179 }
1180
1181 auto flatBufferDescriptor =
1182 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1183 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1184 m_flatBufferBuilder.CreateVector(padList),
1185 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1186
1187 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1188 flatBufferBaseLayer,
1189 flatBufferDescriptor);
1190
1191 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1192}
1193
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001194// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001195void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001196 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1197 const char* name)
1198{
Jan Eilers8eb25602020-03-09 12:13:48 +00001199 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001200
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001201 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1202 auto flatBufferDescriptor =
1203 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1204 spaceToDepthDescriptor.m_BlockSize,
1205 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1206
1207 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1208 flatBufferBaseLayer,
1209 flatBufferDescriptor);
1210
1211 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001212}
1213
Jim Flynn18ce3382019-03-08 11:08:30 +00001214// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001215void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001216 const armnn::ViewsDescriptor& viewsDescriptor,
1217 const char* name)
1218{
Jan Eilers8eb25602020-03-09 12:13:48 +00001219 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001220
Jim Flynn18ce3382019-03-08 11:08:30 +00001221 // Create FlatBuffer ViewOrigins
1222 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1223 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1224
1225 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1226 {
1227 std::vector<uint32_t> viewOrigin;
1228 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1229
1230 // Copy vector
1231 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1232 {
1233 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1234 }
1235
1236 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1237 m_flatBufferBuilder.CreateVector(viewOrigin)));
1238 }
1239
1240 // Create FlatBuffer OriginsDescriptor
1241 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1242 viewsDescriptor.GetOrigins().GetConcatAxis(),
1243 viewsDescriptor.GetOrigins().GetNumViews(),
1244 viewsDescriptor.GetOrigins().GetNumDimensions(),
1245 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1246
1247 // Create FlatBuffer ViewOrigins
1248 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1249 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1250
1251 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1252 {
1253 std::vector<uint32_t> viewSize;
1254 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1255
1256 // Copy vector
1257 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1258 {
1259 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1260 }
1261
1262 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1263 m_flatBufferBuilder.CreateVector(viewSize)));
1264 }
1265
1266 // Create FlatBuffer ViewsDescriptor
1267 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1268 flatBufferOriginDescriptor,
1269 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1270
1271 // Create FlatBuffer BaseLayer
1272 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1273
1274 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1275 flatBufferBaseLayer,
1276 flatBufferViewsDescriptor);
1277
1278 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1279}
1280
Finn Williamsb454c5c2021-02-09 15:56:23 +00001281void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001282 const armnn::NormalizationDescriptor& descriptor,
1283 const char* name)
1284{
Jan Eilers8eb25602020-03-09 12:13:48 +00001285 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001286
Nina Drozd57728782019-02-27 10:53:27 +00001287 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1288
1289 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1290 m_flatBufferBuilder,
1291 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1292 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1293 descriptor.m_NormSize,
1294 descriptor.m_Alpha,
1295 descriptor.m_Beta,
1296 descriptor.m_K,
1297 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1298
1299 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1300 fbNormalizationBaseLayer,
1301 fbNormalizationDescriptor);
1302
1303 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1304}
1305
Keith Davis3ae3f972021-05-21 16:33:48 +01001306void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1307 const char* name)
1308{
1309 IgnoreUnused(name);
1310
1311 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1312 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1313
1314 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1315}
1316
Finn Williamsb454c5c2021-02-09 15:56:23 +00001317void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001318 const armnn::StackDescriptor& stackDescriptor,
1319 const char* name)
1320{
Jan Eilers8eb25602020-03-09 12:13:48 +00001321 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001322
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001323 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1324
1325 std::vector<unsigned int> inputShape;
1326 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1327 {
1328 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1329 }
1330
1331 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1332 stackDescriptor.m_Axis,
1333 stackDescriptor.m_NumInputs,
1334 m_flatBufferBuilder.CreateVector(inputShape));
1335
1336 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1337 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001338}
1339
Finn Williamsb454c5c2021-02-09 15:56:23 +00001340void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001341 const armnn::StandInDescriptor& standInDescriptor,
1342 const char *name)
1343{
Jan Eilers8eb25602020-03-09 12:13:48 +00001344 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001345
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001346 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1347 standInDescriptor.m_NumInputs,
1348 standInDescriptor.m_NumOutputs);
1349
1350 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1351 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1352
1353 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001354}
1355
Finn Williamsb454c5c2021-02-09 15:56:23 +00001356void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001357 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1358 const char* name)
1359{
Jan Eilers8eb25602020-03-09 12:13:48 +00001360 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001361
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001362 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1363
1364 auto flatBufferDescriptor =
1365 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1366 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1367 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1368 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1369 stridedSliceDescriptor.m_BeginMask,
1370 stridedSliceDescriptor.m_EndMask,
1371 stridedSliceDescriptor.m_ShrinkAxisMask,
1372 stridedSliceDescriptor.m_EllipsisMask,
1373 stridedSliceDescriptor.m_NewAxisMask,
1374 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1375
1376 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1377 flatBufferBaseLayer,
1378 flatBufferDescriptor);
1379
1380 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1381}
1382
Finn Williamsb454c5c2021-02-09 15:56:23 +00001383void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001384{
Jan Eilers8eb25602020-03-09 12:13:48 +00001385 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001386
Conor Kennedyda1f9752019-03-01 14:37:12 +00001387 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1388 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1389
1390 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1391}
1392
Finn Williamsb454c5c2021-02-09 15:56:23 +00001393void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001394{
Jan Eilers8eb25602020-03-09 12:13:48 +00001395 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001396
Sadik Armaganeff363d2019-04-05 15:25:46 +01001397 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1398 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1399
1400 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1401}
1402
Finn Williamsb454c5c2021-02-09 15:56:23 +00001403void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001404 const armnn::IConnectableLayer* layer,
1405 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001406 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001407 const char* name)
1408{
Jan Eilers8eb25602020-03-09 12:13:48 +00001409 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001410
Finn Williamsb454c5c2021-02-09 15:56:23 +00001411 const armnn::ConstTensor& weights = constants.at(0);
1412
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001413 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1414 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1415 descriptor.m_PadLeft,
1416 descriptor.m_PadRight,
1417 descriptor.m_PadTop,
1418 descriptor.m_PadBottom,
1419 descriptor.m_StrideX,
1420 descriptor.m_StrideY,
1421 descriptor.m_BiasEnabled,
1422 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1423
1424 // weights & biases
1425 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1426 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001427 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001428 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001429 const armnn::ConstTensor& biases = constants.at(1);
1430 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001431 }
1432
1433 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1434 fbBaseLayer,
1435 fbDescriptor,
1436 fbWeightsConstTensorInfo,
1437 fbBiasesConstTensorInfo);
1438
1439 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001440}
1441
Finn Williamsb454c5c2021-02-09 15:56:23 +00001442void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001443 const armnn::TransposeDescriptor& descriptor,
1444 const char* name)
1445{
Jan Eilers8eb25602020-03-09 12:13:48 +00001446 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001447
1448 // Create FlatBuffer BaseLayer
1449 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1450
1451 std::vector<unsigned int> dimMappings;
1452 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1453 {
1454 dimMappings.push_back(descriptor.m_DimMappings[i]);
1455 }
1456
1457 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1458 m_flatBufferBuilder.CreateVector(dimMappings));
1459
1460 // Create the FlatBuffer TransposeLayer
1461 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1462 flatBufferBaseLayer,
1463 flatBufferDesc);
1464
1465 // Add the AnyLayer to the FlatBufferLayers
1466 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1467}
1468
Finn Williamsb454c5c2021-02-09 15:56:23 +00001469void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1470 const armnn::QLstmDescriptor& descriptor,
1471 const std::vector<armnn::ConstTensor>& constants,
1472 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001473{
James Conroy8d333182020-05-13 10:27:58 +01001474 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001475
James Conroy8d333182020-05-13 10:27:58 +01001476 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1477
1478 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1479 m_flatBufferBuilder,
1480 descriptor.m_CifgEnabled,
1481 descriptor.m_PeepholeEnabled,
1482 descriptor.m_ProjectionEnabled,
1483 descriptor.m_LayerNormEnabled,
1484 descriptor.m_CellClip,
1485 descriptor.m_ProjectionClip,
1486 descriptor.m_InputIntermediateScale,
1487 descriptor.m_ForgetIntermediateScale,
1488 descriptor.m_CellIntermediateScale,
1489 descriptor.m_OutputIntermediateScale,
1490 descriptor.m_HiddenStateZeroPoint,
1491 descriptor.m_HiddenStateScale
1492 );
1493
Finn Williamsb454c5c2021-02-09 15:56:23 +00001494 // Index for constants vector
1495 std::size_t i = 0;
1496
James Conroy8d333182020-05-13 10:27:58 +01001497 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001498 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1499 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1500 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1501 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1502 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1503 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1504 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1505 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1506 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001507
1508 // CIFG
1509 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1510 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1511 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1512
1513 if (!descriptor.m_CifgEnabled)
1514 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001515 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1516 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1517 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001518 }
1519
1520 // Peephole
1521 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1522 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1523 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1524
1525 if (descriptor.m_PeepholeEnabled)
1526 {
1527 if (!descriptor.m_CifgEnabled)
1528 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001529 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001530 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001531 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1532 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1533 }
James Conroy8d333182020-05-13 10:27:58 +01001534
Finn Williamsb454c5c2021-02-09 15:56:23 +00001535 // Projection
1536 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1537 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1538
1539 if (descriptor.m_ProjectionEnabled)
1540 {
1541 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1542 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001543 }
1544
1545 // Layer norm
1546 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1547 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1548 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1549 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1550
1551 if (descriptor.m_LayerNormEnabled)
1552 {
1553 if (!descriptor.m_CifgEnabled)
1554 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001555 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001556 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001557 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1558 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1559 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001560 }
1561
1562 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1563 m_flatBufferBuilder,
1564 inputToForgetWeights,
1565 inputToCellWeights,
1566 inputToOutputWeights,
1567 recurrentToForgetWeights,
1568 recurrentToCellWeights,
1569 recurrentToOutputWeights,
1570 forgetGateBias,
1571 cellBias,
1572 outputGateBias,
1573 inputToInputWeights,
1574 recurrentToInputWeights,
1575 inputGateBias,
1576 projectionWeights,
1577 projectionBias,
1578 cellToInputWeights,
1579 cellToForgetWeights,
1580 cellToOutputWeights,
1581 inputLayerNormWeights,
1582 forgetLayerNormWeights,
1583 cellLayerNormWeights,
1584 outputLayerNormWeights);
1585
1586 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1587 m_flatBufferBuilder,
1588 fbQLstmBaseLayer,
1589 fbQLstmDescriptor,
1590 fbQLstmParams);
1591
1592 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001593}
1594
Finn Williamsb454c5c2021-02-09 15:56:23 +00001595void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1596 const std::vector<armnn::ConstTensor>& constants,
1597 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001598{
Jan Eilers8eb25602020-03-09 12:13:48 +00001599 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001600
Jan Eilers5b01a892019-07-23 09:47:43 +01001601 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1602
Finn Williamsb454c5c2021-02-09 15:56:23 +00001603 // index for constants vector
1604 size_t i = 0;
1605
Jan Eilers5b01a892019-07-23 09:47:43 +01001606 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001607 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1608 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1609 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1610 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001611
Finn Williamsb454c5c2021-02-09 15:56:23 +00001612 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1613 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1614 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1615 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001616
Finn Williamsb454c5c2021-02-09 15:56:23 +00001617 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1618 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1619 auto cellBias = CreateConstTensorInfo(constants[i++]);
1620 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001621
1622 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1623 m_flatBufferBuilder,
1624 inputToInputWeights,
1625 inputToForgetWeights,
1626 inputToCellWeights,
1627 inputToOutputWeights,
1628 recurrentToInputWeights,
1629 recurrentToForgetWeights,
1630 recurrentToCellWeights,
1631 recurrentToOutputWeights,
1632 inputGateBias,
1633 forgetGateBias,
1634 cellBias,
1635 outputGateBias);
1636
1637 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1638 m_flatBufferBuilder,
1639 fbQuantizedLstmBaseLayer,
1640 fbQuantizedLstmParams);
1641
1642 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001643}
1644
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001645void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1646 const armnn::IConnectableLayer* layer,
1647 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1648 const std::vector<armnn::ConstTensor>& constants,
1649 const char* name)
1650{
1651 IgnoreUnused(name);
1652
1653 auto fbUnidirectionalSequenceLstmBaseLayer =
1654 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1655
1656 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1657 m_flatBufferBuilder,
1658 descriptor.m_ActivationFunc,
1659 descriptor.m_ClippingThresCell,
1660 descriptor.m_ClippingThresProj,
1661 descriptor.m_CifgEnabled,
1662 descriptor.m_PeepholeEnabled,
1663 descriptor.m_ProjectionEnabled,
1664 descriptor.m_LayerNormEnabled,
1665 descriptor.m_TimeMajor);
1666
1667 // Index for constants vector
1668 std::size_t i = 0;
1669
1670 // Get mandatory/basic input parameters
1671 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1672 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1673 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1674 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1675 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1676 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1677 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1678 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1679 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1680
1681 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1682 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1683 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1684 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1685 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1686 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1687 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1688 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1689 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1690 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1691 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1692 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1693 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1694
1695 if (!descriptor.m_CifgEnabled)
1696 {
1697 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1698 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1699 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1700 }
1701
1702 if (descriptor.m_PeepholeEnabled)
1703 {
1704 if (!descriptor.m_CifgEnabled)
1705 {
1706 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1707 }
1708 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1709 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1710 }
1711
1712 if (descriptor.m_ProjectionEnabled)
1713 {
1714 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1715 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1716 }
1717
1718 if (descriptor.m_LayerNormEnabled)
1719 {
1720 if (!descriptor.m_CifgEnabled)
1721 {
1722 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1723 }
1724 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1725 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1726 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1727 }
1728
1729 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1730 m_flatBufferBuilder,
1731 inputToForgetWeights,
1732 inputToCellWeights,
1733 inputToOutputWeights,
1734 recurrentToForgetWeights,
1735 recurrentToCellWeights,
1736 recurrentToOutputWeights,
1737 forgetGateBias,
1738 cellBias,
1739 outputGateBias,
1740 inputToInputWeights,
1741 recurrentToInputWeights,
1742 cellToInputWeights,
1743 inputGateBias,
1744 projectionWeights,
1745 projectionBias,
1746 cellToForgetWeights,
1747 cellToOutputWeights,
1748 inputLayerNormWeights,
1749 forgetLayerNormWeights,
1750 cellLayerNormWeights,
1751 outputLayerNormWeights);
1752
1753 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1754 m_flatBufferBuilder,
1755 fbUnidirectionalSequenceLstmBaseLayer,
1756 fbUnidirectionalSequenceLstmDescriptor,
1757 fbUnidirectionalSequenceLstmParams);
1758
1759 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1760}
1761
Finn Williamsb454c5c2021-02-09 15:56:23 +00001762fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001763 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001764{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001765
Sadik Armagandb059fd2019-03-20 12:28:32 +00001766 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1767
Mike Kelly8c1701a2019-02-11 17:01:27 +00001768 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1769 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1770
1771 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001772 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001773 m_flatBufferBuilder.CreateString(layer->GetName()),
1774 layerType,
1775 m_flatBufferBuilder.CreateVector(inputSlots),
1776 m_flatBufferBuilder.CreateVector(outputSlots));
1777}
1778
Finn Williamsb454c5c2021-02-09 15:56:23 +00001779void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001780{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001781
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001782 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001783 m_serializedLayers.push_back(anyLayer);
1784}
1785
Mike Kellya0766c32019-02-19 17:22:07 +00001786template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001787flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001788{
1789 const T* buffer = reinterpret_cast<const T*>(memory);
1790 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1791 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1792 return fbVector;
1793}
1794
Finn Williamsb454c5c2021-02-09 15:56:23 +00001795flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001796{
Mike Kellya0766c32019-02-19 17:22:07 +00001797 // Get the dimensions
1798 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001799 std::vector<bool> specificity;
1800 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1801 // matches the size of dimensions.
1802 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1803 {
1804 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001805
1806 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1807 {
1808 shape.push_back(tensorInfo.GetShape()[dim]);
1809 }
1810 else
1811 {
1812 shape.push_back(0);
1813 }
Colm Donelan800b2812021-02-12 12:43:35 +00001814 }
1815
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001816 if (tensorInfo.HasPerAxisQuantization())
1817 {
1818 // Create FlatBuffer TensorInfo
1819 auto flatBufferTensorInfo =
1820 serializer::CreateTensorInfo(m_flatBufferBuilder,
1821 m_flatBufferBuilder.CreateVector(shape),
1822 GetFlatBufferDataType(tensorInfo.GetDataType()),
1823 tensorInfo.GetQuantizationScales()[0],
1824 tensorInfo.GetQuantizationOffset(),
1825 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001826 tensorInfo.GetQuantizationDim().value(),
1827 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001828 (tensorInfo.GetShape().GetDimensionality()),
1829 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001830 return flatBufferTensorInfo;
1831 }
1832
Mike Kellya0766c32019-02-19 17:22:07 +00001833 // Create FlatBuffer TensorInfo
1834 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1835 m_flatBufferBuilder.CreateVector(shape),
1836 GetFlatBufferDataType(tensorInfo.GetDataType()),
1837 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001838 tensorInfo.GetQuantizationOffset(),
1839 0,
1840 0,
1841 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001842 (tensorInfo.GetShape().GetDimensionality()),
1843 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001844 return flatBufferTensorInfo;
1845}
1846
1847flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001848 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001849{
1850 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1851
Mike Kellya0766c32019-02-19 17:22:07 +00001852 flatbuffers::Offset<void> fbPayload;
1853
1854 switch (tensorInfo.GetDataType())
1855 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001856 case armnn::DataType::Signed64:
1857 {
1858 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1859 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1860 m_flatBufferBuilder,
1861 fbVector);
1862 fbPayload = flatBuffersData.o;
1863 break;
1864 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001865 case armnn::DataType::Float32:
1866 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001867 {
1868 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1869 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1870 m_flatBufferBuilder,
1871 fbVector);
1872 fbPayload = flatBuffersData.o;
1873 break;
1874 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001875 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001876 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001877 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001878 {
1879 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1880 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1881 m_flatBufferBuilder,
1882 fbVector);
1883 fbPayload = flatBuffersData.o;
1884 break;
1885 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001886 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001887 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001888 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001889 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001890 default:
1891 {
1892 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1893 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1894 m_flatBufferBuilder,
1895 fbVector);
1896 fbPayload = flatBuffersData.o;
1897 }
1898 }
1899 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1900 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001901 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001902 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1903 fbPayload);
1904 return flatBufferConstTensor;
1905}
1906
Finn Williamsb454c5c2021-02-09 15:56:23 +00001907flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001908{
1909 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1910 serializer::CreateFeatureCompatibilityVersions(
1911 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001912 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001913 1, // Weights layout scheme version
1914 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001915 );
1916 return versionsTable;
1917}
1918
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001919std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001920 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001921{
Mike Kellya0766c32019-02-19 17:22:07 +00001922 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001923
1924 // Get the InputSlots
1925 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1926 {
1927 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1928
1929 // Get the Connection for the InputSlot
1930 const IOutputSlot* connection = inputSlot.GetConnection();
1931
1932 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001933 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1934 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001935 // Create FlatBuffer InputSlot
1936 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1937 }
1938 return inputSlots;
1939}
1940
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001941std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001942 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001943{
1944 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1945
1946 // Get the OutputSlots
1947 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1948 {
1949 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001950 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001951
Mike Kelly8c1701a2019-02-11 17:01:27 +00001952 // Create FlatBuffer Outputslot
1953 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1954 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001955 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001956 }
1957 return outputSlots;
1958}
1959
Finn Williamsb454c5c2021-02-09 15:56:23 +00001960void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1961 const BaseDescriptor& descriptor,
1962 const std::vector<armnn::ConstTensor>& constants,
1963 const char* name,
1964 const armnn::LayerBindingId id)
1965{
1966 IgnoreUnused(constants);
1967
1968 switch (layer->GetType())
1969 {
1970 case armnn::LayerType::Activation :
1971 {
1972 const armnn::ActivationDescriptor& layerDescriptor =
1973 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1974 SerializeActivationLayer(layer, layerDescriptor, name);
1975 break;
1976 }
1977 case armnn::LayerType::Addition :
1978 {
1979 SerializeAdditionLayer(layer, name);
1980 break;
1981 }
1982 case armnn::LayerType::ArgMinMax :
1983 {
1984 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1985 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1986 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1987 break;
1988 }
1989 case armnn::LayerType::BatchNormalization :
1990 {
1991 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1992 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1993 SerializeBatchNormalizationLayer(layer,
1994 layerDescriptor,
1995 constants,
1996 name);
1997 break;
1998 }
1999 case armnn::LayerType::BatchToSpaceNd :
2000 {
2001 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2002 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2003 SerializeBatchToSpaceNdLayer(layer,
2004 layerDescriptor,
2005 name);
2006 break;
2007 }
mathad01b392e982021-04-07 12:07:30 +01002008 case armnn::LayerType::Cast :
2009 {
2010 SerializeCastLayer(layer, name);
2011 break;
2012 }
Simon Obute51f67772021-09-03 15:50:13 +01002013 case armnn::LayerType::ChannelShuffle :
2014 {
2015 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2016 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2017 SerializeChannelShuffleLayer(layer,
2018 layerDescriptor,
2019 name);
2020 break;
2021 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002022 case armnn::LayerType::Comparison :
2023 {
2024 const armnn::ComparisonDescriptor& layerDescriptor =
2025 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2026 SerializeComparisonLayer(layer,
2027 layerDescriptor,
2028 name);
2029 break;
2030 }
2031 case armnn::LayerType::Concat :
2032 {
2033 const armnn::ConcatDescriptor& layerDescriptor =
2034 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2035 SerializeConcatLayer(layer,
2036 layerDescriptor,
2037 name);
2038 break;
2039 }
2040 case armnn::LayerType::Constant :
2041 {
2042 SerializeConstantLayer(layer,
2043 constants,
2044 name);
2045 break;
2046 }
2047 case armnn::LayerType::Convolution2d :
2048 {
2049 const armnn::Convolution2dDescriptor& layerDescriptor =
2050 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2051 SerializeConvolution2dLayer(layer,
2052 layerDescriptor,
2053 constants,
2054 name);
2055 break;
2056 }
2057 case armnn::LayerType::DepthToSpace :
2058 {
2059 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2060 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2061 SerializeDepthToSpaceLayer(layer,
2062 layerDescriptor,
2063 name);
2064 break;
2065 }
2066 case armnn::LayerType::DepthwiseConvolution2d :
2067 {
2068 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2069 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2070 SerializeDepthwiseConvolution2dLayer(layer,
2071 layerDescriptor,
2072 constants,
2073 name);
2074 break;
2075 }
2076 case armnn::LayerType::Dequantize :
2077 {
2078 SerializeDequantizeLayer(layer,
2079 name);
2080 break;
2081 }
2082 case armnn::LayerType::DetectionPostProcess :
2083 {
2084 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2085 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2086 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2087 break;
2088 }
2089 case armnn::LayerType::Division :
2090 {
2091 SerializeDivisionLayer(layer, name);
2092 break;
2093 }
2094 case armnn::LayerType::ElementwiseUnary :
2095 {
2096 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2097 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2098 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2099 break;
2100 }
2101 case armnn::LayerType::Fill :
2102 {
2103 const armnn::FillDescriptor& layerDescriptor =
2104 static_cast<const armnn::FillDescriptor&>(descriptor);
2105 SerializeFillLayer(layer, layerDescriptor, name);
2106 break;
2107 }
2108 case armnn::LayerType::Floor :
2109 {
2110 SerializeFloorLayer(layer, name);
2111 break;
2112 }
2113 case armnn::LayerType::FullyConnected :
2114 {
2115 const armnn::FullyConnectedDescriptor& layerDescriptor =
2116 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002117 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002118 break;
2119 }
2120 case armnn::LayerType::Gather :
2121 {
2122 const armnn::GatherDescriptor& layerDescriptor =
2123 static_cast<const armnn::GatherDescriptor&>(descriptor);
2124 SerializeGatherLayer(layer, layerDescriptor, name);
2125 break;
2126 }
2127 case armnn::LayerType::Input:
2128 {
2129 SerializeInputLayer(layer, id, name);
2130 break;
2131 }
2132 case armnn::LayerType::InstanceNormalization :
2133 {
2134 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2135 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2136 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2137 break;
2138 }
2139 case armnn::LayerType::L2Normalization :
2140 {
2141 const armnn::L2NormalizationDescriptor& layerDescriptor =
2142 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2143 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2144 break;
2145 }
2146 case armnn::LayerType::LogicalBinary :
2147 {
2148 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2149 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2150 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2151 break;
2152 }
2153 case armnn::LayerType::LogSoftmax :
2154 {
2155 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2156 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2157 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2158 break;
2159 }
2160 case armnn::LayerType::Lstm :
2161 {
2162 const armnn::LstmDescriptor& layerDescriptor =
2163 static_cast<const armnn::LstmDescriptor&>(descriptor);
2164 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2165 break;
2166 }
2167 case armnn::LayerType::QLstm :
2168 {
2169 const armnn::QLstmDescriptor& layerDescriptor =
2170 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2171 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2172 break;
2173 }
2174 case armnn::LayerType::Maximum :
2175 {
2176 SerializeMaximumLayer(layer, name);
2177 break;
2178 }
2179 case armnn::LayerType::Mean :
2180 {
2181 const armnn::MeanDescriptor& layerDescriptor =
2182 static_cast<const armnn::MeanDescriptor&>(descriptor);
2183 SerializeMeanLayer(layer, layerDescriptor, name);
2184 break;
2185 }
2186 case armnn::LayerType::Merge :
2187 {
2188 SerializeMergeLayer(layer, name);
2189 break;
2190 }
2191 case armnn::LayerType::Minimum :
2192 {
2193 SerializeMinimumLayer(layer, name);
2194 break;
2195 }
2196 case armnn::LayerType::Multiplication :
2197 {
2198 SerializeMultiplicationLayer(layer, name);
2199 break;
2200 }
2201 case armnn::LayerType::Normalization :
2202 {
2203 const armnn::NormalizationDescriptor& layerDescriptor =
2204 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2205 SerializeNormalizationLayer(layer, layerDescriptor, name);
2206 break;
2207 }
2208 case armnn::LayerType::Output:
2209 {
2210 SerializeOutputLayer(layer, id, name);
2211 break;
2212 }
2213 case armnn::LayerType::Pad :
2214 {
2215 const armnn::PadDescriptor& layerDescriptor =
2216 static_cast<const armnn::PadDescriptor&>(descriptor);
2217 SerializePadLayer(layer, layerDescriptor, name);
2218 break;
2219 }
2220 case armnn::LayerType::Permute :
2221 {
2222 const armnn::PermuteDescriptor& layerDescriptor =
2223 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2224 SerializePermuteLayer(layer, layerDescriptor, name);
2225 break;
2226 }
2227 case armnn::LayerType::Pooling2d :
2228 {
2229 const armnn::Pooling2dDescriptor& layerDescriptor =
2230 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2231 SerializePooling2dLayer(layer, layerDescriptor, name);
2232 break;
2233 }
2234 case armnn::LayerType::Prelu :
2235 {
2236 SerializePreluLayer(layer, name);
2237 break;
2238 }
2239 case armnn::LayerType::Quantize :
2240 {
2241 SerializeQuantizeLayer(layer, name);
2242 break;
2243 }
2244 case armnn::LayerType::QuantizedLstm:
2245 SerializeQuantizedLstmLayer(layer, constants, name);
2246 break;
2247 case armnn::LayerType::Reshape:
2248 {
2249 const armnn::ReshapeDescriptor &layerDescriptor =
2250 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2251 SerializeReshapeLayer(layer, layerDescriptor, name);
2252 break;
2253 }
2254 case armnn::LayerType::Rank:
2255 {
2256 SerializeRankLayer(layer, name);
2257 break;
2258 }
2259 case armnn::LayerType::Reduce:
2260 {
2261 const armnn::ReduceDescriptor& layerDescriptor =
2262 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2263 SerializeReduceLayer(layer, layerDescriptor, name);
2264 break;
2265 }
2266 case armnn::LayerType::Resize:
2267 {
2268 const armnn::ResizeDescriptor& layerDescriptor =
2269 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2270 SerializeResizeLayer(layer, layerDescriptor, name);
2271 break;
2272 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002273 case armnn::LayerType::Shape:
2274 {
2275 SerializeShapeLayer(layer, name);
2276 break;
2277 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002278 case armnn::LayerType::Slice:
2279 {
2280 const armnn::SliceDescriptor& layerDescriptor =
2281 static_cast<const armnn::SliceDescriptor&>(descriptor);
2282 SerializeSliceLayer(layer, layerDescriptor, name);
2283 break;
2284 }
2285 case armnn::LayerType::Softmax:
2286 {
2287 const armnn::SoftmaxDescriptor& layerDescriptor =
2288 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2289 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2290 break;
2291 }
2292 case armnn::LayerType::SpaceToBatchNd:
2293 {
2294 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2295 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2296 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2297 break;
2298 }
2299 case armnn::LayerType::SpaceToDepth:
2300 {
2301 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2302 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2303 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2304 break;
2305 }
2306 case armnn::LayerType::Splitter:
2307 {
2308 const armnn::SplitterDescriptor& layerDescriptor =
2309 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2310 SerializeSplitterLayer(layer, layerDescriptor, name);
2311 break;
2312 }
2313 case armnn::LayerType::Stack:
2314 {
2315 const armnn::StackDescriptor& layerDescriptor =
2316 static_cast<const armnn::StackDescriptor&>(descriptor);
2317 SerializeStackLayer(layer, layerDescriptor, name);
2318 break;
2319 }
2320 case armnn::LayerType::StandIn:
2321 {
2322 const armnn::StandInDescriptor& layerDescriptor =
2323 static_cast<const armnn::StandInDescriptor&>(descriptor);
2324 SerializeStandInLayer(layer, layerDescriptor, name);
2325 break;
2326 }
2327 case armnn::LayerType::StridedSlice:
2328 {
2329 const armnn::StridedSliceDescriptor& layerDescriptor =
2330 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2331 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2332 break;
2333 }
2334 case armnn::LayerType::Subtraction:
2335 {
2336 SerializeSubtractionLayer(layer, name);
2337 break;
2338 }
2339 case armnn::LayerType::Switch:
2340 {
2341 SerializeSwitchLayer(layer, name);
2342 break;
2343 }
2344 case armnn::LayerType::Transpose:
2345 {
2346 const armnn::TransposeDescriptor& layerDescriptor =
2347 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2348 SerializeTransposeLayer(layer, layerDescriptor, name);
2349 break;
2350 }
2351 case armnn::LayerType::TransposeConvolution2d:
2352 {
2353 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2354 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2355 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2356 break;
2357 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002358 case armnn::LayerType::UnidirectionalSequenceLstm :
2359 {
2360 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2361 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2362 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2363 break;
2364 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002365 default:
2366 {
2367 throw InvalidArgumentException(
2368 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2369 layer->GetName(),
2370 id));
2371 }
2372 }
2373}
2374
Finn Williams85d36712021-01-26 22:30:06 +00002375void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002376{
2377 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002378 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2379 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002380
2381 // Create FlatBuffer SerializedGraph
2382 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002383 fbBuilder,
2384 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2385 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2386 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2387 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002388
2389 // Serialize the graph
2390 fbBuilder.Finish(serializedGraph);
2391}
2392
Finn Williamsb454c5c2021-02-09 15:56:23 +00002393
Finn Williams85d36712021-01-26 22:30:06 +00002394bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002395{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002396 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002397
Matthew Sloyan0663d662020-09-14 11:47:26 +01002398 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002399 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002400 return !stream.bad();
2401}
2402
Finn Williams2605b232020-06-10 15:53:46 +01002403} // namespace armnnSerializer