def _cholesky_block_diag(block_diag_operator): # We take the cholesky of each block on the diagonal. return linear_operator_block_diag.LinearOperatorBlockDiag( operators=[ operator.cholesky() for operator in block_diag_operator.operators], is_non_singular=True, is_self_adjoint=False, is_square=True)
def _inverse_block_diag(block_diag_operator): # We take the inverse of each block on the diagonal. return linear_operator_block_diag.LinearOperatorBlockDiag( operators=[ operator.inverse() for operator in block_diag_operator.operators], is_non_singular=block_diag_operator.is_non_singular, is_self_adjoint=block_diag_operator.is_self_adjoint, is_positive_definite=block_diag_operator.is_positive_definite, is_square=True)
def _matmul_linear_operator_block_diag_block_diag(linop_a, linop_b): return linear_operator_block_diag.LinearOperatorBlockDiag( operators=[ o1.matmul(o2) for o1, o2 in zip( linop_a.operators, linop_b.operators)], is_non_singular=registrations_util.combined_non_singular_hint( linop_a, linop_b), # In general, a product of self-adjoint positive-definite block diagonal # matrices is not self = self - adjoint. is_self_adjoint=None, # In general, a product of positive-definite block diagonal matrices is # not positive-definite. is_positive_definite=None, is_square=True)