From 012d9e72158c66c273f9e2997f4fe77e65237877 Mon Sep 17 00:00:00 2001 From: SigureMo Date: Fri, 7 Nov 2025 20:35:58 +0800 Subject: [PATCH 1/5] [Compat] Add more constructors for compatible `at::Tensor` --- paddle/phi/api/include/compat/ATen/ATen.h | 1 + paddle/phi/api/include/compat/ATen/Utils.h | 1 - .../api/include/compat/ATen/core/TensorBase.h | 9 +++++ .../api/include/compat/ATen/core/TensorBody.h | 36 +++++++++++++------ .../compat/ATen/core/TensorMethods.cpp | 2 +- 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/paddle/phi/api/include/compat/ATen/ATen.h b/paddle/phi/api/include/compat/ATen/ATen.h index b42595669de6ef..a0b12c8b82e27a 100644 --- a/paddle/phi/api/include/compat/ATen/ATen.h +++ b/paddle/phi/api/include/compat/ATen/ATen.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include diff --git a/paddle/phi/api/include/compat/ATen/Utils.h b/paddle/phi/api/include/compat/ATen/Utils.h index 30a417cd6f61ec..43e794c41d927e 100644 --- a/paddle/phi/api/include/compat/ATen/Utils.h +++ b/paddle/phi/api/include/compat/ATen/Utils.h @@ -14,7 +14,6 @@ #pragma once -#include #include #include #include diff --git a/paddle/phi/api/include/compat/ATen/core/TensorBase.h b/paddle/phi/api/include/compat/ATen/core/TensorBase.h index f243112ba1c9e2..708c5433388d40 100644 --- a/paddle/phi/api/include/compat/ATen/core/TensorBase.h +++ b/paddle/phi/api/include/compat/ATen/core/TensorBase.h @@ -34,6 +34,15 @@ class PADDLE_API TensorBase { public: TensorBase() = default; TensorBase(const PaddleTensor& tensor) : tensor_(tensor){}; // NOLINT + TensorBase(const TensorBase&) = default; + TensorBase(TensorBase&&) noexcept = default; + ~TensorBase() noexcept = default; + + TensorBase& operator=(const TensorBase& x) & = default; + TensorBase& operator=(TensorBase&& x) & noexcept = default; + + TensorBase& operator=(const TensorBase&) && = delete; + TensorBase& operator=(TensorBase&&) && noexcept = delete; void* data_ptr() const { return const_cast(tensor_.data()); } template diff --git a/paddle/phi/api/include/compat/ATen/core/TensorBody.h b/paddle/phi/api/include/compat/ATen/core/TensorBody.h index 504da198533769..e186ef0e8d9118 100644 --- a/paddle/phi/api/include/compat/ATen/core/TensorBody.h +++ b/paddle/phi/api/include/compat/ATen/core/TensorBody.h @@ -24,6 +24,8 @@ class Tensor : public TensorBase { public: Tensor() = default; Tensor(const PaddleTensor& tensor) : TensorBase(tensor){}; // NOLINT + Tensor(const Tensor& tensor) = default; + Tensor(Tensor&& tensor) = default; // Implicitly move-constructible from TensorBase, but must be explicit to // increase refcount @@ -31,18 +33,32 @@ class Tensor : public TensorBase { /*implicit*/ Tensor(TensorBase&& base) // NOLINT : TensorBase(std::move(base)) {} - // TODO(dev): Implement assignment operators - // Tensor& operator=(const Tensor& x) & noexcept { - // return operator=(static_cast(x)); - // } - // Tensor& operator=(Tensor&& x) & noexcept { - // return operator=(static_cast(x)); - // } + Tensor& operator=(const PaddleTensor& x) & noexcept { + tensor_ = x; + return *this; + } + Tensor& operator=(const TensorBase& x) & noexcept { + tensor_ = x._PD_GetInner(); + return *this; + } + Tensor& operator=(PaddleTensor&& x) & noexcept { + tensor_ = std::move(x); + return *this; + } + Tensor& operator=(TensorBase&& x) & noexcept { + tensor_ = std::move(x._PD_GetInner()); + return *this; + } + Tensor& operator=(const Tensor& x) & noexcept { + return operator=(static_cast(x)); + } + Tensor& operator=(Tensor&& x) & noexcept { + return operator=(static_cast(x)); + } Tensor& operator=(const Scalar& v) && { return fill_(v); } - // TODO(dev): Implement assignment operators - // Tensor& operator=(const Tensor& rhs) && { return copy_(rhs); } - // Tensor& operator=(Tensor&& rhs) && { return copy_(rhs); } + Tensor& operator=(const Tensor& rhs) && { return copy_(rhs); } + Tensor& operator=(Tensor&& rhs) && { return copy_(rhs); } void* data_ptr() const { return const_cast(tensor_.data()); } template diff --git a/paddle/phi/api/include/compat/ATen/core/TensorMethods.cpp b/paddle/phi/api/include/compat/ATen/core/TensorMethods.cpp index b452493b22aa3d..2ed682664a75b6 100644 --- a/paddle/phi/api/include/compat/ATen/core/TensorMethods.cpp +++ b/paddle/phi/api/include/compat/ATen/core/TensorMethods.cpp @@ -48,7 +48,7 @@ void check_type(const TensorBase& tensor, template <> \ PADDLE_API T* TensorBase::mutable_data_ptr() const { \ check_type(*this, ScalarType::name, #name); \ - return const_cast(tensor_).mutable_data(); \ + return const_cast(tensor_).data(); \ } \ \ template <> \ From 71452938c2a60b165840576e72c2e80418937fcc Mon Sep 17 00:00:00 2001 From: Nyakku Shigure Date: Fri, 7 Nov 2025 20:52:04 +0800 Subject: [PATCH 2/5] Update paddle/phi/api/include/compat/ATen/core/TensorBody.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- paddle/phi/api/include/compat/ATen/core/TensorBody.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/paddle/phi/api/include/compat/ATen/core/TensorBody.h b/paddle/phi/api/include/compat/ATen/core/TensorBody.h index e186ef0e8d9118..c9c5c9ee903e60 100644 --- a/paddle/phi/api/include/compat/ATen/core/TensorBody.h +++ b/paddle/phi/api/include/compat/ATen/core/TensorBody.h @@ -38,7 +38,8 @@ class Tensor : public TensorBase { return *this; } Tensor& operator=(const TensorBase& x) & noexcept { - tensor_ = x._PD_GetInner(); + const PaddleTensor& inner = x._PD_GetInner(); + tensor_ = inner; return *this; } Tensor& operator=(PaddleTensor&& x) & noexcept { From cf21c84cf75082c60da1ba285e29da4235927233 Mon Sep 17 00:00:00 2001 From: SigureMo Date: Fri, 7 Nov 2025 20:59:44 +0800 Subject: [PATCH 3/5] fix move semantic --- .../api/include/compat/ATen/core/TensorBase.h | 16 ++++++++++++++-- .../api/include/compat/ATen/core/TensorBody.h | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/paddle/phi/api/include/compat/ATen/core/TensorBase.h b/paddle/phi/api/include/compat/ATen/core/TensorBase.h index 708c5433388d40..4b4339a519649f 100644 --- a/paddle/phi/api/include/compat/ATen/core/TensorBase.h +++ b/paddle/phi/api/include/compat/ATen/core/TensorBase.h @@ -38,8 +38,19 @@ class PADDLE_API TensorBase { TensorBase(TensorBase&&) noexcept = default; ~TensorBase() noexcept = default; +#if defined(_MSC_VER) + TensorBase& operator=(const TensorBase& x) & { + tensor_ = x.tensor_; + return *this; + }; + TensorBase& operator=(TensorBase&& x) & noexcept { + tensor_ = std::move(x.tensor_); + return *this; + } +#else TensorBase& operator=(const TensorBase& x) & = default; TensorBase& operator=(TensorBase&& x) & noexcept = default; +#endif TensorBase& operator=(const TensorBase&) && = delete; TensorBase& operator=(TensorBase&&) && noexcept = delete; @@ -220,8 +231,9 @@ class PADDLE_API TensorBase { template TensorAccessor accessor() && = delete; - PaddleTensor _PD_GetInner() const { return tensor_; } - PaddleTensor& _PD_GetInner() { return tensor_; } + const PaddleTensor& _PD_GetInner() const& { return tensor_; } + PaddleTensor& _PD_GetInner() & { return tensor_; } + PaddleTensor&& _PD_GetInner() && { return std::move(tensor_); } protected: PaddleTensor tensor_; diff --git a/paddle/phi/api/include/compat/ATen/core/TensorBody.h b/paddle/phi/api/include/compat/ATen/core/TensorBody.h index c9c5c9ee903e60..82478b9030fff2 100644 --- a/paddle/phi/api/include/compat/ATen/core/TensorBody.h +++ b/paddle/phi/api/include/compat/ATen/core/TensorBody.h @@ -47,7 +47,7 @@ class Tensor : public TensorBase { return *this; } Tensor& operator=(TensorBase&& x) & noexcept { - tensor_ = std::move(x._PD_GetInner()); + tensor_ = std::move(x)._PD_GetInner(); return *this; } From 84ef057d0db218fd36d22a89d69e3556683988d4 Mon Sep 17 00:00:00 2001 From: Nyakku Shigure Date: Fri, 7 Nov 2025 21:04:27 +0800 Subject: [PATCH 4/5] Update paddle/phi/api/include/compat/ATen/core/TensorBase.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- paddle/phi/api/include/compat/ATen/core/TensorBase.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/phi/api/include/compat/ATen/core/TensorBase.h b/paddle/phi/api/include/compat/ATen/core/TensorBase.h index 4b4339a519649f..83592fd504ae05 100644 --- a/paddle/phi/api/include/compat/ATen/core/TensorBase.h +++ b/paddle/phi/api/include/compat/ATen/core/TensorBase.h @@ -42,7 +42,7 @@ class PADDLE_API TensorBase { TensorBase& operator=(const TensorBase& x) & { tensor_ = x.tensor_; return *this; - }; + } TensorBase& operator=(TensorBase&& x) & noexcept { tensor_ = std::move(x.tensor_); return *this; From 141b12d8d7683133c58829c3e93c735259f77ade Mon Sep 17 00:00:00 2001 From: SigureMo Date: Sat, 8 Nov 2025 00:46:58 +0800 Subject: [PATCH 5/5] fix to_ivalue --- paddle/fluid/pybind/torch_compat.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/pybind/torch_compat.h b/paddle/fluid/pybind/torch_compat.h index a487c1f9daffdb..9a7ab8b3b36498 100644 --- a/paddle/fluid/pybind/torch_compat.h +++ b/paddle/fluid/pybind/torch_compat.h @@ -138,7 +138,7 @@ inline torch::IValue OperationInvoker::to_ivalue(py::handle obj) { } else if (py::isinstance(obj)) { return torch::IValue(py::cast(obj)); } else if (py::isinstance(obj)) { - return torch::IValue(py::cast(obj)); + return torch::IValue(py::cast(obj)); } else if (py::isinstance(obj)) { return torch::IValue(py::cast(obj)); } else if (py::isinstance(obj)) {