10cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
20cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower#
30cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# Licensed under the Apache License, Version 2.0 (the "License");
40cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# you may not use this file except in compliance with the License.
50cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# You may obtain a copy of the License at
60cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower#
70cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower#     http://www.apache.org/licenses/LICENSE-2.0
80cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower#
90cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# Unless required by applicable law or agreed to in writing, software
100cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# distributed under the License is distributed on an "AS IS" BASIS,
110cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# See the License for the specific language governing permissions and
130cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# limitations under the License.
140cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower# ==============================================================================
150cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower"""Operations for linear algebra."""
160cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower
170cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlowerfrom __future__ import absolute_import
180cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlowerfrom __future__ import division
190cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlowerfrom __future__ import print_function
200cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower
210cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlowerfrom tensorflow.python.framework import ops
220cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlowerfrom tensorflow.python.ops import array_ops
230cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlowerfrom tensorflow.python.ops import gen_linalg_ops
24f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerfrom tensorflow.python.ops import linalg_ops
250cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlowerfrom tensorflow.python.ops import math_ops
26f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerfrom tensorflow.python.ops import special_math_ops
275fb3c20b2f864bf88540fe5aaef3df4e70c2a6adAnna Rfrom tensorflow.python.util.tf_export import tf_export
28f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlower
29f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlower# Linear algebra ops.
30f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerband_part = array_ops.matrix_band_part
31f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowercholesky = linalg_ops.cholesky
32f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowercholesky_solve = linalg_ops.cholesky_solve
33f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerdet = linalg_ops.matrix_determinant
34f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlower# pylint: disable=protected-access
35f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerslogdet = gen_linalg_ops._log_matrix_determinant
36f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlower# pylint: disable=protected-access
37f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerdiag = array_ops.matrix_diag
38f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerdiag_part = array_ops.matrix_diag_part
39f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowereigh = linalg_ops.self_adjoint_eig
40f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowereigvalsh = linalg_ops.self_adjoint_eigvals
41f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowereinsum = special_math_ops.einsum
42da1b1d28faca9aa65e832b9bbada8d509ea2df7dA. Unique TensorFlowerexpm = gen_linalg_ops._matrix_exponential
43f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowereye = linalg_ops.eye
44f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerinv = linalg_ops.matrix_inverse
4541df0c81c0f402fb7ba7c8988a7054c69a0f8346A. Unique TensorFlowerlogm = gen_linalg_ops._matrix_logarithm
46f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerlstsq = linalg_ops.matrix_solve_ls
47f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowernorm = linalg_ops.norm
48f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerqr = linalg_ops.qr
49f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowerset_diag = array_ops.matrix_set_diag
50f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowersolve = linalg_ops.matrix_solve
51f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowersvd = linalg_ops.svd
52f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowertensordot = math_ops.tensordot
53f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowertrace = math_ops.trace
54f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowertranspose = array_ops.matrix_transpose
55f0aa811ee71ef2a54c67a1311557b331379a56e6A. Unique TensorFlowertriangular_solve = linalg_ops.matrix_triangular_solve
560cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower
570cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower
585fb3c20b2f864bf88540fe5aaef3df4e70c2a6adAnna R@tf_export('linalg.logdet')
590cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlowerdef logdet(matrix, name=None):
600cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  """Computes log of the determinant of a hermitian positive definite matrix.
610cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower
620cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  ```python
630cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  # Compute the determinant of a matrix while reducing the chance of over- or
640cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  underflow:
650cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  A = ... # shape 10 x 10
660cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  det = tf.exp(tf.logdet(A))  # scalar
670cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  ```
680cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower
690cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  Args:
70f85f23bea87ea856ac839806b5d62f4257fb684bJoshua V. Dillon    matrix:  A `Tensor`. Must be `float16`, `float32`, `float64`, `complex64`,
71f85f23bea87ea856ac839806b5d62f4257fb684bJoshua V. Dillon      or `complex128` with shape `[..., M, M]`.
720cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower    name:  A name to give this `Op`.  Defaults to `logdet`.
730cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower
740cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  Returns:
750cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower    The natural log of the determinant of `matrix`.
760cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower
770cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  @compatibility(numpy)
780cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  Equivalent to numpy.linalg.slogdet, although no sign is returned since only
790cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  hermitian positive definite matrices are supported.
800cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  @end_compatibility
810cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  """
820cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  # This uses the property that the log det(A) = 2*sum(log(real(diag(C))))
830cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  # where C is the cholesky decomposition of A.
840cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower  with ops.name_scope(name, 'logdet', [matrix]):
850cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower    chol = gen_linalg_ops.cholesky(matrix)
860cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower    return 2.0 * math_ops.reduce_sum(
870cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower        math_ops.log(math_ops.real(array_ops.matrix_diag_part(chol))),
880cff60ebb29f5aba5092988c8b7f13c258115e81A. Unique TensorFlower        reduction_indices=[-1])
89d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower
90d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower
915fb3c20b2f864bf88540fe5aaef3df4e70c2a6adAnna R@tf_export('linalg.adjoint')
92d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlowerdef adjoint(matrix, name=None):
93bc52fbda2bbe458c9ff5f20ebc48188959ebe026A. Unique TensorFlower  """Transposes the last two dimensions of and conjugates tensor `matrix`.
94d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower
95d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower  For example:
96d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower
97d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower  ```python
98d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower  x = tf.constant([[1 + 1j, 2 + 2j, 3 + 3j],
99d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower                   [4 + 4j, 5 + 5j, 6 + 6j]])
100d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower  tf.linalg.adjoint(x)  # [[1 - 1j, 4 - 4j],
101d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower                        #  [2 - 2j, 5 - 5j],
102d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower                        #  [3 - 3j, 6 - 6j]]
103d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower
104d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower  Args:
105f85f23bea87ea856ac839806b5d62f4257fb684bJoshua V. Dillon    matrix:  A `Tensor`. Must be `float16`, `float32`, `float64`, `complex64`,
106f85f23bea87ea856ac839806b5d62f4257fb684bJoshua V. Dillon      or `complex128` with shape `[..., M, M]`.
107d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower    name:  A name to give this `Op` (optional).
108d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower
109d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower  Returns:
110d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower    The adjoint (a.k.a. Hermitian transpose a.k.a. conjugate transpose) of
111d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower    matrix.
112d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower  """
113d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower  with ops.name_scope(name, 'adjoint', [matrix]):
114bc52fbda2bbe458c9ff5f20ebc48188959ebe026A. Unique TensorFlower    matrix = ops.convert_to_tensor(matrix, name='matrix')
115d835d677ade78a41e0e097f67c87b6ab8588a90aA. Unique TensorFlower    return array_ops.matrix_transpose(matrix, conjugate=True)
116