def covariance_to_internal_jacobian(external_values, constr): r"""Jacobian of ``covariance_to_internal``. For reference see docstring of ``jacobian_covariance_from_internal``. In comparison to that function, however, here we want to differentiate the reverse graph external --> cov --> cholesky --> internal Again use the vectors :math:`c` and :math:`x` to denote the external and internal values, respectively. To solve for the jacobian we make use of the identity .. math:: \frac{\mathrm{d}x}{\mathrm{d}c} = (\frac{\mathrm{d}c}{\mathrm{d}x})^{-1} Args: external_values (np.ndarray): Row-wise half-vectorized covariance matrix Returns: deriv: The Jacobian matrix. """ cov = cov_params_to_matrix(external_values) chol = robust_cholesky(cov) internal = chol[np.tril_indices(len(chol))] deriv = covariance_from_internal_jacobian(internal, constr=None) deriv = np.linalg.pinv(deriv) return deriv
def covariance_to_internal(external_values, constr): """Do a cholesky reparametrization.""" cov = cov_params_to_matrix(external_values) chol = robust_cholesky(cov) return chol[np.tril_indices(len(cov))]
def test_robust_cholesky_with_extreme_cases(): for cov in [np.ones((5, 5)), np.zeros((5, 5))]: chol = robust_cholesky(cov) aaae(chol.dot(chol.T), cov)
def sdcorr_to_internal(external_values, constr): """Convert sdcorr to cov and do a cholesky reparametrization.""" cov = sdcorr_params_to_matrix(external_values) chol = robust_cholesky(cov) return chol[np.tril_indices(len(cov))]
def test_robust_cholesky_with_zero_variance(dim, seed): cov = random_cov(dim, seed) chol = robust_cholesky(cov) aaae(chol.dot(chol.T), cov) assert (chol[np.triu_indices(len(cov), k=1)] == 0).all()