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
docstr: Get the bounds of each hypercell in the decomposition.
  
  Args:
      ref_point: A `(batch_shape) x m`-dim tensor containing the reference point.
  
  Returns:
      A `2 x num_cells x m`-dim tensor containing the
          lower and upper vertices bounding each hypercell.
docstr_tok: ["Get","the","bounds","of","each","hypercell","in","the","decomposition",".","Args",":","ref_point",":","A","`","(","batch_shape",")","x","m","`","-dim","tensor","containing","the","reference","point",".","Returns",":","A","`","2","x","num_cells","x","m","`","-dim","tensor","containing","the","lower","and","upper","vertices","bounding","each","hypercell","."]
code: def get_hypercell_bounds(self) -> Tensor:
      r"""Get the bounds of each hypercell in the decomposition.
  
      Args:
          ref_point: A `(batch_shape) x m`-dim tensor containing the reference point.
  
      Returns:
          A `2 x num_cells x m`-dim tensor containing the
              lower and upper vertices bounding each hypercell.
      """
      ref_point = _expand_ref_point(
          ref_point=self.ref_point, batch_shape=self.batch_shape
      )
      aug_pareto_Y = torch.cat(
          [
              # -inf is the lower bound of the non-dominated space
              torch.full(
                  torch.Size(
                      [
                          *self.batch_shape,
                          1,
                          self.num_outcomes,
                      ]
                  ),
                  float("-inf"),
                  dtype=self._neg_pareto_Y.dtype,
                  device=self._neg_pareto_Y.device,
              ),
              self._neg_pareto_Y,
              # note: internally, this class minimizes, so use negative here
              -(ref_point.unsqueeze(-2)),
          ],
          dim=-2,
      )
      minimization_cell_bounds = self._get_hypercell_bounds(
          aug_pareto_Y=aug_pareto_Y
      )
      # swap upper and lower bounds and multiply by -1
      return -minimization_cell_bounds.flip(0)
  
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 5 for calling the NondominatedPartitioning obj's underlying member method code with example usage: obj.get_hypercell_bounds() and returns: unknown