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); }
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 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); }
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); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testOutOfRange1() { RANGE_LIMITS.transform(-3); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testOutOfRange3() { RANGE_LIMITS.transformGradient(-3); }
pderef = p[i]; qderef = q[i]; jac[pderef][qderef] = _transforms[pderef].inverseTransformGradient(fittingParameters.get(qderef));
/** * Transforms from a set of unconstrained fitting parameters to a (possibly larger) set of function parameters (some of which may have constrained range and/or be fixed). * @param fittingParameters The fitting parameters * @return The function parameters */ @Override public DoubleArray inverseTransform(DoubleArray fittingParameters) { ArgChecker.notNull(fittingParameters, "fitting parameters"); ArgChecker.isTrue(fittingParameters.size() == _nFP, "fittingParameter wrong dimension"); double[] modelParameter = new double[_nMP]; for (int i = 0, j = 0; i < _nMP; i++) { if (_freeParameters[i]) { modelParameter[i] = _transforms[i].inverseTransform(fittingParameters.get(j)); j++; } else { modelParameter[i] = _startValues.get(i); } } return DoubleArray.copyOf(modelParameter); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testOutOfRange2() { UPPER_LIMIT.transform(1.01); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testOutOfRange4() { UPPER_LIMIT.transformGradient(1.01); }
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); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testOutOfRange1() { LOWER_LIMIT.transform(-3); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testOutOfRange4() { RANGE_LIMITS.transformGradient(1.01); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testOutOfRange2() { RANGE_LIMITS.transform(1.01); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testOutOfRange3() { LOWER_LIMIT.transformGradient(-3); }
/** * Transforms from a set of function parameters (some of which may have constrained range and/or be fixed) * to a (possibly smaller) set of unconstrained fitting parameters. * <b>Note:</b> If a parameter is fixed, it is its value as provided by <i>startValues</i> not the value * given here that will be returned by inverseTransform (and thus used in the function). * * @param functionParameters The function parameters * @return The fitting parameters */ @Override public DoubleArray transform(DoubleArray functionParameters) { ArgChecker.notNull(functionParameters, "function parameters"); ArgChecker.isTrue(functionParameters.size() == _nMP, "functionParameters wrong dimension"); double[] fittingParameter = new double[_nFP]; for (int i = 0, j = 0; i < _nMP; i++) { if (_freeParameters[i]) { fittingParameter[j] = _transforms[i].transform(functionParameters.get(i)); j++; } } return DoubleArray.copyOf(fittingParameter); }
/** * Calculates the Jacobian of the transform from function parameters to fitting parameters - * the i,j element will be the partial derivative of i^th fitting parameter with respect. * to the j^th function parameter * @param functionParameters The function parameters * @return matrix of partial derivative of fitting parameter with respect to function parameters */ // TODO not tested @Override public DoubleMatrix jacobian(DoubleArray functionParameters) { ArgChecker.notNull(functionParameters, "function parameters"); ArgChecker.isTrue(functionParameters.size() == _nMP, "functionParameters wrong dimension"); double[][] jac = new double[_nFP][_nMP]; for (int i = 0, j = 0; i < _nMP; i++) { if (_freeParameters[i]) { jac[j][i] = _transforms[i].transformGradient(functionParameters.get(i)); j++; } } return DoubleMatrix.copyOf(jac); }