Skip to content

Commit bcff465

Browse files
add tests factorization
1 parent c152dfe commit bcff465

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

src/moi_wrapper.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,15 @@ function MOI.set(
769769
return
770770
end
771771

772+
function MOI.set(
773+
model::Optimizer,
774+
::MFactorization,
775+
factorization,
776+
)
777+
model.input_cache.factorization = factorization
778+
return
779+
end
780+
772781
function MOI.get(
773782
model::Optimizer,
774783
::ReverseConstraintDual,

test/nlp_program.jl

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ using Ipopt
66
using Test
77
using FiniteDiff
88
import DelimitedFiles
9+
using SparseArrays
910

1011
include(joinpath(@__DIR__, "data/nlp_problems.jl"))
1112

@@ -674,6 +675,64 @@ function test_differentiating_non_trivial_convex_qp_jump()
674675
return
675676
end
676677

678+
function test_changing_factorization()
679+
P = 2
680+
m = Model(
681+
() -> DiffOpt.diff_optimizer(
682+
Ipopt.Optimizer;
683+
with_parametric_opt_interface = false,
684+
),
685+
)
686+
687+
@variable(m, x[1:P])
688+
@constraint(m, x .≥ 0)
689+
@constraint(m, x .≤ 1)
690+
@variable(m, p[1:P] Parameter.(0.5))
691+
692+
@constraint(m, x .≥ p)
693+
694+
@objective(m, Min, sum(x))
695+
696+
optimize!(m)
697+
@assert is_solved_and_feasible(m)
698+
699+
# Set pertubations
700+
Δp = [0.1 for _ in 1:P]
701+
MOI.set.(
702+
m,
703+
DiffOpt.ForwardConstraintSet(),
704+
ParameterRef.(p),
705+
Parameter.(Δp),
706+
)
707+
708+
# wrong type
709+
@test_throws MethodError MOI.set(m, DiffOpt.MFactorization(), 2)
710+
711+
# correct type but wrong number of arguments
712+
MOI.set(m, DiffOpt.MFactorization(), SparseArrays.lu)
713+
714+
@test_throws MethodError DiffOpt.forward_differentiate!(m)
715+
716+
# correct type and correct number of arguments
717+
MOI.set(m, DiffOpt.MFactorization(), (M, num_w, num_constraints) -> SparseArrays.lu(M))
718+
719+
# Compute derivatives
720+
DiffOpt.forward_differentiate!(m)
721+
722+
# Test sensitivities
723+
@test all(
724+
isapprox(
725+
[
726+
MOI.get(m, DiffOpt.ForwardVariablePrimal(), x[i]) for
727+
i in 1:P
728+
],
729+
[0.1 for _ in 1:P];
730+
atol = 1e-8,
731+
),
732+
)
733+
end
734+
735+
677736
end # module
678737

679738
TestNLPProgram.runtests()

0 commit comments

Comments
 (0)