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 FunctionNtoN gradientForwards(FunctionNtoS func ) { return new NumericalGradientForward(func); } }
@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); }
public static FunctionNtoN gradientForwards(FunctionNtoS func ) { return new NumericalGradientForward(func); } }
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 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 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);
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 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); } }
/** * Makes sure if the jacobian is null that the numerical differentiation is done and that it uses the expected * one */ @Test public void checkNumerical() { FunctionNtoS residual = new TrivialFunctionNtoS(); FunctionNtoN jacobian = new NumericalGradientForward(residual); UnconstrainedMinimization alg = createAlgorithm(); alg.setFunction(residual,jacobian,0); alg.initialize(new double[]{1,1,1},1e-10,1e-10); for( int i = 0; i < 200 && !alg.iterate(); i++ ) {} double expected[] = alg.getParameters().clone(); alg.setFunction(residual,null,0); alg.initialize(new double[]{1,1,1},1e-10,1e-10); for( int i = 0; i < 200 && !alg.iterate(); i++ ) {} double found[] = alg.getParameters().clone(); for( int i = 0; i < found.length; i++ ) { assertTrue(found[i]==expected[i]); } }
public void testSetInput_vector() { CallCounterNtoS func = new CallCounterNtoS(new TrivialFunctionNtoS()); CallCounterNtoN gradient = new CallCounterNtoN(new NumericalGradientForward(new TrivialFunctionNtoS()));
public void testSetInput_step() { CallCounterNtoS func = new CallCounterNtoS(new TrivialFunctionNtoS()); CallCounterNtoN gradient = new CallCounterNtoN(new NumericalGradientForward(new TrivialFunctionNtoS()));
public void basicTest() { FunctionNtoS residual = new TrivialFunctionNtoS(); FunctionNtoN jacobian = new NumericalGradientForward(residual);
public void testSetInput_vector() { CallCounterNtoS func = new CallCounterNtoS(new TrivialFunctionNtoS()); FunctionNtoN gradient = new NumericalGradientForward(new TrivialFunctionNtoS());