blob: 602c4ab99f4afc381ae6321729f4e2b115759cfb [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-Tarfc413c02019-02-13 15:41:52 +0000748// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000749void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
750 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000751 const char* name)
752{
753 // Create FlatBuffer BaseLayer
754 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
755
756 // Create the FlatBuffer SoftmaxDescriptor
757 auto flatBufferSoftmaxDesc =
758 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
759
760 // Create the FlatBuffer SoftmaxLayer
761 auto flatBufferSoftmaxLayer =
762 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
763 flatBufferSoftmaxBaseLayer,
764 flatBufferSoftmaxDesc);
765
766 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
767}
768
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000769void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
770 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000771 const char* name)
772{
773 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
774 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
775 m_flatBufferBuilder,
776 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
777 pooling2dDescriptor.m_PadLeft,
778 pooling2dDescriptor.m_PadRight,
779 pooling2dDescriptor.m_PadTop,
780 pooling2dDescriptor.m_PadBottom,
781 pooling2dDescriptor.m_PoolWidth,
782 pooling2dDescriptor.m_PoolHeight,
783 pooling2dDescriptor.m_StrideX,
784 pooling2dDescriptor.m_StrideY,
785 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
786 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
787 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
788
789 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
790 fbPooling2dBaseLayer,
791 fbPooling2dDescriptor);
792
793 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
794}
795
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100796void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
797 const char* name)
798{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100799 // Create FlatBuffer BaseLayer
800 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
801
802 // Create the FlatBuffer AdditionLayer
803 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
804
805 // Add the AnyLayer to the FlatBufferLayers
806 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100807}
808
Derek Lamberti87acb272019-03-27 16:51:31 +0000809void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
810{
811 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
812 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
813 fbQuantizeBaseLayer);
814 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
815}
816
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000817// Build FlatBuffer for FullyConnected Layer
818void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
819 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
820 const armnn::ConstTensor& weights,
821 const armnn::Optional<armnn::ConstTensor>& biases,
822 const char* name)
823{
824 // Create FlatBuffer BaseLayer
825 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
826
827 // Create FlatBuffer FullyConnectedDescriptor
828 auto flatBufferDescriptor =
829 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
830 fullyConnectedDescriptor.m_BiasEnabled,
831 fullyConnectedDescriptor.m_TransposeWeightMatrix);
832
833 // Create FlatBuffer weights data
834 auto flatBufferWeights = CreateConstTensorInfo(weights);
835
836 // Create FlatBuffer bias data
837 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
838 if (fullyConnectedDescriptor.m_BiasEnabled)
839 {
840 flatBufferBiases = CreateConstTensorInfo(biases.value());
841 }
842
843 // Create FlatBuffer FullyConnectedLayer
844 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
845 flatBufferBaseLayer,
846 flatBufferDescriptor,
847 flatBufferWeights,
848 flatBufferBiases);
849
850 // Add created FullyConnectedLayer to the FlatBufferLayers
851 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
852}
853
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000854// Build FlatBuffer for SpaceToBatchNd Layer
855void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
856 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
857 const char* name)
858{
859 // Create FlatBuffer BaseLayer
860 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
861
862 std::vector<unsigned int> padList;
863 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
864 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
865 {
866 padList.push_back(pad.first);
867 padList.push_back(pad.second);
868 }
869
870 auto flatBufferDescriptor =
871 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
872 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
873 m_flatBufferBuilder.CreateVector(padList),
874 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
875
876 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
877 flatBufferBaseLayer,
878 flatBufferDescriptor);
879
880 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
881}
882
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100883// Build FlatBuffer for SpaceToDepthLayer
884void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
885 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
886 const char* name)
887{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100888 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
889 auto flatBufferDescriptor =
890 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
891 spaceToDepthDescriptor.m_BlockSize,
892 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
893
894 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
895 flatBufferBaseLayer,
896 flatBufferDescriptor);
897
898 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100899}
900
Jim Flynn18ce3382019-03-08 11:08:30 +0000901// Build FlatBuffer for Splitter Layer
902void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
903 const armnn::ViewsDescriptor& viewsDescriptor,
904 const char* name)
905{
906 // Create FlatBuffer ViewOrigins
907 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
908 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
909
910 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
911 {
912 std::vector<uint32_t> viewOrigin;
913 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
914
915 // Copy vector
916 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
917 {
918 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
919 }
920
921 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
922 m_flatBufferBuilder.CreateVector(viewOrigin)));
923 }
924
925 // Create FlatBuffer OriginsDescriptor
926 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
927 viewsDescriptor.GetOrigins().GetConcatAxis(),
928 viewsDescriptor.GetOrigins().GetNumViews(),
929 viewsDescriptor.GetOrigins().GetNumDimensions(),
930 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
931
932 // Create FlatBuffer ViewOrigins
933 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
934 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
935
936 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
937 {
938 std::vector<uint32_t> viewSize;
939 viewSize.reserve(viewsDescriptor.GetNumDimensions());
940
941 // Copy vector
942 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
943 {
944 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
945 }
946
947 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
948 m_flatBufferBuilder.CreateVector(viewSize)));
949 }
950
951 // Create FlatBuffer ViewsDescriptor
952 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
953 flatBufferOriginDescriptor,
954 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
955
956 // Create FlatBuffer BaseLayer
957 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
958
959 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
960 flatBufferBaseLayer,
961 flatBufferViewsDescriptor);
962
963 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
964}
965
Nina Drozd57728782019-02-27 10:53:27 +0000966void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
967 const armnn::NormalizationDescriptor& descriptor,
968 const char* name)
969{
970 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
971
972 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
973 m_flatBufferBuilder,
974 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
975 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
976 descriptor.m_NormSize,
977 descriptor.m_Alpha,
978 descriptor.m_Beta,
979 descriptor.m_K,
980 GetFlatBufferDataLayout(descriptor.m_DataLayout));
981
982 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
983 fbNormalizationBaseLayer,
984 fbNormalizationDescriptor);
985
986 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
987}
988
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100989void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
990 const armnn::StackDescriptor& stackDescriptor,
991 const char* name)
992{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +0100993 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
994
995 std::vector<unsigned int> inputShape;
996 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
997 {
998 inputShape.push_back(stackDescriptor.m_InputShape[i]);
999 }
1000
1001 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1002 stackDescriptor.m_Axis,
1003 stackDescriptor.m_NumInputs,
1004 m_flatBufferBuilder.CreateVector(inputShape));
1005
1006 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1007 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001008}
1009
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001010void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1011 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1012 const char* name)
1013{
1014 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1015
1016 auto flatBufferDescriptor =
1017 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1018 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1019 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1020 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1021 stridedSliceDescriptor.m_BeginMask,
1022 stridedSliceDescriptor.m_EndMask,
1023 stridedSliceDescriptor.m_ShrinkAxisMask,
1024 stridedSliceDescriptor.m_EllipsisMask,
1025 stridedSliceDescriptor.m_NewAxisMask,
1026 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1027
1028 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1029 flatBufferBaseLayer,
1030 flatBufferDescriptor);
1031
1032 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1033}
1034
Conor Kennedyda1f9752019-03-01 14:37:12 +00001035void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1036{
1037 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1038 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1039
1040 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1041}
1042
Sadik Armaganeff363d2019-04-05 15:25:46 +01001043void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1044{
1045 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1046 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1047
1048 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1049}
1050
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001051void SerializerVisitor::VisitTransposeConvolution2dLayer(
1052 const armnn::IConnectableLayer* layer,
1053 const armnn::TransposeConvolution2dDescriptor& descriptor,
1054 const armnn::ConstTensor& weights,
1055 const armnn::Optional<armnn::ConstTensor>& biases,
1056 const char* name)
1057{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001058 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1059 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1060 descriptor.m_PadLeft,
1061 descriptor.m_PadRight,
1062 descriptor.m_PadTop,
1063 descriptor.m_PadBottom,
1064 descriptor.m_StrideX,
1065 descriptor.m_StrideY,
1066 descriptor.m_BiasEnabled,
1067 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1068
1069 // weights & biases
1070 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1071 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1072 if (biases.has_value())
1073 {
1074 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1075 }
1076
1077 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1078 fbBaseLayer,
1079 fbDescriptor,
1080 fbWeightsConstTensorInfo,
1081 fbBiasesConstTensorInfo);
1082
1083 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001084}
1085
James Conroyee18dc82019-07-17 11:27:46 +01001086void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1087 const armnn::QuantizedLstmInputParams& params,
1088 const char* name)
1089{
Jan Eilers5b01a892019-07-23 09:47:43 +01001090 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1091
1092 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001093 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1094 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1095 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1096 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001097
Francis Murtaghbb590b42019-08-14 09:51:36 +01001098 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1099 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1100 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1101 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001102
Francis Murtaghbb590b42019-08-14 09:51:36 +01001103 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1104 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1105 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1106 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001107
1108 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1109 m_flatBufferBuilder,
1110 inputToInputWeights,
1111 inputToForgetWeights,
1112 inputToCellWeights,
1113 inputToOutputWeights,
1114 recurrentToInputWeights,
1115 recurrentToForgetWeights,
1116 recurrentToCellWeights,
1117 recurrentToOutputWeights,
1118 inputGateBias,
1119 forgetGateBias,
1120 cellBias,
1121 outputGateBias);
1122
1123 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1124 m_flatBufferBuilder,
1125 fbQuantizedLstmBaseLayer,
1126 fbQuantizedLstmParams);
1127
1128 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001129}
1130
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001131fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001132 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001133{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001134 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1135
Mike Kelly8c1701a2019-02-11 17:01:27 +00001136 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1137 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1138
1139 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001140 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001141 m_flatBufferBuilder.CreateString(layer->GetName()),
1142 layerType,
1143 m_flatBufferBuilder.CreateVector(inputSlots),
1144 m_flatBufferBuilder.CreateVector(outputSlots));
1145}
1146
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001147void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001148{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001149 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001150 m_serializedLayers.push_back(anyLayer);
1151}
1152
Mike Kellya0766c32019-02-19 17:22:07 +00001153template <typename T>
1154flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1155{
1156 const T* buffer = reinterpret_cast<const T*>(memory);
1157 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1158 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1159 return fbVector;
1160}
1161
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001162flatbuffers::Offset<serializer::ConstTensor>
1163 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001164{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001165 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001166
1167 // Get the dimensions
1168 std::vector<unsigned int> shape;
1169
1170 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1171 {
1172 shape.push_back(tensorInfo.GetShape()[dim]);
1173 }
1174
1175 // Create FlatBuffer TensorInfo
1176 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1177 m_flatBufferBuilder.CreateVector(shape),
1178 GetFlatBufferDataType(tensorInfo.GetDataType()),
1179 tensorInfo.GetQuantizationScale(),
1180 tensorInfo.GetQuantizationOffset());
1181 flatbuffers::Offset<void> fbPayload;
1182
1183 switch (tensorInfo.GetDataType())
1184 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001185 case armnn::DataType::Float32:
1186 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001187 {
1188 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1189 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1190 m_flatBufferBuilder,
1191 fbVector);
1192 fbPayload = flatBuffersData.o;
1193 break;
1194 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001195 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001196 {
1197 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1198 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1199 m_flatBufferBuilder,
1200 fbVector);
1201 fbPayload = flatBuffersData.o;
1202 break;
1203 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001204 case armnn::DataType::QuantisedSymm16:
1205 {
1206 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1207 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1208 m_flatBufferBuilder,
1209 fbVector);
1210 fbPayload = flatBuffersData.o;
1211 break;
1212 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001213 case armnn::DataType::QuantisedAsymm8:
1214 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001215 default:
1216 {
1217 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1218 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1219 m_flatBufferBuilder,
1220 fbVector);
1221 fbPayload = flatBuffersData.o;
1222 }
1223 }
1224 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1225 m_flatBufferBuilder,
1226 flatBufferTensorInfo,
1227 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1228 fbPayload);
1229 return flatBufferConstTensor;
1230}
1231
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001232std::vector<fb::Offset<serializer::InputSlot>>
1233 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001234{
Mike Kellya0766c32019-02-19 17:22:07 +00001235 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001236
1237 // Get the InputSlots
1238 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1239 {
1240 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1241
1242 // Get the Connection for the InputSlot
1243 const IOutputSlot* connection = inputSlot.GetConnection();
1244
1245 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001246 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1247 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001248 // Create FlatBuffer InputSlot
1249 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1250 }
1251 return inputSlots;
1252}
1253
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001254std::vector<fb::Offset<serializer::OutputSlot>>
1255 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001256{
1257 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1258
1259 // Get the OutputSlots
1260 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1261 {
1262 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001263 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001264
1265 // Get the dimensions
1266 std::vector<unsigned int> shape;
1267 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1268 {
1269 shape.push_back(tensorInfo.GetShape()[dim]);
1270 }
1271
1272 // Create FlatBuffer TensorInfo
1273 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1274 m_flatBufferBuilder.CreateVector(shape),
1275 GetFlatBufferDataType(tensorInfo.GetDataType()),
1276 tensorInfo.GetQuantizationScale(),
1277 tensorInfo.GetQuantizationOffset());
1278
1279 // Create FlatBuffer Outputslot
1280 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1281 slotIndex,
1282 flatBufferTensorInfo));
1283 }
1284 return outputSlots;
1285}
1286
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001287
1288ISerializer* ISerializer::CreateRaw()
1289{
1290 return new Serializer();
1291}
1292
1293ISerializerPtr ISerializer::Create()
1294{
1295 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1296}
1297
1298void ISerializer::Destroy(ISerializer* serializer)
1299{
1300 delete serializer;
1301}
1302
1303void Serializer::Serialize(const INetwork& inNetwork)
1304{
1305 // Iterate through to network
1306 inNetwork.Accept(m_SerializerVisitor);
1307 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1308
1309 // Create FlatBuffer SerializedGraph
1310 auto serializedGraph = serializer::CreateSerializedGraph(
1311 fbBuilder,
1312 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1313 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1314 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1315
1316 // Serialize the graph
1317 fbBuilder.Finish(serializedGraph);
1318}
1319
1320bool Serializer::SaveSerializedToStream(std::ostream& stream)
1321{
1322 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1323
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001324 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1325 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001326 return !stream.bad();
1327}
1328
Matteo Martincighec333912019-02-13 15:12:39 +00001329} // namespace armnnSerializer