def _testDS( self, op, array1=numpy.array([[1.0, 0], [3, 0], [0, 6]]), array2=numpy.asarray([[0, 2.0], [0, 4], [5, 0]]) ): for mtype in _mtypes: a = mtype(array1) aR = as_sparse_variable(a) self.assertFalse(aR.data is a) self.assertTrue(_is_sparse(a)) self.assertTrue(_is_sparse_variable(aR)) b = numpy.asarray(array2) bR = tensor.as_tensor_variable(b) self.assertFalse(bR.data is b) self.assertTrue(_is_dense(b)) self.assertTrue(_is_dense_variable(bR)) apb = op(aR, bR) self.assertTrue(apb.type.dtype == aR.type.dtype, apb.type.dtype) self.assertTrue(apb.type.dtype == bR.type.dtype, apb.type.dtype) val = eval_outputs([apb]) self.assertTrue(val.shape == (3, 2)) if op is add: self.assertTrue(_is_dense_variable(apb)) self.assertTrue(numpy.all(val == (a + b))) ans = numpy.array([[1.0, 2], [3, 4], [5, 6]]) self.assertTrue(numpy.all(val == ans)) elif op is mul: self.assertTrue(_is_sparse_variable(apb)) ans = numpy.array([[1, 0], [9, 0], [0, 36]]) self.assertTrue(numpy.all(val.todense() == (a.multiply(b)))) self.assertTrue(numpy.all(val.todense() == ans))
def _testDS(self, op, array1=numpy.array([[1., 0], [3, 0], [0, 6]]), array2=numpy.asarray([[0, 2.], [0, 4], [5, 0]])): for mtype in _mtypes: a = mtype(array1) aR = as_sparse_variable(a) self.assertFalse(aR.data is a) self.assertTrue(_is_sparse(a)) self.assertTrue(_is_sparse_variable(aR)) b = numpy.asarray(array2) bR = tensor.as_tensor_variable(b) self.assertFalse(bR.data is b) self.assertTrue(_is_dense(b)) self.assertTrue(_is_dense_variable(bR)) apb = op(aR, bR) self.assertTrue(apb.type.dtype == aR.type.dtype, apb.type.dtype) self.assertTrue(apb.type.dtype == bR.type.dtype, apb.type.dtype) val = eval_outputs([apb]) self.assertTrue(val.shape == (3, 2)) if op is add: self.assertTrue(_is_dense_variable(apb)) self.assertTrue(numpy.all(val == (a + b))) ans = numpy.array([[1., 2], [3, 4], [5, 6]]) self.assertTrue(numpy.all(val == ans)) elif op is mul: self.assertTrue(_is_sparse_variable(apb)) ans = numpy.array([[1, 0], [9, 0], [0, 36]]) self.assertTrue(numpy.all(val.todense() == (a.multiply(b)))) self.assertTrue(numpy.all(val.todense() == ans))
def test_basicSD(self): for mtype in _mtypes: x = as_sparse_variable(mtype((500, 3))) x.data[(10, 1)] = 1 x.data[(20, 2)] = 2 self.assertTrue(_is_sparse_variable(x)) y = tensor.as_tensor_variable([[1., 2], [3, 4], [2, 1]]) self.assertTrue(_is_dense_variable(y)) zop = true_dot(x, y) self.assertTrue(_is_sparse_variable(zop)) z = eval_outputs([zop]) self.assertTrue(_is_sparse(z)) self.assertTrue(z.shape == (500, 2)) self.assertTrue(type(z) is mtype) w = mtype((500, 2)) w[(10, 0)] = 3. w[(20, 0)] = 4 w[(10, 1)] = 4 w[(20, 1)] = 2 self.assertTrue(z.shape == w.shape) self.assertTrue(type(z) == type(w)) self.assertTrue(z.dtype == w.dtype) #self.assertTrue(z == w) self.assertTrue(abs(z - w).nnz == 0) z = z.todense() w = w.todense() self.assertTrue((z == w).all() == True)
def test_basicSD(self): for mtype in _mtypes: x = as_sparse_variable(mtype((500,3))) x.data[(10, 1)] = 1 x.data[(20, 2)] = 2 self.assertTrue(_is_sparse_variable(x)) y = tensor.as_tensor_variable([[1., 2], [3, 4], [2, 1]]) self.assertTrue(_is_dense_variable(y)) zop = true_dot(x,y) self.assertTrue(_is_sparse_variable(zop)) z = eval_outputs([zop]) self.assertTrue(_is_sparse(z)) self.assertTrue(z.shape == (500,2)) self.assertTrue(type(z) is mtype) w = mtype((500,2)) w[(10, 0)] = 3. w[(20, 0)] = 4 w[(10, 1)] = 4 w[(20, 1)] = 2 self.assertTrue(z.shape == w.shape) self.assertTrue(type(z) == type(w)) self.assertTrue(z.dtype == w.dtype) #self.assertTrue(z == w) self.assertTrue(abs(z-w).nnz == 0) z = z.todense() w = w.todense() self.assertTrue((z == w).all() == True)
def grad(self, inp, grads): x, y = inp gz, = grads assert _is_sparse_variable(gz) assert _is_sparse_variable(x) rval = [true_dot(gz, y.T), true_dot(x.T, gz)] if _is_dense_variable(y): if self.grad_preserves_dense: rval[1] = dense_from_sparse(rval[1]) return rval
def test_basicDS(self): for mtype in _mtypes: x = as_sparse_variable(mtype((500, 3))) x.data[(10, 1)] = 1 x.data[(20, 2)] = 2 self.assertTrue(_is_sparse_variable(x)) y = tensor.as_tensor_variable([[1., 2], [3, 4], [2, 1]]) self.assertTrue(_is_dense_variable(y)) x.data = x.data.T y.data = y.data.T zop = true_dot(y, x) zop = transpose(true_dot(y, x)) self.assertTrue(_is_sparse_variable(zop)) z = eval_outputs([zop]) self.assertTrue(_is_sparse(z)) self.assertTrue(z.shape == (500, 2)) # self.assertTrue(type(z) is mtype) w = mtype((500, 2)) w[(10, 0)] = 3. w[(20, 0)] = 4 w[(10, 1)] = 4 w[(20, 1)] = 2 self.assertTrue(z.shape == w.shape) # Type should switch from csr to csc and vice-versa, so don't perform this test #self.assertTrue(type(z) == type(w)) self.assertTrue(z.dtype == w.dtype) # Type should switch from csr to csc and vice-versa, so don't perform this test #self.assertTrue(z == w) self.assertTrue(abs(z - w).nnz == 0) z = z.todense() w = w.todense() self.assertTrue((z == w).all() == True)
def test_basicDS(self): for mtype in _mtypes: x = as_sparse_variable(mtype((500,3))) x.data[(10, 1)] = 1 x.data[(20, 2)] = 2 self.assertTrue(_is_sparse_variable(x)) y = tensor.as_tensor_variable([[1., 2], [3, 4], [2, 1]]) self.assertTrue(_is_dense_variable(y)) x.data = x.data.T y.data = y.data.T zop = true_dot(y, x) zop = transpose(true_dot(y, x)) self.assertTrue(_is_sparse_variable(zop)) z = eval_outputs([zop]) self.assertTrue(_is_sparse(z)) self.assertTrue(z.shape == (500,2)) # self.assertTrue(type(z) is mtype) w = mtype((500,2)) w[(10, 0)] = 3. w[(20, 0)] = 4 w[(10, 1)] = 4 w[(20, 1)] = 2 self.assertTrue(z.shape == w.shape) # Type should switch from csr to csc and vice-versa, so don't perform this test #self.assertTrue(type(z) == type(w)) self.assertTrue(z.dtype == w.dtype) # Type should switch from csr to csc and vice-versa, so don't perform this test #self.assertTrue(z == w) self.assertTrue(abs(z-w).nnz == 0) z = z.todense() w = w.todense() self.assertTrue((z == w).all() == True)
assert y.type.ndim == 1 if x.type.dtype != y.type.dtype: raise NotImplementedError() return gof.Apply(self, [x, y], [SparseType(dtype=x.type.dtype, format=x.type.format).make_variable()]) def perform(self, node, (x, y), (out, )): assert _is_sparse(x) and not _is_sparse(y) assert x.shape[1] == y.shape[0] out[0] = x.__class__(x.toarray() * y) def grad(self, (x, y), (gz,)): assert _is_sparse_variable(x) and _is_dense_variable(y) assert _is_sparse_variable(gz) return mul_s_v(gz, y), sp_sum(x * gz, axis=0, sparse_grad=True) mul_s_v = MulSV() class MulSVCSR(gof.Op): def __eq__(self, other): return (type(self) == type(other)) def __hash__(self): return hash(type(self)) def make_node(self, a_data, a_indices, a_indptr, b): assert b.type.ndim == 1 return gof.Apply(self, [a_data, a_indices, a_indptr, b],
assert y.type.ndim == 1 if x.type.dtype != y.type.dtype: raise NotImplementedError() return gof.Apply(self, [x, y], [ SparseType(dtype=x.type.dtype, format=x.type.format).make_variable() ]) def perform(self, node, (x, y), (out, )): assert _is_sparse(x) and not _is_sparse(y) assert x.shape[1] == y.shape[0] out[0] = x.__class__(x.toarray() * y) def grad(self, (x, y), (gz, )): assert _is_sparse_variable(x) and _is_dense_variable(y) assert _is_sparse_variable(gz) return mul_s_v(gz, y), sp_sum(x * gz, axis=0, sparse_grad=True) mul_s_v = MulSV() class MulSVCSR(gof.Op): def __eq__(self, other): return (type(self) == type(other)) def __hash__(self): return hash(type(self)) def make_node(self, a_data, a_indices, a_indptr, b):