function p = condition(dens,ind,A)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% condition(P,i,A) -- find the conditional distr. P( x(~i) | x(i) = A(i))
%                     P is a KDE, i is a dimension index (e.g. [2,3]) and A
%                     is an [Ndim x 1] double
% 
% see also: kde
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Copyright (C) 2003 Alexander Ihler; distributable under GPL -- see README.txt

  if (size(dens.bandwidth,2)>2*dens.N),   % variable BW case is complicated:
    wNew = zeros(1,getNpts(dens));
    for i=1:getNpts(dens),
      ktmp = kde(getPoints(dens,i),getBW(dens,i),1,getType(dens));
      wNew(i) = evaluate(marginal(ktmp,ind),A(ind),0);
    end;
  else 
    bw = getBW(dens,1); 
    wNew = evaluate( kde(A(ind),bw(ind),1,getType(dens)) , marginal(dens,ind) , 0);
  end;
%  wNew = wNew ./ sum(wNew);
  wNew = wNew .* getWeights(dens);
  pts = getPoints(dens);
  if (size(dens.bandwidth,2)>2*dens.N), bw = getBW(dens,1:getNpts(dens));
  else bw = getBW(dens,1); end;
  newInd = setdiff([1:getDim(dens)],ind);
  p = kde(pts(newInd,:),bw(newInd,:),wNew,getType(dens));