public static FunctionNtoN gradientForwards(FunctionNtoS func ) { return new NumericalGradientForward(func); } }
public static <D extends DMatrix> FunctionNtoMxN<D> jacobianForwards(FunctionNtoM func, Class<D> type ) { if( type == DMatrixRMaj.class ) { return (FunctionNtoMxN)new NumericalJacobianForward_DDRM(func); } else if( type == DMatrixSparseCSC.class ) { return (FunctionNtoMxN)new NumericalJacobianForward_DSCC(func); } else { throw new RuntimeException("Matrix type unknown/not supported. "+type.getSimpleName()); } }
public CachedNumericalGradientLineFunction(FunctionNtoS function ) { this.function = function; this.N = function.getNumOfInputsN(); this.gradient = new NumericalGradientForward(function); FunctionStoS lineFunction = new LineFunction(); this.lineDerivative = new NumericalDerivativeForward(lineFunction); currentInput = new double[N]; currentGradient = new double[N]; }
public static boolean gradient( FunctionNtoS func , FunctionNtoN gradient , double param[] , double tol , double differenceScale ) { NumericalGradientForward numerical = new NumericalGradientForward(func,differenceScale); if( numerical.getN() != gradient.getN() ) throw new RuntimeException("N is not equal: "+numerical.getN() +" "+gradient.getN()); int N = numerical.getN(); double[] found = new double[N]; double[] expected = new double[N]; gradient.process(param, found); numerical.process(param,expected); for (int i = 0; i < N; i++) { if(Math.abs(found[i]-expected[i]) > tol) return false; } return true; }
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); }
@Test public void simple() { // give it a function where one variable does not effect the output // to make the test more interesting SimpleFunction f = new SimpleFunction(); NumericalJacobianForward_DDRM alg = new NumericalJacobianForward_DDRM(f); DMatrixRMaj output = alg.declareMatrixMxN(); alg.process(new double[]{2,3,7},output); assertEquals(3, output.data[0], tol); assertEquals(-36, output.data[1], tol); assertEquals(0, output.data[2], tol); assertEquals(3, output.data[3], tol); assertEquals(2, output.data[4], tol); assertEquals(1, output.data[5], tol); }
@Test public void simple() { // give it a function where one variable does not effect the output // to make the test more interesting SimpleFunction f = new SimpleFunction(); NumericalGradientForward alg = new NumericalGradientForward(f); double output[] = new double[]{1,1,1}; alg.process(new double[]{2,3,7},output); assertEquals(3, output[0], 1e-5); assertEquals(-36, output[1], 1e-5); assertEquals(0, output[2], 1e-5); }
@Test public void simple() { // give it a function where one variable does not effect the output // to make the test more interesting SimpleFunction f = new SimpleFunction(); NumericalDerivativeForward alg = new NumericalDerivativeForward(f); double output = alg.process(3); assertEquals(36, output, 1e-5); }
@Test public void simple() { // give it a function where one variable does not effect the output // to make the test more interesting SimpleFunction f = new SimpleFunction(); NumericalJacobianForward_DSCC alg = new NumericalJacobianForward_DSCC(f); DMatrixSparseCSC output = alg.declareMatrixMxN(); alg.process(new double[]{2,3,7},output); // one element should be zero assertEquals(5, output.nz_length); assertEquals(3, output.get(0,0), tol); assertEquals(-36, output.get(0,1), tol); assertEquals(0, output.get(0,2), tol); assertEquals(3, output.get(1,0), tol); assertEquals(2, output.get(1,1), tol); assertEquals(1, output.get(1,2), tol); }
@Test public void simple() { // give it a function where one variable does not effect the output // to make the test more interesting SimpleFunction f = new SimpleFunction(); NumericalJacobianFB alg = new NumericalJacobianFB(f); DMatrixRMaj output = alg.declareMatrixMxN(); alg.process(new double[]{2,3,7},output); assertEquals(3, output.data[0], tol); assertEquals(-36, output.data[1], tol); assertEquals(0, output.data[2], tol); assertEquals(3, output.data[3], tol); assertEquals(2, output.data[4], tol); assertEquals(1, output.data[5], tol); }
@Test public void simple() { // give it a function where one variable does not effect the output // to make the test more interesting SimpleFunction f = new SimpleFunction(); NumericalDerivativeFB alg = new NumericalDerivativeFB(f); double output = alg.process(3); assertEquals(36, output, 1e-16); }
@Test public void simple() { // give it a function where one variable does not effect the output // to make the test more interesting SimpleFunction f = new SimpleFunction(); NumericalGradientFB alg = new NumericalGradientFB(f); double output[] = new double[]{1,1,1}; alg.process(new double[]{2,3,7},output); assertEquals(3, output[0], tol); assertEquals(-36, output[1], tol); assertEquals(0, output[2], tol); }
public static boolean gradient( FunctionNtoS func , FunctionNtoN gradient , double param[] , double tol , double differenceScale ) { NumericalGradientForward numerical = new NumericalGradientForward(func,differenceScale); if( numerical.getN() != gradient.getN() ) throw new RuntimeException("N is not equal: "+numerical.getN() +" "+gradient.getN()); int N = numerical.getN(); double[] found = new double[N]; double[] expected = new double[N]; gradient.process(param, found); numerical.process(param,expected); for (int i = 0; i < N; i++) { if(Math.abs(found[i]-expected[i]) > tol) return false; } return true; }
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 <D extends DMatrix> FunctionNtoMxN<D> jacobianForwards(FunctionNtoM func, Class<D> type ) { if( type == DMatrixRMaj.class ) { return (FunctionNtoMxN)new NumericalJacobianForward_DDRM(func); } else if( type == DMatrixSparseCSC.class ) { return (FunctionNtoMxN)new NumericalJacobianForward_DSCC(func); } else { throw new RuntimeException("Matrix type unknown/not supported. "+type.getSimpleName()); } }
public CachedNumericalGradientLineFunction(FunctionNtoS function ) { this.function = function; this.N = function.getNumOfInputsN(); this.gradient = new NumericalGradientForward(function); FunctionStoS lineFunction = new LineFunction(); this.lineDerivative = new NumericalDerivativeForward(lineFunction); currentInput = new double[N]; currentGradient = new double[N]; }
public static FunctionNtoN gradientForwards(FunctionNtoS func ) { return new NumericalGradientForward(func); } }
public static boolean gradientR( FunctionNtoS func , FunctionNtoN gradient , double param[] , double tol , double differenceScale ) NumericalGradientForward numerical = new NumericalGradientForward(func,differenceScale); if( numerical.getN() != gradient.getN() ) throw new RuntimeException("N is not equal: "+numerical.getN() +" "+gradient.getN()); int N = numerical.getN(); double[] found = new double[N]; double[] expected = new double[N]; numerical.process(param,expected);
@Test public void compareToNumeric() { FuncLS funcLS = new FuncLS(); DerivLS derivLS = new DerivLS(); FunctionNtoS func = new LsToNonLinear(funcLS); FunctionNtoN deriv = new LsToNonLinearDeriv(funcLS,derivLS); FunctionNtoN derivNumeric = new NumericalGradientForward(func); double point[] = new double[]{1,2}; double expected[] = new double[2]; double found[] = new double[2]; deriv.process(point,found); derivNumeric.process(point,expected); for( int i = 0; i < expected.length; i++ ) { assertEquals(expected[i], found[i], 1e-4); } }
public static boolean gradientR( FunctionNtoS func , FunctionNtoN gradient , double param[] , double tol , double differenceScale ) NumericalGradientForward numerical = new NumericalGradientForward(func,differenceScale); if( numerical.getN() != gradient.getN() ) throw new RuntimeException("N is not equal: "+numerical.getN() +" "+gradient.getN()); int N = numerical.getN(); double[] found = new double[N]; double[] expected = new double[N]; numerical.process(param,expected);