function [x,h,f]=Simplex(op)
%
% [x,h,f] = Simplex(op)
%
%     Función interactiva que captura datos, estandariza y aplica el método Simplex
%     para resolver problemas lineales no estandarizados del tipo:
%
%     Opt     f = c*x
%     s.a.
%             A*x <r> b
%               x <s> 0
%
%     en donde
%
%         Opt puede ser Max o Min
%         <r> son los operadores relacionales de las restricciones,
%             pudiendo ser <=, =, >=, o cualquier combinación de ellas
%         <s> son los operadores relacionales que definen el rango de acción
%             de las variables, pudiendo ser <=0, variable libre, >=0,
%             o cualquier combinación de ellas
%
%    Los datos que captura Simplex son los siguientes:
%
%         t   tipo de problema: 1 para "Max", -1 para "Min"
%         c   vector renglón de n componentes con los coeficientes de la función
%         s   vector renglón de n componentes con los valores de <s>:
%             -1 para "<=0", 0 para "variable libre", 1 para ">=0"
%         A   matriz de m renglones y n columnas con los coeficientes de las
%             restricciones, que se encuentran a la izquierda de <r>
%         b   vector columna de m componentes con los valores límite de las
%             restricciones, que se encuentran a la derecha de <r>
%         r   vector columna de m componentes con los valores de <r>:
%             -1 para "<=", 0 para "=", 1 para ">="
%
%             Los valores de m y n se autodefinen a partir de los datos anteriores.
%
%    La forma de captura puede ser interactiva o a través de un script de MATLAB
%    en el que se especifiquen únicamente comandos de asignación de MATLAB, como
%    t=1; c=[2 -1]; s=[-1 1]; etc., los cuales deben incluir todos los datos que
%    se especificaron en el párrafo anterior.
%    
%    Posteriormente, "Simplex" estandariza el problema a uno de Máximos o de Mínimos,
%    agregando las variables y/o las restricciones necesarias, para finalmente
%    resolverlo, o resolver el dual, según sea el caso, utilizando la función
%    "Simplexe" que se aplica únicamente para un problema estándar de Maximización y
%    su dual.
%
% Parámetros de salida:
%
%    x   Vector columna de n componentes con la solución al problema calculada
%    h   Vector renglón de m componentes con las holguras asociadas a la solución
%    f   Valor óptimo de la función
%
% Parámetros de entrada:
%
%    op  Opción que evita o permite ver la evolución de las tablas durante la
%        aplicación del método Símplex al problema estandarizado:
%        = 0, (Valor por omisión) No se muestra la evolución
%        = 1, Se muestran las tablas en sus distintas etapas.
%
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
%    Ver funciones relacionadas:
%
%    Simplexd, Simplexe, Simplexg
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%    Revisión 1.0
%    Sergio A. Pérez Ruiz
%    Instituto Tecnológico Autónomo de México
%    noviembre de 1996
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

% Prepara valores por omisión
if nargin < 1, op=0; end
%
% Valida parámetros de entrada
if op ~=0 & op ~= 1
   disp('>>> OPCION INVALIDA, DEBE SER 0 O 1')
   return
end

%
% Captura los datos del problema no estándar y los estandariza
[t,c,s,A,b,r]=Simplexg;
%
% Resuelve el problema estandarizado
[xx,hh,f]=Simplexe(c,A,b,1-(1+t)/2+2*op);

%
% Reporta casos en los que no fue posible calcular la solución
if f == 'NF'
   f='>>> Problema No Factible';
   return
end
if f == 'NA'
   f='>>> Problema No Acotado';
   return
end

%
% Recupera variables originales, que fueron modificadas según su
% rango de acción
n=size(s,2);
j=1; l=1;
while j <= n
   if s(j) == 1   
      x(j)=xx(l);
      l=l+1;
   else
      if s(j) == -1
         x(j)=-xx(l);
         l=l+1;
      else
         if s(j) == 0
            x(j)=xx(l)-xx(l+1);
            l=l+2;
         end
      end
   end
   j=j+1;
end

%
% Recupera holguras asociadas a las restricciones originales,
% que fueron modificadas para estandarizarlas
m=size(r,1);
i=1; l=1;
while i <= m
   if r(i) == 1 | r(i) == -1 
      h(i)=hh(l);
      l=l+1;
   else
      if r(i) == 0
         h(i)=hh(l)+hh(l+1);
         l=l+2;
      end
   end
   i=i+1;
end