def test_log_det_only(self): # Forward pass with gpytorch.settings.num_trace_samples(1000): res = NonLazyVariable(self.mat_var).log_det() actual = self.mat_var_clone.det().log() self.assertAlmostEqual(res.item(), actual.item(), places=1) # Backward actual.backward() res.backward() self.assertTrue(approx_equal(self.mat_var_clone.grad.data, self.mat_var.grad.data, epsilon=1e-1))
def test_inv_quad_only_many_vectors(self): # Forward pass res = NonLazyVariable(self.mat_var).inv_quad(self.vecs_var) actual = self.mat_var_clone.inverse().matmul(self.vecs_var_clone).mul(self.vecs_var_clone).sum() self.assertAlmostEqual(res.item(), actual.item(), places=1) # Backward actual.backward() res.backward() self.assertTrue(approx_equal(self.mat_var_clone.grad.data, self.mat_var.grad.data, epsilon=1e-1)) self.assertTrue(approx_equal(self.vecs_var_clone.grad.data, self.vecs_var.grad.data))
def test_inv_quad_only_vector(self): # Forward pass res = NonLazyVariable(self.mat_var).inv_quad(self.vec_var) actual = self.mat_var_clone.inverse().matmul(self.vec_var_clone).mul( self.vec_var_clone).sum() self.assertAlmostEqual(res.item(), actual.item(), places=1) # Backward inv_quad_grad_output = torch.randn(1) actual.backward(gradient=inv_quad_grad_output) res.backward(gradient=inv_quad_grad_output) self.assertTrue( approx_equal(self.mat_var_clone.grad.data, self.mat_var.grad.data, epsilon=1e-1)) self.assertTrue( approx_equal(self.vec_var_clone.grad.data, self.vec_var.grad.data))