class_docstr: **All classes in 'botorch_modular' directory are under
  construction, incomplete, and should be treated as alpha
  versions only.**
  
  Ax wrapper for BoTorch `AcquisitionFunction`, subcomponent
  of `BoTorchModel` and is not meant to be used outside of it.
  
  Args:
      surrogates: Dict of name => Surrogate model pairs, with which this acquisition
          function will be used.
      search_space_digest: A SearchSpaceDigest object containing metadata
          about the search space (e.g. bounds, parameter types).
      torch_opt_config: A TorchOptConfig object containing optimization
          arguments (e.g., objective weights, constraints).
      botorch_acqf_class: Type of BoTorch `AcquistitionFunction` that
          should be used. Subclasses of `Acquisition` often specify
          these via `default_botorch_acqf_class` attribute, in which
          case specifying one here is not required.
      options: Optional mapping of kwargs to the underlying `Acquisition
          Function` in BoTorch.
class_docstr_tok: ["*","*","All","classes","in","'botorch_modular","'","directory","are","under","construction",",","incomplete",",","and","should","be","treated","as","alpha","versions","only",".","*","*","Ax","wrapper","for","BoTorch","`","AcquisitionFunction","`",",","subcomponent","of","`","BoTorchModel","`","and","is","not","meant","to","be","used","outside","of","it",".","Args",":","surrogates",":","Dict","of","name","=",">","Surrogate","model","pairs",",","with","which","this","acquisition","function","will","be","used",".","search_space_digest",":","A","SearchSpaceDigest","object","containing","metadata","about","the","search","space","(","e.g",".","bounds",",","parameter","types",")",".","torch_opt_config",":","A","TorchOptConfig","object","containing","optimization","arguments","(","e.g.",",","objective","weights",",","constraints",")",".","botorch_acqf_class",":","Type","of","BoTorch","`","AcquistitionFunction","`","that","should","be","used",".","Subclasses","of","`","Acquisition","`","often","specify","these","via","`","default_botorch_acqf_class","`","attribute",",","in","which","case","specifying","one","here","is","not","required",".","options",":","Optional","mapping","of","kwargs","to","the","underlying","`","Acquisition","Function","`","in","BoTorch","."]
docstr: BoTorch ``AcquisitionFunction`` class underlying this ``Acquisition``.
code: def botorch_acqf_class(self) -> Type[AcquisitionFunction]:
      """BoTorch ``AcquisitionFunction`` class underlying this ``Acquisition``."""
      return self.acqf.__class__
  
imports: from __future__ import annotations
  import dataclasses
  import functools
  import operator
  import warnings
  from functools import partial, reduce
  from itertools import product
  from logging import Logger
  from typing import Any, Callable, Dict, List, Mapping, Optional, Tuple, Type
  import torch
  from ax.core.search_space import SearchSpaceDigest
  from ax.exceptions.core import AxWarning, SearchSpaceExhausted
  from ax.models.model_utils import enumerate_discrete_combinations, mk_discrete_choices
  from ax.models.torch.botorch_modular.optimizer_argparse import optimizer_argparse
  from ax.models.torch.botorch_modular.surrogate import Surrogate
  from ax.models.torch.botorch_modular.utils import _tensor_difference, get_post_processing_func
  from ax.models.torch.botorch_moo_defaults import infer_objective_thresholds
  from ax.models.torch.utils import _get_X_pending_and_observed, get_botorch_objective_and_transform, subset_model
  from ax.models.torch_base import TorchOptConfig
  from ax.utils.common.base import Base
  from ax.utils.common.constants import Keys
  from ax.utils.common.logger import get_logger
  from ax.utils.common.typeutils import not_none
  from botorch.acquisition.acquisition import AcquisitionFunction
  from botorch.acquisition.input_constructors import get_acqf_input_constructor
  from botorch.acquisition.knowledge_gradient import qKnowledgeGradient
  from botorch.acquisition.objective import MCAcquisitionObjective, PosteriorTransform
  from botorch.acquisition.risk_measures import RiskMeasureMCObjective
  from botorch.models.model import Model, ModelDict
  from botorch.optim.optimize import optimize_acqf, optimize_acqf_discrete, optimize_acqf_discrete_local_search, optimize_acqf_mixed
  from botorch.utils.constraints import get_outcome_constraint_transforms
  from torch import Tensor
label_desc: Use image node_id 2 for calling the Acquisition obj's underlying member method code with example usage: obj.botorch_acqf_class() and returns: self