// Paso 5: su heap, std::priority_queue y el arreglo, en mapas de tamaño creciente.
// Corre desde el nodo 0, sin parar en ningún destino. Va con -O2 y sin sanitizers.
// El arreglo solo corre en mapas de hasta LIMIT_FOR_ARRAY nodos: en lima.txt son unas 6250 millones de
// lecturas por corrida, y cinco corridas tardan demasiado para repetirlas a cada rato.
// Uso: bench_routes mapa.txt...
#include <iomanip>
#include <iostream>

#include "bench.h"
#include "map_file.h"
#include "routes.h"

int main(int argc, char* argv[]) {
    const int LIMIT_FOR_ARRAY = 25000;
    std::cout << "    nodos   aristas   su heap ms   biblioteca ms   arreglo ms   lecturas del arreglo\n";
    for (int i = 1; i < argc; i++) {
        Graph graph = build_map_graph(read_map_file(argv[i]));
        double own = median_seconds(11, [&] { keep(dijkstra(graph, 0).distance.back()); });
        double library = median_seconds(11, [&] { keep(dijkstra_priority_queue(graph, 0).distance.back()); });
        std::cout << std::setw(9) << graph.node_count() << std::setw(10) << graph.edge_count() << std::fixed
                  << std::setprecision(3) << std::setw(13) << own * 1e3 << std::setw(16) << library * 1e3;
        if (graph.node_count() <= LIMIT_FOR_ARRAY) {
            std::size_t reads = 0;
            double array = median_seconds(5, [&] { reads = dijkstra_array(graph, 0).counts.scanned; });
            std::cout << std::setw(13) << array * 1e3 << std::setw(23) << reads << "\n";
        } else {
            std::cout << "  no se corre\n";
        }
    }
    return 0;
}
