unit ucolectorsr3;


interface

uses
  Classes, SysUtils, FileUtil, SynEdit, Forms, Controls, Graphics, Dialogs,
  StdCtrls, uauxiliares, xmatdefs, matreal;


const
  CarpetaTrabajo = '/home/rchaer/rchaer/CONSULTORIA/WB_Paraguay2019/ModeloSimSEE';
  CarpetaCaso = 'FlujosRegionales_v9/265_sr3_pyagbruy_v9_DA_PHN_TES_P45_GN30_DE20/pyagbruy_v9_py_DA_PHN_TES_P45_GN30_DE20_resultados_';
type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    Script: TSynEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private

  public

  end;

{ TArchivoXLT }

TArchivoXLT = class( TMatR )
  id: string;
  archi: string;
  encabezado: TStringList;
  cols: TStringList;
  fechas: TVectR;
  constructor CreateFromXLT( id: string;  archi: string );
  destructor destroy; override;
  procedure ParseCols( r: string );
end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TArchivoXLT }

constructor TArchivoXLT.CreateFromXLT(id: string; archi: string);
var
  f: TextFile;
  renglones: TStringList;
  flgLeyendoEncabezado: boolean;
  flgFin: boolean;
  r: string;
  kPaso: integer;
  aVal: NReal;
  jCol, kPaso_: integer;

begin
  self.id:= id;
  self.archi:= archi;
  filemode:= 0;
  assignfile( f, self.archi );
  reset( f );
  encabezado:= TStringList.Create;
  renglones:= TStringList.Create;
  cols:= TStringList.Create;

  flgLeyendoEncabezado:= true;
  flgFin:= false;
  while (not Eof( f ) ) and ( not flgFin ) do
  begin
    readln( f, r );
    if r = '' then
    begin
      flgFin:= true;
      continue;
    end;

    if flgLeyendoEncabezado then
    begin
      encabezado.Add( r );
      if pos( 'paso', r ) = 1 then
      begin
        flgLeyendoEncabezado:= false;
        parseCols( r );
      end
    end
    else
      renglones.add( r );
  end;
  closefile( f );

  inherited Create_Init( renglones.count, cols.Count );
  fechas:= TVectR.Create_init( nf );
  for kPaso:= 1 to nf do
  begin
    r:= renglones[kPaso - 1 ];
    kPaso_:= NextInt( r, #9 );
    if kPaso <> kPaso_ then raise Exception.Create( 'Se esperaba paso: '+IntToStr( kPaso ) );
    aval:= NextFloat( r, #9 );
    fechas.pon_e( kPaso_, aval );
    for jCol:= 1 to nc do
    begin
      aval:= NextFloat( r, #9 );
      pon_e( kPaso, jCol, aVal );
    end;
  end;

  renglones.Free;
end;

destructor TArchivoXLT.destroy;
begin
  cols.Free;
  encabezado.Free;
  fechas.Free;
  inherited destroy;
end;

procedure TArchivoXLT.ParseCols(r: string);
var
  pal: string;
begin
  pal:= getNextPalSep( r, #9 );
  while r <> '' do
  begin
     cols.Add( pal );
     pal:= getNextPalSep( r, #9 );
  end;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  a: TArchivoXLT;

begin
  if OpenDialog1.Execute then
  begin
    a:= TArchivoXLT.CreateFromXLT( 'a', OpenDialog1.FileName );
    s:=  '$xlt_?? := sr3xlt_load("' + OpenDialog1.FileName +'");'#10;
    Script.InsertTextAtCaret( s );
//    SynEdit1.InsertBlock(SynEdit1.CaretXY, SynEdit1.CaretXY, 'test', true);
    a.Free;
  end;
end;


function Cargar( archi_nombre: string ): TArchivoXLT;
var
   archi: string;
   res: TArchivoXLT;
begin
  archi:= carpetaTrabajo+'/'+carpetaCaso+'/'+ archi_nombre;
  res:= TArchivoXLT.CreateFromXLT(archi_nombre,  archi );
  result:= res;
end;


function Concatenar( const mats: array of TMatR ): TMatR;
var
   hmat, kfil, jcol: integer;
   nfils, ncols: integer;
   res: TMatR;
   jcol_offset: integer;
   pfr, pfm: TVectR;
begin
  ncols:= 0;
  nfils:= MaxInt;
  for hmat:= 0 to high( mats ) do
  begin
    ncols:= ncols + mats[hmat].nc;
    if mats[hmat].nf < nfils then nfils := mats[hmat].nf;
  end;

   res:= TMatR.Create_Init( nfils, ncols );
   for kfil:= 1 to nfils do
   begin
     pfr:= res.Fila( kfil );
     jcol_offset:= 0;
     for hmat:= 0 to high( mats ) do
     begin
       pfm:= mats[hmat].Fila( kfil );
       for jcol:= 1 to pfm.n do
         pfr.pon_e( jcol_offset + jcol, pfm.e( jcol ) );
       inc( jcol_offset, pfm.n );
     end;
   end;
   result:= res;
end;

function copy_fila( m: TMatR; k: integer ): TVectR;
var
   res: TVectR;
begin
  res:= TVectR.Create_init( m.nc );
  res.Copy( m.fila( k ) );
  result:= res;
end;



function sumar( vects: array of TVectR ): TVectR;
var
  res, v: TVectR;
  k: integer;
  j: integer;

begin
  res:= TVectR.Create_init( vects[0].n );
  res.Ceros;
  for k:= 0 to high( vects ) do
  begin
    v:= vects[k];
    for j:= 1 to res.n do
      res.acum_e(j, v.e(j) );
  end;
  result:= res;
end;

// ordena todas por el orden de kPor
procedure MultiSort( vects: array of TVectR; kPor: integer; flgCreciente: boolean );
var
  idx: TDAofNInt;
  pv: TVectR;
  k: integer;
begin
  pv:= vects[ kPor ];
  setlength( idx, pv.n +1 );
  for k:= 0 to high( idx ) do
    idx[k]:= k;

  pv.Sort_idx( flgCreciente, idx );

  for k:= 0 to kpor-1 do
    vects[k].SortByIdx( idx );
  for k:= kpor+1 to high( vects ) do
    vects[k].SortByIdx( idx );

end;

procedure write_vect( var f: textfile; nombreSerie: string; v: TVectR );
var
  k: integer;
begin
  write( f, nombreSerie );
  for k:= 1 to v.n do
    write(  f, #9, v.e(k) );
end;

procedure write_encabs( var f: textfile; encabs: array of string );
var
  k: integer;
begin
  if length( encabs ) > 0 then
  begin
    write( f, encabs[0] );
    for k:= 1 to high( encabs ) do
      write( f, #9, encabs[k] );
  end;
  writeln( f );
end;


procedure write_fila( var f: textfile; kFila: integer; vects: array of TVectR );
var
  k: integer;
begin
  if length( vects ) > 0 then
  begin
    write( f, vects[0].e( kfila) );
    for k:= 1 to high( vects ) do
      write( f, #9, vects[k].e( kFila) );
  end;
  writeln( f );
end;


procedure TForm1.Button2Click(Sender: TObject);
var
  hoja_M_eDemCentro_anual_1: TArchivoXLT;
hoja_M_eDemCentro_anual_2: TArchivoXLT;
hoja_M_eDemCentro_anual_3: TArchivoXLT;
hoja_M_eDemCentro_anual_4: TArchivoXLT;
eDemCentro: TMatR;
hoja_M_eDemEste_anual_1: TArchivoXLT;
hoja_M_eDemEste_anual_2: TArchivoXLT;
hoja_M_eDemEste_anual_3: TArchivoXLT;
hoja_M_eDemEste_anual_4: TArchivoXLT;
eDemEste: TMatR;
hoja_M_eDemSur_anual_1: TArchivoXLT;
hoja_M_eDemSur_anual_2: TArchivoXLT;
hoja_M_eDemSur_anual_3: TArchivoXLT;
hoja_M_eDemSur_anual_4: TArchivoXLT;
eDemSur: TMatR;
hoja_M_eAcaray_anual_1: TArchivoXLT;
hoja_M_eAcaray_anual_2: TArchivoXLT;
hoja_M_eAcaray_anual_3: TArchivoXLT;
hoja_M_eAcaray_anual_4: TArchivoXLT;
eAcaray: TMatR;
hoja_M_eCorpus_anual_1: TArchivoXLT;
hoja_M_eCorpus_anual_2: TArchivoXLT;
hoja_M_eCorpus_anual_3: TArchivoXLT;
hoja_M_eCorpus_anual_4: TArchivoXLT;
eCorpus: TMatR;
hoja_M_eItacor_Itat_anual_1: TArchivoXLT;
hoja_M_eItacor_Itat_anual_2: TArchivoXLT;
hoja_M_eItacor_Itat_anual_3: TArchivoXLT;
hoja_M_eItacor_Itat_anual_4: TArchivoXLT;
eItacor: TMatR;
hoja_M_eItaip_anual_1: TArchivoXLT;
hoja_M_eItaip_anual_2: TArchivoXLT;
hoja_M_eItaip_anual_3: TArchivoXLT;
hoja_M_eItaip_anual_4: TArchivoXLT;
eItaip: TMatR;
hoja_M_eTG_anual_1: TArchivoXLT;
hoja_M_eTG_anual_2: TArchivoXLT;
hoja_M_eTG_anual_3: TArchivoXLT;
hoja_M_eTG_anual_4: TArchivoXLT;
eTG: TMatR;
hoja_M_eYaciret_anual_1: TArchivoXLT;
hoja_M_eYaciret_anual_2: TArchivoXLT;
hoja_M_eYaciret_anual_3: TArchivoXLT;
hoja_M_eYaciret_anual_4: TArchivoXLT;
eYaciret: TMatR;
hoja_M_eYguaz_anual_1: TArchivoXLT;
hoja_M_eYguaz_anual_2: TArchivoXLT;
hoja_M_eYguaz_anual_3: TArchivoXLT;
hoja_M_eYguaz_anual_4: TArchivoXLT;
eYguaz: TMatR;
hoja_M_eEOL_anual_1: TArchivoXLT;
hoja_M_eEOL_anual_2: TArchivoXLT;
hoja_M_eEOL_anual_3: TArchivoXLT;
hoja_M_eEOL_anual_4: TArchivoXLT;
eEOL: TMatR;
hoja_M_eSOL_anual_1: TArchivoXLT;
hoja_M_eSOL_anual_2: TArchivoXLT;
hoja_M_eSOL_anual_3: TArchivoXLT;
hoja_M_eSOL_anual_4: TArchivoXLT;
eSOL: TMatR;

eYguaz_2021: TVectR;
eYaciret_2021: TVectR;
eTG_2021: TVectR;
eSOL_2021: TVectR;
eItaip_2021: TVectR;
eItacor_2021: TVectR;
eEOL_2021: TVectR;
eDemSur_2021: TVectR;
eDemEste_2021: TVectR;
eDemCentro_2021: TVectR;
eCorpus_2021: TVectR;
eAcaray_2021: TVectR;

eYguaz_2035: TVectR;
eYaciret_2035: TVectR;
eTG_2035: TVectR;
eSOL_2035: TVectR;
eItaip_2035: TVectR;
eItacor_2035: TVectR;
eEOL_2035: TVectR;
eDemSur_2035: TVectR;
eDemEste_2035: TVectR;
eDemCentro_2035: TVectR;
eCorpus_2035: TVectR;
eAcaray_2035: TVectR;

eHid_2021: TVectR;
eDem_2021: TVectR;

eHid_2035: TVectR;
eDem_2035: TVectR;

PE: TVectR;

k: integer;
f: textfile;

begin
hoja_M_eYguaz_anual_4:= cargar('hoja_M_eYguaz_anual_4.xlt');
hoja_M_eYguaz_anual_3:= cargar('hoja_M_eYguaz_anual_3.xlt');
hoja_M_eYguaz_anual_2:= cargar('hoja_M_eYguaz_anual_2.xlt');
hoja_M_eYguaz_anual_1:= cargar('hoja_M_eYguaz_anual_1.xlt');
hoja_M_eYaciret_anual_4:= cargar('hoja_M_eYaciret_anual_4.xlt');
hoja_M_eYaciret_anual_3:= cargar('hoja_M_eYaciret_anual_3.xlt');
hoja_M_eYaciret_anual_2:= cargar('hoja_M_eYaciret_anual_2.xlt');
hoja_M_eYaciret_anual_1:= cargar('hoja_M_eYaciret_anual_1.xlt');
hoja_M_eTG_anual_4:= cargar('hoja_M_eTG_anual_4.xlt');
hoja_M_eTG_anual_3:= cargar('hoja_M_eTG_anual_3.xlt');
hoja_M_eTG_anual_2:= cargar('hoja_M_eTG_anual_2.xlt');
hoja_M_eTG_anual_1:= cargar('hoja_M_eTG_anual_1.xlt');
hoja_M_eSOL_anual_4:= cargar('hoja_M_eSOL_anual_4.xlt');
hoja_M_eSOL_anual_3:= cargar('hoja_M_eSOL_anual_3.xlt');
hoja_M_eSOL_anual_2:= cargar('hoja_M_eSOL_anual_2.xlt');
hoja_M_eSOL_anual_1:= cargar('hoja_M_eSOL_anual_1.xlt');
hoja_M_eItaip_anual_4:= cargar('hoja_M_eItaip_anual_4.xlt');
hoja_M_eItaip_anual_3:= cargar('hoja_M_eItaip_anual_3.xlt');
hoja_M_eItaip_anual_2:= cargar('hoja_M_eItaip_anual_2.xlt');
hoja_M_eItaip_anual_1:= cargar('hoja_M_eItaip_anual_1.xlt');
hoja_M_eItacor_Itat_anual_4:= cargar('hoja_M_eItacor_Itat_anual_4.xlt');
hoja_M_eItacor_Itat_anual_3:= cargar('hoja_M_eItacor_Itat_anual_3.xlt');
hoja_M_eItacor_Itat_anual_2:= cargar('hoja_M_eItacor_Itat_anual_2.xlt');
hoja_M_eItacor_Itat_anual_1:= cargar('hoja_M_eItacor_Itat_anual_1.xlt');
hoja_M_eEOL_anual_4:= cargar('hoja_M_eEOL_anual_4.xlt');
hoja_M_eEOL_anual_3:= cargar('hoja_M_eEOL_anual_3.xlt');
hoja_M_eEOL_anual_2:= cargar('hoja_M_eEOL_anual_2.xlt');
hoja_M_eEOL_anual_1:= cargar('hoja_M_eEOL_anual_1.xlt');
hoja_M_eDemSur_anual_4:= cargar('hoja_M_eDemSur_anual_4.xlt');
hoja_M_eDemSur_anual_3:= cargar('hoja_M_eDemSur_anual_3.xlt');
hoja_M_eDemSur_anual_2:= cargar('hoja_M_eDemSur_anual_2.xlt');
hoja_M_eDemSur_anual_1:= cargar('hoja_M_eDemSur_anual_1.xlt');
hoja_M_eDemEste_anual_4:= cargar('hoja_M_eDemEste_anual_4.xlt');
hoja_M_eDemEste_anual_3:= cargar('hoja_M_eDemEste_anual_3.xlt');
hoja_M_eDemEste_anual_2:= cargar('hoja_M_eDemEste_anual_2.xlt');
hoja_M_eDemEste_anual_1:= cargar('hoja_M_eDemEste_anual_1.xlt');
hoja_M_eDemCentro_anual_4:= cargar('hoja_M_eDemCentro_anual_4.xlt');
hoja_M_eDemCentro_anual_3:= cargar('hoja_M_eDemCentro_anual_3.xlt');
hoja_M_eDemCentro_anual_2:= cargar('hoja_M_eDemCentro_anual_2.xlt');
hoja_M_eDemCentro_anual_1:= cargar('hoja_M_eDemCentro_anual_1.xlt');
hoja_M_eCorpus_anual_4:= cargar('hoja_M_eCorpus_anual_4.xlt');
hoja_M_eCorpus_anual_3:= cargar('hoja_M_eCorpus_anual_3.xlt');
hoja_M_eCorpus_anual_2:= cargar('hoja_M_eCorpus_anual_2.xlt');
hoja_M_eCorpus_anual_1:= cargar('hoja_M_eCorpus_anual_1.xlt');
hoja_M_eAcaray_anual_4:= cargar('hoja_M_eAcaray_anual_4.xlt');
hoja_M_eAcaray_anual_3:= cargar('hoja_M_eAcaray_anual_3.xlt');
hoja_M_eAcaray_anual_2:= cargar('hoja_M_eAcaray_anual_2.xlt');
hoja_M_eAcaray_anual_1:= cargar('hoja_M_eAcaray_anual_1.xlt');

eYguaz:= Concatenar( [ hoja_M_eYguaz_anual_1, hoja_M_eYguaz_anual_2, hoja_M_eYguaz_anual_3, hoja_M_eYguaz_anual_4 ]);
eYaciret:= Concatenar( [ hoja_M_eYaciret_anual_1, hoja_M_eYaciret_anual_2, hoja_M_eYaciret_anual_3, hoja_M_eYaciret_anual_4 ]);
eTG:= Concatenar( [ hoja_M_eTG_anual_1, hoja_M_eTG_anual_2, hoja_M_eTG_anual_3, hoja_M_eTG_anual_4 ]);
eSOL:= Concatenar( [ hoja_M_eSOL_anual_1, hoja_M_eSOL_anual_2, hoja_M_eSOL_anual_3, hoja_M_eSOL_anual_4 ]);
eItaip:= Concatenar( [ hoja_M_eItaip_anual_1, hoja_M_eItaip_anual_2, hoja_M_eItaip_anual_3, hoja_M_eItaip_anual_4 ]);
eItacor:= Concatenar( [ hoja_M_eItacor_Itat_anual_1, hoja_M_eItacor_Itat_anual_2, hoja_M_eItacor_Itat_anual_3, hoja_M_eItacor_Itat_anual_4 ]);
eEOL:= Concatenar( [ hoja_M_eEOL_anual_1, hoja_M_eEOL_anual_2, hoja_M_eEOL_anual_3, hoja_M_eEOL_anual_4 ]);
eDemSur:= Concatenar( [ hoja_M_eDemSur_anual_1, hoja_M_eDemSur_anual_2, hoja_M_eDemSur_anual_3, hoja_M_eDemSur_anual_4 ]);
eDemEste:= Concatenar( [ hoja_M_eDemEste_anual_1, hoja_M_eDemEste_anual_2, hoja_M_eDemEste_anual_3, hoja_M_eDemEste_anual_4 ]);
eDemCentro:= Concatenar( [ hoja_M_eDemCentro_anual_1, hoja_M_eDemCentro_anual_2, hoja_M_eDemCentro_anual_3, hoja_M_eDemCentro_anual_4 ]);
eCorpus:= Concatenar( [ hoja_M_eCorpus_anual_1, hoja_M_eCorpus_anual_2, hoja_M_eCorpus_anual_3, hoja_M_eCorpus_anual_4 ]);
eAcaray:= Concatenar( [ hoja_M_eAcaray_anual_1, hoja_M_eAcaray_anual_2, hoja_M_eAcaray_anual_3, hoja_M_eAcaray_anual_4 ]);

eYguaz_2021:= copy_fila(eYguaz, 3 );
eYaciret_2021:= copy_fila(eYaciret, 3 );
eTG_2021:= copy_fila(eTG, 3 );
eSOL_2021:= copy_fila(eSOL, 3 );
eItaip_2021:= copy_fila(eItaip, 3 );
eItacor_2021:= copy_fila(eItacor, 3 );
eEOL_2021:= copy_fila(eEOL, 3 );
eDemSur_2021:= copy_fila(eDemSur, 3 );
eDemEste_2021:= copy_fila(eDemEste, 3 );
eDemCentro_2021:= copy_fila(eDemCentro, 3 );
eCorpus_2021:= copy_fila(eCorpus, 3 );
eAcaray_2021:= copy_fila(eAcaray, 3 );

eYguaz_2035 := copy_fila(eYguaz, 17 );
eYaciret_2035 := copy_fila(eYaciret, 17 );
eTG_2035 := copy_fila(eTG, 17 );
eSOL_2035 := copy_fila(eSOL, 17 );
eItaip_2035 := copy_fila(eItaip, 17 );
eItacor_2035 := copy_fila(eItacor, 17 );
eEOL_2035 := copy_fila(eEOL, 17 );
eDemSur_2035 := copy_fila(eDemSur, 17 );
eDemEste_2035 := copy_fila(eDemEste, 17 );
eDemCentro_2035 := copy_fila(eDemCentro, 17 );
eCorpus_2035 := copy_fila(eCorpus, 17 );
eAcaray_2035 := copy_fila(eAcaray, 17 );

eHid_2021:= sumar( [ eAcaray_2021, eYguaz_2021, eItaip_2021, eYaciret_2021, eItacor_2021, eCorpus_2021] );
eDem_2021:= sumar( [ eDemSur_2021, eDemEste_2021, eDemCentro_2021 ]);

eHid_2035:= sumar( [ eAcaray_2035, eYguaz_2035, eItaip_2035, eYaciret_2035, eItacor_2035, eCorpus_2035] );
eDem_2035:= sumar( [ eDemSur_2035, eDemEste_2035, eDemCentro_2035 ] );

multisort( [eHid_2021, eSol_2021, eEOL_2021, eTG_2021, eDem_2021 ], 0, true );
multisort( [eHid_2035, eSol_2035, eEOL_2035, eTG_2035, eDem_2035 ], 0, true );

assignfile( f, CarpetaTrabajo+'/variabilidad_gen_anual.xlt' );
rewrite( f );

PE:= TVectR.Create_init( eHid_2021.n );

for k:= 1 to PE.n do
  PE.pon_e(k, k/ eHid_2021.n );

writeln(f, '2021' );
write_encabs( f, ['PE','eHid_2021', 'eSol_2021', 'eEOL_2021', 'eTG_2021', 'eDem_2021'] );
for k:= 1 to PE.n do
  write_fila( f, k, [ PE, eHid_2021, eSol_2021, eEOL_2021, eTG_2021, eDem_2021 ]);
writeln( f );

writeln(f, '2035' );
write_encabs( f, ['PE','eHid_2035', 'eSol_2035', 'eEOL_2035', 'eTG_2035', 'eDem_2035'] );
for k:= 1 to PE.n do
  write_fila( f, k, [ PE, eHid_2035, eSol_2035, eEOL_2035, eTG_2035, eDem_2035 ]);
writeln( f );

closefile( f );
end;

end.

