//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#pragma once

#include <armnn/ArmNN.hpp>

namespace armnn_driver
{

armnn::TensorShape InferConvolution2dOutputShape(const armnn::TensorShape& inputShape,
                                                 const armnn::TensorShape& kernelShape,
                                                 const armnn::Convolution2dDescriptor& descriptor);

armnn::TensorShape InferDepthwiseConvolution2dOutputShape(const armnn::TensorShape& inputShape,
                                                          const armnn::TensorShape& kernelShape,
                                                          const armnn::DepthwiseConvolution2dDescriptor& descriptor);

armnn::TensorShape InferMaximumOutputShape(const armnn::TensorShape& input0Shape,
                                           const armnn::TensorShape& input1Shape);

armnn::TensorShape InferMinimumOutputShape(const armnn::TensorShape& input0Shape,
                                           const armnn::TensorShape& input1Shape);

armnn::TensorShape InferPadOutputShape(const armnn::TensorShape& inputShape,
                                       const std::vector<std::pair<unsigned int, unsigned int>>& padList);

armnn::TensorShape InferPreluOutputShape(const armnn::TensorShape& inputShape, const armnn::TensorShape& alphaShape);

armnn::TensorShape InferResizeOutputShape(const armnn::TensorShape& inputShape,
                                          const armnn::ResizeDescriptor& descriptor);

armnn::TensorShape InferSpaceToDepthOutputShape(const armnn::TensorShape& inputShape,
                                                const armnn::SpaceToDepthDescriptor& descriptor);

armnn::TensorShape InferSubOutputShape(const armnn::TensorShape& input0Shape, const armnn::TensorShape& input1Shape);

} // namespace armnn_driver
