
 function [X]=rafa(A)
% Optimizador que resuelve problemas del tipo:
%	
%	Min (X-Xo)'H(X-Xo)    equivalente     Min d'X+X'HX
%	s.a.   Ax>=b			      s.a. AX=<b
%
%
%	AaX  = ba	% restricciones activas.
%	AoX  < bo	% otras restricciones.
%
 %  H=[1 -1; -1 2] ;A=[1 1; -1 2]; de=[-2;-6]; b=[2;2];
  % H=[2 -2; -2 4];A=[1 2;-1 0;0 -1];de=[-15;-30];b=[30;0;0]
H=[2 .5; .5 1]; A=[1 1; -1 0; 0 -1]; b=[4;0;0]; de=[-12;-10]
   [m,n]=size(A);
	Xo=-.5*inv(H)*de;
	X=Xo;
	lambda=0;	
	cuenta=1;
	ciclo=1;
 
	while ciclo==1,
	
	d=(A*X-b)./(diag(A*inv(H)*A').^0.5);
	maxim=max(d);
	minim=min(lambda);

	if maxim<=0 & minim>=0
		ciclo=0;
	else
	end

	if ciclo==1

		if minim<0

			Aa=Aa(find(lambda>minim),:);
			Ba=Ba(find(lambda>minim),1);
			lambda=inv(Aa*inv(H)*Aa')*(Aa*Xo-Ba);
			X=Xo-inv(H)*Aa'*lambda;
		
		else
			if cuenta==1

			Aa=A(find(d==maxim),:);
			Ba=b(find(d==maxim),1);
			lambda=inv(Aa*inv(H)*Aa')*(Aa*Xo-Ba);
			X=Xo-inv(H)*Aa'*lambda;

			else

				[ma,n]=size(Aa);
				if ma<n

				Aa=[Aa;A(find(d==maxim),:)];
				Ba=[Ba;b(find(d==maxim),1)];
				lambda=inv(Aa*inv(H)*Aa')*(Aa*Xo-Ba);
				X=Xo-inv(H)*Aa'*lambda;

				else

				Aa=[Aa(find(lambda>minim),:);A(find(d==maxim),:)];
				Ba=[Ba(find(lambda>minim),1);b(find(d==maxim),1)];
				lambda=inv(Aa*inv(H)*Aa')*(Aa*Xo-Ba);
				X=Xo-inv(H)*Aa'*lambda;
			
				end
			
			end

		end
								
	end
	cuenta=cuenta+1;
	end
	