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","."]
docstr: Constructs a synchronous `OptimizationLoop` using an evaluation
  function.
docstr_tok: ["Constructs","a","synchronous","`","OptimizationLoop","`","using","an","evaluation","function","."]
code: def with_evaluation_function(
      parameters: List[TParameterRepresentation],
      evaluation_function: TEvaluationFunction,
      experiment_name: Optional[str] = None,
      objective_name: Optional[str] = None,
      minimize: bool = False,
      parameter_constraints: Optional[List[str]] = None,
      outcome_constraints: Optional[List[str]] = None,
      total_trials: int = 20,
      arms_per_trial: int = 1,
      wait_time: int = 0,
      random_seed: Optional[int] = None,
      generation_strategy: Optional[GenerationStrategy] = None,
  ) -> "OptimizationLoop":
      """Constructs a synchronous `OptimizationLoop` using an evaluation
      function."""
      experiment = InstantiationBase.make_experiment(
          name=experiment_name,
          parameters=parameters,
          objective_name=objective_name,
          minimize=minimize,
          parameter_constraints=parameter_constraints,
          outcome_constraints=outcome_constraints,
      )
      return OptimizationLoop(
          experiment=experiment,
          total_trials=total_trials,
          arms_per_trial=arms_per_trial,
          random_seed=random_seed,
          wait_time=wait_time,
          generation_strategy=generation_strategy,
          evaluation_function=evaluation_function,
      )
  
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 2 for calling the OptimizationLoop obj's underlying member method code with example usage: obj.with_evaluation_function(parameters, evaluation_function, experiment_name, objective_name, minimize, parameter_constraints, outcome_constraints, total_trials, arms_per_trial, wait_time, random_seed, generation_strategy) and returns: OptimizationLoop