code: def test_log_prob(self):
      with torch.random.fork_rng():
          torch.random.manual_seed(next(self.seed_generator))
          for usn in self.distributions:
              shape = torch.Size([self.num_log_probs])
              vals = usn.gauss.rsample(sample_shape=shape)
  
              # Manually compute log probabilities
              alpha = torch.cholesky_solve(
                  usn.cross_covariance_matrix.T, usn.gauss.scale_tril
              )
              loc_condx = usn.trunc.loc + (vals - usn.gauss.loc) @ alpha
              cov_condx = (
                  usn.trunc.covariance_matrix
                  - usn.cross_covariance_matrix @ alpha
              )
              solver = MVNXPB(
                  covariance_matrix=cov_condx.repeat(
                      self.num_log_probs, 1, 1
                  ),
                  bounds=usn.trunc.bounds - loc_condx.unsqueeze(-1),
              )
              log_probs = (
                  solver.solve()
                  + usn.gauss.log_prob(vals)
                  - usn.trunc.log_partition
              )
  
              # Compare with log probabilities returned by class
              self.assertTrue(log_probs.allclose(usn.log_prob(vals)))
  
              # checking error handling when incorrectly shaped value is passed
              wrong_vals = torch.cat((vals, vals), dim=-1)
              error_msg = (
                  ".*with shape.*does not comply with the instance.*"
              )
              with self.assertRaisesRegex(ValueError, error_msg):
                  usn.log_prob(wrong_vals)
  
imports: from __future__ import annotations
  from copy import deepcopy
  from itertools import count
  from typing import Any, Dict, Optional, Sequence, Tuple
  import torch
  from botorch.utils.probability.mvnxpb import MVNXPB
  from botorch.utils.probability.truncated_multivariate_normal import TruncatedMultivariateNormal
  from botorch.utils.probability.unified_skew_normal import UnifiedSkewNormal
  from botorch.utils.testing import BotorchTestCase
  from linear_operator.operators import DenseLinearOperator
  from torch import Tensor
  from torch.distributions import MultivariateNormal
  from torch.special import ndtri
label_desc: Use image node_id 4 for calling the TestUnifiedSkewNormal obj's underlying member method code with example usage: obj.test_log_prob() without return types