namespace ov::op::v3

namespace v3 {

// classes

class Acosh;
class Asinh;
class Assign;
class Atanh;
class Broadcast;
class Bucketize;
class EmbeddingBagOffsetsSum;
class EmbeddingBagPackedSum;
class EmbeddingSegmentsSum;
class ExtractImagePatches;
class GRUCell;
class NonMaxSuppression;
class NonZero;
class ROIAlign;
class ReadValue;
class ScatterElementsUpdate;
class ScatterNDUpdate;
class ScatterUpdate;
class ShapeOf;
class TopK;

// global functions

template <class T>
void shape_infer(
    const Assign \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes
    );

template <class T>
void shape_infer(
    const ov::op::v3::Broadcast \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes,
    const std::map<size_t, std::shared_ptr<ngraph::runtime::HostTensor>>& constant_data = {}
    );

template <class T>
void shape_infer(
    const Bucketize \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes
    );

template <class T>
void shape_infer(
    const EmbeddingSegmentsSum \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes,
    const std::map<size_t, std::shared_ptr<ngraph::runtime::HostTensor>>& constant_data = {}
    );

int32_t calc_shape_padding(
    const int32_t input,
    const int32_t rate,
    const int32_t stride,
    const int32_t patch_size,
    const PadType type
    );

template <class T>
void shape_infer(
    const ExtractImagePatches \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes
    );

template <class ShapeType>
void shape_infer(
    const ov::op::v3::GRUCell \* op,
    const std::vector<ShapeType>& input_shapes,
    std::vector<ShapeType>& output_shapes
    );

template <class T>
void shape_infer(
    const ReadValue \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes
    );

template <class OpType, class ShapeType>
void infer_roi_align_shape(
    const OpType \* op,
    const std::vector<ShapeType>& input_shapes,
    std::vector<ShapeType>& output_shapes
    );

template <class T>
void shape_infer(
    const ov::op::v3::ROIAlign \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes
    );

template <class T>
void shape_infer(
    const ScatterElementsUpdate \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes,
    const std::map<size_t, std::shared_ptr<ngraph::runtime::HostTensor>>& constant_data = {}
    );

} // namespace v3