blob: 5d06958054103cc7d8d273f2325ee5448df9eead [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
janeil013fec1ea2019-11-07 09:47:20 +000064uint32_t SerializerVisitor::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000065{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000066 if (m_guidMap.empty())
67 {
janeil013fec1ea2019-11-07 09:47:20 +000068 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000069 }
70 else if (m_guidMap.find(guid) == m_guidMap.end())
71 {
janeil013fec1ea2019-11-07 09:47:20 +000072 ++m_layerId;
73 m_guidMap.insert(std::make_pair(guid, m_layerId));
74
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000075 return m_layerId;
76 }
Saoirse Stewart30211042019-02-18 17:19:16 +000077 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000078}
79
Mike Kelly8c1701a2019-02-11 17:01:27 +000080// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000081void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000082{
83 // Create FlatBuffer BaseLayer
84 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
85
86 // Create FlatBuffer BindableBaseLayer
87 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
88 flatBufferInputBaseLayer,
89 id);
janeil013fec1ea2019-11-07 09:47:20 +000090 // Push layer index to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000091 m_inputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +000092
93 // Create the FlatBuffer InputLayer
94 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
95
96 // Add the AnyLayer to the FlatBufferLayers
97 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
98}
99
100// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000101void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000102{
103 // Create FlatBuffer BaseLayer
104 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
105
106 // Create FlatBuffer BindableBaseLayer
107 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
108 flatBufferOutputBaseLayer,
109 id);
janeil013fec1ea2019-11-07 09:47:20 +0000110 // Push layer index to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000111 m_outputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000112
113 // Create the FlatBuffer OutputLayer
114 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
115 // Add the AnyLayer to the FlatBufferLayers
116 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
117}
118
Kevin May868eb142019-09-04 17:29:31 +0100119void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
120{
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100121 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
122 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
123
124 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100125}
126
Mike Kellyaf484012019-02-20 16:53:11 +0000127// Build FlatBuffer for Activation Layer
128void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
129 const armnn::ActivationDescriptor& descriptor,
130 const char* name)
131{
132 // Create FlatBuffer BaseLayer
133 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
134
135 // Create the FlatBuffer ActivationDescriptor
136 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
137 GetFlatBufferActivationFunction(descriptor.m_Function),
138 descriptor.m_A,
139 descriptor.m_B);
140
141 // Create the FlatBuffer ActivationLayer
142 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
143 flatBufferBaseLayer,
144 flatBufferDescriptor);
145
146 // Add the AnyLayer to the FlatBufferLayers
147 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
148}
149
Mike Kelly8c1701a2019-02-11 17:01:27 +0000150// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000151void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000152{
153 // Create FlatBuffer BaseLayer
154 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
155
156 // Create the FlatBuffer AdditionLayer
157 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
158
159 // Add the AnyLayer to the FlatBufferLayers
160 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
161}
162
Nikhil Rajee391d52019-09-05 17:50:44 +0100163// Build FlatBuffer for ArgMinMax Layer
164void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
165 const armnn::ArgMinMaxDescriptor& descriptor,
166 const char *name)
167{
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100168 // Create FlatBuffer BaseLayer
169 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
170
171 // Create FlatBuffer Descriptor
172 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
173 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
174 descriptor.m_Axis);
175
176 // Create FlatBuffer ArgMinMaxLayer
177 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
178 flatBufferBaseLayer,
179 flatBufferDescriptor);
180
181 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100182}
183
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000184// Build FlatBuffer for BatchToSpaceNd Layer
185void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
186 const armnn::BatchToSpaceNdDescriptor& descriptor,
187 const char* name)
188{
189 // Create FlatBuffer BaseLayer
190 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
191
192 std::vector<unsigned int> crops;
193 crops.reserve(descriptor.m_Crops.size() * 2);
194 for (auto& crop : descriptor.m_Crops)
195 {
196 crops.push_back(crop.first);
197 crops.push_back(crop.second);
198 }
199
200 auto flatBufferDescriptor =
201 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
202 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
203 m_flatBufferBuilder.CreateVector(crops),
204 GetFlatBufferDataLayout(descriptor.m_DataLayout));
205
206 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
207 flatBufferBaseLayer,
208 flatBufferDescriptor);
209
210 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
211}
212
ruoyan018e7fa232019-02-28 15:09:07 +0000213void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
214 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
215 const armnn::ConstTensor& mean,
216 const armnn::ConstTensor& variance,
217 const armnn::ConstTensor& beta,
218 const armnn::ConstTensor& gamma,
219 const char* name)
220{
221 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
222 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
223 m_flatBufferBuilder,
224 batchNormDescriptor.m_Eps,
225 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
226
227 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
228 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
229 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
230 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
231 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
232 fbBatchNormalizationBaseLayer,
233 fbBatchNormalizationDescriptor,
234 fbMeanConstTensorInfo,
235 fbVarianceConstTensorInfo,
236 fbBetaConstTensorInfo,
237 fbGammaConstTensorInfo);
238
239 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
240}
241
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100242void SerializerVisitor::VisitComparisonLayer(const armnn::IConnectableLayer* layer,
243 const armnn::ComparisonDescriptor& descriptor,
244 const char* name)
245{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100246 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
247 auto fbDescriptor = serializer::CreateComparisonDescriptor(
248 m_flatBufferBuilder,
249 GetFlatBufferComparisonOperation(descriptor.m_Operation));
250
251 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
252 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100253}
254
Conor Kennedy76277882019-02-26 08:29:54 +0000255// Build FlatBuffer for Constant Layer
256void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
257 const armnn::ConstTensor& input,
258 const char* name)
259{
260 // Create FlatBuffer BaseLayer
261 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
262
263 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
264
265 // Create the FlatBuffer ConstantLayer
266 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
267 flatBufferConstantBaseLayer,
268 flatBufferConstTensorInfo);
269
270 // Add the AnyLayer to the FlatBufferLayers
271 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
272}
273
Mike Kellya0766c32019-02-19 17:22:07 +0000274// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000275void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
276 const armnn::Convolution2dDescriptor& descriptor,
277 const armnn::ConstTensor& weights,
278 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000279 const char* name)
280{
281 // Create FlatBuffer BaseLayer
282 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
283
284 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
285 descriptor.m_PadLeft,
286 descriptor.m_PadRight,
287 descriptor.m_PadTop,
288 descriptor.m_PadBottom,
289 descriptor.m_StrideX,
290 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100291 descriptor.m_DilationX,
292 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000293 descriptor.m_BiasEnabled,
294 GetFlatBufferDataLayout(descriptor.m_DataLayout));
295 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
296 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
297
298 if (biases.has_value())
299 {
300 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
301 }
302
303 // Create the FlatBuffer Convolution2dLayer
304 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
305 flatBufferBaseLayer,
306 flatBufferDescriptor,
307 flatBufferWeightsConstTensorInfo,
308 flatBufferBiasesConstTensorInfo);
309
310 // Add the AnyLayer to the FlatBufferLayers
311 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
312}
313
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100314void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
315 const armnn::DepthToSpaceDescriptor& descriptor,
316 const char* name)
317{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100318 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
319 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
320 descriptor.m_BlockSize,
321 GetFlatBufferDataLayout(descriptor.m_DataLayout));
322
323 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
324
325 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100326}
327
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000328void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
329 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
330 const armnn::ConstTensor& weights,
331 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000332 const char* name)
333{
334 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
335 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
336 descriptor.m_PadLeft,
337 descriptor.m_PadRight,
338 descriptor.m_PadTop,
339 descriptor.m_PadBottom,
340 descriptor.m_StrideX,
341 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100342 descriptor.m_DilationX,
343 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000344 descriptor.m_BiasEnabled,
345 GetFlatBufferDataLayout(descriptor.m_DataLayout));
346
347 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
348 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
349 if (biases.has_value())
350 {
351 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
352 }
353
354 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
355 fbBaseLayer,
356 fbDescriptor,
357 fbWeightsConstTensorInfo,
358 fbBiasesConstTensorInfo);
359
360 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
361}
362
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000363void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
364 const char* name)
365{
366 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
367 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
368
369 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
370}
371
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000372void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
373 const armnn::DetectionPostProcessDescriptor& descriptor,
374 const armnn::ConstTensor& anchors,
375 const char* name)
376{
377 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
378 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
379 descriptor.m_MaxDetections,
380 descriptor.m_MaxClassesPerDetection,
381 descriptor.m_DetectionsPerClass,
382 descriptor.m_NmsScoreThreshold,
383 descriptor.m_NmsIouThreshold,
384 descriptor.m_NumClasses,
385 descriptor.m_UseRegularNms,
386 descriptor.m_ScaleX,
387 descriptor.m_ScaleY,
388 descriptor.m_ScaleW,
389 descriptor.m_ScaleH);
390
391 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
392
393 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
394 fbBaseLayer,
395 fbDescriptor,
396 fbAnchorsConstTensorInfo);
397
398 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
399}
400
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000401void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
402{
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000403 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
404 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000405
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000406 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
407}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000408
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000409void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
410{
411 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
412 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
413
414 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
415}
416
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000417void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
418{
419 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
420 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
421
422 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
423}
424
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000425void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
426{
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000427 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
428 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000429
430 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
431}
432
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000433void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
434{
435 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000436 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000437
438 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
439}
440
Kevin Mayce5045a2019-10-02 14:07:47 +0100441void SerializerVisitor::VisitInstanceNormalizationLayer(
442 const armnn::IConnectableLayer* layer,
443 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
444 const char* name)
445{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100446 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
447 m_flatBufferBuilder,
448 instanceNormalizationDescriptor.m_Gamma,
449 instanceNormalizationDescriptor.m_Beta,
450 instanceNormalizationDescriptor.m_Eps,
451 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
452
453 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
454 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
455
456 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100457}
458
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000459void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
460 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
461 const char* name)
462{
463 // Create FlatBuffer BaseLayer
464 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
465
466 // Create the FlatBuffer L2Normalization Descriptor
467 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100468 m_flatBufferBuilder,
469 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
470 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000471
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100472 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000473 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
474
475 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
476}
477
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100478void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
479 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
480 const char* name)
481{
Sadik Armagan26257852019-10-14 13:00:47 +0100482 // Create FlatBuffer BaseLayer
483 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
484
485 // Create the FlatBuffer LogSoftmaxDescriptor
486 auto flatBufferLogSoftmaxDesc =
487 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
488 logSoftmaxDescriptor.m_Beta,
489 logSoftmaxDescriptor.m_Axis);
490
491 // Create the FlatBuffer LogSoftmaxLayer
492 auto flatBufferLogSoftmaxLayer =
493 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
494 flatBufferLogSoftmaxBaseLayer,
495 flatBufferLogSoftmaxDesc);
496
497 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100498}
499
500void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
501 const armnn::LstmDescriptor& descriptor,
502 const armnn::LstmInputParams& params,
503 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000504{
505 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
506
507 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
508 m_flatBufferBuilder,
509 descriptor.m_ActivationFunc,
510 descriptor.m_ClippingThresCell,
511 descriptor.m_ClippingThresProj,
512 descriptor.m_CifgEnabled,
513 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100514 descriptor.m_ProjectionEnabled,
515 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000516
517 // Get mandatory input parameters
518 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
519 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
520 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
521 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
522 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
523 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
524 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
525 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
526 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
527
528 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
529 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
530 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
531 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
532 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
533 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
534 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
535 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
536 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100537 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
538 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
539 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
540 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000541
542 if (!descriptor.m_CifgEnabled)
543 {
544 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
545 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
546 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
547 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
548 }
549
550 if (descriptor.m_ProjectionEnabled)
551 {
552 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
553 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
554 }
555
556 if (descriptor.m_PeepholeEnabled)
557 {
558 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
559 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
560 }
561
Jan Eilersf8c62972019-07-17 11:07:49 +0100562 if (descriptor.m_LayerNormEnabled)
563 {
564 if (!descriptor.m_CifgEnabled)
565 {
566 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
567 }
568 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
569 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
570 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
571 }
572
Jim Flynn11af3752019-03-19 17:22:29 +0000573 auto fbLstmParams = serializer::CreateLstmInputParams(
574 m_flatBufferBuilder,
575 inputToForgetWeights,
576 inputToCellWeights,
577 inputToOutputWeights,
578 recurrentToForgetWeights,
579 recurrentToCellWeights,
580 recurrentToOutputWeights,
581 forgetGateBias,
582 cellBias,
583 outputGateBias,
584 inputToInputWeights,
585 recurrentToInputWeights,
586 cellToInputWeights,
587 inputGateBias,
588 projectionWeights,
589 projectionBias,
590 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100591 cellToOutputWeights,
592 inputLayerNormWeights,
593 forgetLayerNormWeights,
594 cellLayerNormWeights,
595 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000596
597 auto fbLstmLayer = serializer::CreateLstmLayer(
598 m_flatBufferBuilder,
599 fbLstmBaseLayer,
600 fbLstmDescriptor,
601 fbLstmParams);
602
603 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
604}
605
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000606void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
607{
608 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
609 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
610
611 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
612}
613
614void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
615 const armnn::MeanDescriptor& descriptor,
616 const char* name)
617{
618 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
619 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
620 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
621 descriptor.m_KeepDims);
622
623 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
624 fbMeanBaseLayer,
625 fbMeanDescriptor);
626
627 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
628}
629
630void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
631{
632 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
633 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
634
635 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
636}
637
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100638void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
639{
640 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
641 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
642
643 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
644}
645
Jim Flynnac25a1b2019-02-28 10:40:49 +0000646void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100647 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000648 const char* name)
649{
Jim Flynne242f2d2019-05-22 14:24:13 +0100650 VisitConcatLayer(layer, mergerDescriptor, name);
651}
652
653void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
654 const armnn::ConcatDescriptor& concatDescriptor,
655 const char* name)
656{
657 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000658
659 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100660 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000661 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100662 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000663 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100664 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000665 {
666 origins.push_back(origin[d]);
667 }
668 auto view = m_flatBufferBuilder.CreateVector(origins);
669 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
670 views.push_back(uintVector);
671 }
672
Jim Flynne242f2d2019-05-22 14:24:13 +0100673 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
674 concatDescriptor.GetConcatAxis(),
675 concatDescriptor.GetNumViews(),
676 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000677 m_flatBufferBuilder.CreateVector(views));
678
Jim Flynne242f2d2019-05-22 14:24:13 +0100679 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
680 flatBufferConcatBaseLayer,
681 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000682
Jim Flynne242f2d2019-05-22 14:24:13 +0100683 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000684}
685
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000686void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000687{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000688 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
689 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
690 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000691
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000692 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000693}
694
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000695void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
696 const armnn::PadDescriptor& padDescriptor,
697 const char* name)
698{
699 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
700
701 std::vector<unsigned int> padList;
702 for (auto& p: padDescriptor.m_PadList)
703 {
704 padList.push_back(p.first);
705 padList.push_back(p.second);
706 }
707
708 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100709 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100710 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000711
712 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
713 flatBufferBaseLayer,
714 flatBufferPadDesc);
715
716 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
717}
718
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000719void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
720 const armnn::PermuteDescriptor& permuteDescriptor,
721 const char* name)
722{
723 // Create FlatBuffer BaseLayer
724 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
725
726 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100727 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000728 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100729 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000730 }
731
732 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
733 m_flatBufferBuilder.CreateVector(dimMappings));
734
735 // Create the FlatBuffer PermuteLayer
736 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
737 flatBufferPermuteBaseLayer,
738 flatBufferPermuteDesc);
739
740 // Add the AnyLayer to the FlatBufferLayers
741 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
742}
743
Saoirse Stewart263829c2019-02-19 15:54:14 +0000744// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000745void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000746 const armnn::ReshapeDescriptor& reshapeDescriptor,
747 const char* name)
748{
749 // Create FlatBuffer BaseLayer
750 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
751
752 std::vector<unsigned int> targetShape;
753 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
754 {
755 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
756 }
757
758 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
759 m_flatBufferBuilder.CreateVector(targetShape));
760
761 // Create the FlatBuffer ReshapeLayer
762 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
763 flatBufferReshapeDesc);
764
765 // Add the AnyLayer to the FlatBufferLayers
766 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
767}
768
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000769void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
770 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
771 const char* name)
772{
773 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
774
775 auto flatBufferDescriptor =
776 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
777 resizeDescriptor.m_TargetWidth,
778 resizeDescriptor.m_TargetHeight,
779 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
780
781 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
782 flatBufferBaseLayer,
783 flatBufferDescriptor);
784
785 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
786}
787
Teresa Charlina9075df2019-06-27 15:41:57 +0100788void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
789 const armnn::ResizeDescriptor& resizeDescriptor,
790 const char* name)
791{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100792 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
793
794 auto flatBufferDescriptor =
795 CreateResizeDescriptor(m_flatBufferBuilder,
796 resizeDescriptor.m_TargetHeight,
797 resizeDescriptor.m_TargetWidth,
798 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
799 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
800
801 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
802 flatBufferBaseLayer,
803 flatBufferDescriptor);
804
805 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100806}
807
Sadik Armagan8b42a382019-03-01 14:24:49 +0000808void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
809{
810 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
811 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
812
813 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
814}
815
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100816void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
817 const armnn::SliceDescriptor& sliceDescriptor,
818 const char* name)
819{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100820 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
821 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
822 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
823 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
824
825 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
826
827 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100828}
829
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000830// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000831void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
832 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000833 const char* name)
834{
835 // Create FlatBuffer BaseLayer
836 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
837
838 // Create the FlatBuffer SoftmaxDescriptor
839 auto flatBufferSoftmaxDesc =
840 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
841
842 // Create the FlatBuffer SoftmaxLayer
843 auto flatBufferSoftmaxLayer =
844 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
845 flatBufferSoftmaxBaseLayer,
846 flatBufferSoftmaxDesc);
847
848 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
849}
850
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000851void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
852 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000853 const char* name)
854{
855 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
856 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
857 m_flatBufferBuilder,
858 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
859 pooling2dDescriptor.m_PadLeft,
860 pooling2dDescriptor.m_PadRight,
861 pooling2dDescriptor.m_PadTop,
862 pooling2dDescriptor.m_PadBottom,
863 pooling2dDescriptor.m_PoolWidth,
864 pooling2dDescriptor.m_PoolHeight,
865 pooling2dDescriptor.m_StrideX,
866 pooling2dDescriptor.m_StrideY,
867 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
868 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
869 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
870
871 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
872 fbPooling2dBaseLayer,
873 fbPooling2dDescriptor);
874
875 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
876}
877
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100878void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
879 const char* name)
880{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100881 // Create FlatBuffer BaseLayer
882 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
883
884 // Create the FlatBuffer AdditionLayer
885 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
886
887 // Add the AnyLayer to the FlatBufferLayers
888 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100889}
890
Derek Lamberti87acb272019-03-27 16:51:31 +0000891void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
892{
893 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
894 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
895 fbQuantizeBaseLayer);
896 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
897}
898
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000899// Build FlatBuffer for FullyConnected Layer
900void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
901 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
902 const armnn::ConstTensor& weights,
903 const armnn::Optional<armnn::ConstTensor>& biases,
904 const char* name)
905{
906 // Create FlatBuffer BaseLayer
907 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
908
909 // Create FlatBuffer FullyConnectedDescriptor
910 auto flatBufferDescriptor =
911 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
912 fullyConnectedDescriptor.m_BiasEnabled,
913 fullyConnectedDescriptor.m_TransposeWeightMatrix);
914
915 // Create FlatBuffer weights data
916 auto flatBufferWeights = CreateConstTensorInfo(weights);
917
918 // Create FlatBuffer bias data
919 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
920 if (fullyConnectedDescriptor.m_BiasEnabled)
921 {
922 flatBufferBiases = CreateConstTensorInfo(biases.value());
923 }
924
925 // Create FlatBuffer FullyConnectedLayer
926 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
927 flatBufferBaseLayer,
928 flatBufferDescriptor,
929 flatBufferWeights,
930 flatBufferBiases);
931
932 // Add created FullyConnectedLayer to the FlatBufferLayers
933 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
934}
935
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000936// Build FlatBuffer for SpaceToBatchNd Layer
937void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
938 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
939 const char* name)
940{
941 // Create FlatBuffer BaseLayer
942 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
943
944 std::vector<unsigned int> padList;
945 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
946 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
947 {
948 padList.push_back(pad.first);
949 padList.push_back(pad.second);
950 }
951
952 auto flatBufferDescriptor =
953 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
954 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
955 m_flatBufferBuilder.CreateVector(padList),
956 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
957
958 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
959 flatBufferBaseLayer,
960 flatBufferDescriptor);
961
962 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
963}
964
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100965// Build FlatBuffer for SpaceToDepthLayer
966void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
967 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
968 const char* name)
969{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100970 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
971 auto flatBufferDescriptor =
972 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
973 spaceToDepthDescriptor.m_BlockSize,
974 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
975
976 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
977 flatBufferBaseLayer,
978 flatBufferDescriptor);
979
980 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100981}
982
Jim Flynn18ce3382019-03-08 11:08:30 +0000983// Build FlatBuffer for Splitter Layer
984void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
985 const armnn::ViewsDescriptor& viewsDescriptor,
986 const char* name)
987{
988 // Create FlatBuffer ViewOrigins
989 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
990 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
991
992 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
993 {
994 std::vector<uint32_t> viewOrigin;
995 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
996
997 // Copy vector
998 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
999 {
1000 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1001 }
1002
1003 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1004 m_flatBufferBuilder.CreateVector(viewOrigin)));
1005 }
1006
1007 // Create FlatBuffer OriginsDescriptor
1008 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1009 viewsDescriptor.GetOrigins().GetConcatAxis(),
1010 viewsDescriptor.GetOrigins().GetNumViews(),
1011 viewsDescriptor.GetOrigins().GetNumDimensions(),
1012 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1013
1014 // Create FlatBuffer ViewOrigins
1015 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1016 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1017
1018 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1019 {
1020 std::vector<uint32_t> viewSize;
1021 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1022
1023 // Copy vector
1024 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1025 {
1026 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1027 }
1028
1029 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1030 m_flatBufferBuilder.CreateVector(viewSize)));
1031 }
1032
1033 // Create FlatBuffer ViewsDescriptor
1034 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1035 flatBufferOriginDescriptor,
1036 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1037
1038 // Create FlatBuffer BaseLayer
1039 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1040
1041 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1042 flatBufferBaseLayer,
1043 flatBufferViewsDescriptor);
1044
1045 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1046}
1047
Nina Drozd57728782019-02-27 10:53:27 +00001048void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1049 const armnn::NormalizationDescriptor& descriptor,
1050 const char* name)
1051{
1052 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1053
1054 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1055 m_flatBufferBuilder,
1056 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1057 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1058 descriptor.m_NormSize,
1059 descriptor.m_Alpha,
1060 descriptor.m_Beta,
1061 descriptor.m_K,
1062 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1063
1064 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1065 fbNormalizationBaseLayer,
1066 fbNormalizationDescriptor);
1067
1068 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1069}
1070
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001071void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1072 const armnn::StackDescriptor& stackDescriptor,
1073 const char* name)
1074{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001075 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1076
1077 std::vector<unsigned int> inputShape;
1078 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1079 {
1080 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1081 }
1082
1083 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1084 stackDescriptor.m_Axis,
1085 stackDescriptor.m_NumInputs,
1086 m_flatBufferBuilder.CreateVector(inputShape));
1087
1088 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1089 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001090}
1091
Derek Lamberti013c3902019-10-21 10:46:16 +01001092void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1093 const armnn::StandInDescriptor& standInDescriptor,
1094 const char *name)
1095{
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001096 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1097 standInDescriptor.m_NumInputs,
1098 standInDescriptor.m_NumOutputs);
1099
1100 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1101 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1102
1103 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001104}
1105
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001106void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1107 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1108 const char* name)
1109{
1110 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1111
1112 auto flatBufferDescriptor =
1113 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1114 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1115 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1116 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1117 stridedSliceDescriptor.m_BeginMask,
1118 stridedSliceDescriptor.m_EndMask,
1119 stridedSliceDescriptor.m_ShrinkAxisMask,
1120 stridedSliceDescriptor.m_EllipsisMask,
1121 stridedSliceDescriptor.m_NewAxisMask,
1122 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1123
1124 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1125 flatBufferBaseLayer,
1126 flatBufferDescriptor);
1127
1128 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1129}
1130
Conor Kennedyda1f9752019-03-01 14:37:12 +00001131void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1132{
1133 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1134 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1135
1136 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1137}
1138
Sadik Armaganeff363d2019-04-05 15:25:46 +01001139void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1140{
1141 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1142 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1143
1144 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1145}
1146
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001147void SerializerVisitor::VisitTransposeConvolution2dLayer(
1148 const armnn::IConnectableLayer* layer,
1149 const armnn::TransposeConvolution2dDescriptor& descriptor,
1150 const armnn::ConstTensor& weights,
1151 const armnn::Optional<armnn::ConstTensor>& biases,
1152 const char* name)
1153{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001154 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1155 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1156 descriptor.m_PadLeft,
1157 descriptor.m_PadRight,
1158 descriptor.m_PadTop,
1159 descriptor.m_PadBottom,
1160 descriptor.m_StrideX,
1161 descriptor.m_StrideY,
1162 descriptor.m_BiasEnabled,
1163 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1164
1165 // weights & biases
1166 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1167 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1168 if (biases.has_value())
1169 {
1170 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1171 }
1172
1173 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1174 fbBaseLayer,
1175 fbDescriptor,
1176 fbWeightsConstTensorInfo,
1177 fbBiasesConstTensorInfo);
1178
1179 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001180}
1181
James Conroyee18dc82019-07-17 11:27:46 +01001182void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1183 const armnn::QuantizedLstmInputParams& params,
1184 const char* name)
1185{
Jan Eilers5b01a892019-07-23 09:47:43 +01001186 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1187
1188 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001189 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1190 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1191 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1192 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001193
Francis Murtaghbb590b42019-08-14 09:51:36 +01001194 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1195 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1196 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1197 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001198
Francis Murtaghbb590b42019-08-14 09:51:36 +01001199 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1200 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1201 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1202 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001203
1204 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1205 m_flatBufferBuilder,
1206 inputToInputWeights,
1207 inputToForgetWeights,
1208 inputToCellWeights,
1209 inputToOutputWeights,
1210 recurrentToInputWeights,
1211 recurrentToForgetWeights,
1212 recurrentToCellWeights,
1213 recurrentToOutputWeights,
1214 inputGateBias,
1215 forgetGateBias,
1216 cellBias,
1217 outputGateBias);
1218
1219 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1220 m_flatBufferBuilder,
1221 fbQuantizedLstmBaseLayer,
1222 fbQuantizedLstmParams);
1223
1224 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001225}
1226
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001227fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001228 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001229{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001230 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1231
Mike Kelly8c1701a2019-02-11 17:01:27 +00001232 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1233 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1234
1235 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001236 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001237 m_flatBufferBuilder.CreateString(layer->GetName()),
1238 layerType,
1239 m_flatBufferBuilder.CreateVector(inputSlots),
1240 m_flatBufferBuilder.CreateVector(outputSlots));
1241}
1242
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001243void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001244{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001245 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001246 m_serializedLayers.push_back(anyLayer);
1247}
1248
Mike Kellya0766c32019-02-19 17:22:07 +00001249template <typename T>
1250flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1251{
1252 const T* buffer = reinterpret_cast<const T*>(memory);
1253 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1254 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1255 return fbVector;
1256}
1257
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001258flatbuffers::Offset<serializer::ConstTensor>
1259 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001260{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001261 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001262
1263 // Get the dimensions
1264 std::vector<unsigned int> shape;
1265
1266 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1267 {
1268 shape.push_back(tensorInfo.GetShape()[dim]);
1269 }
1270
1271 // Create FlatBuffer TensorInfo
1272 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1273 m_flatBufferBuilder.CreateVector(shape),
1274 GetFlatBufferDataType(tensorInfo.GetDataType()),
1275 tensorInfo.GetQuantizationScale(),
1276 tensorInfo.GetQuantizationOffset());
1277 flatbuffers::Offset<void> fbPayload;
1278
1279 switch (tensorInfo.GetDataType())
1280 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001281 case armnn::DataType::Float32:
1282 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001283 {
1284 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1285 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1286 m_flatBufferBuilder,
1287 fbVector);
1288 fbPayload = flatBuffersData.o;
1289 break;
1290 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001291 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001292 {
1293 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1294 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1295 m_flatBufferBuilder,
1296 fbVector);
1297 fbPayload = flatBuffersData.o;
1298 break;
1299 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001300 case armnn::DataType::QuantisedSymm16:
1301 {
1302 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1303 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1304 m_flatBufferBuilder,
1305 fbVector);
1306 fbPayload = flatBuffersData.o;
1307 break;
1308 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001309 case armnn::DataType::QuantisedAsymm8:
1310 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001311 default:
1312 {
1313 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1314 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1315 m_flatBufferBuilder,
1316 fbVector);
1317 fbPayload = flatBuffersData.o;
1318 }
1319 }
1320 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1321 m_flatBufferBuilder,
1322 flatBufferTensorInfo,
1323 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1324 fbPayload);
1325 return flatBufferConstTensor;
1326}
1327
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001328std::vector<fb::Offset<serializer::InputSlot>>
1329 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001330{
Mike Kellya0766c32019-02-19 17:22:07 +00001331 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001332
1333 // Get the InputSlots
1334 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1335 {
1336 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1337
1338 // Get the Connection for the InputSlot
1339 const IOutputSlot* connection = inputSlot.GetConnection();
1340
1341 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001342 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1343 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001344 // Create FlatBuffer InputSlot
1345 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1346 }
1347 return inputSlots;
1348}
1349
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001350std::vector<fb::Offset<serializer::OutputSlot>>
1351 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001352{
1353 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1354
1355 // Get the OutputSlots
1356 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1357 {
1358 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001359 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001360
1361 // Get the dimensions
1362 std::vector<unsigned int> shape;
1363 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1364 {
1365 shape.push_back(tensorInfo.GetShape()[dim]);
1366 }
1367
1368 // Create FlatBuffer TensorInfo
1369 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1370 m_flatBufferBuilder.CreateVector(shape),
1371 GetFlatBufferDataType(tensorInfo.GetDataType()),
1372 tensorInfo.GetQuantizationScale(),
1373 tensorInfo.GetQuantizationOffset());
1374
1375 // Create FlatBuffer Outputslot
1376 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1377 slotIndex,
1378 flatBufferTensorInfo));
1379 }
1380 return outputSlots;
1381}
1382
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001383
1384ISerializer* ISerializer::CreateRaw()
1385{
1386 return new Serializer();
1387}
1388
1389ISerializerPtr ISerializer::Create()
1390{
1391 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1392}
1393
1394void ISerializer::Destroy(ISerializer* serializer)
1395{
1396 delete serializer;
1397}
1398
1399void Serializer::Serialize(const INetwork& inNetwork)
1400{
1401 // Iterate through to network
1402 inNetwork.Accept(m_SerializerVisitor);
1403 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1404
1405 // Create FlatBuffer SerializedGraph
1406 auto serializedGraph = serializer::CreateSerializedGraph(
1407 fbBuilder,
1408 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1409 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1410 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1411
1412 // Serialize the graph
1413 fbBuilder.Finish(serializedGraph);
1414}
1415
1416bool Serializer::SaveSerializedToStream(std::ostream& stream)
1417{
1418 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1419
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001420 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1421 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001422 return !stream.bad();
1423}
1424
Matteo Martincighec333912019-02-13 15:12:39 +00001425} // namespace armnnSerializer