blob: 61223518123d948ae2db57c5e551fd720729fd70 [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
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001093void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1094 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1095 const char* name)
1096{
1097 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1098
1099 auto flatBufferDescriptor =
1100 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1101 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1102 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1103 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1104 stridedSliceDescriptor.m_BeginMask,
1105 stridedSliceDescriptor.m_EndMask,
1106 stridedSliceDescriptor.m_ShrinkAxisMask,
1107 stridedSliceDescriptor.m_EllipsisMask,
1108 stridedSliceDescriptor.m_NewAxisMask,
1109 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1110
1111 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1112 flatBufferBaseLayer,
1113 flatBufferDescriptor);
1114
1115 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1116}
1117
Conor Kennedyda1f9752019-03-01 14:37:12 +00001118void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1119{
1120 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1121 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1122
1123 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1124}
1125
Sadik Armaganeff363d2019-04-05 15:25:46 +01001126void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1127{
1128 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1129 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1130
1131 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1132}
1133
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001134void SerializerVisitor::VisitTransposeConvolution2dLayer(
1135 const armnn::IConnectableLayer* layer,
1136 const armnn::TransposeConvolution2dDescriptor& descriptor,
1137 const armnn::ConstTensor& weights,
1138 const armnn::Optional<armnn::ConstTensor>& biases,
1139 const char* name)
1140{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001141 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1142 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1143 descriptor.m_PadLeft,
1144 descriptor.m_PadRight,
1145 descriptor.m_PadTop,
1146 descriptor.m_PadBottom,
1147 descriptor.m_StrideX,
1148 descriptor.m_StrideY,
1149 descriptor.m_BiasEnabled,
1150 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1151
1152 // weights & biases
1153 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1154 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1155 if (biases.has_value())
1156 {
1157 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1158 }
1159
1160 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1161 fbBaseLayer,
1162 fbDescriptor,
1163 fbWeightsConstTensorInfo,
1164 fbBiasesConstTensorInfo);
1165
1166 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001167}
1168
James Conroyee18dc82019-07-17 11:27:46 +01001169void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1170 const armnn::QuantizedLstmInputParams& params,
1171 const char* name)
1172{
Jan Eilers5b01a892019-07-23 09:47:43 +01001173 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1174
1175 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001176 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1177 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1178 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1179 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001180
Francis Murtaghbb590b42019-08-14 09:51:36 +01001181 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1182 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1183 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1184 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001185
Francis Murtaghbb590b42019-08-14 09:51:36 +01001186 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1187 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1188 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1189 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001190
1191 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1192 m_flatBufferBuilder,
1193 inputToInputWeights,
1194 inputToForgetWeights,
1195 inputToCellWeights,
1196 inputToOutputWeights,
1197 recurrentToInputWeights,
1198 recurrentToForgetWeights,
1199 recurrentToCellWeights,
1200 recurrentToOutputWeights,
1201 inputGateBias,
1202 forgetGateBias,
1203 cellBias,
1204 outputGateBias);
1205
1206 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1207 m_flatBufferBuilder,
1208 fbQuantizedLstmBaseLayer,
1209 fbQuantizedLstmParams);
1210
1211 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001212}
1213
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001214fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001215 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001216{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001217 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1218
Mike Kelly8c1701a2019-02-11 17:01:27 +00001219 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1220 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1221
1222 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001223 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001224 m_flatBufferBuilder.CreateString(layer->GetName()),
1225 layerType,
1226 m_flatBufferBuilder.CreateVector(inputSlots),
1227 m_flatBufferBuilder.CreateVector(outputSlots));
1228}
1229
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001230void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001231{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001232 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001233 m_serializedLayers.push_back(anyLayer);
1234}
1235
Mike Kellya0766c32019-02-19 17:22:07 +00001236template <typename T>
1237flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1238{
1239 const T* buffer = reinterpret_cast<const T*>(memory);
1240 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1241 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1242 return fbVector;
1243}
1244
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001245flatbuffers::Offset<serializer::ConstTensor>
1246 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001247{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001248 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001249
1250 // Get the dimensions
1251 std::vector<unsigned int> shape;
1252
1253 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1254 {
1255 shape.push_back(tensorInfo.GetShape()[dim]);
1256 }
1257
1258 // Create FlatBuffer TensorInfo
1259 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1260 m_flatBufferBuilder.CreateVector(shape),
1261 GetFlatBufferDataType(tensorInfo.GetDataType()),
1262 tensorInfo.GetQuantizationScale(),
1263 tensorInfo.GetQuantizationOffset());
1264 flatbuffers::Offset<void> fbPayload;
1265
1266 switch (tensorInfo.GetDataType())
1267 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001268 case armnn::DataType::Float32:
1269 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001270 {
1271 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1272 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1273 m_flatBufferBuilder,
1274 fbVector);
1275 fbPayload = flatBuffersData.o;
1276 break;
1277 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001278 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001279 {
1280 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1281 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1282 m_flatBufferBuilder,
1283 fbVector);
1284 fbPayload = flatBuffersData.o;
1285 break;
1286 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001287 case armnn::DataType::QuantisedSymm16:
1288 {
1289 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1290 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1291 m_flatBufferBuilder,
1292 fbVector);
1293 fbPayload = flatBuffersData.o;
1294 break;
1295 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001296 case armnn::DataType::QuantisedAsymm8:
1297 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001298 default:
1299 {
1300 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1301 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1302 m_flatBufferBuilder,
1303 fbVector);
1304 fbPayload = flatBuffersData.o;
1305 }
1306 }
1307 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1308 m_flatBufferBuilder,
1309 flatBufferTensorInfo,
1310 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1311 fbPayload);
1312 return flatBufferConstTensor;
1313}
1314
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001315std::vector<fb::Offset<serializer::InputSlot>>
1316 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001317{
Mike Kellya0766c32019-02-19 17:22:07 +00001318 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001319
1320 // Get the InputSlots
1321 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1322 {
1323 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1324
1325 // Get the Connection for the InputSlot
1326 const IOutputSlot* connection = inputSlot.GetConnection();
1327
1328 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001329 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1330 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001331 // Create FlatBuffer InputSlot
1332 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1333 }
1334 return inputSlots;
1335}
1336
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001337std::vector<fb::Offset<serializer::OutputSlot>>
1338 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001339{
1340 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1341
1342 // Get the OutputSlots
1343 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1344 {
1345 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001346 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001347
1348 // Get the dimensions
1349 std::vector<unsigned int> shape;
1350 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1351 {
1352 shape.push_back(tensorInfo.GetShape()[dim]);
1353 }
1354
1355 // Create FlatBuffer TensorInfo
1356 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1357 m_flatBufferBuilder.CreateVector(shape),
1358 GetFlatBufferDataType(tensorInfo.GetDataType()),
1359 tensorInfo.GetQuantizationScale(),
1360 tensorInfo.GetQuantizationOffset());
1361
1362 // Create FlatBuffer Outputslot
1363 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1364 slotIndex,
1365 flatBufferTensorInfo));
1366 }
1367 return outputSlots;
1368}
1369
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001370
1371ISerializer* ISerializer::CreateRaw()
1372{
1373 return new Serializer();
1374}
1375
1376ISerializerPtr ISerializer::Create()
1377{
1378 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1379}
1380
1381void ISerializer::Destroy(ISerializer* serializer)
1382{
1383 delete serializer;
1384}
1385
1386void Serializer::Serialize(const INetwork& inNetwork)
1387{
1388 // Iterate through to network
1389 inNetwork.Accept(m_SerializerVisitor);
1390 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1391
1392 // Create FlatBuffer SerializedGraph
1393 auto serializedGraph = serializer::CreateSerializedGraph(
1394 fbBuilder,
1395 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1396 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1397 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1398
1399 // Serialize the graph
1400 fbBuilder.Finish(serializedGraph);
1401}
1402
1403bool Serializer::SaveSerializedToStream(std::ostream& stream)
1404{
1405 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1406
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001407 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1408 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001409 return !stream.bad();
1410}
1411
Matteo Martincighec333912019-02-13 15:12:39 +00001412} // namespace armnnSerializer