namespace ov::op

namespace op {

// namespaces

namespace ov::op::ShapeInferLSTM;
namespace ov::op::ShapeInferRange;
namespace ov::op::internal;
namespace ov::op::rnn;
namespace ov::op::util;
    namespace ov::op::util::detail;
    namespace ov::op::util::error;
    namespace ov::op::util::rfft_common_validation;
namespace ov::op::v0;
namespace ov::op::v1;
namespace ov::op::v10;
namespace ov::op::v3;
namespace ov::op::v4;
namespace ov::op::v5;
namespace ov::op::v6;
namespace ov::op::v7;
namespace ov::op::v8;
namespace ov::op::v9;

// enums

enum AutoBroadcastType;
enum BroadcastType;
enum EpsMode;
enum GeluApproximationMode;
enum LSTMWeightsFormat;
enum MVNEpsMode;
enum PadMode;
enum PadType;
enum RecurrentSequenceDirection;
enum RoundingType;
enum TopKMode;
enum TopKSortType;

// structs

struct AutoBroadcastSpec;
struct BroadcastModeSpec;

// classes

class Op;
class Sink;
class TemporaryReplaceOutputType;
template <typename BaseOp>
class TypeRelaxed;
class TypeRelaxedBase;

// global functions

OPENVINO_API std::ostream& operator << (
    std::ostream& s,
    const GeluApproximationMode& type
    );

ov::op::util::LSTMWeightsFormat convert_lstm_weights_enums(LSTMWeightsFormat format);
OPENVINO_API std::ostream& operator << (std::ostream& s, const MVNEpsMode& type);
OPENVINO_API std::ostream& operator << (std::ostream& s, const PadMode& type);
OPENVINO_API std::ostream& operator << (std::ostream& s, const PadType& type);
OPENVINO_API std::ostream& operator << (std::ostream& s, const RoundingType& type);

OPENVINO_API std::ostream& operator << (
    std::ostream& s,
    const AutoBroadcastType& type
    );

OPENVINO_API std::ostream& operator << (
    std::ostream& s,
    const BroadcastType& type
    );

OPENVINO_API std::ostream& operator << (std::ostream& s, const EpsMode& type);
OPENVINO_API std::ostream& operator << (std::ostream& s, const TopKSortType& type);
OPENVINO_API std::ostream& operator << (std::ostream& s, const TopKMode& type);

OPENVINO_API std::ostream& operator << (
    std::ostream& s,
    const RecurrentSequenceDirection& direction
    );

template <class T>
void shape_infer(
    const ov::op::v9::Eye \* 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 OpType, class ShapeType>
void read_value_shape_infer(
    const OpType \* op,
    const std::vector<ShapeType>& input_shapes,
    std::vector<ShapeType>& output_shapes
    );

} // namespace op