package test.dr.math;
import dr.math.Procrustes;
import dr.math.matrixAlgebra.Matrix;
import org.apache.commons.math.linear.Array2DRowRealMatrix;
import org.apache.commons.math.linear.RealMatrix;
/* R test code
library(MCMCpack)
set.seed(666)
Xstar = matrix(runif(9,-10,10), nrow=3)
X = matrix(runif(9,-2,2), nrow=3)
out.0 = procrustes(X, Xstar, F, F)
out.1 = procrustes(X, Xstar, T, F)
out.2 = procrustes(X, Xstar, F, T)
*/
/**
* @author Marc A. Suchard
* @author Andrew Rambaut
*/
public class ProcrustesTest extends MathTestCase {
public void testProcrustes() {
double tolerance = 1E-4;
runTest(X, Xstar, gldStd[0], false, false, tolerance, "No translation, no dilation");
runTest(X, Xstar, gldStd[1], true, false, tolerance, "Yes translation, no dilation");
runTest(X, Xstar, gldStd[2], false, true, tolerance, "No translation, yes dilation");
}
private void runTest(double[][] X, double[][] Xstar, double[][] goldStandard,
boolean allowTranslation, boolean allowDilation, double tolerance, String header) {
RealMatrix rmX = new Array2DRowRealMatrix(X);
RealMatrix rmXstar = new Array2DRowRealMatrix(Xstar);
Procrustes procrustes = new Procrustes(rmX, rmXstar, allowTranslation, allowDilation);
RealMatrix rmXnew = procrustes.procrustinate(rmX);
System.out.println(header);
System.out.print("Translation:\n" + new Matrix(procrustes.getTranslation().getData()));
System.out.println("Dilation = " + procrustes.getDilation());
System.out.println("Xnew:");
System.out.println(new Matrix(rmXnew.getData()));
assertEquals(rmXnew.getData(), goldStandard, tolerance);
}
private static double[][] X = {
{ -0.9602155, -1.617021, 1.245026 },
{ 1.1035723, -1.431346, -1.853811 },
{ -1.9344838, -1.155495, 1.566550 }
};
private static double[][] Xstar = {
{ 5.487370, -5.973453, 9.57456879 },
{ -6.055516, -2.775111, -0.03772582 },
{ 9.560277, 4.852239, -9.73368329 }
};
private static double[][][] gldStd = {
{
{ 2.062008, -0.8829124, 0.2354720 }, // No translation, no dilation
{ -1.456369, -2.1056073, 0.3855449 },
{ 2.669785, -0.3375384, -0.5383219 },
},
{
{ 3.9949788, -1.2385190, 0.1258216 },
{ 0.3349586, -1.9233277, 0.3040794 },
{ 4.6621931, -0.7344788, -0.6267413 }
},
{
{ 6.682553, -2.861341, 0.7631174 },
{ -4.719800, -6.823849, 1.2494734 },
{ 8.652235, -1.093894, -1.7445929 },
}
};
}