code: def test_sample_hypersphere(self):
      for d, n, qmc, seed, dtype in itertools.product(
          (1, 2, 3),
          (2, 5),
          (False, True),
          (None, 1234),
          (torch.float, torch.double),
      ):
          samples = sample_hypersphere(
              d=d,
              n=n,
              qmc=qmc,
              seed=seed,
              device=self.device,
              dtype=dtype,
          )
          self.assertEqual(samples.shape, torch.Size([n, d]))
          self.assertTrue(
              torch.max((samples.pow(2).sum(dim=-1) - 1).abs()) < 1e-5
          )
          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 3 for calling the TestSampleUtils obj's underlying member method code with example usage: obj.test_sample_hypersphere() without return types