blob: d147d47f41f1a846661618a07e1800750c0f673e [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
8#include "SerializerUtils.hpp"
9
Mike Kelly8c1701a2019-02-11 17:01:27 +000010#include <armnn/ArmNN.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
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010014#include <boost/numeric/conversion/cast.hpp>
15
Mike Kelly8c1701a2019-02-11 17:01:27 +000016#include <flatbuffers/util.h>
17
18using namespace armnn;
19namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000020namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000021
22namespace armnnSerializer
23{
24
Mike Kellyaf484012019-02-20 16:53:11 +000025serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
26{
27 switch (function)
28 {
29 case armnn::ActivationFunction::Sigmoid:
30 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
31 case armnn::ActivationFunction::TanH:
32 return serializer::ActivationFunction::ActivationFunction_TanH;
33 case armnn::ActivationFunction::Linear:
34 return serializer::ActivationFunction::ActivationFunction_Linear;
35 case armnn::ActivationFunction::ReLu:
36 return serializer::ActivationFunction::ActivationFunction_ReLu;
37 case armnn::ActivationFunction::BoundedReLu:
38 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
39 case armnn::ActivationFunction::LeakyReLu:
40 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
41 case armnn::ActivationFunction::Abs:
42 return serializer::ActivationFunction::ActivationFunction_Abs;
43 case armnn::ActivationFunction::Sqrt:
44 return serializer::ActivationFunction::ActivationFunction_Sqrt;
45 case armnn::ActivationFunction::Square:
46 return serializer::ActivationFunction::ActivationFunction_Square;
47 default:
48 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
49 }
50}
51
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010052serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
53{
54 switch (function)
55 {
56 case armnn::ArgMinMaxFunction::Max:
57 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
58 case armnn::ArgMinMaxFunction::Min:
59 default:
60 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
61 }
62}
63
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000064uint32_t SerializerVisitor::GetSerializedId(unsigned int guid)
65{
66 std::pair<unsigned int, uint32_t> guidPair(guid, m_layerId);
67
68 if (m_guidMap.empty())
69 {
70 m_guidMap.insert(guidPair);
71 }
72 else if (m_guidMap.find(guid) == m_guidMap.end())
73 {
74 guidPair.second = ++m_layerId;
75 m_guidMap.insert(guidPair);
76 return m_layerId;
77 }
Saoirse Stewart30211042019-02-18 17:19:16 +000078 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000079}
80
Mike Kelly8c1701a2019-02-11 17:01:27 +000081// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000082void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000083{
84 // Create FlatBuffer BaseLayer
85 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
86
87 // Create FlatBuffer BindableBaseLayer
88 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
89 flatBufferInputBaseLayer,
90 id);
Mike Kelly8c1701a2019-02-11 17:01:27 +000091 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000092 m_inputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +000093
94 // Create the FlatBuffer InputLayer
95 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
96
97 // Add the AnyLayer to the FlatBufferLayers
98 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
99}
100
101// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000102void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000103{
104 // Create FlatBuffer BaseLayer
105 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
106
107 // Create FlatBuffer BindableBaseLayer
108 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
109 flatBufferOutputBaseLayer,
110 id);
111 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000112 m_outputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000113
114 // Create the FlatBuffer OutputLayer
115 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
116 // Add the AnyLayer to the FlatBufferLayers
117 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
118}
119
Kevin May868eb142019-09-04 17:29:31 +0100120void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
121{
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100122 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
123 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
124
125 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100126}
127
Mike Kellyaf484012019-02-20 16:53:11 +0000128// Build FlatBuffer for Activation Layer
129void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
130 const armnn::ActivationDescriptor& descriptor,
131 const char* name)
132{
133 // Create FlatBuffer BaseLayer
134 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
135
136 // Create the FlatBuffer ActivationDescriptor
137 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
138 GetFlatBufferActivationFunction(descriptor.m_Function),
139 descriptor.m_A,
140 descriptor.m_B);
141
142 // Create the FlatBuffer ActivationLayer
143 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
144 flatBufferBaseLayer,
145 flatBufferDescriptor);
146
147 // Add the AnyLayer to the FlatBufferLayers
148 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
149}
150
Mike Kelly8c1701a2019-02-11 17:01:27 +0000151// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000152void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000153{
154 // Create FlatBuffer BaseLayer
155 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
156
157 // Create the FlatBuffer AdditionLayer
158 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
159
160 // Add the AnyLayer to the FlatBufferLayers
161 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
162}
163
Nikhil Rajee391d52019-09-05 17:50:44 +0100164// Build FlatBuffer for ArgMinMax Layer
165void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
166 const armnn::ArgMinMaxDescriptor& descriptor,
167 const char *name)
168{
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100169 // Create FlatBuffer BaseLayer
170 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
171
172 // Create FlatBuffer Descriptor
173 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
174 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
175 descriptor.m_Axis);
176
177 // Create FlatBuffer ArgMinMaxLayer
178 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
179 flatBufferBaseLayer,
180 flatBufferDescriptor);
181
182 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100183}
184
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000185// Build FlatBuffer for BatchToSpaceNd Layer
186void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
187 const armnn::BatchToSpaceNdDescriptor& descriptor,
188 const char* name)
189{
190 // Create FlatBuffer BaseLayer
191 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
192
193 std::vector<unsigned int> crops;
194 crops.reserve(descriptor.m_Crops.size() * 2);
195 for (auto& crop : descriptor.m_Crops)
196 {
197 crops.push_back(crop.first);
198 crops.push_back(crop.second);
199 }
200
201 auto flatBufferDescriptor =
202 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
203 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
204 m_flatBufferBuilder.CreateVector(crops),
205 GetFlatBufferDataLayout(descriptor.m_DataLayout));
206
207 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
208 flatBufferBaseLayer,
209 flatBufferDescriptor);
210
211 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
212}
213
ruoyan018e7fa232019-02-28 15:09:07 +0000214void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
215 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
216 const armnn::ConstTensor& mean,
217 const armnn::ConstTensor& variance,
218 const armnn::ConstTensor& beta,
219 const armnn::ConstTensor& gamma,
220 const char* name)
221{
222 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
223 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
224 m_flatBufferBuilder,
225 batchNormDescriptor.m_Eps,
226 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
227
228 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
229 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
230 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
231 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
232 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
233 fbBatchNormalizationBaseLayer,
234 fbBatchNormalizationDescriptor,
235 fbMeanConstTensorInfo,
236 fbVarianceConstTensorInfo,
237 fbBetaConstTensorInfo,
238 fbGammaConstTensorInfo);
239
240 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
241}
242
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100243void SerializerVisitor::VisitComparisonLayer(const armnn::IConnectableLayer* layer,
244 const armnn::ComparisonDescriptor& descriptor,
245 const char* name)
246{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100247 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
248 auto fbDescriptor = serializer::CreateComparisonDescriptor(
249 m_flatBufferBuilder,
250 GetFlatBufferComparisonOperation(descriptor.m_Operation));
251
252 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
253 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100254}
255
Conor Kennedy76277882019-02-26 08:29:54 +0000256// Build FlatBuffer for Constant Layer
257void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
258 const armnn::ConstTensor& input,
259 const char* name)
260{
261 // Create FlatBuffer BaseLayer
262 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
263
264 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
265
266 // Create the FlatBuffer ConstantLayer
267 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
268 flatBufferConstantBaseLayer,
269 flatBufferConstTensorInfo);
270
271 // Add the AnyLayer to the FlatBufferLayers
272 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
273}
274
Mike Kellya0766c32019-02-19 17:22:07 +0000275// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000276void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
277 const armnn::Convolution2dDescriptor& descriptor,
278 const armnn::ConstTensor& weights,
279 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000280 const char* name)
281{
282 // Create FlatBuffer BaseLayer
283 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
284
285 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
286 descriptor.m_PadLeft,
287 descriptor.m_PadRight,
288 descriptor.m_PadTop,
289 descriptor.m_PadBottom,
290 descriptor.m_StrideX,
291 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100292 descriptor.m_DilationX,
293 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000294 descriptor.m_BiasEnabled,
295 GetFlatBufferDataLayout(descriptor.m_DataLayout));
296 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
297 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
298
299 if (biases.has_value())
300 {
301 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
302 }
303
304 // Create the FlatBuffer Convolution2dLayer
305 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
306 flatBufferBaseLayer,
307 flatBufferDescriptor,
308 flatBufferWeightsConstTensorInfo,
309 flatBufferBiasesConstTensorInfo);
310
311 // Add the AnyLayer to the FlatBufferLayers
312 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
313}
314
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100315void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
316 const armnn::DepthToSpaceDescriptor& descriptor,
317 const char* name)
318{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100319 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
320 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
321 descriptor.m_BlockSize,
322 GetFlatBufferDataLayout(descriptor.m_DataLayout));
323
324 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
325
326 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100327}
328
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000329void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
330 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
331 const armnn::ConstTensor& weights,
332 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000333 const char* name)
334{
335 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
336 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
337 descriptor.m_PadLeft,
338 descriptor.m_PadRight,
339 descriptor.m_PadTop,
340 descriptor.m_PadBottom,
341 descriptor.m_StrideX,
342 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100343 descriptor.m_DilationX,
344 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000345 descriptor.m_BiasEnabled,
346 GetFlatBufferDataLayout(descriptor.m_DataLayout));
347
348 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
349 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
350 if (biases.has_value())
351 {
352 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
353 }
354
355 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
356 fbBaseLayer,
357 fbDescriptor,
358 fbWeightsConstTensorInfo,
359 fbBiasesConstTensorInfo);
360
361 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
362}
363
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000364void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
365 const char* name)
366{
367 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
368 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
369
370 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
371}
372
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000373void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
374 const armnn::DetectionPostProcessDescriptor& descriptor,
375 const armnn::ConstTensor& anchors,
376 const char* name)
377{
378 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
379 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
380 descriptor.m_MaxDetections,
381 descriptor.m_MaxClassesPerDetection,
382 descriptor.m_DetectionsPerClass,
383 descriptor.m_NmsScoreThreshold,
384 descriptor.m_NmsIouThreshold,
385 descriptor.m_NumClasses,
386 descriptor.m_UseRegularNms,
387 descriptor.m_ScaleX,
388 descriptor.m_ScaleY,
389 descriptor.m_ScaleW,
390 descriptor.m_ScaleH);
391
392 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
393
394 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
395 fbBaseLayer,
396 fbDescriptor,
397 fbAnchorsConstTensorInfo);
398
399 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
400}
401
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000402void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
403{
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000404 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
405 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000406
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000407 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
408}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000409
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000410void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
411{
412 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
413 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
414
415 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
416}
417
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000418void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
419{
420 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
421 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
422
423 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
424}
425
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000426void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
427{
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000428 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
429 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000430
431 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
432}
433
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000434void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
435{
436 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000437 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000438
439 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
440}
441
Kevin Mayce5045a2019-10-02 14:07:47 +0100442void SerializerVisitor::VisitInstanceNormalizationLayer(
443 const armnn::IConnectableLayer* layer,
444 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
445 const char* name)
446{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100447 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
448 m_flatBufferBuilder,
449 instanceNormalizationDescriptor.m_Gamma,
450 instanceNormalizationDescriptor.m_Beta,
451 instanceNormalizationDescriptor.m_Eps,
452 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
453
454 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
455 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
456
457 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100458}
459
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000460void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
461 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
462 const char* name)
463{
464 // Create FlatBuffer BaseLayer
465 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
466
467 // Create the FlatBuffer L2Normalization Descriptor
468 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100469 m_flatBufferBuilder,
470 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
471 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000472
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100473 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000474 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
475
476 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
477}
478
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100479void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
480 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
481 const char* name)
482{
Sadik Armagan26257852019-10-14 13:00:47 +0100483 // Create FlatBuffer BaseLayer
484 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
485
486 // Create the FlatBuffer LogSoftmaxDescriptor
487 auto flatBufferLogSoftmaxDesc =
488 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
489 logSoftmaxDescriptor.m_Beta,
490 logSoftmaxDescriptor.m_Axis);
491
492 // Create the FlatBuffer LogSoftmaxLayer
493 auto flatBufferLogSoftmaxLayer =
494 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
495 flatBufferLogSoftmaxBaseLayer,
496 flatBufferLogSoftmaxDesc);
497
498 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100499}
500
501void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
502 const armnn::LstmDescriptor& descriptor,
503 const armnn::LstmInputParams& params,
504 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000505{
506 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
507
508 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
509 m_flatBufferBuilder,
510 descriptor.m_ActivationFunc,
511 descriptor.m_ClippingThresCell,
512 descriptor.m_ClippingThresProj,
513 descriptor.m_CifgEnabled,
514 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100515 descriptor.m_ProjectionEnabled,
516 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000517
518 // Get mandatory input parameters
519 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
520 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
521 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
522 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
523 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
524 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
525 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
526 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
527 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
528
529 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
530 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
531 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
532 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
533 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
534 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
535 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
536 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
537 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100538 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
539 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
540 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
541 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000542
543 if (!descriptor.m_CifgEnabled)
544 {
545 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
546 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
547 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
548 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
549 }
550
551 if (descriptor.m_ProjectionEnabled)
552 {
553 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
554 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
555 }
556
557 if (descriptor.m_PeepholeEnabled)
558 {
559 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
560 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
561 }
562
Jan Eilersf8c62972019-07-17 11:07:49 +0100563 if (descriptor.m_LayerNormEnabled)
564 {
565 if (!descriptor.m_CifgEnabled)
566 {
567 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
568 }
569 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
570 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
571 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
572 }
573
Jim Flynn11af3752019-03-19 17:22:29 +0000574 auto fbLstmParams = serializer::CreateLstmInputParams(
575 m_flatBufferBuilder,
576 inputToForgetWeights,
577 inputToCellWeights,
578 inputToOutputWeights,
579 recurrentToForgetWeights,
580 recurrentToCellWeights,
581 recurrentToOutputWeights,
582 forgetGateBias,
583 cellBias,
584 outputGateBias,
585 inputToInputWeights,
586 recurrentToInputWeights,
587 cellToInputWeights,
588 inputGateBias,
589 projectionWeights,
590 projectionBias,
591 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100592 cellToOutputWeights,
593 inputLayerNormWeights,
594 forgetLayerNormWeights,
595 cellLayerNormWeights,
596 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000597
598 auto fbLstmLayer = serializer::CreateLstmLayer(
599 m_flatBufferBuilder,
600 fbLstmBaseLayer,
601 fbLstmDescriptor,
602 fbLstmParams);
603
604 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
605}
606
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000607void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
608{
609 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
610 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
611
612 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
613}
614
615void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
616 const armnn::MeanDescriptor& descriptor,
617 const char* name)
618{
619 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
620 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
621 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
622 descriptor.m_KeepDims);
623
624 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
625 fbMeanBaseLayer,
626 fbMeanDescriptor);
627
628 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
629}
630
631void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
632{
633 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
634 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
635
636 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
637}
638
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100639void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
640{
641 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
642 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
643
644 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
645}
646
Jim Flynnac25a1b2019-02-28 10:40:49 +0000647void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100648 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000649 const char* name)
650{
Jim Flynne242f2d2019-05-22 14:24:13 +0100651 VisitConcatLayer(layer, mergerDescriptor, name);
652}
653
654void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
655 const armnn::ConcatDescriptor& concatDescriptor,
656 const char* name)
657{
658 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000659
660 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100661 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000662 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100663 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000664 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100665 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000666 {
667 origins.push_back(origin[d]);
668 }
669 auto view = m_flatBufferBuilder.CreateVector(origins);
670 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
671 views.push_back(uintVector);
672 }
673
Jim Flynne242f2d2019-05-22 14:24:13 +0100674 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
675 concatDescriptor.GetConcatAxis(),
676 concatDescriptor.GetNumViews(),
677 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000678 m_flatBufferBuilder.CreateVector(views));
679
Jim Flynne242f2d2019-05-22 14:24:13 +0100680 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
681 flatBufferConcatBaseLayer,
682 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000683
Jim Flynne242f2d2019-05-22 14:24:13 +0100684 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000685}
686
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000687void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000688{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000689 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
690 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
691 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000692
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000693 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000694}
695
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000696void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
697 const armnn::PadDescriptor& padDescriptor,
698 const char* name)
699{
700 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
701
702 std::vector<unsigned int> padList;
703 for (auto& p: padDescriptor.m_PadList)
704 {
705 padList.push_back(p.first);
706 padList.push_back(p.second);
707 }
708
709 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100710 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100711 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000712
713 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
714 flatBufferBaseLayer,
715 flatBufferPadDesc);
716
717 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
718}
719
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000720void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
721 const armnn::PermuteDescriptor& permuteDescriptor,
722 const char* name)
723{
724 // Create FlatBuffer BaseLayer
725 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
726
727 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100728 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000729 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100730 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000731 }
732
733 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
734 m_flatBufferBuilder.CreateVector(dimMappings));
735
736 // Create the FlatBuffer PermuteLayer
737 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
738 flatBufferPermuteBaseLayer,
739 flatBufferPermuteDesc);
740
741 // Add the AnyLayer to the FlatBufferLayers
742 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
743}
744
Saoirse Stewart263829c2019-02-19 15:54:14 +0000745// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000746void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000747 const armnn::ReshapeDescriptor& reshapeDescriptor,
748 const char* name)
749{
750 // Create FlatBuffer BaseLayer
751 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
752
753 std::vector<unsigned int> targetShape;
754 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
755 {
756 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
757 }
758
759 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
760 m_flatBufferBuilder.CreateVector(targetShape));
761
762 // Create the FlatBuffer ReshapeLayer
763 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
764 flatBufferReshapeDesc);
765
766 // Add the AnyLayer to the FlatBufferLayers
767 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
768}
769
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000770void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
771 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
772 const char* name)
773{
774 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
775
776 auto flatBufferDescriptor =
777 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
778 resizeDescriptor.m_TargetWidth,
779 resizeDescriptor.m_TargetHeight,
780 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
781
782 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
783 flatBufferBaseLayer,
784 flatBufferDescriptor);
785
786 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
787}
788
Teresa Charlina9075df2019-06-27 15:41:57 +0100789void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
790 const armnn::ResizeDescriptor& resizeDescriptor,
791 const char* name)
792{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100793 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
794
795 auto flatBufferDescriptor =
796 CreateResizeDescriptor(m_flatBufferBuilder,
797 resizeDescriptor.m_TargetHeight,
798 resizeDescriptor.m_TargetWidth,
799 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
800 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
801
802 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
803 flatBufferBaseLayer,
804 flatBufferDescriptor);
805
806 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100807}
808
Sadik Armagan8b42a382019-03-01 14:24:49 +0000809void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
810{
811 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
812 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
813
814 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
815}
816
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100817void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
818 const armnn::SliceDescriptor& sliceDescriptor,
819 const char* name)
820{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100821 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
822 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
823 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
824 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
825
826 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
827
828 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100829}
830
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000831// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000832void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
833 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000834 const char* name)
835{
836 // Create FlatBuffer BaseLayer
837 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
838
839 // Create the FlatBuffer SoftmaxDescriptor
840 auto flatBufferSoftmaxDesc =
841 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
842
843 // Create the FlatBuffer SoftmaxLayer
844 auto flatBufferSoftmaxLayer =
845 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
846 flatBufferSoftmaxBaseLayer,
847 flatBufferSoftmaxDesc);
848
849 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
850}
851
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000852void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
853 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000854 const char* name)
855{
856 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
857 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
858 m_flatBufferBuilder,
859 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
860 pooling2dDescriptor.m_PadLeft,
861 pooling2dDescriptor.m_PadRight,
862 pooling2dDescriptor.m_PadTop,
863 pooling2dDescriptor.m_PadBottom,
864 pooling2dDescriptor.m_PoolWidth,
865 pooling2dDescriptor.m_PoolHeight,
866 pooling2dDescriptor.m_StrideX,
867 pooling2dDescriptor.m_StrideY,
868 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
869 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
870 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
871
872 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
873 fbPooling2dBaseLayer,
874 fbPooling2dDescriptor);
875
876 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
877}
878
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100879void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
880 const char* name)
881{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100882 // Create FlatBuffer BaseLayer
883 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
884
885 // Create the FlatBuffer AdditionLayer
886 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
887
888 // Add the AnyLayer to the FlatBufferLayers
889 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100890}
891
Derek Lamberti87acb272019-03-27 16:51:31 +0000892void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
893{
894 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
895 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
896 fbQuantizeBaseLayer);
897 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
898}
899
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000900// Build FlatBuffer for FullyConnected Layer
901void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
902 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
903 const armnn::ConstTensor& weights,
904 const armnn::Optional<armnn::ConstTensor>& biases,
905 const char* name)
906{
907 // Create FlatBuffer BaseLayer
908 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
909
910 // Create FlatBuffer FullyConnectedDescriptor
911 auto flatBufferDescriptor =
912 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
913 fullyConnectedDescriptor.m_BiasEnabled,
914 fullyConnectedDescriptor.m_TransposeWeightMatrix);
915
916 // Create FlatBuffer weights data
917 auto flatBufferWeights = CreateConstTensorInfo(weights);
918
919 // Create FlatBuffer bias data
920 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
921 if (fullyConnectedDescriptor.m_BiasEnabled)
922 {
923 flatBufferBiases = CreateConstTensorInfo(biases.value());
924 }
925
926 // Create FlatBuffer FullyConnectedLayer
927 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
928 flatBufferBaseLayer,
929 flatBufferDescriptor,
930 flatBufferWeights,
931 flatBufferBiases);
932
933 // Add created FullyConnectedLayer to the FlatBufferLayers
934 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
935}
936
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000937// Build FlatBuffer for SpaceToBatchNd Layer
938void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
939 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
940 const char* name)
941{
942 // Create FlatBuffer BaseLayer
943 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
944
945 std::vector<unsigned int> padList;
946 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
947 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
948 {
949 padList.push_back(pad.first);
950 padList.push_back(pad.second);
951 }
952
953 auto flatBufferDescriptor =
954 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
955 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
956 m_flatBufferBuilder.CreateVector(padList),
957 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
958
959 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
960 flatBufferBaseLayer,
961 flatBufferDescriptor);
962
963 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
964}
965
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100966// Build FlatBuffer for SpaceToDepthLayer
967void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
968 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
969 const char* name)
970{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100971 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
972 auto flatBufferDescriptor =
973 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
974 spaceToDepthDescriptor.m_BlockSize,
975 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
976
977 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
978 flatBufferBaseLayer,
979 flatBufferDescriptor);
980
981 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100982}
983
Jim Flynn18ce3382019-03-08 11:08:30 +0000984// Build FlatBuffer for Splitter Layer
985void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
986 const armnn::ViewsDescriptor& viewsDescriptor,
987 const char* name)
988{
989 // Create FlatBuffer ViewOrigins
990 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
991 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
992
993 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
994 {
995 std::vector<uint32_t> viewOrigin;
996 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
997
998 // Copy vector
999 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1000 {
1001 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1002 }
1003
1004 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1005 m_flatBufferBuilder.CreateVector(viewOrigin)));
1006 }
1007
1008 // Create FlatBuffer OriginsDescriptor
1009 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1010 viewsDescriptor.GetOrigins().GetConcatAxis(),
1011 viewsDescriptor.GetOrigins().GetNumViews(),
1012 viewsDescriptor.GetOrigins().GetNumDimensions(),
1013 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1014
1015 // Create FlatBuffer ViewOrigins
1016 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1017 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1018
1019 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1020 {
1021 std::vector<uint32_t> viewSize;
1022 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1023
1024 // Copy vector
1025 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1026 {
1027 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1028 }
1029
1030 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1031 m_flatBufferBuilder.CreateVector(viewSize)));
1032 }
1033
1034 // Create FlatBuffer ViewsDescriptor
1035 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1036 flatBufferOriginDescriptor,
1037 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1038
1039 // Create FlatBuffer BaseLayer
1040 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1041
1042 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1043 flatBufferBaseLayer,
1044 flatBufferViewsDescriptor);
1045
1046 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1047}
1048
Nina Drozd57728782019-02-27 10:53:27 +00001049void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1050 const armnn::NormalizationDescriptor& descriptor,
1051 const char* name)
1052{
1053 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1054
1055 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1056 m_flatBufferBuilder,
1057 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1058 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1059 descriptor.m_NormSize,
1060 descriptor.m_Alpha,
1061 descriptor.m_Beta,
1062 descriptor.m_K,
1063 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1064
1065 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1066 fbNormalizationBaseLayer,
1067 fbNormalizationDescriptor);
1068
1069 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1070}
1071
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001072void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1073 const armnn::StackDescriptor& stackDescriptor,
1074 const char* name)
1075{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001076 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1077
1078 std::vector<unsigned int> inputShape;
1079 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1080 {
1081 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1082 }
1083
1084 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1085 stackDescriptor.m_Axis,
1086 stackDescriptor.m_NumInputs,
1087 m_flatBufferBuilder.CreateVector(inputShape));
1088
1089 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1090 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001091}
1092
Derek Lamberti013c3902019-10-21 10:46:16 +01001093void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1094 const armnn::StandInDescriptor& standInDescriptor,
1095 const char *name)
1096{
1097 // TODO: IVGCVSW-4010 Implement serialization
1098}
1099
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001100void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1101 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1102 const char* name)
1103{
1104 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1105
1106 auto flatBufferDescriptor =
1107 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1108 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1109 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1110 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1111 stridedSliceDescriptor.m_BeginMask,
1112 stridedSliceDescriptor.m_EndMask,
1113 stridedSliceDescriptor.m_ShrinkAxisMask,
1114 stridedSliceDescriptor.m_EllipsisMask,
1115 stridedSliceDescriptor.m_NewAxisMask,
1116 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1117
1118 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1119 flatBufferBaseLayer,
1120 flatBufferDescriptor);
1121
1122 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1123}
1124
Conor Kennedyda1f9752019-03-01 14:37:12 +00001125void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1126{
1127 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1128 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1129
1130 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1131}
1132
Sadik Armaganeff363d2019-04-05 15:25:46 +01001133void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1134{
1135 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1136 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1137
1138 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1139}
1140
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001141void SerializerVisitor::VisitTransposeConvolution2dLayer(
1142 const armnn::IConnectableLayer* layer,
1143 const armnn::TransposeConvolution2dDescriptor& descriptor,
1144 const armnn::ConstTensor& weights,
1145 const armnn::Optional<armnn::ConstTensor>& biases,
1146 const char* name)
1147{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001148 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1149 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1150 descriptor.m_PadLeft,
1151 descriptor.m_PadRight,
1152 descriptor.m_PadTop,
1153 descriptor.m_PadBottom,
1154 descriptor.m_StrideX,
1155 descriptor.m_StrideY,
1156 descriptor.m_BiasEnabled,
1157 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1158
1159 // weights & biases
1160 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1161 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1162 if (biases.has_value())
1163 {
1164 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1165 }
1166
1167 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1168 fbBaseLayer,
1169 fbDescriptor,
1170 fbWeightsConstTensorInfo,
1171 fbBiasesConstTensorInfo);
1172
1173 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001174}
1175
James Conroyee18dc82019-07-17 11:27:46 +01001176void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1177 const armnn::QuantizedLstmInputParams& params,
1178 const char* name)
1179{
Jan Eilers5b01a892019-07-23 09:47:43 +01001180 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1181
1182 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001183 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1184 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1185 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1186 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001187
Francis Murtaghbb590b42019-08-14 09:51:36 +01001188 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1189 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1190 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1191 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001192
Francis Murtaghbb590b42019-08-14 09:51:36 +01001193 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1194 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1195 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1196 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001197
1198 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1199 m_flatBufferBuilder,
1200 inputToInputWeights,
1201 inputToForgetWeights,
1202 inputToCellWeights,
1203 inputToOutputWeights,
1204 recurrentToInputWeights,
1205 recurrentToForgetWeights,
1206 recurrentToCellWeights,
1207 recurrentToOutputWeights,
1208 inputGateBias,
1209 forgetGateBias,
1210 cellBias,
1211 outputGateBias);
1212
1213 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1214 m_flatBufferBuilder,
1215 fbQuantizedLstmBaseLayer,
1216 fbQuantizedLstmParams);
1217
1218 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001219}
1220
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001221fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001222 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001223{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001224 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1225
Mike Kelly8c1701a2019-02-11 17:01:27 +00001226 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1227 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1228
1229 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001230 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001231 m_flatBufferBuilder.CreateString(layer->GetName()),
1232 layerType,
1233 m_flatBufferBuilder.CreateVector(inputSlots),
1234 m_flatBufferBuilder.CreateVector(outputSlots));
1235}
1236
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001237void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001238{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001239 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001240 m_serializedLayers.push_back(anyLayer);
1241}
1242
Mike Kellya0766c32019-02-19 17:22:07 +00001243template <typename T>
1244flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1245{
1246 const T* buffer = reinterpret_cast<const T*>(memory);
1247 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1248 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1249 return fbVector;
1250}
1251
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001252flatbuffers::Offset<serializer::ConstTensor>
1253 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001254{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001255 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001256
1257 // Get the dimensions
1258 std::vector<unsigned int> shape;
1259
1260 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1261 {
1262 shape.push_back(tensorInfo.GetShape()[dim]);
1263 }
1264
1265 // Create FlatBuffer TensorInfo
1266 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1267 m_flatBufferBuilder.CreateVector(shape),
1268 GetFlatBufferDataType(tensorInfo.GetDataType()),
1269 tensorInfo.GetQuantizationScale(),
1270 tensorInfo.GetQuantizationOffset());
1271 flatbuffers::Offset<void> fbPayload;
1272
1273 switch (tensorInfo.GetDataType())
1274 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001275 case armnn::DataType::Float32:
1276 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001277 {
1278 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1279 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1280 m_flatBufferBuilder,
1281 fbVector);
1282 fbPayload = flatBuffersData.o;
1283 break;
1284 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001285 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001286 {
1287 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1288 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1289 m_flatBufferBuilder,
1290 fbVector);
1291 fbPayload = flatBuffersData.o;
1292 break;
1293 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001294 case armnn::DataType::QuantisedSymm16:
1295 {
1296 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1297 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1298 m_flatBufferBuilder,
1299 fbVector);
1300 fbPayload = flatBuffersData.o;
1301 break;
1302 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001303 case armnn::DataType::QuantisedAsymm8:
1304 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001305 default:
1306 {
1307 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1308 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1309 m_flatBufferBuilder,
1310 fbVector);
1311 fbPayload = flatBuffersData.o;
1312 }
1313 }
1314 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1315 m_flatBufferBuilder,
1316 flatBufferTensorInfo,
1317 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1318 fbPayload);
1319 return flatBufferConstTensor;
1320}
1321
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001322std::vector<fb::Offset<serializer::InputSlot>>
1323 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001324{
Mike Kellya0766c32019-02-19 17:22:07 +00001325 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001326
1327 // Get the InputSlots
1328 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1329 {
1330 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1331
1332 // Get the Connection for the InputSlot
1333 const IOutputSlot* connection = inputSlot.GetConnection();
1334
1335 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001336 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1337 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001338 // Create FlatBuffer InputSlot
1339 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1340 }
1341 return inputSlots;
1342}
1343
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001344std::vector<fb::Offset<serializer::OutputSlot>>
1345 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001346{
1347 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1348
1349 // Get the OutputSlots
1350 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1351 {
1352 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001353 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001354
1355 // Get the dimensions
1356 std::vector<unsigned int> shape;
1357 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1358 {
1359 shape.push_back(tensorInfo.GetShape()[dim]);
1360 }
1361
1362 // Create FlatBuffer TensorInfo
1363 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1364 m_flatBufferBuilder.CreateVector(shape),
1365 GetFlatBufferDataType(tensorInfo.GetDataType()),
1366 tensorInfo.GetQuantizationScale(),
1367 tensorInfo.GetQuantizationOffset());
1368
1369 // Create FlatBuffer Outputslot
1370 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1371 slotIndex,
1372 flatBufferTensorInfo));
1373 }
1374 return outputSlots;
1375}
1376
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001377
1378ISerializer* ISerializer::CreateRaw()
1379{
1380 return new Serializer();
1381}
1382
1383ISerializerPtr ISerializer::Create()
1384{
1385 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1386}
1387
1388void ISerializer::Destroy(ISerializer* serializer)
1389{
1390 delete serializer;
1391}
1392
1393void Serializer::Serialize(const INetwork& inNetwork)
1394{
1395 // Iterate through to network
1396 inNetwork.Accept(m_SerializerVisitor);
1397 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1398
1399 // Create FlatBuffer SerializedGraph
1400 auto serializedGraph = serializer::CreateSerializedGraph(
1401 fbBuilder,
1402 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1403 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1404 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1405
1406 // Serialize the graph
1407 fbBuilder.Finish(serializedGraph);
1408}
1409
1410bool Serializer::SaveSerializedToStream(std::ostream& stream)
1411{
1412 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1413
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001414 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1415 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001416 return !stream.bad();
1417}
1418
Matteo Martincighec333912019-02-13 15:12:39 +00001419} // namespace armnnSerializer