blob: 16b7cff80825d3908953e5f5c4a5424aea81ac9c [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
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000302void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
303 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
304 const armnn::ConstTensor& weights,
305 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000306 const char* name)
307{
308 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
309 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
310 descriptor.m_PadLeft,
311 descriptor.m_PadRight,
312 descriptor.m_PadTop,
313 descriptor.m_PadBottom,
314 descriptor.m_StrideX,
315 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100316 descriptor.m_DilationX,
317 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000318 descriptor.m_BiasEnabled,
319 GetFlatBufferDataLayout(descriptor.m_DataLayout));
320
321 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
322 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
323 if (biases.has_value())
324 {
325 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
326 }
327
328 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
329 fbBaseLayer,
330 fbDescriptor,
331 fbWeightsConstTensorInfo,
332 fbBiasesConstTensorInfo);
333
334 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
335}
336
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000337void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
338 const char* name)
339{
340 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
341 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
342
343 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
344}
345
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000346void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
347 const armnn::DetectionPostProcessDescriptor& descriptor,
348 const armnn::ConstTensor& anchors,
349 const char* name)
350{
351 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
352 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
353 descriptor.m_MaxDetections,
354 descriptor.m_MaxClassesPerDetection,
355 descriptor.m_DetectionsPerClass,
356 descriptor.m_NmsScoreThreshold,
357 descriptor.m_NmsIouThreshold,
358 descriptor.m_NumClasses,
359 descriptor.m_UseRegularNms,
360 descriptor.m_ScaleX,
361 descriptor.m_ScaleY,
362 descriptor.m_ScaleW,
363 descriptor.m_ScaleH);
364
365 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
366
367 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
368 fbBaseLayer,
369 fbDescriptor,
370 fbAnchorsConstTensorInfo);
371
372 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
373}
374
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000375void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
376{
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000377 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
378 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000379
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000380 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
381}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000382
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000383void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
384{
385 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
386 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
387
388 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
389}
390
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000391void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
392{
393 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
394 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
395
396 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
397}
398
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000399void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
400{
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000401 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
402 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000403
404 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
405}
406
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000407void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
408{
409 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000410 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000411
412 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
413}
414
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000415void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
416 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
417 const char* name)
418{
419 // Create FlatBuffer BaseLayer
420 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
421
422 // Create the FlatBuffer L2Normalization Descriptor
423 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100424 m_flatBufferBuilder,
425 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
426 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000427
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100428 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000429 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
430
431 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
432}
433
Jim Flynn11af3752019-03-19 17:22:29 +0000434void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer, const armnn::LstmDescriptor& descriptor,
435 const armnn::LstmInputParams& params, const char* name)
436{
437 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
438
439 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
440 m_flatBufferBuilder,
441 descriptor.m_ActivationFunc,
442 descriptor.m_ClippingThresCell,
443 descriptor.m_ClippingThresProj,
444 descriptor.m_CifgEnabled,
445 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100446 descriptor.m_ProjectionEnabled,
447 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000448
449 // Get mandatory input parameters
450 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
451 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
452 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
453 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
454 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
455 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
456 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
457 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
458 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
459
460 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
461 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
462 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
463 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
464 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
465 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
466 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
467 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
468 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100469 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
470 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
471 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
472 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000473
474 if (!descriptor.m_CifgEnabled)
475 {
476 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
477 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
478 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
479 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
480 }
481
482 if (descriptor.m_ProjectionEnabled)
483 {
484 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
485 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
486 }
487
488 if (descriptor.m_PeepholeEnabled)
489 {
490 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
491 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
492 }
493
Jan Eilersf8c62972019-07-17 11:07:49 +0100494 if (descriptor.m_LayerNormEnabled)
495 {
496 if (!descriptor.m_CifgEnabled)
497 {
498 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
499 }
500 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
501 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
502 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
503 }
504
Jim Flynn11af3752019-03-19 17:22:29 +0000505 auto fbLstmParams = serializer::CreateLstmInputParams(
506 m_flatBufferBuilder,
507 inputToForgetWeights,
508 inputToCellWeights,
509 inputToOutputWeights,
510 recurrentToForgetWeights,
511 recurrentToCellWeights,
512 recurrentToOutputWeights,
513 forgetGateBias,
514 cellBias,
515 outputGateBias,
516 inputToInputWeights,
517 recurrentToInputWeights,
518 cellToInputWeights,
519 inputGateBias,
520 projectionWeights,
521 projectionBias,
522 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100523 cellToOutputWeights,
524 inputLayerNormWeights,
525 forgetLayerNormWeights,
526 cellLayerNormWeights,
527 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000528
529 auto fbLstmLayer = serializer::CreateLstmLayer(
530 m_flatBufferBuilder,
531 fbLstmBaseLayer,
532 fbLstmDescriptor,
533 fbLstmParams);
534
535 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
536}
537
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000538void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
539{
540 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
541 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
542
543 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
544}
545
546void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
547 const armnn::MeanDescriptor& descriptor,
548 const char* name)
549{
550 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
551 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
552 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
553 descriptor.m_KeepDims);
554
555 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
556 fbMeanBaseLayer,
557 fbMeanDescriptor);
558
559 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
560}
561
562void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
563{
564 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
565 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
566
567 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
568}
569
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100570void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
571{
572 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
573 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
574
575 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
576}
577
Jim Flynnac25a1b2019-02-28 10:40:49 +0000578void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100579 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000580 const char* name)
581{
Jim Flynne242f2d2019-05-22 14:24:13 +0100582 VisitConcatLayer(layer, mergerDescriptor, name);
583}
584
585void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
586 const armnn::ConcatDescriptor& concatDescriptor,
587 const char* name)
588{
589 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000590
591 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100592 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000593 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100594 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000595 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100596 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000597 {
598 origins.push_back(origin[d]);
599 }
600 auto view = m_flatBufferBuilder.CreateVector(origins);
601 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
602 views.push_back(uintVector);
603 }
604
Jim Flynne242f2d2019-05-22 14:24:13 +0100605 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
606 concatDescriptor.GetConcatAxis(),
607 concatDescriptor.GetNumViews(),
608 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000609 m_flatBufferBuilder.CreateVector(views));
610
Jim Flynne242f2d2019-05-22 14:24:13 +0100611 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
612 flatBufferConcatBaseLayer,
613 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000614
Jim Flynne242f2d2019-05-22 14:24:13 +0100615 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000616}
617
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000618void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000619{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000620 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
621 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
622 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000623
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000624 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000625}
626
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000627void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
628 const armnn::PadDescriptor& padDescriptor,
629 const char* name)
630{
631 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
632
633 std::vector<unsigned int> padList;
634 for (auto& p: padDescriptor.m_PadList)
635 {
636 padList.push_back(p.first);
637 padList.push_back(p.second);
638 }
639
640 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100641 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100642 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000643
644 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
645 flatBufferBaseLayer,
646 flatBufferPadDesc);
647
648 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
649}
650
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000651void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
652 const armnn::PermuteDescriptor& permuteDescriptor,
653 const char* name)
654{
655 // Create FlatBuffer BaseLayer
656 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
657
658 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100659 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000660 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100661 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000662 }
663
664 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
665 m_flatBufferBuilder.CreateVector(dimMappings));
666
667 // Create the FlatBuffer PermuteLayer
668 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
669 flatBufferPermuteBaseLayer,
670 flatBufferPermuteDesc);
671
672 // Add the AnyLayer to the FlatBufferLayers
673 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
674}
675
Saoirse Stewart263829c2019-02-19 15:54:14 +0000676// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000677void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000678 const armnn::ReshapeDescriptor& reshapeDescriptor,
679 const char* name)
680{
681 // Create FlatBuffer BaseLayer
682 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
683
684 std::vector<unsigned int> targetShape;
685 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
686 {
687 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
688 }
689
690 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
691 m_flatBufferBuilder.CreateVector(targetShape));
692
693 // Create the FlatBuffer ReshapeLayer
694 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
695 flatBufferReshapeDesc);
696
697 // Add the AnyLayer to the FlatBufferLayers
698 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
699}
700
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000701void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
702 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
703 const char* name)
704{
705 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
706
707 auto flatBufferDescriptor =
708 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
709 resizeDescriptor.m_TargetWidth,
710 resizeDescriptor.m_TargetHeight,
711 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
712
713 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
714 flatBufferBaseLayer,
715 flatBufferDescriptor);
716
717 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
718}
719
Teresa Charlina9075df2019-06-27 15:41:57 +0100720void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
721 const armnn::ResizeDescriptor& resizeDescriptor,
722 const char* name)
723{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100724 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
725
726 auto flatBufferDescriptor =
727 CreateResizeDescriptor(m_flatBufferBuilder,
728 resizeDescriptor.m_TargetHeight,
729 resizeDescriptor.m_TargetWidth,
730 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
731 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
732
733 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
734 flatBufferBaseLayer,
735 flatBufferDescriptor);
736
737 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100738}
739
Sadik Armagan8b42a382019-03-01 14:24:49 +0000740void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
741{
742 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
743 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
744
745 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
746}
747
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100748void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
749 const armnn::SliceDescriptor& sliceDescriptor,
750 const char* name)
751{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100752 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
753 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
754 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
755 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
756
757 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
758
759 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100760}
761
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000762// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000763void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
764 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000765 const char* name)
766{
767 // Create FlatBuffer BaseLayer
768 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
769
770 // Create the FlatBuffer SoftmaxDescriptor
771 auto flatBufferSoftmaxDesc =
772 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
773
774 // Create the FlatBuffer SoftmaxLayer
775 auto flatBufferSoftmaxLayer =
776 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
777 flatBufferSoftmaxBaseLayer,
778 flatBufferSoftmaxDesc);
779
780 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
781}
782
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000783void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
784 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000785 const char* name)
786{
787 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
788 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
789 m_flatBufferBuilder,
790 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
791 pooling2dDescriptor.m_PadLeft,
792 pooling2dDescriptor.m_PadRight,
793 pooling2dDescriptor.m_PadTop,
794 pooling2dDescriptor.m_PadBottom,
795 pooling2dDescriptor.m_PoolWidth,
796 pooling2dDescriptor.m_PoolHeight,
797 pooling2dDescriptor.m_StrideX,
798 pooling2dDescriptor.m_StrideY,
799 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
800 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
801 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
802
803 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
804 fbPooling2dBaseLayer,
805 fbPooling2dDescriptor);
806
807 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
808}
809
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100810void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
811 const char* name)
812{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100813 // Create FlatBuffer BaseLayer
814 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
815
816 // Create the FlatBuffer AdditionLayer
817 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
818
819 // Add the AnyLayer to the FlatBufferLayers
820 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100821}
822
Derek Lamberti87acb272019-03-27 16:51:31 +0000823void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
824{
825 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
826 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
827 fbQuantizeBaseLayer);
828 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
829}
830
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000831// Build FlatBuffer for FullyConnected Layer
832void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
833 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
834 const armnn::ConstTensor& weights,
835 const armnn::Optional<armnn::ConstTensor>& biases,
836 const char* name)
837{
838 // Create FlatBuffer BaseLayer
839 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
840
841 // Create FlatBuffer FullyConnectedDescriptor
842 auto flatBufferDescriptor =
843 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
844 fullyConnectedDescriptor.m_BiasEnabled,
845 fullyConnectedDescriptor.m_TransposeWeightMatrix);
846
847 // Create FlatBuffer weights data
848 auto flatBufferWeights = CreateConstTensorInfo(weights);
849
850 // Create FlatBuffer bias data
851 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
852 if (fullyConnectedDescriptor.m_BiasEnabled)
853 {
854 flatBufferBiases = CreateConstTensorInfo(biases.value());
855 }
856
857 // Create FlatBuffer FullyConnectedLayer
858 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
859 flatBufferBaseLayer,
860 flatBufferDescriptor,
861 flatBufferWeights,
862 flatBufferBiases);
863
864 // Add created FullyConnectedLayer to the FlatBufferLayers
865 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
866}
867
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000868// Build FlatBuffer for SpaceToBatchNd Layer
869void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
870 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
871 const char* name)
872{
873 // Create FlatBuffer BaseLayer
874 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
875
876 std::vector<unsigned int> padList;
877 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
878 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
879 {
880 padList.push_back(pad.first);
881 padList.push_back(pad.second);
882 }
883
884 auto flatBufferDescriptor =
885 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
886 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
887 m_flatBufferBuilder.CreateVector(padList),
888 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
889
890 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
891 flatBufferBaseLayer,
892 flatBufferDescriptor);
893
894 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
895}
896
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100897// Build FlatBuffer for SpaceToDepthLayer
898void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
899 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
900 const char* name)
901{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100902 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
903 auto flatBufferDescriptor =
904 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
905 spaceToDepthDescriptor.m_BlockSize,
906 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
907
908 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
909 flatBufferBaseLayer,
910 flatBufferDescriptor);
911
912 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100913}
914
Jim Flynn18ce3382019-03-08 11:08:30 +0000915// Build FlatBuffer for Splitter Layer
916void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
917 const armnn::ViewsDescriptor& viewsDescriptor,
918 const char* name)
919{
920 // Create FlatBuffer ViewOrigins
921 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
922 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
923
924 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
925 {
926 std::vector<uint32_t> viewOrigin;
927 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
928
929 // Copy vector
930 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
931 {
932 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
933 }
934
935 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
936 m_flatBufferBuilder.CreateVector(viewOrigin)));
937 }
938
939 // Create FlatBuffer OriginsDescriptor
940 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
941 viewsDescriptor.GetOrigins().GetConcatAxis(),
942 viewsDescriptor.GetOrigins().GetNumViews(),
943 viewsDescriptor.GetOrigins().GetNumDimensions(),
944 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
945
946 // Create FlatBuffer ViewOrigins
947 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
948 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
949
950 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
951 {
952 std::vector<uint32_t> viewSize;
953 viewSize.reserve(viewsDescriptor.GetNumDimensions());
954
955 // Copy vector
956 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
957 {
958 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
959 }
960
961 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
962 m_flatBufferBuilder.CreateVector(viewSize)));
963 }
964
965 // Create FlatBuffer ViewsDescriptor
966 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
967 flatBufferOriginDescriptor,
968 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
969
970 // Create FlatBuffer BaseLayer
971 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
972
973 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
974 flatBufferBaseLayer,
975 flatBufferViewsDescriptor);
976
977 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
978}
979
Nina Drozd57728782019-02-27 10:53:27 +0000980void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
981 const armnn::NormalizationDescriptor& descriptor,
982 const char* name)
983{
984 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
985
986 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
987 m_flatBufferBuilder,
988 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
989 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
990 descriptor.m_NormSize,
991 descriptor.m_Alpha,
992 descriptor.m_Beta,
993 descriptor.m_K,
994 GetFlatBufferDataLayout(descriptor.m_DataLayout));
995
996 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
997 fbNormalizationBaseLayer,
998 fbNormalizationDescriptor);
999
1000 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1001}
1002
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001003void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1004 const armnn::StackDescriptor& stackDescriptor,
1005 const char* name)
1006{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001007 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1008
1009 std::vector<unsigned int> inputShape;
1010 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1011 {
1012 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1013 }
1014
1015 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1016 stackDescriptor.m_Axis,
1017 stackDescriptor.m_NumInputs,
1018 m_flatBufferBuilder.CreateVector(inputShape));
1019
1020 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1021 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001022}
1023
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001024void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1025 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1026 const char* name)
1027{
1028 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1029
1030 auto flatBufferDescriptor =
1031 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1032 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1033 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1034 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1035 stridedSliceDescriptor.m_BeginMask,
1036 stridedSliceDescriptor.m_EndMask,
1037 stridedSliceDescriptor.m_ShrinkAxisMask,
1038 stridedSliceDescriptor.m_EllipsisMask,
1039 stridedSliceDescriptor.m_NewAxisMask,
1040 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1041
1042 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1043 flatBufferBaseLayer,
1044 flatBufferDescriptor);
1045
1046 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1047}
1048
Conor Kennedyda1f9752019-03-01 14:37:12 +00001049void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1050{
1051 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1052 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1053
1054 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1055}
1056
Sadik Armaganeff363d2019-04-05 15:25:46 +01001057void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1058{
1059 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1060 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1061
1062 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1063}
1064
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001065void SerializerVisitor::VisitTransposeConvolution2dLayer(
1066 const armnn::IConnectableLayer* layer,
1067 const armnn::TransposeConvolution2dDescriptor& descriptor,
1068 const armnn::ConstTensor& weights,
1069 const armnn::Optional<armnn::ConstTensor>& biases,
1070 const char* name)
1071{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001072 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1073 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1074 descriptor.m_PadLeft,
1075 descriptor.m_PadRight,
1076 descriptor.m_PadTop,
1077 descriptor.m_PadBottom,
1078 descriptor.m_StrideX,
1079 descriptor.m_StrideY,
1080 descriptor.m_BiasEnabled,
1081 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1082
1083 // weights & biases
1084 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1085 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1086 if (biases.has_value())
1087 {
1088 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1089 }
1090
1091 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1092 fbBaseLayer,
1093 fbDescriptor,
1094 fbWeightsConstTensorInfo,
1095 fbBiasesConstTensorInfo);
1096
1097 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001098}
1099
James Conroyee18dc82019-07-17 11:27:46 +01001100void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1101 const armnn::QuantizedLstmInputParams& params,
1102 const char* name)
1103{
Jan Eilers5b01a892019-07-23 09:47:43 +01001104 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1105
1106 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001107 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1108 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1109 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1110 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001111
Francis Murtaghbb590b42019-08-14 09:51:36 +01001112 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1113 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1114 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1115 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001116
Francis Murtaghbb590b42019-08-14 09:51:36 +01001117 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1118 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1119 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1120 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001121
1122 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1123 m_flatBufferBuilder,
1124 inputToInputWeights,
1125 inputToForgetWeights,
1126 inputToCellWeights,
1127 inputToOutputWeights,
1128 recurrentToInputWeights,
1129 recurrentToForgetWeights,
1130 recurrentToCellWeights,
1131 recurrentToOutputWeights,
1132 inputGateBias,
1133 forgetGateBias,
1134 cellBias,
1135 outputGateBias);
1136
1137 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1138 m_flatBufferBuilder,
1139 fbQuantizedLstmBaseLayer,
1140 fbQuantizedLstmParams);
1141
1142 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001143}
1144
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001145fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001146 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001147{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001148 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1149
Mike Kelly8c1701a2019-02-11 17:01:27 +00001150 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1151 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1152
1153 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001154 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001155 m_flatBufferBuilder.CreateString(layer->GetName()),
1156 layerType,
1157 m_flatBufferBuilder.CreateVector(inputSlots),
1158 m_flatBufferBuilder.CreateVector(outputSlots));
1159}
1160
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001161void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001162{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001163 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001164 m_serializedLayers.push_back(anyLayer);
1165}
1166
Mike Kellya0766c32019-02-19 17:22:07 +00001167template <typename T>
1168flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1169{
1170 const T* buffer = reinterpret_cast<const T*>(memory);
1171 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1172 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1173 return fbVector;
1174}
1175
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001176flatbuffers::Offset<serializer::ConstTensor>
1177 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001178{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001179 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001180
1181 // Get the dimensions
1182 std::vector<unsigned int> shape;
1183
1184 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1185 {
1186 shape.push_back(tensorInfo.GetShape()[dim]);
1187 }
1188
1189 // Create FlatBuffer TensorInfo
1190 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1191 m_flatBufferBuilder.CreateVector(shape),
1192 GetFlatBufferDataType(tensorInfo.GetDataType()),
1193 tensorInfo.GetQuantizationScale(),
1194 tensorInfo.GetQuantizationOffset());
1195 flatbuffers::Offset<void> fbPayload;
1196
1197 switch (tensorInfo.GetDataType())
1198 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001199 case armnn::DataType::Float32:
1200 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001201 {
1202 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1203 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1204 m_flatBufferBuilder,
1205 fbVector);
1206 fbPayload = flatBuffersData.o;
1207 break;
1208 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001209 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001210 {
1211 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1212 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1213 m_flatBufferBuilder,
1214 fbVector);
1215 fbPayload = flatBuffersData.o;
1216 break;
1217 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001218 case armnn::DataType::QuantisedSymm16:
1219 {
1220 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1221 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1222 m_flatBufferBuilder,
1223 fbVector);
1224 fbPayload = flatBuffersData.o;
1225 break;
1226 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001227 case armnn::DataType::QuantisedAsymm8:
1228 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001229 default:
1230 {
1231 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1232 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1233 m_flatBufferBuilder,
1234 fbVector);
1235 fbPayload = flatBuffersData.o;
1236 }
1237 }
1238 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1239 m_flatBufferBuilder,
1240 flatBufferTensorInfo,
1241 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1242 fbPayload);
1243 return flatBufferConstTensor;
1244}
1245
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001246std::vector<fb::Offset<serializer::InputSlot>>
1247 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001248{
Mike Kellya0766c32019-02-19 17:22:07 +00001249 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001250
1251 // Get the InputSlots
1252 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1253 {
1254 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1255
1256 // Get the Connection for the InputSlot
1257 const IOutputSlot* connection = inputSlot.GetConnection();
1258
1259 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001260 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1261 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001262 // Create FlatBuffer InputSlot
1263 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1264 }
1265 return inputSlots;
1266}
1267
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001268std::vector<fb::Offset<serializer::OutputSlot>>
1269 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001270{
1271 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1272
1273 // Get the OutputSlots
1274 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1275 {
1276 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001277 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001278
1279 // Get the dimensions
1280 std::vector<unsigned int> shape;
1281 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1282 {
1283 shape.push_back(tensorInfo.GetShape()[dim]);
1284 }
1285
1286 // Create FlatBuffer TensorInfo
1287 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1288 m_flatBufferBuilder.CreateVector(shape),
1289 GetFlatBufferDataType(tensorInfo.GetDataType()),
1290 tensorInfo.GetQuantizationScale(),
1291 tensorInfo.GetQuantizationOffset());
1292
1293 // Create FlatBuffer Outputslot
1294 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1295 slotIndex,
1296 flatBufferTensorInfo));
1297 }
1298 return outputSlots;
1299}
1300
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001301
1302ISerializer* ISerializer::CreateRaw()
1303{
1304 return new Serializer();
1305}
1306
1307ISerializerPtr ISerializer::Create()
1308{
1309 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1310}
1311
1312void ISerializer::Destroy(ISerializer* serializer)
1313{
1314 delete serializer;
1315}
1316
1317void Serializer::Serialize(const INetwork& inNetwork)
1318{
1319 // Iterate through to network
1320 inNetwork.Accept(m_SerializerVisitor);
1321 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1322
1323 // Create FlatBuffer SerializedGraph
1324 auto serializedGraph = serializer::CreateSerializedGraph(
1325 fbBuilder,
1326 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1327 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1328 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1329
1330 // Serialize the graph
1331 fbBuilder.Finish(serializedGraph);
1332}
1333
1334bool Serializer::SaveSerializedToStream(std::ostream& stream)
1335{
1336 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1337
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001338 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1339 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001340 return !stream.bad();
1341}
1342
Matteo Martincighec333912019-02-13 15:12:39 +00001343} // namespace armnnSerializer