class_docstr: Abstract base class for MC multi-output objectives.
  
  Args:
      _is_mo: A boolean denoting whether the objectives are multi-output.
docstr: Evaluate the multi-output objective on the samples.
  
  Args:
      samples: A `sample_shape x batch_shape x q x m`-dim Tensors of samples from
          a model posterior.
      X: A `batch_shape x q x d`-dim Tensors of inputs.
  
  Returns:
      A `sample_shape x batch_shape x q x m'`-dim Tensor of objective values with
      `m'` the output dimension. This assumes maximization in each output
      dimension).
  
  This method is usually not called directly, but via the objectives.
  
  Example:
      >>> # `__call__` method:
      >>> samples = sampler(posterior)
      >>> outcomes = multi_obj(samples)
docstr_tok: ["Evaluate","the","multi-output","objective","on","the","samples",".","Args",":","samples",":","A","`","sample_shape","x","batch_shape","x","q","x","m","`","-dim","Tensors","of","samples","from","a","model","posterior",".","X",":","A","`","batch_shape","x","q","x","d","`","-dim","Tensors","of","inputs",".","Returns",":","A","`","sample_shape","x","batch_shape","x","q","x","m","'","`","-dim","Tensor","of","objective","values","with","`","m","'","`","the","output","dimension",".","This","assumes","maximization","in","each","output","dimension",")",".","This","method","is","usually","not","called","directly",",","but","via","the","objectives",".","Example",":",">",">",">","#","`","__call__","`","method",":",">",">",">","samples","=","sampler","(","posterior",")",">",">",">","outcomes","=","multi_obj","(","samples",")"]
code: def forward(
      self, samples: Tensor, X: Optional[Tensor] = None, **kwargs
  ) -> Tensor:
      r"""Evaluate the multi-output objective on the samples.
  
      Args:
          samples: A `sample_shape x batch_shape x q x m`-dim Tensors of samples from
              a model posterior.
          X: A `batch_shape x q x d`-dim Tensors of inputs.
  
      Returns:
          A `sample_shape x batch_shape x q x m'`-dim Tensor of objective values with
          `m'` the output dimension. This assumes maximization in each output
          dimension).
  
      This method is usually not called directly, but via the objectives.
  
      Example:
          >>> # `__call__` method:
          >>> samples = sampler(posterior)
          >>> outcomes = multi_obj(samples)
      """
      pass
  
imports: from __future__ import annotations
  import warnings
  from abc import abstractmethod
  from typing import List, Optional
  import torch
  from botorch.acquisition.objective import GenericMCObjective, MCAcquisitionObjective
  from botorch.exceptions.errors import BotorchError, BotorchTensorDimensionError
  from botorch.models.model import Model
  from botorch.posteriors import GPyTorchPosterior
  from botorch.utils import apply_constraints
  from botorch.utils.transforms import normalize_indices
  from torch import Tensor
label_desc: Use image node_id 1 for calling the MCMultiOutputObjective obj's underlying member method code with example usage: obj.forward(samples, X) without return types