blob: 195b41657a2139ad292e8c2ee1a9189dab736583 [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,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001129 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001130{
1131 // Create FlatBuffer BaseLayer
1132 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1133
1134 // Create FlatBuffer FullyConnectedDescriptor
1135 auto flatBufferDescriptor =
1136 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1137 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001138 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1139 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001140
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001141 // Create FlatBuffer FullyConnectedLayer
1142 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1143 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001144 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001145
1146 // Add created FullyConnectedLayer to the FlatBufferLayers
1147 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1148}
1149
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001150// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001151void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001152 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1153 const char* name)
1154{
Jan Eilers8eb25602020-03-09 12:13:48 +00001155 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001156
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001157 // Create FlatBuffer BaseLayer
1158 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1159
1160 std::vector<unsigned int> padList;
1161 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1162 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1163 {
1164 padList.push_back(pad.first);
1165 padList.push_back(pad.second);
1166 }
1167
1168 auto flatBufferDescriptor =
1169 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1170 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1171 m_flatBufferBuilder.CreateVector(padList),
1172 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1173
1174 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1175 flatBufferBaseLayer,
1176 flatBufferDescriptor);
1177
1178 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1179}
1180
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001181// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001182void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001183 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1184 const char* name)
1185{
Jan Eilers8eb25602020-03-09 12:13:48 +00001186 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001187
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001188 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1189 auto flatBufferDescriptor =
1190 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1191 spaceToDepthDescriptor.m_BlockSize,
1192 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1193
1194 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1195 flatBufferBaseLayer,
1196 flatBufferDescriptor);
1197
1198 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001199}
1200
Jim Flynn18ce3382019-03-08 11:08:30 +00001201// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001202void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001203 const armnn::ViewsDescriptor& viewsDescriptor,
1204 const char* name)
1205{
Jan Eilers8eb25602020-03-09 12:13:48 +00001206 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001207
Jim Flynn18ce3382019-03-08 11:08:30 +00001208 // Create FlatBuffer ViewOrigins
1209 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1210 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1211
1212 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1213 {
1214 std::vector<uint32_t> viewOrigin;
1215 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1216
1217 // Copy vector
1218 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1219 {
1220 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1221 }
1222
1223 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1224 m_flatBufferBuilder.CreateVector(viewOrigin)));
1225 }
1226
1227 // Create FlatBuffer OriginsDescriptor
1228 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1229 viewsDescriptor.GetOrigins().GetConcatAxis(),
1230 viewsDescriptor.GetOrigins().GetNumViews(),
1231 viewsDescriptor.GetOrigins().GetNumDimensions(),
1232 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1233
1234 // Create FlatBuffer ViewOrigins
1235 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1236 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1237
1238 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1239 {
1240 std::vector<uint32_t> viewSize;
1241 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1242
1243 // Copy vector
1244 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1245 {
1246 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1247 }
1248
1249 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1250 m_flatBufferBuilder.CreateVector(viewSize)));
1251 }
1252
1253 // Create FlatBuffer ViewsDescriptor
1254 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1255 flatBufferOriginDescriptor,
1256 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1257
1258 // Create FlatBuffer BaseLayer
1259 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1260
1261 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1262 flatBufferBaseLayer,
1263 flatBufferViewsDescriptor);
1264
1265 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1266}
1267
Finn Williamsb454c5c2021-02-09 15:56:23 +00001268void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001269 const armnn::NormalizationDescriptor& descriptor,
1270 const char* name)
1271{
Jan Eilers8eb25602020-03-09 12:13:48 +00001272 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001273
Nina Drozd57728782019-02-27 10:53:27 +00001274 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1275
1276 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1277 m_flatBufferBuilder,
1278 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1279 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1280 descriptor.m_NormSize,
1281 descriptor.m_Alpha,
1282 descriptor.m_Beta,
1283 descriptor.m_K,
1284 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1285
1286 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1287 fbNormalizationBaseLayer,
1288 fbNormalizationDescriptor);
1289
1290 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1291}
1292
Keith Davis3ae3f972021-05-21 16:33:48 +01001293void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1294 const char* name)
1295{
1296 IgnoreUnused(name);
1297
1298 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1299 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1300
1301 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1302}
1303
Finn Williamsb454c5c2021-02-09 15:56:23 +00001304void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001305 const armnn::StackDescriptor& stackDescriptor,
1306 const char* name)
1307{
Jan Eilers8eb25602020-03-09 12:13:48 +00001308 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001309
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001310 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1311
1312 std::vector<unsigned int> inputShape;
1313 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1314 {
1315 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1316 }
1317
1318 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1319 stackDescriptor.m_Axis,
1320 stackDescriptor.m_NumInputs,
1321 m_flatBufferBuilder.CreateVector(inputShape));
1322
1323 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1324 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001325}
1326
Finn Williamsb454c5c2021-02-09 15:56:23 +00001327void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001328 const armnn::StandInDescriptor& standInDescriptor,
1329 const char *name)
1330{
Jan Eilers8eb25602020-03-09 12:13:48 +00001331 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001332
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001333 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1334 standInDescriptor.m_NumInputs,
1335 standInDescriptor.m_NumOutputs);
1336
1337 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1338 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1339
1340 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001341}
1342
Finn Williamsb454c5c2021-02-09 15:56:23 +00001343void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001344 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1345 const char* name)
1346{
Jan Eilers8eb25602020-03-09 12:13:48 +00001347 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001348
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001349 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1350
1351 auto flatBufferDescriptor =
1352 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1353 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1354 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1355 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1356 stridedSliceDescriptor.m_BeginMask,
1357 stridedSliceDescriptor.m_EndMask,
1358 stridedSliceDescriptor.m_ShrinkAxisMask,
1359 stridedSliceDescriptor.m_EllipsisMask,
1360 stridedSliceDescriptor.m_NewAxisMask,
1361 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1362
1363 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1364 flatBufferBaseLayer,
1365 flatBufferDescriptor);
1366
1367 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1368}
1369
Finn Williamsb454c5c2021-02-09 15:56:23 +00001370void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001371{
Jan Eilers8eb25602020-03-09 12:13:48 +00001372 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001373
Conor Kennedyda1f9752019-03-01 14:37:12 +00001374 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1375 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1376
1377 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1378}
1379
Finn Williamsb454c5c2021-02-09 15:56:23 +00001380void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001381{
Jan Eilers8eb25602020-03-09 12:13:48 +00001382 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001383
Sadik Armaganeff363d2019-04-05 15:25:46 +01001384 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1385 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1386
1387 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1388}
1389
Finn Williamsb454c5c2021-02-09 15:56:23 +00001390void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001391 const armnn::IConnectableLayer* layer,
1392 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001393 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001394 const char* name)
1395{
Jan Eilers8eb25602020-03-09 12:13:48 +00001396 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001397
Finn Williamsb454c5c2021-02-09 15:56:23 +00001398 const armnn::ConstTensor& weights = constants.at(0);
1399
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001400 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1401 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1402 descriptor.m_PadLeft,
1403 descriptor.m_PadRight,
1404 descriptor.m_PadTop,
1405 descriptor.m_PadBottom,
1406 descriptor.m_StrideX,
1407 descriptor.m_StrideY,
1408 descriptor.m_BiasEnabled,
1409 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1410
1411 // weights & biases
1412 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1413 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001414 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001415 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001416 const armnn::ConstTensor& biases = constants.at(1);
1417 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001418 }
1419
1420 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1421 fbBaseLayer,
1422 fbDescriptor,
1423 fbWeightsConstTensorInfo,
1424 fbBiasesConstTensorInfo);
1425
1426 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001427}
1428
Finn Williamsb454c5c2021-02-09 15:56:23 +00001429void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001430 const armnn::TransposeDescriptor& descriptor,
1431 const char* name)
1432{
Jan Eilers8eb25602020-03-09 12:13:48 +00001433 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001434
1435 // Create FlatBuffer BaseLayer
1436 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1437
1438 std::vector<unsigned int> dimMappings;
1439 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1440 {
1441 dimMappings.push_back(descriptor.m_DimMappings[i]);
1442 }
1443
1444 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1445 m_flatBufferBuilder.CreateVector(dimMappings));
1446
1447 // Create the FlatBuffer TransposeLayer
1448 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1449 flatBufferBaseLayer,
1450 flatBufferDesc);
1451
1452 // Add the AnyLayer to the FlatBufferLayers
1453 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1454}
1455
Finn Williamsb454c5c2021-02-09 15:56:23 +00001456void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1457 const armnn::QLstmDescriptor& descriptor,
1458 const std::vector<armnn::ConstTensor>& constants,
1459 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001460{
James Conroy8d333182020-05-13 10:27:58 +01001461 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001462
James Conroy8d333182020-05-13 10:27:58 +01001463 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1464
1465 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1466 m_flatBufferBuilder,
1467 descriptor.m_CifgEnabled,
1468 descriptor.m_PeepholeEnabled,
1469 descriptor.m_ProjectionEnabled,
1470 descriptor.m_LayerNormEnabled,
1471 descriptor.m_CellClip,
1472 descriptor.m_ProjectionClip,
1473 descriptor.m_InputIntermediateScale,
1474 descriptor.m_ForgetIntermediateScale,
1475 descriptor.m_CellIntermediateScale,
1476 descriptor.m_OutputIntermediateScale,
1477 descriptor.m_HiddenStateZeroPoint,
1478 descriptor.m_HiddenStateScale
1479 );
1480
Finn Williamsb454c5c2021-02-09 15:56:23 +00001481 // Index for constants vector
1482 std::size_t i = 0;
1483
James Conroy8d333182020-05-13 10:27:58 +01001484 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001485 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1486 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1487 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1488 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1489 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1490 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1491 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1492 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1493 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001494
1495 // CIFG
1496 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1497 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1498 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1499
1500 if (!descriptor.m_CifgEnabled)
1501 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001502 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1503 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1504 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001505 }
1506
1507 // Peephole
1508 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1509 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1510 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1511
1512 if (descriptor.m_PeepholeEnabled)
1513 {
1514 if (!descriptor.m_CifgEnabled)
1515 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001516 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001517 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001518 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1519 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1520 }
James Conroy8d333182020-05-13 10:27:58 +01001521
Finn Williamsb454c5c2021-02-09 15:56:23 +00001522 // Projection
1523 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1524 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1525
1526 if (descriptor.m_ProjectionEnabled)
1527 {
1528 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1529 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001530 }
1531
1532 // Layer norm
1533 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1534 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1535 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1536 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1537
1538 if (descriptor.m_LayerNormEnabled)
1539 {
1540 if (!descriptor.m_CifgEnabled)
1541 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001542 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001543 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001544 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1545 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1546 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001547 }
1548
1549 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1550 m_flatBufferBuilder,
1551 inputToForgetWeights,
1552 inputToCellWeights,
1553 inputToOutputWeights,
1554 recurrentToForgetWeights,
1555 recurrentToCellWeights,
1556 recurrentToOutputWeights,
1557 forgetGateBias,
1558 cellBias,
1559 outputGateBias,
1560 inputToInputWeights,
1561 recurrentToInputWeights,
1562 inputGateBias,
1563 projectionWeights,
1564 projectionBias,
1565 cellToInputWeights,
1566 cellToForgetWeights,
1567 cellToOutputWeights,
1568 inputLayerNormWeights,
1569 forgetLayerNormWeights,
1570 cellLayerNormWeights,
1571 outputLayerNormWeights);
1572
1573 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1574 m_flatBufferBuilder,
1575 fbQLstmBaseLayer,
1576 fbQLstmDescriptor,
1577 fbQLstmParams);
1578
1579 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001580}
1581
Finn Williamsb454c5c2021-02-09 15:56:23 +00001582void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1583 const std::vector<armnn::ConstTensor>& constants,
1584 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001585{
Jan Eilers8eb25602020-03-09 12:13:48 +00001586 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001587
Jan Eilers5b01a892019-07-23 09:47:43 +01001588 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1589
Finn Williamsb454c5c2021-02-09 15:56:23 +00001590 // index for constants vector
1591 size_t i = 0;
1592
Jan Eilers5b01a892019-07-23 09:47:43 +01001593 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001594 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1595 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1596 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1597 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001598
Finn Williamsb454c5c2021-02-09 15:56:23 +00001599 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1600 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1601 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1602 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001603
Finn Williamsb454c5c2021-02-09 15:56:23 +00001604 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1605 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1606 auto cellBias = CreateConstTensorInfo(constants[i++]);
1607 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001608
1609 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1610 m_flatBufferBuilder,
1611 inputToInputWeights,
1612 inputToForgetWeights,
1613 inputToCellWeights,
1614 inputToOutputWeights,
1615 recurrentToInputWeights,
1616 recurrentToForgetWeights,
1617 recurrentToCellWeights,
1618 recurrentToOutputWeights,
1619 inputGateBias,
1620 forgetGateBias,
1621 cellBias,
1622 outputGateBias);
1623
1624 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1625 m_flatBufferBuilder,
1626 fbQuantizedLstmBaseLayer,
1627 fbQuantizedLstmParams);
1628
1629 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001630}
1631
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001632void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1633 const armnn::IConnectableLayer* layer,
1634 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1635 const std::vector<armnn::ConstTensor>& constants,
1636 const char* name)
1637{
1638 IgnoreUnused(name);
1639
1640 auto fbUnidirectionalSequenceLstmBaseLayer =
1641 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1642
1643 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1644 m_flatBufferBuilder,
1645 descriptor.m_ActivationFunc,
1646 descriptor.m_ClippingThresCell,
1647 descriptor.m_ClippingThresProj,
1648 descriptor.m_CifgEnabled,
1649 descriptor.m_PeepholeEnabled,
1650 descriptor.m_ProjectionEnabled,
1651 descriptor.m_LayerNormEnabled,
1652 descriptor.m_TimeMajor);
1653
1654 // Index for constants vector
1655 std::size_t i = 0;
1656
1657 // Get mandatory/basic input parameters
1658 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1659 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1660 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1661 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1662 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1663 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1664 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1665 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1666 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1667
1668 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1669 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1670 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1671 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1672 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1673 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1674 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1675 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1676 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1677 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1678 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1679 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1680 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1681
1682 if (!descriptor.m_CifgEnabled)
1683 {
1684 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1685 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1686 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1687 }
1688
1689 if (descriptor.m_PeepholeEnabled)
1690 {
1691 if (!descriptor.m_CifgEnabled)
1692 {
1693 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1694 }
1695 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1696 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1697 }
1698
1699 if (descriptor.m_ProjectionEnabled)
1700 {
1701 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1702 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1703 }
1704
1705 if (descriptor.m_LayerNormEnabled)
1706 {
1707 if (!descriptor.m_CifgEnabled)
1708 {
1709 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1710 }
1711 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1712 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1713 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1714 }
1715
1716 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1717 m_flatBufferBuilder,
1718 inputToForgetWeights,
1719 inputToCellWeights,
1720 inputToOutputWeights,
1721 recurrentToForgetWeights,
1722 recurrentToCellWeights,
1723 recurrentToOutputWeights,
1724 forgetGateBias,
1725 cellBias,
1726 outputGateBias,
1727 inputToInputWeights,
1728 recurrentToInputWeights,
1729 cellToInputWeights,
1730 inputGateBias,
1731 projectionWeights,
1732 projectionBias,
1733 cellToForgetWeights,
1734 cellToOutputWeights,
1735 inputLayerNormWeights,
1736 forgetLayerNormWeights,
1737 cellLayerNormWeights,
1738 outputLayerNormWeights);
1739
1740 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1741 m_flatBufferBuilder,
1742 fbUnidirectionalSequenceLstmBaseLayer,
1743 fbUnidirectionalSequenceLstmDescriptor,
1744 fbUnidirectionalSequenceLstmParams);
1745
1746 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1747}
1748
Finn Williamsb454c5c2021-02-09 15:56:23 +00001749fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001750 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001751{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001752
Sadik Armagandb059fd2019-03-20 12:28:32 +00001753 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1754
Mike Kelly8c1701a2019-02-11 17:01:27 +00001755 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1756 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1757
1758 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001759 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001760 m_flatBufferBuilder.CreateString(layer->GetName()),
1761 layerType,
1762 m_flatBufferBuilder.CreateVector(inputSlots),
1763 m_flatBufferBuilder.CreateVector(outputSlots));
1764}
1765
Finn Williamsb454c5c2021-02-09 15:56:23 +00001766void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001767{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001768
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001769 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001770 m_serializedLayers.push_back(anyLayer);
1771}
1772
Mike Kellya0766c32019-02-19 17:22:07 +00001773template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001774flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001775{
1776 const T* buffer = reinterpret_cast<const T*>(memory);
1777 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1778 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1779 return fbVector;
1780}
1781
Finn Williamsb454c5c2021-02-09 15:56:23 +00001782flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001783{
Mike Kellya0766c32019-02-19 17:22:07 +00001784 // Get the dimensions
1785 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001786 std::vector<bool> specificity;
1787 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1788 // matches the size of dimensions.
1789 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1790 {
1791 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001792
1793 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1794 {
1795 shape.push_back(tensorInfo.GetShape()[dim]);
1796 }
1797 else
1798 {
1799 shape.push_back(0);
1800 }
Colm Donelan800b2812021-02-12 12:43:35 +00001801 }
1802
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001803 if (tensorInfo.HasPerAxisQuantization())
1804 {
1805 // Create FlatBuffer TensorInfo
1806 auto flatBufferTensorInfo =
1807 serializer::CreateTensorInfo(m_flatBufferBuilder,
1808 m_flatBufferBuilder.CreateVector(shape),
1809 GetFlatBufferDataType(tensorInfo.GetDataType()),
1810 tensorInfo.GetQuantizationScales()[0],
1811 tensorInfo.GetQuantizationOffset(),
1812 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001813 tensorInfo.GetQuantizationDim().value(),
1814 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001815 (tensorInfo.GetShape().GetDimensionality()),
1816 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001817 return flatBufferTensorInfo;
1818 }
1819
Mike Kellya0766c32019-02-19 17:22:07 +00001820 // Create FlatBuffer TensorInfo
1821 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1822 m_flatBufferBuilder.CreateVector(shape),
1823 GetFlatBufferDataType(tensorInfo.GetDataType()),
1824 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001825 tensorInfo.GetQuantizationOffset(),
1826 0,
1827 0,
1828 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001829 (tensorInfo.GetShape().GetDimensionality()),
1830 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001831 return flatBufferTensorInfo;
1832}
1833
1834flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001835 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001836{
1837 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1838
Mike Kellya0766c32019-02-19 17:22:07 +00001839 flatbuffers::Offset<void> fbPayload;
1840
1841 switch (tensorInfo.GetDataType())
1842 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001843 case armnn::DataType::Signed64:
1844 {
1845 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1846 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1847 m_flatBufferBuilder,
1848 fbVector);
1849 fbPayload = flatBuffersData.o;
1850 break;
1851 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001852 case armnn::DataType::Float32:
1853 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001854 {
1855 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1856 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1857 m_flatBufferBuilder,
1858 fbVector);
1859 fbPayload = flatBuffersData.o;
1860 break;
1861 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001862 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001863 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001864 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001865 {
1866 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1867 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1868 m_flatBufferBuilder,
1869 fbVector);
1870 fbPayload = flatBuffersData.o;
1871 break;
1872 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001873 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001874 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001875 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001876 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001877 default:
1878 {
1879 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1880 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1881 m_flatBufferBuilder,
1882 fbVector);
1883 fbPayload = flatBuffersData.o;
1884 }
1885 }
1886 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1887 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001888 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001889 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1890 fbPayload);
1891 return flatBufferConstTensor;
1892}
1893
Finn Williamsb454c5c2021-02-09 15:56:23 +00001894flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001895{
1896 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1897 serializer::CreateFeatureCompatibilityVersions(
1898 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001899 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001900 1, // Weights layout scheme version
1901 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001902 );
1903 return versionsTable;
1904}
1905
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001906std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001907 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001908{
Mike Kellya0766c32019-02-19 17:22:07 +00001909 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001910
1911 // Get the InputSlots
1912 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1913 {
1914 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1915
1916 // Get the Connection for the InputSlot
1917 const IOutputSlot* connection = inputSlot.GetConnection();
1918
1919 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001920 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1921 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001922 // Create FlatBuffer InputSlot
1923 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1924 }
1925 return inputSlots;
1926}
1927
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001928std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001929 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001930{
1931 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1932
1933 // Get the OutputSlots
1934 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1935 {
1936 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001937 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001938
Mike Kelly8c1701a2019-02-11 17:01:27 +00001939 // Create FlatBuffer Outputslot
1940 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1941 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001942 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001943 }
1944 return outputSlots;
1945}
1946
Finn Williamsb454c5c2021-02-09 15:56:23 +00001947void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1948 const BaseDescriptor& descriptor,
1949 const std::vector<armnn::ConstTensor>& constants,
1950 const char* name,
1951 const armnn::LayerBindingId id)
1952{
1953 IgnoreUnused(constants);
1954
1955 switch (layer->GetType())
1956 {
1957 case armnn::LayerType::Activation :
1958 {
1959 const armnn::ActivationDescriptor& layerDescriptor =
1960 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1961 SerializeActivationLayer(layer, layerDescriptor, name);
1962 break;
1963 }
1964 case armnn::LayerType::Addition :
1965 {
1966 SerializeAdditionLayer(layer, name);
1967 break;
1968 }
1969 case armnn::LayerType::ArgMinMax :
1970 {
1971 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1972 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1973 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1974 break;
1975 }
1976 case armnn::LayerType::BatchNormalization :
1977 {
1978 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1979 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1980 SerializeBatchNormalizationLayer(layer,
1981 layerDescriptor,
1982 constants,
1983 name);
1984 break;
1985 }
1986 case armnn::LayerType::BatchToSpaceNd :
1987 {
1988 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
1989 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
1990 SerializeBatchToSpaceNdLayer(layer,
1991 layerDescriptor,
1992 name);
1993 break;
1994 }
mathad01b392e982021-04-07 12:07:30 +01001995 case armnn::LayerType::Cast :
1996 {
1997 SerializeCastLayer(layer, name);
1998 break;
1999 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002000 case armnn::LayerType::Comparison :
2001 {
2002 const armnn::ComparisonDescriptor& layerDescriptor =
2003 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2004 SerializeComparisonLayer(layer,
2005 layerDescriptor,
2006 name);
2007 break;
2008 }
2009 case armnn::LayerType::Concat :
2010 {
2011 const armnn::ConcatDescriptor& layerDescriptor =
2012 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2013 SerializeConcatLayer(layer,
2014 layerDescriptor,
2015 name);
2016 break;
2017 }
2018 case armnn::LayerType::Constant :
2019 {
2020 SerializeConstantLayer(layer,
2021 constants,
2022 name);
2023 break;
2024 }
2025 case armnn::LayerType::Convolution2d :
2026 {
2027 const armnn::Convolution2dDescriptor& layerDescriptor =
2028 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2029 SerializeConvolution2dLayer(layer,
2030 layerDescriptor,
2031 constants,
2032 name);
2033 break;
2034 }
2035 case armnn::LayerType::DepthToSpace :
2036 {
2037 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2038 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2039 SerializeDepthToSpaceLayer(layer,
2040 layerDescriptor,
2041 name);
2042 break;
2043 }
2044 case armnn::LayerType::DepthwiseConvolution2d :
2045 {
2046 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2047 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2048 SerializeDepthwiseConvolution2dLayer(layer,
2049 layerDescriptor,
2050 constants,
2051 name);
2052 break;
2053 }
2054 case armnn::LayerType::Dequantize :
2055 {
2056 SerializeDequantizeLayer(layer,
2057 name);
2058 break;
2059 }
2060 case armnn::LayerType::DetectionPostProcess :
2061 {
2062 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2063 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2064 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2065 break;
2066 }
2067 case armnn::LayerType::Division :
2068 {
2069 SerializeDivisionLayer(layer, name);
2070 break;
2071 }
2072 case armnn::LayerType::ElementwiseUnary :
2073 {
2074 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2075 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2076 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2077 break;
2078 }
2079 case armnn::LayerType::Fill :
2080 {
2081 const armnn::FillDescriptor& layerDescriptor =
2082 static_cast<const armnn::FillDescriptor&>(descriptor);
2083 SerializeFillLayer(layer, layerDescriptor, name);
2084 break;
2085 }
2086 case armnn::LayerType::Floor :
2087 {
2088 SerializeFloorLayer(layer, name);
2089 break;
2090 }
2091 case armnn::LayerType::FullyConnected :
2092 {
2093 const armnn::FullyConnectedDescriptor& layerDescriptor =
2094 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002095 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002096 break;
2097 }
2098 case armnn::LayerType::Gather :
2099 {
2100 const armnn::GatherDescriptor& layerDescriptor =
2101 static_cast<const armnn::GatherDescriptor&>(descriptor);
2102 SerializeGatherLayer(layer, layerDescriptor, name);
2103 break;
2104 }
2105 case armnn::LayerType::Input:
2106 {
2107 SerializeInputLayer(layer, id, name);
2108 break;
2109 }
2110 case armnn::LayerType::InstanceNormalization :
2111 {
2112 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2113 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2114 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2115 break;
2116 }
2117 case armnn::LayerType::L2Normalization :
2118 {
2119 const armnn::L2NormalizationDescriptor& layerDescriptor =
2120 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2121 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2122 break;
2123 }
2124 case armnn::LayerType::LogicalBinary :
2125 {
2126 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2127 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2128 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2129 break;
2130 }
2131 case armnn::LayerType::LogSoftmax :
2132 {
2133 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2134 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2135 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2136 break;
2137 }
2138 case armnn::LayerType::Lstm :
2139 {
2140 const armnn::LstmDescriptor& layerDescriptor =
2141 static_cast<const armnn::LstmDescriptor&>(descriptor);
2142 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2143 break;
2144 }
2145 case armnn::LayerType::QLstm :
2146 {
2147 const armnn::QLstmDescriptor& layerDescriptor =
2148 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2149 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2150 break;
2151 }
2152 case armnn::LayerType::Maximum :
2153 {
2154 SerializeMaximumLayer(layer, name);
2155 break;
2156 }
2157 case armnn::LayerType::Mean :
2158 {
2159 const armnn::MeanDescriptor& layerDescriptor =
2160 static_cast<const armnn::MeanDescriptor&>(descriptor);
2161 SerializeMeanLayer(layer, layerDescriptor, name);
2162 break;
2163 }
2164 case armnn::LayerType::Merge :
2165 {
2166 SerializeMergeLayer(layer, name);
2167 break;
2168 }
2169 case armnn::LayerType::Minimum :
2170 {
2171 SerializeMinimumLayer(layer, name);
2172 break;
2173 }
2174 case armnn::LayerType::Multiplication :
2175 {
2176 SerializeMultiplicationLayer(layer, name);
2177 break;
2178 }
2179 case armnn::LayerType::Normalization :
2180 {
2181 const armnn::NormalizationDescriptor& layerDescriptor =
2182 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2183 SerializeNormalizationLayer(layer, layerDescriptor, name);
2184 break;
2185 }
2186 case armnn::LayerType::Output:
2187 {
2188 SerializeOutputLayer(layer, id, name);
2189 break;
2190 }
2191 case armnn::LayerType::Pad :
2192 {
2193 const armnn::PadDescriptor& layerDescriptor =
2194 static_cast<const armnn::PadDescriptor&>(descriptor);
2195 SerializePadLayer(layer, layerDescriptor, name);
2196 break;
2197 }
2198 case armnn::LayerType::Permute :
2199 {
2200 const armnn::PermuteDescriptor& layerDescriptor =
2201 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2202 SerializePermuteLayer(layer, layerDescriptor, name);
2203 break;
2204 }
2205 case armnn::LayerType::Pooling2d :
2206 {
2207 const armnn::Pooling2dDescriptor& layerDescriptor =
2208 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2209 SerializePooling2dLayer(layer, layerDescriptor, name);
2210 break;
2211 }
2212 case armnn::LayerType::Prelu :
2213 {
2214 SerializePreluLayer(layer, name);
2215 break;
2216 }
2217 case armnn::LayerType::Quantize :
2218 {
2219 SerializeQuantizeLayer(layer, name);
2220 break;
2221 }
2222 case armnn::LayerType::QuantizedLstm:
2223 SerializeQuantizedLstmLayer(layer, constants, name);
2224 break;
2225 case armnn::LayerType::Reshape:
2226 {
2227 const armnn::ReshapeDescriptor &layerDescriptor =
2228 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2229 SerializeReshapeLayer(layer, layerDescriptor, name);
2230 break;
2231 }
2232 case armnn::LayerType::Rank:
2233 {
2234 SerializeRankLayer(layer, name);
2235 break;
2236 }
2237 case armnn::LayerType::Reduce:
2238 {
2239 const armnn::ReduceDescriptor& layerDescriptor =
2240 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2241 SerializeReduceLayer(layer, layerDescriptor, name);
2242 break;
2243 }
2244 case armnn::LayerType::Resize:
2245 {
2246 const armnn::ResizeDescriptor& layerDescriptor =
2247 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2248 SerializeResizeLayer(layer, layerDescriptor, name);
2249 break;
2250 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002251 case armnn::LayerType::Shape:
2252 {
2253 SerializeShapeLayer(layer, name);
2254 break;
2255 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002256 case armnn::LayerType::Slice:
2257 {
2258 const armnn::SliceDescriptor& layerDescriptor =
2259 static_cast<const armnn::SliceDescriptor&>(descriptor);
2260 SerializeSliceLayer(layer, layerDescriptor, name);
2261 break;
2262 }
2263 case armnn::LayerType::Softmax:
2264 {
2265 const armnn::SoftmaxDescriptor& layerDescriptor =
2266 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2267 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2268 break;
2269 }
2270 case armnn::LayerType::SpaceToBatchNd:
2271 {
2272 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2273 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2274 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2275 break;
2276 }
2277 case armnn::LayerType::SpaceToDepth:
2278 {
2279 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2280 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2281 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2282 break;
2283 }
2284 case armnn::LayerType::Splitter:
2285 {
2286 const armnn::SplitterDescriptor& layerDescriptor =
2287 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2288 SerializeSplitterLayer(layer, layerDescriptor, name);
2289 break;
2290 }
2291 case armnn::LayerType::Stack:
2292 {
2293 const armnn::StackDescriptor& layerDescriptor =
2294 static_cast<const armnn::StackDescriptor&>(descriptor);
2295 SerializeStackLayer(layer, layerDescriptor, name);
2296 break;
2297 }
2298 case armnn::LayerType::StandIn:
2299 {
2300 const armnn::StandInDescriptor& layerDescriptor =
2301 static_cast<const armnn::StandInDescriptor&>(descriptor);
2302 SerializeStandInLayer(layer, layerDescriptor, name);
2303 break;
2304 }
2305 case armnn::LayerType::StridedSlice:
2306 {
2307 const armnn::StridedSliceDescriptor& layerDescriptor =
2308 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2309 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2310 break;
2311 }
2312 case armnn::LayerType::Subtraction:
2313 {
2314 SerializeSubtractionLayer(layer, name);
2315 break;
2316 }
2317 case armnn::LayerType::Switch:
2318 {
2319 SerializeSwitchLayer(layer, name);
2320 break;
2321 }
2322 case armnn::LayerType::Transpose:
2323 {
2324 const armnn::TransposeDescriptor& layerDescriptor =
2325 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2326 SerializeTransposeLayer(layer, layerDescriptor, name);
2327 break;
2328 }
2329 case armnn::LayerType::TransposeConvolution2d:
2330 {
2331 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2332 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2333 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2334 break;
2335 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002336 case armnn::LayerType::UnidirectionalSequenceLstm :
2337 {
2338 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2339 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2340 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2341 break;
2342 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002343 default:
2344 {
2345 throw InvalidArgumentException(
2346 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2347 layer->GetName(),
2348 id));
2349 }
2350 }
2351}
2352
Finn Williams85d36712021-01-26 22:30:06 +00002353void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002354{
2355 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002356 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2357 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002358
2359 // Create FlatBuffer SerializedGraph
2360 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002361 fbBuilder,
2362 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2363 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2364 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2365 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002366
2367 // Serialize the graph
2368 fbBuilder.Finish(serializedGraph);
2369}
2370
Finn Williamsb454c5c2021-02-09 15:56:23 +00002371
Finn Williams85d36712021-01-26 22:30:06 +00002372bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002373{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002374 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002375
Matthew Sloyan0663d662020-09-14 11:47:26 +01002376 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002377 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002378 return !stream.bad();
2379}
2380
Finn Williams2605b232020-06-10 15:53:46 +01002381} // namespace armnnSerializer