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 TShape, class TRShape = result_shape_t<TShape>>
std::vector<TRShape> shape_infer(
    const Assign \* op,
    const std::vector<TShape>& input_shapes
    );

template <class T, class TRShape = result_shape_t<T>>
std::vector<TRShape> shape_infer(
    const ov::op::v3::Broadcast \* op,
    const std::vector<T>& input_shapes,
    const ITensorAccessor& ta = make_tensor_accessor()
    );

template <class TShape, class TRShape = result_shape_t<TShape>>
std::vector<TRShape> shape_infer(
    const Bucketize \* op,
    const std::vector<TShape>& input_shapes
    );

template <class TShape, class TRShape = result_shape_t<TShape>>
std::vector<TRShape> shape_infer(
    const EmbeddingSegmentsSum \* op,
    const std::vector<TShape>& input_shapes,
    const ITensorAccessor& ta = make_tensor_accessor()
    );

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

template <class TShape, class TRShape = result_shape_t<TShape>>
std::vector<TRShape> shape_infer(
    const GRUCell \* op,
    const std::vector<TShape>& input_shapes
    );

template <class T, class TRShape = result_shape_t<T>>
std::vector<TRShape> shape_infer(
    const NonMaxSuppression \* op,
    const std::vector<T>& input_shapes,
    const ITensorAccessor& ta = make_tensor_accessor()
    );

template <class TShape, class TRShape = result_shape_t<TShape>>
std::vector<TRShape> shape_infer(
    const ROIAlign \* op,
    const std::vector<TShape>& input_shapes
    );

template <class TShape, class TRShape = result_shape_t<TShape>>
std::vector<TRShape> shape_infer(
    const ShapeOf \* op,
    const std::vector<TShape>& input_shapes
    );

} // namespace v3