blob: 3b9dfb0ae833e38494dd5c2e29fe3369274d179e [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
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000098uint32_t SerializerStrategy::GetSerializedId(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
Mike Kellyaf484012019-02-20 16:53:11 +0000158// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000159void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
160 const armnn::ActivationDescriptor& descriptor,
161 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000162{
Jan Eilers8eb25602020-03-09 12:13:48 +0000163 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000164
Mike Kellyaf484012019-02-20 16:53:11 +0000165 // Create FlatBuffer BaseLayer
166 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
167
168 // Create the FlatBuffer ActivationDescriptor
169 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
170 GetFlatBufferActivationFunction(descriptor.m_Function),
171 descriptor.m_A,
172 descriptor.m_B);
173
174 // Create the FlatBuffer ActivationLayer
175 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
176 flatBufferBaseLayer,
177 flatBufferDescriptor);
178
179 // Add the AnyLayer to the FlatBufferLayers
180 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
181}
182
Mike Kelly8c1701a2019-02-11 17:01:27 +0000183// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000184void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000185{
Jan Eilers8eb25602020-03-09 12:13:48 +0000186 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000187
Mike Kelly8c1701a2019-02-11 17:01:27 +0000188 // Create FlatBuffer BaseLayer
189 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
190
191 // Create the FlatBuffer AdditionLayer
192 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
193
194 // Add the AnyLayer to the FlatBufferLayers
195 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
196}
197
Nikhil Rajee391d52019-09-05 17:50:44 +0100198// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000199void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
200 const armnn::ArgMinMaxDescriptor& descriptor,
201 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100202{
Jan Eilers8eb25602020-03-09 12:13:48 +0000203 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000204
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100205 // Create FlatBuffer BaseLayer
206 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
207
208 // Create FlatBuffer Descriptor
209 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
210 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
211 descriptor.m_Axis);
212
213 // Create FlatBuffer ArgMinMaxLayer
214 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
215 flatBufferBaseLayer,
216 flatBufferDescriptor);
217
218 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100219}
220
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000221// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000222void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
223 const armnn::BatchToSpaceNdDescriptor& descriptor,
224 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000225{
Jan Eilers8eb25602020-03-09 12:13:48 +0000226 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000227
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000228 // Create FlatBuffer BaseLayer
229 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
230
231 std::vector<unsigned int> crops;
232 crops.reserve(descriptor.m_Crops.size() * 2);
233 for (auto& crop : descriptor.m_Crops)
234 {
235 crops.push_back(crop.first);
236 crops.push_back(crop.second);
237 }
238
239 auto flatBufferDescriptor =
240 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
241 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
242 m_flatBufferBuilder.CreateVector(crops),
243 GetFlatBufferDataLayout(descriptor.m_DataLayout));
244
245 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
246 flatBufferBaseLayer,
247 flatBufferDescriptor);
248
249 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
250}
251
Finn Williamsb454c5c2021-02-09 15:56:23 +0000252void SerializerStrategy::SerializeBatchNormalizationLayer(
253 const armnn::IConnectableLayer* layer,
254 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
255 const std::vector<armnn::ConstTensor>& constants,
256 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000257{
Jan Eilers8eb25602020-03-09 12:13:48 +0000258 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000259
Finn Williamsb454c5c2021-02-09 15:56:23 +0000260 const armnn::ConstTensor& mean = constants[0];
261 const armnn::ConstTensor& variance = constants[1];
262 const armnn::ConstTensor& beta = constants[2];
263 const armnn::ConstTensor& gamma = constants[3];
264
ruoyan018e7fa232019-02-28 15:09:07 +0000265 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
266 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
267 m_flatBufferBuilder,
268 batchNormDescriptor.m_Eps,
269 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
270
271 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
272 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
273 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
274 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
275 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
276 fbBatchNormalizationBaseLayer,
277 fbBatchNormalizationDescriptor,
278 fbMeanConstTensorInfo,
279 fbVarianceConstTensorInfo,
280 fbBetaConstTensorInfo,
281 fbGammaConstTensorInfo);
282
283 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
284}
285
mathad01b392e982021-04-07 12:07:30 +0100286void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
287 const char* name)
288{
289 IgnoreUnused(name);
290
291 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
292 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
293 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
294}
295
Simon Obute51f67772021-09-03 15:50:13 +0100296void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
297 const armnn::ChannelShuffleDescriptor& descriptor,
298 const char* name)
299{
300 IgnoreUnused(name);
301 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
302 descriptor.m_Axis,
303 descriptor.m_NumGroups);
304 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
305 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
306 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
307}
308
Finn Williamsb454c5c2021-02-09 15:56:23 +0000309void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100310 const armnn::ComparisonDescriptor& descriptor,
311 const char* name)
312{
Jan Eilers8eb25602020-03-09 12:13:48 +0000313 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000314
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100315 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
316 auto fbDescriptor = serializer::CreateComparisonDescriptor(
317 m_flatBufferBuilder,
318 GetFlatBufferComparisonOperation(descriptor.m_Operation));
319
320 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
321 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100322}
323
Conor Kennedy76277882019-02-26 08:29:54 +0000324// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000325void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
326 const std::vector<armnn::ConstTensor>& constants,
327 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000328{
Jan Eilers8eb25602020-03-09 12:13:48 +0000329 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000330
Finn Williamsb454c5c2021-02-09 15:56:23 +0000331 armnn::ConstTensor input = constants[0];
332
Conor Kennedy76277882019-02-26 08:29:54 +0000333 // Create FlatBuffer BaseLayer
334 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
335
336 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
337
338 // Create the FlatBuffer ConstantLayer
339 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
340 flatBufferConstantBaseLayer,
341 flatBufferConstTensorInfo);
342
343 // Add the AnyLayer to the FlatBufferLayers
344 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
345}
346
Mike Kellya0766c32019-02-19 17:22:07 +0000347// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000348void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
349 const armnn::Convolution2dDescriptor& descriptor,
350 const std::vector<armnn::ConstTensor>& constants,
351 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000352{
Jan Eilers8eb25602020-03-09 12:13:48 +0000353 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000354
Finn Williamsb454c5c2021-02-09 15:56:23 +0000355 const armnn::ConstTensor weights = constants[0];
356
Mike Kellya0766c32019-02-19 17:22:07 +0000357 // Create FlatBuffer BaseLayer
358 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
359
360 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
361 descriptor.m_PadLeft,
362 descriptor.m_PadRight,
363 descriptor.m_PadTop,
364 descriptor.m_PadBottom,
365 descriptor.m_StrideX,
366 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100367 descriptor.m_DilationX,
368 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000369 descriptor.m_BiasEnabled,
370 GetFlatBufferDataLayout(descriptor.m_DataLayout));
371 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
372 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
373
Finn Williamsb454c5c2021-02-09 15:56:23 +0000374 if (constants.size() > 1)
Mike Kellya0766c32019-02-19 17:22:07 +0000375 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000376 const armnn::ConstTensor biases = constants[1];
377 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Mike Kellya0766c32019-02-19 17:22:07 +0000378 }
379
380 // Create the FlatBuffer Convolution2dLayer
381 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
382 flatBufferBaseLayer,
383 flatBufferDescriptor,
384 flatBufferWeightsConstTensorInfo,
385 flatBufferBiasesConstTensorInfo);
386
387 // Add the AnyLayer to the FlatBufferLayers
388 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
389}
390
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100391// Build FlatBuffer for Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100392void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
393 const armnn::Convolution3dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100394 const char* name)
395{
396 IgnoreUnused(name);
397
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100398 // Create FlatBuffer BaseLayer
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100399 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100400
401 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
402 descriptor.m_PadLeft,
403 descriptor.m_PadRight,
404 descriptor.m_PadTop,
405 descriptor.m_PadBottom,
406 descriptor.m_PadFront,
407 descriptor.m_PadBack,
408 descriptor.m_StrideX,
409 descriptor.m_StrideY,
410 descriptor.m_StrideZ,
411 descriptor.m_DilationX,
412 descriptor.m_DilationY,
413 descriptor.m_DilationZ,
414 descriptor.m_BiasEnabled,
415 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100416
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100417 // Create the FlatBuffer Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100418 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
419 flatBufferBaseLayer,
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100420 flatBufferDescriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100421
422 // Add the AnyLayer to the FlatBufferLayers
423 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
424}
425
Finn Williamsb454c5c2021-02-09 15:56:23 +0000426void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100427 const armnn::DepthToSpaceDescriptor& descriptor,
428 const char* name)
429{
Jan Eilers8eb25602020-03-09 12:13:48 +0000430 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000431
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100432 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
433 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
434 descriptor.m_BlockSize,
435 GetFlatBufferDataLayout(descriptor.m_DataLayout));
436
437 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
438
439 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100440}
441
Finn Williamsb454c5c2021-02-09 15:56:23 +0000442void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
443 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
444 const std::vector<armnn::ConstTensor>& constants,
445 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000446{
Jan Eilers8eb25602020-03-09 12:13:48 +0000447 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000448
Finn Williamsb454c5c2021-02-09 15:56:23 +0000449 const armnn::ConstTensor& weights = constants[0];
450
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000451 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
452 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
453 descriptor.m_PadLeft,
454 descriptor.m_PadRight,
455 descriptor.m_PadTop,
456 descriptor.m_PadBottom,
457 descriptor.m_StrideX,
458 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100459 descriptor.m_DilationX,
460 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000461 descriptor.m_BiasEnabled,
462 GetFlatBufferDataLayout(descriptor.m_DataLayout));
463
464 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
465 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000466
467 if (constants.size() > 1)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000468 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000469 const armnn::ConstTensor& biases = constants[1];
470 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000471 }
472
473 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
474 fbBaseLayer,
475 fbDescriptor,
476 fbWeightsConstTensorInfo,
477 fbBiasesConstTensorInfo);
478
479 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
480}
481
Finn Williamsb454c5c2021-02-09 15:56:23 +0000482void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000483 const char* name)
484{
Jan Eilers8eb25602020-03-09 12:13:48 +0000485 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000486
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000487 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
488 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
489
490 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
491}
492
Finn Williamsb454c5c2021-02-09 15:56:23 +0000493void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
494 const armnn::DetectionPostProcessDescriptor& descriptor,
495 const std::vector<armnn::ConstTensor>& constants,
496 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000497{
Jan Eilers8eb25602020-03-09 12:13:48 +0000498 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000499
Finn Williamsb454c5c2021-02-09 15:56:23 +0000500 const armnn::ConstTensor& anchors = constants[0];
501
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000502 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
503 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
504 descriptor.m_MaxDetections,
505 descriptor.m_MaxClassesPerDetection,
506 descriptor.m_DetectionsPerClass,
507 descriptor.m_NmsScoreThreshold,
508 descriptor.m_NmsIouThreshold,
509 descriptor.m_NumClasses,
510 descriptor.m_UseRegularNms,
511 descriptor.m_ScaleX,
512 descriptor.m_ScaleY,
513 descriptor.m_ScaleW,
514 descriptor.m_ScaleH);
515
516 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
517
518 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
519 fbBaseLayer,
520 fbDescriptor,
521 fbAnchorsConstTensorInfo);
522
523 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
524}
525
Finn Williamsb454c5c2021-02-09 15:56:23 +0000526void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000527{
Jan Eilers8eb25602020-03-09 12:13:48 +0000528 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000529
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000530 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
531 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000532
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000533 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
534}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000535
Finn Williamsb454c5c2021-02-09 15:56:23 +0000536void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600537 const armnn::ElementwiseUnaryDescriptor& descriptor,
538 const char* name)
539{
Jan Eilers8eb25602020-03-09 12:13:48 +0000540 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600541
542 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
543 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
544 m_flatBufferBuilder,
545 GetFlatBufferUnaryOperation(descriptor.m_Operation));
546
547 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
548 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
549}
550
Finn Williamsb454c5c2021-02-09 15:56:23 +0000551void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100552 const armnn::FillDescriptor& fillDescriptor,
553 const char* name)
554{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100555 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100556
557 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
558
559 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
560
561 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
562
563 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100564}
565
Finn Williamsb454c5c2021-02-09 15:56:23 +0000566void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000567{
Jan Eilers8eb25602020-03-09 12:13:48 +0000568 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000569
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000570 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
571 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
572
573 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
574}
575
Finn Williamsb454c5c2021-02-09 15:56:23 +0000576void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100577 const armnn::GatherDescriptor& gatherDescriptor,
578 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000579{
Jan Eilers8eb25602020-03-09 12:13:48 +0000580 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000581
Teresa Charlin52664732020-06-29 16:27:03 +0100582 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
583 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000584 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100585 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000586
587 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
588}
589
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100590void SerializerStrategy::SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
591 const char* name)
592{
593 IgnoreUnused(name);
594
595 auto fbGatherNdBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_GatherNd);
596 auto flatBufferLayer = serializer::CreateGatherNdLayer(m_flatBufferBuilder, fbGatherNdBaseLayer);
597
598 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherNdLayer);
599}
600
Finn Williamsb454c5c2021-02-09 15:56:23 +0000601void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100602 const armnn::IConnectableLayer* layer,
603 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
604 const char* name)
605{
Jan Eilers8eb25602020-03-09 12:13:48 +0000606 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000607
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100608 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
609 m_flatBufferBuilder,
610 instanceNormalizationDescriptor.m_Gamma,
611 instanceNormalizationDescriptor.m_Beta,
612 instanceNormalizationDescriptor.m_Eps,
613 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
614
615 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
616 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
617
618 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100619}
620
Finn Williamsb454c5c2021-02-09 15:56:23 +0000621void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000622 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
623 const char* name)
624{
Jan Eilers8eb25602020-03-09 12:13:48 +0000625 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000626
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000627 // Create FlatBuffer BaseLayer
628 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
629
630 // Create the FlatBuffer L2Normalization Descriptor
631 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100632 m_flatBufferBuilder,
633 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
634 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000635
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100636 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000637 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
638
639 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
640}
641
Finn Williamsb454c5c2021-02-09 15:56:23 +0000642void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000643 const armnn::LogicalBinaryDescriptor& descriptor,
644 const char* name)
645{
646 IgnoreUnused(name);
647
648 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
649 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
650 m_flatBufferBuilder,
651 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
652
653 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
654 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
655}
656
Finn Williamsb454c5c2021-02-09 15:56:23 +0000657void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100658 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
659 const char* name)
660{
Jan Eilers8eb25602020-03-09 12:13:48 +0000661 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000662
Sadik Armagan26257852019-10-14 13:00:47 +0100663 // Create FlatBuffer BaseLayer
664 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
665
666 // Create the FlatBuffer LogSoftmaxDescriptor
667 auto flatBufferLogSoftmaxDesc =
668 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
669 logSoftmaxDescriptor.m_Beta,
670 logSoftmaxDescriptor.m_Axis);
671
672 // Create the FlatBuffer LogSoftmaxLayer
673 auto flatBufferLogSoftmaxLayer =
674 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
675 flatBufferLogSoftmaxBaseLayer,
676 flatBufferLogSoftmaxDesc);
677
678 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100679}
680
Finn Williamsb454c5c2021-02-09 15:56:23 +0000681void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
682 const armnn::LstmDescriptor& descriptor,
683 const std::vector<armnn::ConstTensor>& constants,
684 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000685{
Jan Eilers8eb25602020-03-09 12:13:48 +0000686 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000687
Jim Flynn11af3752019-03-19 17:22:29 +0000688 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
689
690 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
691 m_flatBufferBuilder,
692 descriptor.m_ActivationFunc,
693 descriptor.m_ClippingThresCell,
694 descriptor.m_ClippingThresProj,
695 descriptor.m_CifgEnabled,
696 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100697 descriptor.m_ProjectionEnabled,
698 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000699
Finn Williamsb454c5c2021-02-09 15:56:23 +0000700 // Index for constants vector
701 std::size_t i = 0;
702
703 // Get mandatory/basic input parameters
704 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
705 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
706 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
707 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
708 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
709 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
710 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
711 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
712 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
713
714
Jim Flynn11af3752019-03-19 17:22:29 +0000715
716 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
717 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
718 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
719 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
720 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
721 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
722 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
723 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
724 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100725 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
726 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
727 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
728 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000729
730 if (!descriptor.m_CifgEnabled)
731 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000732 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
733 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
734 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000735 }
736
737 if (descriptor.m_PeepholeEnabled)
738 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000739 if (!descriptor.m_CifgEnabled)
740 {
741 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
742 }
743 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
744 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
745 }
746
747 if (descriptor.m_ProjectionEnabled)
748 {
749 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
750 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000751 }
752
Jan Eilersf8c62972019-07-17 11:07:49 +0100753 if (descriptor.m_LayerNormEnabled)
754 {
755 if (!descriptor.m_CifgEnabled)
756 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000757 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100758 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000759 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
760 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
761 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100762 }
763
Jim Flynn11af3752019-03-19 17:22:29 +0000764 auto fbLstmParams = serializer::CreateLstmInputParams(
765 m_flatBufferBuilder,
766 inputToForgetWeights,
767 inputToCellWeights,
768 inputToOutputWeights,
769 recurrentToForgetWeights,
770 recurrentToCellWeights,
771 recurrentToOutputWeights,
772 forgetGateBias,
773 cellBias,
774 outputGateBias,
775 inputToInputWeights,
776 recurrentToInputWeights,
777 cellToInputWeights,
778 inputGateBias,
779 projectionWeights,
780 projectionBias,
781 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100782 cellToOutputWeights,
783 inputLayerNormWeights,
784 forgetLayerNormWeights,
785 cellLayerNormWeights,
786 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000787
788 auto fbLstmLayer = serializer::CreateLstmLayer(
789 m_flatBufferBuilder,
790 fbLstmBaseLayer,
791 fbLstmDescriptor,
792 fbLstmParams);
793
794 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
795}
796
Finn Williamsb454c5c2021-02-09 15:56:23 +0000797void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000798{
Jan Eilers8eb25602020-03-09 12:13:48 +0000799 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000800
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000801 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
802 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
803
804 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
805}
806
Finn Williamsb454c5c2021-02-09 15:56:23 +0000807void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000808 const armnn::MeanDescriptor& descriptor,
809 const char* name)
810{
Jan Eilers8eb25602020-03-09 12:13:48 +0000811 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000812
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000813 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
814 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
815 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
816 descriptor.m_KeepDims);
817
818 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
819 fbMeanBaseLayer,
820 fbMeanDescriptor);
821
822 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
823}
824
Finn Williamsb454c5c2021-02-09 15:56:23 +0000825void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000826{
Jan Eilers8eb25602020-03-09 12:13:48 +0000827 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000828
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000829 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
830 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
831
832 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
833}
834
Finn Williamsb454c5c2021-02-09 15:56:23 +0000835void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100836{
Jan Eilers8eb25602020-03-09 12:13:48 +0000837 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000838
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100839 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
840 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
841
842 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
843}
844
Finn Williamsb454c5c2021-02-09 15:56:23 +0000845void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100846 const armnn::ConcatDescriptor& concatDescriptor,
847 const char* name)
848{
Jan Eilers8eb25602020-03-09 12:13:48 +0000849 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000850
Jim Flynne242f2d2019-05-22 14:24:13 +0100851 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000852
853 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100854 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000855 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100856 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000857 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100858 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000859 {
860 origins.push_back(origin[d]);
861 }
862 auto view = m_flatBufferBuilder.CreateVector(origins);
863 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
864 views.push_back(uintVector);
865 }
866
Jim Flynne242f2d2019-05-22 14:24:13 +0100867 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
868 concatDescriptor.GetConcatAxis(),
869 concatDescriptor.GetNumViews(),
870 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000871 m_flatBufferBuilder.CreateVector(views));
872
Jim Flynne242f2d2019-05-22 14:24:13 +0100873 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
874 flatBufferConcatBaseLayer,
875 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000876
Jim Flynne242f2d2019-05-22 14:24:13 +0100877 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000878}
879
Finn Williamsb454c5c2021-02-09 15:56:23 +0000880void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000881{
Jan Eilers8eb25602020-03-09 12:13:48 +0000882 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000883
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000884 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
885 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
886 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000887
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000888 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000889}
890
Finn Williamsb454c5c2021-02-09 15:56:23 +0000891void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000892 const armnn::PadDescriptor& padDescriptor,
893 const char* name)
894{
Jan Eilers8eb25602020-03-09 12:13:48 +0000895 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000896
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000897 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
898
899 std::vector<unsigned int> padList;
900 for (auto& p: padDescriptor.m_PadList)
901 {
902 padList.push_back(p.first);
903 padList.push_back(p.second);
904 }
905
906 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100907 m_flatBufferBuilder.CreateVector(padList),
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +0100908 padDescriptor.m_PadValue,
909 GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000910
911 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
912 flatBufferBaseLayer,
913 flatBufferPadDesc);
914
915 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
916}
917
Finn Williamsb454c5c2021-02-09 15:56:23 +0000918void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000919 const armnn::PermuteDescriptor& permuteDescriptor,
920 const char* name)
921{
Jan Eilers8eb25602020-03-09 12:13:48 +0000922 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000923
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000924 // Create FlatBuffer BaseLayer
925 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
926
927 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100928 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000929 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100930 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000931 }
932
933 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
934 m_flatBufferBuilder.CreateVector(dimMappings));
935
936 // Create the FlatBuffer PermuteLayer
937 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
938 flatBufferPermuteBaseLayer,
939 flatBufferPermuteDesc);
940
941 // Add the AnyLayer to the FlatBufferLayers
942 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
943}
944
Finn Williams2605b232020-06-10 15:53:46 +0100945// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000946void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100947 const char* name)
948{
949 IgnoreUnused(name);
950 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
951 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
952
953 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
954}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000955
Finn Williamsb454c5c2021-02-09 15:56:23 +0000956void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
957 const armnn::ReduceDescriptor& reduceDescriptor,
958 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000959{
960 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
961 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000962 reduceDescriptor.m_KeepDims,
963 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
964 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
965 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
966 fbReduceBaseLayer,
967 fbDescriptor);
968
969 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
970}
971
Saoirse Stewart263829c2019-02-19 15:54:14 +0000972// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000973void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000974 const armnn::ReshapeDescriptor& reshapeDescriptor,
975 const char* name)
976{
Jan Eilers8eb25602020-03-09 12:13:48 +0000977 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000978
Saoirse Stewart263829c2019-02-19 15:54:14 +0000979 // Create FlatBuffer BaseLayer
980 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
981
982 std::vector<unsigned int> targetShape;
983 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
984 {
985 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
986 }
987
988 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
989 m_flatBufferBuilder.CreateVector(targetShape));
990
991 // Create the FlatBuffer ReshapeLayer
992 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
993 flatBufferReshapeDesc);
994
995 // Add the AnyLayer to the FlatBufferLayers
996 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
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::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001024 const armnn::SliceDescriptor& sliceDescriptor,
1025 const char* name)
1026{
Jan Eilers8eb25602020-03-09 12:13:48 +00001027 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001028
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001029 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1030 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1031 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1032 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1033
1034 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1035
1036 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001037}
1038
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001039// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001040void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001041 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001042 const char* name)
1043{
Jan Eilers8eb25602020-03-09 12:13:48 +00001044 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001045
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001046 // Create FlatBuffer BaseLayer
1047 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1048
1049 // Create the FlatBuffer SoftmaxDescriptor
1050 auto flatBufferSoftmaxDesc =
Sadik Armaganfd0cae32021-11-08 17:18:31 +00001051 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder,
1052 softmaxDescriptor.m_Beta,
1053 softmaxDescriptor.m_Axis);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001054
1055 // Create the FlatBuffer SoftmaxLayer
1056 auto flatBufferSoftmaxLayer =
1057 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1058 flatBufferSoftmaxBaseLayer,
1059 flatBufferSoftmaxDesc);
1060
1061 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1062}
1063
Finn Williamsb454c5c2021-02-09 15:56:23 +00001064void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001065 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001066 const char* name)
1067{
Jan Eilers8eb25602020-03-09 12:13:48 +00001068 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001069
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001070 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1071 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1072 m_flatBufferBuilder,
1073 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1074 pooling2dDescriptor.m_PadLeft,
1075 pooling2dDescriptor.m_PadRight,
1076 pooling2dDescriptor.m_PadTop,
1077 pooling2dDescriptor.m_PadBottom,
1078 pooling2dDescriptor.m_PoolWidth,
1079 pooling2dDescriptor.m_PoolHeight,
1080 pooling2dDescriptor.m_StrideX,
1081 pooling2dDescriptor.m_StrideY,
1082 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1083 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1084 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1085
1086 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1087 fbPooling2dBaseLayer,
1088 fbPooling2dDescriptor);
1089
1090 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1091}
1092
Tamas Nyirid998a1c2021-11-05 14:55:33 +00001093void SerializerStrategy::SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
1094 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
1095 const char* name)
1096{
1097 IgnoreUnused(name);
1098
1099 auto fbPooling3dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling3d);
1100 auto fbPooling3dDescriptor = serializer::CreatePooling3dDescriptor(
1101 m_flatBufferBuilder,
1102 GetFlatBufferPoolingAlgorithm(pooling3dDescriptor.m_PoolType),
1103 pooling3dDescriptor.m_PadLeft,
1104 pooling3dDescriptor.m_PadRight,
1105 pooling3dDescriptor.m_PadTop,
1106 pooling3dDescriptor.m_PadBottom,
1107 pooling3dDescriptor.m_PadFront,
1108 pooling3dDescriptor.m_PadBack,
1109 pooling3dDescriptor.m_PoolWidth,
1110 pooling3dDescriptor.m_PoolHeight,
1111 pooling3dDescriptor.m_PoolDepth,
1112 pooling3dDescriptor.m_StrideX,
1113 pooling3dDescriptor.m_StrideY,
1114 pooling3dDescriptor.m_StrideZ,
1115 GetFlatBufferOutputShapeRounding(pooling3dDescriptor.m_OutputShapeRounding),
1116 GetFlatBufferPaddingMethod(pooling3dDescriptor.m_PaddingMethod),
1117 GetFlatBufferDataLayout(pooling3dDescriptor.m_DataLayout));
1118
1119 auto fbPooling3dLayer = serializer::CreatePooling3dLayer(m_flatBufferBuilder,
1120 fbPooling3dBaseLayer,
1121 fbPooling3dDescriptor);
1122
1123 CreateAnyLayer(fbPooling3dLayer.o, serializer::Layer::Layer_Pooling3dLayer);
1124}
1125
Finn Williamsb454c5c2021-02-09 15:56:23 +00001126void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001127 const char* name)
1128{
Jan Eilers8eb25602020-03-09 12:13:48 +00001129 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001130
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001131 // Create FlatBuffer BaseLayer
1132 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1133
1134 // Create the FlatBuffer AdditionLayer
1135 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1136
1137 // Add the AnyLayer to the FlatBufferLayers
1138 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001139}
1140
Finn Williamsb454c5c2021-02-09 15:56:23 +00001141void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001142{
Jan Eilers8eb25602020-03-09 12:13:48 +00001143 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001144
Derek Lamberti87acb272019-03-27 16:51:31 +00001145 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1146 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1147 fbQuantizeBaseLayer);
1148 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1149}
1150
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001151// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001152void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1153 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001154 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001155{
1156 // Create FlatBuffer BaseLayer
1157 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1158
1159 // Create FlatBuffer FullyConnectedDescriptor
1160 auto flatBufferDescriptor =
1161 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1162 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001163 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1164 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001165
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001166 // Create FlatBuffer FullyConnectedLayer
1167 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1168 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001169 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001170
1171 // Add created FullyConnectedLayer to the FlatBufferLayers
1172 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1173}
1174
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001175// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001176void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001177 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1178 const char* name)
1179{
Jan Eilers8eb25602020-03-09 12:13:48 +00001180 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001181
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001182 // Create FlatBuffer BaseLayer
1183 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1184
1185 std::vector<unsigned int> padList;
1186 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1187 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1188 {
1189 padList.push_back(pad.first);
1190 padList.push_back(pad.second);
1191 }
1192
1193 auto flatBufferDescriptor =
1194 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1195 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1196 m_flatBufferBuilder.CreateVector(padList),
1197 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1198
1199 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1200 flatBufferBaseLayer,
1201 flatBufferDescriptor);
1202
1203 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1204}
1205
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001206// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001207void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001208 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1209 const char* name)
1210{
Jan Eilers8eb25602020-03-09 12:13:48 +00001211 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001212
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001213 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1214 auto flatBufferDescriptor =
1215 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1216 spaceToDepthDescriptor.m_BlockSize,
1217 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1218
1219 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1220 flatBufferBaseLayer,
1221 flatBufferDescriptor);
1222
1223 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001224}
1225
Jim Flynn18ce3382019-03-08 11:08:30 +00001226// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001227void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001228 const armnn::ViewsDescriptor& viewsDescriptor,
1229 const char* name)
1230{
Jan Eilers8eb25602020-03-09 12:13:48 +00001231 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001232
Jim Flynn18ce3382019-03-08 11:08:30 +00001233 // Create FlatBuffer ViewOrigins
1234 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1235 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1236
1237 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1238 {
1239 std::vector<uint32_t> viewOrigin;
1240 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1241
1242 // Copy vector
1243 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1244 {
1245 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1246 }
1247
1248 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1249 m_flatBufferBuilder.CreateVector(viewOrigin)));
1250 }
1251
1252 // Create FlatBuffer OriginsDescriptor
1253 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1254 viewsDescriptor.GetOrigins().GetConcatAxis(),
1255 viewsDescriptor.GetOrigins().GetNumViews(),
1256 viewsDescriptor.GetOrigins().GetNumDimensions(),
1257 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1258
1259 // Create FlatBuffer ViewOrigins
1260 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1261 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1262
1263 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1264 {
1265 std::vector<uint32_t> viewSize;
1266 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1267
1268 // Copy vector
1269 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1270 {
1271 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1272 }
1273
1274 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1275 m_flatBufferBuilder.CreateVector(viewSize)));
1276 }
1277
1278 // Create FlatBuffer ViewsDescriptor
1279 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1280 flatBufferOriginDescriptor,
1281 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1282
1283 // Create FlatBuffer BaseLayer
1284 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1285
1286 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1287 flatBufferBaseLayer,
1288 flatBufferViewsDescriptor);
1289
1290 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1291}
1292
Finn Williamsb454c5c2021-02-09 15:56:23 +00001293void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001294 const armnn::NormalizationDescriptor& descriptor,
1295 const char* name)
1296{
Jan Eilers8eb25602020-03-09 12:13:48 +00001297 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001298
Nina Drozd57728782019-02-27 10:53:27 +00001299 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1300
1301 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1302 m_flatBufferBuilder,
1303 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1304 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1305 descriptor.m_NormSize,
1306 descriptor.m_Alpha,
1307 descriptor.m_Beta,
1308 descriptor.m_K,
1309 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1310
1311 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1312 fbNormalizationBaseLayer,
1313 fbNormalizationDescriptor);
1314
1315 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1316}
1317
Keith Davis3ae3f972021-05-21 16:33:48 +01001318void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1319 const char* name)
1320{
1321 IgnoreUnused(name);
1322
1323 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1324 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1325
1326 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1327}
1328
Finn Williamsb454c5c2021-02-09 15:56:23 +00001329void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001330 const armnn::StackDescriptor& stackDescriptor,
1331 const char* name)
1332{
Jan Eilers8eb25602020-03-09 12:13:48 +00001333 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001334
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001335 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1336
1337 std::vector<unsigned int> inputShape;
1338 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1339 {
1340 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1341 }
1342
1343 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1344 stackDescriptor.m_Axis,
1345 stackDescriptor.m_NumInputs,
1346 m_flatBufferBuilder.CreateVector(inputShape));
1347
1348 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1349 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001350}
1351
Finn Williamsb454c5c2021-02-09 15:56:23 +00001352void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001353 const armnn::StandInDescriptor& standInDescriptor,
1354 const char *name)
1355{
Jan Eilers8eb25602020-03-09 12:13:48 +00001356 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001357
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001358 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1359 standInDescriptor.m_NumInputs,
1360 standInDescriptor.m_NumOutputs);
1361
1362 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1363 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1364
1365 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001366}
1367
Finn Williamsb454c5c2021-02-09 15:56:23 +00001368void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001369 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1370 const char* name)
1371{
Jan Eilers8eb25602020-03-09 12:13:48 +00001372 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001373
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001374 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1375
1376 auto flatBufferDescriptor =
1377 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1378 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1379 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1380 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1381 stridedSliceDescriptor.m_BeginMask,
1382 stridedSliceDescriptor.m_EndMask,
1383 stridedSliceDescriptor.m_ShrinkAxisMask,
1384 stridedSliceDescriptor.m_EllipsisMask,
1385 stridedSliceDescriptor.m_NewAxisMask,
1386 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1387
1388 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1389 flatBufferBaseLayer,
1390 flatBufferDescriptor);
1391
1392 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1393}
1394
Finn Williamsb454c5c2021-02-09 15:56:23 +00001395void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001396{
Jan Eilers8eb25602020-03-09 12:13:48 +00001397 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001398
Conor Kennedyda1f9752019-03-01 14:37:12 +00001399 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1400 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1401
1402 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1403}
1404
Finn Williamsb454c5c2021-02-09 15:56:23 +00001405void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001406{
Jan Eilers8eb25602020-03-09 12:13:48 +00001407 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001408
Sadik Armaganeff363d2019-04-05 15:25:46 +01001409 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1410 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1411
1412 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1413}
1414
Finn Williamsb454c5c2021-02-09 15:56:23 +00001415void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001416 const armnn::IConnectableLayer* layer,
1417 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001418 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001419 const char* name)
1420{
Jan Eilers8eb25602020-03-09 12:13:48 +00001421 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001422
Finn Williamsb454c5c2021-02-09 15:56:23 +00001423 const armnn::ConstTensor& weights = constants.at(0);
1424
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001425 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1426 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1427 descriptor.m_PadLeft,
1428 descriptor.m_PadRight,
1429 descriptor.m_PadTop,
1430 descriptor.m_PadBottom,
1431 descriptor.m_StrideX,
1432 descriptor.m_StrideY,
1433 descriptor.m_BiasEnabled,
1434 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1435
1436 // weights & biases
1437 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1438 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001439 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001440 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001441 const armnn::ConstTensor& biases = constants.at(1);
1442 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001443 }
1444
1445 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1446 fbBaseLayer,
1447 fbDescriptor,
1448 fbWeightsConstTensorInfo,
1449 fbBiasesConstTensorInfo);
1450
1451 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001452}
1453
Finn Williamsb454c5c2021-02-09 15:56:23 +00001454void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001455 const armnn::TransposeDescriptor& descriptor,
1456 const char* name)
1457{
Jan Eilers8eb25602020-03-09 12:13:48 +00001458 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001459
1460 // Create FlatBuffer BaseLayer
1461 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1462
1463 std::vector<unsigned int> dimMappings;
1464 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1465 {
1466 dimMappings.push_back(descriptor.m_DimMappings[i]);
1467 }
1468
1469 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1470 m_flatBufferBuilder.CreateVector(dimMappings));
1471
1472 // Create the FlatBuffer TransposeLayer
1473 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1474 flatBufferBaseLayer,
1475 flatBufferDesc);
1476
1477 // Add the AnyLayer to the FlatBufferLayers
1478 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1479}
1480
Finn Williamsb454c5c2021-02-09 15:56:23 +00001481void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1482 const armnn::QLstmDescriptor& descriptor,
1483 const std::vector<armnn::ConstTensor>& constants,
1484 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001485{
James Conroy8d333182020-05-13 10:27:58 +01001486 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001487
James Conroy8d333182020-05-13 10:27:58 +01001488 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1489
1490 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1491 m_flatBufferBuilder,
1492 descriptor.m_CifgEnabled,
1493 descriptor.m_PeepholeEnabled,
1494 descriptor.m_ProjectionEnabled,
1495 descriptor.m_LayerNormEnabled,
1496 descriptor.m_CellClip,
1497 descriptor.m_ProjectionClip,
1498 descriptor.m_InputIntermediateScale,
1499 descriptor.m_ForgetIntermediateScale,
1500 descriptor.m_CellIntermediateScale,
1501 descriptor.m_OutputIntermediateScale,
1502 descriptor.m_HiddenStateZeroPoint,
1503 descriptor.m_HiddenStateScale
1504 );
1505
Finn Williamsb454c5c2021-02-09 15:56:23 +00001506 // Index for constants vector
1507 std::size_t i = 0;
1508
James Conroy8d333182020-05-13 10:27:58 +01001509 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001510 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1511 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1512 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1513 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1514 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1515 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1516 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1517 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1518 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001519
1520 // CIFG
1521 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1522 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1523 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1524
1525 if (!descriptor.m_CifgEnabled)
1526 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001527 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1528 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1529 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001530 }
1531
1532 // Peephole
1533 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1534 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1535 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1536
1537 if (descriptor.m_PeepholeEnabled)
1538 {
1539 if (!descriptor.m_CifgEnabled)
1540 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001541 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001542 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001543 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1544 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1545 }
James Conroy8d333182020-05-13 10:27:58 +01001546
Finn Williamsb454c5c2021-02-09 15:56:23 +00001547 // Projection
1548 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1549 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1550
1551 if (descriptor.m_ProjectionEnabled)
1552 {
1553 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1554 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001555 }
1556
1557 // Layer norm
1558 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1559 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1560 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1561 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1562
1563 if (descriptor.m_LayerNormEnabled)
1564 {
1565 if (!descriptor.m_CifgEnabled)
1566 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001567 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001568 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001569 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1570 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1571 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001572 }
1573
1574 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1575 m_flatBufferBuilder,
1576 inputToForgetWeights,
1577 inputToCellWeights,
1578 inputToOutputWeights,
1579 recurrentToForgetWeights,
1580 recurrentToCellWeights,
1581 recurrentToOutputWeights,
1582 forgetGateBias,
1583 cellBias,
1584 outputGateBias,
1585 inputToInputWeights,
1586 recurrentToInputWeights,
1587 inputGateBias,
1588 projectionWeights,
1589 projectionBias,
1590 cellToInputWeights,
1591 cellToForgetWeights,
1592 cellToOutputWeights,
1593 inputLayerNormWeights,
1594 forgetLayerNormWeights,
1595 cellLayerNormWeights,
1596 outputLayerNormWeights);
1597
1598 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1599 m_flatBufferBuilder,
1600 fbQLstmBaseLayer,
1601 fbQLstmDescriptor,
1602 fbQLstmParams);
1603
1604 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001605}
1606
Finn Williamsb454c5c2021-02-09 15:56:23 +00001607void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1608 const std::vector<armnn::ConstTensor>& constants,
1609 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001610{
Jan Eilers8eb25602020-03-09 12:13:48 +00001611 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001612
Jan Eilers5b01a892019-07-23 09:47:43 +01001613 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1614
Finn Williamsb454c5c2021-02-09 15:56:23 +00001615 // index for constants vector
1616 size_t i = 0;
1617
Jan Eilers5b01a892019-07-23 09:47:43 +01001618 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001619 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1620 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1621 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1622 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001623
Finn Williamsb454c5c2021-02-09 15:56:23 +00001624 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1625 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1626 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1627 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001628
Finn Williamsb454c5c2021-02-09 15:56:23 +00001629 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1630 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1631 auto cellBias = CreateConstTensorInfo(constants[i++]);
1632 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001633
1634 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1635 m_flatBufferBuilder,
1636 inputToInputWeights,
1637 inputToForgetWeights,
1638 inputToCellWeights,
1639 inputToOutputWeights,
1640 recurrentToInputWeights,
1641 recurrentToForgetWeights,
1642 recurrentToCellWeights,
1643 recurrentToOutputWeights,
1644 inputGateBias,
1645 forgetGateBias,
1646 cellBias,
1647 outputGateBias);
1648
1649 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1650 m_flatBufferBuilder,
1651 fbQuantizedLstmBaseLayer,
1652 fbQuantizedLstmParams);
1653
1654 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001655}
1656
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001657void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1658 const armnn::IConnectableLayer* layer,
1659 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1660 const std::vector<armnn::ConstTensor>& constants,
1661 const char* name)
1662{
1663 IgnoreUnused(name);
1664
1665 auto fbUnidirectionalSequenceLstmBaseLayer =
1666 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1667
1668 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1669 m_flatBufferBuilder,
1670 descriptor.m_ActivationFunc,
1671 descriptor.m_ClippingThresCell,
1672 descriptor.m_ClippingThresProj,
1673 descriptor.m_CifgEnabled,
1674 descriptor.m_PeepholeEnabled,
1675 descriptor.m_ProjectionEnabled,
1676 descriptor.m_LayerNormEnabled,
1677 descriptor.m_TimeMajor);
1678
1679 // Index for constants vector
1680 std::size_t i = 0;
1681
1682 // Get mandatory/basic input parameters
1683 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1684 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1685 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1686 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1687 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1688 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1689 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1690 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1691 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1692
1693 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1694 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1695 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1696 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1697 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1698 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1699 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1700 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1701 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1702 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1703 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1704 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1705 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1706
1707 if (!descriptor.m_CifgEnabled)
1708 {
1709 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1710 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1711 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1712 }
1713
1714 if (descriptor.m_PeepholeEnabled)
1715 {
1716 if (!descriptor.m_CifgEnabled)
1717 {
1718 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1719 }
1720 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1721 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1722 }
1723
1724 if (descriptor.m_ProjectionEnabled)
1725 {
1726 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1727 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1728 }
1729
1730 if (descriptor.m_LayerNormEnabled)
1731 {
1732 if (!descriptor.m_CifgEnabled)
1733 {
1734 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1735 }
1736 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1737 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1738 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1739 }
1740
1741 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1742 m_flatBufferBuilder,
1743 inputToForgetWeights,
1744 inputToCellWeights,
1745 inputToOutputWeights,
1746 recurrentToForgetWeights,
1747 recurrentToCellWeights,
1748 recurrentToOutputWeights,
1749 forgetGateBias,
1750 cellBias,
1751 outputGateBias,
1752 inputToInputWeights,
1753 recurrentToInputWeights,
1754 cellToInputWeights,
1755 inputGateBias,
1756 projectionWeights,
1757 projectionBias,
1758 cellToForgetWeights,
1759 cellToOutputWeights,
1760 inputLayerNormWeights,
1761 forgetLayerNormWeights,
1762 cellLayerNormWeights,
1763 outputLayerNormWeights);
1764
1765 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1766 m_flatBufferBuilder,
1767 fbUnidirectionalSequenceLstmBaseLayer,
1768 fbUnidirectionalSequenceLstmDescriptor,
1769 fbUnidirectionalSequenceLstmParams);
1770
1771 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1772}
1773
Finn Williamsb454c5c2021-02-09 15:56:23 +00001774fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001775 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001776{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001777
Sadik Armagandb059fd2019-03-20 12:28:32 +00001778 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1779
Mike Kelly8c1701a2019-02-11 17:01:27 +00001780 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1781 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1782
1783 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001784 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001785 m_flatBufferBuilder.CreateString(layer->GetName()),
1786 layerType,
1787 m_flatBufferBuilder.CreateVector(inputSlots),
1788 m_flatBufferBuilder.CreateVector(outputSlots));
1789}
1790
Finn Williamsb454c5c2021-02-09 15:56:23 +00001791void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001792{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001793
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001794 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001795 m_serializedLayers.push_back(anyLayer);
1796}
1797
Mike Kellya0766c32019-02-19 17:22:07 +00001798template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001799flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001800{
1801 const T* buffer = reinterpret_cast<const T*>(memory);
1802 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1803 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1804 return fbVector;
1805}
1806
Finn Williamsb454c5c2021-02-09 15:56:23 +00001807flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001808{
Mike Kellya0766c32019-02-19 17:22:07 +00001809 // Get the dimensions
1810 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001811 std::vector<bool> specificity;
1812 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1813 // matches the size of dimensions.
1814 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1815 {
1816 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001817
1818 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1819 {
1820 shape.push_back(tensorInfo.GetShape()[dim]);
1821 }
1822 else
1823 {
1824 shape.push_back(0);
1825 }
Colm Donelan800b2812021-02-12 12:43:35 +00001826 }
1827
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001828 if (tensorInfo.HasPerAxisQuantization())
1829 {
1830 // Create FlatBuffer TensorInfo
1831 auto flatBufferTensorInfo =
1832 serializer::CreateTensorInfo(m_flatBufferBuilder,
1833 m_flatBufferBuilder.CreateVector(shape),
1834 GetFlatBufferDataType(tensorInfo.GetDataType()),
1835 tensorInfo.GetQuantizationScales()[0],
1836 tensorInfo.GetQuantizationOffset(),
1837 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001838 tensorInfo.GetQuantizationDim().value(),
1839 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001840 (tensorInfo.GetShape().GetDimensionality()),
1841 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001842 return flatBufferTensorInfo;
1843 }
1844
Mike Kellya0766c32019-02-19 17:22:07 +00001845 // Create FlatBuffer TensorInfo
1846 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1847 m_flatBufferBuilder.CreateVector(shape),
1848 GetFlatBufferDataType(tensorInfo.GetDataType()),
1849 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001850 tensorInfo.GetQuantizationOffset(),
1851 0,
1852 0,
1853 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001854 (tensorInfo.GetShape().GetDimensionality()),
1855 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001856 return flatBufferTensorInfo;
1857}
1858
1859flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001860 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001861{
1862 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1863
Mike Kellya0766c32019-02-19 17:22:07 +00001864 flatbuffers::Offset<void> fbPayload;
1865
1866 switch (tensorInfo.GetDataType())
1867 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001868 case armnn::DataType::Signed64:
1869 {
1870 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1871 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1872 m_flatBufferBuilder,
1873 fbVector);
1874 fbPayload = flatBuffersData.o;
1875 break;
1876 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001877 case armnn::DataType::Float32:
1878 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001879 {
1880 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1881 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1882 m_flatBufferBuilder,
1883 fbVector);
1884 fbPayload = flatBuffersData.o;
1885 break;
1886 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001887 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001888 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001889 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001890 {
1891 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1892 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1893 m_flatBufferBuilder,
1894 fbVector);
1895 fbPayload = flatBuffersData.o;
1896 break;
1897 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001898 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001899 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001900 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001901 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001902 default:
1903 {
1904 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1905 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1906 m_flatBufferBuilder,
1907 fbVector);
1908 fbPayload = flatBuffersData.o;
1909 }
1910 }
1911 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1912 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001913 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001914 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1915 fbPayload);
1916 return flatBufferConstTensor;
1917}
1918
Finn Williamsb454c5c2021-02-09 15:56:23 +00001919flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001920{
1921 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1922 serializer::CreateFeatureCompatibilityVersions(
1923 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001924 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001925 1, // Weights layout scheme version
1926 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001927 );
1928 return versionsTable;
1929}
1930
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001931std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001932 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001933{
Mike Kellya0766c32019-02-19 17:22:07 +00001934 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001935
1936 // Get the InputSlots
1937 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1938 {
1939 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1940
1941 // Get the Connection for the InputSlot
1942 const IOutputSlot* connection = inputSlot.GetConnection();
1943
1944 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001945 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1946 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001947 // Create FlatBuffer InputSlot
1948 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1949 }
1950 return inputSlots;
1951}
1952
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001953std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001954 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001955{
1956 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1957
1958 // Get the OutputSlots
1959 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1960 {
1961 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001962 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001963
Mike Kelly8c1701a2019-02-11 17:01:27 +00001964 // Create FlatBuffer Outputslot
1965 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1966 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001967 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001968 }
1969 return outputSlots;
1970}
1971
Finn Williamsb454c5c2021-02-09 15:56:23 +00001972void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1973 const BaseDescriptor& descriptor,
1974 const std::vector<armnn::ConstTensor>& constants,
1975 const char* name,
1976 const armnn::LayerBindingId id)
1977{
1978 IgnoreUnused(constants);
1979
1980 switch (layer->GetType())
1981 {
1982 case armnn::LayerType::Activation :
1983 {
1984 const armnn::ActivationDescriptor& layerDescriptor =
1985 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1986 SerializeActivationLayer(layer, layerDescriptor, name);
1987 break;
1988 }
1989 case armnn::LayerType::Addition :
1990 {
1991 SerializeAdditionLayer(layer, name);
1992 break;
1993 }
1994 case armnn::LayerType::ArgMinMax :
1995 {
1996 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1997 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1998 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1999 break;
2000 }
2001 case armnn::LayerType::BatchNormalization :
2002 {
2003 const armnn::BatchNormalizationDescriptor& layerDescriptor =
2004 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
2005 SerializeBatchNormalizationLayer(layer,
2006 layerDescriptor,
2007 constants,
2008 name);
2009 break;
2010 }
2011 case armnn::LayerType::BatchToSpaceNd :
2012 {
2013 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2014 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2015 SerializeBatchToSpaceNdLayer(layer,
2016 layerDescriptor,
2017 name);
2018 break;
2019 }
mathad01b392e982021-04-07 12:07:30 +01002020 case armnn::LayerType::Cast :
2021 {
2022 SerializeCastLayer(layer, name);
2023 break;
2024 }
Simon Obute51f67772021-09-03 15:50:13 +01002025 case armnn::LayerType::ChannelShuffle :
2026 {
2027 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2028 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2029 SerializeChannelShuffleLayer(layer,
2030 layerDescriptor,
2031 name);
2032 break;
2033 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002034 case armnn::LayerType::Comparison :
2035 {
2036 const armnn::ComparisonDescriptor& layerDescriptor =
2037 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2038 SerializeComparisonLayer(layer,
2039 layerDescriptor,
2040 name);
2041 break;
2042 }
2043 case armnn::LayerType::Concat :
2044 {
2045 const armnn::ConcatDescriptor& layerDescriptor =
2046 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2047 SerializeConcatLayer(layer,
2048 layerDescriptor,
2049 name);
2050 break;
2051 }
2052 case armnn::LayerType::Constant :
2053 {
2054 SerializeConstantLayer(layer,
2055 constants,
2056 name);
2057 break;
2058 }
2059 case armnn::LayerType::Convolution2d :
2060 {
2061 const armnn::Convolution2dDescriptor& layerDescriptor =
2062 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2063 SerializeConvolution2dLayer(layer,
2064 layerDescriptor,
2065 constants,
2066 name);
2067 break;
2068 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002069 case armnn::LayerType::Convolution3d :
2070 {
2071 const armnn::Convolution3dDescriptor& layerDescriptor =
2072 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2073 SerializeConvolution3dLayer(layer,
2074 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002075 name);
2076 break;
2077 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002078 case armnn::LayerType::DepthToSpace :
2079 {
2080 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2081 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2082 SerializeDepthToSpaceLayer(layer,
2083 layerDescriptor,
2084 name);
2085 break;
2086 }
2087 case armnn::LayerType::DepthwiseConvolution2d :
2088 {
2089 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2090 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2091 SerializeDepthwiseConvolution2dLayer(layer,
2092 layerDescriptor,
2093 constants,
2094 name);
2095 break;
2096 }
2097 case armnn::LayerType::Dequantize :
2098 {
2099 SerializeDequantizeLayer(layer,
2100 name);
2101 break;
2102 }
2103 case armnn::LayerType::DetectionPostProcess :
2104 {
2105 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2106 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2107 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2108 break;
2109 }
2110 case armnn::LayerType::Division :
2111 {
2112 SerializeDivisionLayer(layer, name);
2113 break;
2114 }
2115 case armnn::LayerType::ElementwiseUnary :
2116 {
2117 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2118 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2119 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2120 break;
2121 }
2122 case armnn::LayerType::Fill :
2123 {
2124 const armnn::FillDescriptor& layerDescriptor =
2125 static_cast<const armnn::FillDescriptor&>(descriptor);
2126 SerializeFillLayer(layer, layerDescriptor, name);
2127 break;
2128 }
2129 case armnn::LayerType::Floor :
2130 {
2131 SerializeFloorLayer(layer, name);
2132 break;
2133 }
2134 case armnn::LayerType::FullyConnected :
2135 {
2136 const armnn::FullyConnectedDescriptor& layerDescriptor =
2137 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002138 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002139 break;
2140 }
2141 case armnn::LayerType::Gather :
2142 {
2143 const armnn::GatherDescriptor& layerDescriptor =
2144 static_cast<const armnn::GatherDescriptor&>(descriptor);
2145 SerializeGatherLayer(layer, layerDescriptor, name);
2146 break;
2147 }
Teresa Charlin6966bfa2022-04-25 17:14:50 +01002148 case armnn::LayerType::GatherNd :
2149 {
2150 SerializeGatherNdLayer(layer, name);
2151 break;
2152 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002153 case armnn::LayerType::Input:
2154 {
2155 SerializeInputLayer(layer, id, name);
2156 break;
2157 }
2158 case armnn::LayerType::InstanceNormalization :
2159 {
2160 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2161 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2162 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2163 break;
2164 }
2165 case armnn::LayerType::L2Normalization :
2166 {
2167 const armnn::L2NormalizationDescriptor& layerDescriptor =
2168 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2169 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2170 break;
2171 }
2172 case armnn::LayerType::LogicalBinary :
2173 {
2174 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2175 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2176 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2177 break;
2178 }
2179 case armnn::LayerType::LogSoftmax :
2180 {
2181 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2182 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2183 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2184 break;
2185 }
2186 case armnn::LayerType::Lstm :
2187 {
2188 const armnn::LstmDescriptor& layerDescriptor =
2189 static_cast<const armnn::LstmDescriptor&>(descriptor);
2190 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2191 break;
2192 }
2193 case armnn::LayerType::QLstm :
2194 {
2195 const armnn::QLstmDescriptor& layerDescriptor =
2196 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2197 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2198 break;
2199 }
2200 case armnn::LayerType::Maximum :
2201 {
2202 SerializeMaximumLayer(layer, name);
2203 break;
2204 }
2205 case armnn::LayerType::Mean :
2206 {
2207 const armnn::MeanDescriptor& layerDescriptor =
2208 static_cast<const armnn::MeanDescriptor&>(descriptor);
2209 SerializeMeanLayer(layer, layerDescriptor, name);
2210 break;
2211 }
2212 case armnn::LayerType::Merge :
2213 {
2214 SerializeMergeLayer(layer, name);
2215 break;
2216 }
2217 case armnn::LayerType::Minimum :
2218 {
2219 SerializeMinimumLayer(layer, name);
2220 break;
2221 }
2222 case armnn::LayerType::Multiplication :
2223 {
2224 SerializeMultiplicationLayer(layer, name);
2225 break;
2226 }
2227 case armnn::LayerType::Normalization :
2228 {
2229 const armnn::NormalizationDescriptor& layerDescriptor =
2230 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2231 SerializeNormalizationLayer(layer, layerDescriptor, name);
2232 break;
2233 }
2234 case armnn::LayerType::Output:
2235 {
2236 SerializeOutputLayer(layer, id, name);
2237 break;
2238 }
2239 case armnn::LayerType::Pad :
2240 {
2241 const armnn::PadDescriptor& layerDescriptor =
2242 static_cast<const armnn::PadDescriptor&>(descriptor);
2243 SerializePadLayer(layer, layerDescriptor, name);
2244 break;
2245 }
2246 case armnn::LayerType::Permute :
2247 {
2248 const armnn::PermuteDescriptor& layerDescriptor =
2249 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2250 SerializePermuteLayer(layer, layerDescriptor, name);
2251 break;
2252 }
2253 case armnn::LayerType::Pooling2d :
2254 {
2255 const armnn::Pooling2dDescriptor& layerDescriptor =
2256 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2257 SerializePooling2dLayer(layer, layerDescriptor, name);
2258 break;
2259 }
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002260 case armnn::LayerType::Pooling3d :
2261 {
2262 const armnn::Pooling3dDescriptor& layerDescriptor =
2263 static_cast<const armnn::Pooling3dDescriptor&>(descriptor);
2264 SerializePooling3dLayer(layer, layerDescriptor, name);
2265 break;
2266 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002267 case armnn::LayerType::Prelu :
2268 {
2269 SerializePreluLayer(layer, name);
2270 break;
2271 }
2272 case armnn::LayerType::Quantize :
2273 {
2274 SerializeQuantizeLayer(layer, name);
2275 break;
2276 }
2277 case armnn::LayerType::QuantizedLstm:
2278 SerializeQuantizedLstmLayer(layer, constants, name);
2279 break;
2280 case armnn::LayerType::Reshape:
2281 {
2282 const armnn::ReshapeDescriptor &layerDescriptor =
2283 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2284 SerializeReshapeLayer(layer, layerDescriptor, name);
2285 break;
2286 }
2287 case armnn::LayerType::Rank:
2288 {
2289 SerializeRankLayer(layer, name);
2290 break;
2291 }
2292 case armnn::LayerType::Reduce:
2293 {
2294 const armnn::ReduceDescriptor& layerDescriptor =
2295 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2296 SerializeReduceLayer(layer, layerDescriptor, name);
2297 break;
2298 }
2299 case armnn::LayerType::Resize:
2300 {
2301 const armnn::ResizeDescriptor& layerDescriptor =
2302 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2303 SerializeResizeLayer(layer, layerDescriptor, name);
2304 break;
2305 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002306 case armnn::LayerType::Shape:
2307 {
2308 SerializeShapeLayer(layer, name);
2309 break;
2310 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002311 case armnn::LayerType::Slice:
2312 {
2313 const armnn::SliceDescriptor& layerDescriptor =
2314 static_cast<const armnn::SliceDescriptor&>(descriptor);
2315 SerializeSliceLayer(layer, layerDescriptor, name);
2316 break;
2317 }
2318 case armnn::LayerType::Softmax:
2319 {
2320 const armnn::SoftmaxDescriptor& layerDescriptor =
2321 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2322 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2323 break;
2324 }
2325 case armnn::LayerType::SpaceToBatchNd:
2326 {
2327 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2328 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2329 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2330 break;
2331 }
2332 case armnn::LayerType::SpaceToDepth:
2333 {
2334 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2335 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2336 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2337 break;
2338 }
2339 case armnn::LayerType::Splitter:
2340 {
2341 const armnn::SplitterDescriptor& layerDescriptor =
2342 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2343 SerializeSplitterLayer(layer, layerDescriptor, name);
2344 break;
2345 }
2346 case armnn::LayerType::Stack:
2347 {
2348 const armnn::StackDescriptor& layerDescriptor =
2349 static_cast<const armnn::StackDescriptor&>(descriptor);
2350 SerializeStackLayer(layer, layerDescriptor, name);
2351 break;
2352 }
2353 case armnn::LayerType::StandIn:
2354 {
2355 const armnn::StandInDescriptor& layerDescriptor =
2356 static_cast<const armnn::StandInDescriptor&>(descriptor);
2357 SerializeStandInLayer(layer, layerDescriptor, name);
2358 break;
2359 }
2360 case armnn::LayerType::StridedSlice:
2361 {
2362 const armnn::StridedSliceDescriptor& layerDescriptor =
2363 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2364 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2365 break;
2366 }
2367 case armnn::LayerType::Subtraction:
2368 {
2369 SerializeSubtractionLayer(layer, name);
2370 break;
2371 }
2372 case armnn::LayerType::Switch:
2373 {
2374 SerializeSwitchLayer(layer, name);
2375 break;
2376 }
2377 case armnn::LayerType::Transpose:
2378 {
2379 const armnn::TransposeDescriptor& layerDescriptor =
2380 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2381 SerializeTransposeLayer(layer, layerDescriptor, name);
2382 break;
2383 }
2384 case armnn::LayerType::TransposeConvolution2d:
2385 {
2386 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2387 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2388 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2389 break;
2390 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002391 case armnn::LayerType::UnidirectionalSequenceLstm :
2392 {
2393 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2394 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2395 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2396 break;
2397 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002398 default:
2399 {
2400 throw InvalidArgumentException(
2401 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2402 layer->GetName(),
2403 id));
2404 }
2405 }
2406}
2407
Finn Williams85d36712021-01-26 22:30:06 +00002408void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002409{
2410 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002411 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2412 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002413
2414 // Create FlatBuffer SerializedGraph
2415 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002416 fbBuilder,
2417 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2418 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2419 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2420 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002421
2422 // Serialize the graph
2423 fbBuilder.Finish(serializedGraph);
2424}
2425
Finn Williamsb454c5c2021-02-09 15:56:23 +00002426
Finn Williams85d36712021-01-26 22:30:06 +00002427bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002428{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002429 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002430
Matthew Sloyan0663d662020-09-14 11:47:26 +01002431 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002432 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002433 return !stream.bad();
2434}
2435
Finn Williams2605b232020-06-10 15:53:46 +01002436} // namespace armnnSerializer