def test_bundle_method_on_analytical_example(): print('# Test Bundle Method on Analytical Example (2 ineq)') # see definition of AnalyticalExampleInnerProblem for problem and solution statement analytical_inner_problem = AnalyticalExampleInnerProblem() dual_method = BundleMethod(analytical_inner_problem.oracle, analytical_inner_problem.projection_function, dimension=analytical_inner_problem.dimension, epsilon=0.01, sense='max') dual_method.set_dual_domain(type='positive orthant', param=0.5) logger = EnhancedDualMethodLogger(dual_method) for iteration in range(10): # print(dual_method.lambda_k) # print(dual_method.d_k) dual_method.dual_step() # Method should end close to lambda* = [1, [1-1.5]] # np.testing.assert_allclose(logger.lambda_k_iterates[-1], np.array([1, 1.5]), atol=0.01) lambda_star = logger.lambda_k_iterates[-1] assert abs(lambda_star[0] - 1) <= 0.01 assert lambda_star[1] >= 0.99 assert lambda_star[1] <= 1.51 # with value close to dual optimum d*=-1 np.testing.assert_allclose(logger.d_k_iterates[-1], -0.5, atol=0.02)
def test_averaged_UFGM_on_analytical_example(): print('# Test Averaged UFGM on Analytical Example') # see definition of AnalyticalExampleInnerProblem for problem and solution statement analytical_inner_problem = AnalyticalExampleInnerProblem() dual_method = UniversalFGM(analytical_inner_problem.oracle, analytical_inner_problem.projection_function, dimension=analytical_inner_problem.dimension, epsilon=0.1, averaging=False) logger = GenericDualMethodLogger(dual_method) for iteration in range(40): # print(dual_method.lambda_k) # print dual_method.d_k dual_method.dual_step() # Method should end close to lambda* np.testing.assert_allclose(logger.lambda_k_iterates[-1], np.array([1., 1.]), rtol=1e-1, atol=0) # with value close to dual optimum np.testing.assert_allclose(logger.d_k_iterates[-1], -0.5, rtol=1e-1, atol=0)
def test_averaged_UPGM_on_analytical_example(): print('# Test averaged UPGM on Analytical Example') # see definition of AnalyticalExampleInnerProblem for problem and solution statement analytical_inner_problem = AnalyticalExampleInnerProblem() dual_method = UniversalPGM(analytical_inner_problem.oracle, analytical_inner_problem.projection_function, dimension=analytical_inner_problem.dimension, epsilon=0.01, averaging=True) logger = GenericDualMethodLogger(dual_method) for iteration in range(50): # print(dual_method.S_k) # print(dual_method.lambda_k) # print(dual_method.d_k) dual_method.dual_step() # When averaging is turned on, method is much slower. Method should end close to lambda* but get to about [0.3, 0.7] np.testing.assert_allclose(logger.lambda_k_iterates[-1], np.array([0.3, 0.7]), atol=0.1) # should be close to optimal value (-0.5) but is at -0.8 np.testing.assert_allclose(logger.d_k_iterates[-1], -0.8, atol=0.1)
def test_DSA_on_analytical_example(): print('# Test Double Simple Averaging Method on Analytical Example') # see definition of AnalyticalExampleInnerProblem for problem and solution statement analytical_inner_problem = AnalyticalExampleInnerProblem() # it looks like lower gammas give faster convergence, but more oscillations GAMMA = 0.5 dual_method = SGMDoubleSimpleAveraging( analytical_inner_problem.oracle, analytical_inner_problem.projection_function, dimension=analytical_inner_problem.dimension, gamma=GAMMA, sense='max') logger = GenericDualMethodLogger(dual_method) for iteration in range(20): # print dual_method.lambda_k # print dual_method.d_k dual_method.dual_step() # Method should end close to lambda* # np.testing.assert_allclose(logger.lambda_k_iterates[-1], np.array([1., 1.]), rtol=1e-1, atol=0) assert 0.95 <= logger.lambda_k_iterates[-1][ 0] <= 1.05 # first coordinate should be ~1.0 assert 0.95 <= logger.lambda_k_iterates[-1][ 1] <= 1.55 # second coordinate should be 1.0 <= coord <= 1.5 # with value close to dual optimum np.testing.assert_allclose(logger.d_k_iterates[-1], -0.5, rtol=1e-1, atol=0)