blob: 488dac618688792cb57949f0fe90f754f84d6d9d [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,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000350 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000351{
Jan Eilers8eb25602020-03-09 12:13:48 +0000352 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000353
Mike Kellya0766c32019-02-19 17:22:07 +0000354 // Create FlatBuffer BaseLayer
355 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
356
357 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
358 descriptor.m_PadLeft,
359 descriptor.m_PadRight,
360 descriptor.m_PadTop,
361 descriptor.m_PadBottom,
362 descriptor.m_StrideX,
363 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100364 descriptor.m_DilationX,
365 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000366 descriptor.m_BiasEnabled,
367 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Mike Kellya0766c32019-02-19 17:22:07 +0000368
369 // Create the FlatBuffer Convolution2dLayer
370 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
371 flatBufferBaseLayer,
Keith Davis2cddc722022-04-07 11:32:00 +0100372 flatBufferDescriptor);
Mike Kellya0766c32019-02-19 17:22:07 +0000373
374 // Add the AnyLayer to the FlatBufferLayers
375 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
376}
377
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100378// Build FlatBuffer for Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100379void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
380 const armnn::Convolution3dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100381 const char* name)
382{
383 IgnoreUnused(name);
384
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100385 // Create FlatBuffer BaseLayer
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100386 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100387
388 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
389 descriptor.m_PadLeft,
390 descriptor.m_PadRight,
391 descriptor.m_PadTop,
392 descriptor.m_PadBottom,
393 descriptor.m_PadFront,
394 descriptor.m_PadBack,
395 descriptor.m_StrideX,
396 descriptor.m_StrideY,
397 descriptor.m_StrideZ,
398 descriptor.m_DilationX,
399 descriptor.m_DilationY,
400 descriptor.m_DilationZ,
401 descriptor.m_BiasEnabled,
402 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100403
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100404 // Create the FlatBuffer Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100405 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
406 flatBufferBaseLayer,
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100407 flatBufferDescriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100408
409 // Add the AnyLayer to the FlatBufferLayers
410 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
411}
412
Finn Williamsb454c5c2021-02-09 15:56:23 +0000413void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100414 const armnn::DepthToSpaceDescriptor& descriptor,
415 const char* name)
416{
Jan Eilers8eb25602020-03-09 12:13:48 +0000417 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000418
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100419 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
420 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
421 descriptor.m_BlockSize,
422 GetFlatBufferDataLayout(descriptor.m_DataLayout));
423
424 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
425
426 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100427}
428
Finn Williamsb454c5c2021-02-09 15:56:23 +0000429void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
430 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000431 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000432{
Jan Eilers8eb25602020-03-09 12:13:48 +0000433 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000434
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000435 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
436 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
437 descriptor.m_PadLeft,
438 descriptor.m_PadRight,
439 descriptor.m_PadTop,
440 descriptor.m_PadBottom,
441 descriptor.m_StrideX,
442 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100443 descriptor.m_DilationX,
444 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000445 descriptor.m_BiasEnabled,
446 GetFlatBufferDataLayout(descriptor.m_DataLayout));
447
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000448 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
449 fbBaseLayer,
Cathal Corbett06902652022-04-14 17:55:11 +0100450 fbDescriptor);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000451
452 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
453}
454
Finn Williamsb454c5c2021-02-09 15:56:23 +0000455void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000456 const char* name)
457{
Jan Eilers8eb25602020-03-09 12:13:48 +0000458 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000459
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000460 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
461 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
462
463 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
464}
465
Finn Williamsb454c5c2021-02-09 15:56:23 +0000466void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
467 const armnn::DetectionPostProcessDescriptor& descriptor,
468 const std::vector<armnn::ConstTensor>& constants,
469 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000470{
Jan Eilers8eb25602020-03-09 12:13:48 +0000471 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000472
Finn Williamsb454c5c2021-02-09 15:56:23 +0000473 const armnn::ConstTensor& anchors = constants[0];
474
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000475 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
476 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
477 descriptor.m_MaxDetections,
478 descriptor.m_MaxClassesPerDetection,
479 descriptor.m_DetectionsPerClass,
480 descriptor.m_NmsScoreThreshold,
481 descriptor.m_NmsIouThreshold,
482 descriptor.m_NumClasses,
483 descriptor.m_UseRegularNms,
484 descriptor.m_ScaleX,
485 descriptor.m_ScaleY,
486 descriptor.m_ScaleW,
487 descriptor.m_ScaleH);
488
489 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
490
491 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
492 fbBaseLayer,
493 fbDescriptor,
494 fbAnchorsConstTensorInfo);
495
496 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
497}
498
Finn Williamsb454c5c2021-02-09 15:56:23 +0000499void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000500{
Jan Eilers8eb25602020-03-09 12:13:48 +0000501 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000502
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000503 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
504 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000505
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000506 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
507}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000508
Finn Williamsb454c5c2021-02-09 15:56:23 +0000509void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600510 const armnn::ElementwiseUnaryDescriptor& descriptor,
511 const char* name)
512{
Jan Eilers8eb25602020-03-09 12:13:48 +0000513 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600514
515 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
516 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
517 m_flatBufferBuilder,
518 GetFlatBufferUnaryOperation(descriptor.m_Operation));
519
520 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
521 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
522}
523
Finn Williamsb454c5c2021-02-09 15:56:23 +0000524void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100525 const armnn::FillDescriptor& fillDescriptor,
526 const char* name)
527{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100528 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100529
530 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
531
532 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
533
534 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
535
536 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100537}
538
Finn Williamsb454c5c2021-02-09 15:56:23 +0000539void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000540{
Jan Eilers8eb25602020-03-09 12:13:48 +0000541 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000542
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000543 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
544 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
545
546 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
547}
548
Finn Williamsb454c5c2021-02-09 15:56:23 +0000549void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100550 const armnn::GatherDescriptor& gatherDescriptor,
551 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000552{
Jan Eilers8eb25602020-03-09 12:13:48 +0000553 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000554
Teresa Charlin52664732020-06-29 16:27:03 +0100555 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
556 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000557 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100558 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000559
560 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
561}
562
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100563void SerializerStrategy::SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
564 const char* name)
565{
566 IgnoreUnused(name);
567
568 auto fbGatherNdBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_GatherNd);
569 auto flatBufferLayer = serializer::CreateGatherNdLayer(m_flatBufferBuilder, fbGatherNdBaseLayer);
570
571 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherNdLayer);
572}
573
Finn Williamsb454c5c2021-02-09 15:56:23 +0000574void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100575 const armnn::IConnectableLayer* layer,
576 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
577 const char* name)
578{
Jan Eilers8eb25602020-03-09 12:13:48 +0000579 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000580
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100581 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
582 m_flatBufferBuilder,
583 instanceNormalizationDescriptor.m_Gamma,
584 instanceNormalizationDescriptor.m_Beta,
585 instanceNormalizationDescriptor.m_Eps,
586 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
587
588 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
589 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
590
591 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100592}
593
Finn Williamsb454c5c2021-02-09 15:56:23 +0000594void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000595 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
596 const char* name)
597{
Jan Eilers8eb25602020-03-09 12:13:48 +0000598 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000599
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000600 // Create FlatBuffer BaseLayer
601 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
602
603 // Create the FlatBuffer L2Normalization Descriptor
604 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100605 m_flatBufferBuilder,
606 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
607 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000608
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100609 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000610 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
611
612 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
613}
614
Finn Williamsb454c5c2021-02-09 15:56:23 +0000615void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000616 const armnn::LogicalBinaryDescriptor& descriptor,
617 const char* name)
618{
619 IgnoreUnused(name);
620
621 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
622 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
623 m_flatBufferBuilder,
624 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
625
626 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
627 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
628}
629
Finn Williamsb454c5c2021-02-09 15:56:23 +0000630void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100631 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
632 const char* name)
633{
Jan Eilers8eb25602020-03-09 12:13:48 +0000634 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000635
Sadik Armagan26257852019-10-14 13:00:47 +0100636 // Create FlatBuffer BaseLayer
637 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
638
639 // Create the FlatBuffer LogSoftmaxDescriptor
640 auto flatBufferLogSoftmaxDesc =
641 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
642 logSoftmaxDescriptor.m_Beta,
643 logSoftmaxDescriptor.m_Axis);
644
645 // Create the FlatBuffer LogSoftmaxLayer
646 auto flatBufferLogSoftmaxLayer =
647 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
648 flatBufferLogSoftmaxBaseLayer,
649 flatBufferLogSoftmaxDesc);
650
651 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100652}
653
Finn Williamsb454c5c2021-02-09 15:56:23 +0000654void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
655 const armnn::LstmDescriptor& descriptor,
656 const std::vector<armnn::ConstTensor>& constants,
657 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000658{
Jan Eilers8eb25602020-03-09 12:13:48 +0000659 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000660
Jim Flynn11af3752019-03-19 17:22:29 +0000661 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
662
663 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
664 m_flatBufferBuilder,
665 descriptor.m_ActivationFunc,
666 descriptor.m_ClippingThresCell,
667 descriptor.m_ClippingThresProj,
668 descriptor.m_CifgEnabled,
669 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100670 descriptor.m_ProjectionEnabled,
671 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000672
Finn Williamsb454c5c2021-02-09 15:56:23 +0000673 // Index for constants vector
674 std::size_t i = 0;
675
676 // Get mandatory/basic input parameters
677 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
678 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
679 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
680 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
681 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
682 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
683 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
684 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
685 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
686
687
Jim Flynn11af3752019-03-19 17:22:29 +0000688
689 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
690 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
691 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
692 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
693 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
694 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
695 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
696 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
697 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100698 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
699 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
700 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
701 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000702
703 if (!descriptor.m_CifgEnabled)
704 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000705 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
706 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
707 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000708 }
709
710 if (descriptor.m_PeepholeEnabled)
711 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000712 if (!descriptor.m_CifgEnabled)
713 {
714 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
715 }
716 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
717 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
718 }
719
720 if (descriptor.m_ProjectionEnabled)
721 {
722 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
723 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000724 }
725
Jan Eilersf8c62972019-07-17 11:07:49 +0100726 if (descriptor.m_LayerNormEnabled)
727 {
728 if (!descriptor.m_CifgEnabled)
729 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000730 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100731 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000732 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
733 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
734 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100735 }
736
Jim Flynn11af3752019-03-19 17:22:29 +0000737 auto fbLstmParams = serializer::CreateLstmInputParams(
738 m_flatBufferBuilder,
739 inputToForgetWeights,
740 inputToCellWeights,
741 inputToOutputWeights,
742 recurrentToForgetWeights,
743 recurrentToCellWeights,
744 recurrentToOutputWeights,
745 forgetGateBias,
746 cellBias,
747 outputGateBias,
748 inputToInputWeights,
749 recurrentToInputWeights,
750 cellToInputWeights,
751 inputGateBias,
752 projectionWeights,
753 projectionBias,
754 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100755 cellToOutputWeights,
756 inputLayerNormWeights,
757 forgetLayerNormWeights,
758 cellLayerNormWeights,
759 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000760
761 auto fbLstmLayer = serializer::CreateLstmLayer(
762 m_flatBufferBuilder,
763 fbLstmBaseLayer,
764 fbLstmDescriptor,
765 fbLstmParams);
766
767 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
768}
769
Finn Williamsb454c5c2021-02-09 15:56:23 +0000770void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000771{
Jan Eilers8eb25602020-03-09 12:13:48 +0000772 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000773
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000774 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
775 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
776
777 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
778}
779
Finn Williamsb454c5c2021-02-09 15:56:23 +0000780void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000781 const armnn::MeanDescriptor& descriptor,
782 const char* name)
783{
Jan Eilers8eb25602020-03-09 12:13:48 +0000784 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000785
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000786 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
787 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
788 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
789 descriptor.m_KeepDims);
790
791 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
792 fbMeanBaseLayer,
793 fbMeanDescriptor);
794
795 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
796}
797
Finn Williamsb454c5c2021-02-09 15:56:23 +0000798void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000799{
Jan Eilers8eb25602020-03-09 12:13:48 +0000800 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000801
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000802 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
803 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
804
805 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
806}
807
Finn Williamsb454c5c2021-02-09 15:56:23 +0000808void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100809{
Jan Eilers8eb25602020-03-09 12:13:48 +0000810 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000811
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100812 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
813 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
814
815 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
816}
817
Finn Williamsb454c5c2021-02-09 15:56:23 +0000818void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100819 const armnn::ConcatDescriptor& concatDescriptor,
820 const char* name)
821{
Jan Eilers8eb25602020-03-09 12:13:48 +0000822 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000823
Jim Flynne242f2d2019-05-22 14:24:13 +0100824 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000825
826 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100827 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000828 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100829 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000830 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100831 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000832 {
833 origins.push_back(origin[d]);
834 }
835 auto view = m_flatBufferBuilder.CreateVector(origins);
836 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
837 views.push_back(uintVector);
838 }
839
Jim Flynne242f2d2019-05-22 14:24:13 +0100840 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
841 concatDescriptor.GetConcatAxis(),
842 concatDescriptor.GetNumViews(),
843 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000844 m_flatBufferBuilder.CreateVector(views));
845
Jim Flynne242f2d2019-05-22 14:24:13 +0100846 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
847 flatBufferConcatBaseLayer,
848 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000849
Jim Flynne242f2d2019-05-22 14:24:13 +0100850 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000851}
852
Finn Williamsb454c5c2021-02-09 15:56:23 +0000853void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000854{
Jan Eilers8eb25602020-03-09 12:13:48 +0000855 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000856
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000857 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
858 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
859 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000860
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000861 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000862}
863
Finn Williamsb454c5c2021-02-09 15:56:23 +0000864void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000865 const armnn::PadDescriptor& padDescriptor,
866 const char* name)
867{
Jan Eilers8eb25602020-03-09 12:13:48 +0000868 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000869
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000870 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
871
872 std::vector<unsigned int> padList;
873 for (auto& p: padDescriptor.m_PadList)
874 {
875 padList.push_back(p.first);
876 padList.push_back(p.second);
877 }
878
879 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100880 m_flatBufferBuilder.CreateVector(padList),
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +0100881 padDescriptor.m_PadValue,
882 GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000883
884 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
885 flatBufferBaseLayer,
886 flatBufferPadDesc);
887
888 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
889}
890
Finn Williamsb454c5c2021-02-09 15:56:23 +0000891void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000892 const armnn::PermuteDescriptor& permuteDescriptor,
893 const char* name)
894{
Jan Eilers8eb25602020-03-09 12:13:48 +0000895 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000896
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000897 // Create FlatBuffer BaseLayer
898 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
899
900 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100901 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000902 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100903 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000904 }
905
906 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
907 m_flatBufferBuilder.CreateVector(dimMappings));
908
909 // Create the FlatBuffer PermuteLayer
910 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
911 flatBufferPermuteBaseLayer,
912 flatBufferPermuteDesc);
913
914 // Add the AnyLayer to the FlatBufferLayers
915 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
916}
917
Finn Williams2605b232020-06-10 15:53:46 +0100918// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000919void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100920 const char* name)
921{
922 IgnoreUnused(name);
923 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
924 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
925
926 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
927}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000928
Finn Williamsb454c5c2021-02-09 15:56:23 +0000929void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
930 const armnn::ReduceDescriptor& reduceDescriptor,
931 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000932{
933 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
934 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000935 reduceDescriptor.m_KeepDims,
936 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
937 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
938 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
939 fbReduceBaseLayer,
940 fbDescriptor);
941
942 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
943}
944
Saoirse Stewart263829c2019-02-19 15:54:14 +0000945// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000946void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000947 const armnn::ReshapeDescriptor& reshapeDescriptor,
948 const char* name)
949{
Jan Eilers8eb25602020-03-09 12:13:48 +0000950 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000951
Saoirse Stewart263829c2019-02-19 15:54:14 +0000952 // Create FlatBuffer BaseLayer
953 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
954
955 std::vector<unsigned int> targetShape;
956 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
957 {
958 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
959 }
960
961 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
962 m_flatBufferBuilder.CreateVector(targetShape));
963
964 // Create the FlatBuffer ReshapeLayer
965 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
966 flatBufferReshapeDesc);
967
968 // Add the AnyLayer to the FlatBufferLayers
969 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
970}
971
Finn Williamsb454c5c2021-02-09 15:56:23 +0000972void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +0100973 const armnn::ResizeDescriptor& resizeDescriptor,
974 const char* name)
975{
Jan Eilers8eb25602020-03-09 12:13:48 +0000976 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000977
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100978 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
979
980 auto flatBufferDescriptor =
981 CreateResizeDescriptor(m_flatBufferBuilder,
982 resizeDescriptor.m_TargetHeight,
983 resizeDescriptor.m_TargetWidth,
984 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100985 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
986 resizeDescriptor.m_AlignCorners,
987 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100988
989 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
990 flatBufferBaseLayer,
991 flatBufferDescriptor);
992
993 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100994}
995
Finn Williamsb454c5c2021-02-09 15:56:23 +0000996void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100997 const armnn::SliceDescriptor& sliceDescriptor,
998 const char* name)
999{
Jan Eilers8eb25602020-03-09 12:13:48 +00001000 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001001
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001002 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1003 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1004 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1005 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1006
1007 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1008
1009 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001010}
1011
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001012// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001013void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001014 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001015 const char* name)
1016{
Jan Eilers8eb25602020-03-09 12:13:48 +00001017 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001018
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001019 // Create FlatBuffer BaseLayer
1020 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1021
1022 // Create the FlatBuffer SoftmaxDescriptor
1023 auto flatBufferSoftmaxDesc =
Sadik Armaganfd0cae32021-11-08 17:18:31 +00001024 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder,
1025 softmaxDescriptor.m_Beta,
1026 softmaxDescriptor.m_Axis);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001027
1028 // Create the FlatBuffer SoftmaxLayer
1029 auto flatBufferSoftmaxLayer =
1030 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1031 flatBufferSoftmaxBaseLayer,
1032 flatBufferSoftmaxDesc);
1033
1034 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1035}
1036
Finn Williamsb454c5c2021-02-09 15:56:23 +00001037void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001038 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001039 const char* name)
1040{
Jan Eilers8eb25602020-03-09 12:13:48 +00001041 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001042
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001043 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1044 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1045 m_flatBufferBuilder,
1046 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1047 pooling2dDescriptor.m_PadLeft,
1048 pooling2dDescriptor.m_PadRight,
1049 pooling2dDescriptor.m_PadTop,
1050 pooling2dDescriptor.m_PadBottom,
1051 pooling2dDescriptor.m_PoolWidth,
1052 pooling2dDescriptor.m_PoolHeight,
1053 pooling2dDescriptor.m_StrideX,
1054 pooling2dDescriptor.m_StrideY,
1055 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1056 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1057 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1058
1059 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1060 fbPooling2dBaseLayer,
1061 fbPooling2dDescriptor);
1062
1063 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1064}
1065
Tamas Nyirid998a1c2021-11-05 14:55:33 +00001066void SerializerStrategy::SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
1067 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
1068 const char* name)
1069{
1070 IgnoreUnused(name);
1071
1072 auto fbPooling3dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling3d);
1073 auto fbPooling3dDescriptor = serializer::CreatePooling3dDescriptor(
1074 m_flatBufferBuilder,
1075 GetFlatBufferPoolingAlgorithm(pooling3dDescriptor.m_PoolType),
1076 pooling3dDescriptor.m_PadLeft,
1077 pooling3dDescriptor.m_PadRight,
1078 pooling3dDescriptor.m_PadTop,
1079 pooling3dDescriptor.m_PadBottom,
1080 pooling3dDescriptor.m_PadFront,
1081 pooling3dDescriptor.m_PadBack,
1082 pooling3dDescriptor.m_PoolWidth,
1083 pooling3dDescriptor.m_PoolHeight,
1084 pooling3dDescriptor.m_PoolDepth,
1085 pooling3dDescriptor.m_StrideX,
1086 pooling3dDescriptor.m_StrideY,
1087 pooling3dDescriptor.m_StrideZ,
1088 GetFlatBufferOutputShapeRounding(pooling3dDescriptor.m_OutputShapeRounding),
1089 GetFlatBufferPaddingMethod(pooling3dDescriptor.m_PaddingMethod),
1090 GetFlatBufferDataLayout(pooling3dDescriptor.m_DataLayout));
1091
1092 auto fbPooling3dLayer = serializer::CreatePooling3dLayer(m_flatBufferBuilder,
1093 fbPooling3dBaseLayer,
1094 fbPooling3dDescriptor);
1095
1096 CreateAnyLayer(fbPooling3dLayer.o, serializer::Layer::Layer_Pooling3dLayer);
1097}
1098
Finn Williamsb454c5c2021-02-09 15:56:23 +00001099void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001100 const char* name)
1101{
Jan Eilers8eb25602020-03-09 12:13:48 +00001102 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001103
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001104 // Create FlatBuffer BaseLayer
1105 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1106
1107 // Create the FlatBuffer AdditionLayer
1108 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1109
1110 // Add the AnyLayer to the FlatBufferLayers
1111 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001112}
1113
Finn Williamsb454c5c2021-02-09 15:56:23 +00001114void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001115{
Jan Eilers8eb25602020-03-09 12:13:48 +00001116 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001117
Derek Lamberti87acb272019-03-27 16:51:31 +00001118 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1119 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1120 fbQuantizeBaseLayer);
1121 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1122}
1123
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001124// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001125void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1126 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001127 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001128{
1129 // Create FlatBuffer BaseLayer
1130 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1131
1132 // Create FlatBuffer FullyConnectedDescriptor
1133 auto flatBufferDescriptor =
1134 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1135 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001136 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1137 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001138
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001139 // Create FlatBuffer FullyConnectedLayer
1140 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1141 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001142 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001143
1144 // Add created FullyConnectedLayer to the FlatBufferLayers
1145 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1146}
1147
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001148// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001149void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001150 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1151 const char* name)
1152{
Jan Eilers8eb25602020-03-09 12:13:48 +00001153 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001154
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001155 // Create FlatBuffer BaseLayer
1156 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1157
1158 std::vector<unsigned int> padList;
1159 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1160 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1161 {
1162 padList.push_back(pad.first);
1163 padList.push_back(pad.second);
1164 }
1165
1166 auto flatBufferDescriptor =
1167 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1168 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1169 m_flatBufferBuilder.CreateVector(padList),
1170 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1171
1172 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1173 flatBufferBaseLayer,
1174 flatBufferDescriptor);
1175
1176 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1177}
1178
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001179// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001180void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001181 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1182 const char* name)
1183{
Jan Eilers8eb25602020-03-09 12:13:48 +00001184 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001185
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001186 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1187 auto flatBufferDescriptor =
1188 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1189 spaceToDepthDescriptor.m_BlockSize,
1190 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1191
1192 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1193 flatBufferBaseLayer,
1194 flatBufferDescriptor);
1195
1196 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001197}
1198
Jim Flynn18ce3382019-03-08 11:08:30 +00001199// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001200void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001201 const armnn::ViewsDescriptor& viewsDescriptor,
1202 const char* name)
1203{
Jan Eilers8eb25602020-03-09 12:13:48 +00001204 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001205
Jim Flynn18ce3382019-03-08 11:08:30 +00001206 // Create FlatBuffer ViewOrigins
1207 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1208 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1209
1210 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1211 {
1212 std::vector<uint32_t> viewOrigin;
1213 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1214
1215 // Copy vector
1216 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1217 {
1218 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1219 }
1220
1221 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1222 m_flatBufferBuilder.CreateVector(viewOrigin)));
1223 }
1224
1225 // Create FlatBuffer OriginsDescriptor
1226 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1227 viewsDescriptor.GetOrigins().GetConcatAxis(),
1228 viewsDescriptor.GetOrigins().GetNumViews(),
1229 viewsDescriptor.GetOrigins().GetNumDimensions(),
1230 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1231
1232 // Create FlatBuffer ViewOrigins
1233 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1234 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1235
1236 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1237 {
1238 std::vector<uint32_t> viewSize;
1239 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1240
1241 // Copy vector
1242 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1243 {
1244 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1245 }
1246
1247 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1248 m_flatBufferBuilder.CreateVector(viewSize)));
1249 }
1250
1251 // Create FlatBuffer ViewsDescriptor
1252 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1253 flatBufferOriginDescriptor,
1254 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1255
1256 // Create FlatBuffer BaseLayer
1257 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1258
1259 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1260 flatBufferBaseLayer,
1261 flatBufferViewsDescriptor);
1262
1263 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1264}
1265
Finn Williamsb454c5c2021-02-09 15:56:23 +00001266void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001267 const armnn::NormalizationDescriptor& descriptor,
1268 const char* name)
1269{
Jan Eilers8eb25602020-03-09 12:13:48 +00001270 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001271
Nina Drozd57728782019-02-27 10:53:27 +00001272 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1273
1274 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1275 m_flatBufferBuilder,
1276 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1277 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1278 descriptor.m_NormSize,
1279 descriptor.m_Alpha,
1280 descriptor.m_Beta,
1281 descriptor.m_K,
1282 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1283
1284 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1285 fbNormalizationBaseLayer,
1286 fbNormalizationDescriptor);
1287
1288 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1289}
1290
Keith Davis3ae3f972021-05-21 16:33:48 +01001291void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1292 const char* name)
1293{
1294 IgnoreUnused(name);
1295
1296 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1297 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1298
1299 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1300}
1301
Finn Williamsb454c5c2021-02-09 15:56:23 +00001302void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001303 const armnn::StackDescriptor& stackDescriptor,
1304 const char* name)
1305{
Jan Eilers8eb25602020-03-09 12:13:48 +00001306 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001307
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001308 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1309
1310 std::vector<unsigned int> inputShape;
1311 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1312 {
1313 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1314 }
1315
1316 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1317 stackDescriptor.m_Axis,
1318 stackDescriptor.m_NumInputs,
1319 m_flatBufferBuilder.CreateVector(inputShape));
1320
1321 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1322 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001323}
1324
Finn Williamsb454c5c2021-02-09 15:56:23 +00001325void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001326 const armnn::StandInDescriptor& standInDescriptor,
1327 const char *name)
1328{
Jan Eilers8eb25602020-03-09 12:13:48 +00001329 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001330
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001331 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1332 standInDescriptor.m_NumInputs,
1333 standInDescriptor.m_NumOutputs);
1334
1335 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1336 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1337
1338 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001339}
1340
Finn Williamsb454c5c2021-02-09 15:56:23 +00001341void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001342 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1343 const char* name)
1344{
Jan Eilers8eb25602020-03-09 12:13:48 +00001345 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001346
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001347 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1348
1349 auto flatBufferDescriptor =
1350 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1351 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1352 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1353 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1354 stridedSliceDescriptor.m_BeginMask,
1355 stridedSliceDescriptor.m_EndMask,
1356 stridedSliceDescriptor.m_ShrinkAxisMask,
1357 stridedSliceDescriptor.m_EllipsisMask,
1358 stridedSliceDescriptor.m_NewAxisMask,
1359 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1360
1361 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1362 flatBufferBaseLayer,
1363 flatBufferDescriptor);
1364
1365 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1366}
1367
Finn Williamsb454c5c2021-02-09 15:56:23 +00001368void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001369{
Jan Eilers8eb25602020-03-09 12:13:48 +00001370 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001371
Conor Kennedyda1f9752019-03-01 14:37:12 +00001372 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1373 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1374
1375 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1376}
1377
Finn Williamsb454c5c2021-02-09 15:56:23 +00001378void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001379{
Jan Eilers8eb25602020-03-09 12:13:48 +00001380 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001381
Sadik Armaganeff363d2019-04-05 15:25:46 +01001382 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1383 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1384
1385 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1386}
1387
Finn Williamsb454c5c2021-02-09 15:56:23 +00001388void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001389 const armnn::IConnectableLayer* layer,
1390 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001391 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001392 const char* name)
1393{
Jan Eilers8eb25602020-03-09 12:13:48 +00001394 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001395
Finn Williamsb454c5c2021-02-09 15:56:23 +00001396 const armnn::ConstTensor& weights = constants.at(0);
1397
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001398 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1399 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1400 descriptor.m_PadLeft,
1401 descriptor.m_PadRight,
1402 descriptor.m_PadTop,
1403 descriptor.m_PadBottom,
1404 descriptor.m_StrideX,
1405 descriptor.m_StrideY,
1406 descriptor.m_BiasEnabled,
1407 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1408
1409 // weights & biases
1410 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1411 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001412 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001413 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001414 const armnn::ConstTensor& biases = constants.at(1);
1415 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001416 }
1417
1418 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1419 fbBaseLayer,
1420 fbDescriptor,
1421 fbWeightsConstTensorInfo,
1422 fbBiasesConstTensorInfo);
1423
1424 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001425}
1426
Finn Williamsb454c5c2021-02-09 15:56:23 +00001427void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001428 const armnn::TransposeDescriptor& descriptor,
1429 const char* name)
1430{
Jan Eilers8eb25602020-03-09 12:13:48 +00001431 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001432
1433 // Create FlatBuffer BaseLayer
1434 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1435
1436 std::vector<unsigned int> dimMappings;
1437 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1438 {
1439 dimMappings.push_back(descriptor.m_DimMappings[i]);
1440 }
1441
1442 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1443 m_flatBufferBuilder.CreateVector(dimMappings));
1444
1445 // Create the FlatBuffer TransposeLayer
1446 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1447 flatBufferBaseLayer,
1448 flatBufferDesc);
1449
1450 // Add the AnyLayer to the FlatBufferLayers
1451 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1452}
1453
Finn Williamsb454c5c2021-02-09 15:56:23 +00001454void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1455 const armnn::QLstmDescriptor& descriptor,
1456 const std::vector<armnn::ConstTensor>& constants,
1457 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001458{
James Conroy8d333182020-05-13 10:27:58 +01001459 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001460
James Conroy8d333182020-05-13 10:27:58 +01001461 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1462
1463 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1464 m_flatBufferBuilder,
1465 descriptor.m_CifgEnabled,
1466 descriptor.m_PeepholeEnabled,
1467 descriptor.m_ProjectionEnabled,
1468 descriptor.m_LayerNormEnabled,
1469 descriptor.m_CellClip,
1470 descriptor.m_ProjectionClip,
1471 descriptor.m_InputIntermediateScale,
1472 descriptor.m_ForgetIntermediateScale,
1473 descriptor.m_CellIntermediateScale,
1474 descriptor.m_OutputIntermediateScale,
1475 descriptor.m_HiddenStateZeroPoint,
1476 descriptor.m_HiddenStateScale
1477 );
1478
Finn Williamsb454c5c2021-02-09 15:56:23 +00001479 // Index for constants vector
1480 std::size_t i = 0;
1481
James Conroy8d333182020-05-13 10:27:58 +01001482 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001483 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1484 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1485 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1486 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1487 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1488 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1489 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1490 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1491 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001492
1493 // CIFG
1494 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1495 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1496 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1497
1498 if (!descriptor.m_CifgEnabled)
1499 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001500 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1501 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1502 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001503 }
1504
1505 // Peephole
1506 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1507 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1508 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1509
1510 if (descriptor.m_PeepholeEnabled)
1511 {
1512 if (!descriptor.m_CifgEnabled)
1513 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001514 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001515 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001516 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1517 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1518 }
James Conroy8d333182020-05-13 10:27:58 +01001519
Finn Williamsb454c5c2021-02-09 15:56:23 +00001520 // Projection
1521 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1522 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1523
1524 if (descriptor.m_ProjectionEnabled)
1525 {
1526 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1527 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001528 }
1529
1530 // Layer norm
1531 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1532 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1533 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1534 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1535
1536 if (descriptor.m_LayerNormEnabled)
1537 {
1538 if (!descriptor.m_CifgEnabled)
1539 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001540 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001541 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001542 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1543 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1544 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001545 }
1546
1547 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1548 m_flatBufferBuilder,
1549 inputToForgetWeights,
1550 inputToCellWeights,
1551 inputToOutputWeights,
1552 recurrentToForgetWeights,
1553 recurrentToCellWeights,
1554 recurrentToOutputWeights,
1555 forgetGateBias,
1556 cellBias,
1557 outputGateBias,
1558 inputToInputWeights,
1559 recurrentToInputWeights,
1560 inputGateBias,
1561 projectionWeights,
1562 projectionBias,
1563 cellToInputWeights,
1564 cellToForgetWeights,
1565 cellToOutputWeights,
1566 inputLayerNormWeights,
1567 forgetLayerNormWeights,
1568 cellLayerNormWeights,
1569 outputLayerNormWeights);
1570
1571 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1572 m_flatBufferBuilder,
1573 fbQLstmBaseLayer,
1574 fbQLstmDescriptor,
1575 fbQLstmParams);
1576
1577 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001578}
1579
Finn Williamsb454c5c2021-02-09 15:56:23 +00001580void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1581 const std::vector<armnn::ConstTensor>& constants,
1582 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001583{
Jan Eilers8eb25602020-03-09 12:13:48 +00001584 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001585
Jan Eilers5b01a892019-07-23 09:47:43 +01001586 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1587
Finn Williamsb454c5c2021-02-09 15:56:23 +00001588 // index for constants vector
1589 size_t i = 0;
1590
Jan Eilers5b01a892019-07-23 09:47:43 +01001591 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001592 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1593 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1594 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1595 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001596
Finn Williamsb454c5c2021-02-09 15:56:23 +00001597 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1598 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1599 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1600 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001601
Finn Williamsb454c5c2021-02-09 15:56:23 +00001602 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1603 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1604 auto cellBias = CreateConstTensorInfo(constants[i++]);
1605 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001606
1607 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1608 m_flatBufferBuilder,
1609 inputToInputWeights,
1610 inputToForgetWeights,
1611 inputToCellWeights,
1612 inputToOutputWeights,
1613 recurrentToInputWeights,
1614 recurrentToForgetWeights,
1615 recurrentToCellWeights,
1616 recurrentToOutputWeights,
1617 inputGateBias,
1618 forgetGateBias,
1619 cellBias,
1620 outputGateBias);
1621
1622 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1623 m_flatBufferBuilder,
1624 fbQuantizedLstmBaseLayer,
1625 fbQuantizedLstmParams);
1626
1627 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001628}
1629
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001630void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1631 const armnn::IConnectableLayer* layer,
1632 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1633 const std::vector<armnn::ConstTensor>& constants,
1634 const char* name)
1635{
1636 IgnoreUnused(name);
1637
1638 auto fbUnidirectionalSequenceLstmBaseLayer =
1639 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1640
1641 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1642 m_flatBufferBuilder,
1643 descriptor.m_ActivationFunc,
1644 descriptor.m_ClippingThresCell,
1645 descriptor.m_ClippingThresProj,
1646 descriptor.m_CifgEnabled,
1647 descriptor.m_PeepholeEnabled,
1648 descriptor.m_ProjectionEnabled,
1649 descriptor.m_LayerNormEnabled,
1650 descriptor.m_TimeMajor);
1651
1652 // Index for constants vector
1653 std::size_t i = 0;
1654
1655 // Get mandatory/basic input parameters
1656 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1657 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1658 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1659 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1660 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1661 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1662 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1663 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1664 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1665
1666 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1667 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1668 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1669 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1670 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1671 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1672 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1673 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1674 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1675 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1676 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1677 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1678 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1679
1680 if (!descriptor.m_CifgEnabled)
1681 {
1682 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1683 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1684 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1685 }
1686
1687 if (descriptor.m_PeepholeEnabled)
1688 {
1689 if (!descriptor.m_CifgEnabled)
1690 {
1691 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1692 }
1693 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1694 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1695 }
1696
1697 if (descriptor.m_ProjectionEnabled)
1698 {
1699 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1700 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1701 }
1702
1703 if (descriptor.m_LayerNormEnabled)
1704 {
1705 if (!descriptor.m_CifgEnabled)
1706 {
1707 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1708 }
1709 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1710 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1711 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1712 }
1713
1714 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1715 m_flatBufferBuilder,
1716 inputToForgetWeights,
1717 inputToCellWeights,
1718 inputToOutputWeights,
1719 recurrentToForgetWeights,
1720 recurrentToCellWeights,
1721 recurrentToOutputWeights,
1722 forgetGateBias,
1723 cellBias,
1724 outputGateBias,
1725 inputToInputWeights,
1726 recurrentToInputWeights,
1727 cellToInputWeights,
1728 inputGateBias,
1729 projectionWeights,
1730 projectionBias,
1731 cellToForgetWeights,
1732 cellToOutputWeights,
1733 inputLayerNormWeights,
1734 forgetLayerNormWeights,
1735 cellLayerNormWeights,
1736 outputLayerNormWeights);
1737
1738 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1739 m_flatBufferBuilder,
1740 fbUnidirectionalSequenceLstmBaseLayer,
1741 fbUnidirectionalSequenceLstmDescriptor,
1742 fbUnidirectionalSequenceLstmParams);
1743
1744 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1745}
1746
Finn Williamsb454c5c2021-02-09 15:56:23 +00001747fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001748 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001749{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001750
Sadik Armagandb059fd2019-03-20 12:28:32 +00001751 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1752
Mike Kelly8c1701a2019-02-11 17:01:27 +00001753 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1754 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1755
1756 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001757 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001758 m_flatBufferBuilder.CreateString(layer->GetName()),
1759 layerType,
1760 m_flatBufferBuilder.CreateVector(inputSlots),
1761 m_flatBufferBuilder.CreateVector(outputSlots));
1762}
1763
Finn Williamsb454c5c2021-02-09 15:56:23 +00001764void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001765{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001766
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001767 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001768 m_serializedLayers.push_back(anyLayer);
1769}
1770
Mike Kellya0766c32019-02-19 17:22:07 +00001771template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001772flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001773{
1774 const T* buffer = reinterpret_cast<const T*>(memory);
1775 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1776 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1777 return fbVector;
1778}
1779
Finn Williamsb454c5c2021-02-09 15:56:23 +00001780flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001781{
Mike Kellya0766c32019-02-19 17:22:07 +00001782 // Get the dimensions
1783 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001784 std::vector<bool> specificity;
1785 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1786 // matches the size of dimensions.
1787 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1788 {
1789 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001790
1791 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1792 {
1793 shape.push_back(tensorInfo.GetShape()[dim]);
1794 }
1795 else
1796 {
1797 shape.push_back(0);
1798 }
Colm Donelan800b2812021-02-12 12:43:35 +00001799 }
1800
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001801 if (tensorInfo.HasPerAxisQuantization())
1802 {
1803 // Create FlatBuffer TensorInfo
1804 auto flatBufferTensorInfo =
1805 serializer::CreateTensorInfo(m_flatBufferBuilder,
1806 m_flatBufferBuilder.CreateVector(shape),
1807 GetFlatBufferDataType(tensorInfo.GetDataType()),
1808 tensorInfo.GetQuantizationScales()[0],
1809 tensorInfo.GetQuantizationOffset(),
1810 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001811 tensorInfo.GetQuantizationDim().value(),
1812 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001813 (tensorInfo.GetShape().GetDimensionality()),
1814 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001815 return flatBufferTensorInfo;
1816 }
1817
Mike Kellya0766c32019-02-19 17:22:07 +00001818 // Create FlatBuffer TensorInfo
1819 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1820 m_flatBufferBuilder.CreateVector(shape),
1821 GetFlatBufferDataType(tensorInfo.GetDataType()),
1822 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001823 tensorInfo.GetQuantizationOffset(),
1824 0,
1825 0,
1826 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001827 (tensorInfo.GetShape().GetDimensionality()),
1828 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001829 return flatBufferTensorInfo;
1830}
1831
1832flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001833 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001834{
1835 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1836
Mike Kellya0766c32019-02-19 17:22:07 +00001837 flatbuffers::Offset<void> fbPayload;
1838
1839 switch (tensorInfo.GetDataType())
1840 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001841 case armnn::DataType::Signed64:
1842 {
1843 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1844 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1845 m_flatBufferBuilder,
1846 fbVector);
1847 fbPayload = flatBuffersData.o;
1848 break;
1849 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001850 case armnn::DataType::Float32:
1851 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001852 {
1853 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1854 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1855 m_flatBufferBuilder,
1856 fbVector);
1857 fbPayload = flatBuffersData.o;
1858 break;
1859 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001860 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001861 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001862 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001863 {
1864 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1865 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1866 m_flatBufferBuilder,
1867 fbVector);
1868 fbPayload = flatBuffersData.o;
1869 break;
1870 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001871 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001872 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001873 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001874 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001875 default:
1876 {
1877 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1878 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1879 m_flatBufferBuilder,
1880 fbVector);
1881 fbPayload = flatBuffersData.o;
1882 }
1883 }
1884 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1885 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001886 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001887 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1888 fbPayload);
1889 return flatBufferConstTensor;
1890}
1891
Finn Williamsb454c5c2021-02-09 15:56:23 +00001892flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001893{
1894 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1895 serializer::CreateFeatureCompatibilityVersions(
1896 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001897 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001898 1, // Weights layout scheme version
1899 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001900 );
1901 return versionsTable;
1902}
1903
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001904std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001905 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001906{
Mike Kellya0766c32019-02-19 17:22:07 +00001907 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001908
1909 // Get the InputSlots
1910 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1911 {
1912 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1913
1914 // Get the Connection for the InputSlot
1915 const IOutputSlot* connection = inputSlot.GetConnection();
1916
1917 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001918 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1919 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001920 // Create FlatBuffer InputSlot
1921 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1922 }
1923 return inputSlots;
1924}
1925
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001926std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001927 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001928{
1929 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1930
1931 // Get the OutputSlots
1932 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1933 {
1934 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001935 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001936
Mike Kelly8c1701a2019-02-11 17:01:27 +00001937 // Create FlatBuffer Outputslot
1938 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1939 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001940 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001941 }
1942 return outputSlots;
1943}
1944
Finn Williamsb454c5c2021-02-09 15:56:23 +00001945void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1946 const BaseDescriptor& descriptor,
1947 const std::vector<armnn::ConstTensor>& constants,
1948 const char* name,
1949 const armnn::LayerBindingId id)
1950{
1951 IgnoreUnused(constants);
1952
1953 switch (layer->GetType())
1954 {
1955 case armnn::LayerType::Activation :
1956 {
1957 const armnn::ActivationDescriptor& layerDescriptor =
1958 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1959 SerializeActivationLayer(layer, layerDescriptor, name);
1960 break;
1961 }
1962 case armnn::LayerType::Addition :
1963 {
1964 SerializeAdditionLayer(layer, name);
1965 break;
1966 }
1967 case armnn::LayerType::ArgMinMax :
1968 {
1969 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1970 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1971 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1972 break;
1973 }
1974 case armnn::LayerType::BatchNormalization :
1975 {
1976 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1977 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1978 SerializeBatchNormalizationLayer(layer,
1979 layerDescriptor,
1980 constants,
1981 name);
1982 break;
1983 }
1984 case armnn::LayerType::BatchToSpaceNd :
1985 {
1986 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
1987 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
1988 SerializeBatchToSpaceNdLayer(layer,
1989 layerDescriptor,
1990 name);
1991 break;
1992 }
mathad01b392e982021-04-07 12:07:30 +01001993 case armnn::LayerType::Cast :
1994 {
1995 SerializeCastLayer(layer, name);
1996 break;
1997 }
Simon Obute51f67772021-09-03 15:50:13 +01001998 case armnn::LayerType::ChannelShuffle :
1999 {
2000 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2001 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2002 SerializeChannelShuffleLayer(layer,
2003 layerDescriptor,
2004 name);
2005 break;
2006 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002007 case armnn::LayerType::Comparison :
2008 {
2009 const armnn::ComparisonDescriptor& layerDescriptor =
2010 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2011 SerializeComparisonLayer(layer,
2012 layerDescriptor,
2013 name);
2014 break;
2015 }
2016 case armnn::LayerType::Concat :
2017 {
2018 const armnn::ConcatDescriptor& layerDescriptor =
2019 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2020 SerializeConcatLayer(layer,
2021 layerDescriptor,
2022 name);
2023 break;
2024 }
2025 case armnn::LayerType::Constant :
2026 {
2027 SerializeConstantLayer(layer,
2028 constants,
2029 name);
2030 break;
2031 }
2032 case armnn::LayerType::Convolution2d :
2033 {
2034 const armnn::Convolution2dDescriptor& layerDescriptor =
2035 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2036 SerializeConvolution2dLayer(layer,
2037 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002038 name);
2039 break;
2040 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002041 case armnn::LayerType::Convolution3d :
2042 {
2043 const armnn::Convolution3dDescriptor& layerDescriptor =
2044 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2045 SerializeConvolution3dLayer(layer,
2046 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002047 name);
2048 break;
2049 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002050 case armnn::LayerType::DepthToSpace :
2051 {
2052 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2053 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2054 SerializeDepthToSpaceLayer(layer,
2055 layerDescriptor,
2056 name);
2057 break;
2058 }
2059 case armnn::LayerType::DepthwiseConvolution2d :
2060 {
2061 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2062 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2063 SerializeDepthwiseConvolution2dLayer(layer,
2064 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002065 name);
2066 break;
2067 }
2068 case armnn::LayerType::Dequantize :
2069 {
2070 SerializeDequantizeLayer(layer,
2071 name);
2072 break;
2073 }
2074 case armnn::LayerType::DetectionPostProcess :
2075 {
2076 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2077 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2078 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2079 break;
2080 }
2081 case armnn::LayerType::Division :
2082 {
2083 SerializeDivisionLayer(layer, name);
2084 break;
2085 }
2086 case armnn::LayerType::ElementwiseUnary :
2087 {
2088 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2089 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2090 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2091 break;
2092 }
2093 case armnn::LayerType::Fill :
2094 {
2095 const armnn::FillDescriptor& layerDescriptor =
2096 static_cast<const armnn::FillDescriptor&>(descriptor);
2097 SerializeFillLayer(layer, layerDescriptor, name);
2098 break;
2099 }
2100 case armnn::LayerType::Floor :
2101 {
2102 SerializeFloorLayer(layer, name);
2103 break;
2104 }
2105 case armnn::LayerType::FullyConnected :
2106 {
2107 const armnn::FullyConnectedDescriptor& layerDescriptor =
2108 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002109 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002110 break;
2111 }
2112 case armnn::LayerType::Gather :
2113 {
2114 const armnn::GatherDescriptor& layerDescriptor =
2115 static_cast<const armnn::GatherDescriptor&>(descriptor);
2116 SerializeGatherLayer(layer, layerDescriptor, name);
2117 break;
2118 }
Teresa Charlin6966bfa2022-04-25 17:14:50 +01002119 case armnn::LayerType::GatherNd :
2120 {
2121 SerializeGatherNdLayer(layer, name);
2122 break;
2123 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002124 case armnn::LayerType::Input:
2125 {
2126 SerializeInputLayer(layer, id, name);
2127 break;
2128 }
2129 case armnn::LayerType::InstanceNormalization :
2130 {
2131 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2132 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2133 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2134 break;
2135 }
2136 case armnn::LayerType::L2Normalization :
2137 {
2138 const armnn::L2NormalizationDescriptor& layerDescriptor =
2139 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2140 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2141 break;
2142 }
2143 case armnn::LayerType::LogicalBinary :
2144 {
2145 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2146 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2147 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2148 break;
2149 }
2150 case armnn::LayerType::LogSoftmax :
2151 {
2152 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2153 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2154 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2155 break;
2156 }
2157 case armnn::LayerType::Lstm :
2158 {
2159 const armnn::LstmDescriptor& layerDescriptor =
2160 static_cast<const armnn::LstmDescriptor&>(descriptor);
2161 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2162 break;
2163 }
2164 case armnn::LayerType::QLstm :
2165 {
2166 const armnn::QLstmDescriptor& layerDescriptor =
2167 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2168 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2169 break;
2170 }
2171 case armnn::LayerType::Maximum :
2172 {
2173 SerializeMaximumLayer(layer, name);
2174 break;
2175 }
2176 case armnn::LayerType::Mean :
2177 {
2178 const armnn::MeanDescriptor& layerDescriptor =
2179 static_cast<const armnn::MeanDescriptor&>(descriptor);
2180 SerializeMeanLayer(layer, layerDescriptor, name);
2181 break;
2182 }
2183 case armnn::LayerType::Merge :
2184 {
2185 SerializeMergeLayer(layer, name);
2186 break;
2187 }
2188 case armnn::LayerType::Minimum :
2189 {
2190 SerializeMinimumLayer(layer, name);
2191 break;
2192 }
2193 case armnn::LayerType::Multiplication :
2194 {
2195 SerializeMultiplicationLayer(layer, name);
2196 break;
2197 }
2198 case armnn::LayerType::Normalization :
2199 {
2200 const armnn::NormalizationDescriptor& layerDescriptor =
2201 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2202 SerializeNormalizationLayer(layer, layerDescriptor, name);
2203 break;
2204 }
2205 case armnn::LayerType::Output:
2206 {
2207 SerializeOutputLayer(layer, id, name);
2208 break;
2209 }
2210 case armnn::LayerType::Pad :
2211 {
2212 const armnn::PadDescriptor& layerDescriptor =
2213 static_cast<const armnn::PadDescriptor&>(descriptor);
2214 SerializePadLayer(layer, layerDescriptor, name);
2215 break;
2216 }
2217 case armnn::LayerType::Permute :
2218 {
2219 const armnn::PermuteDescriptor& layerDescriptor =
2220 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2221 SerializePermuteLayer(layer, layerDescriptor, name);
2222 break;
2223 }
2224 case armnn::LayerType::Pooling2d :
2225 {
2226 const armnn::Pooling2dDescriptor& layerDescriptor =
2227 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2228 SerializePooling2dLayer(layer, layerDescriptor, name);
2229 break;
2230 }
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002231 case armnn::LayerType::Pooling3d :
2232 {
2233 const armnn::Pooling3dDescriptor& layerDescriptor =
2234 static_cast<const armnn::Pooling3dDescriptor&>(descriptor);
2235 SerializePooling3dLayer(layer, layerDescriptor, name);
2236 break;
2237 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002238 case armnn::LayerType::Prelu :
2239 {
2240 SerializePreluLayer(layer, name);
2241 break;
2242 }
2243 case armnn::LayerType::Quantize :
2244 {
2245 SerializeQuantizeLayer(layer, name);
2246 break;
2247 }
2248 case armnn::LayerType::QuantizedLstm:
2249 SerializeQuantizedLstmLayer(layer, constants, name);
2250 break;
2251 case armnn::LayerType::Reshape:
2252 {
2253 const armnn::ReshapeDescriptor &layerDescriptor =
2254 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2255 SerializeReshapeLayer(layer, layerDescriptor, name);
2256 break;
2257 }
2258 case armnn::LayerType::Rank:
2259 {
2260 SerializeRankLayer(layer, name);
2261 break;
2262 }
2263 case armnn::LayerType::Reduce:
2264 {
2265 const armnn::ReduceDescriptor& layerDescriptor =
2266 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2267 SerializeReduceLayer(layer, layerDescriptor, name);
2268 break;
2269 }
2270 case armnn::LayerType::Resize:
2271 {
2272 const armnn::ResizeDescriptor& layerDescriptor =
2273 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2274 SerializeResizeLayer(layer, layerDescriptor, name);
2275 break;
2276 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002277 case armnn::LayerType::Shape:
2278 {
2279 SerializeShapeLayer(layer, name);
2280 break;
2281 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002282 case armnn::LayerType::Slice:
2283 {
2284 const armnn::SliceDescriptor& layerDescriptor =
2285 static_cast<const armnn::SliceDescriptor&>(descriptor);
2286 SerializeSliceLayer(layer, layerDescriptor, name);
2287 break;
2288 }
2289 case armnn::LayerType::Softmax:
2290 {
2291 const armnn::SoftmaxDescriptor& layerDescriptor =
2292 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2293 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2294 break;
2295 }
2296 case armnn::LayerType::SpaceToBatchNd:
2297 {
2298 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2299 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2300 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2301 break;
2302 }
2303 case armnn::LayerType::SpaceToDepth:
2304 {
2305 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2306 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2307 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2308 break;
2309 }
2310 case armnn::LayerType::Splitter:
2311 {
2312 const armnn::SplitterDescriptor& layerDescriptor =
2313 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2314 SerializeSplitterLayer(layer, layerDescriptor, name);
2315 break;
2316 }
2317 case armnn::LayerType::Stack:
2318 {
2319 const armnn::StackDescriptor& layerDescriptor =
2320 static_cast<const armnn::StackDescriptor&>(descriptor);
2321 SerializeStackLayer(layer, layerDescriptor, name);
2322 break;
2323 }
2324 case armnn::LayerType::StandIn:
2325 {
2326 const armnn::StandInDescriptor& layerDescriptor =
2327 static_cast<const armnn::StandInDescriptor&>(descriptor);
2328 SerializeStandInLayer(layer, layerDescriptor, name);
2329 break;
2330 }
2331 case armnn::LayerType::StridedSlice:
2332 {
2333 const armnn::StridedSliceDescriptor& layerDescriptor =
2334 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2335 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2336 break;
2337 }
2338 case armnn::LayerType::Subtraction:
2339 {
2340 SerializeSubtractionLayer(layer, name);
2341 break;
2342 }
2343 case armnn::LayerType::Switch:
2344 {
2345 SerializeSwitchLayer(layer, name);
2346 break;
2347 }
2348 case armnn::LayerType::Transpose:
2349 {
2350 const armnn::TransposeDescriptor& layerDescriptor =
2351 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2352 SerializeTransposeLayer(layer, layerDescriptor, name);
2353 break;
2354 }
2355 case armnn::LayerType::TransposeConvolution2d:
2356 {
2357 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2358 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2359 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2360 break;
2361 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002362 case armnn::LayerType::UnidirectionalSequenceLstm :
2363 {
2364 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2365 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2366 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2367 break;
2368 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002369 default:
2370 {
2371 throw InvalidArgumentException(
2372 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2373 layer->GetName(),
2374 id));
2375 }
2376 }
2377}
2378
Finn Williams85d36712021-01-26 22:30:06 +00002379void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002380{
2381 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002382 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2383 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002384
2385 // Create FlatBuffer SerializedGraph
2386 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002387 fbBuilder,
2388 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2389 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2390 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2391 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002392
2393 // Serialize the graph
2394 fbBuilder.Finish(serializedGraph);
2395}
2396
Finn Williamsb454c5c2021-02-09 15:56:23 +00002397
Finn Williams85d36712021-01-26 22:30:06 +00002398bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002399{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002400 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002401
Matthew Sloyan0663d662020-09-14 11:47:26 +01002402 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002403 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002404 return !stream.bad();
2405}
2406
Finn Williams2605b232020-06-10 15:53:46 +01002407} // namespace armnnSerializer