function [fobj,sol,pi,cr,iter,B,N,Binv] = PL_pd_simplex_1(c,A,b,base,file)
% Resuelve un problema de Programación Lineal
%           T
%      Min c x subject to Ax = b, x >= 0
%   mediante los programas ProgLienal_3 o dual_simplex según la base de partida
%   sea factible o no. Se puede dar la base o no.
%   Rutina asociada a Sensitiviry_ProgLineal_3 a la que puede enviar datos.
%
 if nargin==5       % Lectura de los datos desde fichero 'file' en MPS
    if ~exist(file), error ('El archivo no existe'); end
    eval(['!copy ' file ' ' 'D:\matlab2013a\work\tmp\in.mps']);
    LIPSO = 'D:\matlab2013a\work'; 
    exit=mps2mat(LIPSO); fprintf('\n');
    load D:\matlab2013a\work\tmp\default; 
    [~,n]=size(A); c=c(:); A=full(A);
    A=[A(:,n0+1:n) A(:,1:n0)]; c=[c(n0+1:n);c(1:n0)];  % Mover slacks al final de A
 end
 save PL_dat A b c         % Guardar datos relevantes para Sensitivity
 eps1=eps^(2/3); [m,n]=size(A); c=c(:);
 if isempty(base)
    xB=A\b; base=find(abs(xB)>0); nx=length(base); 
    if nx<m, bp = setdiff(1:n,base); base=[base;bp(1:m-nx)']; end % Por si algún x=0
    xB=xB(base);
 else
  xB=A(:,base)\b;
 end
 B = base; N = setdiff(1:n,B);
 x=zeros(n,1); x(B)=xB;
 y = A(:,B)'\c(B); sN = c(N)-A(:,N)'*y; 
 if (any(x(B)<0))
    if any(sN<-eps1);
       A = [A eye(m)]; c = [c; max(max(abs(A)))*100*ones(m,1)]; B=n+1:n+m;
       fprintf('Primal-bigM\n');
       bm=find(b<0); 
       if ~isempty(bm)
          bl=length(bm); for i=1:bl, A(bm(i),n+bm(i))=-1; end, end
       [sol,fobj,pi,cr,iter,B,N,Binv] = ProgLineal_3(c,A,b,eps1,B);
       NN=N<=n; N=N(NN); cr=cr(NN);
       save PL_dat -append sol fobj pi cr iter B N Binv
       return
    end
    fprintf('Dual\n');
    [sol,fobj,pi,cr,iter,B,N,Binv] = dual_simplex(c',A,b,eps1,B);
    save PL_dat -append sol fobj pi cr iter B N Binv
 else fprintf('Primal\n');
    [sol,fobj,pi,cr,iter,B,N,Binv] = ProgLineal_3(c,A,b,eps1,B);
    save PL_dat -append sol fobj pi cr iter B N Binv
 end
end