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 sample(self, sample_shape=torch.Size()):
      base_correlation = self.correlation_prior.sample(sample_shape)
      marginal_sds = self.sd_prior.rsample(sample_shape)
      # expand sds to have the same shape as the base correlation matrix
      marginal_sds = marginal_sds.repeat(
          *[1] * len(sample_shape), self.correlation_prior.n
      )
      marginal_sds = torch.diag_embed(marginal_sds)
      return marginal_sds.matmul(base_correlation).matmul(marginal_sds)
  
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 3 for calling the LKJCovariancePrior obj's underlying member method code with example usage: obj.sample(sample_shape) and returns: marginal_sds