def approximate_puso_extrema(H):
    """approximate_puso_extrema.

    Find the approximate minimum and maximum possible values that a PUSO can
    take. This is very approximate! The estimated minimum value that this
    function returns will definitely be less than or equal to the true
    minimum (most likely, it will be much less). Similarly, the estimated
    maximum value that this function returns will definitely be greater than or
    equal to the true maximum (most likely, it will be much more).

    Parameters
    ----------
    H : dict, PUSO, or PUSOMatrix object.
        ``H`` represents a PUSO. Please see ``qubovert.PUSO`` or
        ``qubovert.utils.PUSOMatrix``.

    Return
    ------
    bounds : tuple (min, max).
        The approximate minimum and maximum of the PUSO.

    """
    min_, max_ = 0, 0
    for k, v in H.items():
        if not k:
            min_ += v
            max_ += v
        else:
            min_ -= abs(v)
            max_ += abs(v)
    return min_, max_
