code: def estimate_payoff_table(
      opt_meth_cls: Type[OptimizationMethod], mo_prob: MOProblem
  ) -> Tuple[List[float], List[float]]:
      
      ideal = [float("inf")] * mo_prob.nobj
      nadir = [float("-inf")] * mo_prob.nobj
      for i in range(mo_prob.nobj):
          meth = opt_meth_cls(SelectedOptimizationProblem(mo_prob, i))
          _decis, obj = meth.search()
          for j, obj_val in enumerate(obj):
              if obj_val < ideal[j]:
                  ideal[j] = obj_val
              if obj_val > nadir[j]:
                  nadir[j] = obj_val
      return ideal, nadir
docs: Estimates the ideal and nadir by using a payoff table. This should give a
      good estimate for the ideal, but can be very inaccurate for the nadir. For an explanation of why, see [DEB2010]_.
  
      References
      ----------
  
      .. [DEB2010] Deb, K., Miettinen, K., & Chaudhuri, S. (2010).
          Toward an estimation of nadir objective vector using a hybrid of evolutionary and local search approaches.
          IEEE Transactions on Evolutionary Computation, 14(6), 821-841.