// (c) December 2009 Frank Nielsen
//	Shows that alpha divergences are representational Bregman divergences
//  (up to numerical imprecisions)
//
// See paper
// The dual Voronoi diagrams with respect to representational Bregman divergences
// Frank Nielsen and Richard Nock
// International Symposium on Voronoi Diagrams, ISVD 2009 (IEEE)

class RepresentationalBregman
{
//final static double alpha=0.5;
final static double alpha=2.0;

public static double alphadivergence(double p, double q)
{double result;
result=(4.0/(1.0-alpha*alpha))*(((1.0-alpha)/2.0)*p+((1.0+alpha)/2.0)*q-Math.pow(p,(1.0-alpha)/2.0)*Math.pow(q,(1.0+alpha)/2.0));
return result;
}

public static double F(double x)
{
return (2.0/(1.0+alpha))*Math.pow(((1.0-alpha)/2.0)*x,2.0/(1.0-alpha));	
}

public static double gradF(double x)
{
return 	(2.0/(1.0+alpha))*Math.pow(((1.0-alpha)/2.0)*x, (1.0+alpha)/(1.0-alpha));
}	
	
public static double k(double x)
{
return 	(2.0/(1.0-alpha))*Math.pow(x,(1.0-alpha)/2.0);
}

public static double BF(double p, double q)
{
return F(p)-F(q)-(p-q)*gradF(q);
}


public static double BFRep(double p, double q)
{
return BF(k(p),k(q));	
}
	
	
public static void main(String[] args)
{
System.out.println("Shows that alpha divergences can be obtained from representational Bregman divergences");

double p,q,alphadiv, bregrep;


for(int i=0;i<10;i++)
{
p=Math.random();
q=Math.random();	

alphadiv=alphadivergence(p,q);
bregrep=BFRep(p,q);

System.out.println("alpha-div="+alphadiv+"\tequals Bregman rep. div="+bregrep);
}
}

	
}