|
| 1 | +using OptimizationNLPModels, Optimization, NLPModelsTest, Ipopt, OptimizationMOI, Zygote, |
| 2 | + OptimizationOptimJL |
| 3 | +using Test |
| 4 | + |
| 5 | +@testset "NLPModels" begin |
| 6 | + # First problem: Problem 5 in the Hock-Schittkowski suite |
| 7 | + # https://jso.dev/NLPModelsTest.jl/dev/reference/#NLPModelsTest.HS5 |
| 8 | + # Problem with box bounds |
| 9 | + hs5f(u, p) = sin(u[1] + u[2]) + (u[1] - u[2])^2 - (3 / 2) * u[1] + (5 / 2)u[2] + 1 |
| 10 | + f = Optimization.OptimizationFunction(hs5f, Optimization.AutoZygote()) |
| 11 | + lb = [-1.5; -3] |
| 12 | + ub = [4.0; 3.0] |
| 13 | + u0 = [0.0; 0.0] |
| 14 | + oprob = Optimization.OptimizationProblem( |
| 15 | + f, u0, lb = lb, ub = ub, sense = Optimization.MinSense) |
| 16 | + |
| 17 | + nlpmo = NLPModelsTest.HS5() |
| 18 | + converted = OptimizationNLPModels.OptimizationProblem(nlpmo, Optimization.AutoZygote()) |
| 19 | + |
| 20 | + sol_native = solve(oprob, Optimization.LBFGS(), maxiters = 1000) |
| 21 | + sol_converted = solve(converted, Optimization.LBFGS(), maxiters = 1000) |
| 22 | + |
| 23 | + @test sol_converted.retcode == sol_native.retcode |
| 24 | + @test sol_converted.u ≈ sol_native.u |
| 25 | + |
| 26 | + # Second problem: Brown and Dennis function |
| 27 | + # https://jso.dev/NLPModelsTest.jl/dev/reference/#NLPModelsTest.BROWNDEN |
| 28 | + # Problem without bounds |
| 29 | + function brown_dennis(u, p) |
| 30 | + return sum([((u[1] + (i / 5) * u[2] - exp(i / 5))^2 + |
| 31 | + (u[3] + sin(i / 5) * u[4] - cos(i / 5))^2)^2 for i in 1:20]) |
| 32 | + end |
| 33 | + f = Optimization.OptimizationFunction(brown_dennis, Optimization.AutoZygote()) |
| 34 | + u0 = [25.0; 5.0; -5.0; -1.0] |
| 35 | + oprob = Optimization.OptimizationProblem(f, u0, sense = Optimization.MinSense) |
| 36 | + |
| 37 | + nlpmo = NLPModelsTest.BROWNDEN() |
| 38 | + converted = OptimizationNLPModels.OptimizationProblem(nlpmo, Optimization.AutoZygote()) |
| 39 | + |
| 40 | + sol_native = solve(oprob, BFGS()) |
| 41 | + sol_converted = solve(converted, BFGS()) |
| 42 | + |
| 43 | + @test sol_converted.retcode == sol_native.retcode |
| 44 | + @test sol_converted.u ≈ sol_native.u |
| 45 | + |
| 46 | + # Third problem: Problem 10 in the Hock-Schittkowski suite |
| 47 | + # https://jso.dev/NLPModelsTest.jl/dev/reference/#NLPModelsTest.HS10 |
| 48 | + # Problem with inequality bounds |
| 49 | + hs10(u, p) = u[1] - u[2] |
| 50 | + hs10_cons(res, u, p) = (res .= -3.0 * u[1]^2 + 2.0 * u[1] * u[2] - u[2]^2 + 1.0) |
| 51 | + lcons = [0.0] |
| 52 | + ucons = [Inf] |
| 53 | + u0 = [-10.0; 10.0] |
| 54 | + f = Optimization.OptimizationFunction( |
| 55 | + hs10, Optimization.AutoForwardDiff(); cons = hs10_cons) |
| 56 | + oprob = Optimization.OptimizationProblem( |
| 57 | + f, u0, lcons = lcons, ucons = ucons, sense = Optimization.MinSense) |
| 58 | + |
| 59 | + nlpmo = NLPModelsTest.HS10() |
| 60 | + converted = OptimizationNLPModels.OptimizationProblem( |
| 61 | + nlpmo, Optimization.AutoForwardDiff()) |
| 62 | + |
| 63 | + sol_native = solve(oprob, Ipopt.Optimizer()) |
| 64 | + sol_converted = solve(converted, Ipopt.Optimizer()) |
| 65 | + |
| 66 | + @test sol_converted.retcode == sol_native.retcode |
| 67 | + @test sol_converted.u ≈ sol_native.u |
| 68 | + |
| 69 | + # Fourth problem: Problem 13 in the Hock-Schittkowski suite |
| 70 | + # https://jso.dev/NLPModelsTest.jl/dev/reference/#NLPModelsTest.HS13 |
| 71 | + # Problem with box & inequality bounds |
| 72 | + hs13(u, p) = (u[1] - 2.0)^2 + u[2]^2 |
| 73 | + hs13_cons(res, u, p) = (res .= (1.0 - u[1])^3 - u[2]) |
| 74 | + lcons = [0.0] |
| 75 | + ucons = [Inf] |
| 76 | + lb = [0.0; 0.0] |
| 77 | + ub = [Inf; Inf] |
| 78 | + u0 = [-2.0; -2.0] |
| 79 | + f = Optimization.OptimizationFunction( |
| 80 | + hs13, Optimization.AutoForwardDiff(); cons = hs13_cons) |
| 81 | + oprob = Optimization.OptimizationProblem(f, u0, lb = lb, ub = ub, lcons = lcons, |
| 82 | + ucons = ucons, sense = Optimization.MinSense) |
| 83 | + |
| 84 | + nlpmo = NLPModelsTest.HS13() |
| 85 | + converted = OptimizationNLPModels.OptimizationProblem( |
| 86 | + nlpmo, Optimization.AutoForwardDiff()) |
| 87 | + |
| 88 | + sol_native = solve(oprob, Ipopt.Optimizer()) |
| 89 | + sol_converted = solve(converted, Ipopt.Optimizer()) |
| 90 | + |
| 91 | + @test sol_converted.retcode == sol_native.retcode |
| 92 | + @test sol_converted.u ≈ sol_native.u |
| 93 | + |
| 94 | + # Fifth problem: Problem 14 in the Hock-Schittkowski suite |
| 95 | + # https://jso.dev/NLPModelsTest.jl/dev/reference/#NLPModelsTest.HS14 |
| 96 | + # Problem with mixed equality & inequality constraints |
| 97 | + hs14(u, p) = (u[1] - 2.0)^2 + (u[2] - 1.0)^2 |
| 98 | + hs14_cons(res, u, p) = (res .= [u[1] - 2.0 * u[2]; |
| 99 | + -0.25 * u[1]^2 - u[2]^2 + 1.0]) |
| 100 | + lcons = [-1.0; 0.0] |
| 101 | + ucons = [-1.0; Inf] |
| 102 | + u0 = [2.0; 2.0] |
| 103 | + f = Optimization.OptimizationFunction( |
| 104 | + hs14, Optimization.AutoForwardDiff(); cons = hs14_cons) |
| 105 | + oprob = Optimization.OptimizationProblem( |
| 106 | + f, u0, lcons = lcons, ucons = ucons, sense = Optimization.MinSense) |
| 107 | + |
| 108 | + nlpmo = NLPModelsTest.HS14() |
| 109 | + converted = OptimizationNLPModels.OptimizationProblem( |
| 110 | + nlpmo, Optimization.AutoForwardDiff()) |
| 111 | + |
| 112 | + sol_native = solve(oprob, Ipopt.Optimizer()) |
| 113 | + sol_converted = solve(converted, Ipopt.Optimizer()) |
| 114 | + |
| 115 | + @test sol_converted.retcode == sol_native.retcode |
| 116 | + @test sol_converted.u ≈ sol_native.u |
| 117 | +end |
0 commit comments