docs: def _selfConsistentIteration(self, relative_tolerance=1.0e-6, maximum_iterations=1000, verbose=True, print_warning=False):
          """
          Determine free energies by self-consistent iteration.
  
          OPTIONAL ARGUMENTS
  
            relative_tolerance (float between 0 and 1) - relative tolerance for convergence (default 1.0e-5)
            maximum_iterations (int) - maximum number of self-consistent iterations (default 1000)
            verbose (boolean) - verbosity level for debug output
  
          NOTES
  
            Self-consistent iteration of the MBAR equations is used, as described in Appendix C.1 of [1].
  
          """
  
          # Iteratively update dimensionless free energies until convergence to
          # specified tolerance, or maximum allowed number of iterations has been
          # exceeded.
          if verbose:
              print("MBAR: Computing dimensionless free energies by iteration.  This may take from seconds to minutes, depending on the quantity of data...")
          for iteration in range(0, maximum_iterations):
  
              if verbose:
                  print('Self-consistent iteration %d' % iteration)
  
              # compute the free energies by self consistent iteration (which
              # also involves calculating the weights)
              (W_nk, f_k_new) = self._computeWeights(
                  logform=True, return_f_k=True)
  
              if self._amIdoneIterating(
                                  f_k_new, relative_tolerance, iteration,
                                  maximum_iterations, print_warning, verbose):
                  break
  
          return