google-research
157 строк · 5.8 Кб
1import FirstOrderLp, Plots, CSV
2using LaTeXStrings, DataFrames, Test
3include("../src/PrimalDualMethods.jl")
4
5simple_lp1 = FirstOrderLp.linear_programming_problem(
6[-Inf], # variable_lower_bound
7[Inf], # variable_upper_bound
8[0.0], # objective_vector
90.0, # objective_constant
10ones(1, 1), # constraint_matrix
11[0.0], # right_hand_side
121, # num_equalities
13)
14simple_lp2 = FirstOrderLp.linear_programming_problem(
15[0.0, 0.0], # variable_lower_bound
16[Inf, Inf], # variable_upper_bound
17[2.0, 1.0], # objective_vector
180.0, # objective_constant
19ones(1, 2), # constraint_matrix
20[1.0], # right_hand_side
211, # num_equalities
22)
23
24A = [
25-1.03324 -0.449087 0.322969 1.36308 1.46373 -1.63236
26-0.326885 0.471807 1.73327 -0.505794 0.543352 -1.2965
27]
28lp1_primal_optimal_solution = [0.0; 0.0; 0.0; 0.0; 1.0; 1.0]
29b = A * lp1_primal_optimal_solution
30lp1 = FirstOrderLp.linear_programming_problem(
31zeros(6), # variable_lower_bound
32Inf * ones(6), # variable_upper_bound
33[10.0, 10.0, 10.0, 10.0, 1.0, 1.0], # objective_vector
340.0, # objective_constant
35A, # constraint_matrix
36b, # right_hand_side
372, # num_equalities
38)
39
40A_B = A[:, end-1:end]
41lp1_dual_optimal_solution = A_B' \ lp1.objective_vector[end-1:end]
42
43restart_length = 25
44
45for method_name in ["PDHG", "extragradient", "ADMM"]
46@testset "$method_name" begin
47for primal_weight in [1.0, 2.0]
48@testset "primal_weight=$primal_weight" begin
49params = PrimalDualOptimizerParameters(
50RecoverPrimalDualMethodFromString(method_name), # method
510.2, # step_size
52primal_weight, # primal_weight
531, # record every
5420, # printing frequency
55false, # verbose
562000, # iteration limit
57NoRestarts(), # restart scheme
58nothing,
591e-8,
60)
61
62##############
63# simple lp1 #
64##############
65# No restarts
66solver_output = optimize(params, simple_lp1, [1.0], [1.0])
67@test norm(solver_output.primal_solution) < 1e-7
68@test norm(solver_output.dual_solution) < 1e-7
69@test solver_output.status == STATUS_OPTIMAL
70@test solver_output.iteration_stats.iteration[end] < 1500
71
72# Fixed frequency restarts
73params.restart_scheme = FixedFrequencyRestarts(restart_length, true)
74solver_output = optimize(params, simple_lp1, [1.0], [1.0])
75@test norm(solver_output.primal_solution) < 1e-7
76@test norm(solver_output.dual_solution) < 1e-7
77@test solver_output.status == STATUS_OPTIMAL
78@test solver_output.iteration_stats.iteration[end] < 600
79
80# Adaptive restarts
81params.restart_scheme = AdaptiveRestarts(exp(-1), true)
82solver_output = optimize(params, simple_lp1, [1.0], [1.0])
83@test norm(solver_output.primal_solution) < 1e-7
84@test norm(solver_output.dual_solution) < 1e-7
85@test solver_output.status == STATUS_OPTIMAL
86@test solver_output.iteration_stats.iteration[end] < 600
87
88# Adaptive restarts
89params.restart_scheme = AdaptiveRestarts(exp(-1), false)
90solver_output = optimize(params, simple_lp1, [1.0], [1.0])
91@test norm(solver_output.primal_solution) < 1e-7
92@test norm(solver_output.dual_solution) < 1e-7
93@test solver_output.status == STATUS_OPTIMAL
94@test solver_output.iteration_stats.iteration[end] < 600
95
96##############
97# simple lp2 #
98##############
99# No restarts
100solver_output = optimize(params, simple_lp2)
101@test norm(solver_output.primal_solution - [0.0, 1.0]) < 1e-3
102@test norm(solver_output.dual_solution - [1.0]) < 1e-3
103@test solver_output.status == STATUS_OPTIMAL
104
105# Fixed frequency restarts
106params.restart_scheme = FixedFrequencyRestarts(restart_length, true)
107solver_output = optimize(params, simple_lp2)
108@test norm(solver_output.primal_solution - [0.0, 1.0]) < 1e-7
109@test norm(solver_output.dual_solution - [1.0]) < 1e-7
110@test solver_output.status == STATUS_OPTIMAL
111
112# Adaptive restarts
113params.restart_scheme = AdaptiveRestarts(exp(-1), true)
114solver_output = optimize(params, simple_lp2)
115@test norm(solver_output.primal_solution - [0.0, 1.0]) < 1e-7
116@test norm(solver_output.dual_solution - [1.0]) < 1e-7
117@test solver_output.status == STATUS_OPTIMAL
118
119#######
120# lp1 #
121#######
122# No restarts
123params.kkt_tolerance = 1e-6
124params.restart_scheme = NoRestarts()
125solver_output = optimize(params, lp1)
126@test norm(
127solver_output.primal_solution - lp1_primal_optimal_solution,
128) < 1e-2
129@test norm(solver_output.dual_solution - lp1_dual_optimal_solution) <
1301e-2
131# PDHG with NoRestarts hits the termination limit, so we have a
132# larger tolerance on the primal and dual solutions, and don't test
133# status.
134
135# Fixed frequency restarts
136params.restart_scheme = FixedFrequencyRestarts(restart_length, true)
137solver_output = optimize(params, lp1)
138@test norm(
139solver_output.primal_solution - lp1_primal_optimal_solution,
140) < 1e-5
141@test norm(solver_output.dual_solution - lp1_dual_optimal_solution) <
1421e-5
143@test solver_output.status == STATUS_OPTIMAL
144
145# Adaptive restarts
146params.restart_scheme = AdaptiveRestarts(exp(-1), true)
147solver_output = optimize(params, lp1)
148@test norm(
149solver_output.primal_solution - lp1_primal_optimal_solution,
150) < 1e-5
151@test norm(solver_output.dual_solution - lp1_dual_optimal_solution) <
1521e-5
153@test solver_output.status == STATUS_OPTIMAL
154end
155end
156end
157end
158