/** * Creates a dense trust region least-squares optimization using cauchy steps. * * @see UnconLeastSqTrustRegion_F64 * * @param config Trust region configuration * @return The new optimization routine */ public static UnconstrainedLeastSquares<DMatrixRMaj> cauchy( @Nullable ConfigTrustRegion config ) { if( config == null ) config = new ConfigTrustRegion(); HessianLeastSquares_DDRM hessian = new HessianLeastSquares_DDRM(); MatrixMath_DDRM math = new MatrixMath_DDRM(); TrustRegionUpdateCauchy_F64<DMatrixRMaj> update = new TrustRegionUpdateCauchy_F64<>(); UnconLeastSqTrustRegion_F64<DMatrixRMaj> alg = new UnconLeastSqTrustRegion_F64<>(update,hessian,math); alg.configure(config); return alg; }
@Test public void initializeUpdate() { MockOwner owner = new MockOwner(null); TrustRegionUpdateCauchy_F64<DMatrixRMaj> alg = new TrustRegionUpdateCauchy_F64<>(); owner.gradient.set(new double[][]{{1},{2}}); owner.gradientNorm = NormOps_DDRM.normF(owner.gradient); owner.hessian().reshape(2,2); RandomMatrices_DDRM.fillUniform(owner.hessian(),-1,1,rand); alg.initialize(owner,2,-1); alg.initializeUpdate(); assertTrue( alg.gBg != 0 ); }
@Test public void computeUpdate_negativeDefinite() { MockOwner owner = new MockOwner(null); TrustRegionUpdateCauchy_F64<DMatrixRMaj> alg = new TrustRegionUpdateCauchy_F64<>(); alg.initialize(owner,2,-1); owner.gradientNorm = 0.1; setGradient(owner.gradient,0.1,0.4,owner.gradientNorm); CommonOps_DDRM.divide(owner.gradient,owner.gradientNorm,alg.direction); owner.hessian().set(new double[][]{{-2,0.1},{0.1,-1.5}}); alg.gBg = owner.hessian.innerVectorHessian(alg.direction); DMatrixRMaj p = new DMatrixRMaj(2,1); // should hit the boundary owner.fx = 1000; alg.computeUpdate(p,2); assertEquals(owner.computePredictedReduction(p),alg.getPredictedReduction(),UtilEjml.TEST_F64); assertEquals(2, alg.getStepLength(), UtilEjml.TEST_F64); assertEquals(2, NormOps_DDRM.normF(p), UtilEjml.TEST_F64); }
@Test public void computeUpdate_positiveDefinite() { double radius = 2; MockOwner owner = new MockOwner(null); TrustRegionUpdateCauchy_F64<DMatrixRMaj> alg = new TrustRegionUpdateCauchy_F64<>(); alg.initialize(owner,2,-1); DMatrixRMaj p = new DMatrixRMaj(2,1); // Unconstrained solution is way outside the region bounds. Make sure this contrains it owner.hessian().set(new double[][]{{2,0.1},{0.1,1.5}}); owner.gradientNorm = 1000; setGradient(owner.gradient,0.1,0.4,owner.gradientNorm); CommonOps_DDRM.divide(owner.gradient,owner.gradientNorm,alg.direction); alg.gBg = owner.hessian.innerVectorHessian(alg.direction); alg.computeUpdate(p,radius); assertEquals(owner.computePredictedReduction(p),alg.getPredictedReduction(),UtilEjml.TEST_F64); assertEquals(radius, alg.getStepLength(), UtilEjml.TEST_F64); assertEquals(radius, NormOps_DDRM.normF(p), UtilEjml.TEST_F64); // should be inside the bounds owner.gradientNorm = 0.1; setGradient(owner.gradient,0.1,0.4,owner.gradientNorm); alg.computeUpdate(p,radius); double n = NormOps_DDRM.normF(p); assertTrue(n > 0 && n < radius); double expectedRadius = owner.gradientNorm/alg.gBg; assertEquals(owner.computePredictedReduction(p),alg.getPredictedReduction(),UtilEjml.TEST_F64); assertEquals(expectedRadius, alg.getStepLength(), UtilEjml.TEST_F64); assertEquals(expectedRadius, NormOps_DDRM.normF(p), UtilEjml.TEST_F64); }
/** * Creates a sparse trust region optimization using cauchy steps. * * @see UnconLeastSqTrustRegion_F64 * * @param config Trust region configuration * @return The new optimization routine */ public static UnconstrainedLeastSquares<DMatrixSparseCSC> cauchy( @Nullable ConfigTrustRegion config ) { if( config == null ) config = new ConfigTrustRegion(); HessianLeastSquares_DSCC hessian = new HessianLeastSquares_DSCC(); MatrixMath_DSCC math = new MatrixMath_DSCC(); TrustRegionUpdateCauchy_F64<DMatrixSparseCSC> update = new TrustRegionUpdateCauchy_F64<>(); UnconLeastSqTrustRegion_F64<DMatrixSparseCSC> alg = new UnconLeastSqTrustRegion_F64<>(update,hessian,math); alg.configure(config); return alg; }
@Test public void initializeUpdate_catchNaN() { MockOwner owner = new MockOwner(null); TrustRegionUpdateCauchy_F64<DMatrixRMaj> alg = new TrustRegionUpdateCauchy_F64<>(); owner.gradient.set(new double[][]{{1},{2}}); owner.gradientNorm = NormOps_DDRM.normF(owner.gradient); owner.hessian().reshape(2,2); RandomMatrices_DDRM.fillUniform(owner.hessian(),-1,1,rand); owner.hessian().data[1] = Double.NaN; alg.initialize(owner,2,-1); try { alg.initializeUpdate(); fail("Exception should have been thrown"); } catch( OptimizationException ignore){} }
/** * Creates a sparse trust region optimization using cauchy steps. * * @see UnconLeastSqTrustRegion_F64 * * @param config Trust region configuration * @return The new optimization routine */ public static UnconstrainedLeastSquares<DMatrixSparseCSC> cauchy( @Nullable ConfigTrustRegion config ) { if( config == null ) config = new ConfigTrustRegion(); HessianLeastSquares_DSCC hessian = new HessianLeastSquares_DSCC(); MatrixMath_DSCC math = new MatrixMath_DSCC(); TrustRegionUpdateCauchy_F64<DMatrixSparseCSC> update = new TrustRegionUpdateCauchy_F64<>(); UnconLeastSqTrustRegion_F64<DMatrixSparseCSC> alg = new UnconLeastSqTrustRegion_F64<>(update,hessian,math); alg.configure(config); return alg; }
/** * Creates a dense trust region least-squares optimization using cauchy steps. * * @see UnconLeastSqTrustRegion_F64 * * @param config Trust region configuration * @return The new optimization routine */ public static UnconstrainedLeastSquares<DMatrixRMaj> cauchy( @Nullable ConfigTrustRegion config ) { if( config == null ) config = new ConfigTrustRegion(); HessianLeastSquares_DDRM hessian = new HessianLeastSquares_DDRM(); MatrixMath_DDRM math = new MatrixMath_DDRM(); TrustRegionUpdateCauchy_F64<DMatrixRMaj> update = new TrustRegionUpdateCauchy_F64<>(); UnconLeastSqTrustRegion_F64<DMatrixRMaj> alg = new UnconLeastSqTrustRegion_F64<>(update,hessian,math); alg.configure(config); return alg; }
@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; }
protected UnconLeastSqTrustRegion_F64<DMatrixRMaj> createAlg() { TrustRegionUpdateCauchy_F64<DMatrixRMaj> update = new TrustRegionUpdateCauchy_F64<>(); HessianLeastSquares_DDRM hessian = new HessianLeastSquares_DDRM(); MatrixMath_DDRM math = new MatrixMath_DDRM(); return new UnconLeastSqTrustRegion_F64<>(update,hessian,math); }
@Override protected UnconstrainedLeastSquares<DMatrixRMaj> createSearch(double minimumValue) { ConfigTrustRegion config = new ConfigTrustRegion(); TrustRegionUpdateCauchy_F64<DMatrixRMaj> cauchy = new TrustRegionUpdateCauchy_F64<>(); UnconLeastSqTrustRegion_F64<DMatrixRMaj> tr = new UnconLeastSqTrustRegion_F64<>( cauchy, new HessianLeastSquares_DDRM(),new MatrixMath_DDRM()); tr.configure(config); return tr; } }
@Override protected UnconstrainedLeastSquares<DMatrixSparseCSC> createSearch(double minimumValue) { ConfigTrustRegion config = new ConfigTrustRegion(); TrustRegionUpdateCauchy_F64<DMatrixSparseCSC> cauchy = new TrustRegionUpdateCauchy_F64<>(); UnconLeastSqTrustRegion_F64<DMatrixSparseCSC> tr = new UnconLeastSqTrustRegion_F64<>( cauchy, new HessianLeastSquares_DSCC(),new MatrixMath_DSCC()); tr.configure(config); return tr; } }
@Override protected UnconstrainedLeastSquares<DMatrixRMaj> createSearch(double minimumValue) { ConfigTrustRegion config = new ConfigTrustRegion(); config.hessianScaling = true; TrustRegionUpdateCauchy_F64<DMatrixRMaj> cauchy = new TrustRegionUpdateCauchy_F64<>(); UnconLeastSqTrustRegion_F64<DMatrixRMaj> tr = new UnconLeastSqTrustRegion_F64<>( cauchy, new HessianLeastSquares_DDRM(),new MatrixMath_DDRM()); tr.configure(config); return tr; }