class_docstr: Maps the Cholesky factor of `M` to the Cholesky factor of `M^{-1}`.
  
  The `forward` and `inverse` calculations are conceptually identical to:
  
  ```python
  def forward(x):
    return tf.linalg.cholesky(tf.linalg.inv(tf.matmul(x, x, adjoint_b=True)))
  
  inverse = forward
  ```
  
  or, similarly,
  
  ```python
  tfb = tfp.bijectors
  CholeskyToInvCholesky = tfb.Chain([
      tfb.Invert(tfb.CholeskyOuterProduct()),
      tfb.MatrixInverse(),
      tfb.CholeskyOuterProduct(),
  ])
  ```
  
  However, the actual calculations exploit the triangular structure of the
  matrices.
class_docstr_tok: ["Maps","the","Cholesky","factor","of","`","M","`","to","the","Cholesky","factor","of","`","M^","{","-1","}","`",".","The","`","forward","`","and","`","inverse","`","calculations","are","conceptually","identical","to",":","``","`","python","def","forward","(","x",")",":","return","tf.linalg.cholesky","(","tf.linalg.inv","(","tf.matmul","(","x",",","x",",","adjoint_b=True",")",")",")","inverse","=","forward","``","`","or",",","similarly",",","``","`","python","tfb","=","tfp.bijectors","CholeskyToInvCholesky","=","tfb.Chain","(","[","tfb.Invert","(","tfb.CholeskyOuterProduct","(",")",")",",","tfb.MatrixInverse","(",")",",","tfb.CholeskyOuterProduct","(",")",",","]",")","``","`","However",",","the","actual","calculations","exploit","the","triangular","structure","of","the","matrices","."]
code: def _forward(self, x):
      with tf.control_dependencies(self._assertions(x)):
          x_shape = ps.shape(x)
          identity_matrix = tf.eye(
              x_shape[-1],
              batch_shape=x_shape[:-2],
              dtype=dtype_util.base_dtype(x.dtype),
          )
          # Note `matrix_triangular_solve` implicitly zeros upper triangular of `x`.
          y = tf.linalg.triangular_solve(x, identity_matrix)
          y = tf.matmul(y, y, adjoint_a=True)
          return tf.linalg.cholesky(y)
  
file_path: probability/tensorflow_probability/python/bijectors/cholesky_to_inv_cholesky.py
imports: import tensorflow.compat.v2
  from tensorflow_probability.python.bijectors import bijector
  from tensorflow_probability.python.bijectors.cholesky_outer_product import CholeskyOuterProduct
  from tensorflow_probability.python.internal import assert_util
  from tensorflow_probability.python.internal import dtype_util
  from tensorflow_probability.python.internal import prefer_static
label_desc: Use image node_id 3 for calling the CholeskyToInvCholesky obj's underlying member method code with example usage: obj._forward(x) and returns: tf