blob: 44cd1800c4aa29b1aa076f5f42e55392073ce68e [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
Finn Williamsb454c5c2021-02-09 15:56:23 +0000305void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100306 const armnn::ComparisonDescriptor& descriptor,
307 const char* name)
308{
Jan Eilers8eb25602020-03-09 12:13:48 +0000309 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000310
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100311 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
312 auto fbDescriptor = serializer::CreateComparisonDescriptor(
313 m_flatBufferBuilder,
314 GetFlatBufferComparisonOperation(descriptor.m_Operation));
315
316 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
317 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100318}
319
Conor Kennedy76277882019-02-26 08:29:54 +0000320// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000321void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
322 const std::vector<armnn::ConstTensor>& constants,
323 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000324{
Jan Eilers8eb25602020-03-09 12:13:48 +0000325 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000326
Finn Williamsb454c5c2021-02-09 15:56:23 +0000327 armnn::ConstTensor input = constants[0];
328
Conor Kennedy76277882019-02-26 08:29:54 +0000329 // Create FlatBuffer BaseLayer
330 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
331
332 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
333
334 // Create the FlatBuffer ConstantLayer
335 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
336 flatBufferConstantBaseLayer,
337 flatBufferConstTensorInfo);
338
339 // Add the AnyLayer to the FlatBufferLayers
340 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
341}
342
Mike Kellya0766c32019-02-19 17:22:07 +0000343// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000344void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
345 const armnn::Convolution2dDescriptor& descriptor,
346 const std::vector<armnn::ConstTensor>& constants,
347 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000348{
Jan Eilers8eb25602020-03-09 12:13:48 +0000349 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000350
Finn Williamsb454c5c2021-02-09 15:56:23 +0000351 const armnn::ConstTensor weights = constants[0];
352
Mike Kellya0766c32019-02-19 17:22:07 +0000353 // Create FlatBuffer BaseLayer
354 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
355
356 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
357 descriptor.m_PadLeft,
358 descriptor.m_PadRight,
359 descriptor.m_PadTop,
360 descriptor.m_PadBottom,
361 descriptor.m_StrideX,
362 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100363 descriptor.m_DilationX,
364 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000365 descriptor.m_BiasEnabled,
366 GetFlatBufferDataLayout(descriptor.m_DataLayout));
367 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
368 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
369
Finn Williamsb454c5c2021-02-09 15:56:23 +0000370 if (constants.size() > 1)
Mike Kellya0766c32019-02-19 17:22:07 +0000371 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000372 const armnn::ConstTensor biases = constants[1];
373 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Mike Kellya0766c32019-02-19 17:22:07 +0000374 }
375
376 // Create the FlatBuffer Convolution2dLayer
377 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
378 flatBufferBaseLayer,
379 flatBufferDescriptor,
380 flatBufferWeightsConstTensorInfo,
381 flatBufferBiasesConstTensorInfo);
382
383 // Add the AnyLayer to the FlatBufferLayers
384 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
385}
386
Finn Williamsb454c5c2021-02-09 15:56:23 +0000387void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100388 const armnn::DepthToSpaceDescriptor& descriptor,
389 const char* name)
390{
Jan Eilers8eb25602020-03-09 12:13:48 +0000391 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000392
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100393 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
394 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
395 descriptor.m_BlockSize,
396 GetFlatBufferDataLayout(descriptor.m_DataLayout));
397
398 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
399
400 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100401}
402
Finn Williamsb454c5c2021-02-09 15:56:23 +0000403void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
404 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
405 const std::vector<armnn::ConstTensor>& constants,
406 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000407{
Jan Eilers8eb25602020-03-09 12:13:48 +0000408 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000409
Finn Williamsb454c5c2021-02-09 15:56:23 +0000410 const armnn::ConstTensor& weights = constants[0];
411
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000412 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
413 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
414 descriptor.m_PadLeft,
415 descriptor.m_PadRight,
416 descriptor.m_PadTop,
417 descriptor.m_PadBottom,
418 descriptor.m_StrideX,
419 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100420 descriptor.m_DilationX,
421 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000422 descriptor.m_BiasEnabled,
423 GetFlatBufferDataLayout(descriptor.m_DataLayout));
424
425 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
426 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000427
428 if (constants.size() > 1)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000429 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000430 const armnn::ConstTensor& biases = constants[1];
431 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000432 }
433
434 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
435 fbBaseLayer,
436 fbDescriptor,
437 fbWeightsConstTensorInfo,
438 fbBiasesConstTensorInfo);
439
440 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
441}
442
Finn Williamsb454c5c2021-02-09 15:56:23 +0000443void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000444 const char* name)
445{
Jan Eilers8eb25602020-03-09 12:13:48 +0000446 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000447
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000448 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
449 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
450
451 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
452}
453
Finn Williamsb454c5c2021-02-09 15:56:23 +0000454void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
455 const armnn::DetectionPostProcessDescriptor& descriptor,
456 const std::vector<armnn::ConstTensor>& constants,
457 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000458{
Jan Eilers8eb25602020-03-09 12:13:48 +0000459 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000460
Finn Williamsb454c5c2021-02-09 15:56:23 +0000461 const armnn::ConstTensor& anchors = constants[0];
462
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000463 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
464 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
465 descriptor.m_MaxDetections,
466 descriptor.m_MaxClassesPerDetection,
467 descriptor.m_DetectionsPerClass,
468 descriptor.m_NmsScoreThreshold,
469 descriptor.m_NmsIouThreshold,
470 descriptor.m_NumClasses,
471 descriptor.m_UseRegularNms,
472 descriptor.m_ScaleX,
473 descriptor.m_ScaleY,
474 descriptor.m_ScaleW,
475 descriptor.m_ScaleH);
476
477 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
478
479 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
480 fbBaseLayer,
481 fbDescriptor,
482 fbAnchorsConstTensorInfo);
483
484 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
485}
486
Finn Williamsb454c5c2021-02-09 15:56:23 +0000487void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000488{
Jan Eilers8eb25602020-03-09 12:13:48 +0000489 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000490
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000491 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
492 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000493
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000494 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
495}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000496
Finn Williamsb454c5c2021-02-09 15:56:23 +0000497void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600498 const armnn::ElementwiseUnaryDescriptor& descriptor,
499 const char* name)
500{
Jan Eilers8eb25602020-03-09 12:13:48 +0000501 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600502
503 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
504 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
505 m_flatBufferBuilder,
506 GetFlatBufferUnaryOperation(descriptor.m_Operation));
507
508 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
509 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
510}
511
Finn Williamsb454c5c2021-02-09 15:56:23 +0000512void SerializerStrategy::SerializeEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000513{
Jan Eilers8eb25602020-03-09 12:13:48 +0000514 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000515
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000516 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
517 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
518
519 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
520}
521
Finn Williamsb454c5c2021-02-09 15:56:23 +0000522void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100523 const armnn::FillDescriptor& fillDescriptor,
524 const char* name)
525{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100526 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100527
528 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
529
530 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
531
532 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
533
534 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100535}
536
Finn Williamsb454c5c2021-02-09 15:56:23 +0000537void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000538{
Jan Eilers8eb25602020-03-09 12:13:48 +0000539 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000540
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000541 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
542 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
543
544 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
545}
546
Finn Williamsb454c5c2021-02-09 15:56:23 +0000547void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100548 const armnn::GatherDescriptor& gatherDescriptor,
549 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000550{
Jan Eilers8eb25602020-03-09 12:13:48 +0000551 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000552
Teresa Charlin52664732020-06-29 16:27:03 +0100553 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
554 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000555 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100556 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000557
558 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
559}
560
Finn Williamsb454c5c2021-02-09 15:56:23 +0000561
562void SerializerStrategy::SerializeGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000563{
Jan Eilers8eb25602020-03-09 12:13:48 +0000564 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000565
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000566 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000567 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000568
569 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
570}
571
Finn Williamsb454c5c2021-02-09 15:56:23 +0000572void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100573 const armnn::IConnectableLayer* layer,
574 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
575 const char* name)
576{
Jan Eilers8eb25602020-03-09 12:13:48 +0000577 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000578
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100579 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
580 m_flatBufferBuilder,
581 instanceNormalizationDescriptor.m_Gamma,
582 instanceNormalizationDescriptor.m_Beta,
583 instanceNormalizationDescriptor.m_Eps,
584 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
585
586 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
587 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
588
589 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100590}
591
Finn Williamsb454c5c2021-02-09 15:56:23 +0000592void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000593 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
594 const char* name)
595{
Jan Eilers8eb25602020-03-09 12:13:48 +0000596 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000597
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000598 // Create FlatBuffer BaseLayer
599 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
600
601 // Create the FlatBuffer L2Normalization Descriptor
602 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100603 m_flatBufferBuilder,
604 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
605 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000606
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100607 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000608 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
609
610 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
611}
612
Finn Williamsb454c5c2021-02-09 15:56:23 +0000613void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000614 const armnn::LogicalBinaryDescriptor& descriptor,
615 const char* name)
616{
617 IgnoreUnused(name);
618
619 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
620 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
621 m_flatBufferBuilder,
622 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
623
624 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
625 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
626}
627
Finn Williamsb454c5c2021-02-09 15:56:23 +0000628void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100629 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
630 const char* name)
631{
Jan Eilers8eb25602020-03-09 12:13:48 +0000632 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000633
Sadik Armagan26257852019-10-14 13:00:47 +0100634 // Create FlatBuffer BaseLayer
635 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
636
637 // Create the FlatBuffer LogSoftmaxDescriptor
638 auto flatBufferLogSoftmaxDesc =
639 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
640 logSoftmaxDescriptor.m_Beta,
641 logSoftmaxDescriptor.m_Axis);
642
643 // Create the FlatBuffer LogSoftmaxLayer
644 auto flatBufferLogSoftmaxLayer =
645 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
646 flatBufferLogSoftmaxBaseLayer,
647 flatBufferLogSoftmaxDesc);
648
649 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100650}
651
Finn Williamsb454c5c2021-02-09 15:56:23 +0000652void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
653 const armnn::LstmDescriptor& descriptor,
654 const std::vector<armnn::ConstTensor>& constants,
655 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000656{
Jan Eilers8eb25602020-03-09 12:13:48 +0000657 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000658
Jim Flynn11af3752019-03-19 17:22:29 +0000659 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
660
661 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
662 m_flatBufferBuilder,
663 descriptor.m_ActivationFunc,
664 descriptor.m_ClippingThresCell,
665 descriptor.m_ClippingThresProj,
666 descriptor.m_CifgEnabled,
667 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100668 descriptor.m_ProjectionEnabled,
669 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000670
Finn Williamsb454c5c2021-02-09 15:56:23 +0000671 // Index for constants vector
672 std::size_t i = 0;
673
674 // Get mandatory/basic input parameters
675 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
676 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
677 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
678 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
679 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
680 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
681 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
682 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
683 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
684
685
Jim Flynn11af3752019-03-19 17:22:29 +0000686
687 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
688 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
689 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
690 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
691 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
692 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
693 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
694 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
695 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100696 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
697 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
698 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
699 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000700
701 if (!descriptor.m_CifgEnabled)
702 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000703 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
704 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
705 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000706 }
707
708 if (descriptor.m_PeepholeEnabled)
709 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000710 if (!descriptor.m_CifgEnabled)
711 {
712 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
713 }
714 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
715 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
716 }
717
718 if (descriptor.m_ProjectionEnabled)
719 {
720 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
721 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000722 }
723
Jan Eilersf8c62972019-07-17 11:07:49 +0100724 if (descriptor.m_LayerNormEnabled)
725 {
726 if (!descriptor.m_CifgEnabled)
727 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000728 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100729 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000730 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
731 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
732 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100733 }
734
Jim Flynn11af3752019-03-19 17:22:29 +0000735 auto fbLstmParams = serializer::CreateLstmInputParams(
736 m_flatBufferBuilder,
737 inputToForgetWeights,
738 inputToCellWeights,
739 inputToOutputWeights,
740 recurrentToForgetWeights,
741 recurrentToCellWeights,
742 recurrentToOutputWeights,
743 forgetGateBias,
744 cellBias,
745 outputGateBias,
746 inputToInputWeights,
747 recurrentToInputWeights,
748 cellToInputWeights,
749 inputGateBias,
750 projectionWeights,
751 projectionBias,
752 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100753 cellToOutputWeights,
754 inputLayerNormWeights,
755 forgetLayerNormWeights,
756 cellLayerNormWeights,
757 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000758
759 auto fbLstmLayer = serializer::CreateLstmLayer(
760 m_flatBufferBuilder,
761 fbLstmBaseLayer,
762 fbLstmDescriptor,
763 fbLstmParams);
764
765 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
766}
767
Finn Williamsb454c5c2021-02-09 15:56:23 +0000768void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000769{
Jan Eilers8eb25602020-03-09 12:13:48 +0000770 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000771
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000772 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
773 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
774
775 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
776}
777
Finn Williamsb454c5c2021-02-09 15:56:23 +0000778void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000779 const armnn::MeanDescriptor& descriptor,
780 const char* name)
781{
Jan Eilers8eb25602020-03-09 12:13:48 +0000782 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000783
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000784 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
785 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
786 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
787 descriptor.m_KeepDims);
788
789 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
790 fbMeanBaseLayer,
791 fbMeanDescriptor);
792
793 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
794}
795
Finn Williamsb454c5c2021-02-09 15:56:23 +0000796void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000797{
Jan Eilers8eb25602020-03-09 12:13:48 +0000798 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000799
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000800 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
801 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
802
803 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
804}
805
Finn Williamsb454c5c2021-02-09 15:56:23 +0000806void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100807{
Jan Eilers8eb25602020-03-09 12:13:48 +0000808 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000809
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100810 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
811 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
812
813 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
814}
815
Finn Williamsb454c5c2021-02-09 15:56:23 +0000816void SerializerStrategy::SerializeMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100817 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000818 const char* name)
819{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000820 SerializeConcatLayer(layer, mergerDescriptor, name);
Jim Flynne242f2d2019-05-22 14:24:13 +0100821}
822
Finn Williamsb454c5c2021-02-09 15:56:23 +0000823void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100824 const armnn::ConcatDescriptor& concatDescriptor,
825 const char* name)
826{
Jan Eilers8eb25602020-03-09 12:13:48 +0000827 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000828
Jim Flynne242f2d2019-05-22 14:24:13 +0100829 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000830
831 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100832 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000833 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100834 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000835 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100836 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000837 {
838 origins.push_back(origin[d]);
839 }
840 auto view = m_flatBufferBuilder.CreateVector(origins);
841 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
842 views.push_back(uintVector);
843 }
844
Jim Flynne242f2d2019-05-22 14:24:13 +0100845 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
846 concatDescriptor.GetConcatAxis(),
847 concatDescriptor.GetNumViews(),
848 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000849 m_flatBufferBuilder.CreateVector(views));
850
Jim Flynne242f2d2019-05-22 14:24:13 +0100851 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
852 flatBufferConcatBaseLayer,
853 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000854
Jim Flynne242f2d2019-05-22 14:24:13 +0100855 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000856}
857
Finn Williamsb454c5c2021-02-09 15:56:23 +0000858void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000859{
Jan Eilers8eb25602020-03-09 12:13:48 +0000860 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000861
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000862 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
863 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
864 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000865
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000866 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000867}
868
Finn Williamsb454c5c2021-02-09 15:56:23 +0000869void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000870 const armnn::PadDescriptor& padDescriptor,
871 const char* name)
872{
Jan Eilers8eb25602020-03-09 12:13:48 +0000873 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000874
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000875 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
876
877 std::vector<unsigned int> padList;
878 for (auto& p: padDescriptor.m_PadList)
879 {
880 padList.push_back(p.first);
881 padList.push_back(p.second);
882 }
883
884 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100885 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100886 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000887
888 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
889 flatBufferBaseLayer,
890 flatBufferPadDesc);
891
892 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
893}
894
Finn Williamsb454c5c2021-02-09 15:56:23 +0000895void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000896 const armnn::PermuteDescriptor& permuteDescriptor,
897 const char* name)
898{
Jan Eilers8eb25602020-03-09 12:13:48 +0000899 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000900
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000901 // Create FlatBuffer BaseLayer
902 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
903
904 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100905 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000906 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100907 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000908 }
909
910 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
911 m_flatBufferBuilder.CreateVector(dimMappings));
912
913 // Create the FlatBuffer PermuteLayer
914 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
915 flatBufferPermuteBaseLayer,
916 flatBufferPermuteDesc);
917
918 // Add the AnyLayer to the FlatBufferLayers
919 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
920}
921
Finn Williams2605b232020-06-10 15:53:46 +0100922// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000923void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100924 const char* name)
925{
926 IgnoreUnused(name);
927 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
928 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
929
930 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
931}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000932
Finn Williamsb454c5c2021-02-09 15:56:23 +0000933void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
934 const armnn::ReduceDescriptor& reduceDescriptor,
935 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000936{
937 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
938 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000939 reduceDescriptor.m_KeepDims,
940 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
941 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
942 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
943 fbReduceBaseLayer,
944 fbDescriptor);
945
946 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
947}
948
Saoirse Stewart263829c2019-02-19 15:54:14 +0000949// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000950void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000951 const armnn::ReshapeDescriptor& reshapeDescriptor,
952 const char* name)
953{
Jan Eilers8eb25602020-03-09 12:13:48 +0000954 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000955
Saoirse Stewart263829c2019-02-19 15:54:14 +0000956 // Create FlatBuffer BaseLayer
957 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
958
959 std::vector<unsigned int> targetShape;
960 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
961 {
962 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
963 }
964
965 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
966 m_flatBufferBuilder.CreateVector(targetShape));
967
968 // Create the FlatBuffer ReshapeLayer
969 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
970 flatBufferReshapeDesc);
971
972 // Add the AnyLayer to the FlatBufferLayers
973 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
974}
975
Finn Williamsb454c5c2021-02-09 15:56:23 +0000976void SerializerStrategy::SerializeResizeBilinearLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000977 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
978 const char* name)
979{
Jan Eilers8eb25602020-03-09 12:13:48 +0000980 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000981
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000982 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
983
984 auto flatBufferDescriptor =
985 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
986 resizeDescriptor.m_TargetWidth,
987 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100988 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
989 resizeDescriptor.m_AlignCorners,
990 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000991
992 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
993 flatBufferBaseLayer,
994 flatBufferDescriptor);
995
996 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
997}
998
Finn Williamsb454c5c2021-02-09 15:56:23 +0000999void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +01001000 const armnn::ResizeDescriptor& resizeDescriptor,
1001 const char* name)
1002{
Jan Eilers8eb25602020-03-09 12:13:48 +00001003 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001004
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001005 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1006
1007 auto flatBufferDescriptor =
1008 CreateResizeDescriptor(m_flatBufferBuilder,
1009 resizeDescriptor.m_TargetHeight,
1010 resizeDescriptor.m_TargetWidth,
1011 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001012 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1013 resizeDescriptor.m_AlignCorners,
1014 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001015
1016 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1017 flatBufferBaseLayer,
1018 flatBufferDescriptor);
1019
1020 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001021}
1022
Finn Williamsb454c5c2021-02-09 15:56:23 +00001023void SerializerStrategy::SerializeRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan8b42a382019-03-01 14:24:49 +00001024{
Jan Eilers8eb25602020-03-09 12:13:48 +00001025 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001026
Sadik Armagan8b42a382019-03-01 14:24:49 +00001027 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
1028 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
1029
1030 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
1031}
1032
Finn Williamsb454c5c2021-02-09 15:56:23 +00001033void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001034 const armnn::SliceDescriptor& sliceDescriptor,
1035 const char* name)
1036{
Jan Eilers8eb25602020-03-09 12:13:48 +00001037 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001038
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001039 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1040 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1041 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1042 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1043
1044 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1045
1046 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001047}
1048
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001049// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001050void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001051 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001052 const char* name)
1053{
Jan Eilers8eb25602020-03-09 12:13:48 +00001054 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001055
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001056 // Create FlatBuffer BaseLayer
1057 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1058
1059 // Create the FlatBuffer SoftmaxDescriptor
1060 auto flatBufferSoftmaxDesc =
1061 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
1062
1063 // Create the FlatBuffer SoftmaxLayer
1064 auto flatBufferSoftmaxLayer =
1065 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1066 flatBufferSoftmaxBaseLayer,
1067 flatBufferSoftmaxDesc);
1068
1069 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1070}
1071
Finn Williamsb454c5c2021-02-09 15:56:23 +00001072void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001073 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001074 const char* name)
1075{
Jan Eilers8eb25602020-03-09 12:13:48 +00001076 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001077
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001078 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1079 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1080 m_flatBufferBuilder,
1081 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1082 pooling2dDescriptor.m_PadLeft,
1083 pooling2dDescriptor.m_PadRight,
1084 pooling2dDescriptor.m_PadTop,
1085 pooling2dDescriptor.m_PadBottom,
1086 pooling2dDescriptor.m_PoolWidth,
1087 pooling2dDescriptor.m_PoolHeight,
1088 pooling2dDescriptor.m_StrideX,
1089 pooling2dDescriptor.m_StrideY,
1090 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1091 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1092 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1093
1094 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1095 fbPooling2dBaseLayer,
1096 fbPooling2dDescriptor);
1097
1098 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1099}
1100
Finn Williamsb454c5c2021-02-09 15:56:23 +00001101void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001102 const char* name)
1103{
Jan Eilers8eb25602020-03-09 12:13:48 +00001104 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001105
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001106 // Create FlatBuffer BaseLayer
1107 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1108
1109 // Create the FlatBuffer AdditionLayer
1110 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1111
1112 // Add the AnyLayer to the FlatBufferLayers
1113 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001114}
1115
Finn Williamsb454c5c2021-02-09 15:56:23 +00001116void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001117{
Jan Eilers8eb25602020-03-09 12:13:48 +00001118 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001119
Derek Lamberti87acb272019-03-27 16:51:31 +00001120 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1121 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1122 fbQuantizeBaseLayer);
1123 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1124}
1125
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001126// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001127void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1128 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1129 const std::vector<armnn::ConstTensor>& constants,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001130 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001131{
1132 // Create FlatBuffer BaseLayer
1133 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1134
1135 // Create FlatBuffer FullyConnectedDescriptor
1136 auto flatBufferDescriptor =
1137 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1138 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001139 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1140 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001141
1142 // Create FlatBuffer weights data
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001143 flatbuffers::Offset<serializer::ConstTensor> flatBufferWeights;
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001144 // Create FlatBuffer bias data
1145 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001146 if (fullyConnectedDescriptor.m_ConstantWeights && !constants.empty())
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001147 {
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001148 armnn::ConstTensor weights = constants.at(0);
1149 flatBufferWeights = CreateConstTensorInfo(weights);
1150
1151 if (fullyConnectedDescriptor.m_BiasEnabled)
1152 {
1153 armnn::ConstTensor biases = constants.at(1);
1154 flatBufferBiases = CreateConstTensorInfo(biases);
1155 }
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001156 }
1157
1158 // Create FlatBuffer FullyConnectedLayer
1159 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1160 flatBufferBaseLayer,
1161 flatBufferDescriptor,
1162 flatBufferWeights,
1163 flatBufferBiases);
1164
1165 // Add created FullyConnectedLayer to the FlatBufferLayers
1166 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1167}
1168
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001169// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001170void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001171 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1172 const char* name)
1173{
Jan Eilers8eb25602020-03-09 12:13:48 +00001174 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001175
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001176 // Create FlatBuffer BaseLayer
1177 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1178
1179 std::vector<unsigned int> padList;
1180 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1181 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1182 {
1183 padList.push_back(pad.first);
1184 padList.push_back(pad.second);
1185 }
1186
1187 auto flatBufferDescriptor =
1188 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1189 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1190 m_flatBufferBuilder.CreateVector(padList),
1191 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1192
1193 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1194 flatBufferBaseLayer,
1195 flatBufferDescriptor);
1196
1197 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1198}
1199
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001200// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001201void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001202 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1203 const char* name)
1204{
Jan Eilers8eb25602020-03-09 12:13:48 +00001205 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001206
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001207 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1208 auto flatBufferDescriptor =
1209 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1210 spaceToDepthDescriptor.m_BlockSize,
1211 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1212
1213 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1214 flatBufferBaseLayer,
1215 flatBufferDescriptor);
1216
1217 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001218}
1219
Jim Flynn18ce3382019-03-08 11:08:30 +00001220// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001221void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001222 const armnn::ViewsDescriptor& viewsDescriptor,
1223 const char* name)
1224{
Jan Eilers8eb25602020-03-09 12:13:48 +00001225 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001226
Jim Flynn18ce3382019-03-08 11:08:30 +00001227 // Create FlatBuffer ViewOrigins
1228 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1229 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1230
1231 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1232 {
1233 std::vector<uint32_t> viewOrigin;
1234 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1235
1236 // Copy vector
1237 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1238 {
1239 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1240 }
1241
1242 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1243 m_flatBufferBuilder.CreateVector(viewOrigin)));
1244 }
1245
1246 // Create FlatBuffer OriginsDescriptor
1247 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1248 viewsDescriptor.GetOrigins().GetConcatAxis(),
1249 viewsDescriptor.GetOrigins().GetNumViews(),
1250 viewsDescriptor.GetOrigins().GetNumDimensions(),
1251 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1252
1253 // Create FlatBuffer ViewOrigins
1254 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1255 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1256
1257 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1258 {
1259 std::vector<uint32_t> viewSize;
1260 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1261
1262 // Copy vector
1263 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1264 {
1265 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1266 }
1267
1268 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1269 m_flatBufferBuilder.CreateVector(viewSize)));
1270 }
1271
1272 // Create FlatBuffer ViewsDescriptor
1273 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1274 flatBufferOriginDescriptor,
1275 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1276
1277 // Create FlatBuffer BaseLayer
1278 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1279
1280 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1281 flatBufferBaseLayer,
1282 flatBufferViewsDescriptor);
1283
1284 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1285}
1286
Finn Williamsb454c5c2021-02-09 15:56:23 +00001287void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001288 const armnn::NormalizationDescriptor& descriptor,
1289 const char* name)
1290{
Jan Eilers8eb25602020-03-09 12:13:48 +00001291 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001292
Nina Drozd57728782019-02-27 10:53:27 +00001293 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1294
1295 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1296 m_flatBufferBuilder,
1297 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1298 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1299 descriptor.m_NormSize,
1300 descriptor.m_Alpha,
1301 descriptor.m_Beta,
1302 descriptor.m_K,
1303 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1304
1305 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1306 fbNormalizationBaseLayer,
1307 fbNormalizationDescriptor);
1308
1309 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1310}
1311
Keith Davis3ae3f972021-05-21 16:33:48 +01001312void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1313 const char* name)
1314{
1315 IgnoreUnused(name);
1316
1317 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1318 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1319
1320 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1321}
1322
Finn Williamsb454c5c2021-02-09 15:56:23 +00001323void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001324 const armnn::StackDescriptor& stackDescriptor,
1325 const char* name)
1326{
Jan Eilers8eb25602020-03-09 12:13:48 +00001327 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001328
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001329 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1330
1331 std::vector<unsigned int> inputShape;
1332 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1333 {
1334 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1335 }
1336
1337 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1338 stackDescriptor.m_Axis,
1339 stackDescriptor.m_NumInputs,
1340 m_flatBufferBuilder.CreateVector(inputShape));
1341
1342 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1343 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001344}
1345
Finn Williamsb454c5c2021-02-09 15:56:23 +00001346void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001347 const armnn::StandInDescriptor& standInDescriptor,
1348 const char *name)
1349{
Jan Eilers8eb25602020-03-09 12:13:48 +00001350 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001351
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001352 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1353 standInDescriptor.m_NumInputs,
1354 standInDescriptor.m_NumOutputs);
1355
1356 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1357 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1358
1359 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001360}
1361
Finn Williamsb454c5c2021-02-09 15:56:23 +00001362void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001363 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1364 const char* name)
1365{
Jan Eilers8eb25602020-03-09 12:13:48 +00001366 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001367
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001368 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1369
1370 auto flatBufferDescriptor =
1371 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1372 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1373 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1374 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1375 stridedSliceDescriptor.m_BeginMask,
1376 stridedSliceDescriptor.m_EndMask,
1377 stridedSliceDescriptor.m_ShrinkAxisMask,
1378 stridedSliceDescriptor.m_EllipsisMask,
1379 stridedSliceDescriptor.m_NewAxisMask,
1380 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1381
1382 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1383 flatBufferBaseLayer,
1384 flatBufferDescriptor);
1385
1386 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1387}
1388
Finn Williamsb454c5c2021-02-09 15:56:23 +00001389void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001390{
Jan Eilers8eb25602020-03-09 12:13:48 +00001391 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001392
Conor Kennedyda1f9752019-03-01 14:37:12 +00001393 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1394 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1395
1396 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1397}
1398
Finn Williamsb454c5c2021-02-09 15:56:23 +00001399void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001400{
Jan Eilers8eb25602020-03-09 12:13:48 +00001401 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001402
Sadik Armaganeff363d2019-04-05 15:25:46 +01001403 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1404 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1405
1406 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1407}
1408
Finn Williamsb454c5c2021-02-09 15:56:23 +00001409void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001410 const armnn::IConnectableLayer* layer,
1411 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001412 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001413 const char* name)
1414{
Jan Eilers8eb25602020-03-09 12:13:48 +00001415 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001416
Finn Williamsb454c5c2021-02-09 15:56:23 +00001417 const armnn::ConstTensor& weights = constants.at(0);
1418
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001419 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1420 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1421 descriptor.m_PadLeft,
1422 descriptor.m_PadRight,
1423 descriptor.m_PadTop,
1424 descriptor.m_PadBottom,
1425 descriptor.m_StrideX,
1426 descriptor.m_StrideY,
1427 descriptor.m_BiasEnabled,
1428 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1429
1430 // weights & biases
1431 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1432 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001433 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001434 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001435 const armnn::ConstTensor& biases = constants.at(1);
1436 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001437 }
1438
1439 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1440 fbBaseLayer,
1441 fbDescriptor,
1442 fbWeightsConstTensorInfo,
1443 fbBiasesConstTensorInfo);
1444
1445 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001446}
1447
Finn Williamsb454c5c2021-02-09 15:56:23 +00001448void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001449 const armnn::TransposeDescriptor& descriptor,
1450 const char* name)
1451{
Jan Eilers8eb25602020-03-09 12:13:48 +00001452 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001453
1454 // Create FlatBuffer BaseLayer
1455 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1456
1457 std::vector<unsigned int> dimMappings;
1458 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1459 {
1460 dimMappings.push_back(descriptor.m_DimMappings[i]);
1461 }
1462
1463 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1464 m_flatBufferBuilder.CreateVector(dimMappings));
1465
1466 // Create the FlatBuffer TransposeLayer
1467 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1468 flatBufferBaseLayer,
1469 flatBufferDesc);
1470
1471 // Add the AnyLayer to the FlatBufferLayers
1472 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1473}
1474
Finn Williamsb454c5c2021-02-09 15:56:23 +00001475void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1476 const armnn::QLstmDescriptor& descriptor,
1477 const std::vector<armnn::ConstTensor>& constants,
1478 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001479{
James Conroy8d333182020-05-13 10:27:58 +01001480 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001481
James Conroy8d333182020-05-13 10:27:58 +01001482 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1483
1484 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1485 m_flatBufferBuilder,
1486 descriptor.m_CifgEnabled,
1487 descriptor.m_PeepholeEnabled,
1488 descriptor.m_ProjectionEnabled,
1489 descriptor.m_LayerNormEnabled,
1490 descriptor.m_CellClip,
1491 descriptor.m_ProjectionClip,
1492 descriptor.m_InputIntermediateScale,
1493 descriptor.m_ForgetIntermediateScale,
1494 descriptor.m_CellIntermediateScale,
1495 descriptor.m_OutputIntermediateScale,
1496 descriptor.m_HiddenStateZeroPoint,
1497 descriptor.m_HiddenStateScale
1498 );
1499
Finn Williamsb454c5c2021-02-09 15:56:23 +00001500 // Index for constants vector
1501 std::size_t i = 0;
1502
James Conroy8d333182020-05-13 10:27:58 +01001503 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001504 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1505 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1506 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1507 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1508 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1509 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1510 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1511 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1512 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001513
1514 // CIFG
1515 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1516 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1517 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1518
1519 if (!descriptor.m_CifgEnabled)
1520 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001521 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1522 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1523 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001524 }
1525
1526 // Peephole
1527 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1528 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1529 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1530
1531 if (descriptor.m_PeepholeEnabled)
1532 {
1533 if (!descriptor.m_CifgEnabled)
1534 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001535 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001536 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001537 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1538 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1539 }
James Conroy8d333182020-05-13 10:27:58 +01001540
Finn Williamsb454c5c2021-02-09 15:56:23 +00001541 // Projection
1542 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1543 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1544
1545 if (descriptor.m_ProjectionEnabled)
1546 {
1547 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1548 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001549 }
1550
1551 // Layer norm
1552 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1553 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1554 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1555 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1556
1557 if (descriptor.m_LayerNormEnabled)
1558 {
1559 if (!descriptor.m_CifgEnabled)
1560 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001561 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001562 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001563 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1564 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1565 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001566 }
1567
1568 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1569 m_flatBufferBuilder,
1570 inputToForgetWeights,
1571 inputToCellWeights,
1572 inputToOutputWeights,
1573 recurrentToForgetWeights,
1574 recurrentToCellWeights,
1575 recurrentToOutputWeights,
1576 forgetGateBias,
1577 cellBias,
1578 outputGateBias,
1579 inputToInputWeights,
1580 recurrentToInputWeights,
1581 inputGateBias,
1582 projectionWeights,
1583 projectionBias,
1584 cellToInputWeights,
1585 cellToForgetWeights,
1586 cellToOutputWeights,
1587 inputLayerNormWeights,
1588 forgetLayerNormWeights,
1589 cellLayerNormWeights,
1590 outputLayerNormWeights);
1591
1592 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1593 m_flatBufferBuilder,
1594 fbQLstmBaseLayer,
1595 fbQLstmDescriptor,
1596 fbQLstmParams);
1597
1598 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001599}
1600
Finn Williamsb454c5c2021-02-09 15:56:23 +00001601void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1602 const std::vector<armnn::ConstTensor>& constants,
1603 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001604{
Jan Eilers8eb25602020-03-09 12:13:48 +00001605 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001606
Jan Eilers5b01a892019-07-23 09:47:43 +01001607 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1608
Finn Williamsb454c5c2021-02-09 15:56:23 +00001609 // index for constants vector
1610 size_t i = 0;
1611
Jan Eilers5b01a892019-07-23 09:47:43 +01001612 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001613 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1614 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1615 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1616 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001617
Finn Williamsb454c5c2021-02-09 15:56:23 +00001618 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1619 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1620 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1621 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001622
Finn Williamsb454c5c2021-02-09 15:56:23 +00001623 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1624 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1625 auto cellBias = CreateConstTensorInfo(constants[i++]);
1626 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001627
1628 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1629 m_flatBufferBuilder,
1630 inputToInputWeights,
1631 inputToForgetWeights,
1632 inputToCellWeights,
1633 inputToOutputWeights,
1634 recurrentToInputWeights,
1635 recurrentToForgetWeights,
1636 recurrentToCellWeights,
1637 recurrentToOutputWeights,
1638 inputGateBias,
1639 forgetGateBias,
1640 cellBias,
1641 outputGateBias);
1642
1643 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1644 m_flatBufferBuilder,
1645 fbQuantizedLstmBaseLayer,
1646 fbQuantizedLstmParams);
1647
1648 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001649}
1650
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001651void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1652 const armnn::IConnectableLayer* layer,
1653 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1654 const std::vector<armnn::ConstTensor>& constants,
1655 const char* name)
1656{
1657 IgnoreUnused(name);
1658
1659 auto fbUnidirectionalSequenceLstmBaseLayer =
1660 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1661
1662 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1663 m_flatBufferBuilder,
1664 descriptor.m_ActivationFunc,
1665 descriptor.m_ClippingThresCell,
1666 descriptor.m_ClippingThresProj,
1667 descriptor.m_CifgEnabled,
1668 descriptor.m_PeepholeEnabled,
1669 descriptor.m_ProjectionEnabled,
1670 descriptor.m_LayerNormEnabled,
1671 descriptor.m_TimeMajor);
1672
1673 // Index for constants vector
1674 std::size_t i = 0;
1675
1676 // Get mandatory/basic input parameters
1677 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1678 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1679 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1680 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1681 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1682 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1683 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1684 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1685 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1686
1687 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1688 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1689 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1690 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1691 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1692 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1693 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1694 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1695 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1696 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1697 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1698 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1699 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1700
1701 if (!descriptor.m_CifgEnabled)
1702 {
1703 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1704 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1705 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1706 }
1707
1708 if (descriptor.m_PeepholeEnabled)
1709 {
1710 if (!descriptor.m_CifgEnabled)
1711 {
1712 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1713 }
1714 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1715 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1716 }
1717
1718 if (descriptor.m_ProjectionEnabled)
1719 {
1720 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1721 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1722 }
1723
1724 if (descriptor.m_LayerNormEnabled)
1725 {
1726 if (!descriptor.m_CifgEnabled)
1727 {
1728 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1729 }
1730 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1731 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1732 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1733 }
1734
1735 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1736 m_flatBufferBuilder,
1737 inputToForgetWeights,
1738 inputToCellWeights,
1739 inputToOutputWeights,
1740 recurrentToForgetWeights,
1741 recurrentToCellWeights,
1742 recurrentToOutputWeights,
1743 forgetGateBias,
1744 cellBias,
1745 outputGateBias,
1746 inputToInputWeights,
1747 recurrentToInputWeights,
1748 cellToInputWeights,
1749 inputGateBias,
1750 projectionWeights,
1751 projectionBias,
1752 cellToForgetWeights,
1753 cellToOutputWeights,
1754 inputLayerNormWeights,
1755 forgetLayerNormWeights,
1756 cellLayerNormWeights,
1757 outputLayerNormWeights);
1758
1759 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1760 m_flatBufferBuilder,
1761 fbUnidirectionalSequenceLstmBaseLayer,
1762 fbUnidirectionalSequenceLstmDescriptor,
1763 fbUnidirectionalSequenceLstmParams);
1764
1765 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1766}
1767
Finn Williamsb454c5c2021-02-09 15:56:23 +00001768fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001769 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001770{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001771
Sadik Armagandb059fd2019-03-20 12:28:32 +00001772 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1773
Mike Kelly8c1701a2019-02-11 17:01:27 +00001774 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1775 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1776
1777 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001778 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001779 m_flatBufferBuilder.CreateString(layer->GetName()),
1780 layerType,
1781 m_flatBufferBuilder.CreateVector(inputSlots),
1782 m_flatBufferBuilder.CreateVector(outputSlots));
1783}
1784
Finn Williamsb454c5c2021-02-09 15:56:23 +00001785void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001786{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001787
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001788 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001789 m_serializedLayers.push_back(anyLayer);
1790}
1791
Mike Kellya0766c32019-02-19 17:22:07 +00001792template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001793flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001794{
1795 const T* buffer = reinterpret_cast<const T*>(memory);
1796 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1797 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1798 return fbVector;
1799}
1800
Finn Williamsb454c5c2021-02-09 15:56:23 +00001801flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001802{
Mike Kellya0766c32019-02-19 17:22:07 +00001803 // Get the dimensions
1804 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001805 std::vector<bool> specificity;
1806 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1807 // matches the size of dimensions.
1808 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1809 {
1810 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001811
1812 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1813 {
1814 shape.push_back(tensorInfo.GetShape()[dim]);
1815 }
1816 else
1817 {
1818 shape.push_back(0);
1819 }
Colm Donelan800b2812021-02-12 12:43:35 +00001820 }
1821
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001822 if (tensorInfo.HasPerAxisQuantization())
1823 {
1824 // Create FlatBuffer TensorInfo
1825 auto flatBufferTensorInfo =
1826 serializer::CreateTensorInfo(m_flatBufferBuilder,
1827 m_flatBufferBuilder.CreateVector(shape),
1828 GetFlatBufferDataType(tensorInfo.GetDataType()),
1829 tensorInfo.GetQuantizationScales()[0],
1830 tensorInfo.GetQuantizationOffset(),
1831 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001832 tensorInfo.GetQuantizationDim().value(),
1833 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001834 (tensorInfo.GetShape().GetDimensionality()),
1835 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001836 return flatBufferTensorInfo;
1837 }
1838
Mike Kellya0766c32019-02-19 17:22:07 +00001839 // Create FlatBuffer TensorInfo
1840 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1841 m_flatBufferBuilder.CreateVector(shape),
1842 GetFlatBufferDataType(tensorInfo.GetDataType()),
1843 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001844 tensorInfo.GetQuantizationOffset(),
1845 0,
1846 0,
1847 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001848 (tensorInfo.GetShape().GetDimensionality()),
1849 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001850 return flatBufferTensorInfo;
1851}
1852
1853flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001854 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001855{
1856 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1857
Mike Kellya0766c32019-02-19 17:22:07 +00001858 flatbuffers::Offset<void> fbPayload;
1859
1860 switch (tensorInfo.GetDataType())
1861 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001862 case armnn::DataType::Signed64:
1863 {
1864 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1865 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1866 m_flatBufferBuilder,
1867 fbVector);
1868 fbPayload = flatBuffersData.o;
1869 break;
1870 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001871 case armnn::DataType::Float32:
1872 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001873 {
1874 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1875 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1876 m_flatBufferBuilder,
1877 fbVector);
1878 fbPayload = flatBuffersData.o;
1879 break;
1880 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001881 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001882 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001883 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001884 {
1885 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1886 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1887 m_flatBufferBuilder,
1888 fbVector);
1889 fbPayload = flatBuffersData.o;
1890 break;
1891 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001892 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001893 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001894 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001895 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001896 default:
1897 {
1898 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1899 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1900 m_flatBufferBuilder,
1901 fbVector);
1902 fbPayload = flatBuffersData.o;
1903 }
1904 }
1905 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1906 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001907 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001908 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1909 fbPayload);
1910 return flatBufferConstTensor;
1911}
1912
Finn Williamsb454c5c2021-02-09 15:56:23 +00001913flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001914{
1915 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1916 serializer::CreateFeatureCompatibilityVersions(
1917 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001918 1, // Binding ids scheme version
1919 1 // Weights layout scheme version
Tee Jungaa920c52019-11-05 10:48:25 +00001920 );
1921 return versionsTable;
1922}
1923
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001924std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001925 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001926{
Mike Kellya0766c32019-02-19 17:22:07 +00001927 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001928
1929 // Get the InputSlots
1930 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1931 {
1932 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1933
1934 // Get the Connection for the InputSlot
1935 const IOutputSlot* connection = inputSlot.GetConnection();
1936
1937 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001938 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1939 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001940 // Create FlatBuffer InputSlot
1941 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1942 }
1943 return inputSlots;
1944}
1945
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001946std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001947 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001948{
1949 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1950
1951 // Get the OutputSlots
1952 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1953 {
1954 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001955 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001956
Mike Kelly8c1701a2019-02-11 17:01:27 +00001957 // Create FlatBuffer Outputslot
1958 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1959 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001960 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001961 }
1962 return outputSlots;
1963}
1964
Finn Williamsb454c5c2021-02-09 15:56:23 +00001965void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1966 const BaseDescriptor& descriptor,
1967 const std::vector<armnn::ConstTensor>& constants,
1968 const char* name,
1969 const armnn::LayerBindingId id)
1970{
1971 IgnoreUnused(constants);
1972
1973 switch (layer->GetType())
1974 {
1975 case armnn::LayerType::Activation :
1976 {
1977 const armnn::ActivationDescriptor& layerDescriptor =
1978 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1979 SerializeActivationLayer(layer, layerDescriptor, name);
1980 break;
1981 }
1982 case armnn::LayerType::Addition :
1983 {
1984 SerializeAdditionLayer(layer, name);
1985 break;
1986 }
1987 case armnn::LayerType::ArgMinMax :
1988 {
1989 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1990 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1991 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1992 break;
1993 }
1994 case armnn::LayerType::BatchNormalization :
1995 {
1996 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1997 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1998 SerializeBatchNormalizationLayer(layer,
1999 layerDescriptor,
2000 constants,
2001 name);
2002 break;
2003 }
2004 case armnn::LayerType::BatchToSpaceNd :
2005 {
2006 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2007 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2008 SerializeBatchToSpaceNdLayer(layer,
2009 layerDescriptor,
2010 name);
2011 break;
2012 }
mathad01b392e982021-04-07 12:07:30 +01002013 case armnn::LayerType::Cast :
2014 {
2015 SerializeCastLayer(layer, name);
2016 break;
2017 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002018 case armnn::LayerType::Comparison :
2019 {
2020 const armnn::ComparisonDescriptor& layerDescriptor =
2021 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2022 SerializeComparisonLayer(layer,
2023 layerDescriptor,
2024 name);
2025 break;
2026 }
2027 case armnn::LayerType::Concat :
2028 {
2029 const armnn::ConcatDescriptor& layerDescriptor =
2030 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2031 SerializeConcatLayer(layer,
2032 layerDescriptor,
2033 name);
2034 break;
2035 }
2036 case armnn::LayerType::Constant :
2037 {
2038 SerializeConstantLayer(layer,
2039 constants,
2040 name);
2041 break;
2042 }
2043 case armnn::LayerType::Convolution2d :
2044 {
2045 const armnn::Convolution2dDescriptor& layerDescriptor =
2046 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2047 SerializeConvolution2dLayer(layer,
2048 layerDescriptor,
2049 constants,
2050 name);
2051 break;
2052 }
2053 case armnn::LayerType::DepthToSpace :
2054 {
2055 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2056 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2057 SerializeDepthToSpaceLayer(layer,
2058 layerDescriptor,
2059 name);
2060 break;
2061 }
2062 case armnn::LayerType::DepthwiseConvolution2d :
2063 {
2064 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2065 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2066 SerializeDepthwiseConvolution2dLayer(layer,
2067 layerDescriptor,
2068 constants,
2069 name);
2070 break;
2071 }
2072 case armnn::LayerType::Dequantize :
2073 {
2074 SerializeDequantizeLayer(layer,
2075 name);
2076 break;
2077 }
2078 case armnn::LayerType::DetectionPostProcess :
2079 {
2080 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2081 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2082 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2083 break;
2084 }
2085 case armnn::LayerType::Division :
2086 {
2087 SerializeDivisionLayer(layer, name);
2088 break;
2089 }
2090 case armnn::LayerType::ElementwiseUnary :
2091 {
2092 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2093 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2094 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2095 break;
2096 }
2097 case armnn::LayerType::Fill :
2098 {
2099 const armnn::FillDescriptor& layerDescriptor =
2100 static_cast<const armnn::FillDescriptor&>(descriptor);
2101 SerializeFillLayer(layer, layerDescriptor, name);
2102 break;
2103 }
2104 case armnn::LayerType::Floor :
2105 {
2106 SerializeFloorLayer(layer, name);
2107 break;
2108 }
2109 case armnn::LayerType::FullyConnected :
2110 {
2111 const armnn::FullyConnectedDescriptor& layerDescriptor =
2112 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
2113 SerializeFullyConnectedLayer(layer, layerDescriptor, constants, name);
2114 break;
2115 }
2116 case armnn::LayerType::Gather :
2117 {
2118 const armnn::GatherDescriptor& layerDescriptor =
2119 static_cast<const armnn::GatherDescriptor&>(descriptor);
2120 SerializeGatherLayer(layer, layerDescriptor, name);
2121 break;
2122 }
2123 case armnn::LayerType::Input:
2124 {
2125 SerializeInputLayer(layer, id, name);
2126 break;
2127 }
2128 case armnn::LayerType::InstanceNormalization :
2129 {
2130 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2131 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2132 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2133 break;
2134 }
2135 case armnn::LayerType::L2Normalization :
2136 {
2137 const armnn::L2NormalizationDescriptor& layerDescriptor =
2138 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2139 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2140 break;
2141 }
2142 case armnn::LayerType::LogicalBinary :
2143 {
2144 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2145 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2146 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2147 break;
2148 }
2149 case armnn::LayerType::LogSoftmax :
2150 {
2151 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2152 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2153 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2154 break;
2155 }
2156 case armnn::LayerType::Lstm :
2157 {
2158 const armnn::LstmDescriptor& layerDescriptor =
2159 static_cast<const armnn::LstmDescriptor&>(descriptor);
2160 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2161 break;
2162 }
2163 case armnn::LayerType::QLstm :
2164 {
2165 const armnn::QLstmDescriptor& layerDescriptor =
2166 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2167 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2168 break;
2169 }
2170 case armnn::LayerType::Maximum :
2171 {
2172 SerializeMaximumLayer(layer, name);
2173 break;
2174 }
2175 case armnn::LayerType::Mean :
2176 {
2177 const armnn::MeanDescriptor& layerDescriptor =
2178 static_cast<const armnn::MeanDescriptor&>(descriptor);
2179 SerializeMeanLayer(layer, layerDescriptor, name);
2180 break;
2181 }
2182 case armnn::LayerType::Merge :
2183 {
2184 SerializeMergeLayer(layer, name);
2185 break;
2186 }
2187 case armnn::LayerType::Minimum :
2188 {
2189 SerializeMinimumLayer(layer, name);
2190 break;
2191 }
2192 case armnn::LayerType::Multiplication :
2193 {
2194 SerializeMultiplicationLayer(layer, name);
2195 break;
2196 }
2197 case armnn::LayerType::Normalization :
2198 {
2199 const armnn::NormalizationDescriptor& layerDescriptor =
2200 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2201 SerializeNormalizationLayer(layer, layerDescriptor, name);
2202 break;
2203 }
2204 case armnn::LayerType::Output:
2205 {
2206 SerializeOutputLayer(layer, id, name);
2207 break;
2208 }
2209 case armnn::LayerType::Pad :
2210 {
2211 const armnn::PadDescriptor& layerDescriptor =
2212 static_cast<const armnn::PadDescriptor&>(descriptor);
2213 SerializePadLayer(layer, layerDescriptor, name);
2214 break;
2215 }
2216 case armnn::LayerType::Permute :
2217 {
2218 const armnn::PermuteDescriptor& layerDescriptor =
2219 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2220 SerializePermuteLayer(layer, layerDescriptor, name);
2221 break;
2222 }
2223 case armnn::LayerType::Pooling2d :
2224 {
2225 const armnn::Pooling2dDescriptor& layerDescriptor =
2226 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2227 SerializePooling2dLayer(layer, layerDescriptor, name);
2228 break;
2229 }
2230 case armnn::LayerType::Prelu :
2231 {
2232 SerializePreluLayer(layer, name);
2233 break;
2234 }
2235 case armnn::LayerType::Quantize :
2236 {
2237 SerializeQuantizeLayer(layer, name);
2238 break;
2239 }
2240 case armnn::LayerType::QuantizedLstm:
2241 SerializeQuantizedLstmLayer(layer, constants, name);
2242 break;
2243 case armnn::LayerType::Reshape:
2244 {
2245 const armnn::ReshapeDescriptor &layerDescriptor =
2246 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2247 SerializeReshapeLayer(layer, layerDescriptor, name);
2248 break;
2249 }
2250 case armnn::LayerType::Rank:
2251 {
2252 SerializeRankLayer(layer, name);
2253 break;
2254 }
2255 case armnn::LayerType::Reduce:
2256 {
2257 const armnn::ReduceDescriptor& layerDescriptor =
2258 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2259 SerializeReduceLayer(layer, layerDescriptor, name);
2260 break;
2261 }
2262 case armnn::LayerType::Resize:
2263 {
2264 const armnn::ResizeDescriptor& layerDescriptor =
2265 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2266 SerializeResizeLayer(layer, layerDescriptor, name);
2267 break;
2268 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002269 case armnn::LayerType::Shape:
2270 {
2271 SerializeShapeLayer(layer, name);
2272 break;
2273 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002274 case armnn::LayerType::Slice:
2275 {
2276 const armnn::SliceDescriptor& layerDescriptor =
2277 static_cast<const armnn::SliceDescriptor&>(descriptor);
2278 SerializeSliceLayer(layer, layerDescriptor, name);
2279 break;
2280 }
2281 case armnn::LayerType::Softmax:
2282 {
2283 const armnn::SoftmaxDescriptor& layerDescriptor =
2284 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2285 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2286 break;
2287 }
2288 case armnn::LayerType::SpaceToBatchNd:
2289 {
2290 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2291 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2292 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2293 break;
2294 }
2295 case armnn::LayerType::SpaceToDepth:
2296 {
2297 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2298 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2299 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2300 break;
2301 }
2302 case armnn::LayerType::Splitter:
2303 {
2304 const armnn::SplitterDescriptor& layerDescriptor =
2305 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2306 SerializeSplitterLayer(layer, layerDescriptor, name);
2307 break;
2308 }
2309 case armnn::LayerType::Stack:
2310 {
2311 const armnn::StackDescriptor& layerDescriptor =
2312 static_cast<const armnn::StackDescriptor&>(descriptor);
2313 SerializeStackLayer(layer, layerDescriptor, name);
2314 break;
2315 }
2316 case armnn::LayerType::StandIn:
2317 {
2318 const armnn::StandInDescriptor& layerDescriptor =
2319 static_cast<const armnn::StandInDescriptor&>(descriptor);
2320 SerializeStandInLayer(layer, layerDescriptor, name);
2321 break;
2322 }
2323 case armnn::LayerType::StridedSlice:
2324 {
2325 const armnn::StridedSliceDescriptor& layerDescriptor =
2326 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2327 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2328 break;
2329 }
2330 case armnn::LayerType::Subtraction:
2331 {
2332 SerializeSubtractionLayer(layer, name);
2333 break;
2334 }
2335 case armnn::LayerType::Switch:
2336 {
2337 SerializeSwitchLayer(layer, name);
2338 break;
2339 }
2340 case armnn::LayerType::Transpose:
2341 {
2342 const armnn::TransposeDescriptor& layerDescriptor =
2343 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2344 SerializeTransposeLayer(layer, layerDescriptor, name);
2345 break;
2346 }
2347 case armnn::LayerType::TransposeConvolution2d:
2348 {
2349 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2350 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2351 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2352 break;
2353 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002354 case armnn::LayerType::UnidirectionalSequenceLstm :
2355 {
2356 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2357 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2358 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2359 break;
2360 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002361 default:
2362 {
2363 throw InvalidArgumentException(
2364 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2365 layer->GetName(),
2366 id));
2367 }
2368 }
2369}
2370
Finn Williams85d36712021-01-26 22:30:06 +00002371void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002372{
2373 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002374 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2375 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002376
2377 // Create FlatBuffer SerializedGraph
2378 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002379 fbBuilder,
2380 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2381 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2382 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2383 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002384
2385 // Serialize the graph
2386 fbBuilder.Finish(serializedGraph);
2387}
2388
Finn Williamsb454c5c2021-02-09 15:56:23 +00002389
Finn Williams85d36712021-01-26 22:30:06 +00002390bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002391{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002392 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002393
Matthew Sloyan0663d662020-09-14 11:47:26 +01002394 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002395 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002396 return !stream.bad();
2397}
2398
Finn Williams2605b232020-06-10 15:53:46 +01002399} // namespace armnnSerializer