/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.minimization; import com.opengamma.analytics.math.function.Function1D; import com.opengamma.analytics.math.matrix.DoubleMatrix1D; import com.opengamma.analytics.math.matrix.DoubleMatrix2D; import com.opengamma.analytics.math.matrix.MatrixAlgebra; import com.opengamma.analytics.math.matrix.OGMatrixAlgebra; /** * */ public class NonLinearTransformFunction { private static final MatrixAlgebra MA = new OGMatrixAlgebra(); private final NonLinearParameterTransforms _transform; private final Function1D<DoubleMatrix1D, DoubleMatrix1D> _func; private final Function1D<DoubleMatrix1D, DoubleMatrix2D> _jac; public NonLinearTransformFunction(final Function1D<DoubleMatrix1D, DoubleMatrix1D> func, final Function1D<DoubleMatrix1D, DoubleMatrix2D> jac, final NonLinearParameterTransforms transform) { _transform = transform; _func = new Function1D<DoubleMatrix1D, DoubleMatrix1D>() { @SuppressWarnings("synthetic-access") @Override public DoubleMatrix1D evaluate(final DoubleMatrix1D yStar) { final DoubleMatrix1D y = _transform.inverseTransform(yStar); return func.evaluate(y); } }; _jac = new Function1D<DoubleMatrix1D, DoubleMatrix2D>() { @SuppressWarnings("synthetic-access") @Override public DoubleMatrix2D evaluate(final DoubleMatrix1D yStar) { final DoubleMatrix1D y = _transform.inverseTransform(yStar); final DoubleMatrix2D h = jac.evaluate(y); final DoubleMatrix2D invJ = _transform.inverseJacobian(yStar); return (DoubleMatrix2D) MA.multiply(h, invJ); } }; } public Function1D<DoubleMatrix1D, DoubleMatrix1D> getFittingFunction() { return _func; } public Function1D<DoubleMatrix1D, DoubleMatrix2D> getFittingJacobian() { return _jac; } }