Add eigvals to LinearOperator. This will return the eigenvalues of a self-adjoint operator.
PiperOrigin-RevId: 274689673
This commit is contained in:
parent
a2ef5761cd
commit
b3cbdd5b68
@ -257,7 +257,7 @@ class LinearOperatorCirculantTestNonHermitianSpectrum(
|
||||
# spectra.
|
||||
@staticmethod
|
||||
def skip_these_tests():
|
||||
return ["cholesky"]
|
||||
return ["cholesky", "eigvalsh"]
|
||||
|
||||
def operator_and_matrix(
|
||||
self, shape_info, dtype, use_placeholder,
|
||||
@ -541,7 +541,7 @@ class LinearOperatorCirculant2DTestNonHermitianSpectrum(
|
||||
|
||||
@staticmethod
|
||||
def skip_these_tests():
|
||||
return ["cholesky"]
|
||||
return ["cholesky", "eigvalsh"]
|
||||
|
||||
def operator_and_matrix(
|
||||
self, shape_info, dtype, use_placeholder,
|
||||
|
@ -48,16 +48,24 @@ class SquareLinearOperatorCompositionTest(
|
||||
# Cholesky not implemented.
|
||||
return ["cholesky"]
|
||||
|
||||
def operator_and_matrix(self, build_info, dtype, use_placeholder):
|
||||
def operator_and_matrix(self, build_info, dtype, use_placeholder,
|
||||
ensure_self_adjoint_and_pd=False):
|
||||
shape = list(build_info.shape)
|
||||
|
||||
# Either 1 or 2 matrices, depending.
|
||||
num_operators = rng.randint(low=1, high=3)
|
||||
matrices = [
|
||||
linear_operator_test_util.random_positive_definite_matrix(
|
||||
shape, dtype, force_well_conditioned=True)
|
||||
for _ in range(num_operators)
|
||||
]
|
||||
if ensure_self_adjoint_and_pd:
|
||||
# The random PD matrices are also symmetric. Here we are computing
|
||||
# A @ A ... @ A. Since A is symmetric and PD, so are any powers of it.
|
||||
matrices = [
|
||||
linear_operator_test_util.random_positive_definite_matrix(
|
||||
shape, dtype, force_well_conditioned=True)] * num_operators
|
||||
else:
|
||||
matrices = [
|
||||
linear_operator_test_util.random_positive_definite_matrix(
|
||||
shape, dtype, force_well_conditioned=True)
|
||||
for _ in range(num_operators)
|
||||
]
|
||||
|
||||
lin_op_matrices = matrices
|
||||
|
||||
@ -68,6 +76,8 @@ class SquareLinearOperatorCompositionTest(
|
||||
|
||||
operator = linalg.LinearOperatorComposition(
|
||||
[linalg.LinearOperatorFullMatrix(l) for l in lin_op_matrices],
|
||||
is_positive_definite=True if ensure_self_adjoint_and_pd else None,
|
||||
is_self_adjoint=True if ensure_self_adjoint_and_pd else None,
|
||||
is_square=True)
|
||||
|
||||
matmul_order_list = list(reversed(matrices))
|
||||
|
@ -199,7 +199,7 @@ class LinearOperatorLowRankUpdatetestWithDiagCannotUseCholesky(
|
||||
|
||||
@staticmethod
|
||||
def skip_these_tests():
|
||||
return ["cholesky"]
|
||||
return ["cholesky", "eigvalsh"]
|
||||
|
||||
_use_diag_update = True
|
||||
_is_diag_update_positive = False
|
||||
@ -242,7 +242,7 @@ class LinearOperatorLowRankUpdatetestNoDiagCannotUseCholesky(
|
||||
|
||||
@staticmethod
|
||||
def skip_these_tests():
|
||||
return ["cholesky"]
|
||||
return ["cholesky", "eigvalsh"]
|
||||
|
||||
_use_diag_update = False
|
||||
_is_diag_update_positive = None
|
||||
|
@ -38,19 +38,28 @@ class LinearOperatorLowerTriangularTest(
|
||||
# Cholesky does not make sense for triangular matrices.
|
||||
return ["cholesky"]
|
||||
|
||||
def operator_and_matrix(self, build_info, dtype, use_placeholder):
|
||||
def operator_and_matrix(self, build_info, dtype, use_placeholder,
|
||||
ensure_self_adjoint_and_pd=False):
|
||||
shape = list(build_info.shape)
|
||||
# Upper triangle will be nonzero, but ignored.
|
||||
# Use a diagonal that ensures this matrix is well conditioned.
|
||||
tril = linear_operator_test_util.random_tril_matrix(
|
||||
shape, dtype=dtype, force_well_conditioned=True, remove_upper=False)
|
||||
if ensure_self_adjoint_and_pd:
|
||||
# Get the diagonal and make the matrix out of it.
|
||||
tril = array_ops.matrix_diag_part(tril)
|
||||
tril = math_ops.abs(tril) + 1e-1
|
||||
tril = array_ops.matrix_diag(tril)
|
||||
|
||||
lin_op_tril = tril
|
||||
|
||||
if use_placeholder:
|
||||
lin_op_tril = array_ops.placeholder_with_default(lin_op_tril, shape=None)
|
||||
|
||||
operator = linalg.LinearOperatorLowerTriangular(lin_op_tril)
|
||||
operator = linalg.LinearOperatorLowerTriangular(
|
||||
lin_op_tril,
|
||||
is_self_adjoint=True if ensure_self_adjoint_and_pd else None,
|
||||
is_positive_definite=True if ensure_self_adjoint_and_pd else None)
|
||||
|
||||
matrix = array_ops.matrix_band_part(tril, -1, 0)
|
||||
|
||||
|
@ -50,7 +50,7 @@ class LinearOperatorPermutationTest(
|
||||
@staticmethod
|
||||
def skip_these_tests():
|
||||
# This linear operator is almost never positive definite.
|
||||
return ["cholesky"]
|
||||
return ["cholesky", "eigvalsh"]
|
||||
|
||||
def operator_and_matrix(
|
||||
self, build_info, dtype, use_placeholder,
|
||||
|
@ -1052,6 +1052,28 @@ class LinearOperator(module.Module):
|
||||
self._check_input_dtype(x)
|
||||
return self._add_to_tensor(x)
|
||||
|
||||
def _eigvals(self):
|
||||
return linalg_ops.self_adjoint_eigvals(self.to_dense())
|
||||
|
||||
def eigvals(self, name="eigvals"):
|
||||
"""Returns the eigenvalues of this linear operator.
|
||||
|
||||
If the operator is marked as self-adjoint (via `is_self_adjoint`)
|
||||
this computation can be more efficient.
|
||||
|
||||
Note: This currently only supports self-adjoint operators.
|
||||
|
||||
Args:
|
||||
name: A name for this `Op`.
|
||||
|
||||
Returns:
|
||||
Shape `[B1,...,Bb, N]` `Tensor` of same `dtype` as `self`.
|
||||
"""
|
||||
if not self.is_self_adjoint:
|
||||
raise NotImplementedError("Only self-adjoint matrices are supported.")
|
||||
with self._name_scope(name):
|
||||
return self._eigvals()
|
||||
|
||||
def _can_use_cholesky(self):
|
||||
return self.is_self_adjoint and self.is_positive_definite
|
||||
|
||||
|
@ -211,3 +211,9 @@ class LinearOperatorAdjoint(linear_operator.LinearOperator):
|
||||
|
||||
def _add_to_tensor(self, x):
|
||||
return self.to_dense() + x
|
||||
|
||||
def _eigvals(self):
|
||||
eigvals = self.operator.eigvals()
|
||||
if not self.operator.is_self_adjoint:
|
||||
eigvals = math_ops.conj(eigvals)
|
||||
return eigvals
|
||||
|
@ -349,6 +349,15 @@ class LinearOperatorBlockDiag(linear_operator.LinearOperator):
|
||||
return control_flow_ops.group([
|
||||
operator.assert_positive_definite() for operator in self.operators])
|
||||
|
||||
def _eigvals(self):
|
||||
eig_list = []
|
||||
for operator in self.operators:
|
||||
# Extend the axis for broadcasting.
|
||||
eig_list += [operator.eigvals()[..., array_ops.newaxis]]
|
||||
eig_list = linear_operator_util.broadcast_matrix_batch_dims(eig_list)
|
||||
eigs = array_ops.concat(eig_list, axis=-2)
|
||||
return array_ops.squeeze(eigs, axis=-1)
|
||||
|
||||
def _split_input_into_blocks(self, x, axis=-1):
|
||||
"""Split `x` into blocks matching `operators`'s `domain_dimension`.
|
||||
|
||||
|
@ -749,6 +749,9 @@ class LinearOperatorCirculant(_BaseLinearOperatorCirculant):
|
||||
is_square=is_square,
|
||||
name=name)
|
||||
|
||||
def _eigvals(self):
|
||||
return ops.convert_to_tensor(self.spectrum)
|
||||
|
||||
|
||||
@tf_export("linalg.LinearOperatorCirculant2D")
|
||||
class LinearOperatorCirculant2D(_BaseLinearOperatorCirculant):
|
||||
|
@ -244,6 +244,9 @@ class LinearOperatorDiag(linear_operator.LinearOperator):
|
||||
new_diag = self._diag + x_diag
|
||||
return array_ops.matrix_set_diag(x, new_diag)
|
||||
|
||||
def _eigvals(self):
|
||||
return ops.convert_to_tensor(self.diag)
|
||||
|
||||
@property
|
||||
def diag(self):
|
||||
return self._diag
|
||||
|
@ -240,6 +240,17 @@ class LinearOperatorHouseholder(linear_operator.LinearOperator):
|
||||
reflection_axis, axis=-1, keepdims=True)
|
||||
return 1. - 2 * normalized_axis * math_ops.conj(normalized_axis)
|
||||
|
||||
def _eigvals(self):
|
||||
# We have (n - 1) +1 eigenvalues and a single -1 eigenvalue.
|
||||
result_shape = array_ops.shape(self.reflection_axis)
|
||||
n = result_shape[-1]
|
||||
ones_shape = array_ops.concat([result_shape[:-1], [n - 1]], axis=-1)
|
||||
neg_shape = array_ops.concat([result_shape[:-1], [1]], axis=-1)
|
||||
eigvals = array_ops.ones(shape=ones_shape, dtype=self.dtype)
|
||||
eigvals = array_ops.concat(
|
||||
[-array_ops.ones(shape=neg_shape, dtype=self.dtype), eigvals], axis=-1)
|
||||
return eigvals
|
||||
|
||||
@property
|
||||
def reflection_axis(self):
|
||||
return self._reflection_axis
|
||||
|
@ -399,6 +399,9 @@ class LinearOperatorIdentity(BaseLinearOperatorIdentity):
|
||||
new_diag = 1 + mat_diag
|
||||
return array_ops.matrix_set_diag(mat, new_diag)
|
||||
|
||||
def _eigvals(self):
|
||||
return self._ones_diag()
|
||||
|
||||
def _check_num_rows_possibly_add_asserts(self):
|
||||
"""Static check of init arg `num_rows`, possibly add asserts."""
|
||||
# Possibly add asserts.
|
||||
@ -724,6 +727,9 @@ class LinearOperatorScaledIdentity(BaseLinearOperatorIdentity):
|
||||
|
||||
return array_ops.matrix_set_diag(mat, new_diag)
|
||||
|
||||
def _eigvals(self):
|
||||
return self._ones_diag() * self.multiplier[..., array_ops.newaxis]
|
||||
|
||||
@property
|
||||
def multiplier(self):
|
||||
"""The [batch] scalar `Tensor`, `c` in `cI`."""
|
||||
|
@ -196,3 +196,6 @@ class LinearOperatorInversion(linear_operator.LinearOperator):
|
||||
|
||||
def _solve(self, rhs, adjoint=False, adjoint_arg=False):
|
||||
return self.operator.matmul(rhs, adjoint=adjoint, adjoint_arg=adjoint_arg)
|
||||
|
||||
def _eigvals(self):
|
||||
return 1. / self.operator.eigvals()
|
||||
|
@ -522,7 +522,7 @@ class LinearOperatorKronecker(linear_operator.LinearOperator):
|
||||
def _to_dense(self):
|
||||
product = self.operators[0].to_dense()
|
||||
for operator in self.operators[1:]:
|
||||
# Product has shape [B, R1, 1, C1].
|
||||
# Product has shape [B, R1, 1, C1, 1].
|
||||
product = product[
|
||||
..., :, array_ops.newaxis, :, array_ops.newaxis]
|
||||
# Operator has shape [B, 1, R2, 1, C2].
|
||||
@ -541,6 +541,25 @@ class LinearOperatorKronecker(linear_operator.LinearOperator):
|
||||
product.set_shape(self.shape)
|
||||
return product
|
||||
|
||||
def _eigvals(self):
|
||||
# This will be the kronecker product of all the eigenvalues.
|
||||
# Note: It doesn't matter which kronecker product it is, since every
|
||||
# kronecker product of the same matrices are similar.
|
||||
eigvals = [operator.eigvals() for operator in self.operators]
|
||||
# Now compute the kronecker product
|
||||
product = eigvals[0]
|
||||
for eigval in eigvals[1:]:
|
||||
# Product has shape [B, R1, 1].
|
||||
product = product[..., array_ops.newaxis]
|
||||
# Eigval has shape [B, 1, R2]. Produces shape [B, R1, R2].
|
||||
product *= eigval[..., array_ops.newaxis, :]
|
||||
# Reshape to [B, R1 * R2]
|
||||
product = array_ops.reshape(
|
||||
product,
|
||||
shape=array_ops.concat([array_ops.shape(product)[:-2], [-1]], axis=0))
|
||||
product.set_shape(self.shape[:-1])
|
||||
return product
|
||||
|
||||
def _assert_non_singular(self):
|
||||
if all(operator.is_square for operator in self.operators):
|
||||
asserts = [operator.assert_non_singular() for operator in self.operators]
|
||||
|
@ -202,3 +202,6 @@ class LinearOperatorLowerTriangular(linear_operator.LinearOperator):
|
||||
|
||||
def _to_dense(self):
|
||||
return self._get_tril()
|
||||
|
||||
def _eigvals(self):
|
||||
return self._get_diag()
|
||||
|
@ -35,6 +35,7 @@ from tensorflow.python.ops import array_ops
|
||||
from tensorflow.python.ops import linalg_ops
|
||||
from tensorflow.python.ops import math_ops
|
||||
from tensorflow.python.ops import random_ops
|
||||
from tensorflow.python.ops import sort_ops
|
||||
from tensorflow.python.ops.linalg import linalg_impl as linalg
|
||||
from tensorflow.python.ops.linalg import linear_operator_util
|
||||
from tensorflow.python.platform import test
|
||||
@ -413,6 +414,32 @@ def _test_cholesky(use_placeholder, shapes_info, dtype):
|
||||
return test_cholesky
|
||||
|
||||
|
||||
def _test_eigvalsh(use_placeholder, shapes_info, dtype):
|
||||
def test_eigvalsh(self):
|
||||
with self.test_session(graph=ops.Graph()) as sess:
|
||||
sess.graph.seed = random_seed.DEFAULT_GRAPH_SEED
|
||||
operator, mat = self.operator_and_matrix(
|
||||
shapes_info, dtype, use_placeholder=use_placeholder,
|
||||
ensure_self_adjoint_and_pd=True)
|
||||
# Eigenvalues are real, so we'll cast these to float64 and sort
|
||||
# for comparison.
|
||||
op_eigvals = sort_ops.sort(
|
||||
math_ops.cast(operator.eigvals(), dtype=dtypes.float64), axis=-1)
|
||||
mat_eigvals = sort_ops.sort(
|
||||
math_ops.cast(
|
||||
linalg_ops.self_adjoint_eigvals(mat), dtype=dtypes.float64),
|
||||
axis=-1)
|
||||
op_eigvals_v, mat_eigvals_v = sess.run([op_eigvals, mat_eigvals])
|
||||
|
||||
atol = self._atol[dtype] # pylint: disable=protected-access
|
||||
rtol = self._rtol[dtype] # pylint: disable=protected-access
|
||||
if dtype == dtypes.float32 or dtype == dtypes.complex64:
|
||||
atol = 1e-5
|
||||
rtol = 1e-5
|
||||
self.assertAllClose(op_eigvals_v, mat_eigvals_v, atol=atol, rtol=rtol)
|
||||
return test_eigvalsh
|
||||
|
||||
|
||||
def _test_solve_base(
|
||||
self,
|
||||
use_placeholder,
|
||||
@ -552,6 +579,7 @@ def add_tests(test_cls):
|
||||
"cholesky": _test_cholesky,
|
||||
"det": _test_det,
|
||||
"diag_part": _test_diag_part,
|
||||
"eigvalsh": _test_eigvalsh,
|
||||
"inverse": _test_inverse,
|
||||
"log_abs_det": _test_log_abs_det,
|
||||
"matmul": _test_matmul,
|
||||
@ -678,6 +706,7 @@ class NonSquareLinearOperatorDerivedClassTest(LinearOperatorDerivedClassTest):
|
||||
"""List of test names to skip."""
|
||||
return [
|
||||
"cholesky",
|
||||
"eigvalsh",
|
||||
"inverse",
|
||||
"solve",
|
||||
"solve_with_broadcast",
|
||||
|
@ -454,3 +454,6 @@ class LinearOperatorZeros(linear_operator.LinearOperator):
|
||||
[self._min_matrix_dim_tensor()]], axis=0)
|
||||
|
||||
return array_ops.zeros(shape=d_shape, dtype=self.dtype)
|
||||
|
||||
def _eigvals(self):
|
||||
return self._zeros_diag()
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -143,6 +143,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -143,6 +143,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -143,6 +143,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -118,6 +118,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -119,6 +119,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -142,6 +142,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -118,6 +118,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -123,6 +123,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -126,6 +126,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -118,6 +118,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -117,6 +117,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -143,6 +143,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -143,6 +143,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -143,6 +143,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -118,6 +118,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -119,6 +119,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -142,6 +142,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -118,6 +118,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -122,6 +122,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -123,6 +123,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -126,6 +126,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -118,6 +118,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
@ -117,6 +117,10 @@ tf_class {
|
||||
name: "domain_dimension_tensor"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'domain_dimension_tensor\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "eigvals"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'eigvals\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "inverse"
|
||||
argspec: "args=[\'self\', \'name\'], varargs=None, keywords=None, defaults=[\'inverse\'], "
|
||||
|
Loading…
Reference in New Issue
Block a user