Add eigvals to LinearOperator. This will return the eigenvalues of a self-adjoint operator.

PiperOrigin-RevId: 274689673
This commit is contained in:
Srinivas Vasudevan 2019-10-14 16:45:23 -07:00 committed by TensorFlower Gardener
parent a2ef5761cd
commit b3cbdd5b68
55 changed files with 302 additions and 14 deletions

View File

@ -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,

View File

@ -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))

View File

@ -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

View File

@ -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)

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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`.

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -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`."""

View File

@ -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()

View File

@ -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]

View File

@ -202,3 +202,6 @@ class LinearOperatorLowerTriangular(linear_operator.LinearOperator):
def _to_dense(self):
return self._get_tril()
def _eigvals(self):
return self._get_diag()

View File

@ -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",

View File

@ -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()

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "

View File

@ -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\'], "