blob: 0340f56d17a0e2072eb37a4411d108132aa0bf23 [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
Matthew Bentham268509a2019-02-25 13:58:24 +000014#include <ArmnnSchema_generated.h>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000015
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
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000052uint32_t SerializerVisitor::GetSerializedId(unsigned int guid)
53{
54 std::pair<unsigned int, uint32_t> guidPair(guid, m_layerId);
55
56 if (m_guidMap.empty())
57 {
58 m_guidMap.insert(guidPair);
59 }
60 else if (m_guidMap.find(guid) == m_guidMap.end())
61 {
62 guidPair.second = ++m_layerId;
63 m_guidMap.insert(guidPair);
64 return m_layerId;
65 }
Saoirse Stewart30211042019-02-18 17:19:16 +000066 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000067}
68
Mike Kelly8c1701a2019-02-11 17:01:27 +000069// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000070void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000071{
72 // Create FlatBuffer BaseLayer
73 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
74
75 // Create FlatBuffer BindableBaseLayer
76 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
77 flatBufferInputBaseLayer,
78 id);
Mike Kelly8c1701a2019-02-11 17:01:27 +000079 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000080 m_inputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +000081
82 // Create the FlatBuffer InputLayer
83 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
84
85 // Add the AnyLayer to the FlatBufferLayers
86 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
87}
88
89// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000090void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000091{
92 // Create FlatBuffer BaseLayer
93 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
94
95 // Create FlatBuffer BindableBaseLayer
96 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
97 flatBufferOutputBaseLayer,
98 id);
99 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000100 m_outputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000101
102 // Create the FlatBuffer OutputLayer
103 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
104 // Add the AnyLayer to the FlatBufferLayers
105 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
106}
107
Mike Kellyaf484012019-02-20 16:53:11 +0000108// Build FlatBuffer for Activation Layer
109void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
110 const armnn::ActivationDescriptor& descriptor,
111 const char* name)
112{
113 // Create FlatBuffer BaseLayer
114 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
115
116 // Create the FlatBuffer ActivationDescriptor
117 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
118 GetFlatBufferActivationFunction(descriptor.m_Function),
119 descriptor.m_A,
120 descriptor.m_B);
121
122 // Create the FlatBuffer ActivationLayer
123 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
124 flatBufferBaseLayer,
125 flatBufferDescriptor);
126
127 // Add the AnyLayer to the FlatBufferLayers
128 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
129}
130
Mike Kelly8c1701a2019-02-11 17:01:27 +0000131// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000132void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000133{
134 // Create FlatBuffer BaseLayer
135 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
136
137 // Create the FlatBuffer AdditionLayer
138 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
139
140 // Add the AnyLayer to the FlatBufferLayers
141 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
142}
143
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000144// Build FlatBuffer for BatchToSpaceNd Layer
145void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
146 const armnn::BatchToSpaceNdDescriptor& descriptor,
147 const char* name)
148{
149 // Create FlatBuffer BaseLayer
150 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
151
152 std::vector<unsigned int> crops;
153 crops.reserve(descriptor.m_Crops.size() * 2);
154 for (auto& crop : descriptor.m_Crops)
155 {
156 crops.push_back(crop.first);
157 crops.push_back(crop.second);
158 }
159
160 auto flatBufferDescriptor =
161 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
162 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
163 m_flatBufferBuilder.CreateVector(crops),
164 GetFlatBufferDataLayout(descriptor.m_DataLayout));
165
166 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
167 flatBufferBaseLayer,
168 flatBufferDescriptor);
169
170 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
171}
172
ruoyan018e7fa232019-02-28 15:09:07 +0000173void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
174 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
175 const armnn::ConstTensor& mean,
176 const armnn::ConstTensor& variance,
177 const armnn::ConstTensor& beta,
178 const armnn::ConstTensor& gamma,
179 const char* name)
180{
181 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
182 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
183 m_flatBufferBuilder,
184 batchNormDescriptor.m_Eps,
185 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
186
187 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
188 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
189 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
190 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
191 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
192 fbBatchNormalizationBaseLayer,
193 fbBatchNormalizationDescriptor,
194 fbMeanConstTensorInfo,
195 fbVarianceConstTensorInfo,
196 fbBetaConstTensorInfo,
197 fbGammaConstTensorInfo);
198
199 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
200}
201
Conor Kennedy76277882019-02-26 08:29:54 +0000202// Build FlatBuffer for Constant Layer
203void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
204 const armnn::ConstTensor& input,
205 const char* name)
206{
207 // Create FlatBuffer BaseLayer
208 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
209
210 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
211
212 // Create the FlatBuffer ConstantLayer
213 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
214 flatBufferConstantBaseLayer,
215 flatBufferConstTensorInfo);
216
217 // Add the AnyLayer to the FlatBufferLayers
218 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
219}
220
Mike Kellya0766c32019-02-19 17:22:07 +0000221// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000222void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
223 const armnn::Convolution2dDescriptor& descriptor,
224 const armnn::ConstTensor& weights,
225 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000226 const char* name)
227{
228 // Create FlatBuffer BaseLayer
229 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
230
231 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
232 descriptor.m_PadLeft,
233 descriptor.m_PadRight,
234 descriptor.m_PadTop,
235 descriptor.m_PadBottom,
236 descriptor.m_StrideX,
237 descriptor.m_StrideY,
238 descriptor.m_BiasEnabled,
239 GetFlatBufferDataLayout(descriptor.m_DataLayout));
240 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
241 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
242
243 if (biases.has_value())
244 {
245 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
246 }
247
248 // Create the FlatBuffer Convolution2dLayer
249 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
250 flatBufferBaseLayer,
251 flatBufferDescriptor,
252 flatBufferWeightsConstTensorInfo,
253 flatBufferBiasesConstTensorInfo);
254
255 // Add the AnyLayer to the FlatBufferLayers
256 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
257}
258
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000259void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
260 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
261 const armnn::ConstTensor& weights,
262 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000263 const char* name)
264{
265 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
266 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
267 descriptor.m_PadLeft,
268 descriptor.m_PadRight,
269 descriptor.m_PadTop,
270 descriptor.m_PadBottom,
271 descriptor.m_StrideX,
272 descriptor.m_StrideY,
273 descriptor.m_BiasEnabled,
274 GetFlatBufferDataLayout(descriptor.m_DataLayout));
275
276 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
277 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
278 if (biases.has_value())
279 {
280 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
281 }
282
283 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
284 fbBaseLayer,
285 fbDescriptor,
286 fbWeightsConstTensorInfo,
287 fbBiasesConstTensorInfo);
288
289 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
290}
291
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000292void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
293 const armnn::DetectionPostProcessDescriptor& descriptor,
294 const armnn::ConstTensor& anchors,
295 const char* name)
296{
297 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
298 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
299 descriptor.m_MaxDetections,
300 descriptor.m_MaxClassesPerDetection,
301 descriptor.m_DetectionsPerClass,
302 descriptor.m_NmsScoreThreshold,
303 descriptor.m_NmsIouThreshold,
304 descriptor.m_NumClasses,
305 descriptor.m_UseRegularNms,
306 descriptor.m_ScaleX,
307 descriptor.m_ScaleY,
308 descriptor.m_ScaleW,
309 descriptor.m_ScaleH);
310
311 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
312
313 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
314 fbBaseLayer,
315 fbDescriptor,
316 fbAnchorsConstTensorInfo);
317
318 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
319}
320
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000321void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
322{
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000323 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
324 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000325
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000326 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
327}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000328
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000329void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
330{
331 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
332 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
333
334 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
335}
336
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000337void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
338{
339 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
340 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
341
342 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
343}
344
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000345void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
346{
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000347 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
348 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000349
350 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
351}
352
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000353void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
354{
355 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000356 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000357
358 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
359}
360
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000361void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
362 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
363 const char* name)
364{
365 // Create FlatBuffer BaseLayer
366 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
367
368 // Create the FlatBuffer L2Normalization Descriptor
369 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
370 m_flatBufferBuilder, GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout));
371
372 // Create Flatuffer layer
373 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
374
375 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
376}
377
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000378void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
379{
380 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
381 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
382
383 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
384}
385
386void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
387 const armnn::MeanDescriptor& descriptor,
388 const char* name)
389{
390 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
391 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
392 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
393 descriptor.m_KeepDims);
394
395 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
396 fbMeanBaseLayer,
397 fbMeanDescriptor);
398
399 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
400}
401
402void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
403{
404 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
405 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
406
407 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
408}
409
Jim Flynnac25a1b2019-02-28 10:40:49 +0000410void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
411 const armnn::OriginsDescriptor& mergerDescriptor,
412 const char* name)
413{
414 auto flatBufferMergerBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merger);
415
416 std::vector<flatbuffers::Offset<UintVector>> views;
417 for (unsigned int v = 0; v < mergerDescriptor.GetNumViews(); ++v)
418 {
419 const uint32_t* origin = mergerDescriptor.GetViewOrigin(v);
420 std::vector<uint32_t> origins;
421 for (unsigned int d = 0; d < mergerDescriptor.GetNumDimensions(); ++d)
422 {
423 origins.push_back(origin[d]);
424 }
425 auto view = m_flatBufferBuilder.CreateVector(origins);
426 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
427 views.push_back(uintVector);
428 }
429
430 auto flatBufferMergerDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
431 mergerDescriptor.GetConcatAxis(),
432 mergerDescriptor.GetNumViews(),
433 mergerDescriptor.GetNumDimensions(),
434 m_flatBufferBuilder.CreateVector(views));
435
436 auto flatBufferLayer = CreateMergerLayer(m_flatBufferBuilder,
437 flatBufferMergerBaseLayer,
438 flatBufferMergerDescriptor);
439
440 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_MergerLayer);
441}
442
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000443void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000444{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000445 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
446 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
447 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000448
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000449 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000450}
451
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000452void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
453 const armnn::PadDescriptor& padDescriptor,
454 const char* name)
455{
456 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
457
458 std::vector<unsigned int> padList;
459 for (auto& p: padDescriptor.m_PadList)
460 {
461 padList.push_back(p.first);
462 padList.push_back(p.second);
463 }
464
465 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
466 m_flatBufferBuilder.CreateVector(padList));
467
468 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
469 flatBufferBaseLayer,
470 flatBufferPadDesc);
471
472 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
473}
474
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000475void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
476 const armnn::PermuteDescriptor& permuteDescriptor,
477 const char* name)
478{
479 // Create FlatBuffer BaseLayer
480 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
481
482 std::vector<unsigned int> dimMappings;
483 for (auto& v: permuteDescriptor.m_DimMappings)
484 {
485 dimMappings.push_back(v);
486 }
487
488 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
489 m_flatBufferBuilder.CreateVector(dimMappings));
490
491 // Create the FlatBuffer PermuteLayer
492 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
493 flatBufferPermuteBaseLayer,
494 flatBufferPermuteDesc);
495
496 // Add the AnyLayer to the FlatBufferLayers
497 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
498}
499
Saoirse Stewart263829c2019-02-19 15:54:14 +0000500// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000501void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000502 const armnn::ReshapeDescriptor& reshapeDescriptor,
503 const char* name)
504{
505 // Create FlatBuffer BaseLayer
506 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
507
508 std::vector<unsigned int> targetShape;
509 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
510 {
511 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
512 }
513
514 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
515 m_flatBufferBuilder.CreateVector(targetShape));
516
517 // Create the FlatBuffer ReshapeLayer
518 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
519 flatBufferReshapeDesc);
520
521 // Add the AnyLayer to the FlatBufferLayers
522 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
523}
524
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000525void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
526 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
527 const char* name)
528{
529 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
530
531 auto flatBufferDescriptor =
532 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
533 resizeDescriptor.m_TargetWidth,
534 resizeDescriptor.m_TargetHeight,
535 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
536
537 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
538 flatBufferBaseLayer,
539 flatBufferDescriptor);
540
541 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
542}
543
Sadik Armagan8b42a382019-03-01 14:24:49 +0000544void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
545{
546 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
547 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
548
549 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
550}
551
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000552// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000553void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
554 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000555 const char* name)
556{
557 // Create FlatBuffer BaseLayer
558 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
559
560 // Create the FlatBuffer SoftmaxDescriptor
561 auto flatBufferSoftmaxDesc =
562 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
563
564 // Create the FlatBuffer SoftmaxLayer
565 auto flatBufferSoftmaxLayer =
566 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
567 flatBufferSoftmaxBaseLayer,
568 flatBufferSoftmaxDesc);
569
570 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
571}
572
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000573void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
574 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000575 const char* name)
576{
577 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
578 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
579 m_flatBufferBuilder,
580 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
581 pooling2dDescriptor.m_PadLeft,
582 pooling2dDescriptor.m_PadRight,
583 pooling2dDescriptor.m_PadTop,
584 pooling2dDescriptor.m_PadBottom,
585 pooling2dDescriptor.m_PoolWidth,
586 pooling2dDescriptor.m_PoolHeight,
587 pooling2dDescriptor.m_StrideX,
588 pooling2dDescriptor.m_StrideY,
589 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
590 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
591 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
592
593 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
594 fbPooling2dBaseLayer,
595 fbPooling2dDescriptor);
596
597 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
598}
599
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000600// Build FlatBuffer for FullyConnected Layer
601void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
602 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
603 const armnn::ConstTensor& weights,
604 const armnn::Optional<armnn::ConstTensor>& biases,
605 const char* name)
606{
607 // Create FlatBuffer BaseLayer
608 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
609
610 // Create FlatBuffer FullyConnectedDescriptor
611 auto flatBufferDescriptor =
612 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
613 fullyConnectedDescriptor.m_BiasEnabled,
614 fullyConnectedDescriptor.m_TransposeWeightMatrix);
615
616 // Create FlatBuffer weights data
617 auto flatBufferWeights = CreateConstTensorInfo(weights);
618
619 // Create FlatBuffer bias data
620 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
621 if (fullyConnectedDescriptor.m_BiasEnabled)
622 {
623 flatBufferBiases = CreateConstTensorInfo(biases.value());
624 }
625
626 // Create FlatBuffer FullyConnectedLayer
627 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
628 flatBufferBaseLayer,
629 flatBufferDescriptor,
630 flatBufferWeights,
631 flatBufferBiases);
632
633 // Add created FullyConnectedLayer to the FlatBufferLayers
634 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
635}
636
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000637// Build FlatBuffer for SpaceToBatchNd Layer
638void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
639 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
640 const char* name)
641{
642 // Create FlatBuffer BaseLayer
643 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
644
645 std::vector<unsigned int> padList;
646 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
647 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
648 {
649 padList.push_back(pad.first);
650 padList.push_back(pad.second);
651 }
652
653 auto flatBufferDescriptor =
654 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
655 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
656 m_flatBufferBuilder.CreateVector(padList),
657 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
658
659 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
660 flatBufferBaseLayer,
661 flatBufferDescriptor);
662
663 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
664}
665
Jim Flynn18ce3382019-03-08 11:08:30 +0000666// Build FlatBuffer for Splitter Layer
667void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
668 const armnn::ViewsDescriptor& viewsDescriptor,
669 const char* name)
670{
671 // Create FlatBuffer ViewOrigins
672 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
673 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
674
675 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
676 {
677 std::vector<uint32_t> viewOrigin;
678 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
679
680 // Copy vector
681 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
682 {
683 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
684 }
685
686 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
687 m_flatBufferBuilder.CreateVector(viewOrigin)));
688 }
689
690 // Create FlatBuffer OriginsDescriptor
691 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
692 viewsDescriptor.GetOrigins().GetConcatAxis(),
693 viewsDescriptor.GetOrigins().GetNumViews(),
694 viewsDescriptor.GetOrigins().GetNumDimensions(),
695 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
696
697 // Create FlatBuffer ViewOrigins
698 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
699 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
700
701 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
702 {
703 std::vector<uint32_t> viewSize;
704 viewSize.reserve(viewsDescriptor.GetNumDimensions());
705
706 // Copy vector
707 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
708 {
709 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
710 }
711
712 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
713 m_flatBufferBuilder.CreateVector(viewSize)));
714 }
715
716 // Create FlatBuffer ViewsDescriptor
717 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
718 flatBufferOriginDescriptor,
719 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
720
721 // Create FlatBuffer BaseLayer
722 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
723
724 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
725 flatBufferBaseLayer,
726 flatBufferViewsDescriptor);
727
728 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
729}
730
Nina Drozd57728782019-02-27 10:53:27 +0000731void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
732 const armnn::NormalizationDescriptor& descriptor,
733 const char* name)
734{
735 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
736
737 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
738 m_flatBufferBuilder,
739 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
740 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
741 descriptor.m_NormSize,
742 descriptor.m_Alpha,
743 descriptor.m_Beta,
744 descriptor.m_K,
745 GetFlatBufferDataLayout(descriptor.m_DataLayout));
746
747 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
748 fbNormalizationBaseLayer,
749 fbNormalizationDescriptor);
750
751 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
752}
753
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +0000754void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
755 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
756 const char* name)
757{
758 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
759
760 auto flatBufferDescriptor =
761 CreateStridedSliceDescriptor(m_flatBufferBuilder,
762 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
763 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
764 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
765 stridedSliceDescriptor.m_BeginMask,
766 stridedSliceDescriptor.m_EndMask,
767 stridedSliceDescriptor.m_ShrinkAxisMask,
768 stridedSliceDescriptor.m_EllipsisMask,
769 stridedSliceDescriptor.m_NewAxisMask,
770 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
771
772 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
773 flatBufferBaseLayer,
774 flatBufferDescriptor);
775
776 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
777}
778
Conor Kennedyda1f9752019-03-01 14:37:12 +0000779void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
780{
781 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
782 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
783
784 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
785}
786
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000787fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000788 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000789{
790 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
791 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
792
793 return serializer::CreateLayerBase(m_flatBufferBuilder,
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000794 GetSerializedId(layer->GetGuid()),
Mike Kelly8c1701a2019-02-11 17:01:27 +0000795 m_flatBufferBuilder.CreateString(layer->GetName()),
796 layerType,
797 m_flatBufferBuilder.CreateVector(inputSlots),
798 m_flatBufferBuilder.CreateVector(outputSlots));
799}
800
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000801void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000802{
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000803 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000804 m_serializedLayers.push_back(anyLayer);
805}
806
Mike Kellya0766c32019-02-19 17:22:07 +0000807template <typename T>
808flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
809{
810 const T* buffer = reinterpret_cast<const T*>(memory);
811 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
812 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
813 return fbVector;
814}
815
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000816flatbuffers::Offset<serializer::ConstTensor>
817 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +0000818{
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000819 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +0000820
821 // Get the dimensions
822 std::vector<unsigned int> shape;
823
824 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
825 {
826 shape.push_back(tensorInfo.GetShape()[dim]);
827 }
828
829 // Create FlatBuffer TensorInfo
830 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
831 m_flatBufferBuilder.CreateVector(shape),
832 GetFlatBufferDataType(tensorInfo.GetDataType()),
833 tensorInfo.GetQuantizationScale(),
834 tensorInfo.GetQuantizationOffset());
835 flatbuffers::Offset<void> fbPayload;
836
837 switch (tensorInfo.GetDataType())
838 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000839 case armnn::DataType::Float32:
840 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +0000841 {
842 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
843 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
844 m_flatBufferBuilder,
845 fbVector);
846 fbPayload = flatBuffersData.o;
847 break;
848 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000849 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +0000850 {
851 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
852 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
853 m_flatBufferBuilder,
854 fbVector);
855 fbPayload = flatBuffersData.o;
856 break;
857 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000858 case armnn::DataType::QuantisedAsymm8:
859 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +0000860 default:
861 {
862 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
863 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
864 m_flatBufferBuilder,
865 fbVector);
866 fbPayload = flatBuffersData.o;
867 }
868 }
869 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
870 m_flatBufferBuilder,
871 flatBufferTensorInfo,
872 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
873 fbPayload);
874 return flatBufferConstTensor;
875}
876
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000877std::vector<fb::Offset<serializer::InputSlot>>
878 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000879{
Mike Kellya0766c32019-02-19 17:22:07 +0000880 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +0000881
882 // Get the InputSlots
883 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
884 {
885 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
886
887 // Get the Connection for the InputSlot
888 const IOutputSlot* connection = inputSlot.GetConnection();
889
890 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000891 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
892 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +0000893 // Create FlatBuffer InputSlot
894 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
895 }
896 return inputSlots;
897}
898
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000899std::vector<fb::Offset<serializer::OutputSlot>>
900 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000901{
902 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
903
904 // Get the OutputSlots
905 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
906 {
907 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000908 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +0000909
910 // Get the dimensions
911 std::vector<unsigned int> shape;
912 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
913 {
914 shape.push_back(tensorInfo.GetShape()[dim]);
915 }
916
917 // Create FlatBuffer TensorInfo
918 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
919 m_flatBufferBuilder.CreateVector(shape),
920 GetFlatBufferDataType(tensorInfo.GetDataType()),
921 tensorInfo.GetQuantizationScale(),
922 tensorInfo.GetQuantizationOffset());
923
924 // Create FlatBuffer Outputslot
925 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
926 slotIndex,
927 flatBufferTensorInfo));
928 }
929 return outputSlots;
930}
931
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000932
933ISerializer* ISerializer::CreateRaw()
934{
935 return new Serializer();
936}
937
938ISerializerPtr ISerializer::Create()
939{
940 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
941}
942
943void ISerializer::Destroy(ISerializer* serializer)
944{
945 delete serializer;
946}
947
948void Serializer::Serialize(const INetwork& inNetwork)
949{
950 // Iterate through to network
951 inNetwork.Accept(m_SerializerVisitor);
952 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
953
954 // Create FlatBuffer SerializedGraph
955 auto serializedGraph = serializer::CreateSerializedGraph(
956 fbBuilder,
957 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
958 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
959 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
960
961 // Serialize the graph
962 fbBuilder.Finish(serializedGraph);
963}
964
965bool Serializer::SaveSerializedToStream(std::ostream& stream)
966{
967 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
968
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +0000969 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
970 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000971 return !stream.bad();
972}
973
Matteo Martincighec333912019-02-13 15:12:39 +0000974} // namespace armnnSerializer