#pragma once

namespace mgb::imperative::python {

PyObject* dtype_promotion(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* get_device(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* make_shape_tuple(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* getitem_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* setitem_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* split_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* expand_dims_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* squeeze_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* transpose_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* broadcast_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* reshape_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* adaptive_pool2d_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* Const(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* astype_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* matmul_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* batched_matmul_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* convert_single_value_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* convert_inputs_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* astensor1d_cpp(PyObject* self, PyObject* const* args, size_t nargs);

PyObject* pixel_shuffle_cpp(PyObject* self, PyObject* const* args, size_t nargs);

}  // namespace mgb::imperative::python