/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.volatility.discrete;
import static org.testng.AssertJUnit.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
import cern.jet.random.engine.MersenneTwister;
import cern.jet.random.engine.MersenneTwister64;
import cern.jet.random.engine.RandomEngine;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix2D;
import com.opengamma.analytics.math.matrix.IdentityMatrix;
import com.opengamma.analytics.util.AssertMatrix;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.tuple.DoublesPair;
/**
*
*/
@Test(groups = TestGroup.UNIT)
public class DiscreteVolatilityFunctionProviderDirectTest {
private static final RandomEngine RANDOM = new MersenneTwister64(MersenneTwister.DEFAULT_SEED);
@Test
public void test() {
final int nSamples = 10;
final List<DoublesPair> points = new ArrayList<>(nSamples);
final DoubleMatrix1D x = new DoubleMatrix1D(nSamples);
for (int i = 0; i < nSamples; i++) {
final double t = RANDOM.nextDouble() * 20.0;
final double k = RANDOM.nextDouble() * 0.15;
points.add(DoublesPair.of(t, k));
x.getData()[i] = RANDOM.nextDouble();
}
final DiscreteVolatilityFunctionProvider pro = new DiscreteVolatilityFunctionProviderDirect();
final DiscreteVolatilityFunction func = pro.from(points);
final DoubleMatrix1D y = func.evaluate(x);
AssertMatrix.assertEqualsVectors(x, y, 0.0);
final DoubleMatrix2D jac = func.calculateJacobian(x);
AssertMatrix.assertEqualsMatrix(new IdentityMatrix(nSamples), jac, 0.0);
assertEquals(nSamples, func.getLengthOfDomain());
assertEquals(nSamples, func.getLengthOfRange());
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthTest() {
final int nSamples = 10;
final List<DoublesPair> points = new ArrayList<>(nSamples);
final DoubleMatrix1D x = new DoubleMatrix1D(nSamples + 1);
x.getData()[0] = RANDOM.nextDouble();
for (int i = 0; i < nSamples; i++) {
final double t = RANDOM.nextDouble() * 20.0;
final double k = RANDOM.nextDouble() * 0.15;
points.add(DoublesPair.of(t, k));
x.getData()[i + 1] = RANDOM.nextDouble();
}
final DiscreteVolatilityFunctionProvider pro = new DiscreteVolatilityFunctionProviderDirect();
final DiscreteVolatilityFunction func = pro.from(points);
func.evaluate(x);
}
}