def d(x): return sp.sp_sum(sp.square_diagonal(x), sparse_grad=True)
def d(x, s): return sp.sp_sum(sp.col_scale(x, s), sparse_grad=True)
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], [tensor.tensor(b.dtype, (False,))])
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],
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 + (x.toarray() != 0) * y) def grad(self, (x, y), (gz,)): assert _is_sparse_variable(x) and not _is_sparse_variable(y) assert _is_sparse_variable(gz) return gz, sp_sum(gz, axis=0, sparse_grad=True) structured_add_s_v = StructuredAddSV() class StrucutedAddSVCSR(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): b = tensor.as_tensor_variable(b) a_data = tensor.as_tensor_variable(a_data) a_indices = tensor.as_tensor_variable(a_indices) a_indptr = tensor.as_tensor_variable(a_indptr)