blob: 11f833c5b71c68446343f7d91f421ec3b96c0030 [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
Conor Kennedy76277882019-02-26 08:29:54 +0000243// Build FlatBuffer for Constant Layer
244void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
245 const armnn::ConstTensor& input,
246 const char* name)
247{
248 // Create FlatBuffer BaseLayer
249 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
250
251 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
252
253 // Create the FlatBuffer ConstantLayer
254 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
255 flatBufferConstantBaseLayer,
256 flatBufferConstTensorInfo);
257
258 // Add the AnyLayer to the FlatBufferLayers
259 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
260}
261
Mike Kellya0766c32019-02-19 17:22:07 +0000262// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000263void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
264 const armnn::Convolution2dDescriptor& descriptor,
265 const armnn::ConstTensor& weights,
266 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000267 const char* name)
268{
269 // Create FlatBuffer BaseLayer
270 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
271
272 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
273 descriptor.m_PadLeft,
274 descriptor.m_PadRight,
275 descriptor.m_PadTop,
276 descriptor.m_PadBottom,
277 descriptor.m_StrideX,
278 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100279 descriptor.m_DilationX,
280 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000281 descriptor.m_BiasEnabled,
282 GetFlatBufferDataLayout(descriptor.m_DataLayout));
283 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
284 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
285
286 if (biases.has_value())
287 {
288 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
289 }
290
291 // Create the FlatBuffer Convolution2dLayer
292 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
293 flatBufferBaseLayer,
294 flatBufferDescriptor,
295 flatBufferWeightsConstTensorInfo,
296 flatBufferBiasesConstTensorInfo);
297
298 // Add the AnyLayer to the FlatBufferLayers
299 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
300}
301
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100302void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
303 const armnn::DepthToSpaceDescriptor& descriptor,
304 const char* name)
305{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100306 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
307 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
308 descriptor.m_BlockSize,
309 GetFlatBufferDataLayout(descriptor.m_DataLayout));
310
311 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
312
313 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100314}
315
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000316void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
317 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
318 const armnn::ConstTensor& weights,
319 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000320 const char* name)
321{
322 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
323 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
324 descriptor.m_PadLeft,
325 descriptor.m_PadRight,
326 descriptor.m_PadTop,
327 descriptor.m_PadBottom,
328 descriptor.m_StrideX,
329 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100330 descriptor.m_DilationX,
331 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000332 descriptor.m_BiasEnabled,
333 GetFlatBufferDataLayout(descriptor.m_DataLayout));
334
335 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
336 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
337 if (biases.has_value())
338 {
339 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
340 }
341
342 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
343 fbBaseLayer,
344 fbDescriptor,
345 fbWeightsConstTensorInfo,
346 fbBiasesConstTensorInfo);
347
348 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
349}
350
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000351void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
352 const char* name)
353{
354 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
355 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
356
357 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
358}
359
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000360void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
361 const armnn::DetectionPostProcessDescriptor& descriptor,
362 const armnn::ConstTensor& anchors,
363 const char* name)
364{
365 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
366 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
367 descriptor.m_MaxDetections,
368 descriptor.m_MaxClassesPerDetection,
369 descriptor.m_DetectionsPerClass,
370 descriptor.m_NmsScoreThreshold,
371 descriptor.m_NmsIouThreshold,
372 descriptor.m_NumClasses,
373 descriptor.m_UseRegularNms,
374 descriptor.m_ScaleX,
375 descriptor.m_ScaleY,
376 descriptor.m_ScaleW,
377 descriptor.m_ScaleH);
378
379 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
380
381 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
382 fbBaseLayer,
383 fbDescriptor,
384 fbAnchorsConstTensorInfo);
385
386 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
387}
388
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000389void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
390{
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000391 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
392 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000393
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000394 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
395}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000396
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000397void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
398{
399 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
400 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
401
402 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
403}
404
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000405void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
406{
407 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
408 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
409
410 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
411}
412
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000413void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
414{
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000415 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
416 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000417
418 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
419}
420
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000421void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
422{
423 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000424 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000425
426 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
427}
428
Kevin Mayce5045a2019-10-02 14:07:47 +0100429void SerializerVisitor::VisitInstanceNormalizationLayer(
430 const armnn::IConnectableLayer* layer,
431 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
432 const char* name)
433{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100434 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
435 m_flatBufferBuilder,
436 instanceNormalizationDescriptor.m_Gamma,
437 instanceNormalizationDescriptor.m_Beta,
438 instanceNormalizationDescriptor.m_Eps,
439 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
440
441 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
442 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
443
444 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100445}
446
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000447void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
448 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
449 const char* name)
450{
451 // Create FlatBuffer BaseLayer
452 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
453
454 // Create the FlatBuffer L2Normalization Descriptor
455 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100456 m_flatBufferBuilder,
457 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
458 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000459
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100460 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000461 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
462
463 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
464}
465
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100466void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
467 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
468 const char* name)
469{
Sadik Armagan26257852019-10-14 13:00:47 +0100470 // Create FlatBuffer BaseLayer
471 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
472
473 // Create the FlatBuffer LogSoftmaxDescriptor
474 auto flatBufferLogSoftmaxDesc =
475 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
476 logSoftmaxDescriptor.m_Beta,
477 logSoftmaxDescriptor.m_Axis);
478
479 // Create the FlatBuffer LogSoftmaxLayer
480 auto flatBufferLogSoftmaxLayer =
481 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
482 flatBufferLogSoftmaxBaseLayer,
483 flatBufferLogSoftmaxDesc);
484
485 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100486}
487
488void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
489 const armnn::LstmDescriptor& descriptor,
490 const armnn::LstmInputParams& params,
491 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000492{
493 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
494
495 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
496 m_flatBufferBuilder,
497 descriptor.m_ActivationFunc,
498 descriptor.m_ClippingThresCell,
499 descriptor.m_ClippingThresProj,
500 descriptor.m_CifgEnabled,
501 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100502 descriptor.m_ProjectionEnabled,
503 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000504
505 // Get mandatory input parameters
506 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
507 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
508 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
509 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
510 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
511 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
512 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
513 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
514 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
515
516 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
517 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
518 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
519 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
520 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
521 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
522 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
523 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
524 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100525 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
526 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
527 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
528 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000529
530 if (!descriptor.m_CifgEnabled)
531 {
532 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
533 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
534 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
535 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
536 }
537
538 if (descriptor.m_ProjectionEnabled)
539 {
540 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
541 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
542 }
543
544 if (descriptor.m_PeepholeEnabled)
545 {
546 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
547 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
548 }
549
Jan Eilersf8c62972019-07-17 11:07:49 +0100550 if (descriptor.m_LayerNormEnabled)
551 {
552 if (!descriptor.m_CifgEnabled)
553 {
554 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
555 }
556 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
557 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
558 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
559 }
560
Jim Flynn11af3752019-03-19 17:22:29 +0000561 auto fbLstmParams = serializer::CreateLstmInputParams(
562 m_flatBufferBuilder,
563 inputToForgetWeights,
564 inputToCellWeights,
565 inputToOutputWeights,
566 recurrentToForgetWeights,
567 recurrentToCellWeights,
568 recurrentToOutputWeights,
569 forgetGateBias,
570 cellBias,
571 outputGateBias,
572 inputToInputWeights,
573 recurrentToInputWeights,
574 cellToInputWeights,
575 inputGateBias,
576 projectionWeights,
577 projectionBias,
578 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100579 cellToOutputWeights,
580 inputLayerNormWeights,
581 forgetLayerNormWeights,
582 cellLayerNormWeights,
583 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000584
585 auto fbLstmLayer = serializer::CreateLstmLayer(
586 m_flatBufferBuilder,
587 fbLstmBaseLayer,
588 fbLstmDescriptor,
589 fbLstmParams);
590
591 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
592}
593
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000594void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
595{
596 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
597 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
598
599 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
600}
601
602void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
603 const armnn::MeanDescriptor& descriptor,
604 const char* name)
605{
606 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
607 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
608 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
609 descriptor.m_KeepDims);
610
611 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
612 fbMeanBaseLayer,
613 fbMeanDescriptor);
614
615 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
616}
617
618void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
619{
620 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
621 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
622
623 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
624}
625
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100626void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
627{
628 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
629 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
630
631 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
632}
633
Jim Flynnac25a1b2019-02-28 10:40:49 +0000634void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100635 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000636 const char* name)
637{
Jim Flynne242f2d2019-05-22 14:24:13 +0100638 VisitConcatLayer(layer, mergerDescriptor, name);
639}
640
641void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
642 const armnn::ConcatDescriptor& concatDescriptor,
643 const char* name)
644{
645 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000646
647 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100648 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000649 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100650 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000651 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100652 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000653 {
654 origins.push_back(origin[d]);
655 }
656 auto view = m_flatBufferBuilder.CreateVector(origins);
657 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
658 views.push_back(uintVector);
659 }
660
Jim Flynne242f2d2019-05-22 14:24:13 +0100661 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
662 concatDescriptor.GetConcatAxis(),
663 concatDescriptor.GetNumViews(),
664 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000665 m_flatBufferBuilder.CreateVector(views));
666
Jim Flynne242f2d2019-05-22 14:24:13 +0100667 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
668 flatBufferConcatBaseLayer,
669 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000670
Jim Flynne242f2d2019-05-22 14:24:13 +0100671 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000672}
673
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000674void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000675{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000676 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
677 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
678 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000679
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000680 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000681}
682
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000683void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
684 const armnn::PadDescriptor& padDescriptor,
685 const char* name)
686{
687 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
688
689 std::vector<unsigned int> padList;
690 for (auto& p: padDescriptor.m_PadList)
691 {
692 padList.push_back(p.first);
693 padList.push_back(p.second);
694 }
695
696 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100697 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100698 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000699
700 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
701 flatBufferBaseLayer,
702 flatBufferPadDesc);
703
704 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
705}
706
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000707void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
708 const armnn::PermuteDescriptor& permuteDescriptor,
709 const char* name)
710{
711 // Create FlatBuffer BaseLayer
712 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
713
714 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100715 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000716 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100717 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000718 }
719
720 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
721 m_flatBufferBuilder.CreateVector(dimMappings));
722
723 // Create the FlatBuffer PermuteLayer
724 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
725 flatBufferPermuteBaseLayer,
726 flatBufferPermuteDesc);
727
728 // Add the AnyLayer to the FlatBufferLayers
729 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
730}
731
Saoirse Stewart263829c2019-02-19 15:54:14 +0000732// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000733void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000734 const armnn::ReshapeDescriptor& reshapeDescriptor,
735 const char* name)
736{
737 // Create FlatBuffer BaseLayer
738 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
739
740 std::vector<unsigned int> targetShape;
741 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
742 {
743 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
744 }
745
746 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
747 m_flatBufferBuilder.CreateVector(targetShape));
748
749 // Create the FlatBuffer ReshapeLayer
750 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
751 flatBufferReshapeDesc);
752
753 // Add the AnyLayer to the FlatBufferLayers
754 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
755}
756
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000757void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
758 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
759 const char* name)
760{
761 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
762
763 auto flatBufferDescriptor =
764 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
765 resizeDescriptor.m_TargetWidth,
766 resizeDescriptor.m_TargetHeight,
767 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
768
769 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
770 flatBufferBaseLayer,
771 flatBufferDescriptor);
772
773 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
774}
775
Teresa Charlina9075df2019-06-27 15:41:57 +0100776void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
777 const armnn::ResizeDescriptor& resizeDescriptor,
778 const char* name)
779{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100780 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
781
782 auto flatBufferDescriptor =
783 CreateResizeDescriptor(m_flatBufferBuilder,
784 resizeDescriptor.m_TargetHeight,
785 resizeDescriptor.m_TargetWidth,
786 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
787 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
788
789 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
790 flatBufferBaseLayer,
791 flatBufferDescriptor);
792
793 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100794}
795
Sadik Armagan8b42a382019-03-01 14:24:49 +0000796void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
797{
798 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
799 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
800
801 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
802}
803
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100804void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
805 const armnn::SliceDescriptor& sliceDescriptor,
806 const char* name)
807{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100808 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
809 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
810 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
811 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
812
813 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
814
815 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100816}
817
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000818// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000819void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
820 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000821 const char* name)
822{
823 // Create FlatBuffer BaseLayer
824 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
825
826 // Create the FlatBuffer SoftmaxDescriptor
827 auto flatBufferSoftmaxDesc =
828 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
829
830 // Create the FlatBuffer SoftmaxLayer
831 auto flatBufferSoftmaxLayer =
832 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
833 flatBufferSoftmaxBaseLayer,
834 flatBufferSoftmaxDesc);
835
836 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
837}
838
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000839void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
840 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000841 const char* name)
842{
843 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
844 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
845 m_flatBufferBuilder,
846 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
847 pooling2dDescriptor.m_PadLeft,
848 pooling2dDescriptor.m_PadRight,
849 pooling2dDescriptor.m_PadTop,
850 pooling2dDescriptor.m_PadBottom,
851 pooling2dDescriptor.m_PoolWidth,
852 pooling2dDescriptor.m_PoolHeight,
853 pooling2dDescriptor.m_StrideX,
854 pooling2dDescriptor.m_StrideY,
855 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
856 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
857 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
858
859 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
860 fbPooling2dBaseLayer,
861 fbPooling2dDescriptor);
862
863 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
864}
865
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100866void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
867 const char* name)
868{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100869 // Create FlatBuffer BaseLayer
870 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
871
872 // Create the FlatBuffer AdditionLayer
873 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
874
875 // Add the AnyLayer to the FlatBufferLayers
876 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100877}
878
Derek Lamberti87acb272019-03-27 16:51:31 +0000879void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
880{
881 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
882 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
883 fbQuantizeBaseLayer);
884 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
885}
886
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000887// Build FlatBuffer for FullyConnected Layer
888void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
889 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
890 const armnn::ConstTensor& weights,
891 const armnn::Optional<armnn::ConstTensor>& biases,
892 const char* name)
893{
894 // Create FlatBuffer BaseLayer
895 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
896
897 // Create FlatBuffer FullyConnectedDescriptor
898 auto flatBufferDescriptor =
899 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
900 fullyConnectedDescriptor.m_BiasEnabled,
901 fullyConnectedDescriptor.m_TransposeWeightMatrix);
902
903 // Create FlatBuffer weights data
904 auto flatBufferWeights = CreateConstTensorInfo(weights);
905
906 // Create FlatBuffer bias data
907 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
908 if (fullyConnectedDescriptor.m_BiasEnabled)
909 {
910 flatBufferBiases = CreateConstTensorInfo(biases.value());
911 }
912
913 // Create FlatBuffer FullyConnectedLayer
914 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
915 flatBufferBaseLayer,
916 flatBufferDescriptor,
917 flatBufferWeights,
918 flatBufferBiases);
919
920 // Add created FullyConnectedLayer to the FlatBufferLayers
921 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
922}
923
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000924// Build FlatBuffer for SpaceToBatchNd Layer
925void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
926 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
927 const char* name)
928{
929 // Create FlatBuffer BaseLayer
930 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
931
932 std::vector<unsigned int> padList;
933 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
934 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
935 {
936 padList.push_back(pad.first);
937 padList.push_back(pad.second);
938 }
939
940 auto flatBufferDescriptor =
941 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
942 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
943 m_flatBufferBuilder.CreateVector(padList),
944 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
945
946 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
947 flatBufferBaseLayer,
948 flatBufferDescriptor);
949
950 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
951}
952
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100953// Build FlatBuffer for SpaceToDepthLayer
954void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
955 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
956 const char* name)
957{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100958 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
959 auto flatBufferDescriptor =
960 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
961 spaceToDepthDescriptor.m_BlockSize,
962 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
963
964 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
965 flatBufferBaseLayer,
966 flatBufferDescriptor);
967
968 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100969}
970
Jim Flynn18ce3382019-03-08 11:08:30 +0000971// Build FlatBuffer for Splitter Layer
972void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
973 const armnn::ViewsDescriptor& viewsDescriptor,
974 const char* name)
975{
976 // Create FlatBuffer ViewOrigins
977 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
978 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
979
980 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
981 {
982 std::vector<uint32_t> viewOrigin;
983 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
984
985 // Copy vector
986 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
987 {
988 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
989 }
990
991 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
992 m_flatBufferBuilder.CreateVector(viewOrigin)));
993 }
994
995 // Create FlatBuffer OriginsDescriptor
996 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
997 viewsDescriptor.GetOrigins().GetConcatAxis(),
998 viewsDescriptor.GetOrigins().GetNumViews(),
999 viewsDescriptor.GetOrigins().GetNumDimensions(),
1000 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1001
1002 // Create FlatBuffer ViewOrigins
1003 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1004 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1005
1006 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1007 {
1008 std::vector<uint32_t> viewSize;
1009 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1010
1011 // Copy vector
1012 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1013 {
1014 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1015 }
1016
1017 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1018 m_flatBufferBuilder.CreateVector(viewSize)));
1019 }
1020
1021 // Create FlatBuffer ViewsDescriptor
1022 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1023 flatBufferOriginDescriptor,
1024 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1025
1026 // Create FlatBuffer BaseLayer
1027 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1028
1029 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1030 flatBufferBaseLayer,
1031 flatBufferViewsDescriptor);
1032
1033 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1034}
1035
Nina Drozd57728782019-02-27 10:53:27 +00001036void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1037 const armnn::NormalizationDescriptor& descriptor,
1038 const char* name)
1039{
1040 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1041
1042 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1043 m_flatBufferBuilder,
1044 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1045 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1046 descriptor.m_NormSize,
1047 descriptor.m_Alpha,
1048 descriptor.m_Beta,
1049 descriptor.m_K,
1050 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1051
1052 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1053 fbNormalizationBaseLayer,
1054 fbNormalizationDescriptor);
1055
1056 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1057}
1058
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001059void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1060 const armnn::StackDescriptor& stackDescriptor,
1061 const char* name)
1062{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001063 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1064
1065 std::vector<unsigned int> inputShape;
1066 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1067 {
1068 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1069 }
1070
1071 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1072 stackDescriptor.m_Axis,
1073 stackDescriptor.m_NumInputs,
1074 m_flatBufferBuilder.CreateVector(inputShape));
1075
1076 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1077 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001078}
1079
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001080void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1081 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1082 const char* name)
1083{
1084 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1085
1086 auto flatBufferDescriptor =
1087 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1088 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1089 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1090 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1091 stridedSliceDescriptor.m_BeginMask,
1092 stridedSliceDescriptor.m_EndMask,
1093 stridedSliceDescriptor.m_ShrinkAxisMask,
1094 stridedSliceDescriptor.m_EllipsisMask,
1095 stridedSliceDescriptor.m_NewAxisMask,
1096 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1097
1098 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1099 flatBufferBaseLayer,
1100 flatBufferDescriptor);
1101
1102 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1103}
1104
Conor Kennedyda1f9752019-03-01 14:37:12 +00001105void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1106{
1107 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1108 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1109
1110 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1111}
1112
Sadik Armaganeff363d2019-04-05 15:25:46 +01001113void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1114{
1115 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1116 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1117
1118 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1119}
1120
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001121void SerializerVisitor::VisitTransposeConvolution2dLayer(
1122 const armnn::IConnectableLayer* layer,
1123 const armnn::TransposeConvolution2dDescriptor& descriptor,
1124 const armnn::ConstTensor& weights,
1125 const armnn::Optional<armnn::ConstTensor>& biases,
1126 const char* name)
1127{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001128 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1129 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1130 descriptor.m_PadLeft,
1131 descriptor.m_PadRight,
1132 descriptor.m_PadTop,
1133 descriptor.m_PadBottom,
1134 descriptor.m_StrideX,
1135 descriptor.m_StrideY,
1136 descriptor.m_BiasEnabled,
1137 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1138
1139 // weights & biases
1140 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1141 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1142 if (biases.has_value())
1143 {
1144 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1145 }
1146
1147 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1148 fbBaseLayer,
1149 fbDescriptor,
1150 fbWeightsConstTensorInfo,
1151 fbBiasesConstTensorInfo);
1152
1153 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001154}
1155
James Conroyee18dc82019-07-17 11:27:46 +01001156void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1157 const armnn::QuantizedLstmInputParams& params,
1158 const char* name)
1159{
Jan Eilers5b01a892019-07-23 09:47:43 +01001160 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1161
1162 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001163 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1164 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1165 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1166 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001167
Francis Murtaghbb590b42019-08-14 09:51:36 +01001168 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1169 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1170 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1171 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001172
Francis Murtaghbb590b42019-08-14 09:51:36 +01001173 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1174 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1175 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1176 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001177
1178 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1179 m_flatBufferBuilder,
1180 inputToInputWeights,
1181 inputToForgetWeights,
1182 inputToCellWeights,
1183 inputToOutputWeights,
1184 recurrentToInputWeights,
1185 recurrentToForgetWeights,
1186 recurrentToCellWeights,
1187 recurrentToOutputWeights,
1188 inputGateBias,
1189 forgetGateBias,
1190 cellBias,
1191 outputGateBias);
1192
1193 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1194 m_flatBufferBuilder,
1195 fbQuantizedLstmBaseLayer,
1196 fbQuantizedLstmParams);
1197
1198 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001199}
1200
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001201fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001202 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001203{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001204 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1205
Mike Kelly8c1701a2019-02-11 17:01:27 +00001206 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1207 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1208
1209 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001210 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001211 m_flatBufferBuilder.CreateString(layer->GetName()),
1212 layerType,
1213 m_flatBufferBuilder.CreateVector(inputSlots),
1214 m_flatBufferBuilder.CreateVector(outputSlots));
1215}
1216
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001217void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001218{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001219 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001220 m_serializedLayers.push_back(anyLayer);
1221}
1222
Mike Kellya0766c32019-02-19 17:22:07 +00001223template <typename T>
1224flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1225{
1226 const T* buffer = reinterpret_cast<const T*>(memory);
1227 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1228 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1229 return fbVector;
1230}
1231
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001232flatbuffers::Offset<serializer::ConstTensor>
1233 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001234{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001235 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001236
1237 // Get the dimensions
1238 std::vector<unsigned int> shape;
1239
1240 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1241 {
1242 shape.push_back(tensorInfo.GetShape()[dim]);
1243 }
1244
1245 // Create FlatBuffer TensorInfo
1246 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1247 m_flatBufferBuilder.CreateVector(shape),
1248 GetFlatBufferDataType(tensorInfo.GetDataType()),
1249 tensorInfo.GetQuantizationScale(),
1250 tensorInfo.GetQuantizationOffset());
1251 flatbuffers::Offset<void> fbPayload;
1252
1253 switch (tensorInfo.GetDataType())
1254 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001255 case armnn::DataType::Float32:
1256 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001257 {
1258 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1259 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1260 m_flatBufferBuilder,
1261 fbVector);
1262 fbPayload = flatBuffersData.o;
1263 break;
1264 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001265 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001266 {
1267 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1268 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1269 m_flatBufferBuilder,
1270 fbVector);
1271 fbPayload = flatBuffersData.o;
1272 break;
1273 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001274 case armnn::DataType::QuantisedSymm16:
1275 {
1276 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1277 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1278 m_flatBufferBuilder,
1279 fbVector);
1280 fbPayload = flatBuffersData.o;
1281 break;
1282 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001283 case armnn::DataType::QuantisedAsymm8:
1284 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001285 default:
1286 {
1287 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1288 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1289 m_flatBufferBuilder,
1290 fbVector);
1291 fbPayload = flatBuffersData.o;
1292 }
1293 }
1294 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1295 m_flatBufferBuilder,
1296 flatBufferTensorInfo,
1297 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1298 fbPayload);
1299 return flatBufferConstTensor;
1300}
1301
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001302std::vector<fb::Offset<serializer::InputSlot>>
1303 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001304{
Mike Kellya0766c32019-02-19 17:22:07 +00001305 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001306
1307 // Get the InputSlots
1308 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1309 {
1310 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1311
1312 // Get the Connection for the InputSlot
1313 const IOutputSlot* connection = inputSlot.GetConnection();
1314
1315 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001316 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1317 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001318 // Create FlatBuffer InputSlot
1319 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1320 }
1321 return inputSlots;
1322}
1323
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001324std::vector<fb::Offset<serializer::OutputSlot>>
1325 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001326{
1327 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1328
1329 // Get the OutputSlots
1330 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1331 {
1332 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001333 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001334
1335 // Get the dimensions
1336 std::vector<unsigned int> shape;
1337 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1338 {
1339 shape.push_back(tensorInfo.GetShape()[dim]);
1340 }
1341
1342 // Create FlatBuffer TensorInfo
1343 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1344 m_flatBufferBuilder.CreateVector(shape),
1345 GetFlatBufferDataType(tensorInfo.GetDataType()),
1346 tensorInfo.GetQuantizationScale(),
1347 tensorInfo.GetQuantizationOffset());
1348
1349 // Create FlatBuffer Outputslot
1350 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1351 slotIndex,
1352 flatBufferTensorInfo));
1353 }
1354 return outputSlots;
1355}
1356
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001357
1358ISerializer* ISerializer::CreateRaw()
1359{
1360 return new Serializer();
1361}
1362
1363ISerializerPtr ISerializer::Create()
1364{
1365 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1366}
1367
1368void ISerializer::Destroy(ISerializer* serializer)
1369{
1370 delete serializer;
1371}
1372
1373void Serializer::Serialize(const INetwork& inNetwork)
1374{
1375 // Iterate through to network
1376 inNetwork.Accept(m_SerializerVisitor);
1377 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1378
1379 // Create FlatBuffer SerializedGraph
1380 auto serializedGraph = serializer::CreateSerializedGraph(
1381 fbBuilder,
1382 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1383 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1384 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1385
1386 // Serialize the graph
1387 fbBuilder.Finish(serializedGraph);
1388}
1389
1390bool Serializer::SaveSerializedToStream(std::ostream& stream)
1391{
1392 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1393
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001394 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1395 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001396 return !stream.bad();
1397}
1398
Matteo Martincighec333912019-02-13 15:12:39 +00001399} // namespace armnnSerializer