From eec3648aa967fffdd670132181a62a4eb1996407 Mon Sep 17 00:00:00 2001
From: Meghan Cowan <cowanmeg@cs.washington.edu>
Date: Fri, 5 Oct 2018 21:54:47 -0700
Subject: [PATCH] [RELAY] Add sigmoid relay operator (#1836)

---
 docs/langref/relay_op.rst            |  2 ++
 python/tvm/relay/op/tensor.py        | 16 ++++++++++++++++
 src/relay/op/tensor/unary.cc         | 11 +++++++++++
 tests/python/relay/test_op_level1.py | 16 ++++++++++++++++
 4 files changed, 45 insertions(+)

diff --git a/docs/langref/relay_op.rst b/docs/langref/relay_op.rst
index bcaece0bf..a4728eaa7 100644
--- a/docs/langref/relay_op.rst
+++ b/docs/langref/relay_op.rst
@@ -25,6 +25,7 @@ This level enables fully connected multi-layer perceptron.
    tvm.relay.log
    tvm.relay.sqrt
    tvm.relay.exp
+   tvm.relay.sigmoid
    tvm.relay.add
    tvm.relay.expand_dims
 
@@ -61,6 +62,7 @@ Level 1 Definitions
 .. autofunction:: tvm.relay.log
 .. autofunction:: tvm.relay.sqrt
 .. autofunction:: tvm.relay.exp
+.. autofunction:: tvm.relay.sigmoid
 .. autofunction:: tvm.relay.add
 
 
diff --git a/python/tvm/relay/op/tensor.py b/python/tvm/relay/op/tensor.py
index c8c42c1a6..05538c401 100644
--- a/python/tvm/relay/op/tensor.py
+++ b/python/tvm/relay/op/tensor.py
@@ -60,6 +60,22 @@ def sqrt(data):
     return _make.sqrt(data)
 
 
+def sigmoid(data):
+    """Compute elementwise sigmoid of data.
+
+    Parameters
+    ----------
+    data : relay.Expr
+        The input data
+
+    Returns
+    -------
+    result : relay.Expr
+        The computed result.
+    """
+    return _make.sigmoid(data)
+
+
 def add(lhs, rhs):
     """Addition with numpy-style broadcasting.
 
diff --git a/src/relay/op/tensor/unary.cc b/src/relay/op/tensor/unary.cc
index 798d4aa79..77bb08e14 100644
--- a/src/relay/op/tensor/unary.cc
+++ b/src/relay/op/tensor/unary.cc
@@ -65,6 +65,17 @@ RELAY_REGISTER_UNARY_OP("sqrt")
 .add_type_rel("Identity", IdentityRel);
 
 
+RELAY_REGISTER_UNARY_OP("sigmoid")
+.describe(R"code(Returns the sigmoid input array, computed element-wise.
+
+.. math::
+   sigmoid(x)
+
+)code" TVM_ADD_FILELINE)
+.set_support_level(1)
+.add_type_rel("Identity", IdentityRel);
+
+
 // Concat
 TVM_REGISTER_API("relay.op._make.concat")
   .set_body_typed<Expr(Expr)>([](Expr tuple) {
diff --git a/tests/python/relay/test_op_level1.py b/tests/python/relay/test_op_level1.py
index c1c8b03c1..9cfca9630 100644
--- a/tests/python/relay/test_op_level1.py
+++ b/tests/python/relay/test_op_level1.py
@@ -16,5 +16,21 @@ def test_expand_dims_infer_type():
         (n, t, 1, 100), "float32")
 
 
+def test_unary_op():
+    for op in [relay.exp,
+               relay.log,
+               relay.sqrt,
+               relay.sigmoid]:
+        ib = relay.ir_builder.IRBuilder()
+        x = ib.param("x", relay.TensorType((10, 4), "int32"))
+        with ib.function(x) as func:
+            ib.ret(op(x.var))
+        ib.ret(func)
+        func = relay.ir_pass.infer_type(ib.env, func.to_func())
+        ftype = func.checked_type()
+        assert ftype.ret_type == relay.TensorType((10, 4), "int32")
+
+
 if __name__ == "__main__":
     test_expand_dims_infer_type()
+    test_unary_op()
-- 
GitLab