/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.math.impl.minimization; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import com.opengamma.strata.math.impl.statistics.distribution.NormalDistribution; import com.opengamma.strata.math.impl.statistics.distribution.ProbabilityDistribution; import cern.jet.random.engine.MersenneTwister; import cern.jet.random.engine.MersenneTwister64; import cern.jet.random.engine.RandomEngine; /** * Abstract test. */ @Test public abstract class ParameterLimitsTransformTestCase { protected static final RandomEngine RANDOM = new MersenneTwister64(MersenneTwister.DEFAULT_SEED); protected static final ProbabilityDistribution<Double> NORMAL = new NormalDistribution(0, 1, RANDOM); protected void assertRoundTrip(final ParameterLimitsTransform transform, final double modelParam) { final double fp = transform.transform(modelParam); final double mp = transform.inverseTransform(fp); assertEquals(modelParam, mp, 1e-8); } // reverse protected void assertReverseRoundTrip(final ParameterLimitsTransform transform, final double fitParam) { final double mp = transform.inverseTransform(fitParam); final double fp = transform.transform(mp); assertEquals(fitParam, fp, 1e-8); } protected void assertGradientRoundTrip(final ParameterLimitsTransform transform, final double modelParam) { final double g = transform.transformGradient(modelParam); final double fp = transform.transform(modelParam); final double gInv = transform.inverseTransformGradient(fp); assertEquals(g, 1.0 / gInv, 1e-8); } protected void assertGradient(final ParameterLimitsTransform transform, final double modelParam) { final double eps = 1e-5; final double g = transform.transformGradient(modelParam); double fdg; try { final double down = transform.transform(modelParam - eps); final double up = transform.transform(modelParam + eps); fdg = (up - down) / 2 / eps; } catch (final IllegalArgumentException e) { final double fp = transform.transform(modelParam); try { final double up = transform.transform(modelParam + eps); fdg = (up - fp) / eps; } catch (final IllegalArgumentException e2) { final double down = transform.transform(modelParam - eps); fdg = (fp - down) / eps; } } assertEquals(g, fdg, 1e-6); } protected void assertInverseGradient(final ParameterLimitsTransform transform, final double fitParam) { final double eps = 1e-5; final double g = transform.inverseTransformGradient(fitParam); double fdg; final double down = transform.inverseTransform(fitParam - eps); final double up = transform.inverseTransform(fitParam + eps); fdg = (up - down) / 2 / eps; assertEquals(g, fdg, 1e-6); } }