def test_cp_method_on_third_analytical_example(): print('# Test Cutting Plane Method on Constrained Dual Analytical Example') # see definition of AnalyticalExampleInnerProblem for problem and solution statement analytical_inner_problem = ConstrainedDualAnalyticalExampleInnerProblem() dual_method = CuttingPlanesMethod(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='sum to param', param=0.5) dual_method.lambda_k = dual_method.projection_function(np.array([-2,2])) logger = EnhancedDualMethodLogger(dual_method) for iteration in range(5): # print(dual_method.lambda_k) # print(dual_method.d_k) dual_method.dual_step() # Method should end close to lambda*, where lambda*[1] = 0.5 - lambda*[0], and 0<= lambda*[0] <= 0.5 lambda_star = logger.lambda_k_iterates[-1] assert 0 <= lambda_star[0] <= 0.5 assert lambda_star[1] == 0.5 - lambda_star[0] # with value close to dual optimum np.testing.assert_allclose(logger.d_k_iterates[-1], -1.0, atol=0.01)
def test_UPGM_on_third_analytical_example_non_zero_start(): print( '# Test UPGM on Third Analytical Example (constrained dual). Start at NON-0.' ) # see definition of AnalyticalExampleInnerProblem for problem and solution statement analytical_inner_problem = ConstrainedDualAnalyticalExampleInnerProblem() dual_method = UniversalPGM(analytical_inner_problem.oracle, analytical_inner_problem.projection_function, dimension=analytical_inner_problem.dimension) # we set the initial point somewhere not 0 dual_method.lambda_hat_k = dual_method.projection_function( np.array([-2, 2])) logger = GenericDualMethodLogger(dual_method) for iteration in range(5): # print(dual_method.lambda_k) # print(dual_method.lambda_tilde_k) # print(dual_method.d_k) dual_method.dual_step() # Method should end close to lambda*, where lambda*[1] = 0.5 - lambda*[0], and 0<= lambda*[0] <= 0.5 lambda_star = logger.lambda_k_iterates[-1] # print(lambda_star) assert 0 <= lambda_star[0] <= 0.5 assert lambda_star[1] == 0.5 - lambda_star[0] # with value close to dual optimum np.testing.assert_allclose(logger.d_k_iterates[-1], -1.0, atol=0.01)