提交 cc4fc100 authored 作者: nouiz's avatar nouiz

Merge pull request #1298 from lamblin/fix_sparse_infershape

Fix ConstructSparseFromList.infer_shape
...@@ -3323,8 +3323,8 @@ class ConstructSparseFromList(gof.Op): ...@@ -3323,8 +3323,8 @@ class ConstructSparseFromList(gof.Op):
""" """
:param x: a dense matrix that specify the output shape. :param x: a dense matrix that specify the output shape.
:param values: a dense matrix with the values to use for output. :param values: a dense matrix with the values to use for output.
:param ilist: a dense vector with the same lenght as the number of rows :param ilist: a dense vector with the same length as the number of rows
then values. It specify where in the output to put of values. It specify where in the output to put
the corresponding rows. the corresponding rows.
This create a sparse matrix with the same shape as `x`. Its This create a sparse matrix with the same shape as `x`. Its
...@@ -3374,8 +3374,8 @@ class ConstructSparseFromList(gof.Op): ...@@ -3374,8 +3374,8 @@ class ConstructSparseFromList(gof.Op):
dtype=values.dtype) dtype=values.dtype)
def infer_shape(self, node, ishapes): def infer_shape(self, node, ishapes):
x, y, ilist = ishapes x = node.inputs[0]
return [x] return [[x[0], x[1]]]
def R_op(self, inputs, eval_points): def R_op(self, inputs, eval_points):
if None in eval_points[:2]: if None in eval_points[:2]:
......
...@@ -24,7 +24,7 @@ from theano.sparse.basic import _is_dense, _is_sparse, _mtypes ...@@ -24,7 +24,7 @@ from theano.sparse.basic import _is_dense, _is_sparse, _mtypes
from theano.sparse.basic import _is_dense_variable, _is_sparse_variable from theano.sparse.basic import _is_dense_variable, _is_sparse_variable
from theano.sparse import ( from theano.sparse import (
verify_grad_sparse, as_sparse_variable, verify_grad_sparse, as_sparse_variable,
CSC, CSR, CSM, CSMProperties, csm_properties, CSC, CSM, CSMProperties, csm_properties,
SparseType, CSMGrad, SparseType, CSMGrad,
StructuredDot, StructuredDot,
StructuredDotGradCSC, StructuredDotGradCSR, StructuredDotGradCSC, StructuredDotGradCSR,
...@@ -34,12 +34,12 @@ from theano.sparse import ( ...@@ -34,12 +34,12 @@ from theano.sparse import (
Dot, Usmm, sp_ones_like, GetItemScalar, Dot, Usmm, sp_ones_like, GetItemScalar,
SparseFromDense, SparseFromDense,
Cast, cast, HStack, VStack, AddSSData, add_s_s_data, Cast, cast, HStack, VStack, AddSSData, add_s_s_data,
structured_sigmoid, structured_exp, structured_log, structured_minimum, structured_maximum, structured_add,
structured_pow, structured_minimum, structured_maximum, structured_add, mul_s_v, structured_add_s_v,
MulSV, mul_s_v, StructuredAddSV, structured_add_s_v,
SamplingDot, sampling_dot, SamplingDot, sampling_dot,
Diag, diag, SquareDiagonal, square_diagonal, Diag, diag, SquareDiagonal, square_diagonal,
EnsureSortedIndices, ensure_sorted_indices, clean) EnsureSortedIndices, ensure_sorted_indices, clean,
ConstructSparseFromList, construct_sparse_from_list)
# Probability distributions are currently tested in test_sp2.py # Probability distributions are currently tested in test_sp2.py
#from theano.sparse import ( #from theano.sparse import (
...@@ -402,6 +402,21 @@ class SparseInferShapeTester(utt.InferShapeTester): ...@@ -402,6 +402,21 @@ class SparseInferShapeTester(utt.InferShapeTester):
csc_from_dense.__class__) csc_from_dense.__class__)
def test_sparse_from_list(self):
x = tensor.matrix('x')
vals = tensor.matrix('vals')
ilist = tensor.lvector('ilist')
out = construct_sparse_from_list(x, vals, ilist)
self._compile_and_check(
[x, vals, ilist],
[out],
[numpy.zeros((40, 10), dtype=config.floatX),
numpy.random.randn(12, 10).astype(config.floatX),
numpy.random.randint(low=0, high=40, size=(12,))],
ConstructSparseFromList
)
class T_AddMul(unittest.TestCase): class T_AddMul(unittest.TestCase):
def testAddSS(self): def testAddSS(self):
...@@ -1256,9 +1271,9 @@ class UsmmTests(unittest.TestCase): ...@@ -1256,9 +1271,9 @@ class UsmmTests(unittest.TestCase):
isinstance(topo[2].op.scalar_op, theano.scalar.Mul)) isinstance(topo[2].op.scalar_op, theano.scalar.Mul))
assert (isinstance(topo[3].op, theano.tensor.Elemwise) and assert (isinstance(topo[3].op, theano.tensor.Elemwise) and
isinstance(topo[3].op.scalar_op, theano.scalar.Sub)) isinstance(topo[3].op.scalar_op, theano.scalar.Sub))
elif (y.type.dtype == up and format1 == 'csc' and format2 == 'dense' elif (y.type.dtype == up and format1 == 'csc'
and not fast_compile and theano.config.cxx and and format2 == 'dense' and not fast_compile
up in ('float32', 'float64')): and theano.config.cxx and up in ('float32', 'float64')):
# The op UsmmCscDense should be inserted # The op UsmmCscDense should be inserted
assert (sum([isinstance(node.op, tensor.Elemwise) and assert (sum([isinstance(node.op, tensor.Elemwise) and
isinstance(node.op.scalar_op, isinstance(node.op.scalar_op,
...@@ -2063,6 +2078,7 @@ class CastTester(utt.InferShapeTester): ...@@ -2063,6 +2078,7 @@ class CastTester(utt.InferShapeTester):
verify_grad_sparse(Cast(o_dtype), data, eps=eps) verify_grad_sparse(Cast(o_dtype), data, eps=eps)
def _format_info(nb): def _format_info(nb):
x = {} x = {}
mat = {} mat = {}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论