function [err,r,inx] andrerr( model, distrib )
% ANDRERR Classification error of the Generalized Anderson's task.
%
Synopsis:
%  [err,r,inx] = andrerr( model, distrib )
%
Description:
%  This function computes the classification error of
%  the given linear classifier and underlying set of Gaussian 
%  distributions as defined in the Generalized Anderson's 
%  task [SH10].
%
Input:
%  model [struct] Linear classifier:
%   .W [dim x 1] Normal vector the separating hyperplane.
%   .b [real] Bias the hyperplane.
%  
%  distrib [struct] Set of Gaussians with assigned binary labels:
%   .Mean [dim x ncomp] Mean vectors.
%   .Cov [dim x dim x ncomp] Covariance matrices.
%   .y [1 x ncomp] Lables of Gaussians (1 or 2).
%  
Output:
%  err [real] Probability of misclassification.
%  r [real] Mahalanobis distance of the cloasest Gaussian.
%  inx [int] Index of the cloasest Gaussian.
%
Example:
%  distrib = load('mars');
%  model = eanders(distrib,{'err',0.06'});
%  figure; pandr( model, distrib );
%  error = andrerr( model, distrib )
%
% See also 
%  ANDRORIG, GANDERS, EANDERS, GGRADANDR.
%

About: Statistical Pattern Recognition Toolbox
% (C) 1999-2003, Written by Vojtech Franc and Vaclav Hlavac
% <a href="http://www.cvut.cz">Czech Technical University Prague</a>
% <a href="http://www.feld.cvut.cz">Faculty of Electrical Engineering</a>
% <a href="http://cmp.felk.cvut.cz">Center for Machine Perception</a>

Modifications:
% 4-may-2004, VF
% 17-sep-2003, VF


if ~isfield(distrib,'y'), distrib.y = [1,2]; end
[dim,ncomp] = size(distrib.Mean);

Radius = zeros(ncomp,1);

for i=1:ncomp,
  
  if distrib.y(i) == 1,
    Radius(i) = (model.W'*distrib.Mean(:,i)+model.b)/...
        sqrt(model.W'*distrib.Cov(:,:,i)*model.W);
  else
    Radius(i) = -(model.W'*distrib.Mean(:,i)+model.b)/...
        sqrt(model.W'*distrib.Cov(:,:,i)*model.W);
  end
    
end

[r,inx] = min( Radius );
err=1-cdf('norm',r,0,1);

return;