diff --git a/paddle/fluid/eager/grad_node_info.cc b/paddle/fluid/eager/grad_node_info.cc index 9302304ea9cdc..df0f6b0682a6b 100644 --- a/paddle/fluid/eager/grad_node_info.cc +++ b/paddle/fluid/eager/grad_node_info.cc @@ -795,7 +795,6 @@ void GradNodeBase::HandleComplexGradToRealGrad( for (size_t rank_id = 0; rank_id < slot_out_grads.size(); rank_id++) { if (bwd_out_meta_[slot_id].size() == 0) continue; const GradSlotMeta& slot_meta = bwd_out_meta_[slot_id][rank_id]; - PADDLE_ENFORCE( slot_meta.HasTensorMeta() > 0, paddle::platform::errors::Fatal( diff --git a/paddle/phi/kernels/sparse/cpu/unary_grad_kernel.cc b/paddle/phi/kernels/sparse/cpu/unary_grad_kernel.cc index 5d65412a5dc05..cf7e5dc158b26 100644 --- a/paddle/phi/kernels/sparse/cpu/unary_grad_kernel.cc +++ b/paddle/phi/kernels/sparse/cpu/unary_grad_kernel.cc @@ -60,7 +60,6 @@ kernel->InputAt(0).SetDataLayout(phi::DataLayout::SPARSE_CSR); \ } -PD_REGISTER_SPARSE_UNARY_CPU_GRAD_KERNEL(sin, Sin) PD_REGISTER_SPARSE_UNARY_CPU_GRAD_KERNEL(tan, Tan) PD_REGISTER_SPARSE_UNARY_CPU_GRAD_KERNEL(asin, Asin) PD_REGISTER_SPARSE_UNARY_CPU_GRAD_KERNEL(atan, Atan) @@ -77,6 +76,7 @@ PD_REGISTER_SPARSE_UNARY_CPU_GRAD_KERNEL(expm1, Expm1) PD_REGISTER_SPARSE_UNARY_CPU_GRAD_KERNEL(relu6, Relu6) PD_REGISTER_SPARSE_UNARY_CPU_GRAD_KERNEL(leaky_relu, LeakyRelu) +PD_REGISTER_SPARSE_UNARY_CPU_GRAD_KERNEL_WITH_COMPLEX(sin, Sin) PD_REGISTER_SPARSE_UNARY_CPU_GRAD_KERNEL_WITH_COMPLEX(abs, Abs) PD_REGISTER_KERNEL(cast_coo_grad, diff --git a/paddle/phi/kernels/sparse/cpu/unary_kernel.cc b/paddle/phi/kernels/sparse/cpu/unary_kernel.cc index 6066d79bc26be..4e4394af45a01 100644 --- a/paddle/phi/kernels/sparse/cpu/unary_kernel.cc +++ b/paddle/phi/kernels/sparse/cpu/unary_kernel.cc @@ -101,7 +101,6 @@ void DivScalarCsrKernel(const Context& dev_ctx, kernel->InputAt(0).SetDataLayout(phi::DataLayout::SPARSE_CSR); \ } -PD_REGISTER_SPARSE_UNARY_CPU_KERNEL(sin, Sin) PD_REGISTER_SPARSE_UNARY_CPU_KERNEL(tan, Tan) PD_REGISTER_SPARSE_UNARY_CPU_KERNEL(asin, Asin) PD_REGISTER_SPARSE_UNARY_CPU_KERNEL(atan, Atan) @@ -119,6 +118,7 @@ PD_REGISTER_SPARSE_UNARY_CPU_KERNEL(expm1, Expm1) PD_REGISTER_SPARSE_UNARY_CPU_KERNEL(relu6, Relu6) PD_REGISTER_SPARSE_UNARY_CPU_KERNEL(leaky_relu, LeakyRelu) +PD_REGISTER_SPARSE_UNARY_CPU_KERNEL_WITH_COMPLEX(sin, Sin) PD_REGISTER_SPARSE_UNARY_CPU_KERNEL_WITH_COMPLEX(abs, Abs) PD_REGISTER_KERNEL(divide_scalar_coo, diff --git a/paddle/phi/kernels/sparse/gpu/unary_grad_kernel.cu b/paddle/phi/kernels/sparse/gpu/unary_grad_kernel.cu index 248556c1d6b53..364b4dfc0ba3a 100644 --- a/paddle/phi/kernels/sparse/gpu/unary_grad_kernel.cu +++ b/paddle/phi/kernels/sparse/gpu/unary_grad_kernel.cu @@ -64,7 +64,6 @@ kernel->InputAt(0).SetDataLayout(phi::DataLayout::SPARSE_CSR); \ } -PD_REGISTER_SPARSE_UNARY_GPU_GRAD_KERNEL(sin, Sin) PD_REGISTER_SPARSE_UNARY_GPU_GRAD_KERNEL(tan, Tan) PD_REGISTER_SPARSE_UNARY_GPU_GRAD_KERNEL(asin, Asin) PD_REGISTER_SPARSE_UNARY_GPU_GRAD_KERNEL(atan, Atan) @@ -81,6 +80,7 @@ PD_REGISTER_SPARSE_UNARY_GPU_GRAD_KERNEL(expm1, Expm1) PD_REGISTER_SPARSE_UNARY_GPU_GRAD_KERNEL(relu6, Relu6) PD_REGISTER_SPARSE_UNARY_GPU_GRAD_KERNEL(leaky_relu, LeakyRelu) +PD_REGISTER_SPARSE_UNARY_GPU_GRAD_KERNEL_WITH_COMPLEX(sin, Sin) PD_REGISTER_SPARSE_UNARY_GPU_GRAD_KERNEL_WITH_COMPLEX(abs, Abs) PD_REGISTER_KERNEL(cast_coo_grad, diff --git a/paddle/phi/kernels/sparse/gpu/unary_kernel.cu b/paddle/phi/kernels/sparse/gpu/unary_kernel.cu index 8d24b3011d9ba..136485c53b1ee 100644 --- a/paddle/phi/kernels/sparse/gpu/unary_kernel.cu +++ b/paddle/phi/kernels/sparse/gpu/unary_kernel.cu @@ -94,7 +94,6 @@ void DivScalarCsrKernel(const Context& dev_ctx, kernel->InputAt(0).SetDataLayout(phi::DataLayout::SPARSE_CSR); \ } -PD_REGISTER_SPARSE_UNARY_GPU_KERNEL(sin, Sin) PD_REGISTER_SPARSE_UNARY_GPU_KERNEL(tan, Tan) PD_REGISTER_SPARSE_UNARY_GPU_KERNEL(asin, Asin) PD_REGISTER_SPARSE_UNARY_GPU_KERNEL(atan, Atan) @@ -112,6 +111,7 @@ PD_REGISTER_SPARSE_UNARY_GPU_KERNEL(expm1, Expm1) PD_REGISTER_SPARSE_UNARY_GPU_KERNEL(relu6, Relu6) PD_REGISTER_SPARSE_UNARY_GPU_KERNEL(leaky_relu, LeakyRelu) +PD_REGISTER_SPARSE_UNARY_GPU_KERNEL_WITH_COMPLEX(sin, Sin) PD_REGISTER_SPARSE_UNARY_GPU_KERNEL_WITH_COMPLEX(abs, Abs) PD_REGISTER_KERNEL(divide_scalar_coo, diff --git a/paddle/phi/kernels/sparse/impl/unary_kernel_impl.h b/paddle/phi/kernels/sparse/impl/unary_kernel_impl.h index dd2461253ad6f..d6f649b79bb9b 100644 --- a/paddle/phi/kernels/sparse/impl/unary_kernel_impl.h +++ b/paddle/phi/kernels/sparse/impl/unary_kernel_impl.h @@ -74,7 +74,35 @@ namespace sparse { out->mutable_non_zero_elements()); \ } -DEFINE_SPARSE_UNARY_KERNEL(Sin) +#define DEFINE_SPARSE_UNARY_KERNEL_WITH_COMPLEX(prefix) \ + template \ + void prefix##CooKernel(const Context& dev_ctx, \ + const SparseCooTensor& x, \ + SparseCooTensor* out) { \ + *(out->mutable_indices()) = x.indices(); \ + DenseTensor* out_values = out->mutable_values(); \ + const DenseTensor& x_values = x.values(); \ + out_values->Resize(x_values.dims()); \ + dev_ctx.template Alloc(out_values); \ + phi::prefix##Kernel( \ + dev_ctx, x.non_zero_elements(), out->mutable_non_zero_elements()); \ + out->SetIndicesDict(x.GetIndicesDict()); \ + } \ + \ + template \ + void prefix##CsrKernel(const Context& dev_ctx, \ + const SparseCsrTensor& x, \ + SparseCsrTensor* out) { \ + *(out->mutable_crows()) = x.crows(); \ + *(out->mutable_cols()) = x.cols(); \ + DenseTensor* out_values = out->mutable_values(); \ + const DenseTensor& x_values = x.values(); \ + out_values->Resize(x_values.dims()); \ + dev_ctx.template Alloc(out_values); \ + phi::prefix##Kernel( \ + dev_ctx, x.non_zero_elements(), out->mutable_non_zero_elements()); \ + } + DEFINE_SPARSE_UNARY_KERNEL(Tan) DEFINE_SPARSE_UNARY_KERNEL(Asin) DEFINE_SPARSE_UNARY_KERNEL(Atan) @@ -90,39 +118,8 @@ DEFINE_SPARSE_UNARY_KERNEL(Expm1) DEFINE_SPARSE_UNARY_KERNEL(Relu6) DEFINE_SPARSE_UNARY_KERNEL_WITH_ONE_ATTR(Pow, factor) DEFINE_SPARSE_UNARY_KERNEL_WITH_ONE_ATTR(LeakyRelu, alpha) - -template -void AbsCooKernel(const Context& dev_ctx, - const SparseCooTensor& x, - SparseCooTensor* out) { - *(out->mutable_indices()) = x.indices(); - - DenseTensor* out_values = out->mutable_values(); - const DenseTensor& x_values = x.values(); - out_values->Resize(x_values.dims()); - dev_ctx.template Alloc(out_values); - - phi::AbsKernel( - dev_ctx, x.non_zero_elements(), out->mutable_non_zero_elements()); - - out->SetIndicesDict(x.GetIndicesDict()); -} - -template -void AbsCsrKernel(const Context& dev_ctx, - const SparseCsrTensor& x, - SparseCsrTensor* out) { - *(out->mutable_crows()) = x.crows(); - *(out->mutable_cols()) = x.cols(); - - DenseTensor* out_values = out->mutable_values(); - const DenseTensor& x_values = x.values(); - out_values->Resize(x_values.dims()); - dev_ctx.template Alloc(out_values); - - phi::AbsKernel( - dev_ctx, x.non_zero_elements(), out->mutable_non_zero_elements()); -} +DEFINE_SPARSE_UNARY_KERNEL_WITH_COMPLEX(Abs) +DEFINE_SPARSE_UNARY_KERNEL_WITH_COMPLEX(Sin) template void ScaleCooKernel(const Context& dev_ctx, diff --git a/python/paddle/sparse/unary.py b/python/paddle/sparse/unary.py index 3f378e242e346..ce1aff827b257 100644 --- a/python/paddle/sparse/unary.py +++ b/python/paddle/sparse/unary.py @@ -43,7 +43,7 @@ def sin(x, name=None): out = sin(x) Parameters: - x (Tensor): The input Sparse Tensor with data type float32, float64. + x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128. name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`. diff --git a/test/legacy_test/test_sparse_unary_op.py b/test/legacy_test/test_sparse_unary_op.py index 70a29ce0c62e3..6eb307443b34a 100644 --- a/test/legacy_test/test_sparse_unary_op.py +++ b/test/legacy_test/test_sparse_unary_op.py @@ -159,7 +159,11 @@ def test_sparse_abs(self): self.compare_with_dense(paddle.abs, paddle.sparse.abs, 'complex128') def test_sparse_sin(self): - self.compare_with_dense(paddle.sin, paddle.sparse.sin) + self.compare_with_dense(paddle.sin, paddle.sparse.sin, 'float16') + self.compare_with_dense(paddle.sin, paddle.sparse.sin, 'float32') + self.compare_with_dense(paddle.sin, paddle.sparse.sin, 'float64') + self.compare_with_dense(paddle.sin, paddle.sparse.sin, 'complex64') + self.compare_with_dense(paddle.sin, paddle.sparse.sin, 'complex128') def test_sparse_tan(self): self.compare_with_dense(paddle.tan, paddle.sparse.tan)