|  | #include <torch/extension.h> | 
|  |  | 
|  | // test include_dirs in setuptools.setup with relative path | 
|  | #include <tmp.h> | 
|  |  | 
|  | torch::Tensor sigmoid_add(torch::Tensor x, torch::Tensor y) { | 
|  | return x.sigmoid() + y.sigmoid(); | 
|  | } | 
|  |  | 
|  | struct MatrixMultiplier { | 
|  | MatrixMultiplier(int A, int B) { | 
|  | tensor_ = | 
|  | torch::ones({A, B}, torch::dtype(torch::kFloat64).requires_grad(true)); | 
|  | } | 
|  | torch::Tensor forward(torch::Tensor weights) { | 
|  | return tensor_.mm(weights); | 
|  | } | 
|  | torch::Tensor get() const { | 
|  | return tensor_; | 
|  | } | 
|  |  | 
|  | private: | 
|  | torch::Tensor tensor_; | 
|  | }; | 
|  |  | 
|  | bool function_taking_optional(c10::optional<torch::Tensor> tensor) { | 
|  | return tensor.has_value(); | 
|  | } | 
|  |  | 
|  | torch::Tensor random_tensor() { | 
|  | return torch::randn({1}); | 
|  | } | 
|  |  | 
|  | PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { | 
|  | m.def("sigmoid_add", &sigmoid_add, "sigmoid(x) + sigmoid(y)"); | 
|  | m.def( | 
|  | "function_taking_optional", | 
|  | &function_taking_optional, | 
|  | "function_taking_optional"); | 
|  | py::class_<MatrixMultiplier>(m, "MatrixMultiplier") | 
|  | .def(py::init<int, int>()) | 
|  | .def("forward", &MatrixMultiplier::forward) | 
|  | .def("get", &MatrixMultiplier::get); | 
|  |  | 
|  | m.def("get_complex", []() { return c10::complex<double>(1.0, 2.0); }); | 
|  | m.def("get_device", []() { return at::device_of(random_tensor()).value(); }); | 
|  | m.def("get_generator", []() { return at::detail::getDefaultCPUGenerator(); }); | 
|  | m.def("get_intarrayref", []() { return at::IntArrayRef({1, 2, 3}); }); | 
|  | m.def("get_memory_format", []() { return c10::get_contiguous_memory_format(); }); | 
|  | m.def("get_storage", []() { return random_tensor().storage(); }); | 
|  | m.def("get_symfloat", []() { return c10::SymFloat(1.0); }); | 
|  | m.def("get_symint", []() { return c10::SymInt(1); }); | 
|  | m.def("get_symintarrayref", []() { return at::SymIntArrayRef({1, 2, 3}); }); | 
|  | m.def("get_tensor", []() { return random_tensor(); }); | 
|  | } |