From 40ce78d8b57a039c59693000859f4143f877f162 Mon Sep 17 00:00:00 2001
From: peachlcy <89076835+peachlcy@users.noreply.github.com>
Date: Thu, 14 Jul 2022 22:32:58 +0800
Subject: [PATCH] =?UTF-8?q?=E3=80=90Hackathon=20No.17=E3=80=91=E4=B8=BA=20?=
=?UTF-8?q?Paddle=20=E6=96=B0=E5=A2=9E=20sgn=20(#164)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
rfcs/APIs/20220705_api_design_for_sgn.md | 150 +++++++++++++++++++++++
1 file changed, 150 insertions(+)
create mode 100644 rfcs/APIs/20220705_api_design_for_sgn.md
diff --git a/rfcs/APIs/20220705_api_design_for_sgn.md b/rfcs/APIs/20220705_api_design_for_sgn.md
new file mode 100644
index 000000000..3f206eade
--- /dev/null
+++ b/rfcs/APIs/20220705_api_design_for_sgn.md
@@ -0,0 +1,150 @@
+# paddle.sgn 设计文档
+
+| API名称 | paddle.sgn |
+|----------------------------------------------------------|------------------------------------------------|
+| 提交作者 | TreeML |
+| 提交时间 | 2022-07-05 |
+| 版本号 | V1.0 |
+| 依赖飞桨版本 | develop |
+| 文件名 | 20220705_api_design_for_sgn.md
|
+
+# 一、概述
+
+## 1、相关背景
+
+对于复数张量,此函数返回一个新的张量,其元素与 input 元素的角度相同且绝对值为1;
+对于非复数张量,此函数返回 input 元素的符号。
+此任务的目标是在 Paddle 框架中,新增 sgn API,调用路径为:paddle.sgn 和 Tensor.sgn。
+
+
+## 3、意义
+
+完善paddle中对于复数的sgn运算。
+
+# 二、飞桨现状
+
+目前paddle拥有类似的对于实数进行运算的API:sign,
+sign对输入x中每个元素进行正负判断,并且输出正负判断值:1代表正,-1代表负,0代表零,
+sgn是对sign复数功能的实现。
+
+# 三、业内方案调研
+
+## Pytorch
+
+Pytorch中有API`torch.sgn(input, *, out=None)` , 支持复数的符号函数运算:
+
+ ```
+ This function is an extension of torch.sign() to complex tensors. It computes a new tensor whose elements have the same
+ angles as the corresponding elements of input and absolute values (i.e. magnitudes) of one for complex tensors and is
+ equivalent to torch.sign() for non-complex tensors.
+ ```
+官方文档链接为:https://pytorch.org/docs/stable/generated/torch.sgn.html?highlight=sgn#torch.sgn
+
+## Tensorflow
+
+在Tensorflow中sign此API同时支持复数与实数的符号函数运算:
+ ```
+y = sign(x) = -1 if x < 0; 0 if x == 0; 1 if x > 0.
+对于复数,y = sign(x) = x / |x| if x != 0, otherwise y = 0.
+ ```
+官方文档链接为:https://www.tensorflow.org/api_docs/python/tf/math/sign
+
+## Numpy
+
+在Numpy中sign此API同时支持复数与实数的符号函数运算,但其复数运算所得到的结果为sign(x.real) + 0j:
+ ```
+The sign function returns -1 if x < 0, 0 if x==0, 1 if x > 0. nan is returned for nan inputs.
+For complex inputs, the sign function returns sign(x.real) + 0j if x.real != 0 else sign(x.imag) + 0j.
+complex(nan, 0) is returned for complex nan inputs.
+There is more than one definition of sign in common use for complex numbers. The definition used here is equivalent to
+ x/sqrt(x*x) which is different from x/|x|a common alternative, .
+ ```
+官方文档链接为:https://numpy.org/doc/stable/reference/generated/numpy.sign.html?highlight=sign#numpy.sign
+
+### 实现方法
+
+代码如下:
+
+Pytorch中使用C++来实现复数功能
+
+ ```
+ template
+inline c10::complex sgn_impl (c10::complex z) {
+ if (z == c10::complex(0, 0)) {
+ return c10::complex(0, 0);
+ } else {
+ return z / zabs(z);
+ }
+}
+
+ ```
+github链接为:https://github.com/pytorch/pytorch/blob/d7fc864f0da461512fb7b972f04e24e296bd266d/aten/src/ATen/native/cpu/zmath.h#L156-L163
+Tensorflow中使用python实现复数功能
+
+```
+ if x.dtype.is_complex:
+ return gen_math_ops.div_no_nan(
+ x,
+ cast(
+ gen_math_ops.complex_abs(
+ x,
+ Tout=dtypes.float32
+ if x.dtype == dtypes.complex64 else dtypes.float64),
+ dtype=x.dtype),
+ name=name)
+ return gen_math_ops.sign(x, name=name)
+```
+github链接为:https://github.com/tensorflow/tensorflow/blob/7272e9f1f52ffe1b5aee67d1af3c2127634ab47d/tensorflow/python/ops/math_ops.py#L746-L790
+
+# 四、对比分析
+
+Tensorflow与Pytorch对于实现复数功能部分的代码核心逻辑相同,torch的代码使用C++实现但它将实数和复数拆分成了两个API,类似于paddle的想法;
+Tensorflow的代码使用Python实现但它将两个功能合于一个API中。
+鉴于两段代码的逻辑类似,故参考Pytorch的代码或参考Tensorflow的代码皆可。
+
+# 五、方案设计
+
+## 命名与参数设计
+
+API设计为`paddle.sgn(x, name=None)`和`paddle.Tensor.sgn(x, name=None)`
+命名与参数顺序为:形参名`input`->`x`, 与paddle其他API保持一致性,不影响实际功能使用。
+
+
+## 底层OP设计
+
+使用已有API进行组合,不再单独设计底层OP。
+
+
+## API实现方案
+
+使用is_complex判断输入是否为复数、若为实数则使用sign进行运算;若为复数则使用as_real将其转化为实数tensor,将其中的非零部分除以它自己的绝对值
+,最后再使用as_complex将其转换回复数返回。
+
+# 六、测试和验收的考量
+
+测试考虑的case如下:
+
+- 编程范式场景:覆盖静态图和动态图测试场景
+- 硬件场景:覆盖CPU和GPU测试场景
+- Tensor精度场景:支持float16, float32 , float64, complex64 , complex128
+- 参数组合场景
+- 计算精度:前向计算,和numpy实现的函数对比结果;反向计算,由Python组合的新增API无需验证反向计算
+- 异常测试:由于使用了已有API:sign,该API不支持整型运算,仅支持float16, float32 或 float64,所以需要做数据类型的异常测试
+
+
+
+# 七、可行性分析及规划排期
+
+方案主要依赖paddle现有API组合而成,并自行实现核心算法。
+
+# 八、影响面
+
+为独立新增API,对其他模块没有影响。
+
+# 名词解释
+
+无
+
+# 附件及参考资料
+
+无
\ No newline at end of file