class_docstr: MVaR Approximation based on Random Scalarizations as introduced
  in [Daulton2022MARS]_.
  
  This approximates MVaR via VaR of Chebyshev scalarizations, where each
  scalarization corresponds to a point in the MVaR set. As implemented,
  this uses one set of scalarization weights to approximate a single MVaR value.
  Note that due to the normalization within the Chebyshev scalarization,
  the output of this risk measure may not be on the same scale as its inputs.
docstr: Construct a Chebyshev scalarization. Outcomes are first normalized to [0,1],
  then the Chebyshev scalarization is applied.
  
  NOTE: This is a modified version of the `get_chebyshev_scalarization` helper.
  It doesn't support negative weights. All objectives should be aligned for
  maximization using `preprocessing_function`.
docstr_tok: ["Construct","a","Chebyshev","scalarization",".","Outcomes","are","first","normalized","to","[","0,1","]",",","then","the","Chebyshev","scalarization","is","applied",".","NOTE",":","This","is","a","modified","version","of","the","`","get_chebyshev_scalarization","`","helper",".","It","does","n't","support","negative","weights",".","All","objectives","should","be","aligned","for","maximization","using","`","preprocessing_function","`","."]
code: def _construct_chebyshev_objective(self) -> None:
      r"""Construct a Chebyshev scalarization. Outcomes are first normalized to [0,1],
      then the Chebyshev scalarization is applied.
  
      NOTE: This is a modified version of the `get_chebyshev_scalarization` helper.
      It doesn't support negative weights. All objectives should be aligned for
      maximization using `preprocessing_function`.
      """
      if self.baseline_Y is None:
          raise RuntimeError(
              "baseline_Y must be set before constructing the Chebyshev objective."
          )
      ref_point = self.ref_point
      if ref_point is not None:
          ref_point = ref_point.to(self.baseline_Y)
      Y_bounds = self._get_Y_normalization_bounds(
          Y=self.baseline_Y, ref_point=ref_point
      )
      if ref_point is not None:
          ref_point = normalize(
              ref_point.unsqueeze(0), bounds=Y_bounds
          ).squeeze(0)
  
      def chebyshev_obj(
          Y: Tensor, X: Optional[Tensor] = None
      ) -> Tensor:
          Y = self.preprocessing_function(Y)
          Y = normalize(Y, bounds=Y_bounds)
          if ref_point is not None:
              Y = Y - ref_point
          product = torch.einsum(
              "...m,m->...m", Y, self.chebyshev_weights.to(Y)
          )
          return product.min(dim=-1).values
  
      self._chebyshev_objective = chebyshev_obj
  
imports: import warnings
  from abc import ABC, abstractmethod
  from math import ceil
  from typing import Callable, List, Optional, Union
  import torch
  from botorch.acquisition.multi_objective.objective import IdentityMCMultiOutputObjective, MCMultiOutputObjective
  from botorch.acquisition.risk_measures import CVaR, RiskMeasureMCObjective, VaR
  from botorch.exceptions.errors import UnsupportedError
  from botorch.exceptions.warnings import BotorchWarning
  from botorch.models.model import Model
  from botorch.utils.multi_objective.pareto import is_non_dominated
  from botorch.utils.transforms import normalize
  from torch import Tensor
label_desc: Use image node_id 8 for calling the MARS obj's underlying member method code with example usage: obj._construct_chebyshev_objective() and returns: product