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: Evaluates the lower bound information gain at the design points `X`.
  
  Args:
      X: A `batch_shape x q x d`-dim Tensor of `batch_shape` t-batches with `q`
      `d`-dim design points each.
  
  Returns:
      A `batch_shape`-dim Tensor of acquisition values at the given design
      points `X`.
docstr_tok: ["Evaluates","the","lower","bound","information","gain","at","the","design","points","`","X","`",".","Args",":","X",":","A","`","batch_shape","x","q","x","d","`","-dim","Tensor","of","`","batch_shape","`","t-batches","with","`","q","`","`","d","`","-dim","design","points","each",".","Returns",":","A","`","batch_shape","`","-dim","Tensor","of","acquisition","values","at","the","given","design","points","`","X","`","."]
code: def _compute_lower_bound_information_gain(self, X: Tensor) -> Tensor:
      r"""Evaluates the lower bound information gain at the design points `X`.
  
      Args:
          X: A `batch_shape x q x d`-dim Tensor of `batch_shape` t-batches with `q`
          `d`-dim design points each.
  
      Returns:
          A `batch_shape`-dim Tensor of acquisition values at the given design
          points `X`.
      """
      posterior_statistics = self._compute_posterior_statistics(X)
      initial_entropy = posterior_statistics["initial_entropy"]
      post_mean = posterior_statistics["posterior_mean"]
      post_var = posterior_statistics["posterior_variance"]
      obs_noise = posterior_statistics["observation_noise"]
  
      # Estimate the expected conditional entropy.
      # `batch_shape x q` dim Tensor of entropy estimates
      if self.estimation_type == "0":
          conditional_entropy = _compute_entropy_noiseless(
              hypercell_bounds=self.hypercell_bounds,
              mean=post_mean,
              variance=post_var,
              observation_noise=obs_noise,
          )
  
      elif self.estimation_type == "LB":
          conditional_entropy = _compute_entropy_upper_bound(
              hypercell_bounds=self.hypercell_bounds,
              mean=post_mean,
              variance=post_var,
              observation_noise=obs_noise,
              only_diagonal=False,
          )
  
      elif self.estimation_type == "LB2":
          conditional_entropy = _compute_entropy_upper_bound(
              hypercell_bounds=self.hypercell_bounds,
              mean=post_mean,
              variance=post_var,
              observation_noise=obs_noise,
              only_diagonal=True,
          )
  
      elif self.estimation_type == "MC":
          posterior_with_noise = posterior_statistics[
              "posterior_with_noise"
          ]
          (
              samples,
              samples_log_prob,
          ) = self._compute_monte_carlo_variables(posterior_with_noise)
  
          conditional_entropy = _compute_entropy_monte_carlo(
              hypercell_bounds=self.hypercell_bounds,
              mean=post_mean,
              variance=post_var,
              observation_noise=obs_noise,
              samples=samples,
              samples_log_prob=samples_log_prob,
          )
  
      # Sum over the batch.
      return initial_entropy - conditional_entropy.sum(dim=-1)
  
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 4 for calling the LowerBoundMultiObjectiveEntropySearch obj's underlying member method code with example usage: obj._compute_lower_bound_information_gain(X) and returns: unknown