/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.statistics.distribution;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class BivariateNormalDistributionTest {
private static final ProbabilityDistribution<double[]> DIST = new BivariateNormalDistribution();
private static final double EPS = 1e-8;
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCDF() {
DIST.getCDF(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testInsufficientLengthCDF() {
DIST.getCDF(new double[] {2, 1});
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testExcessiveLengthCDF() {
DIST.getCDF(new double[] {2, 1, 4, 5});
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testHighCorrelation() {
DIST.getCDF(new double[] {1., 1., 3.});
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testLowCorrelation() {
DIST.getCDF(new double[] {1., 1., -3.});
}
@Test
public void test() {
assertEquals(DIST.getCDF(new double[] {Double.POSITIVE_INFINITY, Math.random(), Math.random()}), 1, 0);
assertEquals(DIST.getCDF(new double[] {Math.random(), Double.POSITIVE_INFINITY, Math.random()}), 1, 0);
assertEquals(DIST.getCDF(new double[] {Double.NEGATIVE_INFINITY, Math.random(), Math.random()}), 0, 0);
assertEquals(DIST.getCDF(new double[] {Math.random(), Double.NEGATIVE_INFINITY, Math.random()}), 0, 0);
assertEquals(DIST.getCDF(new double[] {0.0, 0.0, 0.0}), 0.25, EPS);
assertEquals(DIST.getCDF(new double[] {0.0, 0.0, -0.5}), 1. / 6, EPS);
assertEquals(DIST.getCDF(new double[] {0.0, 0.0, 0.5}), 1. / 3, EPS);
assertEquals(DIST.getCDF(new double[] {0.0, -0.5, 0.0}), 0.1542687694, EPS);
assertEquals(DIST.getCDF(new double[] {0.0, -0.5, -0.5}), 0.0816597607, EPS);
assertEquals(DIST.getCDF(new double[] {0.0, -0.5, 0.5}), 0.2268777781, EPS);
assertEquals(DIST.getCDF(new double[] {0.0, 0.5, 0.0}), 0.3457312306, EPS);
assertEquals(DIST.getCDF(new double[] {0.0, 0.5, -0.5}), 0.2731222219, EPS);
assertEquals(DIST.getCDF(new double[] {0.0, 0.5, 0.5}), 0.4183402393, EPS);
assertEquals(DIST.getCDF(new double[] {-0.5, 0.0, 0.0}), 0.1542687694, EPS);
assertEquals(DIST.getCDF(new double[] {-0.5, 0.0, -0.5}), 0.0816597607, EPS);
assertEquals(DIST.getCDF(new double[] {-0.5, 0.0, 0.5}), 0.2268777781, EPS);
assertEquals(DIST.getCDF(new double[] {-0.5, -0.5, 0.0}), 0.0951954128, EPS);
assertEquals(DIST.getCDF(new double[] {-0.5, -0.5, -0.5}), 0.0362981865, EPS);
assertEquals(DIST.getCDF(new double[] {-0.5, -0.5, 0.5}), 0.1633195213, EPS);
assertEquals(DIST.getCDF(new double[] {-0.5, 0.5, 0.0}), 0.2133421259, EPS);
assertEquals(DIST.getCDF(new double[] {-0.5, 0.5, -0.5}), 0.1452180174, EPS);
assertEquals(DIST.getCDF(new double[] {-0.5, 0.5, 0.5}), 0.2722393522, EPS);
assertEquals(DIST.getCDF(new double[] {0.5, 0.0, 0.0}), 0.3457312306, EPS);
assertEquals(DIST.getCDF(new double[] {0.5, 0.0, -0.5}), 0.2731222219, EPS);
assertEquals(DIST.getCDF(new double[] {0.5, 0.0, 0.5}), 0.4183402393, EPS);
assertEquals(DIST.getCDF(new double[] {0.5, -0.5, 0.0}), 0.2133421259, EPS);
assertEquals(DIST.getCDF(new double[] {0.5, -0.5, -0.5}), 0.1452180174, EPS);
assertEquals(DIST.getCDF(new double[] {0.5, -0.5, 0.5}), 0.2722393522, EPS);
assertEquals(DIST.getCDF(new double[] {0.5, 0.5, 0.0}), 0.4781203354, EPS);
assertEquals(DIST.getCDF(new double[] {0.5, 0.5, -0.5}), 0.4192231090, EPS);
assertEquals(DIST.getCDF(new double[] {0.0, -1.0, -1.0}), 0.00000000, EPS);
}
}