function [GF , GG] = grad(X0,NLP,GRAD,y0,n,fx)
%Função auxiliar para a utilização do MINLP com restrições de igualdade
%
%  usage: [GF,GG] = NONLCON(X0,NLP,Y0,N)
%
%  G  : vetor com o valor atual das restrições de desigualdade (G <=0)
%  H  : vetor com o valor atual das restrições de igualdade (H = 0)
%  X0 : vetor das variáveis (length(X0)==N para problema não relaxado e
%       length(X0)==N+M para o problema relaxado.
%  NLP: arquivo como descrito em MINLP
%  Y0 : vetor das variáveis binárias
%  N  : número de variáveis contínuas no problema

% autor:   Rafael de Pelegini Soares
%          Departamento de Engenharia Química
%          Universidade Federal do Rio Grande do Sul, Brasil
%          rafael@enq.ufrgs.br
%
%			  30/set/2001

if nargin < 6
   fx=[];
end

fx = sort(fx);

if n==length(X0) %não relaxado
   [GF , GG] = eval([GRAD '(X0,y0)']);
   GF = [GF];
   GG = [GG];
   return;
else %problema relaxado em algumas ou todas as variáveis binárias
   index = 1:length(y0);
   index(fx-n) = []; %removendo os fixos
   y = y0;
   y(index) = X0(n+1:end);
end

x = X0(1:n);
[GF , GG, C, B] = eval([GRAD '(x,y)']); %problema relaxado

if(n>0) % C e B são Fy e Gy, se alguma variável estiver fixada deve ser removida
   C = C(index);
   B = B(:,index);
end

GF = [GF ,C];
GG = [GG ;B'];