#!/usr/bin/perl
# siru-relaja: simula un circuito partido en subcircuitos, cada uno en su
# proceso, por relajacion de forma de onda (Siru::Relajacion). Ver
# MANUAL.md, "Relajacion de forma de onda".
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../lib";
use File::Spec;
use Getopt::Long qw(GetOptions);
use Time::HiRes qw(time);
use Siru::Relajacion;

my %o = (partes => 2);
my $uso = "Uso: $0 [--partes N] [--particion ARCHIVO] [--ventana T] [--tolerancia E]\n"
        . "       [--iter-max K] [--procesos P] [--salida X.csv] [--calcula EJECUTABLE]\n"
        . "       [--bibliotecas DIR] [--charla] CIRCUITO.d\n";
GetOptions('partes=i' => \$o{partes}, 'particion=s' => \$o{particion}, 'ventana=f' => \$o{ventana},
           'tolerancia=f' => \$o{tolerancia}, 'iter-max=i' => \$o{iter_max}, 'procesos=i' => \$o{procesos},
           'salida=s' => \$o{salida}, 'calcula=s' => \$o{calcula}, 'bibliotecas=s' => \$o{bibliotecas},
           'charla' => \$o{charla}, 'help' => sub { print $uso; exit 0 })
    or die $uso;
die $uso unless @ARGV == 1;
$o{archivo} = $ARGV[0];
$o{siru} = File::Spec->catfile($FindBin::Bin, 'siru');
delete $o{$_} for grep { !defined $o{$_} } keys %o;

my $t = time;
my $r = Siru::Relajacion->new(%o);
printf STDERR "siru-relaja: %d partes, %d nodos de frontera\n", $r->partes, scalar($r->fronteras);
my $resumen = $r->corre;
my $its = 0;
$its += $_->{iteraciones} for @$resumen;
for my $v (@$resumen) {
    printf STDERR "  ventana %d [%g, %g]: %d iteraciones, cambio relativo %.3g\n",
        @{$v}{qw(ventana desde hasta iteraciones cambio)};
}
printf STDERR "siru-relaja: %d ventanas, %d iteraciones en total, %.1f s; salida en %s\n",
    scalar(@$resumen), $its, time - $t, $r->{csv};
