function [H,d,A,b]=rafa(X)
% 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];
%
d=[-2; -6];
 b=[2;2];

        [m,n]=size(A);
	Xo=-.5*inv(H)*d
	X=Xo;
	lambda=0;	
	cuenta=1;
	ciclo=1;
 
	while ciclo==1 
	
	d=(A*X-b)/(diag(A*inv(H)*A').^0.5); %Calcula distancias.
	maxim=max(d);
	minim=min(lambda);

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

	if ciclo==1

		if minim<0

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

			Aa=A(find(d==maxim),:)
			Ba=B(find(d==maxim),1)

			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
	