def max_util_of_info(c, A, b, bounds, y):
    """
    Compute the maximum utility of information at scale `y`.

    Parameters
    ----------
    c : ndarray
        A list of atom-weights.
    A : ndarray
        The lhs of the various constraints.
    b : ndarray
        The rhs of the various constraints.
    bounds : list of pairs
        Each part of `x` must be between the atom's value and 0.
    y : float
        The total mutual information captured.
    """
    from scipy.optimize import linprog
    b[-1] = y
    solution = linprog(c, A, b, bounds=bounds)
    maximum_utility_of_information = -solution.fun
    return maximum_utility_of_information
