function [D] = DsymBregman_kNN_k_estimation(Y1,Y2,co)
%Estimates the symmetric Bregman distance (D) of Y1 and Y2 using the kNN method (S={k}).
%
%We use the naming convention 'D_estimation' to ease embedding new divergence estimation methods.
%
%INPUT:
% Y1: Y1(:,t) is the t^th sample from the first distribution.
% Y2: Y2(:,t) is the t^th sample from the second distribution. Note: the number of samples in Y1 [=size(Y1,2)] and Y2 [=size(Y2,2)] can be different.
% co: divergence estimator object.
%
%REFERENCE:
% Nikolai Leonenko, Luc Pronzato, and Vippal Savani. A class of Renyi information estimators for multidimensional densities. Annals of Statistics, 36(5):2153-2182, 2008.
% Imre Csiszar. Generalized projections for non-negative functions. Acta Mathematica Hungarica, 68:161-185, 1995.
% Lev M. Bregman. The relaxation method of finding the common points of convex sets and its application to the solution of problems in convex programming. USSR Computational Mathematics and Mathematical Physics, 7:200-217, 1967.
%
%Copyright (C) 2012 Zoltan Szabo ("http://nipg.inf.elte.hu/szzoli", "szzoli (at) cs (dot) elte (dot) hu")
%
%This file is part of the ITE (Information Theoretical Estimators) Matlab/Octave toolbox.
%
%ITE is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
%the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
%
%This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
%
%You should have received a copy of the GNU General Public License along with ITE. If not, see .
%co.mult:OK.
[dY1,num_of_samplesY1] = size(Y1);
[dY2,num_of_samplesY2] = size(Y2);
%verification:
if dY1~=dY2
error('The dimension of the samples in Y1 and Y2 must be equal.');
end
I_alpha_Y1 = estimate_Ialpha(Y1,co);
I_alpha_Y2 = estimate_Ialpha(Y2,co);
D_temp3_Y1Y2 = estimate_Dtemp3(Y1,Y2,co);
D_temp3_Y2Y1 = estimate_Dtemp3(Y2,Y1,co);
D = (I_alpha_Y1 + I_alpha_Y2 - D_temp3_Y1Y2 - D_temp3_Y2Y1) / (co.alpha-1);