@@ -2382,3 +2382,133 @@ function setup_test(
23822382end
23832383
23842384version_added (:: typeof (test_vector_nonlinear_oracle_no_hessian)) = v " 1.46.0"
2385+
2386+ function test_VectorNonlinearOracle_LagrangeMultipliers_MAX_SENSE (
2387+ model:: MOI.ModelLike ,
2388+ config:: MOI.Test.Config{T} ,
2389+ ) where {T}
2390+ @requires _supports (config, MOI. optimize!)
2391+ @requires _supports (config, MOI. ConstraintDual)
2392+ @requires _supports (config, MOI. LagrangeMultipliers)
2393+ @requires MOI. supports_constraint (
2394+ model,
2395+ MOI. VectorOfVariables,
2396+ MOI. VectorNonlinearOracle{T},
2397+ )
2398+ set = MOI. VectorNonlinearOracle (;
2399+ dimension = 2 ,
2400+ l = T[typemin (T)],
2401+ u = T[1 ],
2402+ eval_f = (ret, x) -> (ret[1 ] = x[1 ]^ 2 + x[2 ]^ 2 ),
2403+ jacobian_structure = [(1 , 1 ), (1 , 2 )],
2404+ eval_jacobian = (ret, x) -> ret .= T (2 ) .* x,
2405+ hessian_lagrangian_structure = [(1 , 1 ), (2 , 2 )],
2406+ eval_hessian_lagrangian = (ret, x, u) -> ret .= T (2 ) .* u[1 ],
2407+ )
2408+ x = MOI. add_variables (model, 2 )
2409+ MOI. set (model, MOI. ObjectiveSense (), MOI. MAX_SENSE)
2410+ f = one (T) * x[1 ] + one (T) * x[2 ]
2411+ MOI. set (model, MOI. ObjectiveFunction {typeof(f)} (), f)
2412+ c = MOI. add_constraint (model, MOI. VectorOfVariables (x), set)
2413+ MOI. optimize! (model)
2414+ y = T (1 ) / sqrt (T (2 ))
2415+ @test isapprox (MOI. get (model, MOI. VariablePrimal (), x), [y, y], config)
2416+ @test isapprox (MOI. get (model, MOI. ConstraintDual (), c), T[- 1 , - 1 ], config)
2417+ @test isapprox (MOI. get (model, MOI. LagrangeMultipliers (), c), T[- y])
2418+ return
2419+ end
2420+
2421+ function setup_test (
2422+ :: typeof (test_VectorNonlinearOracle_LagrangeMultipliers_MAX_SENSE),
2423+ model:: MOIU.MockOptimizer ,
2424+ config:: Config{T} ,
2425+ ) where {T}
2426+ F, S = MOI. VectorOfVariables, MOI. VectorNonlinearOracle{T}
2427+ y = T (1 ) / sqrt (T (2 ))
2428+ MOI. Utilities. set_mock_optimize! (
2429+ model,
2430+ mock -> begin
2431+ MOI. Utilities. mock_optimize! (
2432+ mock,
2433+ config. optimal_status,
2434+ T[y, y],
2435+ (F, S) => [T[- 1 , - 1 ]],
2436+ )
2437+ ci = only (MOI. get (mock, MOI. ListOfConstraintIndices {F,S} ()))
2438+ MOI. set (mock, MOI. LagrangeMultipliers (), ci, T[- y])
2439+ end ,
2440+ )
2441+ model. eval_variable_constraint_dual = false
2442+ return () -> model. eval_variable_constraint_dual = true
2443+ end
2444+
2445+ function version_added (
2446+ :: typeof (test_VectorNonlinearOracle_LagrangeMultipliers_MAX_SENSE),
2447+ )
2448+ return v " 1.47.0"
2449+ end
2450+
2451+ function test_VectorNonlinearOracle_LagrangeMultipliers_MIN_SENSE (
2452+ model:: MOI.ModelLike ,
2453+ config:: MOI.Test.Config{T} ,
2454+ ) where {T}
2455+ @requires _supports (config, MOI. optimize!)
2456+ @requires _supports (config, MOI. ConstraintDual)
2457+ @requires _supports (config, MOI. LagrangeMultipliers)
2458+ @requires MOI. supports_constraint (
2459+ model,
2460+ MOI. VectorOfVariables,
2461+ MOI. VectorNonlinearOracle{T},
2462+ )
2463+ set = MOI. VectorNonlinearOracle (;
2464+ dimension = 2 ,
2465+ l = T[- 1 ],
2466+ u = T[typemax (T)],
2467+ eval_f = (ret, x) -> (ret[1 ] = - x[1 ]^ 2 - x[2 ]^ 2 ),
2468+ jacobian_structure = [(1 , 1 ), (1 , 2 )],
2469+ eval_jacobian = (ret, x) -> ret .= - T (2 ) .* x,
2470+ hessian_lagrangian_structure = [(1 , 1 ), (2 , 2 )],
2471+ eval_hessian_lagrangian = (ret, x, u) -> ret .= - T (2 ) .* u[1 ],
2472+ )
2473+ x = MOI. add_variables (model, 2 )
2474+ MOI. set (model, MOI. ObjectiveSense (), MOI. MIN_SENSE)
2475+ f = one (T) * x[1 ] + one (T) * x[2 ]
2476+ MOI. set (model, MOI. ObjectiveFunction {typeof(f)} (), f)
2477+ c = MOI. add_constraint (model, MOI. VectorOfVariables (x), set)
2478+ MOI. optimize! (model)
2479+ y = T (1 ) / sqrt (T (2 ))
2480+ @test isapprox (MOI. get (model, MOI. VariablePrimal (), x), [- y, - y], config)
2481+ @test isapprox (MOI. get (model, MOI. ConstraintDual (), c), T[1 , 1 ], config)
2482+ @test isapprox (MOI. get (model, MOI. LagrangeMultipliers (), c), T[y])
2483+ return
2484+ end
2485+
2486+ function setup_test (
2487+ :: typeof (test_VectorNonlinearOracle_LagrangeMultipliers_MIN_SENSE),
2488+ model:: MOIU.MockOptimizer ,
2489+ config:: Config{T} ,
2490+ ) where {T}
2491+ F, S = MOI. VectorOfVariables, MOI. VectorNonlinearOracle{T}
2492+ y = T (1 ) / sqrt (T (2 ))
2493+ MOI. Utilities. set_mock_optimize! (
2494+ model,
2495+ mock -> begin
2496+ MOI. Utilities. mock_optimize! (
2497+ mock,
2498+ config. optimal_status,
2499+ T[- y, - y],
2500+ (F, S) => [T[1 , 1 ]],
2501+ )
2502+ ci = only (MOI. get (mock, MOI. ListOfConstraintIndices {F,S} ()))
2503+ MOI. set (mock, MOI. LagrangeMultipliers (), ci, T[y])
2504+ end ,
2505+ )
2506+ model. eval_variable_constraint_dual = false
2507+ return () -> model. eval_variable_constraint_dual = true
2508+ end
2509+
2510+ function version_added (
2511+ :: typeof (test_VectorNonlinearOracle_LagrangeMultipliers_MIN_SENSE),
2512+ )
2513+ return v " 1.47.0"
2514+ end
0 commit comments