code: def test_log_prob(self):
      with torch.random.fork_rng():
          torch.random.manual_seed(next(self.seed_generator))
          for trunc in self.distributions:
              # Test generic values
              vals = trunc.rsample(
                  sample_shape=torch.Size([self.num_log_probs])
              )
              test = (
                  MultivariateNormal.log_prob(trunc, vals)
                  - trunc.log_partition
              )
              self.assertTrue(test.equal(trunc.log_prob(vals)))
  
              # Test out of bounds
              m = trunc.bounds.shape[-2] // 2
              oob = torch.concat(
                  [
                      trunc.bounds[..., :m, 0] - 1,
                      trunc.bounds[..., m:, 1] + 1,
                  ],
                  dim=-1,
              )
              self.assertTrue(
                  trunc.log_prob(oob).eq(-float("inf")).all()
              )
  
file_path: botorch/test/utils/probability/test_truncated_multivariate_normal.py
imports: from __future__ import annotations
  from itertools import count
  from typing import Sequence, Tuple
  import torch
  from botorch.utils.probability.mvnxpb import MVNXPB
  from botorch.utils.probability.truncated_multivariate_normal import TruncatedMultivariateNormal
  from botorch.utils.testing import BotorchTestCase
  from torch import Tensor
  from torch.distributions import MultivariateNormal
  from torch.special import ndtri
label_desc: Use image node_id 5 for calling the TestTruncatedMultivariateNormal obj's underlying member method code with example usage: obj.test_log_prob() without return types