class_docstr: Engine for qMC sampling from a Multivariate Normal `N(0, I_d)`.
  
  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:
      >>> engine = NormalQMCEngine(3)
      >>> samples = engine.draw(16)
docstr: Engine for drawing qMC samples from a multivariate normal `N(0, I_d)`.
  
  Args:
      d: The dimension of the samples.
      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,
      d: int,
      seed: Optional[int] = None,
      inv_transform: bool = False,
  ) -> None:
      r"""Engine for drawing qMC samples from a multivariate normal `N(0, I_d)`.
  
      Args:
          d: The dimension of the samples.
          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.
      """
      self._d = d
      self._seed = seed
      self._inv_transform = inv_transform
      if inv_transform:
          sobol_dim = d
      else:
          # to apply Box-Muller, we need an even number of dimensions
          sobol_dim = 2 * math.ceil(d / 2)
      self._sobol_engine = SobolEngine(
          dimension=sobol_dim, scramble=True, seed=seed
      )
  
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 NormalQMCEngine object  with example: obj = NormalQMCEngine(d, seed, inv_transform)