blob: 99d1c2bd18d173c6e34f8bad94b1a0bff71ac22b [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,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000444 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000445{
Jan Eilers8eb25602020-03-09 12:13:48 +0000446 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000447
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000448 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
449 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
450 descriptor.m_PadLeft,
451 descriptor.m_PadRight,
452 descriptor.m_PadTop,
453 descriptor.m_PadBottom,
454 descriptor.m_StrideX,
455 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100456 descriptor.m_DilationX,
457 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000458 descriptor.m_BiasEnabled,
459 GetFlatBufferDataLayout(descriptor.m_DataLayout));
460
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000461 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
462 fbBaseLayer,
Cathal Corbett06902652022-04-14 17:55:11 +0100463 fbDescriptor);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000464
465 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
466}
467
Finn Williamsb454c5c2021-02-09 15:56:23 +0000468void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000469 const char* name)
470{
Jan Eilers8eb25602020-03-09 12:13:48 +0000471 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000472
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000473 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
474 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
475
476 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
477}
478
Finn Williamsb454c5c2021-02-09 15:56:23 +0000479void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
480 const armnn::DetectionPostProcessDescriptor& descriptor,
481 const std::vector<armnn::ConstTensor>& constants,
482 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000483{
Jan Eilers8eb25602020-03-09 12:13:48 +0000484 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000485
Finn Williamsb454c5c2021-02-09 15:56:23 +0000486 const armnn::ConstTensor& anchors = constants[0];
487
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000488 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
489 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
490 descriptor.m_MaxDetections,
491 descriptor.m_MaxClassesPerDetection,
492 descriptor.m_DetectionsPerClass,
493 descriptor.m_NmsScoreThreshold,
494 descriptor.m_NmsIouThreshold,
495 descriptor.m_NumClasses,
496 descriptor.m_UseRegularNms,
497 descriptor.m_ScaleX,
498 descriptor.m_ScaleY,
499 descriptor.m_ScaleW,
500 descriptor.m_ScaleH);
501
502 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
503
504 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
505 fbBaseLayer,
506 fbDescriptor,
507 fbAnchorsConstTensorInfo);
508
509 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
510}
511
Finn Williamsb454c5c2021-02-09 15:56:23 +0000512void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000513{
Jan Eilers8eb25602020-03-09 12:13:48 +0000514 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000515
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000516 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
517 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000518
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000519 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
520}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000521
Finn Williamsb454c5c2021-02-09 15:56:23 +0000522void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600523 const armnn::ElementwiseUnaryDescriptor& descriptor,
524 const char* name)
525{
Jan Eilers8eb25602020-03-09 12:13:48 +0000526 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600527
528 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
529 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
530 m_flatBufferBuilder,
531 GetFlatBufferUnaryOperation(descriptor.m_Operation));
532
533 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
534 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
535}
536
Finn Williamsb454c5c2021-02-09 15:56:23 +0000537void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100538 const armnn::FillDescriptor& fillDescriptor,
539 const char* name)
540{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100541 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100542
543 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
544
545 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
546
547 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
548
549 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100550}
551
Finn Williamsb454c5c2021-02-09 15:56:23 +0000552void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000553{
Jan Eilers8eb25602020-03-09 12:13:48 +0000554 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000555
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000556 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
557 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
558
559 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
560}
561
Finn Williamsb454c5c2021-02-09 15:56:23 +0000562void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100563 const armnn::GatherDescriptor& gatherDescriptor,
564 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000565{
Jan Eilers8eb25602020-03-09 12:13:48 +0000566 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000567
Teresa Charlin52664732020-06-29 16:27:03 +0100568 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
569 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000570 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100571 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000572
573 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
574}
575
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100576void SerializerStrategy::SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
577 const char* name)
578{
579 IgnoreUnused(name);
580
581 auto fbGatherNdBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_GatherNd);
582 auto flatBufferLayer = serializer::CreateGatherNdLayer(m_flatBufferBuilder, fbGatherNdBaseLayer);
583
584 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherNdLayer);
585}
586
Finn Williamsb454c5c2021-02-09 15:56:23 +0000587void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100588 const armnn::IConnectableLayer* layer,
589 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
590 const char* name)
591{
Jan Eilers8eb25602020-03-09 12:13:48 +0000592 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000593
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100594 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
595 m_flatBufferBuilder,
596 instanceNormalizationDescriptor.m_Gamma,
597 instanceNormalizationDescriptor.m_Beta,
598 instanceNormalizationDescriptor.m_Eps,
599 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
600
601 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
602 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
603
604 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100605}
606
Finn Williamsb454c5c2021-02-09 15:56:23 +0000607void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000608 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
609 const char* name)
610{
Jan Eilers8eb25602020-03-09 12:13:48 +0000611 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000612
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000613 // Create FlatBuffer BaseLayer
614 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
615
616 // Create the FlatBuffer L2Normalization Descriptor
617 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100618 m_flatBufferBuilder,
619 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
620 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000621
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100622 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000623 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
624
625 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
626}
627
Finn Williamsb454c5c2021-02-09 15:56:23 +0000628void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000629 const armnn::LogicalBinaryDescriptor& descriptor,
630 const char* name)
631{
632 IgnoreUnused(name);
633
634 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
635 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
636 m_flatBufferBuilder,
637 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
638
639 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
640 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
641}
642
Finn Williamsb454c5c2021-02-09 15:56:23 +0000643void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100644 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
645 const char* name)
646{
Jan Eilers8eb25602020-03-09 12:13:48 +0000647 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000648
Sadik Armagan26257852019-10-14 13:00:47 +0100649 // Create FlatBuffer BaseLayer
650 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
651
652 // Create the FlatBuffer LogSoftmaxDescriptor
653 auto flatBufferLogSoftmaxDesc =
654 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
655 logSoftmaxDescriptor.m_Beta,
656 logSoftmaxDescriptor.m_Axis);
657
658 // Create the FlatBuffer LogSoftmaxLayer
659 auto flatBufferLogSoftmaxLayer =
660 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
661 flatBufferLogSoftmaxBaseLayer,
662 flatBufferLogSoftmaxDesc);
663
664 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100665}
666
Finn Williamsb454c5c2021-02-09 15:56:23 +0000667void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
668 const armnn::LstmDescriptor& descriptor,
669 const std::vector<armnn::ConstTensor>& constants,
670 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000671{
Jan Eilers8eb25602020-03-09 12:13:48 +0000672 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000673
Jim Flynn11af3752019-03-19 17:22:29 +0000674 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
675
676 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
677 m_flatBufferBuilder,
678 descriptor.m_ActivationFunc,
679 descriptor.m_ClippingThresCell,
680 descriptor.m_ClippingThresProj,
681 descriptor.m_CifgEnabled,
682 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100683 descriptor.m_ProjectionEnabled,
684 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000685
Finn Williamsb454c5c2021-02-09 15:56:23 +0000686 // Index for constants vector
687 std::size_t i = 0;
688
689 // Get mandatory/basic input parameters
690 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
691 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
692 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
693 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
694 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
695 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
696 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
697 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
698 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
699
700
Jim Flynn11af3752019-03-19 17:22:29 +0000701
702 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
703 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
704 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
705 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
706 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
707 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
708 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
709 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
710 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100711 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
712 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
713 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
714 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000715
716 if (!descriptor.m_CifgEnabled)
717 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000718 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
719 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
720 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000721 }
722
723 if (descriptor.m_PeepholeEnabled)
724 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000725 if (!descriptor.m_CifgEnabled)
726 {
727 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
728 }
729 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
730 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
731 }
732
733 if (descriptor.m_ProjectionEnabled)
734 {
735 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
736 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000737 }
738
Jan Eilersf8c62972019-07-17 11:07:49 +0100739 if (descriptor.m_LayerNormEnabled)
740 {
741 if (!descriptor.m_CifgEnabled)
742 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000743 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100744 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000745 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
746 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
747 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100748 }
749
Jim Flynn11af3752019-03-19 17:22:29 +0000750 auto fbLstmParams = serializer::CreateLstmInputParams(
751 m_flatBufferBuilder,
752 inputToForgetWeights,
753 inputToCellWeights,
754 inputToOutputWeights,
755 recurrentToForgetWeights,
756 recurrentToCellWeights,
757 recurrentToOutputWeights,
758 forgetGateBias,
759 cellBias,
760 outputGateBias,
761 inputToInputWeights,
762 recurrentToInputWeights,
763 cellToInputWeights,
764 inputGateBias,
765 projectionWeights,
766 projectionBias,
767 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100768 cellToOutputWeights,
769 inputLayerNormWeights,
770 forgetLayerNormWeights,
771 cellLayerNormWeights,
772 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000773
774 auto fbLstmLayer = serializer::CreateLstmLayer(
775 m_flatBufferBuilder,
776 fbLstmBaseLayer,
777 fbLstmDescriptor,
778 fbLstmParams);
779
780 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
781}
782
Finn Williamsb454c5c2021-02-09 15:56:23 +0000783void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000784{
Jan Eilers8eb25602020-03-09 12:13:48 +0000785 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000786
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000787 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
788 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
789
790 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
791}
792
Finn Williamsb454c5c2021-02-09 15:56:23 +0000793void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000794 const armnn::MeanDescriptor& descriptor,
795 const char* name)
796{
Jan Eilers8eb25602020-03-09 12:13:48 +0000797 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000798
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000799 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
800 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
801 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
802 descriptor.m_KeepDims);
803
804 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
805 fbMeanBaseLayer,
806 fbMeanDescriptor);
807
808 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
809}
810
Finn Williamsb454c5c2021-02-09 15:56:23 +0000811void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000812{
Jan Eilers8eb25602020-03-09 12:13:48 +0000813 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000814
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000815 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
816 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
817
818 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
819}
820
Finn Williamsb454c5c2021-02-09 15:56:23 +0000821void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100822{
Jan Eilers8eb25602020-03-09 12:13:48 +0000823 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000824
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100825 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
826 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
827
828 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
829}
830
Finn Williamsb454c5c2021-02-09 15:56:23 +0000831void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100832 const armnn::ConcatDescriptor& concatDescriptor,
833 const char* name)
834{
Jan Eilers8eb25602020-03-09 12:13:48 +0000835 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000836
Jim Flynne242f2d2019-05-22 14:24:13 +0100837 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000838
839 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100840 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000841 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100842 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000843 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100844 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000845 {
846 origins.push_back(origin[d]);
847 }
848 auto view = m_flatBufferBuilder.CreateVector(origins);
849 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
850 views.push_back(uintVector);
851 }
852
Jim Flynne242f2d2019-05-22 14:24:13 +0100853 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
854 concatDescriptor.GetConcatAxis(),
855 concatDescriptor.GetNumViews(),
856 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000857 m_flatBufferBuilder.CreateVector(views));
858
Jim Flynne242f2d2019-05-22 14:24:13 +0100859 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
860 flatBufferConcatBaseLayer,
861 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000862
Jim Flynne242f2d2019-05-22 14:24:13 +0100863 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000864}
865
Finn Williamsb454c5c2021-02-09 15:56:23 +0000866void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000867{
Jan Eilers8eb25602020-03-09 12:13:48 +0000868 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000869
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000870 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
871 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
872 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000873
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000874 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000875}
876
Finn Williamsb454c5c2021-02-09 15:56:23 +0000877void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000878 const armnn::PadDescriptor& padDescriptor,
879 const char* name)
880{
Jan Eilers8eb25602020-03-09 12:13:48 +0000881 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000882
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000883 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
884
885 std::vector<unsigned int> padList;
886 for (auto& p: padDescriptor.m_PadList)
887 {
888 padList.push_back(p.first);
889 padList.push_back(p.second);
890 }
891
892 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100893 m_flatBufferBuilder.CreateVector(padList),
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +0100894 padDescriptor.m_PadValue,
895 GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000896
897 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
898 flatBufferBaseLayer,
899 flatBufferPadDesc);
900
901 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
902}
903
Finn Williamsb454c5c2021-02-09 15:56:23 +0000904void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000905 const armnn::PermuteDescriptor& permuteDescriptor,
906 const char* name)
907{
Jan Eilers8eb25602020-03-09 12:13:48 +0000908 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000909
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000910 // Create FlatBuffer BaseLayer
911 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
912
913 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100914 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000915 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100916 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000917 }
918
919 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
920 m_flatBufferBuilder.CreateVector(dimMappings));
921
922 // Create the FlatBuffer PermuteLayer
923 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
924 flatBufferPermuteBaseLayer,
925 flatBufferPermuteDesc);
926
927 // Add the AnyLayer to the FlatBufferLayers
928 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
929}
930
Finn Williams2605b232020-06-10 15:53:46 +0100931// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000932void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100933 const char* name)
934{
935 IgnoreUnused(name);
936 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
937 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
938
939 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
940}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000941
Finn Williamsb454c5c2021-02-09 15:56:23 +0000942void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
943 const armnn::ReduceDescriptor& reduceDescriptor,
944 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000945{
946 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
947 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000948 reduceDescriptor.m_KeepDims,
949 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
950 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
951 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
952 fbReduceBaseLayer,
953 fbDescriptor);
954
955 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
956}
957
Saoirse Stewart263829c2019-02-19 15:54:14 +0000958// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000959void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000960 const armnn::ReshapeDescriptor& reshapeDescriptor,
961 const char* name)
962{
Jan Eilers8eb25602020-03-09 12:13:48 +0000963 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000964
Saoirse Stewart263829c2019-02-19 15:54:14 +0000965 // Create FlatBuffer BaseLayer
966 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
967
968 std::vector<unsigned int> targetShape;
969 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
970 {
971 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
972 }
973
974 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
975 m_flatBufferBuilder.CreateVector(targetShape));
976
977 // Create the FlatBuffer ReshapeLayer
978 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
979 flatBufferReshapeDesc);
980
981 // Add the AnyLayer to the FlatBufferLayers
982 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
983}
984
Finn Williamsb454c5c2021-02-09 15:56:23 +0000985void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +0100986 const armnn::ResizeDescriptor& resizeDescriptor,
987 const char* name)
988{
Jan Eilers8eb25602020-03-09 12:13:48 +0000989 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000990
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100991 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
992
993 auto flatBufferDescriptor =
994 CreateResizeDescriptor(m_flatBufferBuilder,
995 resizeDescriptor.m_TargetHeight,
996 resizeDescriptor.m_TargetWidth,
997 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100998 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
999 resizeDescriptor.m_AlignCorners,
1000 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001001
1002 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1003 flatBufferBaseLayer,
1004 flatBufferDescriptor);
1005
1006 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001007}
1008
Finn Williamsb454c5c2021-02-09 15:56:23 +00001009void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001010 const armnn::SliceDescriptor& sliceDescriptor,
1011 const char* name)
1012{
Jan Eilers8eb25602020-03-09 12:13:48 +00001013 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001014
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001015 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1016 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1017 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1018 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1019
1020 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1021
1022 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001023}
1024
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001025// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001026void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001027 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001028 const char* name)
1029{
Jan Eilers8eb25602020-03-09 12:13:48 +00001030 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001031
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001032 // Create FlatBuffer BaseLayer
1033 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1034
1035 // Create the FlatBuffer SoftmaxDescriptor
1036 auto flatBufferSoftmaxDesc =
Sadik Armaganfd0cae32021-11-08 17:18:31 +00001037 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder,
1038 softmaxDescriptor.m_Beta,
1039 softmaxDescriptor.m_Axis);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001040
1041 // Create the FlatBuffer SoftmaxLayer
1042 auto flatBufferSoftmaxLayer =
1043 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1044 flatBufferSoftmaxBaseLayer,
1045 flatBufferSoftmaxDesc);
1046
1047 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1048}
1049
Finn Williamsb454c5c2021-02-09 15:56:23 +00001050void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001051 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001052 const char* name)
1053{
Jan Eilers8eb25602020-03-09 12:13:48 +00001054 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001055
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001056 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1057 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1058 m_flatBufferBuilder,
1059 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1060 pooling2dDescriptor.m_PadLeft,
1061 pooling2dDescriptor.m_PadRight,
1062 pooling2dDescriptor.m_PadTop,
1063 pooling2dDescriptor.m_PadBottom,
1064 pooling2dDescriptor.m_PoolWidth,
1065 pooling2dDescriptor.m_PoolHeight,
1066 pooling2dDescriptor.m_StrideX,
1067 pooling2dDescriptor.m_StrideY,
1068 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1069 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1070 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1071
1072 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1073 fbPooling2dBaseLayer,
1074 fbPooling2dDescriptor);
1075
1076 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1077}
1078
Tamas Nyirid998a1c2021-11-05 14:55:33 +00001079void SerializerStrategy::SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
1080 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
1081 const char* name)
1082{
1083 IgnoreUnused(name);
1084
1085 auto fbPooling3dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling3d);
1086 auto fbPooling3dDescriptor = serializer::CreatePooling3dDescriptor(
1087 m_flatBufferBuilder,
1088 GetFlatBufferPoolingAlgorithm(pooling3dDescriptor.m_PoolType),
1089 pooling3dDescriptor.m_PadLeft,
1090 pooling3dDescriptor.m_PadRight,
1091 pooling3dDescriptor.m_PadTop,
1092 pooling3dDescriptor.m_PadBottom,
1093 pooling3dDescriptor.m_PadFront,
1094 pooling3dDescriptor.m_PadBack,
1095 pooling3dDescriptor.m_PoolWidth,
1096 pooling3dDescriptor.m_PoolHeight,
1097 pooling3dDescriptor.m_PoolDepth,
1098 pooling3dDescriptor.m_StrideX,
1099 pooling3dDescriptor.m_StrideY,
1100 pooling3dDescriptor.m_StrideZ,
1101 GetFlatBufferOutputShapeRounding(pooling3dDescriptor.m_OutputShapeRounding),
1102 GetFlatBufferPaddingMethod(pooling3dDescriptor.m_PaddingMethod),
1103 GetFlatBufferDataLayout(pooling3dDescriptor.m_DataLayout));
1104
1105 auto fbPooling3dLayer = serializer::CreatePooling3dLayer(m_flatBufferBuilder,
1106 fbPooling3dBaseLayer,
1107 fbPooling3dDescriptor);
1108
1109 CreateAnyLayer(fbPooling3dLayer.o, serializer::Layer::Layer_Pooling3dLayer);
1110}
1111
Finn Williamsb454c5c2021-02-09 15:56:23 +00001112void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001113 const char* name)
1114{
Jan Eilers8eb25602020-03-09 12:13:48 +00001115 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001116
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001117 // Create FlatBuffer BaseLayer
1118 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1119
1120 // Create the FlatBuffer AdditionLayer
1121 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1122
1123 // Add the AnyLayer to the FlatBufferLayers
1124 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001125}
1126
Finn Williamsb454c5c2021-02-09 15:56:23 +00001127void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001128{
Jan Eilers8eb25602020-03-09 12:13:48 +00001129 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001130
Derek Lamberti87acb272019-03-27 16:51:31 +00001131 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1132 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1133 fbQuantizeBaseLayer);
1134 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1135}
1136
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001137// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001138void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1139 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001140 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001141{
1142 // Create FlatBuffer BaseLayer
1143 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1144
1145 // Create FlatBuffer FullyConnectedDescriptor
1146 auto flatBufferDescriptor =
1147 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1148 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001149 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1150 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001151
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001152 // Create FlatBuffer FullyConnectedLayer
1153 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1154 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001155 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001156
1157 // Add created FullyConnectedLayer to the FlatBufferLayers
1158 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1159}
1160
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001161// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001162void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001163 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1164 const char* name)
1165{
Jan Eilers8eb25602020-03-09 12:13:48 +00001166 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001167
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001168 // Create FlatBuffer BaseLayer
1169 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1170
1171 std::vector<unsigned int> padList;
1172 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1173 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1174 {
1175 padList.push_back(pad.first);
1176 padList.push_back(pad.second);
1177 }
1178
1179 auto flatBufferDescriptor =
1180 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1181 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1182 m_flatBufferBuilder.CreateVector(padList),
1183 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1184
1185 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1186 flatBufferBaseLayer,
1187 flatBufferDescriptor);
1188
1189 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1190}
1191
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001192// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001193void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001194 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1195 const char* name)
1196{
Jan Eilers8eb25602020-03-09 12:13:48 +00001197 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001198
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001199 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1200 auto flatBufferDescriptor =
1201 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1202 spaceToDepthDescriptor.m_BlockSize,
1203 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1204
1205 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1206 flatBufferBaseLayer,
1207 flatBufferDescriptor);
1208
1209 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001210}
1211
Jim Flynn18ce3382019-03-08 11:08:30 +00001212// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001213void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001214 const armnn::ViewsDescriptor& viewsDescriptor,
1215 const char* name)
1216{
Jan Eilers8eb25602020-03-09 12:13:48 +00001217 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001218
Jim Flynn18ce3382019-03-08 11:08:30 +00001219 // Create FlatBuffer ViewOrigins
1220 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1221 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1222
1223 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1224 {
1225 std::vector<uint32_t> viewOrigin;
1226 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1227
1228 // Copy vector
1229 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1230 {
1231 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1232 }
1233
1234 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1235 m_flatBufferBuilder.CreateVector(viewOrigin)));
1236 }
1237
1238 // Create FlatBuffer OriginsDescriptor
1239 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1240 viewsDescriptor.GetOrigins().GetConcatAxis(),
1241 viewsDescriptor.GetOrigins().GetNumViews(),
1242 viewsDescriptor.GetOrigins().GetNumDimensions(),
1243 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1244
1245 // Create FlatBuffer ViewOrigins
1246 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1247 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1248
1249 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1250 {
1251 std::vector<uint32_t> viewSize;
1252 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1253
1254 // Copy vector
1255 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1256 {
1257 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1258 }
1259
1260 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1261 m_flatBufferBuilder.CreateVector(viewSize)));
1262 }
1263
1264 // Create FlatBuffer ViewsDescriptor
1265 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1266 flatBufferOriginDescriptor,
1267 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1268
1269 // Create FlatBuffer BaseLayer
1270 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1271
1272 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1273 flatBufferBaseLayer,
1274 flatBufferViewsDescriptor);
1275
1276 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1277}
1278
Finn Williamsb454c5c2021-02-09 15:56:23 +00001279void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001280 const armnn::NormalizationDescriptor& descriptor,
1281 const char* name)
1282{
Jan Eilers8eb25602020-03-09 12:13:48 +00001283 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001284
Nina Drozd57728782019-02-27 10:53:27 +00001285 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1286
1287 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1288 m_flatBufferBuilder,
1289 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1290 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1291 descriptor.m_NormSize,
1292 descriptor.m_Alpha,
1293 descriptor.m_Beta,
1294 descriptor.m_K,
1295 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1296
1297 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1298 fbNormalizationBaseLayer,
1299 fbNormalizationDescriptor);
1300
1301 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1302}
1303
Keith Davis3ae3f972021-05-21 16:33:48 +01001304void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1305 const char* name)
1306{
1307 IgnoreUnused(name);
1308
1309 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1310 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1311
1312 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1313}
1314
Finn Williamsb454c5c2021-02-09 15:56:23 +00001315void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001316 const armnn::StackDescriptor& stackDescriptor,
1317 const char* name)
1318{
Jan Eilers8eb25602020-03-09 12:13:48 +00001319 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001320
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001321 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1322
1323 std::vector<unsigned int> inputShape;
1324 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1325 {
1326 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1327 }
1328
1329 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1330 stackDescriptor.m_Axis,
1331 stackDescriptor.m_NumInputs,
1332 m_flatBufferBuilder.CreateVector(inputShape));
1333
1334 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1335 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001336}
1337
Finn Williamsb454c5c2021-02-09 15:56:23 +00001338void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001339 const armnn::StandInDescriptor& standInDescriptor,
1340 const char *name)
1341{
Jan Eilers8eb25602020-03-09 12:13:48 +00001342 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001343
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001344 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1345 standInDescriptor.m_NumInputs,
1346 standInDescriptor.m_NumOutputs);
1347
1348 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1349 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1350
1351 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001352}
1353
Finn Williamsb454c5c2021-02-09 15:56:23 +00001354void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001355 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1356 const char* name)
1357{
Jan Eilers8eb25602020-03-09 12:13:48 +00001358 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001359
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001360 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1361
1362 auto flatBufferDescriptor =
1363 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1364 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1365 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1366 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1367 stridedSliceDescriptor.m_BeginMask,
1368 stridedSliceDescriptor.m_EndMask,
1369 stridedSliceDescriptor.m_ShrinkAxisMask,
1370 stridedSliceDescriptor.m_EllipsisMask,
1371 stridedSliceDescriptor.m_NewAxisMask,
1372 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1373
1374 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1375 flatBufferBaseLayer,
1376 flatBufferDescriptor);
1377
1378 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1379}
1380
Finn Williamsb454c5c2021-02-09 15:56:23 +00001381void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001382{
Jan Eilers8eb25602020-03-09 12:13:48 +00001383 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001384
Conor Kennedyda1f9752019-03-01 14:37:12 +00001385 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1386 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1387
1388 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1389}
1390
Finn Williamsb454c5c2021-02-09 15:56:23 +00001391void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001392{
Jan Eilers8eb25602020-03-09 12:13:48 +00001393 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001394
Sadik Armaganeff363d2019-04-05 15:25:46 +01001395 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1396 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1397
1398 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1399}
1400
Finn Williamsb454c5c2021-02-09 15:56:23 +00001401void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001402 const armnn::IConnectableLayer* layer,
1403 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001404 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001405 const char* name)
1406{
Jan Eilers8eb25602020-03-09 12:13:48 +00001407 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001408
Finn Williamsb454c5c2021-02-09 15:56:23 +00001409 const armnn::ConstTensor& weights = constants.at(0);
1410
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001411 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1412 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1413 descriptor.m_PadLeft,
1414 descriptor.m_PadRight,
1415 descriptor.m_PadTop,
1416 descriptor.m_PadBottom,
1417 descriptor.m_StrideX,
1418 descriptor.m_StrideY,
1419 descriptor.m_BiasEnabled,
1420 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1421
1422 // weights & biases
1423 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1424 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001425 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001426 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001427 const armnn::ConstTensor& biases = constants.at(1);
1428 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001429 }
1430
1431 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1432 fbBaseLayer,
1433 fbDescriptor,
1434 fbWeightsConstTensorInfo,
1435 fbBiasesConstTensorInfo);
1436
1437 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001438}
1439
Finn Williamsb454c5c2021-02-09 15:56:23 +00001440void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001441 const armnn::TransposeDescriptor& descriptor,
1442 const char* name)
1443{
Jan Eilers8eb25602020-03-09 12:13:48 +00001444 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001445
1446 // Create FlatBuffer BaseLayer
1447 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1448
1449 std::vector<unsigned int> dimMappings;
1450 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1451 {
1452 dimMappings.push_back(descriptor.m_DimMappings[i]);
1453 }
1454
1455 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1456 m_flatBufferBuilder.CreateVector(dimMappings));
1457
1458 // Create the FlatBuffer TransposeLayer
1459 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1460 flatBufferBaseLayer,
1461 flatBufferDesc);
1462
1463 // Add the AnyLayer to the FlatBufferLayers
1464 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1465}
1466
Finn Williamsb454c5c2021-02-09 15:56:23 +00001467void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1468 const armnn::QLstmDescriptor& descriptor,
1469 const std::vector<armnn::ConstTensor>& constants,
1470 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001471{
James Conroy8d333182020-05-13 10:27:58 +01001472 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001473
James Conroy8d333182020-05-13 10:27:58 +01001474 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1475
1476 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1477 m_flatBufferBuilder,
1478 descriptor.m_CifgEnabled,
1479 descriptor.m_PeepholeEnabled,
1480 descriptor.m_ProjectionEnabled,
1481 descriptor.m_LayerNormEnabled,
1482 descriptor.m_CellClip,
1483 descriptor.m_ProjectionClip,
1484 descriptor.m_InputIntermediateScale,
1485 descriptor.m_ForgetIntermediateScale,
1486 descriptor.m_CellIntermediateScale,
1487 descriptor.m_OutputIntermediateScale,
1488 descriptor.m_HiddenStateZeroPoint,
1489 descriptor.m_HiddenStateScale
1490 );
1491
Finn Williamsb454c5c2021-02-09 15:56:23 +00001492 // Index for constants vector
1493 std::size_t i = 0;
1494
James Conroy8d333182020-05-13 10:27:58 +01001495 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001496 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1497 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1498 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1499 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1500 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1501 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1502 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1503 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1504 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001505
1506 // CIFG
1507 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1508 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1509 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1510
1511 if (!descriptor.m_CifgEnabled)
1512 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001513 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1514 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1515 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001516 }
1517
1518 // Peephole
1519 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1520 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1521 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1522
1523 if (descriptor.m_PeepholeEnabled)
1524 {
1525 if (!descriptor.m_CifgEnabled)
1526 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001527 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001528 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001529 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1530 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1531 }
James Conroy8d333182020-05-13 10:27:58 +01001532
Finn Williamsb454c5c2021-02-09 15:56:23 +00001533 // Projection
1534 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1535 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1536
1537 if (descriptor.m_ProjectionEnabled)
1538 {
1539 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1540 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001541 }
1542
1543 // Layer norm
1544 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1545 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1546 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1547 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1548
1549 if (descriptor.m_LayerNormEnabled)
1550 {
1551 if (!descriptor.m_CifgEnabled)
1552 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001553 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001554 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001555 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1556 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1557 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001558 }
1559
1560 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1561 m_flatBufferBuilder,
1562 inputToForgetWeights,
1563 inputToCellWeights,
1564 inputToOutputWeights,
1565 recurrentToForgetWeights,
1566 recurrentToCellWeights,
1567 recurrentToOutputWeights,
1568 forgetGateBias,
1569 cellBias,
1570 outputGateBias,
1571 inputToInputWeights,
1572 recurrentToInputWeights,
1573 inputGateBias,
1574 projectionWeights,
1575 projectionBias,
1576 cellToInputWeights,
1577 cellToForgetWeights,
1578 cellToOutputWeights,
1579 inputLayerNormWeights,
1580 forgetLayerNormWeights,
1581 cellLayerNormWeights,
1582 outputLayerNormWeights);
1583
1584 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1585 m_flatBufferBuilder,
1586 fbQLstmBaseLayer,
1587 fbQLstmDescriptor,
1588 fbQLstmParams);
1589
1590 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001591}
1592
Finn Williamsb454c5c2021-02-09 15:56:23 +00001593void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1594 const std::vector<armnn::ConstTensor>& constants,
1595 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001596{
Jan Eilers8eb25602020-03-09 12:13:48 +00001597 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001598
Jan Eilers5b01a892019-07-23 09:47:43 +01001599 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1600
Finn Williamsb454c5c2021-02-09 15:56:23 +00001601 // index for constants vector
1602 size_t i = 0;
1603
Jan Eilers5b01a892019-07-23 09:47:43 +01001604 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001605 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1606 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1607 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1608 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001609
Finn Williamsb454c5c2021-02-09 15:56:23 +00001610 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1611 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1612 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1613 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001614
Finn Williamsb454c5c2021-02-09 15:56:23 +00001615 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1616 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1617 auto cellBias = CreateConstTensorInfo(constants[i++]);
1618 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001619
1620 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1621 m_flatBufferBuilder,
1622 inputToInputWeights,
1623 inputToForgetWeights,
1624 inputToCellWeights,
1625 inputToOutputWeights,
1626 recurrentToInputWeights,
1627 recurrentToForgetWeights,
1628 recurrentToCellWeights,
1629 recurrentToOutputWeights,
1630 inputGateBias,
1631 forgetGateBias,
1632 cellBias,
1633 outputGateBias);
1634
1635 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1636 m_flatBufferBuilder,
1637 fbQuantizedLstmBaseLayer,
1638 fbQuantizedLstmParams);
1639
1640 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001641}
1642
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001643void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1644 const armnn::IConnectableLayer* layer,
1645 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1646 const std::vector<armnn::ConstTensor>& constants,
1647 const char* name)
1648{
1649 IgnoreUnused(name);
1650
1651 auto fbUnidirectionalSequenceLstmBaseLayer =
1652 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1653
1654 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1655 m_flatBufferBuilder,
1656 descriptor.m_ActivationFunc,
1657 descriptor.m_ClippingThresCell,
1658 descriptor.m_ClippingThresProj,
1659 descriptor.m_CifgEnabled,
1660 descriptor.m_PeepholeEnabled,
1661 descriptor.m_ProjectionEnabled,
1662 descriptor.m_LayerNormEnabled,
1663 descriptor.m_TimeMajor);
1664
1665 // Index for constants vector
1666 std::size_t i = 0;
1667
1668 // Get mandatory/basic input parameters
1669 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1670 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1671 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1672 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1673 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1674 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1675 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1676 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1677 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1678
1679 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1680 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1681 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1682 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1683 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1684 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1685 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1686 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1687 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1688 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1689 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1690 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1691 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1692
1693 if (!descriptor.m_CifgEnabled)
1694 {
1695 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1696 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1697 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1698 }
1699
1700 if (descriptor.m_PeepholeEnabled)
1701 {
1702 if (!descriptor.m_CifgEnabled)
1703 {
1704 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1705 }
1706 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1707 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1708 }
1709
1710 if (descriptor.m_ProjectionEnabled)
1711 {
1712 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1713 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1714 }
1715
1716 if (descriptor.m_LayerNormEnabled)
1717 {
1718 if (!descriptor.m_CifgEnabled)
1719 {
1720 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1721 }
1722 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1723 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1724 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1725 }
1726
1727 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1728 m_flatBufferBuilder,
1729 inputToForgetWeights,
1730 inputToCellWeights,
1731 inputToOutputWeights,
1732 recurrentToForgetWeights,
1733 recurrentToCellWeights,
1734 recurrentToOutputWeights,
1735 forgetGateBias,
1736 cellBias,
1737 outputGateBias,
1738 inputToInputWeights,
1739 recurrentToInputWeights,
1740 cellToInputWeights,
1741 inputGateBias,
1742 projectionWeights,
1743 projectionBias,
1744 cellToForgetWeights,
1745 cellToOutputWeights,
1746 inputLayerNormWeights,
1747 forgetLayerNormWeights,
1748 cellLayerNormWeights,
1749 outputLayerNormWeights);
1750
1751 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1752 m_flatBufferBuilder,
1753 fbUnidirectionalSequenceLstmBaseLayer,
1754 fbUnidirectionalSequenceLstmDescriptor,
1755 fbUnidirectionalSequenceLstmParams);
1756
1757 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1758}
1759
Finn Williamsb454c5c2021-02-09 15:56:23 +00001760fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001761 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001762{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001763
Sadik Armagandb059fd2019-03-20 12:28:32 +00001764 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1765
Mike Kelly8c1701a2019-02-11 17:01:27 +00001766 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1767 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1768
1769 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001770 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001771 m_flatBufferBuilder.CreateString(layer->GetName()),
1772 layerType,
1773 m_flatBufferBuilder.CreateVector(inputSlots),
1774 m_flatBufferBuilder.CreateVector(outputSlots));
1775}
1776
Finn Williamsb454c5c2021-02-09 15:56:23 +00001777void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001778{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001779
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001780 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001781 m_serializedLayers.push_back(anyLayer);
1782}
1783
Mike Kellya0766c32019-02-19 17:22:07 +00001784template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001785flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001786{
1787 const T* buffer = reinterpret_cast<const T*>(memory);
1788 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1789 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1790 return fbVector;
1791}
1792
Finn Williamsb454c5c2021-02-09 15:56:23 +00001793flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001794{
Mike Kellya0766c32019-02-19 17:22:07 +00001795 // Get the dimensions
1796 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001797 std::vector<bool> specificity;
1798 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1799 // matches the size of dimensions.
1800 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1801 {
1802 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001803
1804 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1805 {
1806 shape.push_back(tensorInfo.GetShape()[dim]);
1807 }
1808 else
1809 {
1810 shape.push_back(0);
1811 }
Colm Donelan800b2812021-02-12 12:43:35 +00001812 }
1813
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001814 if (tensorInfo.HasPerAxisQuantization())
1815 {
1816 // Create FlatBuffer TensorInfo
1817 auto flatBufferTensorInfo =
1818 serializer::CreateTensorInfo(m_flatBufferBuilder,
1819 m_flatBufferBuilder.CreateVector(shape),
1820 GetFlatBufferDataType(tensorInfo.GetDataType()),
1821 tensorInfo.GetQuantizationScales()[0],
1822 tensorInfo.GetQuantizationOffset(),
1823 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001824 tensorInfo.GetQuantizationDim().value(),
1825 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001826 (tensorInfo.GetShape().GetDimensionality()),
1827 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001828 return flatBufferTensorInfo;
1829 }
1830
Mike Kellya0766c32019-02-19 17:22:07 +00001831 // Create FlatBuffer TensorInfo
1832 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1833 m_flatBufferBuilder.CreateVector(shape),
1834 GetFlatBufferDataType(tensorInfo.GetDataType()),
1835 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001836 tensorInfo.GetQuantizationOffset(),
1837 0,
1838 0,
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
1845flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001846 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001847{
1848 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1849
Mike Kellya0766c32019-02-19 17:22:07 +00001850 flatbuffers::Offset<void> fbPayload;
1851
1852 switch (tensorInfo.GetDataType())
1853 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001854 case armnn::DataType::Signed64:
1855 {
1856 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1857 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1858 m_flatBufferBuilder,
1859 fbVector);
1860 fbPayload = flatBuffersData.o;
1861 break;
1862 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001863 case armnn::DataType::Float32:
1864 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001865 {
1866 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1867 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1868 m_flatBufferBuilder,
1869 fbVector);
1870 fbPayload = flatBuffersData.o;
1871 break;
1872 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001873 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001874 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001875 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001876 {
1877 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1878 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1879 m_flatBufferBuilder,
1880 fbVector);
1881 fbPayload = flatBuffersData.o;
1882 break;
1883 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001884 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001885 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001886 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001887 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001888 default:
1889 {
1890 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1891 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1892 m_flatBufferBuilder,
1893 fbVector);
1894 fbPayload = flatBuffersData.o;
1895 }
1896 }
1897 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1898 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001899 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001900 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1901 fbPayload);
1902 return flatBufferConstTensor;
1903}
1904
Finn Williamsb454c5c2021-02-09 15:56:23 +00001905flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001906{
1907 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1908 serializer::CreateFeatureCompatibilityVersions(
1909 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001910 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001911 1, // Weights layout scheme version
1912 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001913 );
1914 return versionsTable;
1915}
1916
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001917std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001918 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001919{
Mike Kellya0766c32019-02-19 17:22:07 +00001920 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001921
1922 // Get the InputSlots
1923 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1924 {
1925 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1926
1927 // Get the Connection for the InputSlot
1928 const IOutputSlot* connection = inputSlot.GetConnection();
1929
1930 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001931 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1932 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001933 // Create FlatBuffer InputSlot
1934 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1935 }
1936 return inputSlots;
1937}
1938
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001939std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001940 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001941{
1942 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1943
1944 // Get the OutputSlots
1945 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1946 {
1947 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001948 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001949
Mike Kelly8c1701a2019-02-11 17:01:27 +00001950 // Create FlatBuffer Outputslot
1951 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1952 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001953 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001954 }
1955 return outputSlots;
1956}
1957
Finn Williamsb454c5c2021-02-09 15:56:23 +00001958void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1959 const BaseDescriptor& descriptor,
1960 const std::vector<armnn::ConstTensor>& constants,
1961 const char* name,
1962 const armnn::LayerBindingId id)
1963{
1964 IgnoreUnused(constants);
1965
1966 switch (layer->GetType())
1967 {
1968 case armnn::LayerType::Activation :
1969 {
1970 const armnn::ActivationDescriptor& layerDescriptor =
1971 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1972 SerializeActivationLayer(layer, layerDescriptor, name);
1973 break;
1974 }
1975 case armnn::LayerType::Addition :
1976 {
1977 SerializeAdditionLayer(layer, name);
1978 break;
1979 }
1980 case armnn::LayerType::ArgMinMax :
1981 {
1982 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1983 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1984 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1985 break;
1986 }
1987 case armnn::LayerType::BatchNormalization :
1988 {
1989 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1990 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1991 SerializeBatchNormalizationLayer(layer,
1992 layerDescriptor,
1993 constants,
1994 name);
1995 break;
1996 }
1997 case armnn::LayerType::BatchToSpaceNd :
1998 {
1999 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2000 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2001 SerializeBatchToSpaceNdLayer(layer,
2002 layerDescriptor,
2003 name);
2004 break;
2005 }
mathad01b392e982021-04-07 12:07:30 +01002006 case armnn::LayerType::Cast :
2007 {
2008 SerializeCastLayer(layer, name);
2009 break;
2010 }
Simon Obute51f67772021-09-03 15:50:13 +01002011 case armnn::LayerType::ChannelShuffle :
2012 {
2013 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2014 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2015 SerializeChannelShuffleLayer(layer,
2016 layerDescriptor,
2017 name);
2018 break;
2019 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002020 case armnn::LayerType::Comparison :
2021 {
2022 const armnn::ComparisonDescriptor& layerDescriptor =
2023 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2024 SerializeComparisonLayer(layer,
2025 layerDescriptor,
2026 name);
2027 break;
2028 }
2029 case armnn::LayerType::Concat :
2030 {
2031 const armnn::ConcatDescriptor& layerDescriptor =
2032 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2033 SerializeConcatLayer(layer,
2034 layerDescriptor,
2035 name);
2036 break;
2037 }
2038 case armnn::LayerType::Constant :
2039 {
2040 SerializeConstantLayer(layer,
2041 constants,
2042 name);
2043 break;
2044 }
2045 case armnn::LayerType::Convolution2d :
2046 {
2047 const armnn::Convolution2dDescriptor& layerDescriptor =
2048 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2049 SerializeConvolution2dLayer(layer,
2050 layerDescriptor,
2051 constants,
2052 name);
2053 break;
2054 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002055 case armnn::LayerType::Convolution3d :
2056 {
2057 const armnn::Convolution3dDescriptor& layerDescriptor =
2058 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2059 SerializeConvolution3dLayer(layer,
2060 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002061 name);
2062 break;
2063 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002064 case armnn::LayerType::DepthToSpace :
2065 {
2066 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2067 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2068 SerializeDepthToSpaceLayer(layer,
2069 layerDescriptor,
2070 name);
2071 break;
2072 }
2073 case armnn::LayerType::DepthwiseConvolution2d :
2074 {
2075 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2076 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2077 SerializeDepthwiseConvolution2dLayer(layer,
2078 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002079 name);
2080 break;
2081 }
2082 case armnn::LayerType::Dequantize :
2083 {
2084 SerializeDequantizeLayer(layer,
2085 name);
2086 break;
2087 }
2088 case armnn::LayerType::DetectionPostProcess :
2089 {
2090 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2091 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2092 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2093 break;
2094 }
2095 case armnn::LayerType::Division :
2096 {
2097 SerializeDivisionLayer(layer, name);
2098 break;
2099 }
2100 case armnn::LayerType::ElementwiseUnary :
2101 {
2102 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2103 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2104 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2105 break;
2106 }
2107 case armnn::LayerType::Fill :
2108 {
2109 const armnn::FillDescriptor& layerDescriptor =
2110 static_cast<const armnn::FillDescriptor&>(descriptor);
2111 SerializeFillLayer(layer, layerDescriptor, name);
2112 break;
2113 }
2114 case armnn::LayerType::Floor :
2115 {
2116 SerializeFloorLayer(layer, name);
2117 break;
2118 }
2119 case armnn::LayerType::FullyConnected :
2120 {
2121 const armnn::FullyConnectedDescriptor& layerDescriptor =
2122 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002123 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002124 break;
2125 }
2126 case armnn::LayerType::Gather :
2127 {
2128 const armnn::GatherDescriptor& layerDescriptor =
2129 static_cast<const armnn::GatherDescriptor&>(descriptor);
2130 SerializeGatherLayer(layer, layerDescriptor, name);
2131 break;
2132 }
Teresa Charlin6966bfa2022-04-25 17:14:50 +01002133 case armnn::LayerType::GatherNd :
2134 {
2135 SerializeGatherNdLayer(layer, name);
2136 break;
2137 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002138 case armnn::LayerType::Input:
2139 {
2140 SerializeInputLayer(layer, id, name);
2141 break;
2142 }
2143 case armnn::LayerType::InstanceNormalization :
2144 {
2145 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2146 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2147 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2148 break;
2149 }
2150 case armnn::LayerType::L2Normalization :
2151 {
2152 const armnn::L2NormalizationDescriptor& layerDescriptor =
2153 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2154 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2155 break;
2156 }
2157 case armnn::LayerType::LogicalBinary :
2158 {
2159 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2160 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2161 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2162 break;
2163 }
2164 case armnn::LayerType::LogSoftmax :
2165 {
2166 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2167 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2168 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2169 break;
2170 }
2171 case armnn::LayerType::Lstm :
2172 {
2173 const armnn::LstmDescriptor& layerDescriptor =
2174 static_cast<const armnn::LstmDescriptor&>(descriptor);
2175 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2176 break;
2177 }
2178 case armnn::LayerType::QLstm :
2179 {
2180 const armnn::QLstmDescriptor& layerDescriptor =
2181 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2182 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2183 break;
2184 }
2185 case armnn::LayerType::Maximum :
2186 {
2187 SerializeMaximumLayer(layer, name);
2188 break;
2189 }
2190 case armnn::LayerType::Mean :
2191 {
2192 const armnn::MeanDescriptor& layerDescriptor =
2193 static_cast<const armnn::MeanDescriptor&>(descriptor);
2194 SerializeMeanLayer(layer, layerDescriptor, name);
2195 break;
2196 }
2197 case armnn::LayerType::Merge :
2198 {
2199 SerializeMergeLayer(layer, name);
2200 break;
2201 }
2202 case armnn::LayerType::Minimum :
2203 {
2204 SerializeMinimumLayer(layer, name);
2205 break;
2206 }
2207 case armnn::LayerType::Multiplication :
2208 {
2209 SerializeMultiplicationLayer(layer, name);
2210 break;
2211 }
2212 case armnn::LayerType::Normalization :
2213 {
2214 const armnn::NormalizationDescriptor& layerDescriptor =
2215 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2216 SerializeNormalizationLayer(layer, layerDescriptor, name);
2217 break;
2218 }
2219 case armnn::LayerType::Output:
2220 {
2221 SerializeOutputLayer(layer, id, name);
2222 break;
2223 }
2224 case armnn::LayerType::Pad :
2225 {
2226 const armnn::PadDescriptor& layerDescriptor =
2227 static_cast<const armnn::PadDescriptor&>(descriptor);
2228 SerializePadLayer(layer, layerDescriptor, name);
2229 break;
2230 }
2231 case armnn::LayerType::Permute :
2232 {
2233 const armnn::PermuteDescriptor& layerDescriptor =
2234 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2235 SerializePermuteLayer(layer, layerDescriptor, name);
2236 break;
2237 }
2238 case armnn::LayerType::Pooling2d :
2239 {
2240 const armnn::Pooling2dDescriptor& layerDescriptor =
2241 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2242 SerializePooling2dLayer(layer, layerDescriptor, name);
2243 break;
2244 }
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002245 case armnn::LayerType::Pooling3d :
2246 {
2247 const armnn::Pooling3dDescriptor& layerDescriptor =
2248 static_cast<const armnn::Pooling3dDescriptor&>(descriptor);
2249 SerializePooling3dLayer(layer, layerDescriptor, name);
2250 break;
2251 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002252 case armnn::LayerType::Prelu :
2253 {
2254 SerializePreluLayer(layer, name);
2255 break;
2256 }
2257 case armnn::LayerType::Quantize :
2258 {
2259 SerializeQuantizeLayer(layer, name);
2260 break;
2261 }
2262 case armnn::LayerType::QuantizedLstm:
2263 SerializeQuantizedLstmLayer(layer, constants, name);
2264 break;
2265 case armnn::LayerType::Reshape:
2266 {
2267 const armnn::ReshapeDescriptor &layerDescriptor =
2268 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2269 SerializeReshapeLayer(layer, layerDescriptor, name);
2270 break;
2271 }
2272 case armnn::LayerType::Rank:
2273 {
2274 SerializeRankLayer(layer, name);
2275 break;
2276 }
2277 case armnn::LayerType::Reduce:
2278 {
2279 const armnn::ReduceDescriptor& layerDescriptor =
2280 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2281 SerializeReduceLayer(layer, layerDescriptor, name);
2282 break;
2283 }
2284 case armnn::LayerType::Resize:
2285 {
2286 const armnn::ResizeDescriptor& layerDescriptor =
2287 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2288 SerializeResizeLayer(layer, layerDescriptor, name);
2289 break;
2290 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002291 case armnn::LayerType::Shape:
2292 {
2293 SerializeShapeLayer(layer, name);
2294 break;
2295 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002296 case armnn::LayerType::Slice:
2297 {
2298 const armnn::SliceDescriptor& layerDescriptor =
2299 static_cast<const armnn::SliceDescriptor&>(descriptor);
2300 SerializeSliceLayer(layer, layerDescriptor, name);
2301 break;
2302 }
2303 case armnn::LayerType::Softmax:
2304 {
2305 const armnn::SoftmaxDescriptor& layerDescriptor =
2306 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2307 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2308 break;
2309 }
2310 case armnn::LayerType::SpaceToBatchNd:
2311 {
2312 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2313 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2314 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2315 break;
2316 }
2317 case armnn::LayerType::SpaceToDepth:
2318 {
2319 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2320 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2321 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2322 break;
2323 }
2324 case armnn::LayerType::Splitter:
2325 {
2326 const armnn::SplitterDescriptor& layerDescriptor =
2327 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2328 SerializeSplitterLayer(layer, layerDescriptor, name);
2329 break;
2330 }
2331 case armnn::LayerType::Stack:
2332 {
2333 const armnn::StackDescriptor& layerDescriptor =
2334 static_cast<const armnn::StackDescriptor&>(descriptor);
2335 SerializeStackLayer(layer, layerDescriptor, name);
2336 break;
2337 }
2338 case armnn::LayerType::StandIn:
2339 {
2340 const armnn::StandInDescriptor& layerDescriptor =
2341 static_cast<const armnn::StandInDescriptor&>(descriptor);
2342 SerializeStandInLayer(layer, layerDescriptor, name);
2343 break;
2344 }
2345 case armnn::LayerType::StridedSlice:
2346 {
2347 const armnn::StridedSliceDescriptor& layerDescriptor =
2348 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2349 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2350 break;
2351 }
2352 case armnn::LayerType::Subtraction:
2353 {
2354 SerializeSubtractionLayer(layer, name);
2355 break;
2356 }
2357 case armnn::LayerType::Switch:
2358 {
2359 SerializeSwitchLayer(layer, name);
2360 break;
2361 }
2362 case armnn::LayerType::Transpose:
2363 {
2364 const armnn::TransposeDescriptor& layerDescriptor =
2365 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2366 SerializeTransposeLayer(layer, layerDescriptor, name);
2367 break;
2368 }
2369 case armnn::LayerType::TransposeConvolution2d:
2370 {
2371 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2372 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2373 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2374 break;
2375 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002376 case armnn::LayerType::UnidirectionalSequenceLstm :
2377 {
2378 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2379 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2380 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2381 break;
2382 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002383 default:
2384 {
2385 throw InvalidArgumentException(
2386 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2387 layer->GetName(),
2388 id));
2389 }
2390 }
2391}
2392
Finn Williams85d36712021-01-26 22:30:06 +00002393void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002394{
2395 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002396 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2397 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002398
2399 // Create FlatBuffer SerializedGraph
2400 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002401 fbBuilder,
2402 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2403 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2404 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2405 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002406
2407 // Serialize the graph
2408 fbBuilder.Finish(serializedGraph);
2409}
2410
Finn Williamsb454c5c2021-02-09 15:56:23 +00002411
Finn Williams85d36712021-01-26 22:30:06 +00002412bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002413{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002414 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002415
Matthew Sloyan0663d662020-09-14 11:47:26 +01002416 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002417 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002418 return !stream.bad();
2419}
2420
Finn Williams2605b232020-06-10 15:53:46 +01002421} // namespace armnnSerializer