program oddface_genyfx;

{xDEFINE SALTEAR_BAJAR_SALA}


{
================================================================================
================================ Oddface_genyfx ================================
================================================================================
Programa oddface generico de entrada CajasX.xlt, evaluador.exe y salida
costo o error.

1-  Cargar idEjecutor, idProblema, idNodo

2-  Problema := Tgenyfx_Problema.CreateFromDB
	2.1-  hacer consulta SQL
	2.2-  Tgenyfx_Problema.Create
		2.2.1-  inherited Create
		2.2.2-  Cargar carpetaSala, NombreSala, ArchiSala
		2.2.3-  sala := TSala.CreateFromArchi(ArchiSala);
			2.2.3.1-  Leer CajasX.xlt
			2.2.3.1-  Asignar las restricciones a cada parametro
                        2.2.3.1-  Asignar el archivo ejecutable
		2.2.4-  Definir los parametros Reales del problema. Se asume no
		        hay parametros enteros.
		2.2.5-  CalcularLargosADN.

3-  Problema.Explorar
	3.1-  Crear el explorador Genetico
	3.2-  Crear el explorador Mejorador

4-  Cargar Sala
	4.1-  Leer un individuo desde la DB
	4.2-  Decodificar el ADN
	4.3-  Cargar el individuo a la sala
		4.3.1-

5-  Evaluar
	5.1-  Cargar Sala
        5.2-  Escribir x.xlt en funcion del individuo
	5.3-  Correr el evaluador
		5.3.1-  Armo los parametros
		5.3.2-  Corro el programa evaluador con RunChildAndWait
	5.4-  Leo el resultado
	5.5-  Devuelvo el resultado
================================================================================
}


uses {$IFDEF UNIX} {$IFDEF UseCThreads}
  cthreads, {$ENDIF} {$ENDIF}
  ssl_openssl,
  Classes,
  uConstantesSimSEE,
  xmatdefs,
  uoddface,
  uoddface_genyfx,
  usimplex,
  urosx,
  u_updownload,
  uRobotHttpPost,
  httpsend,
  SysUtils,
  uoddface_roscon_cfg;

var
  idEjecutor: string;
  idProblema: integer;
  idNodo: integer;
  problema: Tgenyfx_Problema;
  res: integer;
  nidIndividuo: integer;
  archiSala: string;
  aIndividuo: TIndividuo;

begin
  SetLength(TrueBoolStrs, 1);
  SetLength(FalseBoolStrs, 1);
  TrueBoolStrs[0] := '1';
  FalseBoolStrs[0] := '0';

  if ParamCount < 2 then
  begin
    writeln('Debe pasar por lo menos dos parametros para identificacion del Ejecutor y el Problema'
      );
    exit;
  end;
  idEjecutor := ParamStr(1);

  idProblema := StrToInt(ParamStr(2));

  if ParamCount < 3 then
    idNodo := 0 // el cluster
  else
    idNodo := StrToInt(ParamStr(3));

  // si idNodo = -1 crea la sala cuyo NID es ParamStr(4) y NO Simula y se va sin eliminar los archivos.
  // sirve para bajar un caso de la base del servidor.

  writeln( 'buscando basura en: ', getDefault_tmp_base );

  EliminarCarpetasViejas( getDefault_tmp_base_OLD_, 12 );
  EliminarCarpetasViejas( getDefault_tmp_base, 12 );

  tmp_rundir := CrearDirectorioTemporal( getDefault_tmp_base, idEjecutor);

  {$IFDEF SALTEAR_BAJAR_SALA}
  flg_BAJAR_SALA := False;
  {$ENDIF}

  if (tmp_rundir <> '') and flg_BAJAR_SALA then
     limpiarCarpeta(tmp_rundir, '*.*');

  writeln('Cambiando el directorio a : ', tmp_rundir);
  chdir(tmp_rundir);

  try
    problema := Tgenyfx_Problema.CreateFromDB( dbcon_rosx, idProblema,
      StrToInt(idEjecutor), tmp_rundir);
    if problema = nil then
      raise Exception.Create('No fue posible crear el problema.');

      if idNodo >= 0 then
      begin
        try
          system.randomize;
          res := problema.Explorar;
        finally
          writeln('Cantidad de evaluaciones realizadas: ', res);
          EliminarCarpeta( tmp_rundir );
        end;
      end
      else
      begin
        nidIndividuo := StrToInt(ParamStr(4));
        archiSala := problema.BajarCrearSala(nidIndividuo, aIndividuo);
        writeln('Sala creada, NID: ', nidIndividuo, ', archivo: ', archiSala);

        if idNodo = -2 then
          problema.evaluar_( aIndividuo, 31 );

        aIndividuo.Free;
      end;
      problema.Free;

  except
     EliminarCarpeta( tmp_rundir );
  end;
end.
