Fixed broken sparse.py (still not functioning, but at least no syntax errs)

上级 ff832383
...@@ -156,42 +156,43 @@ class AddSS(gof.op.Op): #add two sparse matrices ...@@ -156,42 +156,43 @@ class AddSS(gof.op.Op): #add two sparse matrices
return gz, gz return gz, gz
add_s_s = gof.op.constructor(AddSS) add_s_s = gof.op.constructor(AddSS)
#class Dot(gof.op.Op):
class Dot(gof.op.Op): # def __init__(self, x, y):
def __init__(self, x, y): # self.inputs = [x, y] # Need to convert? e.g. _as_tensor
def perform: # # broadcastable
#return numpy.dot(x, y) # def perform:
def grad: # #return numpy.dot(x, y)
# def grad:
""" #
Attributes: # """
grad_preserves_dense - an array of boolean flags (described below) # Attributes:
# grad_preserves_dense - an array of boolean flags (described below)
#
grad_preserves_dense controls whether gradients with respect to inputs are #
converted to dense matrices when the corresponding inputs are not in a # grad_preserves_dense controls whether gradients with respect to inputs are
SparseR wrapper. This can be a good idea when dot is in the middle of a # converted to dense matrices when the corresponding inputs are not in a
larger graph, because the types of gx and gy will match those of x and y. # SparseR wrapper. This can be a good idea when dot is in the middle of a
This conversion might be annoying if the gradients are graph outputs though, # larger graph, because the types of gx and gy will match those of x and y.
hence this mask. # This conversion might be annoying if the gradients are graph outputs though,
""" # hence this mask.
def __init__(self, *args, **kwargs): # """
gof.op.Op.__init__(self, **kwargs) # def __init__(self, *args, **kwargs):
self.grad_preserves_dense = [True, True] # gof.op.Op.__init__(self, **kwargs)
def gen_outputs(self): return [SparseR()] # self.grad_preserves_dense = [True, True]
def impl(x,y): # def gen_outputs(self): return [SparseR()]
if hasattr(x, 'getnnz'): # def impl(x,y):
# if x is sparse, then do this. # if hasattr(x, 'getnnz'):
return x.dot(y) # # if x is sparse, then do this.
else: # return x.dot(y)
# if x is dense (and y is sparse), we do this # else:
return y.transpose().dot(x.transpose()).transpose() # # if x is dense (and y is sparse), we do this
# return y.transpose().dot(x.transpose()).transpose()
def grad(self, x, y, gz): #
rval = [dot(gz, y.T), dot(x.T, gz)] # def grad(self, x, y, gz):
for i in 0,1: # rval = [dot(gz, y.T), dot(x.T, gz)]
if not isinstance(self.inputs[i], SparseR): # for i in 0,1:
#assume it is a dense matrix # if not isinstance(self.inputs[i], SparseR):
if self.grad_preserves_dense[i]: # #assume it is a dense matrix
rval[i] = dense_from_sparse(rval[i]) # if self.grad_preserves_dense[i]:
return rval # rval[i] = dense_from_sparse(rval[i])
# return rval
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论