code: def test_draw_sobol_samples(self):
      batch_shapes = [None, [3, 5], torch.Size([2]), (5, 3, 2, 3), []]
      for d, q, n, batch_shape, seed, dtype in itertools.product(
          (1, 3),
          (1, 2),
          (2, 5),
          batch_shapes,
          (None, 1234),
          (torch.float, torch.double),
      ):
          tkwargs = {"device": self.device, "dtype": dtype}
          bounds = torch.stack([torch.rand(d), 1 + torch.rand(d)]).to(
              **tkwargs
          )
          samples = draw_sobol_samples(
              bounds=bounds,
              n=n,
              q=q,
              batch_shape=batch_shape,
              seed=seed,
          )
          batch_shape = batch_shape or torch.Size()
          self.assertEqual(
              samples.shape, torch.Size([n, *batch_shape, q, d])
          )
          self.assertTrue(torch.all(samples >= bounds[0]))
          self.assertTrue(torch.all(samples <= bounds[1]))
          self.assertEqual(samples.device.type, self.device.type)
          self.assertEqual(samples.dtype, dtype)
  
imports: from __future__ import annotations
  import itertools
  import warnings
  from typing import Any, Dict, Type
  from unittest import mock
  import numpy
  import torch
  from botorch.exceptions.errors import BotorchError
  from botorch.models.gp_regression import SingleTaskGP
  from botorch.sampling.pathwise import draw_matheron_paths
  from botorch.utils.sampling import _convert_bounds_to_inequality_constraints, batched_multinomial, DelaunayPolytopeSampler, draw_sobol_samples, find_interior_point, get_polytope_samples, HitAndRunPolytopeSampler, manual_seed, normalize_linear_constraints, optimize_posterior_samples, PolytopeSampler, sample_hypersphere, sample_simplex, sparse_to_dense_constraints
  from botorch.utils.testing import BotorchTestCase
label_desc: Use image node_id 1 for calling the TestSampleUtils obj's underlying member method code with example usage: obj.test_draw_sobol_samples() without return types