diff options
Diffstat (limited to 'src/armnn/layers/TileLayer.cpp')
-rw-r--r-- | src/armnn/layers/TileLayer.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/armnn/layers/TileLayer.cpp b/src/armnn/layers/TileLayer.cpp new file mode 100644 index 0000000000..3c313905fe --- /dev/null +++ b/src/armnn/layers/TileLayer.cpp @@ -0,0 +1,71 @@ +// +// Copyright © 2023 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "TileLayer.hpp" + +#include <armnn/backends/WorkloadFactory.hpp> +#include "layers/LayerCloneBase.hpp" + +namespace armnn +{ +TileLayer::TileLayer(const TileDescriptor ¶m, const char *name) + : LayerWithParameters(1, 1, LayerType::Tile, param, name) +{} + +std::unique_ptr<IWorkload> TileLayer::CreateWorkload(const IWorkloadFactory &factory) const +{ + TileQueueDescriptor descriptor; + SetAdditionalInfo(descriptor); + + return factory.CreateWorkload(LayerType::Tile, descriptor, PrepInfoAndDesc(descriptor)); +} + +TileLayer* TileLayer::Clone(armnn::Graph &graph) const +{ + auto layer = CloneBase<TileLayer>(graph, m_Param, GetName()); + + return std::move(layer); +} + +std::vector<TensorShape> TileLayer::InferOutputShapes(const std::vector<TensorShape>& inputShapes) const +{ + ARMNN_ASSERT(inputShapes.size() == 1); + const TensorShape& inputShape = inputShapes[0]; + const std::vector<uint32_t> multipleShape = m_Param.m_Multiples; + + std::vector<unsigned int> dimSizes; + + // Check input shape and multiples have same length and multiply them together to get output shape + if(inputShape.GetNumDimensions() == multipleShape.size()) + { + for(uint32_t i = 0; i < inputShape.GetNumDimensions(); ++i) + { + dimSizes.insert(dimSizes.begin(), inputShape[i] * multipleShape[i]); + } + } + else + { + throw LayerValidationException("TileLayer: input rank and length of multiples are different."); + } + + return std::vector<TensorShape>({TensorShape({inputShape.GetNumElements(), dimSizes.data()})}); +} + +void TileLayer::ValidateTensorShapesFromInputs() +{ + VerifyLayerConnections(1, CHECK_LOCATION()); + + const TensorShape& outputShape = GetOutputSlot(0).GetTensorInfo().GetShape(); + + VerifyShapeInferenceType(outputShape, m_ShapeInferenceMethod); + + auto inferredShapes = InferOutputShapes({ GetInputSlot(0).GetTensorInfo().GetShape() }); + + ARMNN_ASSERT(inferredShapes.size() == 1); + + ValidateAndCopyShape(outputShape, inferredShapes[0], m_ShapeInferenceMethod, "TileLayer"); +} + +}
\ No newline at end of file |