blob: 06bfb91e836c2298876858232bcb3a659e31c9b9 [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{
752 throw UnimplementedException("SerializerVisitor::VisitSliceLayer is not implemented");
753}
754
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000755// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000756void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
757 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000758 const char* name)
759{
760 // Create FlatBuffer BaseLayer
761 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
762
763 // Create the FlatBuffer SoftmaxDescriptor
764 auto flatBufferSoftmaxDesc =
765 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
766
767 // Create the FlatBuffer SoftmaxLayer
768 auto flatBufferSoftmaxLayer =
769 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
770 flatBufferSoftmaxBaseLayer,
771 flatBufferSoftmaxDesc);
772
773 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
774}
775
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000776void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
777 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000778 const char* name)
779{
780 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
781 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
782 m_flatBufferBuilder,
783 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
784 pooling2dDescriptor.m_PadLeft,
785 pooling2dDescriptor.m_PadRight,
786 pooling2dDescriptor.m_PadTop,
787 pooling2dDescriptor.m_PadBottom,
788 pooling2dDescriptor.m_PoolWidth,
789 pooling2dDescriptor.m_PoolHeight,
790 pooling2dDescriptor.m_StrideX,
791 pooling2dDescriptor.m_StrideY,
792 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
793 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
794 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
795
796 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
797 fbPooling2dBaseLayer,
798 fbPooling2dDescriptor);
799
800 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
801}
802
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100803void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
804 const char* name)
805{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100806 // Create FlatBuffer BaseLayer
807 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
808
809 // Create the FlatBuffer AdditionLayer
810 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
811
812 // Add the AnyLayer to the FlatBufferLayers
813 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100814}
815
Derek Lamberti87acb272019-03-27 16:51:31 +0000816void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
817{
818 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
819 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
820 fbQuantizeBaseLayer);
821 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
822}
823
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000824// Build FlatBuffer for FullyConnected Layer
825void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
826 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
827 const armnn::ConstTensor& weights,
828 const armnn::Optional<armnn::ConstTensor>& biases,
829 const char* name)
830{
831 // Create FlatBuffer BaseLayer
832 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
833
834 // Create FlatBuffer FullyConnectedDescriptor
835 auto flatBufferDescriptor =
836 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
837 fullyConnectedDescriptor.m_BiasEnabled,
838 fullyConnectedDescriptor.m_TransposeWeightMatrix);
839
840 // Create FlatBuffer weights data
841 auto flatBufferWeights = CreateConstTensorInfo(weights);
842
843 // Create FlatBuffer bias data
844 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
845 if (fullyConnectedDescriptor.m_BiasEnabled)
846 {
847 flatBufferBiases = CreateConstTensorInfo(biases.value());
848 }
849
850 // Create FlatBuffer FullyConnectedLayer
851 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
852 flatBufferBaseLayer,
853 flatBufferDescriptor,
854 flatBufferWeights,
855 flatBufferBiases);
856
857 // Add created FullyConnectedLayer to the FlatBufferLayers
858 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
859}
860
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000861// Build FlatBuffer for SpaceToBatchNd Layer
862void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
863 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
864 const char* name)
865{
866 // Create FlatBuffer BaseLayer
867 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
868
869 std::vector<unsigned int> padList;
870 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
871 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
872 {
873 padList.push_back(pad.first);
874 padList.push_back(pad.second);
875 }
876
877 auto flatBufferDescriptor =
878 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
879 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
880 m_flatBufferBuilder.CreateVector(padList),
881 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
882
883 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
884 flatBufferBaseLayer,
885 flatBufferDescriptor);
886
887 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
888}
889
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100890// Build FlatBuffer for SpaceToDepthLayer
891void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
892 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
893 const char* name)
894{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100895 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
896 auto flatBufferDescriptor =
897 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
898 spaceToDepthDescriptor.m_BlockSize,
899 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
900
901 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
902 flatBufferBaseLayer,
903 flatBufferDescriptor);
904
905 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100906}
907
Jim Flynn18ce3382019-03-08 11:08:30 +0000908// Build FlatBuffer for Splitter Layer
909void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
910 const armnn::ViewsDescriptor& viewsDescriptor,
911 const char* name)
912{
913 // Create FlatBuffer ViewOrigins
914 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
915 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
916
917 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
918 {
919 std::vector<uint32_t> viewOrigin;
920 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
921
922 // Copy vector
923 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
924 {
925 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
926 }
927
928 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
929 m_flatBufferBuilder.CreateVector(viewOrigin)));
930 }
931
932 // Create FlatBuffer OriginsDescriptor
933 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
934 viewsDescriptor.GetOrigins().GetConcatAxis(),
935 viewsDescriptor.GetOrigins().GetNumViews(),
936 viewsDescriptor.GetOrigins().GetNumDimensions(),
937 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
938
939 // Create FlatBuffer ViewOrigins
940 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
941 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
942
943 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
944 {
945 std::vector<uint32_t> viewSize;
946 viewSize.reserve(viewsDescriptor.GetNumDimensions());
947
948 // Copy vector
949 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
950 {
951 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
952 }
953
954 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
955 m_flatBufferBuilder.CreateVector(viewSize)));
956 }
957
958 // Create FlatBuffer ViewsDescriptor
959 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
960 flatBufferOriginDescriptor,
961 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
962
963 // Create FlatBuffer BaseLayer
964 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
965
966 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
967 flatBufferBaseLayer,
968 flatBufferViewsDescriptor);
969
970 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
971}
972
Nina Drozd57728782019-02-27 10:53:27 +0000973void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
974 const armnn::NormalizationDescriptor& descriptor,
975 const char* name)
976{
977 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
978
979 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
980 m_flatBufferBuilder,
981 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
982 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
983 descriptor.m_NormSize,
984 descriptor.m_Alpha,
985 descriptor.m_Beta,
986 descriptor.m_K,
987 GetFlatBufferDataLayout(descriptor.m_DataLayout));
988
989 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
990 fbNormalizationBaseLayer,
991 fbNormalizationDescriptor);
992
993 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
994}
995
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100996void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
997 const armnn::StackDescriptor& stackDescriptor,
998 const char* name)
999{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001000 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1001
1002 std::vector<unsigned int> inputShape;
1003 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1004 {
1005 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1006 }
1007
1008 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1009 stackDescriptor.m_Axis,
1010 stackDescriptor.m_NumInputs,
1011 m_flatBufferBuilder.CreateVector(inputShape));
1012
1013 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1014 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001015}
1016
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001017void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1018 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1019 const char* name)
1020{
1021 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1022
1023 auto flatBufferDescriptor =
1024 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1025 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1026 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1027 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1028 stridedSliceDescriptor.m_BeginMask,
1029 stridedSliceDescriptor.m_EndMask,
1030 stridedSliceDescriptor.m_ShrinkAxisMask,
1031 stridedSliceDescriptor.m_EllipsisMask,
1032 stridedSliceDescriptor.m_NewAxisMask,
1033 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1034
1035 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1036 flatBufferBaseLayer,
1037 flatBufferDescriptor);
1038
1039 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1040}
1041
Conor Kennedyda1f9752019-03-01 14:37:12 +00001042void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1043{
1044 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1045 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1046
1047 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1048}
1049
Sadik Armaganeff363d2019-04-05 15:25:46 +01001050void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1051{
1052 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1053 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1054
1055 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1056}
1057
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001058void SerializerVisitor::VisitTransposeConvolution2dLayer(
1059 const armnn::IConnectableLayer* layer,
1060 const armnn::TransposeConvolution2dDescriptor& descriptor,
1061 const armnn::ConstTensor& weights,
1062 const armnn::Optional<armnn::ConstTensor>& biases,
1063 const char* name)
1064{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001065 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1066 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1067 descriptor.m_PadLeft,
1068 descriptor.m_PadRight,
1069 descriptor.m_PadTop,
1070 descriptor.m_PadBottom,
1071 descriptor.m_StrideX,
1072 descriptor.m_StrideY,
1073 descriptor.m_BiasEnabled,
1074 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1075
1076 // weights & biases
1077 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1078 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1079 if (biases.has_value())
1080 {
1081 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1082 }
1083
1084 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1085 fbBaseLayer,
1086 fbDescriptor,
1087 fbWeightsConstTensorInfo,
1088 fbBiasesConstTensorInfo);
1089
1090 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001091}
1092
James Conroyee18dc82019-07-17 11:27:46 +01001093void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1094 const armnn::QuantizedLstmInputParams& params,
1095 const char* name)
1096{
Jan Eilers5b01a892019-07-23 09:47:43 +01001097 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1098
1099 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001100 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1101 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1102 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1103 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001104
Francis Murtaghbb590b42019-08-14 09:51:36 +01001105 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1106 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1107 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1108 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001109
Francis Murtaghbb590b42019-08-14 09:51:36 +01001110 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1111 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1112 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1113 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001114
1115 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1116 m_flatBufferBuilder,
1117 inputToInputWeights,
1118 inputToForgetWeights,
1119 inputToCellWeights,
1120 inputToOutputWeights,
1121 recurrentToInputWeights,
1122 recurrentToForgetWeights,
1123 recurrentToCellWeights,
1124 recurrentToOutputWeights,
1125 inputGateBias,
1126 forgetGateBias,
1127 cellBias,
1128 outputGateBias);
1129
1130 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1131 m_flatBufferBuilder,
1132 fbQuantizedLstmBaseLayer,
1133 fbQuantizedLstmParams);
1134
1135 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001136}
1137
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001138fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001139 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001140{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001141 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1142
Mike Kelly8c1701a2019-02-11 17:01:27 +00001143 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1144 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1145
1146 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001147 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001148 m_flatBufferBuilder.CreateString(layer->GetName()),
1149 layerType,
1150 m_flatBufferBuilder.CreateVector(inputSlots),
1151 m_flatBufferBuilder.CreateVector(outputSlots));
1152}
1153
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001154void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001155{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001156 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001157 m_serializedLayers.push_back(anyLayer);
1158}
1159
Mike Kellya0766c32019-02-19 17:22:07 +00001160template <typename T>
1161flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1162{
1163 const T* buffer = reinterpret_cast<const T*>(memory);
1164 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1165 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1166 return fbVector;
1167}
1168
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001169flatbuffers::Offset<serializer::ConstTensor>
1170 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001171{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001172 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001173
1174 // Get the dimensions
1175 std::vector<unsigned int> shape;
1176
1177 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1178 {
1179 shape.push_back(tensorInfo.GetShape()[dim]);
1180 }
1181
1182 // Create FlatBuffer TensorInfo
1183 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1184 m_flatBufferBuilder.CreateVector(shape),
1185 GetFlatBufferDataType(tensorInfo.GetDataType()),
1186 tensorInfo.GetQuantizationScale(),
1187 tensorInfo.GetQuantizationOffset());
1188 flatbuffers::Offset<void> fbPayload;
1189
1190 switch (tensorInfo.GetDataType())
1191 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001192 case armnn::DataType::Float32:
1193 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001194 {
1195 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1196 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1197 m_flatBufferBuilder,
1198 fbVector);
1199 fbPayload = flatBuffersData.o;
1200 break;
1201 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001202 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001203 {
1204 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1205 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1206 m_flatBufferBuilder,
1207 fbVector);
1208 fbPayload = flatBuffersData.o;
1209 break;
1210 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001211 case armnn::DataType::QuantisedSymm16:
1212 {
1213 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1214 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1215 m_flatBufferBuilder,
1216 fbVector);
1217 fbPayload = flatBuffersData.o;
1218 break;
1219 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001220 case armnn::DataType::QuantisedAsymm8:
1221 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001222 default:
1223 {
1224 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1225 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1226 m_flatBufferBuilder,
1227 fbVector);
1228 fbPayload = flatBuffersData.o;
1229 }
1230 }
1231 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1232 m_flatBufferBuilder,
1233 flatBufferTensorInfo,
1234 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1235 fbPayload);
1236 return flatBufferConstTensor;
1237}
1238
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001239std::vector<fb::Offset<serializer::InputSlot>>
1240 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001241{
Mike Kellya0766c32019-02-19 17:22:07 +00001242 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001243
1244 // Get the InputSlots
1245 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1246 {
1247 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1248
1249 // Get the Connection for the InputSlot
1250 const IOutputSlot* connection = inputSlot.GetConnection();
1251
1252 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001253 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1254 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001255 // Create FlatBuffer InputSlot
1256 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1257 }
1258 return inputSlots;
1259}
1260
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001261std::vector<fb::Offset<serializer::OutputSlot>>
1262 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001263{
1264 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1265
1266 // Get the OutputSlots
1267 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1268 {
1269 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001270 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001271
1272 // Get the dimensions
1273 std::vector<unsigned int> shape;
1274 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1275 {
1276 shape.push_back(tensorInfo.GetShape()[dim]);
1277 }
1278
1279 // Create FlatBuffer TensorInfo
1280 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1281 m_flatBufferBuilder.CreateVector(shape),
1282 GetFlatBufferDataType(tensorInfo.GetDataType()),
1283 tensorInfo.GetQuantizationScale(),
1284 tensorInfo.GetQuantizationOffset());
1285
1286 // Create FlatBuffer Outputslot
1287 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1288 slotIndex,
1289 flatBufferTensorInfo));
1290 }
1291 return outputSlots;
1292}
1293
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001294
1295ISerializer* ISerializer::CreateRaw()
1296{
1297 return new Serializer();
1298}
1299
1300ISerializerPtr ISerializer::Create()
1301{
1302 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1303}
1304
1305void ISerializer::Destroy(ISerializer* serializer)
1306{
1307 delete serializer;
1308}
1309
1310void Serializer::Serialize(const INetwork& inNetwork)
1311{
1312 // Iterate through to network
1313 inNetwork.Accept(m_SerializerVisitor);
1314 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1315
1316 // Create FlatBuffer SerializedGraph
1317 auto serializedGraph = serializer::CreateSerializedGraph(
1318 fbBuilder,
1319 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1320 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1321 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1322
1323 // Serialize the graph
1324 fbBuilder.Finish(serializedGraph);
1325}
1326
1327bool Serializer::SaveSerializedToStream(std::ostream& stream)
1328{
1329 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1330
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001331 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1332 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001333 return !stream.bad();
1334}
1335
Matteo Martincighec333912019-02-13 15:12:39 +00001336} // namespace armnnSerializer