class_docstr: Managed optimization loop, in which Ax oversees deployment of trials and
  gathering data.
class_docstr_tok: ["Managed","optimization","loop",",","in","which","Ax","oversees","deployment","of","trials","and","gathering","data","."]
code: def __init__(
      self,
      experiment: Experiment,
      evaluation_function: TEvaluationFunction,
      total_trials: int = 20,
      arms_per_trial: int = 1,
      random_seed: Optional[int] = None,
      wait_time: int = 0,
      run_async: bool = False,  # TODO[Lena],
      generation_strategy: Optional[GenerationStrategy] = None,
  ) -> None:
      assert (
          not run_async
      ), "OptimizationLoop does not yet support async."
      self.wait_time = wait_time
      self.total_trials = total_trials
      self.arms_per_trial = arms_per_trial
      self.random_seed = random_seed
      self.evaluation_function: TEvaluationFunction = (
          evaluation_function
      )
      assert len(experiment.trials) == 0, (
          "Optimization Loop should not be initialized with an experiment "
          "that has trials already."
      )
      self.experiment = experiment
      if generation_strategy is None:
          # pyre-fixme[4]: Attribute must be annotated.
          self.generation_strategy = choose_generation_strategy(
              search_space=experiment.search_space,
              use_batch_trials=self.arms_per_trial > 1,
              random_seed=self.random_seed,
              experiment=experiment,
          )
      else:
          self.generation_strategy = generation_strategy
      self.current_trial = 0
  
imports: from __future__ import annotations
  import inspect
  import logging
  from typing import Iterable, List, Optional, Tuple
  from ax.core.arm import Arm
  from ax.core.base_trial import BaseTrial
  from ax.core.batch_trial import BatchTrial
  from ax.core.experiment import Experiment
  from ax.core.formatting_utils import data_and_evaluations_from_raw_data
  from ax.core.trial import Trial
  from ax.core.types import TEvaluationFunction, TEvaluationOutcome, TModelPredictArm, TParameterization
  from ax.core.utils import get_pending_observation_features
  from ax.exceptions.constants import CHOLESKY_ERROR_ANNOTATION
  from ax.exceptions.core import SearchSpaceExhausted, UserInputError
  from ax.modelbridge.base import ModelBridge
  from ax.modelbridge.dispatch_utils import choose_generation_strategy
  from ax.modelbridge.generation_strategy import GenerationStrategy
  from ax.modelbridge.registry import Models
  from ax.service.utils.best_point import get_best_parameters_from_model_predictions, get_best_raw_objective_point
  from ax.service.utils.instantiation import InstantiationBase, TParameterRepresentation
  from ax.utils.common.executils import retry_on_exception
  from ax.utils.common.logger import get_logger
  from ax.utils.common.typeutils import not_none
label_desc: Use image node_id 1 to create a new OptimizationLoop object  with example: obj = OptimizationLoop(experiment, evaluation_function, total_trials, arms_per_trial, random_seed, wait_time, run_async, generation_strategy)