class_docstr: Abstract base class for the lower bound multi-objective entropy search
  acquisition functions.
class_docstr_tok: ["Abstract","base","class","for","the","lower","bound","multi-objective","entropy","search","acquisition","functions","."]
docstr: Lower bound multi-objective entropy search acquisition function.
  
  Args:
      model: A fitted batch model with 'M' number of outputs.
      pareto_sets: A `num_pareto_samples x num_pareto_points x d`-dim Tensor
          containing the sampled Pareto optimal sets of inputs.
      pareto_fronts: A `num_pareto_samples x num_pareto_points x M`-dim Tensor
          containing the sampled Pareto optimal sets of outputs.
      hypercell_bounds:  A `num_pareto_samples x 2 x J x M`-dim Tensor
          containing the hyper-rectangle bounds for integration, where `J` is
          the number of hyper-rectangles. In the unconstrained case, this gives
          the partition of the dominated space. In the constrained case, this
          gives the partition of the feasible dominated space union the
          infeasible space.
      X_pending: A `m x d`-dim Tensor of `m` design points that have been
          submitted for function evaluation, but have not yet been evaluated.
      estimation_type: A string to determine which entropy estimate is
          computed: "0", "LB", "LB2", or "MC".
      num_samples: The number of Monte Carlo samples for the Monte Carlo
          estimate.
docstr_tok: ["Lower","bound","multi-objective","entropy","search","acquisition","function",".","Args",":","model",":","A","fitted","batch","model","with","'M","'","number","of","outputs",".","pareto_sets",":","A","`","num_pareto_samples","x","num_pareto_points","x","d","`","-dim","Tensor","containing","the","sampled","Pareto","optimal","sets","of","inputs",".","pareto_fronts",":","A","`","num_pareto_samples","x","num_pareto_points","x","M","`","-dim","Tensor","containing","the","sampled","Pareto","optimal","sets","of","outputs",".","hypercell_bounds",":","A","`","num_pareto_samples","x","2","x","J","x","M","`","-dim","Tensor","containing","the","hyper-rectangle","bounds","for","integration",",","where","`","J","`","is","the","number","of","hyper-rectangles",".","In","the","unconstrained","case",",","this","gives","the","partition","of","the","dominated","space",".","In","the","constrained","case",",","this","gives","the","partition","of","the","feasible","dominated","space","union","the","infeasible","space",".","X_pending",":","A","`","m","x","d","`","-dim","Tensor","of","`","m","`","design","points","that","have","been","submitted","for","function","evaluation",",","but","have","not","yet","been","evaluated",".","estimation_type",":","A","string","to","determine","which","entropy","estimate","is","computed",":","``","0","''",",","``","LB","''",",","``","LB2","''",",","or","``","MC","''",".","num_samples",":","The","number","of","Monte","Carlo","samples","for","the","Monte","Carlo","estimate","."]
code: def __init__(
      self,
      model: Model,
      pareto_sets: Tensor,
      pareto_fronts: Tensor,
      hypercell_bounds: Tensor,
      X_pending: Optional[Tensor] = None,
      estimation_type: str = "LB",
      num_samples: int = 64,
      **kwargs: Any,
  ) -> None:
      r"""Lower bound multi-objective entropy search acquisition function.
  
      Args:
          model: A fitted batch model with 'M' number of outputs.
          pareto_sets: A `num_pareto_samples x num_pareto_points x d`-dim Tensor
              containing the sampled Pareto optimal sets of inputs.
          pareto_fronts: A `num_pareto_samples x num_pareto_points x M`-dim Tensor
              containing the sampled Pareto optimal sets of outputs.
          hypercell_bounds:  A `num_pareto_samples x 2 x J x M`-dim Tensor
              containing the hyper-rectangle bounds for integration, where `J` is
              the number of hyper-rectangles. In the unconstrained case, this gives
              the partition of the dominated space. In the constrained case, this
              gives the partition of the feasible dominated space union the
              infeasible space.
          X_pending: A `m x d`-dim Tensor of `m` design points that have been
              submitted for function evaluation, but have not yet been evaluated.
          estimation_type: A string to determine which entropy estimate is
              computed: "0", "LB", "LB2", or "MC".
          num_samples: The number of Monte Carlo samples for the Monte Carlo
              estimate.
      """
      super().__init__(model=model)
      sampler = SobolQMCNormalSampler(
          sample_shape=torch.Size([num_samples])
      )
      MCSamplerMixin.__init__(self, sampler=sampler)
      # Batch GP models (e.g. fantasized models) are not currently supported
      if isinstance(model, ModelListGP):
          train_X = model.models[0].train_inputs[0]
      else:
          train_X = model.train_inputs[0]
      if (model.num_outputs > 1 and train_X.ndim > 3) or (
          model.num_outputs == 1 and train_X.ndim > 2
      ):
          raise NotImplementedError(
              "Batch GP models (e.g. fantasized models) are not supported."
          )
  
      self.initial_model = model
      if (pareto_sets is not None and pareto_sets.ndim != 3) or (
          pareto_fronts is not None and pareto_fronts.ndim != 3
      ):
          raise UnsupportedError(
              "The Pareto set and front should have a shape of "
              "`num_pareto_samples x num_pareto_points x input_dim` and "
              "`num_pareto_samples x num_pareto_points x num_objectives`, "
              "respectively"
          )
      else:
          self.pareto_sets = pareto_sets
          self.pareto_fronts = pareto_fronts
  
      if hypercell_bounds.ndim != 4:
          raise UnsupportedError(
              "The hypercell_bounds should have a shape of "
              "`num_pareto_samples x 2 x num_boxes x num_objectives`."
          )
      else:
          self.hypercell_bounds = hypercell_bounds
          self.num_pareto_samples = hypercell_bounds.shape[0]
  
      self.estimation_type = estimation_type
      estimation_types = ["0", "LB", "LB2", "MC"]
  
      if estimation_type not in estimation_types:
          raise NotImplementedError(
              "Currently the only supported estimation type are: "
              + ", ".join(f'"{h}"' for h in estimation_types)
              + "."
          )
  
      self.set_X_pending(X_pending)
  
imports: from __future__ import annotations
  from abc import abstractmethod
  from math import pi
  from typing import Any, Optional, Tuple, Union
  import torch
  from botorch import settings
  from botorch.acquisition.acquisition import AcquisitionFunction, MCSamplerMixin
  from botorch.exceptions.errors import UnsupportedError
  from botorch.models.model import Model
  from botorch.models.model_list_gp_regression import ModelListGP
  from botorch.models.utils import fantasize
  from botorch.posteriors.gpytorch import GPyTorchPosterior
  from botorch.sampling.normal import SobolQMCNormalSampler
  from botorch.utils.transforms import concatenate_pending_points, t_batch_mode_transform
  from torch import Tensor
  from torch.distributions import Normal
label_desc: Use image node_id 1 to create a new LowerBoundMultiObjectiveEntropySearch object from inherited base classes: AcquisitionFunction, MCSamplerMixin with example: obj = LowerBoundMultiObjectiveEntropySearch(model, pareto_sets, pareto_fronts, hypercell_bounds, X_pending, estimation_type, num_samples)