class_docstr: Sobol experiment design.
  Uses random design for non-continuous variables, and Sobol sequence for continuous ones
code: def get_samples(self, init_points_count):
      samples = np.empty((init_points_count, self.space.dimensionality))
  
      # Use random design to fill non-continuous variables
      random_design = RandomDesign(self.space)
      random_design.fill_noncontinous_variables(samples)
  
      if self.space.has_continuous():
          bounds = self.space.get_continuous_bounds()
          lower_bound = np.asarray(bounds)[:, 0].reshape(1, len(bounds))
          upper_bound = np.asarray(bounds)[:, 1].reshape(1, len(bounds))
          diff = upper_bound - lower_bound
  
          from sobol_seq import i4_sobol_generate
  
          X_design = (
              np.dot(
                  i4_sobol_generate(
                      len(self.space.get_continuous_bounds()),
                      init_points_count,
                  ),
                  np.diag(diff.flatten()),
              )[None, :]
              + lower_bound
          )
          samples[:, self.space.get_continuous_dims()] = X_design
  
      return samples
  
imports: import numpy
  from ..core.errors import InvalidConfigError
  from .base import ExperimentDesign
  from .random_design import RandomDesign
label_desc: Use image node_id 2 for calling the SobolDesign obj's underlying member method code with example usage: obj.get_samples(init_points_count) and returns: samples