提交 b82123d4 authored 作者: Iban Harlouchet's avatar Iban Harlouchet

__props__ to theano/sparse/basic.py

上级 2207c24f
...@@ -578,6 +578,7 @@ class CSM(gof.Op): ...@@ -578,6 +578,7 @@ class CSM(gof.Op):
_hashval = None _hashval = None
"""Pre-computed hash value, defined by __init__""" """Pre-computed hash value, defined by __init__"""
__props__ = ()
def __init__(self, format, kmap=None): def __init__(self, format, kmap=None):
if format not in ('csr', 'csc'): if format not in ('csr', 'csc'):
...@@ -598,13 +599,6 @@ class CSM(gof.Op): ...@@ -598,13 +599,6 @@ class CSM(gof.Op):
self._hashval = (hash(type(self)) ^ hash(self.format) ^ self._hashval = (hash(type(self)) ^ hash(self.format) ^
_kmap_hash(self.kmap)) _kmap_hash(self.kmap))
def __eq__(self, other):
return (type(other) is CSM and other.format == self.format and
_kmap_eq(self.kmap, other.kmap))
def __hash__(self):
return self._hashval
def __str__(self): def __str__(self):
if self.kmap is not None: if self.kmap is not None:
return "%s{%s}" % (self.__class__.__name__, str(self.kmap)) return "%s{%s}" % (self.__class__.__name__, str(self.kmap))
...@@ -758,6 +752,7 @@ class CSMGrad(gof.op.Op): ...@@ -758,6 +752,7 @@ class CSMGrad(gof.op.Op):
# 2. The elements in the sparse dimension are not guaranteed to be sorted. # 2. The elements in the sparse dimension are not guaranteed to be sorted.
# Therefore, the input data vector may have a different order than the # Therefore, the input data vector may have a different order than the
# gradient data vector. # gradient data vector.
__props__ = ("kmap")
def __init__(self, kmap=None): def __init__(self, kmap=None):
self.kmap = kmap self.kmap = kmap
...@@ -766,12 +761,6 @@ class CSMGrad(gof.op.Op): ...@@ -766,12 +761,6 @@ class CSMGrad(gof.op.Op):
# if self.kmap is None: # if self.kmap is None:
# self.view_map = {0: [1]} # self.view_map = {0: [1]}
def __eq__(self, other):
return type(self) == type(other) and _kmap_eq(self.kmap, other.kmap)
def __hash__(self):
return 82345 ^ hash(type(self)) ^ _kmap_hash(self.kmap)
def __str__(self): def __str__(self):
return "%s{%s}" % ( return "%s{%s}" % (
self.__class__.__name__, self.__class__.__name__,
...@@ -822,15 +811,11 @@ csm_grad = CSMGrad ...@@ -822,15 +811,11 @@ csm_grad = CSMGrad
class Cast(gof.op.Op): class Cast(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
__props__ = ("out_type")
def __init__(self, out_type): def __init__(self, out_type):
self.out_type = out_type self.out_type = out_type
def __eq__(self, other):
return (type(self) == type(other)) and self.out_type == other.out_type
def __hash__(self):
return hash(type(self)) ^ hash(self.out_type)
def make_node(self, x): def make_node(self, x):
x = as_sparse_variable(x) x = as_sparse_variable(x)
assert x.format in ["csr", "csc"] assert x.format in ["csr", "csc"]
...@@ -900,16 +885,11 @@ def cast(variable, dtype): ...@@ -900,16 +885,11 @@ def cast(variable, dtype):
class DenseFromSparse(gof.op.Op): class DenseFromSparse(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
__props__ = ()
def __init__(self, structured=True): def __init__(self, structured=True):
self.sparse_grad = structured self.sparse_grad = structured
def __eq__(self, other):
return ((type(self) == type(other)) and
(self.sparse_grad == other.sparse_grad))
def __hash__(self):
return hash(type(self)) ^ hash(self.sparse_grad)
def __str__(self): def __str__(self):
return "%s{structured_grad=%s}" % ( return "%s{structured_grad=%s}" % (
self.__class__.__name__, self.__class__.__name__,
...@@ -973,14 +953,11 @@ dense_from_sparse = DenseFromSparse() ...@@ -973,14 +953,11 @@ dense_from_sparse = DenseFromSparse()
class SparseFromDense(gof.op.Op): class SparseFromDense(gof.op.Op):
def __init__(self, format):
self.format = format
def __eq__(self, other): __props__ = ()
return type(self) == type(other) and self.format == other.format
def __hash__(self): def __init__(self, format):
return 982374 ^ hash(self.format) ^ hash(DenseFromSparse) self.format = format
def __str__(self): def __str__(self):
return "%s{%s}" % ( return "%s{%s}" % (
...@@ -1036,11 +1013,7 @@ csc_from_dense = SparseFromDense('csc') ...@@ -1036,11 +1013,7 @@ csc_from_dense = SparseFromDense('csc')
# Indexing # Indexing
class GetItemList(gof.op.Op): class GetItemList(gof.op.Op):
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def infer_shape(self, node, shapes): def infer_shape(self, node, shapes):
return [(shapes[1][0], shapes[0][1])] return [(shapes[1][0], shapes[0][1])]
...@@ -1084,11 +1057,7 @@ returning them as a new sparse matrix. ...@@ -1084,11 +1057,7 @@ returning them as a new sparse matrix.
class GetItemListGrad(gof.op.Op): class GetItemListGrad(gof.op.Op):
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def infer_shape(self, node, shapes): def infer_shape(self, node, shapes):
return [(shapes[0])] return [(shapes[0])]
...@@ -1134,11 +1103,7 @@ get_item_list_grad = GetItemListGrad() ...@@ -1134,11 +1103,7 @@ get_item_list_grad = GetItemListGrad()
class GetItem2Lists(gof.op.Op): class GetItem2Lists(gof.op.Op):
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def make_node(self, x, ind1, ind2): def make_node(self, x, ind1, ind2):
x = as_sparse_variable(x) x = as_sparse_variable(x)
...@@ -1184,11 +1149,7 @@ get_item_2lists = GetItem2Lists() ...@@ -1184,11 +1149,7 @@ get_item_2lists = GetItem2Lists()
class GetItem2ListsGrad(gof.op.Op): class GetItem2ListsGrad(gof.op.Op):
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def infer_shape(self, node, shapes): def infer_shape(self, node, shapes):
return [(shapes[0])] return [(shapes[0])]
...@@ -1232,11 +1193,8 @@ get_item_2lists_grad = GetItem2ListsGrad() ...@@ -1232,11 +1193,8 @@ get_item_2lists_grad = GetItem2ListsGrad()
class GetItem2d(gof.op.Op): class GetItem2d(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self): __props__ = ()
return hash(type(self))
# Fred:Too complicated for now. If you need it, look at # Fred:Too complicated for now. If you need it, look at
# the Subtensor.infer_shape. # the Subtensor.infer_shape.
...@@ -1356,11 +1314,7 @@ when sparse vectors are supported. ...@@ -1356,11 +1314,7 @@ when sparse vectors are supported.
class GetItemScalar(gof.op.Op): class GetItemScalar(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def infer_shape(self, node, shapes): def infer_shape(self, node, shapes):
return [()] return [()]
...@@ -1422,12 +1376,7 @@ class Transpose(gof.op.Op): ...@@ -1422,12 +1376,7 @@ class Transpose(gof.op.Op):
format_map = {'csr': 'csc', format_map = {'csr': 'csc',
'csc': 'csr'} 'csc': 'csr'}
__props__ = ()
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return "Sparse" + self.__class__.__name__ return "Sparse" + self.__class__.__name__
...@@ -1471,11 +1420,8 @@ transpose = Transpose() ...@@ -1471,11 +1420,8 @@ transpose = Transpose()
class Neg(gof.op.Op): class Neg(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self): __props__ = ()
return hash(type(self))
def __str__(self): def __str__(self):
return "Sparse" + self.__class__.__name__ return "Sparse" + self.__class__.__name__
...@@ -1524,11 +1470,7 @@ class ColScaleCSC(gof.op.Op): ...@@ -1524,11 +1470,7 @@ class ColScaleCSC(gof.op.Op):
# :note: The grad implemented is structured. # :note: The grad implemented is structured.
def __eq__(self, other): __props__ = ()
return type(self) == type(other)
def __hash__(self):
return hash(type(self))
def make_node(self, x, s): def make_node(self, x, s):
if x.format != 'csc': if x.format != 'csc':
...@@ -1576,12 +1518,7 @@ class RowScaleCSC(gof.op.Op): ...@@ -1576,12 +1518,7 @@ class RowScaleCSC(gof.op.Op):
# :note: The grad implemented is structured. # :note: The grad implemented is structured.
view_map = {0: [0]} view_map = {0: [0]}
__props__ = ()
def __eq__(self, other):
return type(self) == type(other)
def __hash__(self):
return hash(type(self))
def make_node(self, x, s): def make_node(self, x, s):
x = as_sparse_variable(x) x = as_sparse_variable(x)
...@@ -1660,6 +1597,9 @@ def row_scale(x, s): ...@@ -1660,6 +1597,9 @@ def row_scale(x, s):
class SpSum(gof.op.Op): class SpSum(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
__props__ = ("axis", "sparse_grad")
def __init__(self, axis=None, sparse_grad=True): def __init__(self, axis=None, sparse_grad=True):
super(SpSum, self).__init__() super(SpSum, self).__init__()
self.axis = axis self.axis = axis
...@@ -1667,22 +1607,6 @@ class SpSum(gof.op.Op): ...@@ -1667,22 +1607,6 @@ class SpSum(gof.op.Op):
if self.axis not in (None, 0, 1): if self.axis not in (None, 0, 1):
raise ValueError('Illegal value for self.axis.') raise ValueError('Illegal value for self.axis.')
def __eq__(self, other):
# WARNING: judgement call...
# We are not using the structured in the comparison or hashing
# because it doesn't change the perform method therefore, we
# *do* want Sums with different structured values to be merged
# by the merge optimization and this requires them to compare equal.
return type(self) == type(other) and self.axis == other.axis
def __hash__(self):
# WARNING: judgement call...
# We are not using the structured in the comparison or hashing
# because it doesn't change the perform method therefore, we
# *do* want Sums with different structured values to be merged
# by the merge optimization and this requires them to compare equal.
return 76324 ^ hash(type(self)) ^ hash(self.axis)
def make_node(self, x): def make_node(self, x):
x = as_sparse_variable(x) x = as_sparse_variable(x)
assert x.format in ["csr", "csc"] assert x.format in ["csr", "csc"]
...@@ -1773,11 +1697,7 @@ def sp_sum(x, axis=None, sparse_grad=False): ...@@ -1773,11 +1697,7 @@ def sp_sum(x, axis=None, sparse_grad=False):
class Diag(gof.op.Op): class Diag(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def make_node(self, x): def make_node(self, x):
x = as_sparse_variable(x) x = as_sparse_variable(x)
...@@ -1819,11 +1739,8 @@ diag = Diag() ...@@ -1819,11 +1739,8 @@ diag = Diag()
class SquareDiagonal(gof.op.Op): class SquareDiagonal(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __eq__(self, other):
return type(self) == type(other)
def __hash__(self): __props__ = ()
return hash(type(self))
def make_node(self, diag): def make_node(self, diag):
diag = tensor.as_tensor_variable(diag) diag = tensor.as_tensor_variable(diag)
...@@ -1868,17 +1785,13 @@ is given by the dense vector argument. ...@@ -1868,17 +1785,13 @@ is given by the dense vector argument.
class EnsureSortedIndices(gof.op.Op): class EnsureSortedIndices(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
__props__ = ("inplace")
def __init__(self, inplace): def __init__(self, inplace):
self.inplace = inplace self.inplace = inplace
if self.inplace: if self.inplace:
self.view_map = {0: [0]} self.view_map = {0: [0]}
def __eq__(self, other):
return type(self) == type(other)
def __hash__(self):
return hash(type(self))
def make_node(self, x): def make_node(self, x):
x = as_sparse_variable(x) x = as_sparse_variable(x)
assert x.format in ["csr", "csc"] assert x.format in ["csr", "csc"]
...@@ -1941,11 +1854,7 @@ def clean(x): ...@@ -1941,11 +1854,7 @@ def clean(x):
class AddSS(gof.op.Op): class AddSS(gof.op.Op):
# add(sparse, sparse). # add(sparse, sparse).
# see the doc of add() for more detail. # see the doc of add() for more detail.
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
...@@ -1982,11 +1891,7 @@ add_s_s = AddSS() ...@@ -1982,11 +1891,7 @@ add_s_s = AddSS()
class AddSSData(gof.op.Op): class AddSSData(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def make_node(self, x, y): def make_node(self, x, y):
x, y = map(as_sparse_variable, [x, y]) x, y = map(as_sparse_variable, [x, y])
...@@ -2041,14 +1946,7 @@ pattern. ...@@ -2041,14 +1946,7 @@ pattern.
class AddSD(gof.op.Op): class AddSD(gof.op.Op):
# add(sparse, sparse). # add(sparse, sparse).
# see the doc of add() for more detail. # see the doc of add() for more detail.
def __init__(self, *args, **kwargs): __props__ = ()
gof.Op.__init__(self, *args, **kwargs)
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
...@@ -2090,11 +1988,8 @@ add_s_d = AddSD() ...@@ -2090,11 +1988,8 @@ add_s_d = AddSD()
class StructuredAddSV(gof.op.Op): class StructuredAddSV(gof.op.Op):
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self): __props__ = ()
return hash(type(self))
def make_node(self, x, y): def make_node(self, x, y):
x = as_sparse_variable(x) x = as_sparse_variable(x)
...@@ -2206,11 +2101,7 @@ def sub(x, y): ...@@ -2206,11 +2101,7 @@ def sub(x, y):
class MulSS(gof.op.Op): class MulSS(gof.op.Op):
# mul(sparse, sparse) # mul(sparse, sparse)
# See the doc of mul() for more detail # See the doc of mul() for more detail
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
...@@ -2249,11 +2140,7 @@ mul_s_s = MulSS() ...@@ -2249,11 +2140,7 @@ mul_s_s = MulSS()
class MulSD(gof.op.Op): class MulSD(gof.op.Op):
# mul(sparse, dense) # mul(sparse, dense)
# See the doc of mul() for more detail # See the doc of mul() for more detail
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
...@@ -2344,11 +2231,8 @@ mul_s_d = MulSD() ...@@ -2344,11 +2231,8 @@ mul_s_d = MulSD()
class MulSV(gof.op.Op): class MulSV(gof.op.Op):
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self): __props__ = ()
return hash(type(self))
def make_node(self, x, y): def make_node(self, x, y):
x = as_sparse_variable(x) x = as_sparse_variable(x)
...@@ -2459,17 +2343,12 @@ class __ComparisonOpSS(gof.op.Op): ...@@ -2459,17 +2343,12 @@ class __ComparisonOpSS(gof.op.Op):
:return: Comparison(x,y) :return: Comparison(x,y)
""" """
__props__ = ()
# Function to override # Function to override
def comparison(self, x, y): def comparison(self, x, y):
raise NotImplementedError() raise NotImplementedError()
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def make_node(self, x, y): def make_node(self, x, y):
x = as_sparse_variable(x) x = as_sparse_variable(x)
y = as_sparse_variable(y) y = as_sparse_variable(y)
...@@ -2505,17 +2384,12 @@ class __ComparisonOpSD(gof.op.Op): ...@@ -2505,17 +2384,12 @@ class __ComparisonOpSD(gof.op.Op):
:return: Comparison(x,y) :return: Comparison(x,y)
""" """
__props__ = ()
# Function to override # Function to override
def comparison(self, x, y): def comparison(self, x, y):
raise NotImplementedError() raise NotImplementedError()
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def make_node(self, x, y): def make_node(self, x, y):
x, y = as_sparse_variable(x), tensor.as_tensor_variable(y) x, y = as_sparse_variable(x), tensor.as_tensor_variable(y)
...@@ -2735,6 +2609,8 @@ ge = __ComparisonSwitch(greater_equal_s_s, greater_equal_s_d, ...@@ -2735,6 +2609,8 @@ ge = __ComparisonSwitch(greater_equal_s_s, greater_equal_s_d,
class HStack(gof.op.Op): class HStack(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
__props__ = ("format", "dtype")
def __init__(self, format=None, dtype=None): def __init__(self, format=None, dtype=None):
if format is None: if format is None:
self.format = 'csc' self.format = 'csc'
...@@ -2745,14 +2621,6 @@ class HStack(gof.op.Op): ...@@ -2745,14 +2621,6 @@ class HStack(gof.op.Op):
raise ValueError('The output dtype must be specified.') raise ValueError('The output dtype must be specified.')
self.dtype = dtype self.dtype = dtype
def __eq__(self, other):
return (type(self) == type(other) and
self.format == other.format and
self.dtype == other.dtype)
def __hash__(self):
return hash(type(self)) ^ hash(self.format) ^ hash(self.dtype)
def make_node(self, *mat): def make_node(self, *mat):
if not mat: if not mat:
raise ValueError('Cannot join an empty list of sparses.') raise ValueError('Cannot join an empty list of sparses.')
...@@ -2901,8 +2769,7 @@ def vstack(blocks, format=None, dtype=None): ...@@ -2901,8 +2769,7 @@ def vstack(blocks, format=None, dtype=None):
class Remove0(gof.Op): class Remove0(gof.Op):
# See doc in instance of this Op or a function after the class definition. # See doc in instance of this Op or a function after the class definition.
def __init__(self, inplace=False, *args, **kwargs): def __init__(self, inplace=False):
gof.Op.__init__(self, *args, **kwargs)
self.inplace = inplace self.inplace = inplace
if self.inplace: if self.inplace:
self.destroy_map = {0: [0]} self.destroy_map = {0: [0]}
...@@ -3317,11 +3184,7 @@ def true_dot(x, y, grad_preserves_dense=True): ...@@ -3317,11 +3184,7 @@ def true_dot(x, y, grad_preserves_dense=True):
# Dot # Dot
class StructuredDot(gof.Op): class StructuredDot(gof.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __eq__(self, other): __props__ = ()
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
...@@ -3457,12 +3320,7 @@ class StructuredDotGradCSC(gof.Op): ...@@ -3457,12 +3320,7 @@ class StructuredDotGradCSC(gof.Op):
# :note: The grad implemented is structured. # :note: The grad implemented is structured.
# :note: a_* are the corresponding properties of a sparse # :note: a_* are the corresponding properties of a sparse
# matrix in csc format. # matrix in csc format.
__props__ = ()
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
...@@ -3595,12 +3453,7 @@ class StructuredDotGradCSR(gof.Op): ...@@ -3595,12 +3453,7 @@ class StructuredDotGradCSR(gof.Op):
# :note: The grad implemented is structured. # :note: The grad implemented is structured.
# :note: a_* are the corresponding properties of a sparse # :note: a_* are the corresponding properties of a sparse
# matrix in csr format. # matrix in csr format.
__props__ = ()
def __eq__(self, other):
return (type(self) == type(other))
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
...@@ -3742,11 +3595,7 @@ def structured_dot_grad(sparse_A, dense_B, ga): ...@@ -3742,11 +3595,7 @@ def structured_dot_grad(sparse_A, dense_B, ga):
class SamplingDot(gof.op.Op): class SamplingDot(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __eq__(self, other): __props__ = ()
return type(self) == type(other)
def __hash__(self):
return hash(type(self))
def make_node(self, x, y, p): def make_node(self, x, y, p):
x = tensor.as_tensor_variable(x) x = tensor.as_tensor_variable(x)
...@@ -3823,11 +3672,7 @@ than `dot` because SamplingDot requires `x` to be a `m`x`k` matrix while ...@@ -3823,11 +3672,7 @@ than `dot` because SamplingDot requires `x` to be a `m`x`k` matrix while
class Dot(gof.op.Op): class Dot(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __eq__(self, other): __props__ = ()
return type(self) == type(other)
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return "Sparse" + self.__class__.__name__ return "Sparse" + self.__class__.__name__
...@@ -3958,12 +3803,7 @@ class Usmm(gof.op.Op): ...@@ -3958,12 +3803,7 @@ class Usmm(gof.op.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
# We don't implement the infer_shape as it is # We don't implement the infer_shape as it is
# inserted by optimization only. # inserted by optimization only.
__props__ = ()
def __eq__(self, other):
return type(self) == type(other)
def __hash__(self):
return hash(type(self))
def __str__(self): def __str__(self):
return 'Usmm{no_inplace}' return 'Usmm{no_inplace}'
...@@ -4033,11 +3873,7 @@ usmm = Usmm() ...@@ -4033,11 +3873,7 @@ usmm = Usmm()
class ConstructSparseFromList(gof.Op): class ConstructSparseFromList(gof.Op):
# See doc in instance of this Op or function after this class definition. # See doc in instance of this Op or function after this class definition.
def __hash__(self): __props__ = ()
return hash((type(self)))
def __eq__(self, other):
return (type(self) == type(other))
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论