blob: 99ba7e3c13f6a9c616096a23a7b928762848dcc5 [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
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000429void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
430 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
431 const char* name)
432{
433 // Create FlatBuffer BaseLayer
434 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
435
436 // Create the FlatBuffer L2Normalization Descriptor
437 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100438 m_flatBufferBuilder,
439 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
440 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000441
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100442 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000443 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
444
445 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
446}
447
Jim Flynn11af3752019-03-19 17:22:29 +0000448void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer, const armnn::LstmDescriptor& descriptor,
449 const armnn::LstmInputParams& params, const char* name)
450{
451 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
452
453 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
454 m_flatBufferBuilder,
455 descriptor.m_ActivationFunc,
456 descriptor.m_ClippingThresCell,
457 descriptor.m_ClippingThresProj,
458 descriptor.m_CifgEnabled,
459 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100460 descriptor.m_ProjectionEnabled,
461 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000462
463 // Get mandatory input parameters
464 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
465 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
466 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
467 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
468 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
469 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
470 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
471 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
472 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
473
474 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
475 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
476 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
477 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
478 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
479 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
480 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
481 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
482 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100483 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
484 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
485 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
486 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000487
488 if (!descriptor.m_CifgEnabled)
489 {
490 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
491 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
492 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
493 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
494 }
495
496 if (descriptor.m_ProjectionEnabled)
497 {
498 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
499 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
500 }
501
502 if (descriptor.m_PeepholeEnabled)
503 {
504 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
505 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
506 }
507
Jan Eilersf8c62972019-07-17 11:07:49 +0100508 if (descriptor.m_LayerNormEnabled)
509 {
510 if (!descriptor.m_CifgEnabled)
511 {
512 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
513 }
514 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
515 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
516 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
517 }
518
Jim Flynn11af3752019-03-19 17:22:29 +0000519 auto fbLstmParams = serializer::CreateLstmInputParams(
520 m_flatBufferBuilder,
521 inputToForgetWeights,
522 inputToCellWeights,
523 inputToOutputWeights,
524 recurrentToForgetWeights,
525 recurrentToCellWeights,
526 recurrentToOutputWeights,
527 forgetGateBias,
528 cellBias,
529 outputGateBias,
530 inputToInputWeights,
531 recurrentToInputWeights,
532 cellToInputWeights,
533 inputGateBias,
534 projectionWeights,
535 projectionBias,
536 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100537 cellToOutputWeights,
538 inputLayerNormWeights,
539 forgetLayerNormWeights,
540 cellLayerNormWeights,
541 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000542
543 auto fbLstmLayer = serializer::CreateLstmLayer(
544 m_flatBufferBuilder,
545 fbLstmBaseLayer,
546 fbLstmDescriptor,
547 fbLstmParams);
548
549 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
550}
551
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000552void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
553{
554 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
555 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
556
557 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
558}
559
560void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
561 const armnn::MeanDescriptor& descriptor,
562 const char* name)
563{
564 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
565 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
566 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
567 descriptor.m_KeepDims);
568
569 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
570 fbMeanBaseLayer,
571 fbMeanDescriptor);
572
573 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
574}
575
576void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
577{
578 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
579 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
580
581 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
582}
583
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100584void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
585{
586 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
587 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
588
589 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
590}
591
Jim Flynnac25a1b2019-02-28 10:40:49 +0000592void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100593 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000594 const char* name)
595{
Jim Flynne242f2d2019-05-22 14:24:13 +0100596 VisitConcatLayer(layer, mergerDescriptor, name);
597}
598
599void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
600 const armnn::ConcatDescriptor& concatDescriptor,
601 const char* name)
602{
603 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000604
605 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100606 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000607 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100608 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000609 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100610 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000611 {
612 origins.push_back(origin[d]);
613 }
614 auto view = m_flatBufferBuilder.CreateVector(origins);
615 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
616 views.push_back(uintVector);
617 }
618
Jim Flynne242f2d2019-05-22 14:24:13 +0100619 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
620 concatDescriptor.GetConcatAxis(),
621 concatDescriptor.GetNumViews(),
622 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000623 m_flatBufferBuilder.CreateVector(views));
624
Jim Flynne242f2d2019-05-22 14:24:13 +0100625 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
626 flatBufferConcatBaseLayer,
627 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000628
Jim Flynne242f2d2019-05-22 14:24:13 +0100629 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000630}
631
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000632void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000633{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000634 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
635 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
636 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000637
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000638 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000639}
640
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000641void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
642 const armnn::PadDescriptor& padDescriptor,
643 const char* name)
644{
645 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
646
647 std::vector<unsigned int> padList;
648 for (auto& p: padDescriptor.m_PadList)
649 {
650 padList.push_back(p.first);
651 padList.push_back(p.second);
652 }
653
654 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100655 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100656 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000657
658 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
659 flatBufferBaseLayer,
660 flatBufferPadDesc);
661
662 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
663}
664
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000665void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
666 const armnn::PermuteDescriptor& permuteDescriptor,
667 const char* name)
668{
669 // Create FlatBuffer BaseLayer
670 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
671
672 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100673 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000674 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100675 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000676 }
677
678 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
679 m_flatBufferBuilder.CreateVector(dimMappings));
680
681 // Create the FlatBuffer PermuteLayer
682 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
683 flatBufferPermuteBaseLayer,
684 flatBufferPermuteDesc);
685
686 // Add the AnyLayer to the FlatBufferLayers
687 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
688}
689
Saoirse Stewart263829c2019-02-19 15:54:14 +0000690// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000691void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000692 const armnn::ReshapeDescriptor& reshapeDescriptor,
693 const char* name)
694{
695 // Create FlatBuffer BaseLayer
696 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
697
698 std::vector<unsigned int> targetShape;
699 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
700 {
701 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
702 }
703
704 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
705 m_flatBufferBuilder.CreateVector(targetShape));
706
707 // Create the FlatBuffer ReshapeLayer
708 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
709 flatBufferReshapeDesc);
710
711 // Add the AnyLayer to the FlatBufferLayers
712 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
713}
714
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000715void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
716 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
717 const char* name)
718{
719 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
720
721 auto flatBufferDescriptor =
722 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
723 resizeDescriptor.m_TargetWidth,
724 resizeDescriptor.m_TargetHeight,
725 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
726
727 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
728 flatBufferBaseLayer,
729 flatBufferDescriptor);
730
731 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
732}
733
Teresa Charlina9075df2019-06-27 15:41:57 +0100734void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
735 const armnn::ResizeDescriptor& resizeDescriptor,
736 const char* name)
737{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100738 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
739
740 auto flatBufferDescriptor =
741 CreateResizeDescriptor(m_flatBufferBuilder,
742 resizeDescriptor.m_TargetHeight,
743 resizeDescriptor.m_TargetWidth,
744 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
745 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
746
747 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
748 flatBufferBaseLayer,
749 flatBufferDescriptor);
750
751 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100752}
753
Sadik Armagan8b42a382019-03-01 14:24:49 +0000754void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
755{
756 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
757 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
758
759 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
760}
761
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100762void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
763 const armnn::SliceDescriptor& sliceDescriptor,
764 const char* name)
765{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100766 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
767 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
768 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
769 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
770
771 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
772
773 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100774}
775
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000776// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000777void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
778 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000779 const char* name)
780{
781 // Create FlatBuffer BaseLayer
782 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
783
784 // Create the FlatBuffer SoftmaxDescriptor
785 auto flatBufferSoftmaxDesc =
786 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
787
788 // Create the FlatBuffer SoftmaxLayer
789 auto flatBufferSoftmaxLayer =
790 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
791 flatBufferSoftmaxBaseLayer,
792 flatBufferSoftmaxDesc);
793
794 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
795}
796
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000797void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
798 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000799 const char* name)
800{
801 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
802 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
803 m_flatBufferBuilder,
804 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
805 pooling2dDescriptor.m_PadLeft,
806 pooling2dDescriptor.m_PadRight,
807 pooling2dDescriptor.m_PadTop,
808 pooling2dDescriptor.m_PadBottom,
809 pooling2dDescriptor.m_PoolWidth,
810 pooling2dDescriptor.m_PoolHeight,
811 pooling2dDescriptor.m_StrideX,
812 pooling2dDescriptor.m_StrideY,
813 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
814 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
815 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
816
817 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
818 fbPooling2dBaseLayer,
819 fbPooling2dDescriptor);
820
821 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
822}
823
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100824void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
825 const char* name)
826{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100827 // Create FlatBuffer BaseLayer
828 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
829
830 // Create the FlatBuffer AdditionLayer
831 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
832
833 // Add the AnyLayer to the FlatBufferLayers
834 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100835}
836
Derek Lamberti87acb272019-03-27 16:51:31 +0000837void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
838{
839 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
840 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
841 fbQuantizeBaseLayer);
842 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
843}
844
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000845// Build FlatBuffer for FullyConnected Layer
846void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
847 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
848 const armnn::ConstTensor& weights,
849 const armnn::Optional<armnn::ConstTensor>& biases,
850 const char* name)
851{
852 // Create FlatBuffer BaseLayer
853 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
854
855 // Create FlatBuffer FullyConnectedDescriptor
856 auto flatBufferDescriptor =
857 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
858 fullyConnectedDescriptor.m_BiasEnabled,
859 fullyConnectedDescriptor.m_TransposeWeightMatrix);
860
861 // Create FlatBuffer weights data
862 auto flatBufferWeights = CreateConstTensorInfo(weights);
863
864 // Create FlatBuffer bias data
865 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
866 if (fullyConnectedDescriptor.m_BiasEnabled)
867 {
868 flatBufferBiases = CreateConstTensorInfo(biases.value());
869 }
870
871 // Create FlatBuffer FullyConnectedLayer
872 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
873 flatBufferBaseLayer,
874 flatBufferDescriptor,
875 flatBufferWeights,
876 flatBufferBiases);
877
878 // Add created FullyConnectedLayer to the FlatBufferLayers
879 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
880}
881
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000882// Build FlatBuffer for SpaceToBatchNd Layer
883void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
884 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
885 const char* name)
886{
887 // Create FlatBuffer BaseLayer
888 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
889
890 std::vector<unsigned int> padList;
891 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
892 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
893 {
894 padList.push_back(pad.first);
895 padList.push_back(pad.second);
896 }
897
898 auto flatBufferDescriptor =
899 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
900 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
901 m_flatBufferBuilder.CreateVector(padList),
902 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
903
904 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
905 flatBufferBaseLayer,
906 flatBufferDescriptor);
907
908 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
909}
910
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100911// Build FlatBuffer for SpaceToDepthLayer
912void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
913 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
914 const char* name)
915{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100916 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
917 auto flatBufferDescriptor =
918 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
919 spaceToDepthDescriptor.m_BlockSize,
920 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
921
922 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
923 flatBufferBaseLayer,
924 flatBufferDescriptor);
925
926 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100927}
928
Jim Flynn18ce3382019-03-08 11:08:30 +0000929// Build FlatBuffer for Splitter Layer
930void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
931 const armnn::ViewsDescriptor& viewsDescriptor,
932 const char* name)
933{
934 // Create FlatBuffer ViewOrigins
935 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
936 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
937
938 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
939 {
940 std::vector<uint32_t> viewOrigin;
941 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
942
943 // Copy vector
944 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
945 {
946 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
947 }
948
949 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
950 m_flatBufferBuilder.CreateVector(viewOrigin)));
951 }
952
953 // Create FlatBuffer OriginsDescriptor
954 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
955 viewsDescriptor.GetOrigins().GetConcatAxis(),
956 viewsDescriptor.GetOrigins().GetNumViews(),
957 viewsDescriptor.GetOrigins().GetNumDimensions(),
958 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
959
960 // Create FlatBuffer ViewOrigins
961 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
962 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
963
964 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
965 {
966 std::vector<uint32_t> viewSize;
967 viewSize.reserve(viewsDescriptor.GetNumDimensions());
968
969 // Copy vector
970 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
971 {
972 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
973 }
974
975 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
976 m_flatBufferBuilder.CreateVector(viewSize)));
977 }
978
979 // Create FlatBuffer ViewsDescriptor
980 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
981 flatBufferOriginDescriptor,
982 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
983
984 // Create FlatBuffer BaseLayer
985 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
986
987 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
988 flatBufferBaseLayer,
989 flatBufferViewsDescriptor);
990
991 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
992}
993
Nina Drozd57728782019-02-27 10:53:27 +0000994void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
995 const armnn::NormalizationDescriptor& descriptor,
996 const char* name)
997{
998 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
999
1000 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1001 m_flatBufferBuilder,
1002 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1003 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1004 descriptor.m_NormSize,
1005 descriptor.m_Alpha,
1006 descriptor.m_Beta,
1007 descriptor.m_K,
1008 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1009
1010 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1011 fbNormalizationBaseLayer,
1012 fbNormalizationDescriptor);
1013
1014 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1015}
1016
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001017void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1018 const armnn::StackDescriptor& stackDescriptor,
1019 const char* name)
1020{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001021 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1022
1023 std::vector<unsigned int> inputShape;
1024 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1025 {
1026 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1027 }
1028
1029 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1030 stackDescriptor.m_Axis,
1031 stackDescriptor.m_NumInputs,
1032 m_flatBufferBuilder.CreateVector(inputShape));
1033
1034 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1035 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001036}
1037
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001038void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1039 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1040 const char* name)
1041{
1042 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1043
1044 auto flatBufferDescriptor =
1045 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1046 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1047 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1048 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1049 stridedSliceDescriptor.m_BeginMask,
1050 stridedSliceDescriptor.m_EndMask,
1051 stridedSliceDescriptor.m_ShrinkAxisMask,
1052 stridedSliceDescriptor.m_EllipsisMask,
1053 stridedSliceDescriptor.m_NewAxisMask,
1054 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1055
1056 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1057 flatBufferBaseLayer,
1058 flatBufferDescriptor);
1059
1060 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1061}
1062
Conor Kennedyda1f9752019-03-01 14:37:12 +00001063void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1064{
1065 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1066 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1067
1068 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1069}
1070
Sadik Armaganeff363d2019-04-05 15:25:46 +01001071void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1072{
1073 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1074 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1075
1076 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1077}
1078
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001079void SerializerVisitor::VisitTransposeConvolution2dLayer(
1080 const armnn::IConnectableLayer* layer,
1081 const armnn::TransposeConvolution2dDescriptor& descriptor,
1082 const armnn::ConstTensor& weights,
1083 const armnn::Optional<armnn::ConstTensor>& biases,
1084 const char* name)
1085{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001086 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1087 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1088 descriptor.m_PadLeft,
1089 descriptor.m_PadRight,
1090 descriptor.m_PadTop,
1091 descriptor.m_PadBottom,
1092 descriptor.m_StrideX,
1093 descriptor.m_StrideY,
1094 descriptor.m_BiasEnabled,
1095 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1096
1097 // weights & biases
1098 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1099 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1100 if (biases.has_value())
1101 {
1102 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1103 }
1104
1105 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1106 fbBaseLayer,
1107 fbDescriptor,
1108 fbWeightsConstTensorInfo,
1109 fbBiasesConstTensorInfo);
1110
1111 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001112}
1113
James Conroyee18dc82019-07-17 11:27:46 +01001114void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1115 const armnn::QuantizedLstmInputParams& params,
1116 const char* name)
1117{
Jan Eilers5b01a892019-07-23 09:47:43 +01001118 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1119
1120 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001121 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1122 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1123 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1124 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001125
Francis Murtaghbb590b42019-08-14 09:51:36 +01001126 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1127 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1128 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1129 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001130
Francis Murtaghbb590b42019-08-14 09:51:36 +01001131 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1132 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1133 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1134 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001135
1136 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1137 m_flatBufferBuilder,
1138 inputToInputWeights,
1139 inputToForgetWeights,
1140 inputToCellWeights,
1141 inputToOutputWeights,
1142 recurrentToInputWeights,
1143 recurrentToForgetWeights,
1144 recurrentToCellWeights,
1145 recurrentToOutputWeights,
1146 inputGateBias,
1147 forgetGateBias,
1148 cellBias,
1149 outputGateBias);
1150
1151 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1152 m_flatBufferBuilder,
1153 fbQuantizedLstmBaseLayer,
1154 fbQuantizedLstmParams);
1155
1156 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001157}
1158
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001159fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001160 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001161{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001162 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1163
Mike Kelly8c1701a2019-02-11 17:01:27 +00001164 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1165 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1166
1167 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001168 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001169 m_flatBufferBuilder.CreateString(layer->GetName()),
1170 layerType,
1171 m_flatBufferBuilder.CreateVector(inputSlots),
1172 m_flatBufferBuilder.CreateVector(outputSlots));
1173}
1174
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001175void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001176{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001177 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001178 m_serializedLayers.push_back(anyLayer);
1179}
1180
Mike Kellya0766c32019-02-19 17:22:07 +00001181template <typename T>
1182flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1183{
1184 const T* buffer = reinterpret_cast<const T*>(memory);
1185 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1186 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1187 return fbVector;
1188}
1189
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001190flatbuffers::Offset<serializer::ConstTensor>
1191 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001192{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001193 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001194
1195 // Get the dimensions
1196 std::vector<unsigned int> shape;
1197
1198 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1199 {
1200 shape.push_back(tensorInfo.GetShape()[dim]);
1201 }
1202
1203 // Create FlatBuffer TensorInfo
1204 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1205 m_flatBufferBuilder.CreateVector(shape),
1206 GetFlatBufferDataType(tensorInfo.GetDataType()),
1207 tensorInfo.GetQuantizationScale(),
1208 tensorInfo.GetQuantizationOffset());
1209 flatbuffers::Offset<void> fbPayload;
1210
1211 switch (tensorInfo.GetDataType())
1212 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001213 case armnn::DataType::Float32:
1214 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001215 {
1216 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1217 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1218 m_flatBufferBuilder,
1219 fbVector);
1220 fbPayload = flatBuffersData.o;
1221 break;
1222 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001223 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001224 {
1225 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1226 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1227 m_flatBufferBuilder,
1228 fbVector);
1229 fbPayload = flatBuffersData.o;
1230 break;
1231 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001232 case armnn::DataType::QuantisedSymm16:
1233 {
1234 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1235 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1236 m_flatBufferBuilder,
1237 fbVector);
1238 fbPayload = flatBuffersData.o;
1239 break;
1240 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001241 case armnn::DataType::QuantisedAsymm8:
1242 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001243 default:
1244 {
1245 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1246 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1247 m_flatBufferBuilder,
1248 fbVector);
1249 fbPayload = flatBuffersData.o;
1250 }
1251 }
1252 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1253 m_flatBufferBuilder,
1254 flatBufferTensorInfo,
1255 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1256 fbPayload);
1257 return flatBufferConstTensor;
1258}
1259
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001260std::vector<fb::Offset<serializer::InputSlot>>
1261 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001262{
Mike Kellya0766c32019-02-19 17:22:07 +00001263 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001264
1265 // Get the InputSlots
1266 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1267 {
1268 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1269
1270 // Get the Connection for the InputSlot
1271 const IOutputSlot* connection = inputSlot.GetConnection();
1272
1273 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001274 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1275 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001276 // Create FlatBuffer InputSlot
1277 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1278 }
1279 return inputSlots;
1280}
1281
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001282std::vector<fb::Offset<serializer::OutputSlot>>
1283 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001284{
1285 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1286
1287 // Get the OutputSlots
1288 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1289 {
1290 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001291 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001292
1293 // Get the dimensions
1294 std::vector<unsigned int> shape;
1295 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1296 {
1297 shape.push_back(tensorInfo.GetShape()[dim]);
1298 }
1299
1300 // Create FlatBuffer TensorInfo
1301 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1302 m_flatBufferBuilder.CreateVector(shape),
1303 GetFlatBufferDataType(tensorInfo.GetDataType()),
1304 tensorInfo.GetQuantizationScale(),
1305 tensorInfo.GetQuantizationOffset());
1306
1307 // Create FlatBuffer Outputslot
1308 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1309 slotIndex,
1310 flatBufferTensorInfo));
1311 }
1312 return outputSlots;
1313}
1314
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001315
1316ISerializer* ISerializer::CreateRaw()
1317{
1318 return new Serializer();
1319}
1320
1321ISerializerPtr ISerializer::Create()
1322{
1323 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1324}
1325
1326void ISerializer::Destroy(ISerializer* serializer)
1327{
1328 delete serializer;
1329}
1330
1331void Serializer::Serialize(const INetwork& inNetwork)
1332{
1333 // Iterate through to network
1334 inNetwork.Accept(m_SerializerVisitor);
1335 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1336
1337 // Create FlatBuffer SerializedGraph
1338 auto serializedGraph = serializer::CreateSerializedGraph(
1339 fbBuilder,
1340 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1341 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1342 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1343
1344 // Serialize the graph
1345 fbBuilder.Finish(serializedGraph);
1346}
1347
1348bool Serializer::SaveSerializedToStream(std::ostream& stream)
1349{
1350 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1351
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001352 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1353 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001354 return !stream.bad();
1355}
1356
Matteo Martincighec333912019-02-13 15:12:39 +00001357} // namespace armnnSerializer