code: def choose_botorch_acqf_class(
      pending_observations: Optional[List[Tensor]] = None,
      outcome_constraints: Optional[Tuple[Tensor, Tensor]] = None,
      linear_constraints: Optional[Tuple[Tensor, Tensor]] = None,
      fixed_features: Optional[Dict[int, float]] = None,
      objective_thresholds: Optional[Tensor] = None,
      objective_weights: Optional[Tensor] = None,
  ) -> Type[AcquisitionFunction]:
      """Chooses a BoTorch `AcquisitionFunction` class."""
      if objective_thresholds is not None or (
          # using objective_weights is a less-than-ideal fix given its ambiguity,
          # the real fix would be to revisit the infomration passed down via
          # the modelbridge (and be explicit about whether we scalarize or perform MOO)
          objective_weights is not None
          and objective_weights.nonzero().numel() > 1
      ):
          acqf_class = qLogNoisyExpectedHypervolumeImprovement
      else:
          acqf_class = qLogNoisyExpectedImprovement
  
      logger.debug(
          f"Chose BoTorch acquisition function class: {acqf_class}."
      )
      return acqf_class
  
imports: import warnings
  from logging import Logger
  from typing import Any, Callable, Dict, List, Optional, OrderedDict, Tuple, Type
  import torch
  from ax.core.search_space import SearchSpaceDigest
  from ax.exceptions.core import AxError, AxWarning, UnsupportedError
  from ax.models.types import TConfig
  from ax.utils.common.constants import Keys
  from ax.utils.common.logger import get_logger
  from ax.utils.common.typeutils import checked_cast, not_none
  from botorch.acquisition.acquisition import AcquisitionFunction
  from botorch.acquisition.logei import qLogNoisyExpectedImprovement
  from botorch.acquisition.multi_objective.logei import qLogNoisyExpectedHypervolumeImprovement
  from botorch.fit import fit_fully_bayesian_model_nuts, fit_gpytorch_mll
  from botorch.models.fully_bayesian import SaasFullyBayesianSingleTaskGP
  from botorch.models.gp_regression import SingleTaskGP
  from botorch.models.gp_regression_fidelity import SingleTaskMultiFidelityGP
  from botorch.models.gp_regression_mixed import MixedSingleTaskGP
  from botorch.models.gpytorch import BatchedMultiOutputGPyTorchModel, GPyTorchModel
  from botorch.models.model import Model, ModelList
  from botorch.models.multitask import MultiTaskGP
  from botorch.models.pairwise_gp import PairwiseGP
  from botorch.utils.datasets import SupervisedDataset
  from botorch.utils.transforms import is_fully_bayesian
  from gpytorch.mlls.marginal_log_likelihood import MarginalLogLikelihood
  from torch import Tensor
label_desc: Use image node_id 3 for calling a global function with example usage: choose_botorch_acqf_class(pending_observations, outcome_constraints, linear_constraints, fixed_features, objective_thresholds, objective_weights) and returns: acqf_class