class_docstr: LKJCovariancePrior combines an LKJ prior over the correlation matrix
  and a user-specified prior over marginal standard deviations to return a
  prior over the full covariance matrix.
  
  Usage: LKJCovariancePrior(n, eta, sd_prior), where
      n is a positive integer, the size of the covariance matrix,
      eta is a positive shape parameter for the LKJPrior over correlations, and
      sd_prior is a scalar Prior over nonnegative numbers, which is used for
      each of the n marginal standard deviations on the covariance matrix.
code: def log_prob(self, X):
      marginal_var = torch.diagonal(X, dim1=-2, dim2=-1)
      if not torch.all(marginal_var >= 0):
          raise ValueError("Variance(s) cannot be negative")
      marginal_sd = marginal_var.sqrt()
      sd_diag_mat = _batch_form_diag(1 / marginal_sd)
      correlations = torch.matmul(
          torch.matmul(sd_diag_mat, X), sd_diag_mat
      )
      log_prob_corr = self.correlation_prior.log_prob(correlations)
      log_prob_sd = self.sd_prior.log_prob(marginal_sd)
      return log_prob_corr + log_prob_sd
  
imports: import torch
  from linear_operator.utils.cholesky import psd_safe_cholesky
  from torch.distributions import constraints, LKJCholesky
  from torch.nn import Module
  from ..None import settings
  from .prior import Prior
label_desc: Use image node_id 2 for calling the LKJCovariancePrior obj's underlying member method code with example usage: obj.log_prob(X) and returns: unknown