unit uproblema_simplex_PLANTEO_1_678_0;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Math, xMatDefs, matreal,
  ubibfun_onl, udescripcionproblema_onl, usimplex;
  //uExcelFile;

var
   my_idvar, my_ivae, my_ires : NInt;
   x_opt, mi_func_opt : NReal;

procedure opt_nvers(var ivar, ivae, ires: NInt);
procedure opt_cargue(p: TProblema_onl);
procedure opt_fijarRestriccionesDeCaja(p: TProblema_onl);
procedure opt_LeerSolucion(p: TProblema_onl);

implementation

procedure opt_nvers(var ivar, ivae, ires: NInt);
begin
     //guardo donde comienzan mis variables
     my_idvar := ivar;
     my_ivae := ivae;
     my_ires := ires;

     ivar := ivar + 2;  //agrego dos varibables
     ires := ires + 2;  //agrego dos restricciones
end;
 (*
procedure TForm1.Button4Click(Sender: TObject);
var
	jcol: integer;
	buscando: boolean;
	r: string;
	cnt_Variables, cnt_Restricciones: integer;

	x_inf, x_sup: NReal;
	flg_x, flg_y: integer;

	k, j: integer;

	v: NReal;
begin

    xf: TExcelFile;

    buscando:= true;
	kfilx:= 1;
	jcol:= 1;
	h:= xf.Hoja(1);
	while buscando and (kfilx < 100) do
	begin
		r:=	h.cells[kfilx,1];
		if pos('x:', r ) = 1 then
			buscando:= false
		else
			inc( kfilx );
	end;

	if buscando then
		raise Exception.Create('No encontré la fila del asl x: ' );

	eFilaXs.Text:= IntToStr( kfilx );

	// contamos las variables
	buscando:= true;
	cnt_Variables:= 0;
	jcol:= 2;
	r:= h.cells[kfilx, jcol];
	while r <> '' do
	begin
		inc( cnt_Variables );
		inc( jcol );
		r:= h.cells[kfilx, jcol];
	end;

	// contamos las restricciones
	cnt_Restricciones:= 0;
	jcol:= 2;
	r:= h.cells[kfilx+4, jcol];
	while r <> '' do
	begin
		inc( cnt_Restricciones);
		inc( jcol );
		r:= h.cells[kfilx+4, jcol];
	end;


// creamos el simplex
 spx:= TSimplex.Create_init( cnt_Restricciones+1, cnt_Variables+1 );

 // ahora leemos las variables y sus cotas
 spx.cnt_varfijas:= 0;
 for j:= 1 to cnt_Variables do
 begin
	x_inf:=h.cells[kfilx+1, j + 1 ];
	x_sup:=h.cells[kfilx+2, j + 1 ];
	flg_x:=h.cells[kfilx+3, j + 1 ];
	spx.x_inf.pv[j]:= x_inf;
	spx.x_sup.pv[j]:= x_sup;
	spx.flg_x[j]:= flg_x;
	if abs( flg_x )= 2 then inc (spx.cnt_varfijas );
 end;

 // cargamos las flg_y
 spx.cnt_igualdades:= 0;
 for j:= 1 to cnt_Restricciones do
 begin
	flg_y:=h.cells[kfilx+4, j + 1 ];
	spx.flg_y[j]:= flg_y;
	if abs(flg_y) =2  then
		inc( spx.cnt_igualdades );
 end;

 // cargamos la magriz
 for k:= 1 to cnt_Restricciones+1 do
	for j:= 1 to cnt_Variables+1 do
	begin
		v:= h.cells[kfilx+8+k, j+1];
		spx.pon_e(k, j , v );
	end;



end;
    *)


procedure opt_cargue(p: Tproblema_onl);
var
   spx : TSimplex;
begin
  spx:=TSimplex.Create;
















  //Creamos un simplex vacío cuya matriz M tendrá:
  //2 restricciones + la función objetivo
  //2 variables + los términos independientes
  spx:= TSimplex.Create_init(3, 3, NIL, NIL);

  //Cargamos la fila 1, pon_e(k, j, x) hace Mkj:= x
  spx.pon_e(1, 1, 1);
  spx.pon_e(1, 2, 1);
  spx.pon_e(1, spx.nc, -4);

  //Cargamos la fila 2
  spx.pon_e(2, 1, 3);
  spx.pon_e(2, 2, 1);
  spx.pon_e(2, spx.nc, -6);

  //Cargamos la fila objetivo z
  spx.pon_e(spx.nf, 1, -2);
  spx.pon_e(spx.nf, 2, -1);

  //cota_inf_set(i, x) fija la cota inferior de la variable en la
  //posición i a x, sota_sup_set hace lo propio con la cota superior

  //Cota inferior de x1
  spx.cota_inf_set(1, 0);

  //Cotas inferior de x2
  spx.cota_inf_set(2, 0);

  p.spx:=spx;


end;

procedure opt_fijarRestriccionesDeCaja(p: TProblema_onl);
begin
    //sin terminar
end;

procedure opt_LeerSolucion(p: TProblema_onl);
begin
     x_opt := p.xval(my_idvar);
     mi_func_opt := p.fval();
end;


end.

