// Cuenta el trabajo de Dijkstra, y lo mide, sobre mapas de tamaño creciente.
// Va con -O2 y sin sanitizers. Los conteos son exactos, y los tiempos dependen de la máquina.
#include <cmath>
#include <cstddef>
#include <iomanip>
#include <iostream>

#include "bench.h"
#include "map_file.h"
#include "shortest_paths.h"

int main(int argc, char* argv[]) {
    std::cout << "    nodos   aristas  sacados  aristas leidas  entradas  viejas  heap maximo      ms  ns/((V+E)log V)\n";
    for (int i = 1; i < argc; i++) {
        Graph graph = graph_of(read_map_file(argv[i]));
        DijkstraResult result = dijkstra(graph, 0);
        double seconds = median_seconds(11, [&] { keep(dijkstra(graph, 0).distance.back()); });
        double v = graph.node_count();
        double e = static_cast<double>(graph.edge_count());
        const DijkstraCounts& c = result.counts;
        std::cout << std::setw(9) << graph.node_count() << std::setw(10) << graph.edge_count() << std::setw(9)
                  << c.settled << std::setw(16) << c.edges_read << std::setw(10) << c.pushes << std::setw(8) << c.stale
                  << std::setw(13) << c.peak_heap << std::fixed << std::setprecision(3) << std::setw(8)
                  << seconds * 1e3 << std::setprecision(2) << std::setw(17)
                  << seconds * 1e9 / ((v + e) * std::log2(v)) << "\n";
    }
    return 0;
}
