/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.volatility.smile.function;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class MixedLogNormalModelDataTest {
@Test
public void constructionTest() {
double[] w = new double[] {0.7, 0.1, 0.2 };
double[] sigma = new double[] {0.2, 0.5, 1.0 };
MixedLogNormalModelData data = new MixedLogNormalModelData(w, sigma);
int n = w.length;
double[] w2 = data.getWeights();
double[] sigma2 = data.getVolatilities();
double[] f = data.getRelativeForwards();
for (int i = 0; i < n; i++) {
assertEquals(w[i], w2[i], 1e-15, "wrong weights");
assertEquals(sigma[i], sigma2[i], 1e-15, "wrong vols");
assertEquals(1.0, f[i], 1e-15, "wrong forwards");
}
}
@Test
public void constructionTest2() {
double[] w = new double[] {0.1, 0.1, 0.75, 0.05 };
double[] sigma = new double[] {0.05, 0.05, 0.2, 1.0 };
double[] f = new double[] {0.8, 1.3, 1.0, Double.NaN };
int n = w.length;
double temp = 0;
for (int i = 0; i < n - 1; i++) {
temp += w[i] * f[i];
}
f[n - 1] = (1.0 - temp) / w[n - 1];
ArgumentChecker.isTrue(f[n - 1] > 0.0, "Adjust test parameters - f[{}] = {}", n - 1, f[n - 1]);
MixedLogNormalModelData data = new MixedLogNormalModelData(w, sigma, f);
double[] w2 = data.getWeights();
double[] sigma2 = data.getVolatilities();
double[] f2 = data.getRelativeForwards();
for (int i = 0; i < n; i++) {
assertEquals(w[i], w2[i], 1e-15, "wrong weights");
assertEquals(sigma[i], sigma2[i], 1e-15, "wrong vols");
assertEquals(f[i], f2[i], 1e-15, "wrong forwards");
}
}
@Test
public void constructionTest3() {
final int n = 3;
final int np = 3 * n - 2;
double[] p = new double[np];
p[0] = 0.2;
for (int i = 1; i < n; i++) {
p[i] = 0.5 * Math.random();
}
for (int i = n; i < np; i++) {
p[i] = 2 * Math.PI * Math.random();
}
MixedLogNormalModelData data = new MixedLogNormalModelData(p);
assertEquals(np, data.getNumberOfParameters());
for (int i = 0; i < n; i++) {
assertEquals(p[i], data.getParameter(i), 1e-15);
}
double[] w2 = data.getWeights();
double[] sigma2 = data.getVolatilities();
double[] f2 = data.getRelativeForwards();
double sumW = 0.0;
double sumWF = 0.0;
assertEquals(p[0], sigma2[0], 1e-15, "wrong vols");
for (int i = 0; i < n; i++) {
if (i > 0) {
assertEquals(p[i], sigma2[i] - sigma2[i - 1], 1e-15, "wrong vols");
}
sumW += w2[i];
sumWF += w2[i] * f2[i];
}
assertEquals(1.0, sumW, 1e-15, "wrong weights");
assertEquals(1.0, sumWF, 1e-15, "wrong forwards");
}
@Test
public void constructionTest4() {
final int n = 5;
final int np = 2 * n - 1;
double[] p = new double[np];
p[0] = 0.2;
for (int i = 1; i < n; i++) {
p[i] = 0.5 * Math.random();
}
for (int i = n; i < np; i++) {
p[i] = 2 * Math.PI * Math.random();
}
MixedLogNormalModelData data = new MixedLogNormalModelData(p, false);
assertEquals(np, data.getNumberOfParameters());
for (int i = 0; i < n; i++) {
assertEquals(p[i], data.getParameter(i), 1e-15);
}
double[] w2 = data.getWeights();
double[] sigma2 = data.getVolatilities();
double[] f2 = data.getRelativeForwards();
double sumW = 0.0;
assertEquals(p[0], sigma2[0], 1e-15, "wrong vols");
for (int i = 0; i < n; i++) {
if (i > 0) {
assertEquals(p[i], sigma2[i] - sigma2[i - 1], 1e-15, "wrong vols");
}
sumW += w2[i];
assertEquals(1.0, f2[i], 1e-15, "wrong forwards");
}
assertEquals(1.0, sumW, 1e-15, "wrong weights");
}
}