/* Marc Arnaudon and Frank Nielsen November 2010, revised December 2011. On the Riemannian 1-Center Computational Geometry: Theory and Its Applications http://www.journals.elsevier.com/computational-geometry/ */ /* Get Java SDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html Get the friendly JCreator editor JCreator LE V3.5 This program implements the Riemannian L-inf center. Download the JAMA package from http://math.nist.gov/javanumerics/jama/ and install the jar file into the local directory */ import Jama.*; public class MiniMaxSPD { public static double sqr(double x){return x*x;} public static Matrix randomSPDCholesky(int d) { int i,j; double [][] array=new double[d][d]; Matrix L; for(i=0;i1.0e-5) { maxm=0.5*(minl+maxl); M=RiemannianGeodesic(P,Q,maxm); distc=RiemannianDistance(P,M); if (distc>dist*cut) maxl=maxm; else minl=maxm; } //System.out.println("wanted:"+cut+" obtained for lambda="+maxm); return M; } // Maximum distance from the current centerpoint C public static double MaxCenter(Matrix[] set, Matrix C) { double result=0.0; for(int i=0;iresult) result=RiemannianDistance(set[i],C); } return result; } // Return the index of the farthest point public static int argMaxCenter(Matrix[] set, Matrix C) { int winner=-1; double result=0.0; for(int i=0;iresult) {result=RiemannianDistance(set[i],C); winner=i;} } return winner; } // Performs the generalization of Badoiu-Clarkson algorithm: // see paper: Smaller core-sets for balls. SODA 2003: 801-802 public static Matrix MinMax(Matrix[] set, int nbIter) { int i,j,f; double ratio; Matrix C=new Matrix(set[0].getArrayCopy()); for(i=1;i<=nbIter;i++) { f=argMaxCenter(set,C); ratio=1.0/(i+1); C=CutGeodesic(C,set[f],ratio); //System.out.println(i+"\t"+MaxCenter(set,C)); } return C; } static Matrix COpt; static double ropt; // Print on the console the statistics public static Matrix MinMaxVerbose(Matrix[] set, int nbIter) { int i=0,j,f; double ratio, distance, radius; Matrix C=new Matrix(set[0].getArrayCopy()); distance=RiemannianDistance(C,COpt)/ropt; radius=RiemannianDistance(C,set[argMaxCenter(set,C)]); System.out.println(i+"\t"+distance+"\t"+radius); for(i=1;i<=nbIter;i++) { f=argMaxCenter(set,C); ratio=1.0/(i+1); C=CutGeodesic(C,set[f],ratio); distance=RiemannianDistance(C,COpt)/ropt; radius=RiemannianDistance(C,set[argMaxCenter(set,C)]); System.out.println(i+"\t"+distance+"\t"+radius); } return C; } public static void main (String[] args) { // Number of matrices int n=100; // Dimension of square matrices int d=5; System.out.println("Approximating the Riemannian Minimax\n on "+n+" symmetric positive definite matrices (SPD) of dimension "+d); System.out.println("October 2010, Rev. December 2011."); int i; // Create data-set Matrix [] set=new Matrix[n]; for(i=0;i