|TensorFlow 1 version||View source on GitHub|
Base class defining a [batch of] linear operator[s].
Compat aliases for migration
See Migration guide for more details.
tf.linalg.LinearOperator( dtype, graph_parents=None, is_non_singular=None, is_self_adjoint=None, is_positive_definite=None, is_square=None, name=None, parameters=None )
LinearOperator provide access to common methods on a
(batch) matrix, without the need to materialize the matrix. This allows:
- Matrix free computations
- Operators that take advantage of special structure, while providing a consistent API to users.
To enable a public method, subclasses should implement the leading-underscore
version of the method. The argument signature should be identical except for
the omission of
name="...". For example, to enable
matmul(x, adjoint=False, name="matmul") a subclass should implement
Subclasses should only implement the assert methods
assert_non_singular) if they can be done in less than
Class docstrings should contain an explanation of computational complexity. Since this is a high-performance library, attention should be paid to detail, and explanations can include constants as well as Big-O notation.
LinearOperator subclasses should operate on a [batch] matrix with
compatible shape. Class docstrings should define what is meant by compatible
shape. Some subclasses may not support batching.
x is a batch matrix with compatible shape for
operator.shape = [B1,...,Bb] + [M, N], b >= 0, x.shape = [B1,...,Bb] + [N, R]
rhs is a batch matrix with compatible shape for
operator.shape = [B1,...,Bb] + [M, N], b >= 0, rhs.shape = [B1,...,Bb] + [M, R]
Example docstring for subclasses.
This operator acts like a (batch) matrix
A with shape
[B1,...,Bb, M, N] for some
b >= 0. The first
b indices index a
batch member. For every batch index
A[i1,...,ib, : :] is
m x n matrix. Again, this matrix
A may not be materialized, but for
purposes of identifying and working with compatible arguments the shape is
some_tensor = ... shape = ???? operator = MyLinOp(some_tensor) operator.shape() ==> [2, 4, 4] operator.log_abs_determinant() ==> Shape  Tensor x = ... Shape [2, 4, 5] Tensor operator.matmul(x) ==> Shape [2, 4, 5] Tensor
This operator acts on batch matrices with compatible shape. FILL IN WHAT IS MEANT BY COMPATIBLE SHAPE
FILL THIS IN
Matrix property hints
LinearOperator is initialized with boolean flags of the form
X = non_singular, self_adjoint, positive_definite, square.
These have the following meaning:
is_X == True, callers should expect the operator to have the property
X. This is a promise that should be fulfilled, but is not a runtime assert. For example, finite floating point precision may result in these promises being violated.
is_X == False, callers should expect the operator to not have
is_X == None(the default), callers should have no expectation either way.
All subclasses of
LinearOperator are expected to pass a
super().__init__(). This should be a
the unadulterated arguments passed to the subclass
__init__. For example,
MyLinearOperator with an initializer should look like:
def __init__(self, operator, is_square=False, name=None): parameters = dict( operator=operator, is_square=is_square, name=name ) ... super().__init__(..., parameters=parameters) ``` Users can then access `my_linear_operator.parameters` to see all arguments passed to its initializer. <!-- Tabular view --> <table class="responsive fixed orange"> <colgroup><col width="214px"><col></colgroup> <tr><th colspan="2"><h2 class="add-link">Args</h2></th></tr> <tr> <td> `dtype` </td> <td> The type of the this `LinearOperator`. Arguments to `matmul` and `solve` will have to be this type. </td> </tr><tr> <td> `graph_parents` </td> <td> (Deprecated) Python list of graph prerequisites of this `LinearOperator` Typically tensors that are passed during initialization </td> </tr><tr> <td> `is_non_singular` </td> <td> Expect that this operator is non-singular. </td> </tr><tr> <td> `is_self_adjoint` </td> <td> Expect that this operator is equal to its hermitian transpose. If `dtype` is real, this is equivalent to being symmetric. </td> </tr><tr> <td> `is_positive_definite` </td> <td> Expect that this operator is positive definite, meaning the quadratic form `x^H A x` has positive real part for all nonzero `x`. Note that we do not require the operator to be self-adjoint to be positive-definite. See: <a href="https://en.wikipedia.org/wiki/Positive-definite_matrix#Extension_for_non-symmetric_matrices">https://en.wikipedia.org/wiki/Positive-definite_matrix#Extension_for_non-symmetric_matrices</a> </td> </tr><tr> <td> `is_square` </td> <td> Expect that this operator acts like square [batch] matrices. </td> </tr><tr> <td> `name` </td> <td> A name for this `LinearOperator`. </td> </tr><tr> <td> `parameters` </td> <td> Python `dict` of parameters used to instantiate this `LinearOperator`. </td> </tr> </table> <!-- Tabular view --> <table class="responsive fixed orange"> <colgroup><col width="214px"><col></colgroup> <tr><th colspan="2"><h2 class="add-link">Raises</h2></th></tr> <tr> <td> `ValueError` </td> <td> If any member of graph_parents is `None` or not a `Tensor`. </td> </tr><tr> <td> `ValueError` </td> <td> If hints are set incorrectly. </td> </tr> </table> <!-- Ta