コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
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)
コード例 #4
0
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)