function [t,c,s,A,b,r]=Simplexg
%
% [t,c,s,A,b,r] = Simplexg;
%
%           Construye los datos que estandarizan el problema general de optimización
%           de n variables y m restricciones:
%
%           Max (Min)     f = c*x
%
%           s. a.:        A*x <= (>=) (=) b
%                           x >= (<=)     0
%                           o variables libres
%
%           en donde t es una variable simple para indicar el tipo de problema a
%           tratar, siendo
%            1, para un problema de Máximos
%           -1, para un problema de Mínimos
%
%           c es un vector renglón de (n+k) componentes, siendo k el número de variables
%             libres,
%
%           A es una matriz (m+e) x (n+k), siendo e el número de restricciones exactas
%
%           b es un vector columna de (m+e) componentes.
%
%           s es el vector renglón de n componentes que contiene el tipo de
%             restricción a que están sujetas las variables, siendo
%             -1, para x <= 0
%              0, para x libre
%              1, para x >= 0
%
%           r es el vector columna de m componentes que contiene el tipo de
%             restricciones definidas por los renglones de [A b], siendo
%             -1, para <=
%              0, para ==
%              1, para >=
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
%    Ver funciones relacionadas:
%
%    Simplex, Simplexd, Simplexe
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%    Revisión 1.0
%    Sergio A. Pérez Ruiz
%    Instituto Tecnológico Autónomo de México
%    noviembre de 1996
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

% Captura de datos
inpd=menu('Ingreso de Datos ¿Por Pantalla o Archivo?','Pantalla','Archivo');
if inpd == 1
   clc;
   disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
   disp('%                                                                  %')
   disp('% Captura de datos para estandarizar el problema de optimización   %')
   disp('%                                                                  %')
   disp('%        Opt     f = c*x                                           %')
   disp('%                                                                  %')
   disp('%        s.a.:   A*x <r> b                                         %')
   disp('%                  x <s> 0                                         %')
   disp('%                                                                  %')
   disp('% en donde                                                         %')
   disp('%                                                                  %')
   disp('%        Opt = Max | Min                                           %')
   disp('%                                                                  %')
   disp('%        <r> un vector que contiene información acerca del tipo    %')
   disp('%            de restricciones que representan los renglones de     %')
   disp('%            la aumentada [A b] (-1 para <=, 0 para ==, 1 para >=) %')
   disp('%                                                                  %')
   disp('%        <s> un vector que contiene información acerca del tipo    %')
   disp('%            de variables que intervienen en el problema, siendo   %')
   disp('%            -1 para <=0, 0 para variable libre, 1 para >=0        %')
   disp('%                                                                  %')
   disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')

   t=menu('Dame el tipo de Problema','Max','Min');
   t=3-2*t;

   again=1;
   while again
      disp(' ')
      disp('Dame en dos renglones los coeficientes de la función')
      disp('y el tipo de restricciones sobre las variables simples')
      disp('(Matriz de dos renglones, comenzando con [ y terminando con ])')
      cs = input('cs = ');
      [mcs,ncs]=size(cs);
      again = mcs ~=2 | ncs == 1;
      if again
         disp(' ')
         disp('>>> DEBE SER MATRIZ DE DOS RENGLONES Y AL MENOS DOS COLUMNAS <<<')
      else
         for j=1:ncs
             again = again | (cs(2,j) ~= -1 & cs(2,j) ~= 0 & cs(2,j) ~= 1);
         end
         if again
            disp(' ')
            disp('>>> VALORES ERRONEOS EN EL SEGUNDO RENGLON, FAVOR DE CORREGIR <<<')
         end
      end
   end
   n=ncs;
   s=cs(2,:);

   nB=0; np1=n+1; np2=n+2;
   while nB ~= np2
      disp(' ')
      disp('Dame los coeficientes de las restricciones y su tipo')
      disp('(Matriz aumentada por renglones, comenzando con [ y terminando con ])')
      B = input('[A b r] = ');
      [mB,nB]=size(B);
      if nB ~= np2
         disp(' ')
         disp('>>> NUMERO DE COLUMNAS ERRONEO <<<')
      end
   end
   m=mB;
else
   clc; disp('Estos son los archivos de datos disponibles:')
   dir q*.m
   S=input('Nombre del archivo (''nombre'') = ');
   eval(S);
   cs=[c; s];
   B=[A b r];
   [m,n]=size(A);
   np1=n+1; np2=n+2;
end

b=B(:,np1);
j=1; l=1; k=0;
while j <= n
   if s(j) == 1   
      c(l)=cs(1,j);
      A(:,l)=B(:,j);
      l=l+1;
   else
      if s(j) == -1
         c(l)=-cs(1,j);
         A(:,l)=-B(:,j);     
         l=l+1;
      else
         if s(j) == 0
            c(l)=cs(1,j); c(l+1)=-cs(1,j);
            A(:,l)=B(:,j); A(:,l+1)=-B(:,j);
            l=l+2; k=k+1;
         end
      end
   end
   j=j+1;
end
r = B(:,np2);
BB = [A b];
clear B;

i=1; l=1; e=0;
while i <= m
   if r(i)*t == -1   
      B(l,:)=BB(i,:);
      l=l+1;
   else
      if r(i)*t == 1
         B(l,:)=-BB(i,:);     
         l=l+1;
      else
         if r(i)*t == 0
            B(l,:)=BB(i,:); B(l+1,:)=-BB(i,:);
            l=l+2; e=e+1;
         end
      end
   end
   i=i+1;
end
A=B(:,1:n+k);
b=B(:,n+k+1);
return