Skip to content

Commit a3fe85a

Browse files
format
1 parent bce2303 commit a3fe85a

File tree

4 files changed

+97
-24
lines changed

4 files changed

+97
-24
lines changed

src/NonLinearProgram/NonLinearProgram.jl

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,13 @@ function _cache_evaluator!(model::Model)
434434
return model.cache
435435
end
436436

437-
function DiffOpt.forward_differentiate!(model::Model; tol = 1e-6, st = 1e-6, max_corrections = 50, allow_inertia_correction = true)
437+
function DiffOpt.forward_differentiate!(
438+
model::Model;
439+
tol = 1e-6,
440+
st = 1e-6,
441+
max_corrections = 50,
442+
allow_inertia_correction = true,
443+
)
438444
model.diff_time = @elapsed begin
439445
cache = _cache_evaluator!(model)
440446
form = model.model
@@ -448,7 +454,13 @@ function DiffOpt.forward_differentiate!(model::Model; tol = 1e-6, st = 1e-6, max
448454
end
449455

450456
# Compute Jacobian
451-
Δs = compute_sensitivity(model; tol = tol, st = st, max_corrections = max_corrections, allow_inertia_correction = allow_inertia_correction)
457+
Δs = compute_sensitivity(
458+
model;
459+
tol = tol,
460+
st = st,
461+
max_corrections = max_corrections,
462+
allow_inertia_correction = allow_inertia_correction,
463+
)
452464

453465
# Extract primal and dual sensitivities
454466
primal_Δs = Δs[1:length(model.cache.primal_vars), :] * Δp # Exclude slacks
@@ -462,13 +474,25 @@ function DiffOpt.forward_differentiate!(model::Model; tol = 1e-6, st = 1e-6, max
462474
return nothing
463475
end
464476

465-
function DiffOpt.reverse_differentiate!(model::Model; tol = 1e-6, st = 1e-6, max_corrections = 50, allow_inertia_correction = true)
477+
function DiffOpt.reverse_differentiate!(
478+
model::Model;
479+
tol = 1e-6,
480+
st = 1e-6,
481+
max_corrections = 50,
482+
allow_inertia_correction = true,
483+
)
466484
model.diff_time = @elapsed begin
467485
cache = _cache_evaluator!(model)
468486
form = model.model
469487

470488
# Compute Jacobian
471-
Δs = compute_sensitivity(model; tol = tol, st = st, max_corrections = max_corrections, allow_inertia_correction = allow_inertia_correction)
489+
Δs = compute_sensitivity(
490+
model;
491+
tol = tol,
492+
st = st,
493+
max_corrections = max_corrections,
494+
allow_inertia_correction = allow_inertia_correction,
495+
)
472496
num_primal = length(cache.primal_vars)
473497
Δx = zeros(num_primal)
474498
for (i, var_idx) in enumerate(cache.primal_vars)
@@ -506,7 +530,8 @@ function DiffOpt.reverse_differentiate!(model::Model; tol = 1e-6, st = 1e-6, max
506530
Δp = Δs' * Δw
507531

508532
# Order by ConstraintIndex
509-
varorder = sort(collect(keys(form.var2ci)); by = x -> form.var2ci[x].value)
533+
varorder =
534+
sort(collect(keys(form.var2ci)); by = x -> form.var2ci[x].value)
510535
Δp = [Δp[form.var2param[var_idx].value] for var_idx in varorder]
511536

512537
model.back_grad_cache = ReverseCache(; Δp = Δp)
@@ -546,7 +571,7 @@ function MOI.get(
546571
::DiffOpt.ReverseConstraintSet,
547572
ci::MOI.ConstraintIndex{MOI.VariableIndex,MOI.Parameter{T}},
548573
) where {T}
549-
return MOI.Parameter{T}(model.back_grad_cache.Δp[ci.value],)
574+
return MOI.Parameter{T}(model.back_grad_cache.Δp[ci.value])
550575
end
551576

552577
end # module NonLinearProgram

src/NonLinearProgram/nlp_utilities.jl

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,12 @@ end
436436
437437
Inertia correction for the factorization of the KKT matrix. Dense version.
438438
"""
439-
function inertia_corrector_factorization(M; st = 1e-6, max_corrections = 50, allow_inertia_correction = true)
439+
function inertia_corrector_factorization(
440+
M;
441+
st = 1e-6,
442+
max_corrections = 50,
443+
allow_inertia_correction = true,
444+
)
440445
num_c = 0
441446
if cond(M) > 1 / st
442447
@assert allow_inertia_correction "Inertia correction needed but not allowed"
@@ -476,7 +481,9 @@ function compute_derivatives_no_relax(
476481
ineq_locations::Vector{Z},
477482
has_up::Vector{Z},
478483
has_low::Vector{Z};
479-
st = 1e-6, max_corrections = 50, allow_inertia_correction = true
484+
st = 1e-6,
485+
max_corrections = 50,
486+
allow_inertia_correction = true,
480487
) where {Z<:Integer}
481488
M, N = build_sensitivity_matrices(
482489
model,
@@ -497,9 +504,13 @@ function compute_derivatives_no_relax(
497504
num_vars = get_num_primal_vars(model)
498505
num_cons = get_num_constraints(model)
499506
num_ineq = length(ineq_locations)
500-
K = inertia_corrector_factorization(M, num_vars + num_ineq, num_cons;
501-
st = st, max_corrections = max_corrections,
502-
allow_inertia_correction = allow_inertia_correction
507+
K = inertia_corrector_factorization(
508+
M,
509+
num_vars + num_ineq,
510+
num_cons;
511+
st = st,
512+
max_corrections = max_corrections,
513+
allow_inertia_correction = allow_inertia_correction,
503514
) # Factorization
504515
if isnothing(K)
505516
return zeros(size(M, 1), size(N, 2)), K, N
@@ -519,7 +530,13 @@ sense_mult(model::Model) = objective_sense(model) == MOI.MIN_SENSE ? 1.0 : -1.0
519530
520531
Compute the sensitivity of the solution given sensitivity of the parameters (Δp).
521532
"""
522-
function compute_sensitivity(model::Model; tol = 1e-6, st = 1e-6, max_corrections = 50, allow_inertia_correction = true)
533+
function compute_sensitivity(
534+
model::Model;
535+
tol = 1e-6,
536+
st = 1e-6,
537+
max_corrections = 50,
538+
allow_inertia_correction = true,
539+
)
523540
# Solution and bounds
524541
X,
525542
V_L,
@@ -547,8 +564,9 @@ function compute_sensitivity(model::Model; tol = 1e-6, st = 1e-6, max_correction
547564
ineq_locations,
548565
has_up,
549566
has_low;
550-
st = st, max_corrections = max_corrections,
551-
allow_inertia_correction = allow_inertia_correction
567+
st = st,
568+
max_corrections = max_corrections,
569+
allow_inertia_correction = allow_inertia_correction,
552570
)
553571
## Adjust signs based on JuMP convention
554572
num_vars = get_num_primal_vars(model)

src/jump_moi_overloads.jl

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,11 +362,17 @@ end
362362

363363
# MOI.Utilities
364364

365-
function reverse_differentiate!(model::MOI.Utilities.CachingOptimizer; kwargs...)
365+
function reverse_differentiate!(
366+
model::MOI.Utilities.CachingOptimizer;
367+
kwargs...,
368+
)
366369
return reverse_differentiate!(model.optimizer; kwargs...)
367370
end
368371

369-
function forward_differentiate!(model::MOI.Utilities.CachingOptimizer; kwargs...)
372+
function forward_differentiate!(
373+
model::MOI.Utilities.CachingOptimizer;
374+
kwargs...,
375+
)
370376
return forward_differentiate!(model.optimizer; kwargs...)
371377
end
372378

@@ -377,11 +383,17 @@ end
377383

378384
# MOIB
379385

380-
function reverse_differentiate!(model::MOI.Bridges.AbstractBridgeOptimizer; kwargs...)
386+
function reverse_differentiate!(
387+
model::MOI.Bridges.AbstractBridgeOptimizer;
388+
kwargs...,
389+
)
381390
return reverse_differentiate!(model.model; kwargs...)
382391
end
383392

384-
function forward_differentiate!(model::MOI.Bridges.AbstractBridgeOptimizer; kwargs...)
393+
function forward_differentiate!(
394+
model::MOI.Bridges.AbstractBridgeOptimizer;
395+
kwargs...,
396+
)
385397
return forward_differentiate!(model.model; kwargs...)
386398
end
387399

test/nlp_program.jl

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,12 @@ function test_compute_derivatives_Analytical(;
217217
optimize!(model)
218218
@assert is_solved_and_feasible(model)
219219
# Set pertubations
220-
MOI.set.(model, DiffOpt.ForwardConstraintSet(), ParameterRef.(params), Parameter.(Δp))
220+
MOI.set.(
221+
model,
222+
DiffOpt.ForwardConstraintSet(),
223+
ParameterRef.(params),
224+
Parameter.(Δp),
225+
)
221226
# Compute derivatives
222227
DiffOpt.forward_differentiate!(model)
223228
# Test sensitivities primal_vars
@@ -397,7 +402,12 @@ function test_compute_derivatives_Finite_Diff(;
397402
optimize!(model)
398403
@assert is_solved_and_feasible(model)
399404
# Set pertubations
400-
MOI.set.(model, DiffOpt.ForwardConstraintSet(), ParameterRef.(params), Parameter.(Δp))
405+
MOI.set.(
406+
model,
407+
DiffOpt.ForwardConstraintSet(),
408+
ParameterRef.(params),
409+
Parameter.(Δp),
410+
)
401411
# Compute derivatives
402412
DiffOpt.forward_differentiate!(model)
403413
Δx = [
@@ -468,12 +478,20 @@ function test_differentiating_non_trivial_convex_qp_jump()
468478
db = grads_actual[6]
469479

470480
for (i, ci) in enumerate(c_le)
471-
@test -dh[i] -MOI.get(model, DiffOpt.ReverseConstraintSet(), ParameterRef(p_le[i])).value atol =
472-
1e-2 rtol = 1e-2
481+
@test -dh[i]
482+
-MOI.get(
483+
model,
484+
DiffOpt.ReverseConstraintSet(),
485+
ParameterRef(p_le[i]),
486+
).value atol = 1e-2 rtol = 1e-2
473487
end
474488
for (i, ci) in enumerate(c_eq)
475-
@test -db[i] -MOI.get(model, DiffOpt.ReverseConstraintSet(), ParameterRef(p_eq[i])).value atol =
476-
1e-2 rtol = 1e-2
489+
@test -db[i]
490+
-MOI.get(
491+
model,
492+
DiffOpt.ReverseConstraintSet(),
493+
ParameterRef(p_eq[i]),
494+
).value atol = 1e-2 rtol = 1e-2
477495
end
478496

479497
return

0 commit comments

Comments
 (0)