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"]
docstr: Extract the arms in data that are in arm_sigs.
  
  Return None if none.
docstr_tok: ["Extract","the","arms","in","data","that","are","in","arm_sigs",".","Return","None","if","none","."]
code: def _filter_data_to_projection(
      self, experiment: Experiment, data: Data, arm_sigs: Set[str]
  ) -> Optional[Data]:
      """Extract the arms in data that are in arm_sigs.
  
      Return None if none.
      """
      arm_names: Set[str] = set({})
      for arm_name in data.df["arm_name"].unique():
          sig = experiment.arms_by_name[arm_name].signature
          if sig in arm_sigs:
              arm_names.add(arm_name)
  
      if len(arm_names) == 0:
          return None
      # Else,
      df_i = data.df[data.df["arm_name"].isin(arm_names)].copy()
      return Data(df_i)
  
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 5 for calling the REMBOStrategy obj's underlying member method code with example usage: obj._filter_data_to_projection(experiment, data, arm_sigs) and returns: Data, None