class_docstr: An abstract class for box decompositions.
  
  Note: Internally, we store the negative reference point (minimization).
  
  :meta private:
code: def _compute_pareto_Y(self) -> Tensor:
      if self._neg_Y is None:
          raise BotorchError("Y data has not been initialized")
      # is_non_dominated assumes maximization
      if self._neg_Y.shape[-2] == 0:
          return self._neg_Y
      # assumes maximization
      pareto_Y = -_pad_batch_pareto_frontier(
          Y=self.Y,
          ref_point=_expand_ref_point(
              ref_point=self.ref_point, batch_shape=self.batch_shape
          ),
      )
      if not self.sort:
          return pareto_Y
      # sort by first objective
      if len(self.batch_shape) > 0:
          pareto_Y = pareto_Y.gather(
              index=torch.argsort(pareto_Y[..., :1], dim=-2).expand(
                  pareto_Y.shape
              ),
              dim=-2,
          )
      else:
          pareto_Y = pareto_Y[torch.argsort(pareto_Y[:, 0])]
      return pareto_Y
  
imports: from __future__ import annotations
  from abc import ABC, abstractmethod
  from typing import Optional
  import torch
  from botorch.exceptions.errors import BotorchError
  from botorch.utils.multi_objective.box_decompositions.utils import _expand_ref_point, _pad_batch_pareto_frontier, update_local_upper_bounds_incremental
  from botorch.utils.multi_objective.pareto import is_non_dominated
  from torch import Tensor
  from torch.nn import Module
label_desc: Use image node_id 5 for calling the BoxDecomposition obj's underlying member method code with example usage: obj._compute_pareto_Y() and returns: pareto_Y, self, pareto_Y