You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by jx...@apache.org on 2017/11/07 19:35:32 UTC
[incubator-mxnet] branch master updated: div_scalar for sparse
(#8540)
This is an automated email from the ASF dual-hosted git repository.
jxie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/master by this push:
new c64c307 div_scalar for sparse (#8540)
c64c307 is described below
commit c64c307c99712ce1d3ed2ce8fb576cd74835438c
Author: Ziyue Huang <zy...@gmail.com>
AuthorDate: Tue Nov 7 13:35:30 2017 -0600
div_scalar for sparse (#8540)
* div_scalar for sparse
* add docs
---
.../tensor/elemwise_binary_scalar_op_basic.cc | 29 +++++++++++++++++++++-
.../tensor/elemwise_binary_scalar_op_basic.cu | 7 +++++-
tests/python/unittest/test_sparse_ndarray.py | 3 ++-
3 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/src/operator/tensor/elemwise_binary_scalar_op_basic.cc b/src/operator/tensor/elemwise_binary_scalar_op_basic.cc
index 0f0004c..742c142 100644
--- a/src/operator/tensor/elemwise_binary_scalar_op_basic.cc
+++ b/src/operator/tensor/elemwise_binary_scalar_op_basic.cc
@@ -130,6 +130,15 @@ MXNET_OPERATOR_REGISTER_BINARY_SCALAR(_rminus_scalar)
.add_alias("_RMinusScalar");
MXNET_OPERATOR_REGISTER_BINARY_SCALAR(_mul_scalar)
+.describe(R"doc(Multiply an array with a scalar.
+
+``_mul_scalar`` only operates on data array of input if input is sparse.
+
+For example, if input of shape (100, 100) has only 2 non zero elements,
+i.e. input.data = [5, 6], scalar = nan,
+it will result output.data = [nan, nan] instead of 10000 nans.
+
+)doc" ADD_FILELINE)
.set_attr<FInferStorageType>("FInferStorageType", BinaryScalarStorageType)
.set_attr<FCompute>("FCompute<cpu>", BinaryScalarOp::Compute<cpu, mshadow::op::mul>)
.set_attr<FComputeEx>("FComputeEx<cpu>", BinaryScalarOp::ComputeEx<cpu, mshadow::op::mul>)
@@ -143,10 +152,28 @@ MXNET_OPERATOR_REGISTER_BINARY_SCALAR(_backward_mul_scalar)
.set_attr<FComputeEx>("FComputeEx<cpu>", BinaryScalarOp::ComputeEx<cpu, mshadow::op::mul>);
MXNET_OPERATOR_REGISTER_BINARY_SCALAR(_div_scalar)
+.describe(R"doc(Divide an array with a scalar.
+
+``_div_scalar`` only operates on data array of input if input is sparse.
+
+For example, if input of shape (100, 100) has only 2 non zero elements,
+i.e. input.data = [5, 6], scalar = nan,
+it will result output.data = [nan, nan] instead of 10000 nans.
+
+)doc" ADD_FILELINE)
+.set_attr<FInferStorageType>("FInferStorageType", BinaryScalarStorageType)
.set_attr<FCompute>("FCompute<cpu>", BinaryScalarOp::Compute<cpu, mshadow::op::div>)
-.set_attr<nnvm::FGradient>("FGradient", ElemwiseGradUseNone{"_div_scalar"})
+.set_attr<FComputeEx>("FComputeEx<cpu>", BinaryScalarOp::ComputeEx<cpu, mshadow::op::div>)
+.set_attr<nnvm::FGradient>("FGradient", ElemwiseGradUseNone{"_backward_div_scalar"})
.add_alias("_DivScalar");
+MXNET_OPERATOR_REGISTER_BINARY_SCALAR(_backward_div_scalar)
+.set_attr<nnvm::TIsBackward>("TIsBackward", true)
+.set_attr<FInferStorageType>("FInferStorageType", BinaryScalarStorageType)
+.set_attr<FCompute>("FCompute<cpu>", BinaryScalarOp::Compute<cpu, mshadow::op::div>)
+.set_attr<FComputeEx>("FComputeEx<cpu>", BinaryScalarOp::ComputeEx<cpu, mshadow::op::div>);
+
+
MXNET_OPERATOR_REGISTER_BINARY_SCALAR(_rdiv_scalar)
.set_attr<FCompute>("FCompute<cpu>", BinaryScalarOp::Compute<cpu, mshadow_op::rdiv>)
.set_attr<nnvm::FGradient>("FGradient", ElemwiseGradUseIn{"_backward_rdiv_scalar"})
diff --git a/src/operator/tensor/elemwise_binary_scalar_op_basic.cu b/src/operator/tensor/elemwise_binary_scalar_op_basic.cu
index afbb46b..32e51d3 100644
--- a/src/operator/tensor/elemwise_binary_scalar_op_basic.cu
+++ b/src/operator/tensor/elemwise_binary_scalar_op_basic.cu
@@ -45,7 +45,12 @@ NNVM_REGISTER_OP(_backward_mul_scalar)
.set_attr<FComputeEx>("FComputeEx<gpu>", BinaryScalarOp::ComputeEx<gpu, mshadow::op::mul>);
NNVM_REGISTER_OP(_div_scalar)
-.set_attr<FCompute>("FCompute<gpu>", BinaryScalarOp::Compute<gpu, mshadow::op::div>);
+.set_attr<FCompute>("FCompute<gpu>", BinaryScalarOp::Compute<gpu, mshadow::op::div>)
+.set_attr<FComputeEx>("FComputeEx<gpu>", BinaryScalarOp::ComputeEx<gpu, mshadow::op::div>);
+
+NNVM_REGISTER_OP(_backward_div_scalar)
+.set_attr<FCompute>("FCompute<gpu>", BinaryScalarOp::Compute<gpu, mshadow::op::div>)
+.set_attr<FComputeEx>("FComputeEx<gpu>", BinaryScalarOp::ComputeEx<gpu, mshadow::op::div>);
NNVM_REGISTER_OP(_rdiv_scalar)
.set_attr<FCompute>("FCompute<gpu>", BinaryScalarOp::Compute<gpu, mshadow_op::rdiv>);
diff --git a/tests/python/unittest/test_sparse_ndarray.py b/tests/python/unittest/test_sparse_ndarray.py
index 03a4307..34411d6 100644
--- a/tests/python/unittest/test_sparse_ndarray.py
+++ b/tests/python/unittest/test_sparse_ndarray.py
@@ -246,7 +246,7 @@ def test_sparse_nd_binary():
check_binary(lambda x, y: x == y, stype)
-def test_sparse_nd_binary_rop():
+def test_sparse_nd_binary_scalar_op():
N = 3
def check(fn, stype):
for _ in range(N):
@@ -269,6 +269,7 @@ def test_sparse_nd_binary_rop():
check(lambda x: 0.5 >= x, stype)
check(lambda x: 0.5 <= x, stype)
check(lambda x: 0.5 == x, stype)
+ check(lambda x: x / 2, stype)
def test_sparse_nd_binary_iop():
N = 3
--
To stop receiving notification emails like this one, please contact
['"commits@mxnet.apache.org" <co...@mxnet.apache.org>'].