blob: f07805cb38a48c1a9aa57264e2937d22b1f99edc [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{
306 throw UnimplementedException("SerializerVisitor::VisitDepthToSpaceLayer is not implemented");
307}
308
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000309void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
310 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
311 const armnn::ConstTensor& weights,
312 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000313 const char* name)
314{
315 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
316 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
317 descriptor.m_PadLeft,
318 descriptor.m_PadRight,
319 descriptor.m_PadTop,
320 descriptor.m_PadBottom,
321 descriptor.m_StrideX,
322 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100323 descriptor.m_DilationX,
324 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000325 descriptor.m_BiasEnabled,
326 GetFlatBufferDataLayout(descriptor.m_DataLayout));
327
328 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
329 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
330 if (biases.has_value())
331 {
332 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
333 }
334
335 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
336 fbBaseLayer,
337 fbDescriptor,
338 fbWeightsConstTensorInfo,
339 fbBiasesConstTensorInfo);
340
341 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
342}
343
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000344void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
345 const char* name)
346{
347 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
348 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
349
350 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
351}
352
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000353void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
354 const armnn::DetectionPostProcessDescriptor& descriptor,
355 const armnn::ConstTensor& anchors,
356 const char* name)
357{
358 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
359 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
360 descriptor.m_MaxDetections,
361 descriptor.m_MaxClassesPerDetection,
362 descriptor.m_DetectionsPerClass,
363 descriptor.m_NmsScoreThreshold,
364 descriptor.m_NmsIouThreshold,
365 descriptor.m_NumClasses,
366 descriptor.m_UseRegularNms,
367 descriptor.m_ScaleX,
368 descriptor.m_ScaleY,
369 descriptor.m_ScaleW,
370 descriptor.m_ScaleH);
371
372 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
373
374 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
375 fbBaseLayer,
376 fbDescriptor,
377 fbAnchorsConstTensorInfo);
378
379 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
380}
381
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000382void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
383{
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000384 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
385 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000386
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000387 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
388}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000389
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000390void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
391{
392 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
393 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
394
395 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
396}
397
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000398void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
399{
400 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
401 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
402
403 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
404}
405
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000406void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
407{
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000408 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
409 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000410
411 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
412}
413
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000414void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
415{
416 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000417 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000418
419 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
420}
421
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000422void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
423 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
424 const char* name)
425{
426 // Create FlatBuffer BaseLayer
427 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
428
429 // Create the FlatBuffer L2Normalization Descriptor
430 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100431 m_flatBufferBuilder,
432 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
433 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000434
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100435 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000436 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
437
438 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
439}
440
Jim Flynn11af3752019-03-19 17:22:29 +0000441void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer, const armnn::LstmDescriptor& descriptor,
442 const armnn::LstmInputParams& params, const char* name)
443{
444 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
445
446 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
447 m_flatBufferBuilder,
448 descriptor.m_ActivationFunc,
449 descriptor.m_ClippingThresCell,
450 descriptor.m_ClippingThresProj,
451 descriptor.m_CifgEnabled,
452 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100453 descriptor.m_ProjectionEnabled,
454 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000455
456 // Get mandatory input parameters
457 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
458 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
459 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
460 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
461 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
462 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
463 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
464 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
465 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
466
467 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
468 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
469 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
470 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
471 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
472 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
473 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
474 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
475 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100476 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
477 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
478 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
479 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000480
481 if (!descriptor.m_CifgEnabled)
482 {
483 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
484 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
485 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
486 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
487 }
488
489 if (descriptor.m_ProjectionEnabled)
490 {
491 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
492 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
493 }
494
495 if (descriptor.m_PeepholeEnabled)
496 {
497 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
498 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
499 }
500
Jan Eilersf8c62972019-07-17 11:07:49 +0100501 if (descriptor.m_LayerNormEnabled)
502 {
503 if (!descriptor.m_CifgEnabled)
504 {
505 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
506 }
507 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
508 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
509 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
510 }
511
Jim Flynn11af3752019-03-19 17:22:29 +0000512 auto fbLstmParams = serializer::CreateLstmInputParams(
513 m_flatBufferBuilder,
514 inputToForgetWeights,
515 inputToCellWeights,
516 inputToOutputWeights,
517 recurrentToForgetWeights,
518 recurrentToCellWeights,
519 recurrentToOutputWeights,
520 forgetGateBias,
521 cellBias,
522 outputGateBias,
523 inputToInputWeights,
524 recurrentToInputWeights,
525 cellToInputWeights,
526 inputGateBias,
527 projectionWeights,
528 projectionBias,
529 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100530 cellToOutputWeights,
531 inputLayerNormWeights,
532 forgetLayerNormWeights,
533 cellLayerNormWeights,
534 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000535
536 auto fbLstmLayer = serializer::CreateLstmLayer(
537 m_flatBufferBuilder,
538 fbLstmBaseLayer,
539 fbLstmDescriptor,
540 fbLstmParams);
541
542 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
543}
544
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000545void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
546{
547 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
548 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
549
550 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
551}
552
553void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
554 const armnn::MeanDescriptor& descriptor,
555 const char* name)
556{
557 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
558 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
559 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
560 descriptor.m_KeepDims);
561
562 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
563 fbMeanBaseLayer,
564 fbMeanDescriptor);
565
566 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
567}
568
569void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
570{
571 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
572 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
573
574 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
575}
576
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100577void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
578{
579 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
580 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
581
582 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
583}
584
Jim Flynnac25a1b2019-02-28 10:40:49 +0000585void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100586 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000587 const char* name)
588{
Jim Flynne242f2d2019-05-22 14:24:13 +0100589 VisitConcatLayer(layer, mergerDescriptor, name);
590}
591
592void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
593 const armnn::ConcatDescriptor& concatDescriptor,
594 const char* name)
595{
596 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000597
598 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100599 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000600 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100601 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000602 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100603 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000604 {
605 origins.push_back(origin[d]);
606 }
607 auto view = m_flatBufferBuilder.CreateVector(origins);
608 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
609 views.push_back(uintVector);
610 }
611
Jim Flynne242f2d2019-05-22 14:24:13 +0100612 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
613 concatDescriptor.GetConcatAxis(),
614 concatDescriptor.GetNumViews(),
615 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000616 m_flatBufferBuilder.CreateVector(views));
617
Jim Flynne242f2d2019-05-22 14:24:13 +0100618 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
619 flatBufferConcatBaseLayer,
620 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000621
Jim Flynne242f2d2019-05-22 14:24:13 +0100622 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000623}
624
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000625void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000626{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000627 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
628 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
629 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000630
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000631 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000632}
633
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000634void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
635 const armnn::PadDescriptor& padDescriptor,
636 const char* name)
637{
638 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
639
640 std::vector<unsigned int> padList;
641 for (auto& p: padDescriptor.m_PadList)
642 {
643 padList.push_back(p.first);
644 padList.push_back(p.second);
645 }
646
647 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100648 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100649 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000650
651 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
652 flatBufferBaseLayer,
653 flatBufferPadDesc);
654
655 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
656}
657
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000658void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
659 const armnn::PermuteDescriptor& permuteDescriptor,
660 const char* name)
661{
662 // Create FlatBuffer BaseLayer
663 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
664
665 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100666 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000667 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100668 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000669 }
670
671 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
672 m_flatBufferBuilder.CreateVector(dimMappings));
673
674 // Create the FlatBuffer PermuteLayer
675 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
676 flatBufferPermuteBaseLayer,
677 flatBufferPermuteDesc);
678
679 // Add the AnyLayer to the FlatBufferLayers
680 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
681}
682
Saoirse Stewart263829c2019-02-19 15:54:14 +0000683// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000684void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000685 const armnn::ReshapeDescriptor& reshapeDescriptor,
686 const char* name)
687{
688 // Create FlatBuffer BaseLayer
689 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
690
691 std::vector<unsigned int> targetShape;
692 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
693 {
694 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
695 }
696
697 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
698 m_flatBufferBuilder.CreateVector(targetShape));
699
700 // Create the FlatBuffer ReshapeLayer
701 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
702 flatBufferReshapeDesc);
703
704 // Add the AnyLayer to the FlatBufferLayers
705 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
706}
707
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000708void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
709 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
710 const char* name)
711{
712 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
713
714 auto flatBufferDescriptor =
715 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
716 resizeDescriptor.m_TargetWidth,
717 resizeDescriptor.m_TargetHeight,
718 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
719
720 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
721 flatBufferBaseLayer,
722 flatBufferDescriptor);
723
724 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
725}
726
Teresa Charlina9075df2019-06-27 15:41:57 +0100727void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
728 const armnn::ResizeDescriptor& resizeDescriptor,
729 const char* name)
730{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100731 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
732
733 auto flatBufferDescriptor =
734 CreateResizeDescriptor(m_flatBufferBuilder,
735 resizeDescriptor.m_TargetHeight,
736 resizeDescriptor.m_TargetWidth,
737 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
738 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
739
740 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
741 flatBufferBaseLayer,
742 flatBufferDescriptor);
743
744 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100745}
746
Sadik Armagan8b42a382019-03-01 14:24:49 +0000747void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
748{
749 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
750 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
751
752 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
753}
754
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100755void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
756 const armnn::SliceDescriptor& sliceDescriptor,
757 const char* name)
758{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100759 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
760 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
761 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
762 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
763
764 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
765
766 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100767}
768
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000769// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000770void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
771 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000772 const char* name)
773{
774 // Create FlatBuffer BaseLayer
775 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
776
777 // Create the FlatBuffer SoftmaxDescriptor
778 auto flatBufferSoftmaxDesc =
779 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
780
781 // Create the FlatBuffer SoftmaxLayer
782 auto flatBufferSoftmaxLayer =
783 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
784 flatBufferSoftmaxBaseLayer,
785 flatBufferSoftmaxDesc);
786
787 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
788}
789
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000790void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
791 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000792 const char* name)
793{
794 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
795 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
796 m_flatBufferBuilder,
797 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
798 pooling2dDescriptor.m_PadLeft,
799 pooling2dDescriptor.m_PadRight,
800 pooling2dDescriptor.m_PadTop,
801 pooling2dDescriptor.m_PadBottom,
802 pooling2dDescriptor.m_PoolWidth,
803 pooling2dDescriptor.m_PoolHeight,
804 pooling2dDescriptor.m_StrideX,
805 pooling2dDescriptor.m_StrideY,
806 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
807 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
808 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
809
810 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
811 fbPooling2dBaseLayer,
812 fbPooling2dDescriptor);
813
814 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
815}
816
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100817void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
818 const char* name)
819{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100820 // Create FlatBuffer BaseLayer
821 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
822
823 // Create the FlatBuffer AdditionLayer
824 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
825
826 // Add the AnyLayer to the FlatBufferLayers
827 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100828}
829
Derek Lamberti87acb272019-03-27 16:51:31 +0000830void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
831{
832 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
833 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
834 fbQuantizeBaseLayer);
835 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
836}
837
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000838// Build FlatBuffer for FullyConnected Layer
839void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
840 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
841 const armnn::ConstTensor& weights,
842 const armnn::Optional<armnn::ConstTensor>& biases,
843 const char* name)
844{
845 // Create FlatBuffer BaseLayer
846 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
847
848 // Create FlatBuffer FullyConnectedDescriptor
849 auto flatBufferDescriptor =
850 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
851 fullyConnectedDescriptor.m_BiasEnabled,
852 fullyConnectedDescriptor.m_TransposeWeightMatrix);
853
854 // Create FlatBuffer weights data
855 auto flatBufferWeights = CreateConstTensorInfo(weights);
856
857 // Create FlatBuffer bias data
858 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
859 if (fullyConnectedDescriptor.m_BiasEnabled)
860 {
861 flatBufferBiases = CreateConstTensorInfo(biases.value());
862 }
863
864 // Create FlatBuffer FullyConnectedLayer
865 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
866 flatBufferBaseLayer,
867 flatBufferDescriptor,
868 flatBufferWeights,
869 flatBufferBiases);
870
871 // Add created FullyConnectedLayer to the FlatBufferLayers
872 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
873}
874
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000875// Build FlatBuffer for SpaceToBatchNd Layer
876void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
877 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
878 const char* name)
879{
880 // Create FlatBuffer BaseLayer
881 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
882
883 std::vector<unsigned int> padList;
884 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
885 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
886 {
887 padList.push_back(pad.first);
888 padList.push_back(pad.second);
889 }
890
891 auto flatBufferDescriptor =
892 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
893 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
894 m_flatBufferBuilder.CreateVector(padList),
895 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
896
897 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
898 flatBufferBaseLayer,
899 flatBufferDescriptor);
900
901 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
902}
903
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100904// Build FlatBuffer for SpaceToDepthLayer
905void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
906 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
907 const char* name)
908{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100909 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
910 auto flatBufferDescriptor =
911 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
912 spaceToDepthDescriptor.m_BlockSize,
913 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
914
915 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
916 flatBufferBaseLayer,
917 flatBufferDescriptor);
918
919 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100920}
921
Jim Flynn18ce3382019-03-08 11:08:30 +0000922// Build FlatBuffer for Splitter Layer
923void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
924 const armnn::ViewsDescriptor& viewsDescriptor,
925 const char* name)
926{
927 // Create FlatBuffer ViewOrigins
928 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
929 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
930
931 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
932 {
933 std::vector<uint32_t> viewOrigin;
934 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
935
936 // Copy vector
937 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
938 {
939 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
940 }
941
942 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
943 m_flatBufferBuilder.CreateVector(viewOrigin)));
944 }
945
946 // Create FlatBuffer OriginsDescriptor
947 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
948 viewsDescriptor.GetOrigins().GetConcatAxis(),
949 viewsDescriptor.GetOrigins().GetNumViews(),
950 viewsDescriptor.GetOrigins().GetNumDimensions(),
951 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
952
953 // Create FlatBuffer ViewOrigins
954 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
955 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
956
957 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
958 {
959 std::vector<uint32_t> viewSize;
960 viewSize.reserve(viewsDescriptor.GetNumDimensions());
961
962 // Copy vector
963 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
964 {
965 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
966 }
967
968 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
969 m_flatBufferBuilder.CreateVector(viewSize)));
970 }
971
972 // Create FlatBuffer ViewsDescriptor
973 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
974 flatBufferOriginDescriptor,
975 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
976
977 // Create FlatBuffer BaseLayer
978 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
979
980 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
981 flatBufferBaseLayer,
982 flatBufferViewsDescriptor);
983
984 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
985}
986
Nina Drozd57728782019-02-27 10:53:27 +0000987void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
988 const armnn::NormalizationDescriptor& descriptor,
989 const char* name)
990{
991 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
992
993 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
994 m_flatBufferBuilder,
995 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
996 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
997 descriptor.m_NormSize,
998 descriptor.m_Alpha,
999 descriptor.m_Beta,
1000 descriptor.m_K,
1001 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1002
1003 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1004 fbNormalizationBaseLayer,
1005 fbNormalizationDescriptor);
1006
1007 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1008}
1009
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001010void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1011 const armnn::StackDescriptor& stackDescriptor,
1012 const char* name)
1013{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001014 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1015
1016 std::vector<unsigned int> inputShape;
1017 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1018 {
1019 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1020 }
1021
1022 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1023 stackDescriptor.m_Axis,
1024 stackDescriptor.m_NumInputs,
1025 m_flatBufferBuilder.CreateVector(inputShape));
1026
1027 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1028 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001029}
1030
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001031void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1032 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1033 const char* name)
1034{
1035 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1036
1037 auto flatBufferDescriptor =
1038 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1039 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1040 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1041 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1042 stridedSliceDescriptor.m_BeginMask,
1043 stridedSliceDescriptor.m_EndMask,
1044 stridedSliceDescriptor.m_ShrinkAxisMask,
1045 stridedSliceDescriptor.m_EllipsisMask,
1046 stridedSliceDescriptor.m_NewAxisMask,
1047 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1048
1049 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1050 flatBufferBaseLayer,
1051 flatBufferDescriptor);
1052
1053 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1054}
1055
Conor Kennedyda1f9752019-03-01 14:37:12 +00001056void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1057{
1058 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1059 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1060
1061 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1062}
1063
Sadik Armaganeff363d2019-04-05 15:25:46 +01001064void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1065{
1066 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1067 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1068
1069 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1070}
1071
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001072void SerializerVisitor::VisitTransposeConvolution2dLayer(
1073 const armnn::IConnectableLayer* layer,
1074 const armnn::TransposeConvolution2dDescriptor& descriptor,
1075 const armnn::ConstTensor& weights,
1076 const armnn::Optional<armnn::ConstTensor>& biases,
1077 const char* name)
1078{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001079 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1080 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1081 descriptor.m_PadLeft,
1082 descriptor.m_PadRight,
1083 descriptor.m_PadTop,
1084 descriptor.m_PadBottom,
1085 descriptor.m_StrideX,
1086 descriptor.m_StrideY,
1087 descriptor.m_BiasEnabled,
1088 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1089
1090 // weights & biases
1091 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1092 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1093 if (biases.has_value())
1094 {
1095 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1096 }
1097
1098 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1099 fbBaseLayer,
1100 fbDescriptor,
1101 fbWeightsConstTensorInfo,
1102 fbBiasesConstTensorInfo);
1103
1104 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001105}
1106
James Conroyee18dc82019-07-17 11:27:46 +01001107void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1108 const armnn::QuantizedLstmInputParams& params,
1109 const char* name)
1110{
Jan Eilers5b01a892019-07-23 09:47:43 +01001111 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1112
1113 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001114 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1115 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1116 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1117 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001118
Francis Murtaghbb590b42019-08-14 09:51:36 +01001119 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1120 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1121 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1122 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001123
Francis Murtaghbb590b42019-08-14 09:51:36 +01001124 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1125 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1126 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1127 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001128
1129 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1130 m_flatBufferBuilder,
1131 inputToInputWeights,
1132 inputToForgetWeights,
1133 inputToCellWeights,
1134 inputToOutputWeights,
1135 recurrentToInputWeights,
1136 recurrentToForgetWeights,
1137 recurrentToCellWeights,
1138 recurrentToOutputWeights,
1139 inputGateBias,
1140 forgetGateBias,
1141 cellBias,
1142 outputGateBias);
1143
1144 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1145 m_flatBufferBuilder,
1146 fbQuantizedLstmBaseLayer,
1147 fbQuantizedLstmParams);
1148
1149 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001150}
1151
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001152fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001153 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001154{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001155 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1156
Mike Kelly8c1701a2019-02-11 17:01:27 +00001157 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1158 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1159
1160 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001161 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001162 m_flatBufferBuilder.CreateString(layer->GetName()),
1163 layerType,
1164 m_flatBufferBuilder.CreateVector(inputSlots),
1165 m_flatBufferBuilder.CreateVector(outputSlots));
1166}
1167
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001168void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001169{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001170 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001171 m_serializedLayers.push_back(anyLayer);
1172}
1173
Mike Kellya0766c32019-02-19 17:22:07 +00001174template <typename T>
1175flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1176{
1177 const T* buffer = reinterpret_cast<const T*>(memory);
1178 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1179 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1180 return fbVector;
1181}
1182
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001183flatbuffers::Offset<serializer::ConstTensor>
1184 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001185{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001186 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001187
1188 // Get the dimensions
1189 std::vector<unsigned int> shape;
1190
1191 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1192 {
1193 shape.push_back(tensorInfo.GetShape()[dim]);
1194 }
1195
1196 // Create FlatBuffer TensorInfo
1197 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1198 m_flatBufferBuilder.CreateVector(shape),
1199 GetFlatBufferDataType(tensorInfo.GetDataType()),
1200 tensorInfo.GetQuantizationScale(),
1201 tensorInfo.GetQuantizationOffset());
1202 flatbuffers::Offset<void> fbPayload;
1203
1204 switch (tensorInfo.GetDataType())
1205 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001206 case armnn::DataType::Float32:
1207 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001208 {
1209 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1210 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1211 m_flatBufferBuilder,
1212 fbVector);
1213 fbPayload = flatBuffersData.o;
1214 break;
1215 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001216 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001217 {
1218 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1219 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1220 m_flatBufferBuilder,
1221 fbVector);
1222 fbPayload = flatBuffersData.o;
1223 break;
1224 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001225 case armnn::DataType::QuantisedSymm16:
1226 {
1227 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1228 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1229 m_flatBufferBuilder,
1230 fbVector);
1231 fbPayload = flatBuffersData.o;
1232 break;
1233 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001234 case armnn::DataType::QuantisedAsymm8:
1235 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001236 default:
1237 {
1238 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1239 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1240 m_flatBufferBuilder,
1241 fbVector);
1242 fbPayload = flatBuffersData.o;
1243 }
1244 }
1245 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1246 m_flatBufferBuilder,
1247 flatBufferTensorInfo,
1248 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1249 fbPayload);
1250 return flatBufferConstTensor;
1251}
1252
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001253std::vector<fb::Offset<serializer::InputSlot>>
1254 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001255{
Mike Kellya0766c32019-02-19 17:22:07 +00001256 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001257
1258 // Get the InputSlots
1259 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1260 {
1261 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1262
1263 // Get the Connection for the InputSlot
1264 const IOutputSlot* connection = inputSlot.GetConnection();
1265
1266 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001267 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1268 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001269 // Create FlatBuffer InputSlot
1270 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1271 }
1272 return inputSlots;
1273}
1274
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001275std::vector<fb::Offset<serializer::OutputSlot>>
1276 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001277{
1278 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1279
1280 // Get the OutputSlots
1281 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1282 {
1283 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001284 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001285
1286 // Get the dimensions
1287 std::vector<unsigned int> shape;
1288 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1289 {
1290 shape.push_back(tensorInfo.GetShape()[dim]);
1291 }
1292
1293 // Create FlatBuffer TensorInfo
1294 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1295 m_flatBufferBuilder.CreateVector(shape),
1296 GetFlatBufferDataType(tensorInfo.GetDataType()),
1297 tensorInfo.GetQuantizationScale(),
1298 tensorInfo.GetQuantizationOffset());
1299
1300 // Create FlatBuffer Outputslot
1301 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1302 slotIndex,
1303 flatBufferTensorInfo));
1304 }
1305 return outputSlots;
1306}
1307
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001308
1309ISerializer* ISerializer::CreateRaw()
1310{
1311 return new Serializer();
1312}
1313
1314ISerializerPtr ISerializer::Create()
1315{
1316 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1317}
1318
1319void ISerializer::Destroy(ISerializer* serializer)
1320{
1321 delete serializer;
1322}
1323
1324void Serializer::Serialize(const INetwork& inNetwork)
1325{
1326 // Iterate through to network
1327 inNetwork.Accept(m_SerializerVisitor);
1328 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1329
1330 // Create FlatBuffer SerializedGraph
1331 auto serializedGraph = serializer::CreateSerializedGraph(
1332 fbBuilder,
1333 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1334 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1335 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1336
1337 // Serialize the graph
1338 fbBuilder.Finish(serializedGraph);
1339}
1340
1341bool Serializer::SaveSerializedToStream(std::ostream& stream)
1342{
1343 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1344
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001345 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1346 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001347 return !stream.bad();
1348}
1349
Matteo Martincighec333912019-02-13 15:12:39 +00001350} // namespace armnnSerializer