示例#1
0
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)
示例#2
0
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)