|
1 | 1 | @testset "SlackModel NLP tests" begin |
2 | 2 | @testset "API" for T in [Float64, Float32] |
3 | 3 | f(x) = (x[1] - 2)^2 + (x[2] - 1)^2 |
4 | | - ∇f(x) = [2 * (x[1] - 2); 2 * (x[2] - 1); 0] |
5 | | - H(x) = [2.0 0 0; 0 2.0 0; 0 0 0] |
6 | | - c(x) = [x[1] - 2x[2] + 1; -x[1]^2 / 4 - x[2]^2 + 1 - x[3]] |
7 | | - J(x) = [1.0 -2.0 0; -0.5x[1] -2.0x[2] -1] |
8 | | - H(x, y) = H(x) + y[2] * [-0.5 0 0; 0 -2.0 0; 0 0 0] |
| 4 | + ∇f(x) = T[2 * (x[1] - 2); 2 * (x[2] - 1); 0] |
| 5 | + H(x) = T[2.0 0 0; 0 2.0 0; 0 0 0] |
| 6 | + c(x) = T[x[1] - 2x[2] + 1; -x[1]^2 / 4 - x[2]^2 + 1 - x[3]] |
| 7 | + J(x) = T[1.0 -2.0 0; -0.5x[1] -2.0x[2] -1] |
| 8 | + H(x, y) = H(x) + y[2] * T[-0.5 0 0; 0 -2.0 0; 0 0 0] |
9 | 9 |
|
10 | 10 | nlp = SlackModel(SimpleNLPModel(T)) |
11 | 11 | n = nlp.meta.nvar |
12 | 12 | m = nlp.meta.ncon |
13 | 13 |
|
14 | | - x = randn(n) |
15 | | - y = randn(m) |
16 | | - v = randn(n) |
17 | | - w = randn(m) |
18 | | - Jv = zeros(m) |
19 | | - Jtw = zeros(n) |
20 | | - Hv = zeros(n) |
21 | | - Hvals = zeros(nlp.meta.nnzh) |
| 14 | + x = randn(T, n) |
| 15 | + y = randn(T, m) |
| 16 | + v = randn(T, n) |
| 17 | + w = randn(T, m) |
| 18 | + Jv = zeros(T, m) |
| 19 | + Jtw = zeros(T, n) |
| 20 | + Hv = zeros(T, n) |
| 21 | + Hvals = zeros(T, nlp.meta.nnzh) |
22 | 22 |
|
23 | 23 | # Basic methods |
24 | 24 | @test obj(nlp, x) ≈ f(x) |
|
52 | 52 | Jop = jac_op!(nlp, x, Jv, Jtw) |
53 | 53 | @test Jop * v ≈ J(x) * v |
54 | 54 | @test Jop' * w ≈ J(x)' * w |
| 55 | + res = J(x) * v - w |
| 56 | + @test mul!(w, Jop, v, one(T), -one(T)) ≈ res |
| 57 | + res = J(x)' * w - v |
| 58 | + @test mul!(v, Jop', w, one(T), -one(T)) ≈ res |
55 | 59 | Jop = jac_op!(nlp, jac_structure(nlp)..., jac_coord(nlp, x), Jv, Jtw) |
56 | 60 | @test Jop * v ≈ J(x) * v |
57 | 61 | @test Jop' * w ≈ J(x)' * w |
| 62 | + res = J(x) * v - w |
| 63 | + @test mul!(w, Jop, v, one(T), -one(T)) ≈ res |
| 64 | + res = J(x)' * w - v |
| 65 | + @test mul!(v, Jop', w, one(T), -one(T)) ≈ res |
58 | 66 | Jop = jac_op!(nlp, x, jac_structure(nlp)..., Jv, Jtw) |
59 | 67 | @test Jop * v ≈ J(x) * v |
60 | 68 | @test Jop' * w ≈ J(x)' * w |
61 | | - ghjv = zeros(m) |
| 69 | + ghjv = zeros(T, m) |
62 | 70 | for j = 1:m |
63 | | - eⱼ = [i == j ? 1.0 : 0.0 for i = 1:m] |
| 71 | + eⱼ = [i == j ? one(T) : zero(T) for i = 1:m] |
64 | 72 | Cⱼ(x) = H(x, eⱼ) - H(x) |
65 | 73 | ghjv[j] = dot(gx, Cⱼ(x) * v) |
66 | 74 | end |
|
73 | 81 | @test Hop * v ≈ H(x) * v |
74 | 82 | Hop = hess_op!(nlp, x, Hv) |
75 | 83 | @test Hop * v ≈ H(x) * v |
| 84 | + z = ones(T, nlp.meta.nvar) |
| 85 | + res = H(x) * v - z |
| 86 | + @test mul!(z, Hop, v, one(T), -one(T)) ≈ res |
76 | 87 | Hop = hess_op!(nlp, hess_structure(nlp)..., hess_coord(nlp, x), Hv) |
77 | 88 | @test Hop * v ≈ H(x) * v |
| 89 | + res = H(x) * v - z |
| 90 | + @test mul!(z, Hop, v, one(T), -one(T)) ≈ res |
78 | 91 | Hop = hess_op!(nlp, x, hess_structure(nlp)..., Hv) |
79 | 92 | @test Hop * v ≈ H(x) * v |
80 | 93 | Hop = hess_op(nlp, x, y) |
81 | 94 | @test Hop * v ≈ H(x, y) * v |
82 | 95 | Hop = hess_op!(nlp, x, y, Hv) |
83 | 96 | @test Hop * v ≈ H(x, y) * v |
| 97 | + res = H(x, y) * v - z |
| 98 | + @test mul!(z, Hop, v, one(T), -one(T)) ≈ res |
84 | 99 | Hop = hess_op!(nlp, hess_structure(nlp)..., hess_coord(nlp, x, y), Hv) |
85 | 100 | @test Hop * v ≈ H(x, y) * v |
86 | 101 | Hop = hess_op!(nlp, x, y, hess_structure(nlp)..., Hv) |
|
0 commit comments