| #include <torch/extension.h> | |
| #include <cstddef> | |
| #include <string> | |
| struct Net : torch::nn::Cloneable<Net> { | |
| Net(int64_t in, int64_t out) : in_(in), out_(out) { | |
| reset(); | |
| } | |
| void reset() override { | |
| fc = register_module("fc", torch::nn::Linear(in_, out_)); | |
| buffer = register_buffer("buf", torch::eye(5)); | |
| } | |
| torch::Tensor forward(torch::Tensor x) { | |
| return fc->forward(x); | |
| } | |
| void set_bias(torch::Tensor bias) { | |
| torch::NoGradGuard guard; | |
| fc->bias.set_(bias); | |
| } | |
| torch::Tensor get_bias() const { | |
| return fc->bias; | |
| } | |
| void add_new_parameter(const std::string& name, torch::Tensor tensor) { | |
| register_parameter(name, tensor); | |
| } | |
| void add_new_buffer(const std::string& name, torch::Tensor tensor) { | |
| register_buffer(name, tensor); | |
| } | |
| void add_new_submodule(const std::string& name) { | |
| register_module(name, torch::nn::Linear(fc->options)); | |
| } | |
| int64_t in_, out_; | |
| torch::nn::Linear fc{nullptr}; | |
| torch::Tensor buffer; | |
| }; | |
| PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { | |
| torch::python::bind_module<Net>(m, "Net") | |
| .def(py::init<int64_t, int64_t>()) | |
| .def("set_bias", &Net::set_bias) | |
| .def("get_bias", &Net::get_bias) | |
| .def("add_new_parameter", &Net::add_new_parameter) | |
| .def("add_new_buffer", &Net::add_new_buffer) | |
| .def("add_new_submodule", &Net::add_new_submodule); | |
| } |