function S = fun(X0,NLP,y0,n,nh,M,fx)
%Função auxiliar para a utilização do MINLP com restrições de igualdade
%
%  usage: [F] = FUN(X0,NLP,Y0,N,nh,M)
%
%  F  : valor da função objetivo
%  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
%  nh : número de restrições de igualdade
%  M  : penalidade das restrições

% adaptado de fun.m

if nargin < 7
   fx=[];
end

fx = sort(fx);

if n==length(X0) %não relaxado
   [F, G] = eval([NLP '(X0,y0)']);
   S = F + M*max([abs(G(1:nh)) G(nh+1:end) 0]);
   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); % x é sempre as n primeiras variáveis

[F, G] = eval([NLP '(x,y)']); %problema relaxado
S = F + M*max([abs(G(1:nh)) G(nh+1:end) 0]);

