/
equality-constrained.jl
123 lines (121 loc) · 2.96 KB
/
equality-constrained.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
export equality_constrained_nls
function equality_constrained_nls_set(;kwargs...)
n = 10
return [
ADNLSModel(
x -> [x[1] - 1],
[-1.2; 1.0],
1,
x -> [10 * (x[2] - x[1]^2)],
zeros(1),
zeros(1),
name = "HS6";
kwargs...,
),
ADNLSModel(
x -> [x[1] - 1; 10 * (x[2] - x[1]^2)],
[-1.2; 1.0],
2,
x -> [(x[1] - 2)^2 + (x[2] - 2)^2 - 2],
zeros(1),
zeros(1),
name = "Rosenbrock with (x₁-2)²+(x₂-2)²=2";
kwargs...,
),
ADNLSModel(
x -> [x[1] - 1; 10 * (x[2] - x[1]^2)],
[-1.2; 1.0],
2,
x -> [sum(x) - 2],
zeros(1),
zeros(1),
name = "Rosenbrock with ∑x = 2";
kwargs...,
),
ADNLSModel(
x -> [x[1] - 1; x[2] - 1],
-ones(2),
2,
x -> [sum(x) - 2],
zeros(1),
zeros(1),
name = "linear residual and linear constraints";
kwargs...,
),
ADNLSModel(
x -> [x[1] - 1; x[2] - 1],
-ones(2),
2,
x -> [sum(x .^ 2) - 2; x[2] - x[1]^2],
zeros(2),
zeros(2),
name = "linear residual and quad constraints";
kwargs...,
),
ADNLSModel(
x -> [x[1] - x[i] for i = 2:n],
[1.0j for j = 1:n] / n,
n - 1,
x -> [sum(x) - n],
zeros(1),
zeros(1),
name = "F_under and linear constraints";
kwargs...,
),
ADNLSModel(
x -> [x[1] - x[i] for i = 2:n],
[1.0j for j = 1:n] / n,
n - 1,
x -> [sum(x .^ 2) - n; prod(x) - 1],
zeros(2),
zeros(2),
name = "F_under and quad constraints";
kwargs...,
),
ADNLSModel(
x -> [[10 * (x[i + 1] - x[i]^2) for i = 1:(n - 1)]; [x[i] - 1 for i = 1:(n - 1)]],
0.9 * ones(n),
2(n - 1),
x -> [sum(x) - n],
zeros(1),
zeros(1),
name = "F_larger and linear constraints";
kwargs...,
),
ADNLSModel(
x -> [[10 * (x[i + 1] - x[i]^2) for i = 1:(n - 1)]; [x[i] - 1 for i = 1:(n - 1)]],
0.9 * ones(n),
2(n - 1),
x -> [sum(x .^ 2) - n; prod(x) - 1],
zeros(2),
zeros(2),
name = "F_larger and quad constraints";
kwargs...,
),
]
end
"""
equality_constrained_nls(solver; problem_set = equality_constrained_nls_set(), atol = 1e-6, rtol = 1e-6)
Test the `solver` on equality-constrained problems.
If `rtol` is non-zero, the relative error uses the gradient at the initial guess.
"""
function equality_constrained_nls(
solver;
problem_set = equality_constrained_nls_set(),
atol = 1e-6,
rtol = 1e-6,
)
@testset "Problem $(nls.meta.name)" for nls in problem_set
stats = with_logger(NullLogger()) do
solver(nls)
end
ng0 = rtol != 0 ? norm(grad(nls, nls.meta.x0)) : 0
ϵ = atol + rtol * ng0
primal, dual = kkt_checker(nls, stats.solution)
@test all(abs.(dual) .< ϵ)
@test all(abs.(primal) .< ϵ)
@test stats.dual_feas < ϵ
@test stats.primal_feas < ϵ
@test stats.status == :first_order
end
end