class_docstr: Generation strategy for REMBO.
  
  Both quasirandom initialization and BO are done with the same random
  projection. As is done in the REMBO paper, k independent optimizations
  are done, each with an independently generated projection.
  
  Args:
      D: Dimensionality of high-dimensional space
      d: Dimensionality of low-dimensional space
      k: Number of random projections
      init_per_proj: Number of arms to use for random initialization of each
          of the k projections.
      name: Name of strategy
      dtype: torch dtype
      device: torch device
      gp_kwargs: kwargs sent along to the GP model
class_docstr_tok: ["Generation","strategy","for","REMBO",".","Both","quasirandom","initialization","and","BO","are","done","with","the","same","random","projection",".","As","is","done","in","the","REMBO","paper",",","k","independent","optimizations","are","done",",","each","with","an","independently","generated","projection",".","Args",":","D",":","Dimensionality","of","high-dimensional","space","d",":","Dimensionality","of","low-dimensional","space","k",":","Number","of","random","projections","init_per_proj",":","Number","of","arms","to","use","for","random","initialization","of","each","of","the","k","projections",".","name",":","Name","of","strategy","dtype",":","torch","dtype","device",":","torch","device","gp_kwargs",":","kwargs","sent","along","to","the","GP","model"]
code: def __init__(
      self,
      D: int,
      d: int,
      init_per_proj: int,
      k: int = 4,
      name: str = "REMBO",
      dtype: torch.dtype = torch.double,
      device: torch.device = DEFAULT_TORCH_DEVICE,
      gp_kwargs: Optional[Dict[str, Any]] = None,
  ) -> None:
      self.D = D
      self.d = d
      self.k = k
      self.init_per_proj = init_per_proj
      self.dtype = dtype
      self.device = device
      # pyre-fixme[4]: Attribute must be annotated.
      self.gp_kwargs = gp_kwargs if gp_kwargs is not None else {}
  
      # pyre-fixme[4]: Attribute must be annotated.
      self.projections = {
          i: self.get_projection(
              D=self.D, d=self.d, dtype=self.dtype, device=self.device
          )
          for i in range(self.k)
      }
  
      # pyre-fixme[4]: Attribute must be annotated.
      self.X_d_by_proj = defaultdict(list)
      self.current_iteration = 0
      self.arms_by_proj: Dict[int, Set[str]] = {
          i: set({}) for i in range(self.k)
      }
  
      # The first GenerationStep, and super
      A, bounds_d = self.projections[0]
      steps = [
          GenerationStep(
              model=get_rembo_initializer,
              num_trials=1,
              model_kwargs={"A": A, "bounds_d": bounds_d},
          )
      ]
      super().__init__(steps=steps, name=name)
  
imports: import math
  from collections import defaultdict
  from typing import Any, Dict, List, Optional, Set, Tuple
  import numpy
  import torch
  from ax.core.data import Data
  from ax.core.experiment import Experiment
  from ax.core.generator_run import GeneratorRun
  from ax.core.search_space import SearchSpace
  from ax.modelbridge.factory import DEFAULT_TORCH_DEVICE
  from ax.modelbridge.generation_strategy import GenerationStep, GenerationStrategy
  from ax.modelbridge.random import RandomModelBridge
  from ax.modelbridge.torch import TorchModelBridge
  from ax.modelbridge.transforms.centered_unit_x import CenteredUnitX
  from ax.modelbridge.transforms.standardize_y import StandardizeY
  from ax.models.random.rembo_initializer import REMBOInitializer
  from ax.models.torch.rembo import REMBO
  from ax.utils.common.typeutils import not_none
label_desc: Use image node_id 1 to create a new REMBOStrategy object from inherited base classes: GenerationStrategy with example: obj = REMBOStrategy(D, d, init_per_proj, k, name, dtype, device, gp_kwargs)