// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include #include #include namespace armnnSerializer { class SerializerVisitor : public armnn::LayerVisitorBase { public: SerializerVisitor() : m_layerId(0) {}; ~SerializerVisitor() {} flatbuffers::FlatBufferBuilder& GetFlatBufferBuilder() { return m_flatBufferBuilder; } std::vector& GetInputIds() { return m_inputIds; } std::vector& GetOutputIds() { return m_outputIds; } std::vector>& GetSerializedLayers() { return m_serializedLayers; } void VisitActivationLayer(const armnn::IConnectableLayer* layer, const armnn::ActivationDescriptor& descriptor, const char* name = nullptr) override; void VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; void VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer, const armnn::BatchToSpaceNdDescriptor& descriptor, const char* name = nullptr) override; void VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer, const armnn::BatchNormalizationDescriptor& BatchNormalizationDescriptor, const armnn::ConstTensor& mean, const armnn::ConstTensor& variance, const armnn::ConstTensor& beta, const armnn::ConstTensor& gamma, const char* name = nullptr) override; void VisitConstantLayer(const armnn::IConnectableLayer* layer, const armnn::ConstTensor& input, const char* = nullptr) override; void VisitConvolution2dLayer(const armnn::IConnectableLayer* layer, const armnn::Convolution2dDescriptor& descriptor, const armnn::ConstTensor& weights, const armnn::Optional& biases, const char* = nullptr) override; void VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer, const armnn::DepthwiseConvolution2dDescriptor& descriptor, const armnn::ConstTensor& weights, const armnn::Optional& biases, const char* name = nullptr) override; void VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; void VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; void VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name = nullptr) override; void VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer, const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor, const armnn::ConstTensor& weights, const armnn::Optional& biases, const char* name = nullptr) override; void VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; void VisitInputLayer(const armnn::IConnectableLayer* layer, armnn::LayerBindingId id, const char* name = nullptr) override; void VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; void VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; void VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; void VisitOutputLayer(const armnn::IConnectableLayer* layer, armnn::LayerBindingId id, const char* name = nullptr) override; void VisitPadLayer(const armnn::IConnectableLayer* layer, const armnn::PadDescriptor& PadDescriptor, const char* name = nullptr) override; void VisitPermuteLayer(const armnn::IConnectableLayer* layer, const armnn::PermuteDescriptor& PermuteDescriptor, const char* name = nullptr) override; void VisitPooling2dLayer(const armnn::IConnectableLayer* layer, const armnn::Pooling2dDescriptor& pooling2dDescriptor, const char* name = nullptr) override; void VisitReshapeLayer(const armnn::IConnectableLayer* layer, const armnn::ReshapeDescriptor& reshapeDescriptor, const char* name = nullptr) override; void VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer, const armnn::ResizeBilinearDescriptor& resizeDescriptor, const char* name = nullptr) override; void VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; void VisitSoftmaxLayer(const armnn::IConnectableLayer* layer, const armnn::SoftmaxDescriptor& softmaxDescriptor, const char* name = nullptr) override; void VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer, const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor, const char* name = nullptr) override; void VisitNormalizationLayer(const armnn::IConnectableLayer* layer, const armnn::NormalizationDescriptor& normalizationDescriptor, const char* name = nullptr) override; void VisitStridedSliceLayer(const armnn::IConnectableLayer* layer, const armnn::StridedSliceDescriptor& stridedSliceDescriptor, const char* name = nullptr) override; void VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr) override; private: /// Creates the Input Slots and Output Slots and LayerBase for the layer. flatbuffers::Offset CreateLayerBase( const armnn::IConnectableLayer* layer, const armnnSerializer::LayerType layerType); /// Creates the serializer AnyLayer for the layer and adds it to m_serializedLayers. void CreateAnyLayer(const flatbuffers::Offset& layer, const armnnSerializer::Layer serializerLayer); /// Creates the serializer ConstTensor for the armnn ConstTensor. flatbuffers::Offset CreateConstTensorInfo( const armnn::ConstTensor& constTensor); template flatbuffers::Offset> CreateDataVector(const void* memory, unsigned int size); ///Function which maps Guid to an index uint32_t GetSerializedId(unsigned int guid); /// Creates the serializer InputSlots for the layer. std::vector> CreateInputSlots( const armnn::IConnectableLayer* layer); /// Creates the serializer OutputSlots for the layer. std::vector> CreateOutputSlots( const armnn::IConnectableLayer* layer); /// FlatBufferBuilder to create our layers' FlatBuffers. flatbuffers::FlatBufferBuilder m_flatBufferBuilder; /// AnyLayers required by the SerializedGraph. std::vector> m_serializedLayers; /// Guids of all Input Layers required by the SerializedGraph. std::vector m_inputIds; /// Guids of all Output Layers required by the SerializedGraph. std::vector m_outputIds; /// Mapped Guids of all Layers to match our index. std::unordered_map m_guidMap; /// layer within our FlatBuffer index. uint32_t m_layerId; }; class Serializer : public ISerializer { public: Serializer() {} ~Serializer() {} /// Serializes the network to ArmNN SerializedGraph. /// @param [in] inNetwork The network to be serialized. void Serialize(const armnn::INetwork& inNetwork) override; /// Serializes the SerializedGraph to the stream. /// @param [stream] the stream to save to /// @return true if graph is Serialized to the Stream, false otherwise bool SaveSerializedToStream(std::ostream& stream) override; private: /// Visitor to contruct serialized network SerializerVisitor m_SerializerVisitor; }; } //namespace armnnSerializer