code: def draw_sobol_normal_samples(
      d: int,
      n: int,
      device: Optional[torch.device] = None,
      dtype: Optional[torch.dtype] = None,
      seed: Optional[int] = None,
  ) -> Tensor:
      r"""Draw qMC samples from a multi-variate standard normal N(0, I_d).
  
      A primary use-case for this functionality is to compute an QMC average
      of f(X) over X where each element of X is drawn N(0, 1).
  
      Args:
          d: The dimension of the normal distribution.
          n: The number of samples to return. As a best practice, use powers of 2.
          device: The torch device.
          dtype:  The torch dtype.
          seed: The seed used for initializing Owen scrambling. If None (default),
              use a random seed.
  
      Returns:
          A tensor of qMC standard normal samples with dimension `n x d` with device
          and dtype specified by the input.
  
      Example:
          >>> samples = draw_sobol_normal_samples(2, 16)
      """
      normal_qmc_engine = NormalQMCEngine(
          d=d, seed=seed, inv_transform=True
      )
      samples = normal_qmc_engine.draw(
          n, dtype=torch.float if dtype is None else dtype
      )
      return samples.to(device=device)
  
imports: from __future__ import annotations
  from abc import ABC, abstractmethod
  from contextlib import contextmanager
  from typing import Any, Generator, Iterable, List, Optional, Tuple, TYPE_CHECKING
  import numpy
  import scipy
  import torch
  from botorch.exceptions.errors import BotorchError
  from botorch.sampling.qmc import NormalQMCEngine
  from botorch.utils.transforms import unnormalize
  from scipy.spatial import Delaunay, HalfspaceIntersection
  from torch import LongTensor, Tensor
  from torch.quasirandom import SobolEngine
label_desc: Use image node_id 3 for calling a global function with example usage: draw_sobol_normal_samples(d, n, device, dtype, seed) and returns: samples