From caed8c2b20041793db37cbbf33fb039be999a327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 22 Sep 2021 16:56:02 -0400 Subject: [PATCH 1/2] Allow skipping NLPBlockDual --- src/Test/test_nonlinear.jl | 41 ++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/Test/test_nonlinear.jl b/src/Test/test_nonlinear.jl index 626bd8cc58..6f4ecf0f1e 100644 --- a/src/Test/test_nonlinear.jl +++ b/src/Test/test_nonlinear.jl @@ -469,26 +469,29 @@ function test_nonlinear_hs071_NLPBlockDual(model::MOI.ModelLike, config::Config) # Get primal solution x = MOI.get(model, MOI.VariablePrimal(), v) # Get dual solution - con_dual = MOI.get(model, MOI.NLPBlockDual()) - var_dual_lb = MOI.get(model, MOI.ConstraintDual(), cl) - var_dual_ub = MOI.get(model, MOI.ConstraintDual(), cu) - - # Evaluate ∇f(x) - g = zeros(n_variables) - MOI.eval_objective_gradient(evaluator, g, x) - # Evaluate ∑ μᵢ * ∇cᵢ(x) - jtv = zeros(n_variables) - MOI.eval_constraint_jacobian_transpose_product( - evaluator, - jtv, - x, - con_dual, - ) + if _supports(config, MOI.BLPBlockDual) && + _supports(config, MOI.ConstraintStatus) + con_dual = MOI.get(model, MOI.NLPBlockDual()) + var_dual_lb = MOI.get(model, MOI.ConstraintDual(), cl) + var_dual_ub = MOI.get(model, MOI.ConstraintDual(), cu) + + # Evaluate ∇f(x) + g = zeros(n_variables) + MOI.eval_objective_gradient(evaluator, g, x) + # Evaluate ∑ μᵢ * ∇cᵢ(x) + jtv = zeros(n_variables) + MOI.eval_constraint_jacobian_transpose_product( + evaluator, + jtv, + x, + con_dual, + ) - # Test that (x, μ, νl, νᵤ) satisfies stationarity condition - # σ ∇f(x) - ∑ μᵢ * ∇cᵢ(x) - νₗ - νᵤ = 0 - σ = (sense == MOI.MAX_SENSE) ? -1.0 : 1.0 - @test isapprox(σ .* g, jtv .+ var_dual_ub .+ var_dual_lb, config) + # Test that (x, μ, νl, νᵤ) satisfies stationarity condition + # σ ∇f(x) - ∑ μᵢ * ∇cᵢ(x) - νₗ - νᵤ = 0 + σ = (sense == MOI.MAX_SENSE) ? -1.0 : 1.0 + @test isapprox(σ .* g, jtv .+ var_dual_ub .+ var_dual_lb, config) + end end return end From e9eef6e01cb33d39f2828d2b9fa83e41dea522b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 22 Sep 2021 17:55:51 -0400 Subject: [PATCH 2/2] Use requires instead --- src/Test/test_nonlinear.jl | 42 ++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/Test/test_nonlinear.jl b/src/Test/test_nonlinear.jl index 6f4ecf0f1e..71b7bcb9bc 100644 --- a/src/Test/test_nonlinear.jl +++ b/src/Test/test_nonlinear.jl @@ -450,6 +450,7 @@ function test_nonlinear_hs071_NLPBlockDual(model::MOI.ModelLike, config::Config) @requires MOI.supports(model, MOI.NLPBlock()) @requires _supports(config, MOI.optimize!) @requires MOI.supports(model, MOI.VariablePrimalStart(), MOI.VariableIndex) + @requires _supports(config, MOI.NLPBlockDual) n_variables = 4 v = MOI.add_variables(model, n_variables) l = [1.1, 1.2, 1.3, 1.4] @@ -469,29 +470,26 @@ function test_nonlinear_hs071_NLPBlockDual(model::MOI.ModelLike, config::Config) # Get primal solution x = MOI.get(model, MOI.VariablePrimal(), v) # Get dual solution - if _supports(config, MOI.BLPBlockDual) && - _supports(config, MOI.ConstraintStatus) - con_dual = MOI.get(model, MOI.NLPBlockDual()) - var_dual_lb = MOI.get(model, MOI.ConstraintDual(), cl) - var_dual_ub = MOI.get(model, MOI.ConstraintDual(), cu) - - # Evaluate ∇f(x) - g = zeros(n_variables) - MOI.eval_objective_gradient(evaluator, g, x) - # Evaluate ∑ μᵢ * ∇cᵢ(x) - jtv = zeros(n_variables) - MOI.eval_constraint_jacobian_transpose_product( - evaluator, - jtv, - x, - con_dual, - ) + con_dual = MOI.get(model, MOI.NLPBlockDual()) + var_dual_lb = MOI.get(model, MOI.ConstraintDual(), cl) + var_dual_ub = MOI.get(model, MOI.ConstraintDual(), cu) + + # Evaluate ∇f(x) + g = zeros(n_variables) + MOI.eval_objective_gradient(evaluator, g, x) + # Evaluate ∑ μᵢ * ∇cᵢ(x) + jtv = zeros(n_variables) + MOI.eval_constraint_jacobian_transpose_product( + evaluator, + jtv, + x, + con_dual, + ) - # Test that (x, μ, νl, νᵤ) satisfies stationarity condition - # σ ∇f(x) - ∑ μᵢ * ∇cᵢ(x) - νₗ - νᵤ = 0 - σ = (sense == MOI.MAX_SENSE) ? -1.0 : 1.0 - @test isapprox(σ .* g, jtv .+ var_dual_ub .+ var_dual_lb, config) - end + # Test that (x, μ, νl, νᵤ) satisfies stationarity condition + # σ ∇f(x) - ∑ μᵢ * ∇cᵢ(x) - νₗ - νᵤ = 0 + σ = (sense == MOI.MAX_SENSE) ? -1.0 : 1.0 + @test isapprox(σ .* g, jtv .+ var_dual_ub .+ var_dual_lb, config) end return end