blob: 5949d1d9fa55fa83c7b856f988b95fa6b90955ff [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "Serializer.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
8#include "SerializerUtils.hpp"
9
Mike Kelly8c1701a2019-02-11 17:01:27 +000010#include <armnn/ArmNN.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000011
Mike Kelly8c1701a2019-02-11 17:01:27 +000012#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010014#include <boost/numeric/conversion/cast.hpp>
15
Mike Kelly8c1701a2019-02-11 17:01:27 +000016#include <flatbuffers/util.h>
17
18using namespace armnn;
19namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000020namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000021
22namespace armnnSerializer
23{
24
Mike Kellyaf484012019-02-20 16:53:11 +000025serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
26{
27 switch (function)
28 {
29 case armnn::ActivationFunction::Sigmoid:
30 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
31 case armnn::ActivationFunction::TanH:
32 return serializer::ActivationFunction::ActivationFunction_TanH;
33 case armnn::ActivationFunction::Linear:
34 return serializer::ActivationFunction::ActivationFunction_Linear;
35 case armnn::ActivationFunction::ReLu:
36 return serializer::ActivationFunction::ActivationFunction_ReLu;
37 case armnn::ActivationFunction::BoundedReLu:
38 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
39 case armnn::ActivationFunction::LeakyReLu:
40 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
41 case armnn::ActivationFunction::Abs:
42 return serializer::ActivationFunction::ActivationFunction_Abs;
43 case armnn::ActivationFunction::Sqrt:
44 return serializer::ActivationFunction::ActivationFunction_Sqrt;
45 case armnn::ActivationFunction::Square:
46 return serializer::ActivationFunction::ActivationFunction_Square;
47 default:
48 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
49 }
50}
51
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010052serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
53{
54 switch (function)
55 {
56 case armnn::ArgMinMaxFunction::Max:
57 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
58 case armnn::ArgMinMaxFunction::Min:
59 default:
60 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
61 }
62}
63
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000064uint32_t SerializerVisitor::GetSerializedId(unsigned int guid)
65{
66 std::pair<unsigned int, uint32_t> guidPair(guid, m_layerId);
67
68 if (m_guidMap.empty())
69 {
70 m_guidMap.insert(guidPair);
71 }
72 else if (m_guidMap.find(guid) == m_guidMap.end())
73 {
74 guidPair.second = ++m_layerId;
75 m_guidMap.insert(guidPair);
76 return m_layerId;
77 }
Saoirse Stewart30211042019-02-18 17:19:16 +000078 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000079}
80
Mike Kelly8c1701a2019-02-11 17:01:27 +000081// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000082void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000083{
84 // Create FlatBuffer BaseLayer
85 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
86
87 // Create FlatBuffer BindableBaseLayer
88 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
89 flatBufferInputBaseLayer,
90 id);
Mike Kelly8c1701a2019-02-11 17:01:27 +000091 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000092 m_inputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +000093
94 // Create the FlatBuffer InputLayer
95 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
96
97 // Add the AnyLayer to the FlatBufferLayers
98 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
99}
100
101// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000102void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000103{
104 // Create FlatBuffer BaseLayer
105 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
106
107 // Create FlatBuffer BindableBaseLayer
108 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
109 flatBufferOutputBaseLayer,
110 id);
111 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000112 m_outputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000113
114 // Create the FlatBuffer OutputLayer
115 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
116 // Add the AnyLayer to the FlatBufferLayers
117 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
118}
119
Kevin May868eb142019-09-04 17:29:31 +0100120void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
121{
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100122 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
123 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
124
125 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100126}
127
Mike Kellyaf484012019-02-20 16:53:11 +0000128// Build FlatBuffer for Activation Layer
129void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
130 const armnn::ActivationDescriptor& descriptor,
131 const char* name)
132{
133 // Create FlatBuffer BaseLayer
134 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
135
136 // Create the FlatBuffer ActivationDescriptor
137 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
138 GetFlatBufferActivationFunction(descriptor.m_Function),
139 descriptor.m_A,
140 descriptor.m_B);
141
142 // Create the FlatBuffer ActivationLayer
143 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
144 flatBufferBaseLayer,
145 flatBufferDescriptor);
146
147 // Add the AnyLayer to the FlatBufferLayers
148 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
149}
150
Mike Kelly8c1701a2019-02-11 17:01:27 +0000151// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000152void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000153{
154 // Create FlatBuffer BaseLayer
155 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
156
157 // Create the FlatBuffer AdditionLayer
158 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
159
160 // Add the AnyLayer to the FlatBufferLayers
161 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
162}
163
Nikhil Rajee391d52019-09-05 17:50:44 +0100164// Build FlatBuffer for ArgMinMax Layer
165void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
166 const armnn::ArgMinMaxDescriptor& descriptor,
167 const char *name)
168{
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100169 // Create FlatBuffer BaseLayer
170 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
171
172 // Create FlatBuffer Descriptor
173 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
174 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
175 descriptor.m_Axis);
176
177 // Create FlatBuffer ArgMinMaxLayer
178 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
179 flatBufferBaseLayer,
180 flatBufferDescriptor);
181
182 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100183}
184
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000185// Build FlatBuffer for BatchToSpaceNd Layer
186void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
187 const armnn::BatchToSpaceNdDescriptor& descriptor,
188 const char* name)
189{
190 // Create FlatBuffer BaseLayer
191 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
192
193 std::vector<unsigned int> crops;
194 crops.reserve(descriptor.m_Crops.size() * 2);
195 for (auto& crop : descriptor.m_Crops)
196 {
197 crops.push_back(crop.first);
198 crops.push_back(crop.second);
199 }
200
201 auto flatBufferDescriptor =
202 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
203 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
204 m_flatBufferBuilder.CreateVector(crops),
205 GetFlatBufferDataLayout(descriptor.m_DataLayout));
206
207 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
208 flatBufferBaseLayer,
209 flatBufferDescriptor);
210
211 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
212}
213
ruoyan018e7fa232019-02-28 15:09:07 +0000214void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
215 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
216 const armnn::ConstTensor& mean,
217 const armnn::ConstTensor& variance,
218 const armnn::ConstTensor& beta,
219 const armnn::ConstTensor& gamma,
220 const char* name)
221{
222 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
223 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
224 m_flatBufferBuilder,
225 batchNormDescriptor.m_Eps,
226 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
227
228 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
229 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
230 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
231 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
232 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
233 fbBatchNormalizationBaseLayer,
234 fbBatchNormalizationDescriptor,
235 fbMeanConstTensorInfo,
236 fbVarianceConstTensorInfo,
237 fbBetaConstTensorInfo,
238 fbGammaConstTensorInfo);
239
240 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
241}
242
Conor Kennedy76277882019-02-26 08:29:54 +0000243// Build FlatBuffer for Constant Layer
244void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
245 const armnn::ConstTensor& input,
246 const char* name)
247{
248 // Create FlatBuffer BaseLayer
249 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
250
251 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
252
253 // Create the FlatBuffer ConstantLayer
254 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
255 flatBufferConstantBaseLayer,
256 flatBufferConstTensorInfo);
257
258 // Add the AnyLayer to the FlatBufferLayers
259 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
260}
261
Mike Kellya0766c32019-02-19 17:22:07 +0000262// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000263void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
264 const armnn::Convolution2dDescriptor& descriptor,
265 const armnn::ConstTensor& weights,
266 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000267 const char* name)
268{
269 // Create FlatBuffer BaseLayer
270 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
271
272 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
273 descriptor.m_PadLeft,
274 descriptor.m_PadRight,
275 descriptor.m_PadTop,
276 descriptor.m_PadBottom,
277 descriptor.m_StrideX,
278 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100279 descriptor.m_DilationX,
280 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000281 descriptor.m_BiasEnabled,
282 GetFlatBufferDataLayout(descriptor.m_DataLayout));
283 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
284 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
285
286 if (biases.has_value())
287 {
288 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
289 }
290
291 // Create the FlatBuffer Convolution2dLayer
292 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
293 flatBufferBaseLayer,
294 flatBufferDescriptor,
295 flatBufferWeightsConstTensorInfo,
296 flatBufferBiasesConstTensorInfo);
297
298 // Add the AnyLayer to the FlatBufferLayers
299 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
300}
301
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100302void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
303 const armnn::DepthToSpaceDescriptor& descriptor,
304 const char* name)
305{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100306 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
307 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
308 descriptor.m_BlockSize,
309 GetFlatBufferDataLayout(descriptor.m_DataLayout));
310
311 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
312
313 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100314}
315
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000316void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
317 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
318 const armnn::ConstTensor& weights,
319 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000320 const char* name)
321{
322 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
323 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
324 descriptor.m_PadLeft,
325 descriptor.m_PadRight,
326 descriptor.m_PadTop,
327 descriptor.m_PadBottom,
328 descriptor.m_StrideX,
329 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100330 descriptor.m_DilationX,
331 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000332 descriptor.m_BiasEnabled,
333 GetFlatBufferDataLayout(descriptor.m_DataLayout));
334
335 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
336 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
337 if (biases.has_value())
338 {
339 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
340 }
341
342 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
343 fbBaseLayer,
344 fbDescriptor,
345 fbWeightsConstTensorInfo,
346 fbBiasesConstTensorInfo);
347
348 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
349}
350
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000351void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
352 const char* name)
353{
354 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
355 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
356
357 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
358}
359
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000360void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
361 const armnn::DetectionPostProcessDescriptor& descriptor,
362 const armnn::ConstTensor& anchors,
363 const char* name)
364{
365 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
366 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
367 descriptor.m_MaxDetections,
368 descriptor.m_MaxClassesPerDetection,
369 descriptor.m_DetectionsPerClass,
370 descriptor.m_NmsScoreThreshold,
371 descriptor.m_NmsIouThreshold,
372 descriptor.m_NumClasses,
373 descriptor.m_UseRegularNms,
374 descriptor.m_ScaleX,
375 descriptor.m_ScaleY,
376 descriptor.m_ScaleW,
377 descriptor.m_ScaleH);
378
379 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
380
381 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
382 fbBaseLayer,
383 fbDescriptor,
384 fbAnchorsConstTensorInfo);
385
386 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
387}
388
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000389void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
390{
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000391 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
392 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000393
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000394 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
395}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000396
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000397void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
398{
399 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
400 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
401
402 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
403}
404
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000405void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
406{
407 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
408 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
409
410 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
411}
412
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000413void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
414{
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000415 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
416 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000417
418 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
419}
420
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000421void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
422{
423 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000424 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000425
426 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
427}
428
Kevin Mayce5045a2019-10-02 14:07:47 +0100429void SerializerVisitor::VisitInstanceNormalizationLayer(
430 const armnn::IConnectableLayer* layer,
431 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
432 const char* name)
433{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100434 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
435 m_flatBufferBuilder,
436 instanceNormalizationDescriptor.m_Gamma,
437 instanceNormalizationDescriptor.m_Beta,
438 instanceNormalizationDescriptor.m_Eps,
439 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
440
441 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
442 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
443
444 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100445}
446
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000447void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
448 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
449 const char* name)
450{
451 // Create FlatBuffer BaseLayer
452 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
453
454 // Create the FlatBuffer L2Normalization Descriptor
455 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100456 m_flatBufferBuilder,
457 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
458 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000459
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100460 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000461 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
462
463 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
464}
465
Jim Flynn11af3752019-03-19 17:22:29 +0000466void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer, const armnn::LstmDescriptor& descriptor,
467 const armnn::LstmInputParams& params, const char* name)
468{
469 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
470
471 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
472 m_flatBufferBuilder,
473 descriptor.m_ActivationFunc,
474 descriptor.m_ClippingThresCell,
475 descriptor.m_ClippingThresProj,
476 descriptor.m_CifgEnabled,
477 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100478 descriptor.m_ProjectionEnabled,
479 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000480
481 // Get mandatory input parameters
482 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
483 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
484 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
485 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
486 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
487 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
488 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
489 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
490 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
491
492 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
493 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
494 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
495 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
496 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
497 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
498 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
499 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
500 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100501 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
502 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
503 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
504 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000505
506 if (!descriptor.m_CifgEnabled)
507 {
508 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
509 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
510 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
511 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
512 }
513
514 if (descriptor.m_ProjectionEnabled)
515 {
516 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
517 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
518 }
519
520 if (descriptor.m_PeepholeEnabled)
521 {
522 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
523 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
524 }
525
Jan Eilersf8c62972019-07-17 11:07:49 +0100526 if (descriptor.m_LayerNormEnabled)
527 {
528 if (!descriptor.m_CifgEnabled)
529 {
530 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
531 }
532 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
533 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
534 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
535 }
536
Jim Flynn11af3752019-03-19 17:22:29 +0000537 auto fbLstmParams = serializer::CreateLstmInputParams(
538 m_flatBufferBuilder,
539 inputToForgetWeights,
540 inputToCellWeights,
541 inputToOutputWeights,
542 recurrentToForgetWeights,
543 recurrentToCellWeights,
544 recurrentToOutputWeights,
545 forgetGateBias,
546 cellBias,
547 outputGateBias,
548 inputToInputWeights,
549 recurrentToInputWeights,
550 cellToInputWeights,
551 inputGateBias,
552 projectionWeights,
553 projectionBias,
554 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100555 cellToOutputWeights,
556 inputLayerNormWeights,
557 forgetLayerNormWeights,
558 cellLayerNormWeights,
559 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000560
561 auto fbLstmLayer = serializer::CreateLstmLayer(
562 m_flatBufferBuilder,
563 fbLstmBaseLayer,
564 fbLstmDescriptor,
565 fbLstmParams);
566
567 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
568}
569
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000570void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
571{
572 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
573 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
574
575 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
576}
577
578void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
579 const armnn::MeanDescriptor& descriptor,
580 const char* name)
581{
582 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
583 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
584 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
585 descriptor.m_KeepDims);
586
587 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
588 fbMeanBaseLayer,
589 fbMeanDescriptor);
590
591 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
592}
593
594void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
595{
596 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
597 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
598
599 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
600}
601
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100602void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
603{
604 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
605 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
606
607 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
608}
609
Jim Flynnac25a1b2019-02-28 10:40:49 +0000610void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100611 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000612 const char* name)
613{
Jim Flynne242f2d2019-05-22 14:24:13 +0100614 VisitConcatLayer(layer, mergerDescriptor, name);
615}
616
617void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
618 const armnn::ConcatDescriptor& concatDescriptor,
619 const char* name)
620{
621 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000622
623 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100624 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000625 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100626 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000627 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100628 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000629 {
630 origins.push_back(origin[d]);
631 }
632 auto view = m_flatBufferBuilder.CreateVector(origins);
633 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
634 views.push_back(uintVector);
635 }
636
Jim Flynne242f2d2019-05-22 14:24:13 +0100637 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
638 concatDescriptor.GetConcatAxis(),
639 concatDescriptor.GetNumViews(),
640 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000641 m_flatBufferBuilder.CreateVector(views));
642
Jim Flynne242f2d2019-05-22 14:24:13 +0100643 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
644 flatBufferConcatBaseLayer,
645 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000646
Jim Flynne242f2d2019-05-22 14:24:13 +0100647 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000648}
649
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000650void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000651{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000652 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
653 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
654 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000655
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000656 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000657}
658
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000659void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
660 const armnn::PadDescriptor& padDescriptor,
661 const char* name)
662{
663 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
664
665 std::vector<unsigned int> padList;
666 for (auto& p: padDescriptor.m_PadList)
667 {
668 padList.push_back(p.first);
669 padList.push_back(p.second);
670 }
671
672 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100673 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100674 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000675
676 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
677 flatBufferBaseLayer,
678 flatBufferPadDesc);
679
680 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
681}
682
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000683void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
684 const armnn::PermuteDescriptor& permuteDescriptor,
685 const char* name)
686{
687 // Create FlatBuffer BaseLayer
688 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
689
690 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100691 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000692 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100693 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000694 }
695
696 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
697 m_flatBufferBuilder.CreateVector(dimMappings));
698
699 // Create the FlatBuffer PermuteLayer
700 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
701 flatBufferPermuteBaseLayer,
702 flatBufferPermuteDesc);
703
704 // Add the AnyLayer to the FlatBufferLayers
705 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
706}
707
Saoirse Stewart263829c2019-02-19 15:54:14 +0000708// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000709void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000710 const armnn::ReshapeDescriptor& reshapeDescriptor,
711 const char* name)
712{
713 // Create FlatBuffer BaseLayer
714 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
715
716 std::vector<unsigned int> targetShape;
717 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
718 {
719 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
720 }
721
722 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
723 m_flatBufferBuilder.CreateVector(targetShape));
724
725 // Create the FlatBuffer ReshapeLayer
726 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
727 flatBufferReshapeDesc);
728
729 // Add the AnyLayer to the FlatBufferLayers
730 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
731}
732
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000733void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
734 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
735 const char* name)
736{
737 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
738
739 auto flatBufferDescriptor =
740 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
741 resizeDescriptor.m_TargetWidth,
742 resizeDescriptor.m_TargetHeight,
743 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
744
745 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
746 flatBufferBaseLayer,
747 flatBufferDescriptor);
748
749 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
750}
751
Teresa Charlina9075df2019-06-27 15:41:57 +0100752void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
753 const armnn::ResizeDescriptor& resizeDescriptor,
754 const char* name)
755{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100756 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
757
758 auto flatBufferDescriptor =
759 CreateResizeDescriptor(m_flatBufferBuilder,
760 resizeDescriptor.m_TargetHeight,
761 resizeDescriptor.m_TargetWidth,
762 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
763 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
764
765 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
766 flatBufferBaseLayer,
767 flatBufferDescriptor);
768
769 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100770}
771
Sadik Armagan8b42a382019-03-01 14:24:49 +0000772void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
773{
774 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
775 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
776
777 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
778}
779
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100780void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
781 const armnn::SliceDescriptor& sliceDescriptor,
782 const char* name)
783{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100784 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
785 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
786 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
787 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
788
789 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
790
791 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100792}
793
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000794// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000795void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
796 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000797 const char* name)
798{
799 // Create FlatBuffer BaseLayer
800 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
801
802 // Create the FlatBuffer SoftmaxDescriptor
803 auto flatBufferSoftmaxDesc =
804 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
805
806 // Create the FlatBuffer SoftmaxLayer
807 auto flatBufferSoftmaxLayer =
808 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
809 flatBufferSoftmaxBaseLayer,
810 flatBufferSoftmaxDesc);
811
812 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
813}
814
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000815void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
816 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000817 const char* name)
818{
819 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
820 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
821 m_flatBufferBuilder,
822 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
823 pooling2dDescriptor.m_PadLeft,
824 pooling2dDescriptor.m_PadRight,
825 pooling2dDescriptor.m_PadTop,
826 pooling2dDescriptor.m_PadBottom,
827 pooling2dDescriptor.m_PoolWidth,
828 pooling2dDescriptor.m_PoolHeight,
829 pooling2dDescriptor.m_StrideX,
830 pooling2dDescriptor.m_StrideY,
831 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
832 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
833 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
834
835 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
836 fbPooling2dBaseLayer,
837 fbPooling2dDescriptor);
838
839 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
840}
841
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100842void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
843 const char* name)
844{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100845 // Create FlatBuffer BaseLayer
846 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
847
848 // Create the FlatBuffer AdditionLayer
849 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
850
851 // Add the AnyLayer to the FlatBufferLayers
852 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100853}
854
Derek Lamberti87acb272019-03-27 16:51:31 +0000855void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
856{
857 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
858 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
859 fbQuantizeBaseLayer);
860 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
861}
862
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000863// Build FlatBuffer for FullyConnected Layer
864void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
865 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
866 const armnn::ConstTensor& weights,
867 const armnn::Optional<armnn::ConstTensor>& biases,
868 const char* name)
869{
870 // Create FlatBuffer BaseLayer
871 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
872
873 // Create FlatBuffer FullyConnectedDescriptor
874 auto flatBufferDescriptor =
875 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
876 fullyConnectedDescriptor.m_BiasEnabled,
877 fullyConnectedDescriptor.m_TransposeWeightMatrix);
878
879 // Create FlatBuffer weights data
880 auto flatBufferWeights = CreateConstTensorInfo(weights);
881
882 // Create FlatBuffer bias data
883 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
884 if (fullyConnectedDescriptor.m_BiasEnabled)
885 {
886 flatBufferBiases = CreateConstTensorInfo(biases.value());
887 }
888
889 // Create FlatBuffer FullyConnectedLayer
890 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
891 flatBufferBaseLayer,
892 flatBufferDescriptor,
893 flatBufferWeights,
894 flatBufferBiases);
895
896 // Add created FullyConnectedLayer to the FlatBufferLayers
897 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
898}
899
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000900// Build FlatBuffer for SpaceToBatchNd Layer
901void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
902 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
903 const char* name)
904{
905 // Create FlatBuffer BaseLayer
906 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
907
908 std::vector<unsigned int> padList;
909 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
910 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
911 {
912 padList.push_back(pad.first);
913 padList.push_back(pad.second);
914 }
915
916 auto flatBufferDescriptor =
917 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
918 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
919 m_flatBufferBuilder.CreateVector(padList),
920 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
921
922 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
923 flatBufferBaseLayer,
924 flatBufferDescriptor);
925
926 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
927}
928
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100929// Build FlatBuffer for SpaceToDepthLayer
930void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
931 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
932 const char* name)
933{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100934 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
935 auto flatBufferDescriptor =
936 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
937 spaceToDepthDescriptor.m_BlockSize,
938 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
939
940 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
941 flatBufferBaseLayer,
942 flatBufferDescriptor);
943
944 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100945}
946
Jim Flynn18ce3382019-03-08 11:08:30 +0000947// Build FlatBuffer for Splitter Layer
948void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
949 const armnn::ViewsDescriptor& viewsDescriptor,
950 const char* name)
951{
952 // Create FlatBuffer ViewOrigins
953 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
954 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
955
956 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
957 {
958 std::vector<uint32_t> viewOrigin;
959 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
960
961 // Copy vector
962 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
963 {
964 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
965 }
966
967 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
968 m_flatBufferBuilder.CreateVector(viewOrigin)));
969 }
970
971 // Create FlatBuffer OriginsDescriptor
972 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
973 viewsDescriptor.GetOrigins().GetConcatAxis(),
974 viewsDescriptor.GetOrigins().GetNumViews(),
975 viewsDescriptor.GetOrigins().GetNumDimensions(),
976 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
977
978 // Create FlatBuffer ViewOrigins
979 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
980 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
981
982 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
983 {
984 std::vector<uint32_t> viewSize;
985 viewSize.reserve(viewsDescriptor.GetNumDimensions());
986
987 // Copy vector
988 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
989 {
990 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
991 }
992
993 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
994 m_flatBufferBuilder.CreateVector(viewSize)));
995 }
996
997 // Create FlatBuffer ViewsDescriptor
998 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
999 flatBufferOriginDescriptor,
1000 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1001
1002 // Create FlatBuffer BaseLayer
1003 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1004
1005 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1006 flatBufferBaseLayer,
1007 flatBufferViewsDescriptor);
1008
1009 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1010}
1011
Nina Drozd57728782019-02-27 10:53:27 +00001012void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1013 const armnn::NormalizationDescriptor& descriptor,
1014 const char* name)
1015{
1016 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1017
1018 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1019 m_flatBufferBuilder,
1020 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1021 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1022 descriptor.m_NormSize,
1023 descriptor.m_Alpha,
1024 descriptor.m_Beta,
1025 descriptor.m_K,
1026 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1027
1028 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1029 fbNormalizationBaseLayer,
1030 fbNormalizationDescriptor);
1031
1032 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1033}
1034
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001035void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1036 const armnn::StackDescriptor& stackDescriptor,
1037 const char* name)
1038{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001039 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1040
1041 std::vector<unsigned int> inputShape;
1042 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1043 {
1044 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1045 }
1046
1047 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1048 stackDescriptor.m_Axis,
1049 stackDescriptor.m_NumInputs,
1050 m_flatBufferBuilder.CreateVector(inputShape));
1051
1052 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1053 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001054}
1055
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001056void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1057 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1058 const char* name)
1059{
1060 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1061
1062 auto flatBufferDescriptor =
1063 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1064 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1065 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1066 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1067 stridedSliceDescriptor.m_BeginMask,
1068 stridedSliceDescriptor.m_EndMask,
1069 stridedSliceDescriptor.m_ShrinkAxisMask,
1070 stridedSliceDescriptor.m_EllipsisMask,
1071 stridedSliceDescriptor.m_NewAxisMask,
1072 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1073
1074 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1075 flatBufferBaseLayer,
1076 flatBufferDescriptor);
1077
1078 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1079}
1080
Conor Kennedyda1f9752019-03-01 14:37:12 +00001081void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1082{
1083 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1084 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1085
1086 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1087}
1088
Sadik Armaganeff363d2019-04-05 15:25:46 +01001089void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1090{
1091 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1092 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1093
1094 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1095}
1096
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001097void SerializerVisitor::VisitTransposeConvolution2dLayer(
1098 const armnn::IConnectableLayer* layer,
1099 const armnn::TransposeConvolution2dDescriptor& descriptor,
1100 const armnn::ConstTensor& weights,
1101 const armnn::Optional<armnn::ConstTensor>& biases,
1102 const char* name)
1103{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001104 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1105 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1106 descriptor.m_PadLeft,
1107 descriptor.m_PadRight,
1108 descriptor.m_PadTop,
1109 descriptor.m_PadBottom,
1110 descriptor.m_StrideX,
1111 descriptor.m_StrideY,
1112 descriptor.m_BiasEnabled,
1113 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1114
1115 // weights & biases
1116 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1117 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1118 if (biases.has_value())
1119 {
1120 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1121 }
1122
1123 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1124 fbBaseLayer,
1125 fbDescriptor,
1126 fbWeightsConstTensorInfo,
1127 fbBiasesConstTensorInfo);
1128
1129 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001130}
1131
James Conroyee18dc82019-07-17 11:27:46 +01001132void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1133 const armnn::QuantizedLstmInputParams& params,
1134 const char* name)
1135{
Jan Eilers5b01a892019-07-23 09:47:43 +01001136 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1137
1138 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001139 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1140 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1141 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1142 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001143
Francis Murtaghbb590b42019-08-14 09:51:36 +01001144 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1145 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1146 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1147 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001148
Francis Murtaghbb590b42019-08-14 09:51:36 +01001149 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1150 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1151 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1152 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001153
1154 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1155 m_flatBufferBuilder,
1156 inputToInputWeights,
1157 inputToForgetWeights,
1158 inputToCellWeights,
1159 inputToOutputWeights,
1160 recurrentToInputWeights,
1161 recurrentToForgetWeights,
1162 recurrentToCellWeights,
1163 recurrentToOutputWeights,
1164 inputGateBias,
1165 forgetGateBias,
1166 cellBias,
1167 outputGateBias);
1168
1169 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1170 m_flatBufferBuilder,
1171 fbQuantizedLstmBaseLayer,
1172 fbQuantizedLstmParams);
1173
1174 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001175}
1176
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001177fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001178 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001179{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001180 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1181
Mike Kelly8c1701a2019-02-11 17:01:27 +00001182 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1183 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1184
1185 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001186 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001187 m_flatBufferBuilder.CreateString(layer->GetName()),
1188 layerType,
1189 m_flatBufferBuilder.CreateVector(inputSlots),
1190 m_flatBufferBuilder.CreateVector(outputSlots));
1191}
1192
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001193void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001194{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001195 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001196 m_serializedLayers.push_back(anyLayer);
1197}
1198
Mike Kellya0766c32019-02-19 17:22:07 +00001199template <typename T>
1200flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1201{
1202 const T* buffer = reinterpret_cast<const T*>(memory);
1203 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1204 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1205 return fbVector;
1206}
1207
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001208flatbuffers::Offset<serializer::ConstTensor>
1209 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001210{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001211 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001212
1213 // Get the dimensions
1214 std::vector<unsigned int> shape;
1215
1216 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1217 {
1218 shape.push_back(tensorInfo.GetShape()[dim]);
1219 }
1220
1221 // Create FlatBuffer TensorInfo
1222 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1223 m_flatBufferBuilder.CreateVector(shape),
1224 GetFlatBufferDataType(tensorInfo.GetDataType()),
1225 tensorInfo.GetQuantizationScale(),
1226 tensorInfo.GetQuantizationOffset());
1227 flatbuffers::Offset<void> fbPayload;
1228
1229 switch (tensorInfo.GetDataType())
1230 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001231 case armnn::DataType::Float32:
1232 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001233 {
1234 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1235 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1236 m_flatBufferBuilder,
1237 fbVector);
1238 fbPayload = flatBuffersData.o;
1239 break;
1240 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001241 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001242 {
1243 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1244 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1245 m_flatBufferBuilder,
1246 fbVector);
1247 fbPayload = flatBuffersData.o;
1248 break;
1249 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001250 case armnn::DataType::QuantisedSymm16:
1251 {
1252 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1253 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1254 m_flatBufferBuilder,
1255 fbVector);
1256 fbPayload = flatBuffersData.o;
1257 break;
1258 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001259 case armnn::DataType::QuantisedAsymm8:
1260 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001261 default:
1262 {
1263 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1264 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1265 m_flatBufferBuilder,
1266 fbVector);
1267 fbPayload = flatBuffersData.o;
1268 }
1269 }
1270 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1271 m_flatBufferBuilder,
1272 flatBufferTensorInfo,
1273 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1274 fbPayload);
1275 return flatBufferConstTensor;
1276}
1277
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001278std::vector<fb::Offset<serializer::InputSlot>>
1279 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001280{
Mike Kellya0766c32019-02-19 17:22:07 +00001281 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001282
1283 // Get the InputSlots
1284 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1285 {
1286 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1287
1288 // Get the Connection for the InputSlot
1289 const IOutputSlot* connection = inputSlot.GetConnection();
1290
1291 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001292 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1293 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001294 // Create FlatBuffer InputSlot
1295 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1296 }
1297 return inputSlots;
1298}
1299
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001300std::vector<fb::Offset<serializer::OutputSlot>>
1301 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001302{
1303 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1304
1305 // Get the OutputSlots
1306 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1307 {
1308 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001309 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001310
1311 // Get the dimensions
1312 std::vector<unsigned int> shape;
1313 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1314 {
1315 shape.push_back(tensorInfo.GetShape()[dim]);
1316 }
1317
1318 // Create FlatBuffer TensorInfo
1319 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1320 m_flatBufferBuilder.CreateVector(shape),
1321 GetFlatBufferDataType(tensorInfo.GetDataType()),
1322 tensorInfo.GetQuantizationScale(),
1323 tensorInfo.GetQuantizationOffset());
1324
1325 // Create FlatBuffer Outputslot
1326 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1327 slotIndex,
1328 flatBufferTensorInfo));
1329 }
1330 return outputSlots;
1331}
1332
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001333
1334ISerializer* ISerializer::CreateRaw()
1335{
1336 return new Serializer();
1337}
1338
1339ISerializerPtr ISerializer::Create()
1340{
1341 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1342}
1343
1344void ISerializer::Destroy(ISerializer* serializer)
1345{
1346 delete serializer;
1347}
1348
1349void Serializer::Serialize(const INetwork& inNetwork)
1350{
1351 // Iterate through to network
1352 inNetwork.Accept(m_SerializerVisitor);
1353 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1354
1355 // Create FlatBuffer SerializedGraph
1356 auto serializedGraph = serializer::CreateSerializedGraph(
1357 fbBuilder,
1358 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1359 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1360 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1361
1362 // Serialize the graph
1363 fbBuilder.Finish(serializedGraph);
1364}
1365
1366bool Serializer::SaveSerializedToStream(std::ostream& stream)
1367{
1368 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1369
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001370 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1371 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001372 return !stream.bad();
1373}
1374
Matteo Martincighec333912019-02-13 15:12:39 +00001375} // namespace armnnSerializer