Python torch.cholesky() Examples
The following are 30
code examples of torch.cholesky().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
torch
, or try the search function
.
Example #1
Source File: linear.py From pyfilter with MIT License | 6 votes |
def _kernel_2d(self, y, loc, h_var_inv, o_var_inv, c): tc = c if self._model.obs_ndim > 0 else c.unsqueeze(-2) # ===== Define covariance ===== # ttc = tc.transpose(-2, -1) diag_o_var_inv = construct_diag(o_var_inv if self._model.observable.ndim > 0 else o_var_inv.unsqueeze(-1)) t2 = torch.matmul(ttc, torch.matmul(diag_o_var_inv, tc)) cov = (construct_diag(h_var_inv) + t2).inverse() # ===== Get mean ===== # t1 = h_var_inv * loc t2 = torch.matmul(diag_o_var_inv, y if y.dim() > 0 else y.unsqueeze(-1)) t3 = torch.matmul(ttc, t2.unsqueeze(-1))[..., 0] m = torch.matmul(cov, (t1 + t3).unsqueeze(-1))[..., 0] return MultivariateNormal(m, scale_tril=torch.cholesky(cov))
Example #2
Source File: uft.py From pyfilter with MIT License | 6 votes |
def _get_sps(self, mean: torch.Tensor, cov: torch.Tensor): """ Constructs the Sigma points used for propagation. :return: Sigma points """ self._mean[..., self._sslc] = mean self._cov[..., self._sslc, self._sslc] = cov cholcov = sqrt(self._lam + self._ndim) * torch.cholesky(self._cov) spx = self._mean.unsqueeze(-2) sph = self._mean[..., None, :] + cholcov spy = self._mean[..., None, :] - cholcov return torch.cat((spx, sph, spy), -2)
Example #3
Source File: pairwise_gp.py From botorch with MIT License | 6 votes |
def _add_jitter(self, X: Tensor) -> Tensor: jitter_prev = 0 Eye = torch.eye(X.size(-1)).expand(X.shape) for i in range(3): jitter_new = self._jitter * (10 ** i) X = X + (jitter_new - jitter_prev) * Eye jitter_prev = jitter_new # This may be VERY slow given upstream pytorch issue: # https://github.com/pytorch/pytorch/issues/34272 try: _ = torch.cholesky(X) warnings.warn( "X is not a p.d. matrix; " f"Added jitter of {jitter_new:.2e} to the diagonal", RuntimeWarning, ) return X except RuntimeError: continue warnings.warn( f"Failed to render X p.d. after adding {jitter_new:.2e} jitter", RuntimeWarning, ) return X
Example #4
Source File: test_hmm.py From funsor with Apache License 2.0 | 6 votes |
def test_discrete_mvn_log_prob(init_shape, trans_shape, obs_shape, state_dim): event_size = 4 init_logits = torch.randn(init_shape + (state_dim,)) trans_logits = torch.randn(trans_shape + (state_dim, state_dim)) loc = torch.randn(obs_shape + (state_dim, event_size)) cov = torch.randn(obs_shape + (state_dim, event_size, 2 * event_size)) cov = cov.matmul(cov.transpose(-1, -2)) scale_tril = torch.cholesky(cov) obs_dist = dist.MultivariateNormal(loc, scale_tril=scale_tril) actual_dist = DiscreteHMM(init_logits, trans_logits, obs_dist) expected_dist = dist.DiscreteHMM(init_logits, trans_logits, obs_dist) assert actual_dist.event_shape == expected_dist.event_shape assert actual_dist.batch_shape == expected_dist.batch_shape batch_shape = broadcast_shape(init_shape + (1,), trans_shape, obs_shape) data = obs_dist.expand(batch_shape + (state_dim,)).sample() data = data[(slice(None),) * len(batch_shape) + (0,)] actual_log_prob = actual_dist.log_prob(data) expected_log_prob = expected_dist.log_prob(data) assert_close(actual_log_prob, expected_log_prob) check_expand(actual_dist, data)
Example #5
Source File: test_utilities.py From safe-exploration with MIT License | 6 votes |
def test_update_cholesky(): """Test that the update cholesky function returns correct values.""" n = 6 new_A = torch.rand(n, n, dtype=torch.float64) new_A = new_A @ new_A.t() new_A += torch.eye(len(new_A), dtype=torch.float64) A = new_A[:n - 1, :n - 1] old_chol = torch.cholesky(A, upper=False) new_row = new_A[-1] # Test updateing overall new_chol = update_cholesky(old_chol, new_row) error = new_chol - torch.cholesky(new_A, upper=False) assert torch.all(torch.abs(error) <= 1e-15) # Test updating inplace new_chol = torch.zeros(n, n, dtype=torch.float64) new_chol[:n - 1, :n - 1] = old_chol update_cholesky(old_chol, new_row, chol_row_out=new_chol[-1]) error = new_chol - torch.cholesky(new_A, upper=False) assert torch.all(torch.abs(error) <= 1e-15)
Example #6
Source File: test_linear_cg.py From gpytorch with MIT License | 6 votes |
def test_cg_with_tridiag(self): size = 10 matrix = torch.randn(size, size, dtype=torch.float64) matrix = matrix.matmul(matrix.transpose(-1, -2)) matrix.div_(matrix.norm()) matrix.add_(torch.eye(matrix.size(-1), dtype=torch.float64).mul_(1e-1)) rhs = torch.randn(size, 50, dtype=torch.float64) solves, t_mats = linear_cg( matrix.matmul, rhs=rhs, n_tridiag=5, max_tridiag_iter=10, max_iter=size, tolerance=0, eps=1e-15 ) # Check cg matrix_chol = matrix.cholesky() actual = torch.cholesky_solve(rhs, matrix_chol) self.assertTrue(torch.allclose(solves, actual, atol=1e-3, rtol=1e-4)) # Check tridiag eigs = matrix.symeig()[0] for i in range(5): approx_eigs = t_mats[i].symeig()[0] self.assertTrue(torch.allclose(eigs, approx_eigs, atol=1e-3, rtol=1e-4))
Example #7
Source File: multitask_gaussian_likelihood.py From gpytorch with MIT License | 6 votes |
def deprecate_task_noise_corr(state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs): if prefix + "task_noise_corr_factor" in state_dict: # Remove after 1.0 warnings.warn( "Loading a deprecated parameterization of _MultitaskGaussianLikelihoodBase. Consider re-saving your model.", OldVersionWarning, ) # construct the task correlation matrix from the factors using the old parameterization corr_factor = state_dict.pop(prefix + "task_noise_corr_factor").squeeze(0) corr_diag = state_dict.pop(prefix + "task_noise_corr_diag").squeeze(0) num_tasks, rank = corr_factor.shape[-2:] M = corr_factor.matmul(corr_factor.transpose(-1, -2)) idx = torch.arange(M.shape[-1], dtype=torch.long, device=M.device) M[..., idx, idx] += corr_diag sem_inv = 1 / torch.diagonal(M, dim1=-2, dim2=-1).sqrt().unsqueeze(-1) C = M * sem_inv.matmul(sem_inv.transpose(-1, -2)) # perform a Cholesky decomposition and extract the required entries L = torch.cholesky(C) tidcs = torch.tril_indices(num_tasks, rank)[:, 1:] task_noise_corr = L[..., tidcs[0], tidcs[1]] state_dict[prefix + "task_noise_corr"] = task_noise_corr
Example #8
Source File: test_cholesky.py From gpytorch with MIT License | 5 votes |
def test_psd_safe_cholesky_psd(self, cuda=False): device = torch.device("cuda") if cuda else torch.device("cpu") for dtype in (torch.float, torch.double): for batch_mode in (False, True): if batch_mode: A = self._gen_test_psd().to(device=device, dtype=dtype) else: A = self._gen_test_psd()[0].to(device=device, dtype=dtype) idx = torch.arange(A.shape[-1], device=A.device) # default values Aprime = A.clone() Aprime[..., idx, idx] += 1e-6 if A.dtype == torch.float32 else 1e-8 L_exp = torch.cholesky(Aprime) with warnings.catch_warnings(record=True) as w: # Makes sure warnings we catch don't cause `-w error` to fail warnings.simplefilter("always", NumericalWarning) L_safe = psd_safe_cholesky(A) self.assertTrue(any(issubclass(w_.category, NumericalWarning) for w_ in w)) self.assertTrue(any("A not p.d., added jitter" in str(w_.message) for w_ in w)) self.assertTrue(torch.allclose(L_exp, L_safe)) # user-defined value Aprime = A.clone() Aprime[..., idx, idx] += 1e-2 L_exp = torch.cholesky(Aprime) with warnings.catch_warnings(record=True) as w: # Makes sure warnings we catch don't cause `-w error` to fail warnings.simplefilter("always", NumericalWarning) L_safe = psd_safe_cholesky(A, jitter=1e-2) self.assertTrue(any(issubclass(w_.category, NumericalWarning) for w_ in w)) self.assertTrue(any("A not p.d., added jitter" in str(w_.message) for w_ in w)) self.assertTrue(torch.allclose(L_exp, L_safe))
Example #9
Source File: test_pivoted_cholesky.py From gpytorch with MIT License | 5 votes |
def test_solve_qr_constant_noise(self, dtype=torch.float64, tol=1e-8): size = 50 X = torch.rand((size, 2)).to(dtype=dtype) y = torch.sin(torch.sum(X, 1)).unsqueeze(-1).to(dtype=dtype) with settings.min_preconditioning_size(0): noise = 1e-2 * torch.ones(size, dtype=dtype) lazy_tsr = RBFKernel().to(dtype=dtype)(X).evaluate_kernel().add_diag(noise) precondition_qr, _, logdet_qr = lazy_tsr._preconditioner() F = lazy_tsr._piv_chol_self M = noise.diag() + F.matmul(F.t()) x_exact = torch.solve(y, M)[0] x_qr = precondition_qr(y) self.assertTrue(approx_equal(x_exact, x_qr, tol)) logdet = 2 * torch.cholesky(M).diag().log().sum(-1) self.assertTrue(approx_equal(logdet, logdet_qr, tol))
Example #10
Source File: test_multivariate_normal.py From gpytorch with MIT License | 5 votes |
def test_multivariate_normal_lazy(self, cuda=False): device = torch.device("cuda") if cuda else torch.device("cpu") for dtype in (torch.float, torch.double): mean = torch.tensor([0, 1, 2], device=device, dtype=dtype) covmat = torch.diag(torch.tensor([1, 0.75, 1.5], device=device, dtype=dtype)) covmat_chol = torch.cholesky(covmat) mvn = MultivariateNormal(mean=mean, covariance_matrix=NonLazyTensor(covmat)) self.assertTrue(torch.is_tensor(mvn.covariance_matrix)) self.assertIsInstance(mvn.lazy_covariance_matrix, LazyTensor) self.assertAllClose(mvn.variance, torch.diag(covmat)) self.assertAllClose(mvn.covariance_matrix, covmat) self.assertAllClose(mvn._unbroadcasted_scale_tril, covmat_chol) mvn_plus1 = mvn + 1 self.assertAllClose(mvn_plus1.mean, mvn.mean + 1) self.assertAllClose(mvn_plus1.covariance_matrix, mvn.covariance_matrix) self.assertAllClose(mvn_plus1._unbroadcasted_scale_tril, covmat_chol) mvn_times2 = mvn * 2 self.assertAllClose(mvn_times2.mean, mvn.mean * 2) self.assertAllClose(mvn_times2.covariance_matrix, mvn.covariance_matrix * 4) self.assertAllClose(mvn_times2._unbroadcasted_scale_tril, covmat_chol * 2) mvn_divby2 = mvn / 2 self.assertAllClose(mvn_divby2.mean, mvn.mean / 2) self.assertAllClose(mvn_divby2.covariance_matrix, mvn.covariance_matrix / 4) self.assertAllClose(mvn_divby2._unbroadcasted_scale_tril, covmat_chol / 2) # TODO: Add tests for entropy, log_prob, etc. - this an issue b/c it # uses using root_decomposition which is not very reliable # self.assertAlmostEqual(mvn.entropy().item(), 4.3157, places=4) # self.assertAlmostEqual(mvn.log_prob(torch.zeros(3)).item(), -4.8157, places=4) # self.assertTrue( # torch.allclose( # mvn.log_prob(torch.zeros(2, 3)), -4.8157 * torch.ones(2)) # ) # ) conf_lower, conf_upper = mvn.confidence_region() self.assertAllClose(conf_lower, mvn.mean - 2 * mvn.stddev) self.assertAllClose(conf_upper, mvn.mean + 2 * mvn.stddev) self.assertTrue(mvn.sample().shape == torch.Size([3])) self.assertTrue(mvn.sample(torch.Size([2])).shape == torch.Size([2, 3])) self.assertTrue(mvn.sample(torch.Size([2, 4])).shape == torch.Size([2, 4, 3]))
Example #11
Source File: cholesky.py From gpytorch with MIT License | 5 votes |
def psd_safe_cholesky(A, upper=False, out=None, jitter=None, max_tries=3): """Compute the Cholesky decomposition of A. If A is only p.s.d, add a small jitter to the diagonal. Args: :attr:`A` (Tensor): The tensor to compute the Cholesky decomposition of :attr:`upper` (bool, optional): See torch.cholesky :attr:`out` (Tensor, optional): See torch.cholesky :attr:`jitter` (float, optional): The jitter to add to the diagonal of A in case A is only p.s.d. If omitted, chosen as 1e-6 (float) or 1e-8 (double) :attr:`max_tries` (int, optional): Number of attempts (with successively increasing jitter) to make before raising an error. """ try: L = torch.cholesky(A, upper=upper, out=out) return L except RuntimeError as e: isnan = torch.isnan(A) if isnan.any(): raise NanError( f"cholesky_cpu: {isnan.sum().item()} of {A.numel()} elements of the {A.shape} tensor are NaN." ) if jitter is None: jitter = 1e-6 if A.dtype == torch.float32 else 1e-8 Aprime = A.clone() jitter_prev = 0 for i in range(max_tries): jitter_new = jitter * (10 ** i) Aprime.diagonal(dim1=-2, dim2=-1).add_(jitter_new - jitter_prev) jitter_prev = jitter_new try: L = torch.cholesky(Aprime, upper=upper, out=out) warnings.warn(f"A not p.d., added jitter of {jitter_new} to the diagonal", NumericalWarning) return L except RuntimeError: continue raise e
Example #12
Source File: variational_test_case.py From gpytorch with MIT License | 5 votes |
def test_eval_iteration( self, data_batch_shape=None, inducing_batch_shape=None, model_batch_shape=None, eval_data_batch_shape=None, expected_batch_shape=None, ): # Batch shapes model_batch_shape = model_batch_shape if model_batch_shape is not None else self.batch_shape data_batch_shape = data_batch_shape if data_batch_shape is not None else self.batch_shape inducing_batch_shape = inducing_batch_shape if inducing_batch_shape is not None else self.batch_shape expected_batch_shape = expected_batch_shape if expected_batch_shape is not None else self.batch_shape eval_data_batch_shape = eval_data_batch_shape if eval_data_batch_shape is not None else self.batch_shape # Mocks _wrapped_cholesky = MagicMock(wraps=torch.cholesky) _wrapped_cg = MagicMock(wraps=gpytorch.utils.linear_cg) _cholesky_mock = patch("torch.cholesky", new=_wrapped_cholesky) _cg_mock = patch("gpytorch.utils.linear_cg", new=_wrapped_cg) # Make model and likelihood model, likelihood = self._make_model_and_likelihood( batch_shape=model_batch_shape, inducing_batch_shape=inducing_batch_shape, distribution_cls=self.distribution_cls, strategy_cls=self.strategy_cls, ) # Do one forward pass self._training_iter(model, likelihood, data_batch_shape, mll_cls=self.mll_cls, cuda=self.cuda) # Now do evaluatioj with _cholesky_mock as cholesky_mock, _cg_mock as cg_mock: # Iter 1 _ = self._eval_iter(model, eval_data_batch_shape, cuda=self.cuda) output = self._eval_iter(model, eval_data_batch_shape, cuda=self.cuda) self.assertEqual(output.batch_shape, expected_batch_shape) self.assertEqual(output.event_shape, self.event_shape) return cg_mock, cholesky_mock
Example #13
Source File: rmi_utils.py From RMI with MIT License | 5 votes |
def log_det_by_cholesky(matrix): """ Args: matrix: matrix must be a positive define matrix. shape [N, C, D, D]. Ref: https://github.com/tensorflow/tensorflow/blob/r1.13/tensorflow/python/ops/linalg/linalg_impl.py """ # This uses the property that the log det(A) = 2 * sum(log(real(diag(C)))) # where C is the cholesky decomposition of A. chol = torch.cholesky(matrix) #return 2.0 * torch.sum(torch.log(torch.diagonal(chol, dim1=-2, dim2=-1) + 1e-6), dim=-1) return 2.0 * torch.sum(torch.log(torch.diagonal(chol, dim1=-2, dim2=-1) + 1e-8), dim=-1)
Example #14
Source File: rmi_utils.py From RMI with MIT License | 5 votes |
def batch_cholesky_inverse(matrix): """ Args: matrix, 4-D tensor, [N, C, M, M]. matrix must be a symmetric positive define matrix. """ chol_low = torch.cholesky(matrix, upper=False) chol_low_inv = batch_low_tri_inv(chol_low) return torch.matmul(chol_low_inv.transpose(-2, -1), chol_low_inv)
Example #15
Source File: pairwise_gp.py From botorch with MIT License | 5 votes |
def _batch_chol_inv(self, mat_chol: Tensor) -> Tensor: r"""Wrapper to perform (batched) cholesky inverse""" # TODO: get rid of this once cholesky_inverse supports batch mode batch_eye = torch.eye(mat_chol.shape[-1], **self.tkwargs) if len(mat_chol.shape) == 2: mat_inv = torch.cholesky_inverse(mat_chol) elif len(mat_chol.shape) > 2 and (mat_chol.shape[-1] == mat_chol.shape[-2]): batch_eye = batch_eye.repeat(*(mat_chol.shape[:-2]), 1, 1) chol_inv = torch.triangular_solve(batch_eye, mat_chol, upper=False).solution mat_inv = chol_inv.transpose(-1, -2) @ chol_inv return mat_inv
Example #16
Source File: qmc.py From botorch with MIT License | 5 votes |
def __init__( self, mean: Tensor, cov: Tensor, seed: Optional[int] = None, inv_transform: bool = False, ) -> None: r"""Engine for qMC sampling from a multivariate Normal `N(\mu, \Sigma)`. Args: mean: The mean vector. cov: The covariance matrix. seed: The seed with which to seed the random number generator of the underlying SobolEngine. inv_transform: If True, use inverse transform instead of Box-Muller. """ # validate inputs if not cov.shape[0] == cov.shape[1]: raise ValueError("Covariance matrix is not square.") if not mean.shape[0] == cov.shape[0]: raise ValueError("Dimension mismatch between mean and covariance.") if not torch.allclose(cov, cov.transpose(-1, -2)): raise ValueError("Covariance matrix is not symmetric.") self._mean = mean self._normal_engine = NormalQMCEngine( d=mean.shape[0], seed=seed, inv_transform=inv_transform ) # compute Cholesky decomp; if it fails, do the eigendecomposition try: self._corr_matrix = torch.cholesky(cov).transpose(-1, -2) except RuntimeError: eigval, eigvec = torch.symeig(cov, eigenvectors=True) if not torch.all(eigval >= -1e-8): raise ValueError("Covariance matrix not PSD.") eigval_root = eigval.clamp_min(0.0).sqrt() self._corr_matrix = (eigvec * eigval_root).transpose(-1, -2)
Example #17
Source File: distribution.py From VLAE with MIT License | 5 votes |
def __init__(self, mu, precision): # mu: [batch_size, z_dim] self.mu = mu # precision: [batch_size, z_dim, z_dim] self.precision = precision # TODO: get rid of the inverse for efficiency self.L = torch.cholesky(torch.inverse(precision)) self.dim = self.mu.shape[1]
Example #18
Source File: test_cholesky.py From gpytorch with MIT License | 5 votes |
def test_psd_safe_cholesky_pd(self, cuda=False): device = torch.device("cuda") if cuda else torch.device("cpu") for dtype in (torch.float, torch.double): for batch_mode in (False, True): if batch_mode: A = self._gen_test_psd().to(device=device, dtype=dtype) D = torch.eye(2).type_as(A).unsqueeze(0).repeat(2, 1, 1) else: A = self._gen_test_psd()[0].to(device=device, dtype=dtype) D = torch.eye(2).type_as(A) A += D # basic L = torch.cholesky(A) L_safe = psd_safe_cholesky(A) self.assertTrue(torch.allclose(L, L_safe)) # upper L = torch.cholesky(A, upper=True) L_safe = psd_safe_cholesky(A, upper=True) self.assertTrue(torch.allclose(L, L_safe)) # output tensors L = torch.empty_like(A) L_safe = torch.empty_like(A) torch.cholesky(A, out=L) psd_safe_cholesky(A, out=L_safe) self.assertTrue(torch.allclose(L, L_safe)) # output tensors, upper torch.cholesky(A, upper=True, out=L) psd_safe_cholesky(A, upper=True, out=L_safe) self.assertTrue(torch.allclose(L, L_safe)) # make sure jitter doesn't do anything if p.d. L = torch.cholesky(A) L_safe = psd_safe_cholesky(A, jitter=1e-2) self.assertTrue(torch.allclose(L, L_safe))
Example #19
Source File: test_pivoted_cholesky.py From gpytorch with MIT License | 5 votes |
def test_solve_qr(self, dtype=torch.float64, tol=1e-8): size = 50 X = torch.rand((size, 2)).to(dtype=dtype) y = torch.sin(torch.sum(X, 1)).unsqueeze(-1).to(dtype=dtype) with settings.min_preconditioning_size(0): noise = torch.DoubleTensor(size).uniform_(math.log(1e-3), math.log(1e-1)).exp_().to(dtype=dtype) lazy_tsr = RBFKernel().to(dtype=dtype)(X).evaluate_kernel().add_diag(noise) precondition_qr, _, logdet_qr = lazy_tsr._preconditioner() F = lazy_tsr._piv_chol_self M = noise.diag() + F.matmul(F.t()) x_exact = torch.solve(y, M)[0] x_qr = precondition_qr(y) self.assertTrue(approx_equal(x_exact, x_qr, tol)) logdet = 2 * torch.cholesky(M).diag().log().sum(-1) self.assertTrue(approx_equal(logdet, logdet_qr, tol))
Example #20
Source File: test_linear_cg.py From gpytorch with MIT License | 5 votes |
def test_batch_cg(self): batch = 5 size = 100 matrix = torch.randn(batch, size, size, dtype=torch.float64) matrix = matrix.matmul(matrix.transpose(-1, -2)) matrix.div_(matrix.norm()) matrix.add_(torch.eye(matrix.size(-1), dtype=torch.float64).mul_(1e-1)) rhs = torch.randn(batch, size, 50, dtype=torch.float64) solves = linear_cg(matrix.matmul, rhs=rhs, max_iter=size) # Check cg matrix_chol = torch.cholesky(matrix) actual = torch.cholesky_solve(rhs, matrix_chol) self.assertTrue(torch.allclose(solves, actual, atol=1e-3, rtol=1e-4))
Example #21
Source File: test_linear_cg.py From gpytorch with MIT License | 5 votes |
def test_cg(self): size = 100 matrix = torch.randn(size, size, dtype=torch.float64) matrix = matrix.matmul(matrix.transpose(-1, -2)) matrix.div_(matrix.norm()) matrix.add_(torch.eye(matrix.size(-1), dtype=torch.float64).mul_(1e-1)) rhs = torch.randn(size, 50, dtype=torch.float64) solves = linear_cg(matrix.matmul, rhs=rhs, max_iter=size) # Check cg matrix_chol = matrix.cholesky() actual = torch.cholesky_solve(rhs, matrix_chol) self.assertTrue(torch.allclose(solves, actual, atol=1e-3, rtol=1e-4))
Example #22
Source File: test_lkj_prior.py From gpytorch with MIT License | 5 votes |
def test_lkj_cholesky_factor_prior_batch_log_prob(self, cuda=False): device = torch.device("cuda") if cuda else torch.device("cpu") prior = LKJCholeskyFactorPrior(2, torch.tensor([0.5, 1.5], device=device)) S = torch.eye(2, device=device) S_chol = torch.cholesky(S) self.assertTrue(approx_equal(prior.log_prob(S_chol), torch.tensor([-1.86942, -0.483129], device=S_chol.device))) S = torch.stack([S, torch.tensor([[1.0, 0.5], [0.5, 1]], device=S.device)]) S_chol = torch.stack([torch.cholesky(Si) for Si in S]) self.assertTrue(approx_equal(prior.log_prob(S_chol), torch.tensor([-1.86942, -0.62697], device=S_chol.device))) with self.assertRaises(ValueError): prior.log_prob(torch.eye(3, device=device))
Example #23
Source File: test_lkj_prior.py From gpytorch with MIT License | 5 votes |
def test_lkj_cholesky_factor_prior_log_prob(self, cuda=False): device = torch.device("cuda") if cuda else torch.device("cpu") prior = LKJCholeskyFactorPrior(2, torch.tensor(0.5, device=device)) S = torch.eye(2, device=device) S_chol = torch.cholesky(S) self.assertAlmostEqual(prior.log_prob(S_chol).item(), -1.86942, places=4) S = torch.stack([S, torch.tensor([[1.0, 0.5], [0.5, 1]], device=S_chol.device)]) S_chol = torch.stack([torch.cholesky(Si) for Si in S]) self.assertTrue(approx_equal(prior.log_prob(S_chol), torch.tensor([-1.86942, -1.72558], device=S_chol.device))) with self.assertRaises(ValueError): prior.log_prob(torch.eye(3, device=device)) # For eta=1.0 log_prob is flat over all covariance matrices prior = LKJCholeskyFactorPrior(2, torch.tensor(1.0, device=device)) self.assertTrue(torch.all(prior.log_prob(S_chol) == prior.C))
Example #24
Source File: covariance.py From torch-kalman with MIT License | 5 votes |
def to_log_cholesky(self) -> Tuple[torch.Tensor, torch.Tensor]: batch_dim = self.shape[:-2] rank = self.shape[-1] L = torch.cholesky(self) n_off = int(rank * (rank - 1) / 2) off_diag = torch.empty(batch_dim + (n_off,)) idx = 0 for i in range(rank): for j in range(i): off_diag[..., idx] = L[..., i, j] idx += 1 log_diag = torch.log(torch.diagonal(L, dim1=-2, dim2=-1)) return log_diag, off_diag
Example #25
Source File: test_convert.py From funsor with Apache License 2.0 | 5 votes |
def test_dist_to_funsor_mvn(batch_shape, event_size): loc = torch.randn(batch_shape + (event_size,)) cov = torch.randn(batch_shape + (event_size, 2 * event_size)) cov = cov.matmul(cov.transpose(-1, -2)) scale_tril = torch.cholesky(cov) d = dist.MultivariateNormal(loc, scale_tril=scale_tril) f = dist_to_funsor(d) assert isinstance(f, Funsor) value = d.sample() actual_log_prob = f(value=tensor_to_funsor(value, event_output=1)) expected_log_prob = tensor_to_funsor(d.log_prob(value)) assert_close(actual_log_prob, expected_log_prob)
Example #26
Source File: ops.py From funsor with Apache License 2.0 | 5 votes |
def _cholesky(x): """ Like :func:`torch.cholesky` but uses sqrt for scalar matrices. Works around https://github.com/pytorch/pytorch/issues/24403 often. """ if x.size(-1) == 1: return x.sqrt() return x.cholesky()
Example #27
Source File: utils.py From pyfilter with MIT License | 5 votes |
def _construct_mvn(x: torch.Tensor, w: torch.Tensor): """ Constructs a multivariate normal distribution of weighted samples. :param x: The samples :param w: The weights """ mean = (x * w.unsqueeze(-1)).sum(0) centralized = x - mean cov = torch.matmul(w * centralized.t(), centralized) return MultivariateNormal(mean, scale_tril=torch.cholesky(cov))
Example #28
Source File: test_whitened_variational_strategy.py From gpytorch with MIT License | 4 votes |
def test_eval_iteration( self, data_batch_shape=None, inducing_batch_shape=None, model_batch_shape=None, eval_data_batch_shape=None, expected_batch_shape=None, ): # This class is deprecated - so we'll ignore these warnings warnings.simplefilter("always", DeprecationWarning) # Batch shapes model_batch_shape = model_batch_shape if model_batch_shape is not None else self.batch_shape data_batch_shape = data_batch_shape if data_batch_shape is not None else self.batch_shape inducing_batch_shape = inducing_batch_shape if inducing_batch_shape is not None else self.batch_shape expected_batch_shape = expected_batch_shape if expected_batch_shape is not None else self.batch_shape eval_data_batch_shape = eval_data_batch_shape if eval_data_batch_shape is not None else self.batch_shape # Mocks _wrapped_cholesky = MagicMock(wraps=torch.cholesky) _wrapped_cg = MagicMock(wraps=gpytorch.utils.linear_cg) _cholesky_mock = patch("torch.cholesky", new=_wrapped_cholesky) _cg_mock = patch("gpytorch.utils.linear_cg", new=_wrapped_cg) # Make model and likelihood model, likelihood = self._make_model_and_likelihood( batch_shape=model_batch_shape, inducing_batch_shape=inducing_batch_shape, distribution_cls=self.distribution_cls, strategy_cls=self.strategy_cls, ) # Do one forward pass self._training_iter(model, likelihood, data_batch_shape, mll_cls=self.mll_cls) # Now do evaluatioj with _cholesky_mock as cholesky_mock, _cg_mock as cg_mock: # Iter 1 _ = self._eval_iter(model, eval_data_batch_shape) output = self._eval_iter(model, eval_data_batch_shape) self.assertEqual(output.batch_shape, expected_batch_shape) self.assertEqual(output.event_shape, self.event_shape) return cg_mock, cholesky_mock
Example #29
Source File: test_whitened_variational_strategy.py From gpytorch with MIT License | 4 votes |
def test_training_iteration( self, data_batch_shape=None, inducing_batch_shape=None, model_batch_shape=None, expected_batch_shape=None, constant_mean=True, ): # This class is deprecated - so we'll ignore these warnings warnings.simplefilter("always", DeprecationWarning) # Batch shapes model_batch_shape = model_batch_shape if model_batch_shape is not None else self.batch_shape data_batch_shape = data_batch_shape if data_batch_shape is not None else self.batch_shape inducing_batch_shape = inducing_batch_shape if inducing_batch_shape is not None else self.batch_shape expected_batch_shape = expected_batch_shape if expected_batch_shape is not None else self.batch_shape # Mocks _wrapped_cholesky = MagicMock(wraps=torch.cholesky) _wrapped_cg = MagicMock(wraps=gpytorch.utils.linear_cg) _cholesky_mock = patch("torch.cholesky", new=_wrapped_cholesky) _cg_mock = patch("gpytorch.utils.linear_cg", new=_wrapped_cg) # Make model and likelihood model, likelihood = self._make_model_and_likelihood( batch_shape=model_batch_shape, inducing_batch_shape=inducing_batch_shape, distribution_cls=self.distribution_cls, strategy_cls=self.strategy_cls, constant_mean=constant_mean, ) # Do forward pass with _cholesky_mock as cholesky_mock, _cg_mock as cg_mock: # Iter 1 self.assertEqual(model.variational_strategy.variational_params_initialized.item(), 0) self._training_iter(model, likelihood, data_batch_shape, mll_cls=self.mll_cls) self.assertEqual(model.variational_strategy.variational_params_initialized.item(), 1) # Iter 2 output, loss = self._training_iter(model, likelihood, data_batch_shape, mll_cls=self.mll_cls) self.assertEqual(output.batch_shape, expected_batch_shape) self.assertEqual(output.event_shape, self.event_shape) self.assertEqual(loss.shape, expected_batch_shape) return cg_mock, cholesky_mock
Example #30
Source File: utilities.py From safe-exploration with MIT License | 4 votes |
def update_cholesky(old_chol, new_row, chol_row_out=None, jitter=1e-6): """Update an existing cholesky decomposition after adding a new row. TODO: Replace with fantasy data once this is available: https://github.com/cornellius-gp/gpytorch/issues/177 A_new = [A, new_row[:-1, None], new_row[None, :]] old_chol = torch.cholesky(A, upper=False) Parameters ---------- old_chol : torch.tensor new_row : torch.tensor 1D array. chol_row_out : torch.tensor, optional An output array to which to write the new cholesky row. jitter : float The jitter to add to the last element of the new row. Makes everything numerically more stable. """ new_row[-1] += jitter if len(new_row) == 1: if chol_row_out is not None: chol_row_out[:] = torch.sqrt(new_row[0]) return else: return torch.sqrt(new_row.unsqueeze(-1)) with SetTorchDtype(old_chol.dtype): c, _ = torch.trtrs(new_row[:-1], old_chol, upper=False) c = c.squeeze(-1) d = torch.sqrt(max(new_row[-1] - c.dot(c), torch.tensor(1e-10))) if chol_row_out is not None: chol_row_out[:-1] = c chol_row_out[-1] = d else: return torch.cat([ torch.cat([old_chol, torch.zeros(old_chol.size(0), 1)], dim=1), torch.cat([c[None, :], d[None, None]], dim=1) ])