blob: 84a1b6b18ef37bdb60213f11b9bb63dbd3bd4a5b [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{
434 throw UnimplementedException("SerializerVisitor::InstanceNormalizationLayer is not implemented");
435}
436
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000437void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
438 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
439 const char* name)
440{
441 // Create FlatBuffer BaseLayer
442 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
443
444 // Create the FlatBuffer L2Normalization Descriptor
445 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100446 m_flatBufferBuilder,
447 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
448 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000449
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100450 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000451 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
452
453 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
454}
455
Jim Flynn11af3752019-03-19 17:22:29 +0000456void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer, const armnn::LstmDescriptor& descriptor,
457 const armnn::LstmInputParams& params, const char* name)
458{
459 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
460
461 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
462 m_flatBufferBuilder,
463 descriptor.m_ActivationFunc,
464 descriptor.m_ClippingThresCell,
465 descriptor.m_ClippingThresProj,
466 descriptor.m_CifgEnabled,
467 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100468 descriptor.m_ProjectionEnabled,
469 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000470
471 // Get mandatory input parameters
472 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
473 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
474 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
475 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
476 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
477 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
478 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
479 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
480 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
481
482 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
483 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
484 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
485 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
486 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
487 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
488 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
489 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
490 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100491 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
492 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
493 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
494 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000495
496 if (!descriptor.m_CifgEnabled)
497 {
498 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
499 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
500 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
501 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
502 }
503
504 if (descriptor.m_ProjectionEnabled)
505 {
506 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
507 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
508 }
509
510 if (descriptor.m_PeepholeEnabled)
511 {
512 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
513 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
514 }
515
Jan Eilersf8c62972019-07-17 11:07:49 +0100516 if (descriptor.m_LayerNormEnabled)
517 {
518 if (!descriptor.m_CifgEnabled)
519 {
520 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
521 }
522 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
523 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
524 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
525 }
526
Jim Flynn11af3752019-03-19 17:22:29 +0000527 auto fbLstmParams = serializer::CreateLstmInputParams(
528 m_flatBufferBuilder,
529 inputToForgetWeights,
530 inputToCellWeights,
531 inputToOutputWeights,
532 recurrentToForgetWeights,
533 recurrentToCellWeights,
534 recurrentToOutputWeights,
535 forgetGateBias,
536 cellBias,
537 outputGateBias,
538 inputToInputWeights,
539 recurrentToInputWeights,
540 cellToInputWeights,
541 inputGateBias,
542 projectionWeights,
543 projectionBias,
544 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100545 cellToOutputWeights,
546 inputLayerNormWeights,
547 forgetLayerNormWeights,
548 cellLayerNormWeights,
549 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000550
551 auto fbLstmLayer = serializer::CreateLstmLayer(
552 m_flatBufferBuilder,
553 fbLstmBaseLayer,
554 fbLstmDescriptor,
555 fbLstmParams);
556
557 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
558}
559
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000560void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
561{
562 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
563 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
564
565 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
566}
567
568void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
569 const armnn::MeanDescriptor& descriptor,
570 const char* name)
571{
572 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
573 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
574 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
575 descriptor.m_KeepDims);
576
577 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
578 fbMeanBaseLayer,
579 fbMeanDescriptor);
580
581 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
582}
583
584void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
585{
586 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
587 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
588
589 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
590}
591
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100592void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
593{
594 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
595 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
596
597 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
598}
599
Jim Flynnac25a1b2019-02-28 10:40:49 +0000600void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100601 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000602 const char* name)
603{
Jim Flynne242f2d2019-05-22 14:24:13 +0100604 VisitConcatLayer(layer, mergerDescriptor, name);
605}
606
607void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
608 const armnn::ConcatDescriptor& concatDescriptor,
609 const char* name)
610{
611 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000612
613 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100614 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000615 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100616 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000617 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100618 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000619 {
620 origins.push_back(origin[d]);
621 }
622 auto view = m_flatBufferBuilder.CreateVector(origins);
623 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
624 views.push_back(uintVector);
625 }
626
Jim Flynne242f2d2019-05-22 14:24:13 +0100627 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
628 concatDescriptor.GetConcatAxis(),
629 concatDescriptor.GetNumViews(),
630 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000631 m_flatBufferBuilder.CreateVector(views));
632
Jim Flynne242f2d2019-05-22 14:24:13 +0100633 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
634 flatBufferConcatBaseLayer,
635 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000636
Jim Flynne242f2d2019-05-22 14:24:13 +0100637 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000638}
639
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000640void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000641{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000642 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
643 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
644 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000645
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000646 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000647}
648
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000649void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
650 const armnn::PadDescriptor& padDescriptor,
651 const char* name)
652{
653 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
654
655 std::vector<unsigned int> padList;
656 for (auto& p: padDescriptor.m_PadList)
657 {
658 padList.push_back(p.first);
659 padList.push_back(p.second);
660 }
661
662 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100663 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100664 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000665
666 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
667 flatBufferBaseLayer,
668 flatBufferPadDesc);
669
670 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
671}
672
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000673void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
674 const armnn::PermuteDescriptor& permuteDescriptor,
675 const char* name)
676{
677 // Create FlatBuffer BaseLayer
678 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
679
680 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100681 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000682 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100683 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000684 }
685
686 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
687 m_flatBufferBuilder.CreateVector(dimMappings));
688
689 // Create the FlatBuffer PermuteLayer
690 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
691 flatBufferPermuteBaseLayer,
692 flatBufferPermuteDesc);
693
694 // Add the AnyLayer to the FlatBufferLayers
695 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
696}
697
Saoirse Stewart263829c2019-02-19 15:54:14 +0000698// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000699void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000700 const armnn::ReshapeDescriptor& reshapeDescriptor,
701 const char* name)
702{
703 // Create FlatBuffer BaseLayer
704 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
705
706 std::vector<unsigned int> targetShape;
707 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
708 {
709 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
710 }
711
712 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
713 m_flatBufferBuilder.CreateVector(targetShape));
714
715 // Create the FlatBuffer ReshapeLayer
716 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
717 flatBufferReshapeDesc);
718
719 // Add the AnyLayer to the FlatBufferLayers
720 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
721}
722
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000723void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
724 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
725 const char* name)
726{
727 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
728
729 auto flatBufferDescriptor =
730 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
731 resizeDescriptor.m_TargetWidth,
732 resizeDescriptor.m_TargetHeight,
733 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
734
735 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
736 flatBufferBaseLayer,
737 flatBufferDescriptor);
738
739 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
740}
741
Teresa Charlina9075df2019-06-27 15:41:57 +0100742void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
743 const armnn::ResizeDescriptor& resizeDescriptor,
744 const char* name)
745{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100746 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
747
748 auto flatBufferDescriptor =
749 CreateResizeDescriptor(m_flatBufferBuilder,
750 resizeDescriptor.m_TargetHeight,
751 resizeDescriptor.m_TargetWidth,
752 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
753 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
754
755 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
756 flatBufferBaseLayer,
757 flatBufferDescriptor);
758
759 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100760}
761
Sadik Armagan8b42a382019-03-01 14:24:49 +0000762void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
763{
764 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
765 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
766
767 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
768}
769
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100770void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
771 const armnn::SliceDescriptor& sliceDescriptor,
772 const char* name)
773{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100774 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
775 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
776 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
777 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
778
779 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
780
781 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100782}
783
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000784// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000785void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
786 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000787 const char* name)
788{
789 // Create FlatBuffer BaseLayer
790 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
791
792 // Create the FlatBuffer SoftmaxDescriptor
793 auto flatBufferSoftmaxDesc =
794 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
795
796 // Create the FlatBuffer SoftmaxLayer
797 auto flatBufferSoftmaxLayer =
798 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
799 flatBufferSoftmaxBaseLayer,
800 flatBufferSoftmaxDesc);
801
802 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
803}
804
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000805void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
806 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000807 const char* name)
808{
809 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
810 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
811 m_flatBufferBuilder,
812 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
813 pooling2dDescriptor.m_PadLeft,
814 pooling2dDescriptor.m_PadRight,
815 pooling2dDescriptor.m_PadTop,
816 pooling2dDescriptor.m_PadBottom,
817 pooling2dDescriptor.m_PoolWidth,
818 pooling2dDescriptor.m_PoolHeight,
819 pooling2dDescriptor.m_StrideX,
820 pooling2dDescriptor.m_StrideY,
821 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
822 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
823 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
824
825 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
826 fbPooling2dBaseLayer,
827 fbPooling2dDescriptor);
828
829 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
830}
831
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100832void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
833 const char* name)
834{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100835 // Create FlatBuffer BaseLayer
836 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
837
838 // Create the FlatBuffer AdditionLayer
839 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
840
841 // Add the AnyLayer to the FlatBufferLayers
842 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100843}
844
Derek Lamberti87acb272019-03-27 16:51:31 +0000845void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
846{
847 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
848 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
849 fbQuantizeBaseLayer);
850 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
851}
852
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000853// Build FlatBuffer for FullyConnected Layer
854void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
855 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
856 const armnn::ConstTensor& weights,
857 const armnn::Optional<armnn::ConstTensor>& biases,
858 const char* name)
859{
860 // Create FlatBuffer BaseLayer
861 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
862
863 // Create FlatBuffer FullyConnectedDescriptor
864 auto flatBufferDescriptor =
865 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
866 fullyConnectedDescriptor.m_BiasEnabled,
867 fullyConnectedDescriptor.m_TransposeWeightMatrix);
868
869 // Create FlatBuffer weights data
870 auto flatBufferWeights = CreateConstTensorInfo(weights);
871
872 // Create FlatBuffer bias data
873 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
874 if (fullyConnectedDescriptor.m_BiasEnabled)
875 {
876 flatBufferBiases = CreateConstTensorInfo(biases.value());
877 }
878
879 // Create FlatBuffer FullyConnectedLayer
880 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
881 flatBufferBaseLayer,
882 flatBufferDescriptor,
883 flatBufferWeights,
884 flatBufferBiases);
885
886 // Add created FullyConnectedLayer to the FlatBufferLayers
887 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
888}
889
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000890// Build FlatBuffer for SpaceToBatchNd Layer
891void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
892 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
893 const char* name)
894{
895 // Create FlatBuffer BaseLayer
896 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
897
898 std::vector<unsigned int> padList;
899 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
900 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
901 {
902 padList.push_back(pad.first);
903 padList.push_back(pad.second);
904 }
905
906 auto flatBufferDescriptor =
907 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
908 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
909 m_flatBufferBuilder.CreateVector(padList),
910 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
911
912 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
913 flatBufferBaseLayer,
914 flatBufferDescriptor);
915
916 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
917}
918
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100919// Build FlatBuffer for SpaceToDepthLayer
920void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
921 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
922 const char* name)
923{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100924 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
925 auto flatBufferDescriptor =
926 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
927 spaceToDepthDescriptor.m_BlockSize,
928 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
929
930 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
931 flatBufferBaseLayer,
932 flatBufferDescriptor);
933
934 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100935}
936
Jim Flynn18ce3382019-03-08 11:08:30 +0000937// Build FlatBuffer for Splitter Layer
938void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
939 const armnn::ViewsDescriptor& viewsDescriptor,
940 const char* name)
941{
942 // Create FlatBuffer ViewOrigins
943 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
944 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
945
946 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
947 {
948 std::vector<uint32_t> viewOrigin;
949 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
950
951 // Copy vector
952 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
953 {
954 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
955 }
956
957 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
958 m_flatBufferBuilder.CreateVector(viewOrigin)));
959 }
960
961 // Create FlatBuffer OriginsDescriptor
962 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
963 viewsDescriptor.GetOrigins().GetConcatAxis(),
964 viewsDescriptor.GetOrigins().GetNumViews(),
965 viewsDescriptor.GetOrigins().GetNumDimensions(),
966 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
967
968 // Create FlatBuffer ViewOrigins
969 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
970 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
971
972 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
973 {
974 std::vector<uint32_t> viewSize;
975 viewSize.reserve(viewsDescriptor.GetNumDimensions());
976
977 // Copy vector
978 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
979 {
980 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
981 }
982
983 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
984 m_flatBufferBuilder.CreateVector(viewSize)));
985 }
986
987 // Create FlatBuffer ViewsDescriptor
988 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
989 flatBufferOriginDescriptor,
990 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
991
992 // Create FlatBuffer BaseLayer
993 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
994
995 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
996 flatBufferBaseLayer,
997 flatBufferViewsDescriptor);
998
999 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1000}
1001
Nina Drozd57728782019-02-27 10:53:27 +00001002void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1003 const armnn::NormalizationDescriptor& descriptor,
1004 const char* name)
1005{
1006 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1007
1008 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1009 m_flatBufferBuilder,
1010 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1011 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1012 descriptor.m_NormSize,
1013 descriptor.m_Alpha,
1014 descriptor.m_Beta,
1015 descriptor.m_K,
1016 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1017
1018 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1019 fbNormalizationBaseLayer,
1020 fbNormalizationDescriptor);
1021
1022 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1023}
1024
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001025void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1026 const armnn::StackDescriptor& stackDescriptor,
1027 const char* name)
1028{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001029 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1030
1031 std::vector<unsigned int> inputShape;
1032 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1033 {
1034 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1035 }
1036
1037 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1038 stackDescriptor.m_Axis,
1039 stackDescriptor.m_NumInputs,
1040 m_flatBufferBuilder.CreateVector(inputShape));
1041
1042 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1043 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001044}
1045
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001046void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1047 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1048 const char* name)
1049{
1050 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1051
1052 auto flatBufferDescriptor =
1053 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1054 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1055 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1056 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1057 stridedSliceDescriptor.m_BeginMask,
1058 stridedSliceDescriptor.m_EndMask,
1059 stridedSliceDescriptor.m_ShrinkAxisMask,
1060 stridedSliceDescriptor.m_EllipsisMask,
1061 stridedSliceDescriptor.m_NewAxisMask,
1062 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1063
1064 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1065 flatBufferBaseLayer,
1066 flatBufferDescriptor);
1067
1068 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1069}
1070
Conor Kennedyda1f9752019-03-01 14:37:12 +00001071void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1072{
1073 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1074 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1075
1076 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1077}
1078
Sadik Armaganeff363d2019-04-05 15:25:46 +01001079void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1080{
1081 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1082 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1083
1084 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1085}
1086
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001087void SerializerVisitor::VisitTransposeConvolution2dLayer(
1088 const armnn::IConnectableLayer* layer,
1089 const armnn::TransposeConvolution2dDescriptor& descriptor,
1090 const armnn::ConstTensor& weights,
1091 const armnn::Optional<armnn::ConstTensor>& biases,
1092 const char* name)
1093{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001094 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1095 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1096 descriptor.m_PadLeft,
1097 descriptor.m_PadRight,
1098 descriptor.m_PadTop,
1099 descriptor.m_PadBottom,
1100 descriptor.m_StrideX,
1101 descriptor.m_StrideY,
1102 descriptor.m_BiasEnabled,
1103 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1104
1105 // weights & biases
1106 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1107 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1108 if (biases.has_value())
1109 {
1110 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1111 }
1112
1113 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1114 fbBaseLayer,
1115 fbDescriptor,
1116 fbWeightsConstTensorInfo,
1117 fbBiasesConstTensorInfo);
1118
1119 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001120}
1121
James Conroyee18dc82019-07-17 11:27:46 +01001122void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1123 const armnn::QuantizedLstmInputParams& params,
1124 const char* name)
1125{
Jan Eilers5b01a892019-07-23 09:47:43 +01001126 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1127
1128 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001129 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1130 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1131 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1132 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001133
Francis Murtaghbb590b42019-08-14 09:51:36 +01001134 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1135 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1136 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1137 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001138
Francis Murtaghbb590b42019-08-14 09:51:36 +01001139 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1140 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1141 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1142 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001143
1144 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1145 m_flatBufferBuilder,
1146 inputToInputWeights,
1147 inputToForgetWeights,
1148 inputToCellWeights,
1149 inputToOutputWeights,
1150 recurrentToInputWeights,
1151 recurrentToForgetWeights,
1152 recurrentToCellWeights,
1153 recurrentToOutputWeights,
1154 inputGateBias,
1155 forgetGateBias,
1156 cellBias,
1157 outputGateBias);
1158
1159 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1160 m_flatBufferBuilder,
1161 fbQuantizedLstmBaseLayer,
1162 fbQuantizedLstmParams);
1163
1164 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001165}
1166
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001167fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001168 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001169{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001170 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1171
Mike Kelly8c1701a2019-02-11 17:01:27 +00001172 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1173 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1174
1175 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001176 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001177 m_flatBufferBuilder.CreateString(layer->GetName()),
1178 layerType,
1179 m_flatBufferBuilder.CreateVector(inputSlots),
1180 m_flatBufferBuilder.CreateVector(outputSlots));
1181}
1182
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001183void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001184{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001185 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001186 m_serializedLayers.push_back(anyLayer);
1187}
1188
Mike Kellya0766c32019-02-19 17:22:07 +00001189template <typename T>
1190flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1191{
1192 const T* buffer = reinterpret_cast<const T*>(memory);
1193 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1194 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1195 return fbVector;
1196}
1197
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001198flatbuffers::Offset<serializer::ConstTensor>
1199 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001200{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001201 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001202
1203 // Get the dimensions
1204 std::vector<unsigned int> shape;
1205
1206 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1207 {
1208 shape.push_back(tensorInfo.GetShape()[dim]);
1209 }
1210
1211 // Create FlatBuffer TensorInfo
1212 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1213 m_flatBufferBuilder.CreateVector(shape),
1214 GetFlatBufferDataType(tensorInfo.GetDataType()),
1215 tensorInfo.GetQuantizationScale(),
1216 tensorInfo.GetQuantizationOffset());
1217 flatbuffers::Offset<void> fbPayload;
1218
1219 switch (tensorInfo.GetDataType())
1220 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001221 case armnn::DataType::Float32:
1222 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001223 {
1224 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1225 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1226 m_flatBufferBuilder,
1227 fbVector);
1228 fbPayload = flatBuffersData.o;
1229 break;
1230 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001231 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001232 {
1233 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1234 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1235 m_flatBufferBuilder,
1236 fbVector);
1237 fbPayload = flatBuffersData.o;
1238 break;
1239 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001240 case armnn::DataType::QuantisedSymm16:
1241 {
1242 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1243 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1244 m_flatBufferBuilder,
1245 fbVector);
1246 fbPayload = flatBuffersData.o;
1247 break;
1248 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001249 case armnn::DataType::QuantisedAsymm8:
1250 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001251 default:
1252 {
1253 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1254 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1255 m_flatBufferBuilder,
1256 fbVector);
1257 fbPayload = flatBuffersData.o;
1258 }
1259 }
1260 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1261 m_flatBufferBuilder,
1262 flatBufferTensorInfo,
1263 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1264 fbPayload);
1265 return flatBufferConstTensor;
1266}
1267
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001268std::vector<fb::Offset<serializer::InputSlot>>
1269 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001270{
Mike Kellya0766c32019-02-19 17:22:07 +00001271 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001272
1273 // Get the InputSlots
1274 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1275 {
1276 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1277
1278 // Get the Connection for the InputSlot
1279 const IOutputSlot* connection = inputSlot.GetConnection();
1280
1281 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001282 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1283 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001284 // Create FlatBuffer InputSlot
1285 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1286 }
1287 return inputSlots;
1288}
1289
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001290std::vector<fb::Offset<serializer::OutputSlot>>
1291 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001292{
1293 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1294
1295 // Get the OutputSlots
1296 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1297 {
1298 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001299 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001300
1301 // Get the dimensions
1302 std::vector<unsigned int> shape;
1303 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1304 {
1305 shape.push_back(tensorInfo.GetShape()[dim]);
1306 }
1307
1308 // Create FlatBuffer TensorInfo
1309 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1310 m_flatBufferBuilder.CreateVector(shape),
1311 GetFlatBufferDataType(tensorInfo.GetDataType()),
1312 tensorInfo.GetQuantizationScale(),
1313 tensorInfo.GetQuantizationOffset());
1314
1315 // Create FlatBuffer Outputslot
1316 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1317 slotIndex,
1318 flatBufferTensorInfo));
1319 }
1320 return outputSlots;
1321}
1322
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001323
1324ISerializer* ISerializer::CreateRaw()
1325{
1326 return new Serializer();
1327}
1328
1329ISerializerPtr ISerializer::Create()
1330{
1331 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1332}
1333
1334void ISerializer::Destroy(ISerializer* serializer)
1335{
1336 delete serializer;
1337}
1338
1339void Serializer::Serialize(const INetwork& inNetwork)
1340{
1341 // Iterate through to network
1342 inNetwork.Accept(m_SerializerVisitor);
1343 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1344
1345 // Create FlatBuffer SerializedGraph
1346 auto serializedGraph = serializer::CreateSerializedGraph(
1347 fbBuilder,
1348 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1349 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1350 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1351
1352 // Serialize the graph
1353 fbBuilder.Finish(serializedGraph);
1354}
1355
1356bool Serializer::SaveSerializedToStream(std::ostream& stream)
1357{
1358 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1359
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001360 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1361 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001362 return !stream.bad();
1363}
1364
Matteo Martincighec333912019-02-13 15:12:39 +00001365} // namespace armnnSerializer