def test_sparse_input_aliasing_affecting_inplace_operations(self):
##
# Note this test will never fail because I am not aware of any
# inplace op on sparse variables
try:
import scipy.sparse as sp
except ImportError:
# The variable enable_sparse will be used to disable the test file.
pass
from theano.sparse import enable_sparse
if not enable_sparse:
raise SkipTest('Optional package sparse disabled')
from theano import sparse
# Note: to trigger this bug with theano rev 4586:2bc6fc7f218b,
# you need to make in inputs mutable (so that inplace
# operations are used) and to break the elemwise composition
# with some non-elemwise op (here dot)
x = sparse.SparseType('csc', dtype='float64')()
y = sparse.SparseType('csc', dtype='float64')()
f = theano.function([theano.In(x, mutable=True),
theano.In(y, mutable=True)],
(x + y) + (x + y))
# Test 1. If the same variable is given twice
# Compute bogus values
m = sp.csc_matrix(numpy.asarray(
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]], dtype='float64'))
bogus_vals = f(m, m)
# Since we used inplace operation v and m may be corrupted
# so we need to recreate them
m = sp.csc_matrix(numpy.asarray(
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]], dtype='float64'))
m_copy = m.copy()
vals = f(m, m_copy)
assert numpy.allclose(vals.todense(), bogus_vals.todense())
评论列表
文章目录