Ejemplo n.º 1
0
def test_accuracy_comparison_illcond(target_conds=None):
    if target_conds is None:
        target_conds = [10 ** k for k in range(1, 2)]

    kernels = [
        sum,
        numpy.sum,
        accupy.kahan_sum,
        lambda p: accupy.ksum(p, K=2),
        lambda p: accupy.ksum(p, K=3),
        accupy.fsum,
    ]
    labels = [
        "sum",
        "numpy.sum",
        "accupy.kahan_sum",
        "accupy.ksum[2]",
        "accupy.ksum[3]",
        "accupy.fsum",
    ]
    colors = plt.rcParams["axes.prop_cycle"].by_key()["color"][: len(labels)]

    data = numpy.empty((len(target_conds), len(kernels)))
    condition_numbers = numpy.empty(len(target_conds))
    numpy.random.seed(0)
    for k, target_cond in enumerate(target_conds):
        p, ref, C = accupy.generate_ill_conditioned_sum(1000, target_cond)
        condition_numbers[k] = C
        data[k] = [abs(kernel(p) - ref) / abs(ref) for kernel in kernels]

    # sort
    s = numpy.argsort(condition_numbers)
    condition_numbers = condition_numbers[s]
    data = data[s]

    for label, color, d in zip(labels, colors, data.T):
        plt.loglog(condition_numbers, d, label=label, color=color)

    lgd = plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.0)
    plt.grid()
    plt.ylim(5.0e-18, 1.0)
    plt.xlabel("condition number")
    plt.ylabel("relative error")
    plt.gca().set_aspect(1.3)

    # plt.show()
    # <https://stackoverflow.com/a/10154763/353337>
    plt.savefig(
        "accuracy-sums.png",
        transparent=True,
        bbox_extra_artists=(lgd,),
        bbox_inches="tight",
    )
    return
Ejemplo n.º 2
0
def test_accuracy_comparison_illcond(filename=None, target_conds=None):
    plt.style.use(dufte.style)

    if target_conds is None:
        target_conds = [10 ** k for k in range(1, 2)]

    kernels = [
        sum,
        numpy.sum,
        accupy.kahan_sum,
        lambda p: accupy.ksum(p, K=2),
        lambda p: accupy.ksum(p, K=3),
        accupy.fsum,
    ]
    labels = [
        "sum",
        "numpy.sum",
        "accupy.kahan_sum",
        "accupy.ksum[2]",
        "accupy.ksum[3]",
        "accupy.fsum",
    ]
    colors = plt.rcParams["axes.prop_cycle"].by_key()["color"][: len(labels)]

    data = numpy.empty((len(target_conds), len(kernels)))
    condition_numbers = numpy.empty(len(target_conds))
    numpy.random.seed(0)
    for k, target_cond in enumerate(target_conds):
        p, ref, C = accupy.generate_ill_conditioned_sum(1000, target_cond)
        condition_numbers[k] = C
        data[k] = [abs(kernel(p) - ref) / abs(ref) for kernel in kernels]

    # sort
    s = numpy.argsort(condition_numbers)
    condition_numbers = condition_numbers[s]
    data = data[s]

    for label, color, d in zip(labels, colors, data.T):
        plt.loglog(condition_numbers, d, label=label, color=color)

    dufte.legend()
    plt.xlabel("condition number")
    plt.ylabel("relative error")
    # plt.gca().set_aspect(1.3)

    # plt.show()
    # <https://stackoverflow.com/a/10154763/353337>
    if filename:
        plt.savefig(filename, transparent=True, bbox_inches="tight")
Ejemplo n.º 3
0
def test_fsum(cond):
    p, ref, _ = accupy.generate_ill_conditioned_sum(100, cond)
    assert abs(accupy.fsum(p) - ref) < 1.0e-15 * abs(ref)
    return
Ejemplo n.º 4
0
def test_ksum3(cond):
    p, ref, _ = accupy.generate_ill_conditioned_sum(100, cond)
    assert abs(accupy.ksum(p, K=3) - ref) < 1.0e-15 * abs(ref)