function p = evaluate(dens,pos,varargin)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% EVALUATE Evaluate the likelihood of a density estimate at given locations
%
% EVALUATE(X,Y [,...]) returns a vector of the likelihood of the points Y under
% the density estimate X, to a percent error tolerance Tol
% Y may be [Ndim x Npoints] doubles or another KDE
% Optional arguments:
% 'lvout' -- leave-one-out, used: evaluate(X,X,'lvout')
% Tol -- evaluate up to percent error tolerance Tol (default 1e-3)
% Specify zero for an exact calculation.
%
%
% See: Gray & Moore, "Very Fast Multivariate Kernel Density Estimation using
% via Computational Geometry", in Proceedings, Joint Stat. Meeting 2003
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright (C) 2003 Alexander Ihler; distributable under GPL -- see README.txt
lvFlag = 0; errTol = 1e-3;
for i=1:nargin-2,
if (strcmp(varargin{i},'lvout')) lvFlag=1; end;
if (isa(varargin{i},'double')) errTol = varargin{i}; end;
end;
if (isa(pos,'kde')) posKDE = pos; dim = getDim(pos);
else posKDE = BallTree(pos,ones(1,size(pos,2))/size(pos,2)); dim = size(pos,1);
end;
if (getDim(dens)~= dim) error('X and Y must have the same dimension'); end;
if (lvFlag) p = DualTree(dens,errTol);
else p = DualTree(dens,posKDE,errTol);
end;