class_docstr: A class for partitioning the non-dominated space into hyper-cells.
  
  Note: this assumes maximization. Internally, it multiplies outcomes by -1 and
  performs the decomposition under minimization. TODO: use maximization
  internally as well.
  
  Note: it is only feasible to use this algorithm to compute an exact
  decomposition of the non-dominated space for `m<5` objectives (alpha=0.0).
  
  The alpha parameter can be increased to obtain an approximate partitioning
  faster. The `alpha` is a fraction of the total hypervolume encapsuling the
  entire Pareto set. When a hypercell's volume divided by the total hypervolume
  is less than `alpha`, we discard the hypercell. See Figure 2 in
  [Couckuyt2012]_ for a visual representation.
  
  This PyTorch implementation of the binary partitioning algorithm ([Couckuyt2012]_)
  is adapted from numpy/tensorflow implementation at:
  https://github.com/GPflow/GPflowOpt/blob/master/gpflowopt/pareto.py.
  
  TODO: replace this with a more efficient decomposition. E.g.
  https://link.springer.com/content/pdf/10.1007/s10898-019-00798-7.pdf
code: def _compute_hypervolume_if_y_has_data(self) -> Tensor:
      ref_point = _expand_ref_point(
          ref_point=self.ref_point, batch_shape=self.batch_shape
      )
      # internally we minimize
      ref_point = -ref_point.unsqueeze(-2)
      ideal_point = self._neg_pareto_Y.min(dim=-2, keepdim=True).values
      aug_pareto_Y = torch.cat(
          [ideal_point, self._neg_pareto_Y, ref_point], dim=-2
      )
      cell_bounds_values = self._get_hypercell_bounds(
          aug_pareto_Y=aug_pareto_Y
      )
      total_volume = (ref_point - ideal_point).squeeze(-2).prod(dim=-1)
      non_dom_volume = (
          (cell_bounds_values[1] - cell_bounds_values[0])
          .prod(dim=-1)
          .sum(dim=-1)
      )
      return total_volume - non_dom_volume
  
imports: from __future__ import annotations
  from typing import Optional
  import torch
  from botorch.utils.multi_objective.box_decompositions.box_decomposition import BoxDecomposition, FastPartitioning
  from botorch.utils.multi_objective.box_decompositions.utils import _expand_ref_point, compute_non_dominated_hypercell_bounds_2d, get_partition_bounds, update_local_upper_bounds_incremental
  from torch import Tensor
label_desc: Use image node_id 7 for calling the NondominatedPartitioning obj's underlying member method code with example usage: obj._compute_hypervolume_if_y_has_data() and returns: unknown