blob: 91b62413d8ff8a8874e265c20ab1231f3810f45b [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "Serializer.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>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000011
Mike Kelly8c1701a2019-02-11 17:01:27 +000012#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Derek Lamberti859f9ce2019-12-10 22:05:21 +000014#include <boost/core/ignore_unused.hpp>
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010015#include <boost/numeric/conversion/cast.hpp>
Mike Kelly8c1701a2019-02-11 17:01:27 +000016#include <flatbuffers/util.h>
17
Matthew Benthamff130e22020-01-17 11:47:42 +000018#include "SerializerUtils.hpp"
19
Mike Kelly8c1701a2019-02-11 17:01:27 +000020using namespace armnn;
21namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000022namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000023
24namespace armnnSerializer
25{
26
Mike Kellyaf484012019-02-20 16:53:11 +000027serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
28{
29 switch (function)
30 {
31 case armnn::ActivationFunction::Sigmoid:
32 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
33 case armnn::ActivationFunction::TanH:
34 return serializer::ActivationFunction::ActivationFunction_TanH;
35 case armnn::ActivationFunction::Linear:
36 return serializer::ActivationFunction::ActivationFunction_Linear;
37 case armnn::ActivationFunction::ReLu:
38 return serializer::ActivationFunction::ActivationFunction_ReLu;
39 case armnn::ActivationFunction::BoundedReLu:
40 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
41 case armnn::ActivationFunction::LeakyReLu:
42 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
43 case armnn::ActivationFunction::Abs:
44 return serializer::ActivationFunction::ActivationFunction_Abs;
45 case armnn::ActivationFunction::Sqrt:
46 return serializer::ActivationFunction::ActivationFunction_Sqrt;
47 case armnn::ActivationFunction::Square:
48 return serializer::ActivationFunction::ActivationFunction_Square;
49 default:
50 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
51 }
52}
53
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010054serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
55{
56 switch (function)
57 {
58 case armnn::ArgMinMaxFunction::Max:
59 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
60 case armnn::ArgMinMaxFunction::Min:
61 default:
62 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
63 }
64}
65
janeil013fec1ea2019-11-07 09:47:20 +000066uint32_t SerializerVisitor::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000067{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000068 if (m_guidMap.empty())
69 {
janeil013fec1ea2019-11-07 09:47:20 +000070 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000071 }
72 else if (m_guidMap.find(guid) == m_guidMap.end())
73 {
janeil013fec1ea2019-11-07 09:47:20 +000074 ++m_layerId;
75 m_guidMap.insert(std::make_pair(guid, m_layerId));
76
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000077 return m_layerId;
78 }
Saoirse Stewart30211042019-02-18 17:19:16 +000079 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000080}
81
Mike Kelly8c1701a2019-02-11 17:01:27 +000082// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000083void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000084{
Derek Lamberti859f9ce2019-12-10 22:05:21 +000085 boost::ignore_unused(name);
86
Mike Kelly8c1701a2019-02-11 17:01:27 +000087 // Create FlatBuffer BaseLayer
88 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
89
90 // Create FlatBuffer BindableBaseLayer
91 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
92 flatBufferInputBaseLayer,
93 id);
janeil013fec1ea2019-11-07 09:47:20 +000094 // Push layer index to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000095 m_inputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +000096
97 // Create the FlatBuffer InputLayer
98 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
99
100 // Add the AnyLayer to the FlatBufferLayers
101 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
102}
103
104// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000105void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000106{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000107 boost::ignore_unused(name);
108
Mike Kelly8c1701a2019-02-11 17:01:27 +0000109 // Create FlatBuffer BaseLayer
110 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
111
112 // Create FlatBuffer BindableBaseLayer
113 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
114 flatBufferOutputBaseLayer,
115 id);
janeil013fec1ea2019-11-07 09:47:20 +0000116 // Push layer index to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000117 m_outputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000118
119 // Create the FlatBuffer OutputLayer
120 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
121 // Add the AnyLayer to the FlatBufferLayers
122 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
123}
124
Kevin May868eb142019-09-04 17:29:31 +0100125void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
126{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000127 boost::ignore_unused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100128 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
129 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
130
131 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100132}
133
Mike Kellyaf484012019-02-20 16:53:11 +0000134// Build FlatBuffer for Activation Layer
135void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
136 const armnn::ActivationDescriptor& descriptor,
137 const char* name)
138{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000139 boost::ignore_unused(name);
140
Mike Kellyaf484012019-02-20 16:53:11 +0000141 // Create FlatBuffer BaseLayer
142 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
143
144 // Create the FlatBuffer ActivationDescriptor
145 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
146 GetFlatBufferActivationFunction(descriptor.m_Function),
147 descriptor.m_A,
148 descriptor.m_B);
149
150 // Create the FlatBuffer ActivationLayer
151 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
152 flatBufferBaseLayer,
153 flatBufferDescriptor);
154
155 // Add the AnyLayer to the FlatBufferLayers
156 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
157}
158
Mike Kelly8c1701a2019-02-11 17:01:27 +0000159// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000160void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000161{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000162 boost::ignore_unused(name);
163
Mike Kelly8c1701a2019-02-11 17:01:27 +0000164 // Create FlatBuffer BaseLayer
165 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
166
167 // Create the FlatBuffer AdditionLayer
168 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
169
170 // Add the AnyLayer to the FlatBufferLayers
171 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
172}
173
Nikhil Rajee391d52019-09-05 17:50:44 +0100174// Build FlatBuffer for ArgMinMax Layer
175void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
176 const armnn::ArgMinMaxDescriptor& descriptor,
177 const char *name)
178{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000179 boost::ignore_unused(name);
180
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100181 // Create FlatBuffer BaseLayer
182 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
183
184 // Create FlatBuffer Descriptor
185 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
186 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
187 descriptor.m_Axis);
188
189 // Create FlatBuffer ArgMinMaxLayer
190 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
191 flatBufferBaseLayer,
192 flatBufferDescriptor);
193
194 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100195}
196
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000197// Build FlatBuffer for BatchToSpaceNd Layer
198void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
199 const armnn::BatchToSpaceNdDescriptor& descriptor,
200 const char* name)
201{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000202 boost::ignore_unused(name);
203
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000204 // Create FlatBuffer BaseLayer
205 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
206
207 std::vector<unsigned int> crops;
208 crops.reserve(descriptor.m_Crops.size() * 2);
209 for (auto& crop : descriptor.m_Crops)
210 {
211 crops.push_back(crop.first);
212 crops.push_back(crop.second);
213 }
214
215 auto flatBufferDescriptor =
216 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
217 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
218 m_flatBufferBuilder.CreateVector(crops),
219 GetFlatBufferDataLayout(descriptor.m_DataLayout));
220
221 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
222 flatBufferBaseLayer,
223 flatBufferDescriptor);
224
225 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
226}
227
ruoyan018e7fa232019-02-28 15:09:07 +0000228void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
229 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
230 const armnn::ConstTensor& mean,
231 const armnn::ConstTensor& variance,
232 const armnn::ConstTensor& beta,
233 const armnn::ConstTensor& gamma,
234 const char* name)
235{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000236 boost::ignore_unused(name);
237
ruoyan018e7fa232019-02-28 15:09:07 +0000238 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
239 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
240 m_flatBufferBuilder,
241 batchNormDescriptor.m_Eps,
242 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
243
244 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
245 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
246 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
247 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
248 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
249 fbBatchNormalizationBaseLayer,
250 fbBatchNormalizationDescriptor,
251 fbMeanConstTensorInfo,
252 fbVarianceConstTensorInfo,
253 fbBetaConstTensorInfo,
254 fbGammaConstTensorInfo);
255
256 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
257}
258
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100259void SerializerVisitor::VisitComparisonLayer(const armnn::IConnectableLayer* layer,
260 const armnn::ComparisonDescriptor& descriptor,
261 const char* name)
262{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000263 boost::ignore_unused(name);
264
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100265 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
266 auto fbDescriptor = serializer::CreateComparisonDescriptor(
267 m_flatBufferBuilder,
268 GetFlatBufferComparisonOperation(descriptor.m_Operation));
269
270 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
271 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100272}
273
Conor Kennedy76277882019-02-26 08:29:54 +0000274// Build FlatBuffer for Constant Layer
275void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
276 const armnn::ConstTensor& input,
277 const char* name)
278{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000279 boost::ignore_unused(name);
280
Conor Kennedy76277882019-02-26 08:29:54 +0000281 // Create FlatBuffer BaseLayer
282 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
283
284 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
285
286 // Create the FlatBuffer ConstantLayer
287 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
288 flatBufferConstantBaseLayer,
289 flatBufferConstTensorInfo);
290
291 // Add the AnyLayer to the FlatBufferLayers
292 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
293}
294
Mike Kellya0766c32019-02-19 17:22:07 +0000295// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000296void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
297 const armnn::Convolution2dDescriptor& descriptor,
298 const armnn::ConstTensor& weights,
299 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000300 const char* name)
301{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000302 boost::ignore_unused(name);
303
Mike Kellya0766c32019-02-19 17:22:07 +0000304 // Create FlatBuffer BaseLayer
305 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
306
307 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
308 descriptor.m_PadLeft,
309 descriptor.m_PadRight,
310 descriptor.m_PadTop,
311 descriptor.m_PadBottom,
312 descriptor.m_StrideX,
313 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100314 descriptor.m_DilationX,
315 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000316 descriptor.m_BiasEnabled,
317 GetFlatBufferDataLayout(descriptor.m_DataLayout));
318 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
319 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
320
321 if (biases.has_value())
322 {
323 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
324 }
325
326 // Create the FlatBuffer Convolution2dLayer
327 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
328 flatBufferBaseLayer,
329 flatBufferDescriptor,
330 flatBufferWeightsConstTensorInfo,
331 flatBufferBiasesConstTensorInfo);
332
333 // Add the AnyLayer to the FlatBufferLayers
334 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
335}
336
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100337void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
338 const armnn::DepthToSpaceDescriptor& descriptor,
339 const char* name)
340{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000341 boost::ignore_unused(name);
342
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100343 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
344 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
345 descriptor.m_BlockSize,
346 GetFlatBufferDataLayout(descriptor.m_DataLayout));
347
348 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
349
350 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100351}
352
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000353void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
354 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
355 const armnn::ConstTensor& weights,
356 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000357 const char* name)
358{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000359 boost::ignore_unused(name);
360
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000361 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
362 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
363 descriptor.m_PadLeft,
364 descriptor.m_PadRight,
365 descriptor.m_PadTop,
366 descriptor.m_PadBottom,
367 descriptor.m_StrideX,
368 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100369 descriptor.m_DilationX,
370 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000371 descriptor.m_BiasEnabled,
372 GetFlatBufferDataLayout(descriptor.m_DataLayout));
373
374 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
375 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
376 if (biases.has_value())
377 {
378 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
379 }
380
381 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
382 fbBaseLayer,
383 fbDescriptor,
384 fbWeightsConstTensorInfo,
385 fbBiasesConstTensorInfo);
386
387 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
388}
389
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000390void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
391 const char* name)
392{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000393 boost::ignore_unused(name);
394
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000395 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
396 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
397
398 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
399}
400
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000401void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
402 const armnn::DetectionPostProcessDescriptor& descriptor,
403 const armnn::ConstTensor& anchors,
404 const char* name)
405{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000406 boost::ignore_unused(name);
407
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000408 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
409 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
410 descriptor.m_MaxDetections,
411 descriptor.m_MaxClassesPerDetection,
412 descriptor.m_DetectionsPerClass,
413 descriptor.m_NmsScoreThreshold,
414 descriptor.m_NmsIouThreshold,
415 descriptor.m_NumClasses,
416 descriptor.m_UseRegularNms,
417 descriptor.m_ScaleX,
418 descriptor.m_ScaleY,
419 descriptor.m_ScaleW,
420 descriptor.m_ScaleH);
421
422 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
423
424 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
425 fbBaseLayer,
426 fbDescriptor,
427 fbAnchorsConstTensorInfo);
428
429 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
430}
431
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000432void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
433{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000434 boost::ignore_unused(name);
435
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000436 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
437 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000438
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000439 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
440}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000441
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000442void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
443{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000444 boost::ignore_unused(name);
445
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000446 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
447 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
448
449 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
450}
451
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000452void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
453{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000454 boost::ignore_unused(name);
455
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000456 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
457 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
458
459 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
460}
461
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000462void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
463{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000464 boost::ignore_unused(name);
465
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000466 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
467 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000468
469 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
470}
471
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000472void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
473{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000474 boost::ignore_unused(name);
475
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000476 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000477 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000478
479 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
480}
481
Kevin Mayce5045a2019-10-02 14:07:47 +0100482void SerializerVisitor::VisitInstanceNormalizationLayer(
483 const armnn::IConnectableLayer* layer,
484 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
485 const char* name)
486{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000487 boost::ignore_unused(name);
488
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100489 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
490 m_flatBufferBuilder,
491 instanceNormalizationDescriptor.m_Gamma,
492 instanceNormalizationDescriptor.m_Beta,
493 instanceNormalizationDescriptor.m_Eps,
494 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
495
496 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
497 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
498
499 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100500}
501
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000502void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
503 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
504 const char* name)
505{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000506 boost::ignore_unused(name);
507
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000508 // Create FlatBuffer BaseLayer
509 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
510
511 // Create the FlatBuffer L2Normalization Descriptor
512 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100513 m_flatBufferBuilder,
514 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
515 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000516
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100517 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000518 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
519
520 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
521}
522
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100523void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
524 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
525 const char* name)
526{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000527 boost::ignore_unused(name);
528
Sadik Armagan26257852019-10-14 13:00:47 +0100529 // Create FlatBuffer BaseLayer
530 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
531
532 // Create the FlatBuffer LogSoftmaxDescriptor
533 auto flatBufferLogSoftmaxDesc =
534 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
535 logSoftmaxDescriptor.m_Beta,
536 logSoftmaxDescriptor.m_Axis);
537
538 // Create the FlatBuffer LogSoftmaxLayer
539 auto flatBufferLogSoftmaxLayer =
540 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
541 flatBufferLogSoftmaxBaseLayer,
542 flatBufferLogSoftmaxDesc);
543
544 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100545}
546
547void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
548 const armnn::LstmDescriptor& descriptor,
549 const armnn::LstmInputParams& params,
550 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000551{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000552 boost::ignore_unused(name);
553
Jim Flynn11af3752019-03-19 17:22:29 +0000554 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
555
556 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
557 m_flatBufferBuilder,
558 descriptor.m_ActivationFunc,
559 descriptor.m_ClippingThresCell,
560 descriptor.m_ClippingThresProj,
561 descriptor.m_CifgEnabled,
562 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100563 descriptor.m_ProjectionEnabled,
564 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000565
566 // Get mandatory input parameters
567 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
568 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
569 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
570 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
571 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
572 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
573 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
574 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
575 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
576
577 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
578 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
579 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
580 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
581 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
582 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
583 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
584 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
585 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100586 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
587 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
588 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
589 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000590
591 if (!descriptor.m_CifgEnabled)
592 {
593 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
594 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
595 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
596 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
597 }
598
599 if (descriptor.m_ProjectionEnabled)
600 {
601 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
602 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
603 }
604
605 if (descriptor.m_PeepholeEnabled)
606 {
607 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
608 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
609 }
610
Jan Eilersf8c62972019-07-17 11:07:49 +0100611 if (descriptor.m_LayerNormEnabled)
612 {
613 if (!descriptor.m_CifgEnabled)
614 {
615 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
616 }
617 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
618 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
619 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
620 }
621
Jim Flynn11af3752019-03-19 17:22:29 +0000622 auto fbLstmParams = serializer::CreateLstmInputParams(
623 m_flatBufferBuilder,
624 inputToForgetWeights,
625 inputToCellWeights,
626 inputToOutputWeights,
627 recurrentToForgetWeights,
628 recurrentToCellWeights,
629 recurrentToOutputWeights,
630 forgetGateBias,
631 cellBias,
632 outputGateBias,
633 inputToInputWeights,
634 recurrentToInputWeights,
635 cellToInputWeights,
636 inputGateBias,
637 projectionWeights,
638 projectionBias,
639 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100640 cellToOutputWeights,
641 inputLayerNormWeights,
642 forgetLayerNormWeights,
643 cellLayerNormWeights,
644 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000645
646 auto fbLstmLayer = serializer::CreateLstmLayer(
647 m_flatBufferBuilder,
648 fbLstmBaseLayer,
649 fbLstmDescriptor,
650 fbLstmParams);
651
652 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
653}
654
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000655void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
656{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000657 boost::ignore_unused(name);
658
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000659 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
660 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
661
662 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
663}
664
665void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
666 const armnn::MeanDescriptor& descriptor,
667 const char* name)
668{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000669 boost::ignore_unused(name);
670
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000671 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
672 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
673 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
674 descriptor.m_KeepDims);
675
676 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
677 fbMeanBaseLayer,
678 fbMeanDescriptor);
679
680 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
681}
682
683void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
684{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000685 boost::ignore_unused(name);
686
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000687 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
688 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
689
690 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
691}
692
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100693void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
694{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000695 boost::ignore_unused(name);
696
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100697 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
698 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
699
700 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
701}
702
Jim Flynnac25a1b2019-02-28 10:40:49 +0000703void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100704 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000705 const char* name)
706{
Jim Flynne242f2d2019-05-22 14:24:13 +0100707 VisitConcatLayer(layer, mergerDescriptor, name);
708}
709
710void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
711 const armnn::ConcatDescriptor& concatDescriptor,
712 const char* name)
713{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000714 boost::ignore_unused(name);
715
Jim Flynne242f2d2019-05-22 14:24:13 +0100716 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000717
718 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100719 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000720 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100721 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000722 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100723 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000724 {
725 origins.push_back(origin[d]);
726 }
727 auto view = m_flatBufferBuilder.CreateVector(origins);
728 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
729 views.push_back(uintVector);
730 }
731
Jim Flynne242f2d2019-05-22 14:24:13 +0100732 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
733 concatDescriptor.GetConcatAxis(),
734 concatDescriptor.GetNumViews(),
735 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000736 m_flatBufferBuilder.CreateVector(views));
737
Jim Flynne242f2d2019-05-22 14:24:13 +0100738 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
739 flatBufferConcatBaseLayer,
740 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000741
Jim Flynne242f2d2019-05-22 14:24:13 +0100742 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000743}
744
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000745void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000746{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000747 boost::ignore_unused(name);
748
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000749 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
750 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
751 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000752
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000753 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000754}
755
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000756void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
757 const armnn::PadDescriptor& padDescriptor,
758 const char* name)
759{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000760 boost::ignore_unused(name);
761
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000762 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
763
764 std::vector<unsigned int> padList;
765 for (auto& p: padDescriptor.m_PadList)
766 {
767 padList.push_back(p.first);
768 padList.push_back(p.second);
769 }
770
771 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100772 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100773 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000774
775 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
776 flatBufferBaseLayer,
777 flatBufferPadDesc);
778
779 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
780}
781
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000782void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
783 const armnn::PermuteDescriptor& permuteDescriptor,
784 const char* name)
785{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000786 boost::ignore_unused(name);
787
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000788 // Create FlatBuffer BaseLayer
789 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
790
791 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100792 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000793 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100794 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000795 }
796
797 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
798 m_flatBufferBuilder.CreateVector(dimMappings));
799
800 // Create the FlatBuffer PermuteLayer
801 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
802 flatBufferPermuteBaseLayer,
803 flatBufferPermuteDesc);
804
805 // Add the AnyLayer to the FlatBufferLayers
806 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
807}
808
Saoirse Stewart263829c2019-02-19 15:54:14 +0000809// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000810void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000811 const armnn::ReshapeDescriptor& reshapeDescriptor,
812 const char* name)
813{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000814 boost::ignore_unused(name);
815
Saoirse Stewart263829c2019-02-19 15:54:14 +0000816 // Create FlatBuffer BaseLayer
817 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
818
819 std::vector<unsigned int> targetShape;
820 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
821 {
822 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
823 }
824
825 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
826 m_flatBufferBuilder.CreateVector(targetShape));
827
828 // Create the FlatBuffer ReshapeLayer
829 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
830 flatBufferReshapeDesc);
831
832 // Add the AnyLayer to the FlatBufferLayers
833 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
834}
835
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000836void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
837 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
838 const char* name)
839{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000840 boost::ignore_unused(name);
841
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000842 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
843
844 auto flatBufferDescriptor =
845 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
846 resizeDescriptor.m_TargetWidth,
847 resizeDescriptor.m_TargetHeight,
848 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
849
850 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
851 flatBufferBaseLayer,
852 flatBufferDescriptor);
853
854 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
855}
856
Teresa Charlina9075df2019-06-27 15:41:57 +0100857void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
858 const armnn::ResizeDescriptor& resizeDescriptor,
859 const char* name)
860{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000861 boost::ignore_unused(name);
862
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100863 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
864
865 auto flatBufferDescriptor =
866 CreateResizeDescriptor(m_flatBufferBuilder,
867 resizeDescriptor.m_TargetHeight,
868 resizeDescriptor.m_TargetWidth,
869 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
870 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
871
872 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
873 flatBufferBaseLayer,
874 flatBufferDescriptor);
875
876 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100877}
878
Sadik Armagan8b42a382019-03-01 14:24:49 +0000879void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
880{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000881 boost::ignore_unused(name);
882
Sadik Armagan8b42a382019-03-01 14:24:49 +0000883 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
884 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
885
886 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
887}
888
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100889void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
890 const armnn::SliceDescriptor& sliceDescriptor,
891 const char* name)
892{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000893 boost::ignore_unused(name);
894
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100895 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
896 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
897 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
898 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
899
900 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
901
902 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100903}
904
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000905// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000906void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
907 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000908 const char* name)
909{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000910 boost::ignore_unused(name);
911
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000912 // Create FlatBuffer BaseLayer
913 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
914
915 // Create the FlatBuffer SoftmaxDescriptor
916 auto flatBufferSoftmaxDesc =
917 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
918
919 // Create the FlatBuffer SoftmaxLayer
920 auto flatBufferSoftmaxLayer =
921 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
922 flatBufferSoftmaxBaseLayer,
923 flatBufferSoftmaxDesc);
924
925 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
926}
927
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000928void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
929 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000930 const char* name)
931{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000932 boost::ignore_unused(name);
933
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000934 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
935 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
936 m_flatBufferBuilder,
937 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
938 pooling2dDescriptor.m_PadLeft,
939 pooling2dDescriptor.m_PadRight,
940 pooling2dDescriptor.m_PadTop,
941 pooling2dDescriptor.m_PadBottom,
942 pooling2dDescriptor.m_PoolWidth,
943 pooling2dDescriptor.m_PoolHeight,
944 pooling2dDescriptor.m_StrideX,
945 pooling2dDescriptor.m_StrideY,
946 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
947 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
948 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
949
950 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
951 fbPooling2dBaseLayer,
952 fbPooling2dDescriptor);
953
954 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
955}
956
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100957void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
958 const char* name)
959{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000960 boost::ignore_unused(name);
961
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100962 // Create FlatBuffer BaseLayer
963 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
964
965 // Create the FlatBuffer AdditionLayer
966 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
967
968 // Add the AnyLayer to the FlatBufferLayers
969 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100970}
971
Derek Lamberti87acb272019-03-27 16:51:31 +0000972void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
973{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000974 boost::ignore_unused(name);
975
Derek Lamberti87acb272019-03-27 16:51:31 +0000976 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
977 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
978 fbQuantizeBaseLayer);
979 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
980}
981
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000982// Build FlatBuffer for FullyConnected Layer
983void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
984 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
985 const armnn::ConstTensor& weights,
986 const armnn::Optional<armnn::ConstTensor>& biases,
987 const char* name)
988{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000989 boost::ignore_unused(name);
990
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000991 // Create FlatBuffer BaseLayer
992 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
993
994 // Create FlatBuffer FullyConnectedDescriptor
995 auto flatBufferDescriptor =
996 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
997 fullyConnectedDescriptor.m_BiasEnabled,
998 fullyConnectedDescriptor.m_TransposeWeightMatrix);
999
1000 // Create FlatBuffer weights data
1001 auto flatBufferWeights = CreateConstTensorInfo(weights);
1002
1003 // Create FlatBuffer bias data
1004 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1005 if (fullyConnectedDescriptor.m_BiasEnabled)
1006 {
1007 flatBufferBiases = CreateConstTensorInfo(biases.value());
1008 }
1009
1010 // Create FlatBuffer FullyConnectedLayer
1011 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1012 flatBufferBaseLayer,
1013 flatBufferDescriptor,
1014 flatBufferWeights,
1015 flatBufferBiases);
1016
1017 // Add created FullyConnectedLayer to the FlatBufferLayers
1018 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1019}
1020
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001021// Build FlatBuffer for SpaceToBatchNd Layer
1022void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1023 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1024 const char* name)
1025{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001026 boost::ignore_unused(name);
1027
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001028 // Create FlatBuffer BaseLayer
1029 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1030
1031 std::vector<unsigned int> padList;
1032 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1033 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1034 {
1035 padList.push_back(pad.first);
1036 padList.push_back(pad.second);
1037 }
1038
1039 auto flatBufferDescriptor =
1040 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1041 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1042 m_flatBufferBuilder.CreateVector(padList),
1043 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1044
1045 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1046 flatBufferBaseLayer,
1047 flatBufferDescriptor);
1048
1049 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1050}
1051
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001052// Build FlatBuffer for SpaceToDepthLayer
1053void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1054 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1055 const char* name)
1056{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001057 boost::ignore_unused(name);
1058
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001059 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1060 auto flatBufferDescriptor =
1061 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1062 spaceToDepthDescriptor.m_BlockSize,
1063 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1064
1065 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1066 flatBufferBaseLayer,
1067 flatBufferDescriptor);
1068
1069 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001070}
1071
Jim Flynn18ce3382019-03-08 11:08:30 +00001072// Build FlatBuffer for Splitter Layer
1073void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1074 const armnn::ViewsDescriptor& viewsDescriptor,
1075 const char* name)
1076{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001077 boost::ignore_unused(name);
1078
Jim Flynn18ce3382019-03-08 11:08:30 +00001079 // Create FlatBuffer ViewOrigins
1080 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1081 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1082
1083 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1084 {
1085 std::vector<uint32_t> viewOrigin;
1086 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1087
1088 // Copy vector
1089 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1090 {
1091 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1092 }
1093
1094 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1095 m_flatBufferBuilder.CreateVector(viewOrigin)));
1096 }
1097
1098 // Create FlatBuffer OriginsDescriptor
1099 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1100 viewsDescriptor.GetOrigins().GetConcatAxis(),
1101 viewsDescriptor.GetOrigins().GetNumViews(),
1102 viewsDescriptor.GetOrigins().GetNumDimensions(),
1103 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1104
1105 // Create FlatBuffer ViewOrigins
1106 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1107 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1108
1109 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1110 {
1111 std::vector<uint32_t> viewSize;
1112 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1113
1114 // Copy vector
1115 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1116 {
1117 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1118 }
1119
1120 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1121 m_flatBufferBuilder.CreateVector(viewSize)));
1122 }
1123
1124 // Create FlatBuffer ViewsDescriptor
1125 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1126 flatBufferOriginDescriptor,
1127 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1128
1129 // Create FlatBuffer BaseLayer
1130 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1131
1132 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1133 flatBufferBaseLayer,
1134 flatBufferViewsDescriptor);
1135
1136 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1137}
1138
Nina Drozd57728782019-02-27 10:53:27 +00001139void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1140 const armnn::NormalizationDescriptor& descriptor,
1141 const char* name)
1142{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001143 boost::ignore_unused(name);
1144
Nina Drozd57728782019-02-27 10:53:27 +00001145 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1146
1147 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1148 m_flatBufferBuilder,
1149 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1150 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1151 descriptor.m_NormSize,
1152 descriptor.m_Alpha,
1153 descriptor.m_Beta,
1154 descriptor.m_K,
1155 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1156
1157 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1158 fbNormalizationBaseLayer,
1159 fbNormalizationDescriptor);
1160
1161 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1162}
1163
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001164void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1165 const armnn::StackDescriptor& stackDescriptor,
1166 const char* name)
1167{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001168 boost::ignore_unused(name);
1169
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001170 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1171
1172 std::vector<unsigned int> inputShape;
1173 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1174 {
1175 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1176 }
1177
1178 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1179 stackDescriptor.m_Axis,
1180 stackDescriptor.m_NumInputs,
1181 m_flatBufferBuilder.CreateVector(inputShape));
1182
1183 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1184 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001185}
1186
Derek Lamberti013c3902019-10-21 10:46:16 +01001187void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1188 const armnn::StandInDescriptor& standInDescriptor,
1189 const char *name)
1190{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001191 boost::ignore_unused(name);
1192
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001193 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1194 standInDescriptor.m_NumInputs,
1195 standInDescriptor.m_NumOutputs);
1196
1197 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1198 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1199
1200 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001201}
1202
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001203void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1204 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1205 const char* name)
1206{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001207 boost::ignore_unused(name);
1208
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001209 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1210
1211 auto flatBufferDescriptor =
1212 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1213 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1214 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1215 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1216 stridedSliceDescriptor.m_BeginMask,
1217 stridedSliceDescriptor.m_EndMask,
1218 stridedSliceDescriptor.m_ShrinkAxisMask,
1219 stridedSliceDescriptor.m_EllipsisMask,
1220 stridedSliceDescriptor.m_NewAxisMask,
1221 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1222
1223 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1224 flatBufferBaseLayer,
1225 flatBufferDescriptor);
1226
1227 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1228}
1229
Conor Kennedyda1f9752019-03-01 14:37:12 +00001230void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1231{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001232 boost::ignore_unused(name);
1233
Conor Kennedyda1f9752019-03-01 14:37:12 +00001234 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1235 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1236
1237 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1238}
1239
Sadik Armaganeff363d2019-04-05 15:25:46 +01001240void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1241{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001242 boost::ignore_unused(name);
1243
Sadik Armaganeff363d2019-04-05 15:25:46 +01001244 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1245 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1246
1247 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1248}
1249
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001250void SerializerVisitor::VisitTransposeConvolution2dLayer(
1251 const armnn::IConnectableLayer* layer,
1252 const armnn::TransposeConvolution2dDescriptor& descriptor,
1253 const armnn::ConstTensor& weights,
1254 const armnn::Optional<armnn::ConstTensor>& biases,
1255 const char* name)
1256{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001257 boost::ignore_unused(name);
1258
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001259 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1260 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1261 descriptor.m_PadLeft,
1262 descriptor.m_PadRight,
1263 descriptor.m_PadTop,
1264 descriptor.m_PadBottom,
1265 descriptor.m_StrideX,
1266 descriptor.m_StrideY,
1267 descriptor.m_BiasEnabled,
1268 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1269
1270 // weights & biases
1271 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1272 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1273 if (biases.has_value())
1274 {
1275 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1276 }
1277
1278 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1279 fbBaseLayer,
1280 fbDescriptor,
1281 fbWeightsConstTensorInfo,
1282 fbBiasesConstTensorInfo);
1283
1284 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001285}
1286
James Conroyee18dc82019-07-17 11:27:46 +01001287void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1288 const armnn::QuantizedLstmInputParams& params,
1289 const char* name)
1290{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001291 boost::ignore_unused(name);
1292
Jan Eilers5b01a892019-07-23 09:47:43 +01001293 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1294
1295 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001296 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1297 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1298 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1299 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001300
Francis Murtaghbb590b42019-08-14 09:51:36 +01001301 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1302 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1303 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1304 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001305
Francis Murtaghbb590b42019-08-14 09:51:36 +01001306 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1307 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1308 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1309 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001310
1311 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1312 m_flatBufferBuilder,
1313 inputToInputWeights,
1314 inputToForgetWeights,
1315 inputToCellWeights,
1316 inputToOutputWeights,
1317 recurrentToInputWeights,
1318 recurrentToForgetWeights,
1319 recurrentToCellWeights,
1320 recurrentToOutputWeights,
1321 inputGateBias,
1322 forgetGateBias,
1323 cellBias,
1324 outputGateBias);
1325
1326 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1327 m_flatBufferBuilder,
1328 fbQuantizedLstmBaseLayer,
1329 fbQuantizedLstmParams);
1330
1331 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001332}
1333
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001334fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001335 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001336{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001337
Sadik Armagandb059fd2019-03-20 12:28:32 +00001338 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1339
Mike Kelly8c1701a2019-02-11 17:01:27 +00001340 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1341 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1342
1343 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001344 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001345 m_flatBufferBuilder.CreateString(layer->GetName()),
1346 layerType,
1347 m_flatBufferBuilder.CreateVector(inputSlots),
1348 m_flatBufferBuilder.CreateVector(outputSlots));
1349}
1350
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001351void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001352{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001353
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001354 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001355 m_serializedLayers.push_back(anyLayer);
1356}
1357
Mike Kellya0766c32019-02-19 17:22:07 +00001358template <typename T>
1359flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1360{
1361 const T* buffer = reinterpret_cast<const T*>(memory);
1362 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1363 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1364 return fbVector;
1365}
1366
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001367flatbuffers::Offset<serializer::ConstTensor>
1368 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001369{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001370 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001371
1372 // Get the dimensions
1373 std::vector<unsigned int> shape;
1374
1375 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1376 {
1377 shape.push_back(tensorInfo.GetShape()[dim]);
1378 }
1379
1380 // Create FlatBuffer TensorInfo
1381 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1382 m_flatBufferBuilder.CreateVector(shape),
1383 GetFlatBufferDataType(tensorInfo.GetDataType()),
1384 tensorInfo.GetQuantizationScale(),
1385 tensorInfo.GetQuantizationOffset());
1386 flatbuffers::Offset<void> fbPayload;
1387
1388 switch (tensorInfo.GetDataType())
1389 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001390 case armnn::DataType::Float32:
1391 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001392 {
1393 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1394 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1395 m_flatBufferBuilder,
1396 fbVector);
1397 fbPayload = flatBuffersData.o;
1398 break;
1399 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001400 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001401 {
1402 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1403 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1404 m_flatBufferBuilder,
1405 fbVector);
1406 fbPayload = flatBuffersData.o;
1407 break;
1408 }
Derek Lambertif90c56d2020-01-10 17:14:08 +00001409 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001410 {
1411 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1412 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1413 m_flatBufferBuilder,
1414 fbVector);
1415 fbPayload = flatBuffersData.o;
1416 break;
1417 }
Derek Lambertif90c56d2020-01-10 17:14:08 +00001418 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001419 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001420 default:
1421 {
1422 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1423 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1424 m_flatBufferBuilder,
1425 fbVector);
1426 fbPayload = flatBuffersData.o;
1427 }
1428 }
1429 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1430 m_flatBufferBuilder,
1431 flatBufferTensorInfo,
1432 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1433 fbPayload);
1434 return flatBufferConstTensor;
1435}
1436
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001437std::vector<fb::Offset<serializer::InputSlot>>
1438 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001439{
Mike Kellya0766c32019-02-19 17:22:07 +00001440 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001441
1442 // Get the InputSlots
1443 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1444 {
1445 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1446
1447 // Get the Connection for the InputSlot
1448 const IOutputSlot* connection = inputSlot.GetConnection();
1449
1450 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001451 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1452 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001453 // Create FlatBuffer InputSlot
1454 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1455 }
1456 return inputSlots;
1457}
1458
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001459std::vector<fb::Offset<serializer::OutputSlot>>
1460 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001461{
1462 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1463
1464 // Get the OutputSlots
1465 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1466 {
1467 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001468 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001469
1470 // Get the dimensions
1471 std::vector<unsigned int> shape;
1472 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1473 {
1474 shape.push_back(tensorInfo.GetShape()[dim]);
1475 }
1476
1477 // Create FlatBuffer TensorInfo
1478 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1479 m_flatBufferBuilder.CreateVector(shape),
1480 GetFlatBufferDataType(tensorInfo.GetDataType()),
1481 tensorInfo.GetQuantizationScale(),
1482 tensorInfo.GetQuantizationOffset());
1483
1484 // Create FlatBuffer Outputslot
1485 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1486 slotIndex,
1487 flatBufferTensorInfo));
1488 }
1489 return outputSlots;
1490}
1491
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001492
1493ISerializer* ISerializer::CreateRaw()
1494{
1495 return new Serializer();
1496}
1497
1498ISerializerPtr ISerializer::Create()
1499{
1500 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1501}
1502
1503void ISerializer::Destroy(ISerializer* serializer)
1504{
1505 delete serializer;
1506}
1507
1508void Serializer::Serialize(const INetwork& inNetwork)
1509{
1510 // Iterate through to network
1511 inNetwork.Accept(m_SerializerVisitor);
1512 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1513
1514 // Create FlatBuffer SerializedGraph
1515 auto serializedGraph = serializer::CreateSerializedGraph(
1516 fbBuilder,
1517 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1518 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1519 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1520
1521 // Serialize the graph
1522 fbBuilder.Finish(serializedGraph);
1523}
1524
1525bool Serializer::SaveSerializedToStream(std::ostream& stream)
1526{
1527 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1528
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001529 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1530 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001531 return !stream.bad();
1532}
1533
Matteo Martincighec333912019-02-13 15:12:39 +00001534} // namespace armnnSerializer