class_docstr: Gsobol test function.
  
  d-dimensional function (usually evaluated on `[0, 1]^d`):
  
      f(x) = Prod_{i=1}\^{d} ((\|4x_i-2\|+a_i)/(1+a_i)), a_i >=0
  
  common combinations of dimension and a vector:
  
      dim=8, a= [0, 1, 4.5, 9, 99, 99, 99, 99]
      dim=6, a=[0, 0.5, 3, 9, 99, 99]
      dim = 15, a= [1, 2, 5, 10, 20, 50, 100, 500, 1000, ..., 1000]
  
  Proposed to test sensitivity analysis methods
  First order Sobol indices have closed form expression S_i=V_i/V with :
  
      V_i= 1/(3(1+a_i)\^2)
      V= Prod_{i=1}\^{d} (1+V_i) - 1
docstr: Args:
      dim: Dimensionality of the problem. If 6, 8, or 15, will use standard a.
      a: a parameter, unless dim is 6, 8, or 15.
      noise_std: Standard deviation of observation noise.
      negate: Return negatie of function.
docstr_tok: ["Args",":","dim",":","Dimensionality","of","the","problem",".","If","6",",","8",",","or","15",",","will","use","standard","a.","a",":","a","parameter",",","unless","dim","is","6",",","8",",","or","15.","noise_std",":","Standard","deviation","of","observation","noise",".","negate",":","Return","negatie","of","function","."]
code: def __init__(
      self,
      dim: int,
      a: List = None,
      noise_std: Optional[float] = None,
      negate: bool = False,
  ) -> None:
      r"""
      Args:
          dim: Dimensionality of the problem. If 6, 8, or 15, will use standard a.
          a: a parameter, unless dim is 6, 8, or 15.
          noise_std: Standard deviation of observation noise.
          negate: Return negatie of function.
      """
      self._optimizers = None
      self.dim = dim
      self._bounds = [(0, 1) for _ in range(self.dim)]
      if self.dim == 6:
          self.a = [0, 0.5, 3, 9, 99, 99]
      elif self.dim == 8:
          self.a = [0, 1, 4.5, 9, 99, 99, 99, 99]
      elif self.dim == 15:
          self.a = [
              1,
              2,
              5,
              10,
              20,
              50,
              100,
              500,
              1000,
              1000,
              1000,
              1000,
              1000,
              1000,
              1000,
          ]
      else:
          self.a = a
      self.optimal_sobol_indicies()
      super().__init__(noise_std=noise_std, negate=negate)
  
imports: import math
  from typing import List, Optional, Tuple
  import torch
  from botorch.test_functions.synthetic import SyntheticTestFunction
  from torch import Tensor
label_desc: Use image node_id 1 to create a new Gsobol object from inherited base classes: SyntheticTestFunction with example: obj = Gsobol(dim, a, noise_std, negate)