class_docstr: A class for partitioning the non-dominated space into hyper-cells.
  
  Note: this assumes maximization. Internally, it multiplies by -1 and performs
  the decomposition under minimization.
  
  This class is far more efficient than NondominatedPartitioning for exact box
  partitionings
  
  This class uses the two-step approach similar to that in [Yang2019]_, where:
      a) first, Alg 1 from [Lacour17]_ is used to find the local lower bounds
          for the maximization problem
      b) second, the local lower bounds are used as the Pareto frontier for the
          minimization problem, and [Lacour17]_ is applied again to partition
          the space dominated by that Pareto frontier.
docstr: Compute non-dominated partitioning.
  
  Given local upper bounds for the minimization problem (self._U), this computes
  the non-dominated partitioning for the maximization problem. Note that
  -self.U contains the local lower bounds for the maximization problem. Following
  [Yang2019]_, this treats -self.U as a *new* pareto frontier for a minimization
  problem with a reference point of [infinity]^m and computes a dominated
  partitioning for this minimization problem.
docstr_tok: ["Compute","non-dominated","partitioning",".","Given","local","upper","bounds","for","the","minimization","problem","(","self._U",")",",","this","computes","the","non-dominated","partitioning","for","the","maximization","problem",".","Note","that","-self.U","contains","the","local","lower","bounds","for","the","maximization","problem",".","Following","[","Yang2019","]","_",",","this","treats","-self.U","as","a","*","new","*","pareto","frontier","for","a","minimization","problem","with","a","reference","point","of","[","infinity","]","^m","and","computes","a","dominated","partitioning","for","this","minimization","problem","."]
code: def _get_partitioning(self) -> None:
      r"""Compute non-dominated partitioning.
  
      Given local upper bounds for the minimization problem (self._U), this computes
      the non-dominated partitioning for the maximization problem. Note that
      -self.U contains the local lower bounds for the maximization problem. Following
      [Yang2019]_, this treats -self.U as a *new* pareto frontier for a minimization
      problem with a reference point of [infinity]^m and computes a dominated
      partitioning for this minimization problem.
      """
      new_ref_point = torch.full(
          torch.Size([1]) + self._neg_ref_point.shape,
          float("inf"),
          dtype=self._neg_ref_point.dtype,
          device=self._neg_ref_point.device,
      )
      # initialize local upper bounds for the second minimization problem
      self._U2 = new_ref_point
      # initialize defining points for the second minimization problem
      # use ref point for maximization as the ideal point for minimization.
      self._Z2 = self.ref_point.expand(
          1, self.num_outcomes, self.num_outcomes
      ).clone()
      for j in range(self._neg_ref_point.shape[-1]):
          self._Z2[0, j, j] = self._U2[0, j]
      # incrementally update local upper bounds and defining points
      # for each new Pareto point
      self._U2, self._Z2 = update_local_upper_bounds_incremental(
          new_pareto_Y=-self._U,
          U=self._U2,
          Z=self._Z2,
      )
      cell_bounds = get_partition_bounds(
          Z=self._Z2, U=self._U2, ref_point=new_ref_point.view(-1)
      )
      self.hypercell_bounds = cell_bounds
  
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 3 for calling the FastNondominatedPartitioning obj's underlying member method code with example usage: obj._get_partitioning() without return types