docs: private double determineAlphaMin(int n, double[] alpha_min, HyperBoundingBox interval) {
      double alpha_n = extremum_alpha_n(n, alpha_min);
      double lower = interval.getMin(n);
      double upper = interval.getMax(n);
  
      double[] alpha_extreme = new double[alpha_min.length];
      System.arraycopy(alpha_min, n, alpha_extreme, n, alpha_extreme.length - n);
      alpha_extreme[n] = alpha_n;
  
      ExtremumType type = extremumType(n, alpha_extreme, interval);
      if(type.equals(ExtremumType.MINIMUM) || type.equals(ExtremumType.CONSTANT)) {
        // A) lower <= alpha_n <= upper
        if(lower <= alpha_n && alpha_n <= upper) {
          return alpha_n;
        }
        // B) alpha_n < upper
        else if(alpha_n < lower) {
          return lower;
        }
        // C) alpha_n > max
        else {
          if(alpha_n <= upper) {
            throw new IllegalStateException("Should never happen!");
          }
          return upper;
        }
      }
      // extremum is maximum
      else {
        if(lower <= alpha_n && alpha_n <= upper) {
          // A1) min <= alpha_n <= max && alpha_n - min <= max - alpha_n
          if(alpha_n - lower <= upper - alpha_n) {
            return upper;
          }
          // A2) min <= alpha_n <= max && alpha_n - min > max - alpha_n
          else {
            return lower;
          }
        }
        // B) alpha_n < min
        else if(alpha_n < lower) {
          return upper;
        }
        // C) alpha_n > max
        else {
          if(alpha_n <= upper) {
            throw new IllegalStateException("Should never happen!");
          }
          return lower;
        }
      }
    }