// De productos a sumas, y lo que el redondeo le hace a esa cuenta.
#include <cmath>
#include <cstdio>
#include <vector>

#include "rates.h"

int main() {
    std::printf("Producto real y suma de -ln(tasa) en double:\n");
    std::printf("%-22s %10s %12s\n", "tasas", "producto", "suma");
    const std::vector<std::pair<const char*, std::vector<double>>> chains = {
        {"2 y 0,5", {2, 0.5}},
        {"1,25 y 0,8", {1.25, 0.8}},
        {"1,6 y 0,625", {1.6, 0.625}},
        {"2,5 y 0,4", {2.5, 0.4}},
        {"1,6, 1,25 y 0,5", {1.6, 1.25, 0.5}},
        {"1,25, 1,25 y 0,64", {1.25, 1.25, 0.64}},
    };
    for (const auto& [name, rates] : chains) std::printf("%-22s %10s %12.3e\n", name, "1 exacto", log_sum(rates));
    std::printf("%-22s %10s %12.3e\n", "1,1, 1,1 y 1/1,21 (*)", "menor a 1", log_sum({1.1, 1.1, 0.826446280991735}));
    std::printf("(*) 0,826446280991735 es 1/1,21 truncado a 15 decimales.\n");

    std::printf("\nCon pesos -ln(tasa) + epsilon, ¿la vuelta n relaja algo?\n");
    std::printf("%10s %28s %28s\n", "epsilon", "tabla exacta (sin arbitraje)", "ciclo de 400, 1,000001");
    for (double epsilon : {0.0, 1e-15, 1e-12, 1e-9, 1e-8, 1e-6}) {
        const bool table = round_n_relaxes(5, consistent_table(), epsilon);
        const bool cycle = round_n_relaxes(400, long_cycle(400), epsilon);
        std::printf("%10.0e %28s %28s\n", epsilon, table ? "sí (falso arbitraje)" : "no", cycle ? "sí" : "no (se le escapa)");
    }
}
