blob: 5c9855f87ea7c08f44d725172c166bead96054c5 [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{
247 throw armnn::UnimplementedException("SerializerVisitor::VisitComparisonLayer() is not implemented");
248}
249
Conor Kennedy76277882019-02-26 08:29:54 +0000250// Build FlatBuffer for Constant Layer
251void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
252 const armnn::ConstTensor& input,
253 const char* name)
254{
255 // Create FlatBuffer BaseLayer
256 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
257
258 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
259
260 // Create the FlatBuffer ConstantLayer
261 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
262 flatBufferConstantBaseLayer,
263 flatBufferConstTensorInfo);
264
265 // Add the AnyLayer to the FlatBufferLayers
266 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
267}
268
Mike Kellya0766c32019-02-19 17:22:07 +0000269// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000270void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
271 const armnn::Convolution2dDescriptor& descriptor,
272 const armnn::ConstTensor& weights,
273 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000274 const char* name)
275{
276 // Create FlatBuffer BaseLayer
277 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
278
279 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
280 descriptor.m_PadLeft,
281 descriptor.m_PadRight,
282 descriptor.m_PadTop,
283 descriptor.m_PadBottom,
284 descriptor.m_StrideX,
285 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100286 descriptor.m_DilationX,
287 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000288 descriptor.m_BiasEnabled,
289 GetFlatBufferDataLayout(descriptor.m_DataLayout));
290 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
291 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
292
293 if (biases.has_value())
294 {
295 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
296 }
297
298 // Create the FlatBuffer Convolution2dLayer
299 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
300 flatBufferBaseLayer,
301 flatBufferDescriptor,
302 flatBufferWeightsConstTensorInfo,
303 flatBufferBiasesConstTensorInfo);
304
305 // Add the AnyLayer to the FlatBufferLayers
306 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
307}
308
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100309void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
310 const armnn::DepthToSpaceDescriptor& descriptor,
311 const char* name)
312{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100313 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
314 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
315 descriptor.m_BlockSize,
316 GetFlatBufferDataLayout(descriptor.m_DataLayout));
317
318 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
319
320 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100321}
322
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000323void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
324 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
325 const armnn::ConstTensor& weights,
326 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000327 const char* name)
328{
329 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
330 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
331 descriptor.m_PadLeft,
332 descriptor.m_PadRight,
333 descriptor.m_PadTop,
334 descriptor.m_PadBottom,
335 descriptor.m_StrideX,
336 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100337 descriptor.m_DilationX,
338 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000339 descriptor.m_BiasEnabled,
340 GetFlatBufferDataLayout(descriptor.m_DataLayout));
341
342 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
343 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
344 if (biases.has_value())
345 {
346 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
347 }
348
349 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
350 fbBaseLayer,
351 fbDescriptor,
352 fbWeightsConstTensorInfo,
353 fbBiasesConstTensorInfo);
354
355 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
356}
357
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000358void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
359 const char* name)
360{
361 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
362 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
363
364 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
365}
366
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000367void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
368 const armnn::DetectionPostProcessDescriptor& descriptor,
369 const armnn::ConstTensor& anchors,
370 const char* name)
371{
372 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
373 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
374 descriptor.m_MaxDetections,
375 descriptor.m_MaxClassesPerDetection,
376 descriptor.m_DetectionsPerClass,
377 descriptor.m_NmsScoreThreshold,
378 descriptor.m_NmsIouThreshold,
379 descriptor.m_NumClasses,
380 descriptor.m_UseRegularNms,
381 descriptor.m_ScaleX,
382 descriptor.m_ScaleY,
383 descriptor.m_ScaleW,
384 descriptor.m_ScaleH);
385
386 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
387
388 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
389 fbBaseLayer,
390 fbDescriptor,
391 fbAnchorsConstTensorInfo);
392
393 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
394}
395
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000396void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
397{
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000398 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
399 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000400
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000401 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
402}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000403
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000404void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
405{
406 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
407 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
408
409 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
410}
411
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000412void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
413{
414 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
415 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
416
417 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
418}
419
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000420void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
421{
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000422 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
423 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000424
425 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
426}
427
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000428void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
429{
430 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000431 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000432
433 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
434}
435
Kevin Mayce5045a2019-10-02 14:07:47 +0100436void SerializerVisitor::VisitInstanceNormalizationLayer(
437 const armnn::IConnectableLayer* layer,
438 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
439 const char* name)
440{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100441 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
442 m_flatBufferBuilder,
443 instanceNormalizationDescriptor.m_Gamma,
444 instanceNormalizationDescriptor.m_Beta,
445 instanceNormalizationDescriptor.m_Eps,
446 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
447
448 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
449 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
450
451 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100452}
453
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000454void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
455 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
456 const char* name)
457{
458 // Create FlatBuffer BaseLayer
459 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
460
461 // Create the FlatBuffer L2Normalization Descriptor
462 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100463 m_flatBufferBuilder,
464 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
465 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000466
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100467 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000468 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
469
470 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
471}
472
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100473void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
474 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
475 const char* name)
476{
Sadik Armagan26257852019-10-14 13:00:47 +0100477 // Create FlatBuffer BaseLayer
478 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
479
480 // Create the FlatBuffer LogSoftmaxDescriptor
481 auto flatBufferLogSoftmaxDesc =
482 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
483 logSoftmaxDescriptor.m_Beta,
484 logSoftmaxDescriptor.m_Axis);
485
486 // Create the FlatBuffer LogSoftmaxLayer
487 auto flatBufferLogSoftmaxLayer =
488 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
489 flatBufferLogSoftmaxBaseLayer,
490 flatBufferLogSoftmaxDesc);
491
492 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100493}
494
495void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
496 const armnn::LstmDescriptor& descriptor,
497 const armnn::LstmInputParams& params,
498 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000499{
500 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
501
502 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
503 m_flatBufferBuilder,
504 descriptor.m_ActivationFunc,
505 descriptor.m_ClippingThresCell,
506 descriptor.m_ClippingThresProj,
507 descriptor.m_CifgEnabled,
508 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100509 descriptor.m_ProjectionEnabled,
510 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000511
512 // Get mandatory input parameters
513 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
514 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
515 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
516 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
517 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
518 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
519 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
520 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
521 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
522
523 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
524 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
525 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
526 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
527 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
528 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
529 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
530 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
531 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100532 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
533 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
534 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
535 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000536
537 if (!descriptor.m_CifgEnabled)
538 {
539 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
540 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
541 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
542 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
543 }
544
545 if (descriptor.m_ProjectionEnabled)
546 {
547 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
548 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
549 }
550
551 if (descriptor.m_PeepholeEnabled)
552 {
553 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
554 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
555 }
556
Jan Eilersf8c62972019-07-17 11:07:49 +0100557 if (descriptor.m_LayerNormEnabled)
558 {
559 if (!descriptor.m_CifgEnabled)
560 {
561 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
562 }
563 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
564 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
565 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
566 }
567
Jim Flynn11af3752019-03-19 17:22:29 +0000568 auto fbLstmParams = serializer::CreateLstmInputParams(
569 m_flatBufferBuilder,
570 inputToForgetWeights,
571 inputToCellWeights,
572 inputToOutputWeights,
573 recurrentToForgetWeights,
574 recurrentToCellWeights,
575 recurrentToOutputWeights,
576 forgetGateBias,
577 cellBias,
578 outputGateBias,
579 inputToInputWeights,
580 recurrentToInputWeights,
581 cellToInputWeights,
582 inputGateBias,
583 projectionWeights,
584 projectionBias,
585 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100586 cellToOutputWeights,
587 inputLayerNormWeights,
588 forgetLayerNormWeights,
589 cellLayerNormWeights,
590 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000591
592 auto fbLstmLayer = serializer::CreateLstmLayer(
593 m_flatBufferBuilder,
594 fbLstmBaseLayer,
595 fbLstmDescriptor,
596 fbLstmParams);
597
598 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
599}
600
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000601void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
602{
603 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
604 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
605
606 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
607}
608
609void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
610 const armnn::MeanDescriptor& descriptor,
611 const char* name)
612{
613 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
614 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
615 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
616 descriptor.m_KeepDims);
617
618 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
619 fbMeanBaseLayer,
620 fbMeanDescriptor);
621
622 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
623}
624
625void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
626{
627 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
628 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
629
630 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
631}
632
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100633void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
634{
635 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
636 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
637
638 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
639}
640
Jim Flynnac25a1b2019-02-28 10:40:49 +0000641void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100642 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000643 const char* name)
644{
Jim Flynne242f2d2019-05-22 14:24:13 +0100645 VisitConcatLayer(layer, mergerDescriptor, name);
646}
647
648void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
649 const armnn::ConcatDescriptor& concatDescriptor,
650 const char* name)
651{
652 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000653
654 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100655 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000656 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100657 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000658 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100659 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000660 {
661 origins.push_back(origin[d]);
662 }
663 auto view = m_flatBufferBuilder.CreateVector(origins);
664 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
665 views.push_back(uintVector);
666 }
667
Jim Flynne242f2d2019-05-22 14:24:13 +0100668 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
669 concatDescriptor.GetConcatAxis(),
670 concatDescriptor.GetNumViews(),
671 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000672 m_flatBufferBuilder.CreateVector(views));
673
Jim Flynne242f2d2019-05-22 14:24:13 +0100674 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
675 flatBufferConcatBaseLayer,
676 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000677
Jim Flynne242f2d2019-05-22 14:24:13 +0100678 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000679}
680
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000681void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000682{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000683 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
684 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
685 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000686
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000687 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000688}
689
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000690void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
691 const armnn::PadDescriptor& padDescriptor,
692 const char* name)
693{
694 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
695
696 std::vector<unsigned int> padList;
697 for (auto& p: padDescriptor.m_PadList)
698 {
699 padList.push_back(p.first);
700 padList.push_back(p.second);
701 }
702
703 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100704 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100705 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000706
707 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
708 flatBufferBaseLayer,
709 flatBufferPadDesc);
710
711 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
712}
713
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000714void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
715 const armnn::PermuteDescriptor& permuteDescriptor,
716 const char* name)
717{
718 // Create FlatBuffer BaseLayer
719 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
720
721 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100722 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000723 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100724 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000725 }
726
727 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
728 m_flatBufferBuilder.CreateVector(dimMappings));
729
730 // Create the FlatBuffer PermuteLayer
731 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
732 flatBufferPermuteBaseLayer,
733 flatBufferPermuteDesc);
734
735 // Add the AnyLayer to the FlatBufferLayers
736 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
737}
738
Saoirse Stewart263829c2019-02-19 15:54:14 +0000739// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000740void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000741 const armnn::ReshapeDescriptor& reshapeDescriptor,
742 const char* name)
743{
744 // Create FlatBuffer BaseLayer
745 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
746
747 std::vector<unsigned int> targetShape;
748 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
749 {
750 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
751 }
752
753 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
754 m_flatBufferBuilder.CreateVector(targetShape));
755
756 // Create the FlatBuffer ReshapeLayer
757 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
758 flatBufferReshapeDesc);
759
760 // Add the AnyLayer to the FlatBufferLayers
761 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
762}
763
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000764void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
765 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
766 const char* name)
767{
768 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
769
770 auto flatBufferDescriptor =
771 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
772 resizeDescriptor.m_TargetWidth,
773 resizeDescriptor.m_TargetHeight,
774 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
775
776 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
777 flatBufferBaseLayer,
778 flatBufferDescriptor);
779
780 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
781}
782
Teresa Charlina9075df2019-06-27 15:41:57 +0100783void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
784 const armnn::ResizeDescriptor& resizeDescriptor,
785 const char* name)
786{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100787 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
788
789 auto flatBufferDescriptor =
790 CreateResizeDescriptor(m_flatBufferBuilder,
791 resizeDescriptor.m_TargetHeight,
792 resizeDescriptor.m_TargetWidth,
793 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
794 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
795
796 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
797 flatBufferBaseLayer,
798 flatBufferDescriptor);
799
800 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100801}
802
Sadik Armagan8b42a382019-03-01 14:24:49 +0000803void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
804{
805 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
806 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
807
808 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
809}
810
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100811void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
812 const armnn::SliceDescriptor& sliceDescriptor,
813 const char* name)
814{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100815 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
816 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
817 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
818 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
819
820 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
821
822 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100823}
824
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000825// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000826void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
827 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000828 const char* name)
829{
830 // Create FlatBuffer BaseLayer
831 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
832
833 // Create the FlatBuffer SoftmaxDescriptor
834 auto flatBufferSoftmaxDesc =
835 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
836
837 // Create the FlatBuffer SoftmaxLayer
838 auto flatBufferSoftmaxLayer =
839 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
840 flatBufferSoftmaxBaseLayer,
841 flatBufferSoftmaxDesc);
842
843 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
844}
845
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000846void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
847 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000848 const char* name)
849{
850 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
851 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
852 m_flatBufferBuilder,
853 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
854 pooling2dDescriptor.m_PadLeft,
855 pooling2dDescriptor.m_PadRight,
856 pooling2dDescriptor.m_PadTop,
857 pooling2dDescriptor.m_PadBottom,
858 pooling2dDescriptor.m_PoolWidth,
859 pooling2dDescriptor.m_PoolHeight,
860 pooling2dDescriptor.m_StrideX,
861 pooling2dDescriptor.m_StrideY,
862 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
863 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
864 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
865
866 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
867 fbPooling2dBaseLayer,
868 fbPooling2dDescriptor);
869
870 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
871}
872
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100873void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
874 const char* name)
875{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100876 // Create FlatBuffer BaseLayer
877 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
878
879 // Create the FlatBuffer AdditionLayer
880 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
881
882 // Add the AnyLayer to the FlatBufferLayers
883 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100884}
885
Derek Lamberti87acb272019-03-27 16:51:31 +0000886void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
887{
888 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
889 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
890 fbQuantizeBaseLayer);
891 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
892}
893
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000894// Build FlatBuffer for FullyConnected Layer
895void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
896 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
897 const armnn::ConstTensor& weights,
898 const armnn::Optional<armnn::ConstTensor>& biases,
899 const char* name)
900{
901 // Create FlatBuffer BaseLayer
902 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
903
904 // Create FlatBuffer FullyConnectedDescriptor
905 auto flatBufferDescriptor =
906 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
907 fullyConnectedDescriptor.m_BiasEnabled,
908 fullyConnectedDescriptor.m_TransposeWeightMatrix);
909
910 // Create FlatBuffer weights data
911 auto flatBufferWeights = CreateConstTensorInfo(weights);
912
913 // Create FlatBuffer bias data
914 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
915 if (fullyConnectedDescriptor.m_BiasEnabled)
916 {
917 flatBufferBiases = CreateConstTensorInfo(biases.value());
918 }
919
920 // Create FlatBuffer FullyConnectedLayer
921 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
922 flatBufferBaseLayer,
923 flatBufferDescriptor,
924 flatBufferWeights,
925 flatBufferBiases);
926
927 // Add created FullyConnectedLayer to the FlatBufferLayers
928 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
929}
930
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000931// Build FlatBuffer for SpaceToBatchNd Layer
932void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
933 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
934 const char* name)
935{
936 // Create FlatBuffer BaseLayer
937 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
938
939 std::vector<unsigned int> padList;
940 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
941 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
942 {
943 padList.push_back(pad.first);
944 padList.push_back(pad.second);
945 }
946
947 auto flatBufferDescriptor =
948 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
949 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
950 m_flatBufferBuilder.CreateVector(padList),
951 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
952
953 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
954 flatBufferBaseLayer,
955 flatBufferDescriptor);
956
957 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
958}
959
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100960// Build FlatBuffer for SpaceToDepthLayer
961void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
962 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
963 const char* name)
964{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100965 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
966 auto flatBufferDescriptor =
967 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
968 spaceToDepthDescriptor.m_BlockSize,
969 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
970
971 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
972 flatBufferBaseLayer,
973 flatBufferDescriptor);
974
975 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100976}
977
Jim Flynn18ce3382019-03-08 11:08:30 +0000978// Build FlatBuffer for Splitter Layer
979void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
980 const armnn::ViewsDescriptor& viewsDescriptor,
981 const char* name)
982{
983 // Create FlatBuffer ViewOrigins
984 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
985 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
986
987 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
988 {
989 std::vector<uint32_t> viewOrigin;
990 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
991
992 // Copy vector
993 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
994 {
995 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
996 }
997
998 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
999 m_flatBufferBuilder.CreateVector(viewOrigin)));
1000 }
1001
1002 // Create FlatBuffer OriginsDescriptor
1003 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1004 viewsDescriptor.GetOrigins().GetConcatAxis(),
1005 viewsDescriptor.GetOrigins().GetNumViews(),
1006 viewsDescriptor.GetOrigins().GetNumDimensions(),
1007 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1008
1009 // Create FlatBuffer ViewOrigins
1010 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1011 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1012
1013 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1014 {
1015 std::vector<uint32_t> viewSize;
1016 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1017
1018 // Copy vector
1019 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1020 {
1021 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1022 }
1023
1024 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1025 m_flatBufferBuilder.CreateVector(viewSize)));
1026 }
1027
1028 // Create FlatBuffer ViewsDescriptor
1029 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1030 flatBufferOriginDescriptor,
1031 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1032
1033 // Create FlatBuffer BaseLayer
1034 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1035
1036 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1037 flatBufferBaseLayer,
1038 flatBufferViewsDescriptor);
1039
1040 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1041}
1042
Nina Drozd57728782019-02-27 10:53:27 +00001043void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1044 const armnn::NormalizationDescriptor& descriptor,
1045 const char* name)
1046{
1047 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1048
1049 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1050 m_flatBufferBuilder,
1051 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1052 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1053 descriptor.m_NormSize,
1054 descriptor.m_Alpha,
1055 descriptor.m_Beta,
1056 descriptor.m_K,
1057 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1058
1059 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1060 fbNormalizationBaseLayer,
1061 fbNormalizationDescriptor);
1062
1063 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1064}
1065
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001066void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1067 const armnn::StackDescriptor& stackDescriptor,
1068 const char* name)
1069{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001070 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1071
1072 std::vector<unsigned int> inputShape;
1073 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1074 {
1075 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1076 }
1077
1078 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1079 stackDescriptor.m_Axis,
1080 stackDescriptor.m_NumInputs,
1081 m_flatBufferBuilder.CreateVector(inputShape));
1082
1083 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1084 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001085}
1086
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001087void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1088 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1089 const char* name)
1090{
1091 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1092
1093 auto flatBufferDescriptor =
1094 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1095 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1096 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1097 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1098 stridedSliceDescriptor.m_BeginMask,
1099 stridedSliceDescriptor.m_EndMask,
1100 stridedSliceDescriptor.m_ShrinkAxisMask,
1101 stridedSliceDescriptor.m_EllipsisMask,
1102 stridedSliceDescriptor.m_NewAxisMask,
1103 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1104
1105 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1106 flatBufferBaseLayer,
1107 flatBufferDescriptor);
1108
1109 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1110}
1111
Conor Kennedyda1f9752019-03-01 14:37:12 +00001112void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1113{
1114 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1115 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1116
1117 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1118}
1119
Sadik Armaganeff363d2019-04-05 15:25:46 +01001120void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1121{
1122 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1123 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1124
1125 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1126}
1127
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001128void SerializerVisitor::VisitTransposeConvolution2dLayer(
1129 const armnn::IConnectableLayer* layer,
1130 const armnn::TransposeConvolution2dDescriptor& descriptor,
1131 const armnn::ConstTensor& weights,
1132 const armnn::Optional<armnn::ConstTensor>& biases,
1133 const char* name)
1134{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001135 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1136 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1137 descriptor.m_PadLeft,
1138 descriptor.m_PadRight,
1139 descriptor.m_PadTop,
1140 descriptor.m_PadBottom,
1141 descriptor.m_StrideX,
1142 descriptor.m_StrideY,
1143 descriptor.m_BiasEnabled,
1144 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1145
1146 // weights & biases
1147 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1148 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1149 if (biases.has_value())
1150 {
1151 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1152 }
1153
1154 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1155 fbBaseLayer,
1156 fbDescriptor,
1157 fbWeightsConstTensorInfo,
1158 fbBiasesConstTensorInfo);
1159
1160 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001161}
1162
James Conroyee18dc82019-07-17 11:27:46 +01001163void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1164 const armnn::QuantizedLstmInputParams& params,
1165 const char* name)
1166{
Jan Eilers5b01a892019-07-23 09:47:43 +01001167 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1168
1169 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001170 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1171 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1172 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1173 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001174
Francis Murtaghbb590b42019-08-14 09:51:36 +01001175 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1176 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1177 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1178 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001179
Francis Murtaghbb590b42019-08-14 09:51:36 +01001180 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1181 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1182 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1183 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001184
1185 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1186 m_flatBufferBuilder,
1187 inputToInputWeights,
1188 inputToForgetWeights,
1189 inputToCellWeights,
1190 inputToOutputWeights,
1191 recurrentToInputWeights,
1192 recurrentToForgetWeights,
1193 recurrentToCellWeights,
1194 recurrentToOutputWeights,
1195 inputGateBias,
1196 forgetGateBias,
1197 cellBias,
1198 outputGateBias);
1199
1200 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1201 m_flatBufferBuilder,
1202 fbQuantizedLstmBaseLayer,
1203 fbQuantizedLstmParams);
1204
1205 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001206}
1207
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001208fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001209 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001210{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001211 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1212
Mike Kelly8c1701a2019-02-11 17:01:27 +00001213 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1214 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1215
1216 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001217 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001218 m_flatBufferBuilder.CreateString(layer->GetName()),
1219 layerType,
1220 m_flatBufferBuilder.CreateVector(inputSlots),
1221 m_flatBufferBuilder.CreateVector(outputSlots));
1222}
1223
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001224void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001225{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001226 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001227 m_serializedLayers.push_back(anyLayer);
1228}
1229
Mike Kellya0766c32019-02-19 17:22:07 +00001230template <typename T>
1231flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1232{
1233 const T* buffer = reinterpret_cast<const T*>(memory);
1234 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1235 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1236 return fbVector;
1237}
1238
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001239flatbuffers::Offset<serializer::ConstTensor>
1240 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001241{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001242 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001243
1244 // Get the dimensions
1245 std::vector<unsigned int> shape;
1246
1247 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1248 {
1249 shape.push_back(tensorInfo.GetShape()[dim]);
1250 }
1251
1252 // Create FlatBuffer TensorInfo
1253 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1254 m_flatBufferBuilder.CreateVector(shape),
1255 GetFlatBufferDataType(tensorInfo.GetDataType()),
1256 tensorInfo.GetQuantizationScale(),
1257 tensorInfo.GetQuantizationOffset());
1258 flatbuffers::Offset<void> fbPayload;
1259
1260 switch (tensorInfo.GetDataType())
1261 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001262 case armnn::DataType::Float32:
1263 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001264 {
1265 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1266 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1267 m_flatBufferBuilder,
1268 fbVector);
1269 fbPayload = flatBuffersData.o;
1270 break;
1271 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001272 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001273 {
1274 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1275 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1276 m_flatBufferBuilder,
1277 fbVector);
1278 fbPayload = flatBuffersData.o;
1279 break;
1280 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001281 case armnn::DataType::QuantisedSymm16:
1282 {
1283 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1284 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1285 m_flatBufferBuilder,
1286 fbVector);
1287 fbPayload = flatBuffersData.o;
1288 break;
1289 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001290 case armnn::DataType::QuantisedAsymm8:
1291 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001292 default:
1293 {
1294 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1295 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1296 m_flatBufferBuilder,
1297 fbVector);
1298 fbPayload = flatBuffersData.o;
1299 }
1300 }
1301 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1302 m_flatBufferBuilder,
1303 flatBufferTensorInfo,
1304 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1305 fbPayload);
1306 return flatBufferConstTensor;
1307}
1308
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001309std::vector<fb::Offset<serializer::InputSlot>>
1310 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001311{
Mike Kellya0766c32019-02-19 17:22:07 +00001312 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001313
1314 // Get the InputSlots
1315 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1316 {
1317 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1318
1319 // Get the Connection for the InputSlot
1320 const IOutputSlot* connection = inputSlot.GetConnection();
1321
1322 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001323 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1324 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001325 // Create FlatBuffer InputSlot
1326 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1327 }
1328 return inputSlots;
1329}
1330
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001331std::vector<fb::Offset<serializer::OutputSlot>>
1332 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001333{
1334 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1335
1336 // Get the OutputSlots
1337 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1338 {
1339 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001340 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001341
1342 // Get the dimensions
1343 std::vector<unsigned int> shape;
1344 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1345 {
1346 shape.push_back(tensorInfo.GetShape()[dim]);
1347 }
1348
1349 // Create FlatBuffer TensorInfo
1350 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1351 m_flatBufferBuilder.CreateVector(shape),
1352 GetFlatBufferDataType(tensorInfo.GetDataType()),
1353 tensorInfo.GetQuantizationScale(),
1354 tensorInfo.GetQuantizationOffset());
1355
1356 // Create FlatBuffer Outputslot
1357 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1358 slotIndex,
1359 flatBufferTensorInfo));
1360 }
1361 return outputSlots;
1362}
1363
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001364
1365ISerializer* ISerializer::CreateRaw()
1366{
1367 return new Serializer();
1368}
1369
1370ISerializerPtr ISerializer::Create()
1371{
1372 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1373}
1374
1375void ISerializer::Destroy(ISerializer* serializer)
1376{
1377 delete serializer;
1378}
1379
1380void Serializer::Serialize(const INetwork& inNetwork)
1381{
1382 // Iterate through to network
1383 inNetwork.Accept(m_SerializerVisitor);
1384 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1385
1386 // Create FlatBuffer SerializedGraph
1387 auto serializedGraph = serializer::CreateSerializedGraph(
1388 fbBuilder,
1389 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1390 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1391 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1392
1393 // Serialize the graph
1394 fbBuilder.Finish(serializedGraph);
1395}
1396
1397bool Serializer::SaveSerializedToStream(std::ostream& stream)
1398{
1399 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1400
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001401 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1402 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001403 return !stream.bad();
1404}
1405
Matteo Martincighec333912019-02-13 15:12:39 +00001406} // namespace armnnSerializer