blob: b85c45aa102be7ce24f0247dcf32ff0110c5e8bd [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
Mike Kelly8c1701a2019-02-11 17:01:27 +000014#include <Schema_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
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000025uint32_t SerializerVisitor::GetSerializedId(unsigned int guid)
26{
27 std::pair<unsigned int, uint32_t> guidPair(guid, m_layerId);
28
29 if (m_guidMap.empty())
30 {
31 m_guidMap.insert(guidPair);
32 }
33 else if (m_guidMap.find(guid) == m_guidMap.end())
34 {
35 guidPair.second = ++m_layerId;
36 m_guidMap.insert(guidPair);
37 return m_layerId;
38 }
Saoirse Stewart30211042019-02-18 17:19:16 +000039 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000040}
41
Mike Kelly8c1701a2019-02-11 17:01:27 +000042// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000043void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000044{
45 // Create FlatBuffer BaseLayer
46 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
47
48 // Create FlatBuffer BindableBaseLayer
49 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
50 flatBufferInputBaseLayer,
51 id);
Mike Kelly8c1701a2019-02-11 17:01:27 +000052 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000053 m_inputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +000054
55 // Create the FlatBuffer InputLayer
56 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
57
58 // Add the AnyLayer to the FlatBufferLayers
59 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
60}
61
62// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000063void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000064{
65 // Create FlatBuffer BaseLayer
66 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
67
68 // Create FlatBuffer BindableBaseLayer
69 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
70 flatBufferOutputBaseLayer,
71 id);
72 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000073 m_outputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +000074
75 // Create the FlatBuffer OutputLayer
76 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
77 // Add the AnyLayer to the FlatBufferLayers
78 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
79}
80
81// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000082void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000083{
84 // Create FlatBuffer BaseLayer
85 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
86
87 // Create the FlatBuffer AdditionLayer
88 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
89
90 // Add the AnyLayer to the FlatBufferLayers
91 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
92}
93
Mike Kellya0766c32019-02-19 17:22:07 +000094// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000095void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
96 const armnn::Convolution2dDescriptor& descriptor,
97 const armnn::ConstTensor& weights,
98 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +000099 const char* name)
100{
101 // Create FlatBuffer BaseLayer
102 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
103
104 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
105 descriptor.m_PadLeft,
106 descriptor.m_PadRight,
107 descriptor.m_PadTop,
108 descriptor.m_PadBottom,
109 descriptor.m_StrideX,
110 descriptor.m_StrideY,
111 descriptor.m_BiasEnabled,
112 GetFlatBufferDataLayout(descriptor.m_DataLayout));
113 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
114 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
115
116 if (biases.has_value())
117 {
118 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
119 }
120
121 // Create the FlatBuffer Convolution2dLayer
122 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
123 flatBufferBaseLayer,
124 flatBufferDescriptor,
125 flatBufferWeightsConstTensorInfo,
126 flatBufferBiasesConstTensorInfo);
127
128 // Add the AnyLayer to the FlatBufferLayers
129 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
130}
131
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000132void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
133 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
134 const armnn::ConstTensor& weights,
135 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000136 const char* name)
137{
138 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
139 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
140 descriptor.m_PadLeft,
141 descriptor.m_PadRight,
142 descriptor.m_PadTop,
143 descriptor.m_PadBottom,
144 descriptor.m_StrideX,
145 descriptor.m_StrideY,
146 descriptor.m_BiasEnabled,
147 GetFlatBufferDataLayout(descriptor.m_DataLayout));
148
149 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
150 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
151 if (biases.has_value())
152 {
153 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
154 }
155
156 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
157 fbBaseLayer,
158 fbDescriptor,
159 fbWeightsConstTensorInfo,
160 fbBiasesConstTensorInfo);
161
162 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
163}
164
Sadik Armagan5f450272019-02-12 14:31:45 +0000165// Build FlatBuffer for Multiplication Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000166void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000167{
168 // Create FlatBuffer BaseLayer
169 auto flatBufferMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
170
171 // Create the FlatBuffer MultiplicationLayer
172 auto flatBufferMultiplicationLayer =
173 serializer::CreateMultiplicationLayer(m_flatBufferBuilder, flatBufferMultiplicationBaseLayer);
174
175 // Add the AnyLayer to the FlatBufferLayers
176 CreateAnyLayer(flatBufferMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
177}
178
Saoirse Stewart263829c2019-02-19 15:54:14 +0000179// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000180void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000181 const armnn::ReshapeDescriptor& reshapeDescriptor,
182 const char* name)
183{
184 // Create FlatBuffer BaseLayer
185 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
186
187 std::vector<unsigned int> targetShape;
188 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
189 {
190 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
191 }
192
193 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
194 m_flatBufferBuilder.CreateVector(targetShape));
195
196 // Create the FlatBuffer ReshapeLayer
197 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
198 flatBufferReshapeDesc);
199
200 // Add the AnyLayer to the FlatBufferLayers
201 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
202}
203
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000204// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000205void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
206 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000207 const char* name)
208{
209 // Create FlatBuffer BaseLayer
210 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
211
212 // Create the FlatBuffer SoftmaxDescriptor
213 auto flatBufferSoftmaxDesc =
214 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
215
216 // Create the FlatBuffer SoftmaxLayer
217 auto flatBufferSoftmaxLayer =
218 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
219 flatBufferSoftmaxBaseLayer,
220 flatBufferSoftmaxDesc);
221
222 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
223}
224
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000225void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
226 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000227 const char* name)
228{
229 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
230 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
231 m_flatBufferBuilder,
232 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
233 pooling2dDescriptor.m_PadLeft,
234 pooling2dDescriptor.m_PadRight,
235 pooling2dDescriptor.m_PadTop,
236 pooling2dDescriptor.m_PadBottom,
237 pooling2dDescriptor.m_PoolWidth,
238 pooling2dDescriptor.m_PoolHeight,
239 pooling2dDescriptor.m_StrideX,
240 pooling2dDescriptor.m_StrideY,
241 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
242 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
243 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
244
245 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
246 fbPooling2dBaseLayer,
247 fbPooling2dDescriptor);
248
249 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
250}
251
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000252fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000253 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000254{
255 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
256 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
257
258 return serializer::CreateLayerBase(m_flatBufferBuilder,
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000259 GetSerializedId(layer->GetGuid()),
Mike Kelly8c1701a2019-02-11 17:01:27 +0000260 m_flatBufferBuilder.CreateString(layer->GetName()),
261 layerType,
262 m_flatBufferBuilder.CreateVector(inputSlots),
263 m_flatBufferBuilder.CreateVector(outputSlots));
264}
265
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000266void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000267{
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000268 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000269 m_serializedLayers.push_back(anyLayer);
270}
271
Mike Kellya0766c32019-02-19 17:22:07 +0000272template <typename T>
273flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
274{
275 const T* buffer = reinterpret_cast<const T*>(memory);
276 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
277 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
278 return fbVector;
279}
280
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000281flatbuffers::Offset<serializer::ConstTensor>
282 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +0000283{
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000284 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +0000285
286 // Get the dimensions
287 std::vector<unsigned int> shape;
288
289 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
290 {
291 shape.push_back(tensorInfo.GetShape()[dim]);
292 }
293
294 // Create FlatBuffer TensorInfo
295 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
296 m_flatBufferBuilder.CreateVector(shape),
297 GetFlatBufferDataType(tensorInfo.GetDataType()),
298 tensorInfo.GetQuantizationScale(),
299 tensorInfo.GetQuantizationOffset());
300 flatbuffers::Offset<void> fbPayload;
301
302 switch (tensorInfo.GetDataType())
303 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000304 case armnn::DataType::Float32:
305 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +0000306 {
307 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
308 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
309 m_flatBufferBuilder,
310 fbVector);
311 fbPayload = flatBuffersData.o;
312 break;
313 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000314 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +0000315 {
316 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
317 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
318 m_flatBufferBuilder,
319 fbVector);
320 fbPayload = flatBuffersData.o;
321 break;
322 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000323 case armnn::DataType::QuantisedAsymm8:
324 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +0000325 default:
326 {
327 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
328 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
329 m_flatBufferBuilder,
330 fbVector);
331 fbPayload = flatBuffersData.o;
332 }
333 }
334 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
335 m_flatBufferBuilder,
336 flatBufferTensorInfo,
337 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
338 fbPayload);
339 return flatBufferConstTensor;
340}
341
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000342std::vector<fb::Offset<serializer::InputSlot>>
343 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000344{
Mike Kellya0766c32019-02-19 17:22:07 +0000345 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +0000346
347 // Get the InputSlots
348 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
349 {
350 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
351
352 // Get the Connection for the InputSlot
353 const IOutputSlot* connection = inputSlot.GetConnection();
354
355 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000356 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
357 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +0000358 // Create FlatBuffer InputSlot
359 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
360 }
361 return inputSlots;
362}
363
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000364std::vector<fb::Offset<serializer::OutputSlot>>
365 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000366{
367 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
368
369 // Get the OutputSlots
370 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
371 {
372 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000373 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +0000374
375 // Get the dimensions
376 std::vector<unsigned int> shape;
377 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
378 {
379 shape.push_back(tensorInfo.GetShape()[dim]);
380 }
381
382 // Create FlatBuffer TensorInfo
383 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
384 m_flatBufferBuilder.CreateVector(shape),
385 GetFlatBufferDataType(tensorInfo.GetDataType()),
386 tensorInfo.GetQuantizationScale(),
387 tensorInfo.GetQuantizationOffset());
388
389 // Create FlatBuffer Outputslot
390 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
391 slotIndex,
392 flatBufferTensorInfo));
393 }
394 return outputSlots;
395}
396
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000397
398ISerializer* ISerializer::CreateRaw()
399{
400 return new Serializer();
401}
402
403ISerializerPtr ISerializer::Create()
404{
405 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
406}
407
408void ISerializer::Destroy(ISerializer* serializer)
409{
410 delete serializer;
411}
412
413void Serializer::Serialize(const INetwork& inNetwork)
414{
415 // Iterate through to network
416 inNetwork.Accept(m_SerializerVisitor);
417 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
418
419 // Create FlatBuffer SerializedGraph
420 auto serializedGraph = serializer::CreateSerializedGraph(
421 fbBuilder,
422 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
423 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
424 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
425
426 // Serialize the graph
427 fbBuilder.Finish(serializedGraph);
428}
429
430bool Serializer::SaveSerializedToStream(std::ostream& stream)
431{
432 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
433
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +0000434 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
435 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000436 return !stream.bad();
437}
438
Matteo Martincighec333912019-02-13 15:12:39 +0000439} // namespace armnnSerializer