@Override public void computeJacobian(S jacobian) { this.jacobian.process(x,jacobian); } }
@Override public void computeJacobian(S jacobian) { this.jacobian.process(x,jacobian); } }
@Override protected void functionGradientHessian(DMatrixRMaj x, boolean sameStateAsResiduals, DMatrixRMaj gradient, HessianLeastSquares<S> hessian) { if( !sameStateAsResiduals ) functionResiduals.process(x.data,residuals.data); functionJacobian.process(x.data,jacobian); hessian.updateHessian(jacobian); math.multTransA(jacobian, residuals, gradient); }
@Override protected void functionGradientHessian(DMatrixRMaj x, boolean sameStateAsResiduals, DMatrixRMaj gradient, HessianLeastSquares<S> hessian) { if( !sameStateAsResiduals ) functionResiduals.process(x.data,residuals.data); functionJacobian.process(x.data,jacobian); hessian.updateHessian(jacobian); math.multTransA(jacobian, residuals, gradient); }
@Override protected void functionGradientHessian(DMatrixRMaj x, boolean sameStateAsCost, DMatrixRMaj gradient, HessianLeastSquares<S> hessian) { if( !sameStateAsCost ) functionResiduals.process(x.data,residuals.data); functionJacobian.process(x.data,jacobian); hessian.updateHessian(jacobian); math.multTransA(jacobian, residuals, gradient); }
@Override protected void functionGradientHessian(DMatrixRMaj x, boolean sameStateAsCost, DMatrixRMaj gradient, HessianLeastSquares<S> hessian) { if( !sameStateAsCost ) functionResiduals.process(x.data,residuals.data); functionJacobian.process(x.data,jacobian); hessian.updateHessian(jacobian); math.multTransA(jacobian, residuals, gradient); }
DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param,found); numerical.process(param,expected);
DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param,found); numerical.process(param,expected);
DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param,found); numerical.process(param,expected);
DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param,found); numerical.process(param,expected);
@Override public void process(double[] input, double []output) { func.process(input,funcOutput); deriv.process(input, J); int N = deriv.getNumOfInputsN(); int M = deriv.getNumOfOutputsM(); for( int i = 0; i < N; i++ ) { output[i] = 0; } for( int i = 0; i < M; i++ ) { double f = funcOutput[i]; for( int j = 0; j < N; j++ ) { output[j] += 2*f*J.get(i,j); } } } }
@Override public void process(double[] input, double []output) { func.process(input,funcOutput); deriv.process(input, J); int N = deriv.getNumOfInputsN(); int M = deriv.getNumOfOutputsM(); for( int i = 0; i < N; i++ ) { output[i] = 0; } for( int i = 0; i < M; i++ ) { double f = funcOutput[i]; for( int j = 0; j < N; j++ ) { output[j] += 2*f*J.get(i,j); } } } }
DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param, found); numerical.process(param, expected);
DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param, found); numerical.process(param, expected);
public static <S extends DMatrix> boolean jacobian( FunctionNtoM func , FunctionNtoMxN<S> jacobian , double param[] , double tol , double differenceScale ) { NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale); if( numerical.getNumOfOutputsM() != jacobian.getNumOfOutputsM() ) throw new RuntimeException("M is not equal "+numerical.getNumOfOutputsM()+" "+jacobian.getNumOfOutputsM()); if( numerical.getNumOfInputsN() != jacobian.getNumOfInputsN() ) throw new RuntimeException("N is not equal: "+numerical.getNumOfInputsN()+" "+jacobian.getNumOfInputsN()); S found = jacobian.declareMatrixMxN(); DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param,found); numerical.process(param,expected); checkJacobianShape(found, expected); return MatrixFeatures_D.isIdentical(expected,found,tol); }
public static <S extends DMatrix> boolean jacobian( FunctionNtoM func , FunctionNtoMxN<S> jacobian , double param[] , double tol , double differenceScale ) { NumericalJacobianForward_DDRM numerical = new NumericalJacobianForward_DDRM(func,differenceScale); if( numerical.getNumOfOutputsM() != jacobian.getNumOfOutputsM() ) throw new RuntimeException("M is not equal "+numerical.getNumOfOutputsM()+" "+jacobian.getNumOfOutputsM()); if( numerical.getNumOfInputsN() != jacobian.getNumOfInputsN() ) throw new RuntimeException("N is not equal: "+numerical.getNumOfInputsN()+" "+jacobian.getNumOfInputsN()); S found = jacobian.declareMatrixMxN(); DMatrixRMaj expected = new DMatrixRMaj(func.getNumOfOutputsM(),func.getNumOfInputsN()); jacobian.process(param,found); numerical.process(param,expected); checkJacobianShape(found, expected); return MatrixFeatures_D.isIdentical(expected,found,tol); }