@@ -740,6 +740,40 @@ function test_ObjectiveSensitivity_model2()
740740 @test isapprox (dp, - 1.5 ; atol = 1e-4 )
741741end
742742
743+ function test_ObjectiveSensitivity_direct_param_contrib ()
744+ model = DiffOpt. nonlinear_diff_model (Ipopt. Optimizer)
745+ set_silent (model)
746+
747+ p_val = 3.0
748+ @variable (model, p ∈ MOI. Parameter (p_val))
749+ @variable (model, x ≥ 1 )
750+ @objective (model, Min, p^ 2 * x^ 2 )
751+
752+ optimize! (model)
753+ @assert is_solved_and_feasible (model)
754+
755+ Δp = 0.1
756+ DiffOpt. set_forward_parameter (model, p, Δp)
757+ DiffOpt. forward_differentiate! (model)
758+
759+ df_dp = MOI. get (model, DiffOpt. ForwardObjectiveSensitivity ())
760+ @test isapprox (df_dp, 2 * p_val * Δp, atol = 1e-8 ) # ≈ 0.6 for p=3
761+
762+ ε = 1e-6
763+ df_dp_fdpos = begin
764+ set_parameter_value (p, p_val + ε)
765+ optimize! (model)
766+ Δp * objective_value (model)
767+ end
768+ df_dp_fdneg = begin
769+ set_parameter_value (p, p_val - ε)
770+ optimize! (model)
771+ Δp * objective_value (model)
772+ end
773+ df_dp_fd = (df_dp_fdpos - df_dp_fdneg) / (2 ε)
774+
775+ @test isapprox (df_dp, df_dp_fd, atol = 1e-4 )
776+ end
743777function test_ObjectiveSensitivity_subset_parameters ()
744778 # Model with 10 parameters, differentiate only w.r.t. 3rd and 7th
745779 model = Model (() -> DiffOpt. diff_optimizer (Ipopt. Optimizer))
0 commit comments