class_docstr: Engine for qMC sampling from a multivariate Normal `N(\mu, \Sigma)`.
  
  By default, this implementation uses Box-Muller transformed Sobol samples
  following pg. 123 in [Pages2018numprob]_. To use the inverse transform
  instead, set `inv_transform=True`.
  
  Example:
      >>> mean = torch.tensor([1.0, 2.0])
      >>> cov = torch.tensor([[1.0, 0.25], [0.25, 2.0]])
      >>> engine = MultivariateNormalQMCEngine(mean, cov)
      >>> samples = engine.draw(16)
docstr: Engine for qMC sampling from a multivariate Normal `N(\mu, \Sigma)`.
  
  Args:
      mean: The mean vector.
      cov: The covariance matrix.
      seed: The seed with which to seed the random number generator of the
          underlying SobolEngine.
      inv_transform: If True, use inverse transform instead of Box-Muller.
code: def __init__(
      self,
      mean: Tensor,
      cov: Tensor,
      seed: Optional[int] = None,
      inv_transform: bool = False,
  ) -> None:
      r"""Engine for qMC sampling from a multivariate Normal `N(\mu, \Sigma)`.
  
      Args:
          mean: The mean vector.
          cov: The covariance matrix.
          seed: The seed with which to seed the random number generator of the
              underlying SobolEngine.
          inv_transform: If True, use inverse transform instead of Box-Muller.
      """
      # validate inputs
      if not cov.shape[0] == cov.shape[1]:
          raise ValueError("Covariance matrix is not square.")
      if not mean.shape[0] == cov.shape[0]:
          raise ValueError(
              "Dimension mismatch between mean and covariance."
          )
      if not torch.allclose(cov, cov.transpose(-1, -2)):
          raise ValueError("Covariance matrix is not symmetric.")
      self._mean = mean
      self._normal_engine = NormalQMCEngine(
          d=mean.shape[0], seed=seed, inv_transform=inv_transform
      )
      # compute Cholesky decomp; if it fails, do the eigendecomposition
      try:
          self._corr_matrix = torch.linalg.cholesky(cov).transpose(
              -1, -2
          )
      except RuntimeError:
          eigval, eigvec = torch.linalg.eigh(cov)
          tol = 1e-8 if eigval.dtype == torch.double else 1e-6
          if torch.any(eigval < -tol):
              raise ValueError("Covariance matrix not PSD.")
          eigval_root = eigval.clamp_min(0.0).sqrt()
          self._corr_matrix = (eigvec * eigval_root).transpose(-1, -2)
  
file_path: botorch/botorch/sampling/qmc.py
imports: from __future__ import annotations
  import math
  from typing import Optional
  import torch
  from torch import Tensor
  from torch.quasirandom import SobolEngine
label_desc: Use image node_id 1 to create a new MultivariateNormalQMCEngine object  with example: obj = MultivariateNormalQMCEngine(mean, cov, seed, inv_transform)