class_docstr: Sample in a low-dimensional linear embedding.
  
  Generates points in [-1, 1]^D by generating points in a d-dimensional
  embedding, with box bounds as specified. When points are projected up, if
  they fall outside [-1, 1]^D they are clamped to those bounds.
  
  Args:
      A: A (Dxd) linear embedding
      bounds_d: Box bounds in the low-d space
      seed: seed for UniformGenerator
code: def gen(
      self,
      n: int,
      bounds: List[Tuple[float, float]],
      linear_constraints: Optional[
          Tuple[np.ndarray, np.ndarray]
      ] = None,
      fixed_features: Optional[Dict[int, float]] = None,
      model_gen_options: Optional[TConfig] = None,
      rounding_func: Optional[
          Callable[[np.ndarray], np.ndarray]
      ] = None,
  ) -> Tuple[np.ndarray, np.ndarray]:
      # The projection is from [-1, 1]^D.
      for b in bounds:
          assert b == (-1, 1)
      # The following can be easily handled in the future when needed
      assert linear_constraints is None
      assert fixed_features is None
      # Do gen in the low-dimensional space. First on [0, 1]^d,
      X_01, w = super().gen(
          n=n, bounds=[(0.0, 1.0)] * len(self.bounds_d)
      )
      # Then map to bounds_d
      lw, up = zip(*self.bounds_d)
      lw = np.array(lw)
      up = np.array(up)
      X_d = X_01 * (up - lw) + lw
      # Store
      self.X_d_gen.extend(list(X_d))
      # And finally project up
      return self.project_up(X_d), w
  
file_path: Ax/ax/models/random/rembo_initializer.py
imports: from typing import Callable, Dict, List, Optional, Tuple
  import numpy
  from ax.models.random.uniform import UniformGenerator
  from ax.models.types import TConfig
  from ax.utils.common.docutils import copy_doc
label_desc: Use image node_id 3 for calling the REMBOInitializer obj's underlying member method code with example usage: obj.gen(n, bounds, linear_constraints, fixed_features, model_gen_options, rounding_func) and returns: self,  w