/** * Dense trust-region unconstrained minimization using Dogleg steps and BFGS to estimate the Hessian. * @param config Trust region configuration * @return The new optimization routine */ public static UnconstrainedMinimization doglegBFGS( @Nullable ConfigTrustRegion config ) { if( config == null ) config = new ConfigTrustRegion(); HessianBFGS hessian = new HessianBFGS_DDRM(true); TrustRegionUpdateDogleg_F64<DMatrixRMaj> update = new TrustRegionUpdateDogleg_F64<>(); UnconMinTrustRegionBFGS_F64 alg = new UnconMinTrustRegionBFGS_F64(update,hessian); alg.configure(config); return alg; }
@Override public void initialize(double[] initial, double ftol, double gtol) { this.initialize(initial,functionCost.getNumOfInputsN(), minimumFunctionValue); config.ftol = ftol; config.gtol = gtol; }
@Test public void wolfeCondition() { UnconMinTrustRegionBFGS_F64 alg = createAlg(); alg.fx = 1; alg.f_prev = 1.1; DMatrixRMaj s = new DMatrixRMaj(new double[][]{{1},{2}}); DMatrixRMaj y = new DMatrixRMaj(new double[][]{{2},{4}}); DMatrixRMaj g = new DMatrixRMaj(new double[][]{{0.1},{0.4}}); assertTrue(alg.wolfeCondition(s,y,g)); // if the change in state is perpendicular to change in gradient it should fail s = new DMatrixRMaj(new double[][]{{1},{2}}); y = new DMatrixRMaj(new double[][]{{2},{-4}}); assertFalse(alg.wolfeCondition(s,y,g)); }
protected UnconMinTrustRegionBFGS_F64 createAlg() { TrustRegionUpdateDogleg_F64 dogleg = new TrustRegionUpdateDogleg_F64(); HessianBFGS_DDRM hessian = new HessianBFGS_DDRM(true); return new UnconMinTrustRegionBFGS_F64(dogleg,hessian); } }
@Override protected void functionGradientHessian(DMatrixRMaj x, boolean sameStateAsCost, DMatrixRMaj gradient, HessianBFGS hessian) { functionGradient.process(x.data, gradient.data); if( !firstIteration ) { // compute the change in Gradient CommonOps_DDRM.subtract(gradient, gradientPrevious, y); CommonOps_DDRM.subtract(x, xPrevious, s); // Only update when the Wolfe condition is true of the Hessian gets corrected very quickly if( wolfeCondition(s,y,gradientPrevious)) { // Apply DFP equation and update H // Note: there is some duplication in math between Wolfe, update(), and inverseUpdate() hessian.update(s,y); gradientPrevious.set(gradient); xPrevious.set(x); f_prev = fx; } } else { firstIteration = false; gradientPrevious.set(gradient); xPrevious.set(x); f_prev = fx; } }
/** * Dense trust-region unconstrained minimization using Dogleg steps and BFGS to estimate the Hessian. * @param config Trust region configuration * @return The new optimization routine */ public static UnconstrainedMinimization doglegBFGS( @Nullable ConfigTrustRegion config ) { if( config == null ) config = new ConfigTrustRegion(); HessianBFGS hessian = new HessianBFGS_DDRM(true); TrustRegionUpdateDogleg_F64<DMatrixRMaj> update = new TrustRegionUpdateDogleg_F64<>(); UnconMinTrustRegionBFGS_F64 alg = new UnconMinTrustRegionBFGS_F64(update,hessian); alg.configure(config); return alg; }
@Override protected void functionGradientHessian(DMatrixRMaj x, boolean sameStateAsCost, DMatrixRMaj gradient, HessianBFGS hessian) { functionGradient.process(x.data, gradient.data); if( !firstIteration ) { // compute the change in Gradient CommonOps_DDRM.subtract(gradient, gradientPrevious, y); CommonOps_DDRM.subtract(x, xPrevious, s); // Only update when the Wolfe condition is true of the Hessian gets corrected very quickly if( wolfeCondition(s,y,gradientPrevious)) { // Apply DFP equation and update H // Note: there is some duplication in math between Wolfe, update(), and inverseUpdate() hessian.update(s,y); gradientPrevious.set(gradient); xPrevious.set(x); f_prev = fx; } } else { firstIteration = false; gradientPrevious.set(gradient); xPrevious.set(x); f_prev = fx; } }
@Override public void initialize(double[] initial, double ftol, double gtol) { this.initialize(initial,functionCost.getNumOfInputsN(), minimumFunctionValue); config.ftol = ftol; config.gtol = gtol; }
@Override protected UnconstrainedMinimization createSearch() { ConfigTrustRegion config = new ConfigTrustRegion(); config.regionInitial = 100; TrustRegionUpdateDogleg_F64 dogleg = new TrustRegionUpdateDogleg_F64(); HessianBFGS_DDRM hessian = new HessianBFGS_DDRM(true); UnconMinTrustRegionBFGS_F64 tr = new UnconMinTrustRegionBFGS_F64(dogleg,hessian); tr.configure(config); return tr; } }
@Override protected UnconstrainedMinimization createSearch() { ConfigTrustRegion config = new ConfigTrustRegion(); UnconMinTrustRegionBFGS_F64 tr = new UnconMinTrustRegionBFGS_F64( new TrustRegionUpdateCauchy_F64(), new HessianBFGS_DDRM(false)); tr.configure(config); return tr; }