// Test Indexx
System.out.println("Testing Indexx");
Ran myran = new Ran(17);
for (i=0;i<N;i++) x[i]=myran.doub();
Indexx idx =new Indexx(x); // Create the index
double[] xx=buildVector(x); // Copy of x
idx.sort(xx); // Test sort on x itself
for (i=0;i<N-1;i++) localflag = localflag || (xx[i] > xx[i+1]);
globalflag = globalflag || localflag;
if (localflag) {
fail("*** Indexx: Array sorted according to index is incorrectly ordered");
}
// Test member function sort() on another array
for (i=0;i<N;i++) yy[i] = 1.0-x[i]; // Invert the sorting order
idx.sort(yy); // yy sorted according to the sizes of x
for (i=0;i<N-1;i++) localflag = localflag || (yy[i+1] > yy[i]);
globalflag = globalflag || localflag;
if (localflag) {
fail("*** Indexx: Independent array sorted according to index is incorrectly ordered");
}
// Test member function el()
for (i=0;i<N;i++) z[i] = 1.0-x[i];
for (i=0;i<N;i++) zz[i] = idx.el(z,i);
localflag = localflag || (maxel(vecsub(vecsub(u,zz),xx)) > sbeps);
globalflag = globalflag || localflag;
if (localflag) {
fail("*** Indexx: Member function el() does not sort inverted array into reverse order");
}
// Test l-value version of member function el()
for (i=0;i<N;i++) idx.setEl(zz,i, xx[i]);
localflag = localflag || (maxel(vecsub(x,zz)) > sbeps);
globalflag = globalflag || localflag;
if (localflag) {
fail("*** Indexx: l-value version of member function el() does not sort inverted array into reverse order");
}
// Test member function rank()
idx.rank(zi);
idx.sort(zi);
for (i=0;i<N;i++) localflag = localflag || (zi[i] != i);
globalflag = globalflag || localflag;
if (localflag) {
fail("*** Indexx: Sorting the rank table into element-size order does not give increasing integers");
}
// Test use of empty constructor and member function index() with pointers
double a[][]={{3.0,2.0,1.0,5.0,4.0},{3.0,1.0,5.0,2.0,4.0},{5.0,2.0,4.0,1.0,3.0}}; // matrix with unsorted rows
int b[][]={{2,1,0,4,3},{1,3,0,4,2},{3,1,4,2,0}}; // Hand-generated index array for each row
Indexx myhack = new Indexx();
for (i=0;i<3;i++) {
myhack.index(a[i],5);
for (j=0;j<5;j++) localflag = localflag || (myhack.indx[j] != b[i][j]);
}
globalflag = globalflag || localflag;
if (localflag) {
fail("*** Indexx: Member function index() did not work on array passed by pointer");