@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 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){} }
@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); }