Skip to content

Commit 7bd2f95

Browse files
committed
format
1 parent ec2f856 commit 7bd2f95

7 files changed

Lines changed: 136 additions & 77 deletions

File tree

src/MOI_wrapper.jl

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ end
5454
function _has_parameters(f::MOI.VectorQuadraticFunction)
5555
# quadratic part
5656
for qt in f.quadratic_terms
57-
if _is_parameter(qt.scalar_term.variable_1) || _is_parameter(qt.scalar_term.variable_2)
57+
if _is_parameter(qt.scalar_term.variable_1) ||
58+
_is_parameter(qt.scalar_term.variable_2)
5859
return true
5960
end
6061
end
@@ -86,12 +87,20 @@ function _cache_multiplicative_params!(
8687
f::ParametricVectorQuadraticFunction{T},
8788
) where {T}
8889
for term in f.pv
89-
push!(model.multiplicative_parameters_pv,
90-
term.scalar_term.variable_1.value)
90+
push!(
91+
model.multiplicative_parameters_pv,
92+
term.scalar_term.variable_1.value,
93+
)
9194
end
9295
for term in f.pp
93-
push!(model.multiplicative_parameters_pp, term.scalar_term.variable_1.value)
94-
push!(model.multiplicative_parameters_pp, term.scalar_term.variable_2.value)
96+
push!(
97+
model.multiplicative_parameters_pp,
98+
term.scalar_term.variable_1.value,
99+
)
100+
push!(
101+
model.multiplicative_parameters_pp,
102+
term.scalar_term.variable_2.value,
103+
)
95104
end
96105
return
97106
end
@@ -917,7 +926,7 @@ function _add_constraint_with_parameters_on_function(
917926
pf = ParametricVectorQuadraticFunction(f)
918927
_cache_multiplicative_params!(model, pf)
919928
_update_cache!(pf, model)
920-
929+
921930
# Get the current function after parameter substitution
922931
func = _current_function(pf)
923932
if !_is_vector_affine(func)

src/ParametricOptInterface.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,9 @@ mutable struct Optimizer{T,OT<:MOI.ModelLike} <: MOI.AbstractOptimizer
138138
# Store original constraint set (inner key)
139139
quadratic_constraint_cache_set::DoubleDict{MOI.AbstractScalarSet}
140140
# Vector quadratic function data
141-
vector_quadratic_constraint_cache::DoubleDict{ParametricVectorQuadraticFunction{T}}
141+
vector_quadratic_constraint_cache::DoubleDict{
142+
ParametricVectorQuadraticFunction{T},
143+
}
142144
# Store original constraint set (inner key)
143145
vector_quadratic_constraint_cache_set::DoubleDict{MOI.AbstractVectorSet}
144146

src/duals.jl

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,12 @@ end
178178

179179
function _update_duals_from_vector_quadratic_constraints!(model::Optimizer)
180180
for (F, S) in keys(model.vector_quadratic_constraint_cache.dict)
181-
vector_quadratic_constraint_cache_inner = model.vector_quadratic_constraint_cache[F, S]
182-
_compute_parameters_in_ci!(model, vector_quadratic_constraint_cache_inner)
181+
vector_quadratic_constraint_cache_inner =
182+
model.vector_quadratic_constraint_cache[F, S]
183+
_compute_parameters_in_ci!(
184+
model,
185+
vector_quadratic_constraint_cache_inner,
186+
)
183187
end
184188
return
185189
end
@@ -195,12 +199,20 @@ function _compute_parameters_in_ci!(
195199
cons_dual[term.output_index] * term.scalar_term.coefficient
196200
end
197201
for term in pf.pp
198-
coef = ifelse(term.scalar_term.variable_1 == term.scalar_term.variable_2, T(1 // 2), T(1))
202+
coef = ifelse(
203+
term.scalar_term.variable_1 == term.scalar_term.variable_2,
204+
T(1 // 2),
205+
T(1),
206+
)
199207
model.dual_value_of_parameters[p_val(term.scalar_term.variable_1)] -=
200-
coef * cons_dual[term.output_index] * term.scalar_term.coefficient *
208+
coef *
209+
cons_dual[term.output_index] *
210+
term.scalar_term.coefficient *
201211
MOI.get(model, ParameterValue(), term.scalar_term.variable_2)
202212
model.dual_value_of_parameters[p_val(term.scalar_term.variable_2)] -=
203-
coef * cons_dual[term.output_index] * term.scalar_term.coefficient *
213+
coef *
214+
cons_dual[term.output_index] *
215+
term.scalar_term.coefficient *
204216
MOI.get(model, ParameterValue(), term.scalar_term.variable_1)
205217
end
206218
return

src/parametric_functions.jl

Lines changed: 63 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -571,11 +571,21 @@ function ParametricVectorQuadraticFunction(
571571
sizehint!(affine_data_np, length(v))
572572
for term in v
573573
if term.scalar_term.variable in v_in_pv
574-
base = get(affine_data, (term.scalar_term.variable, term.output_index), zero(T))
575-
affine_data[(term.scalar_term.variable, term.output_index)] = term.scalar_term.coefficient + base
574+
base = get(
575+
affine_data,
576+
(term.scalar_term.variable, term.output_index),
577+
zero(T),
578+
)
579+
affine_data[(term.scalar_term.variable, term.output_index)] =
580+
term.scalar_term.coefficient + base
576581
else
577-
base = get(affine_data_np, (term.scalar_term.variable, term.output_index), zero(T))
578-
affine_data_np[(term.scalar_term.variable, term.output_index)] = term.scalar_term.coefficient + base
582+
base = get(
583+
affine_data_np,
584+
(term.scalar_term.variable, term.output_index),
585+
zero(T),
586+
)
587+
affine_data_np[(term.scalar_term.variable, term.output_index)] =
588+
term.scalar_term.coefficient + base
579589
end
580590
end
581591

@@ -594,15 +604,21 @@ function ParametricVectorQuadraticFunction(
594604
)
595605
end
596606

597-
function vector_quadratic_parameter_variable_terms(f::ParametricVectorQuadraticFunction)
607+
function vector_quadratic_parameter_variable_terms(
608+
f::ParametricVectorQuadraticFunction,
609+
)
598610
return f.pv
599611
end
600612

601-
function vector_quadratic_parameter_parameter_terms(f::ParametricVectorQuadraticFunction)
613+
function vector_quadratic_parameter_parameter_terms(
614+
f::ParametricVectorQuadraticFunction,
615+
)
602616
return f.pp
603617
end
604618

605-
function vector_quadratic_variable_variable_terms(f::ParametricVectorQuadraticFunction)
619+
function vector_quadratic_variable_variable_terms(
620+
f::ParametricVectorQuadraticFunction,
621+
)
606622
return f.vv
607623
end
608624

@@ -675,8 +691,11 @@ function _parametric_affine_terms(
675691
f::ParametricVectorQuadraticFunction{T},
676692
) where {T}
677693
param_terms_dict = Dict{Tuple{MOI.VariableIndex,Int},T}()
678-
sizehint!(param_terms_dict, length(vector_quadratic_parameter_variable_terms(f)))
679-
694+
sizehint!(
695+
param_terms_dict,
696+
length(vector_quadratic_parameter_variable_terms(f)),
697+
)
698+
680699
for term in vector_quadratic_parameter_variable_terms(f)
681700
p_idx_val = p_idx(term.scalar_term.variable_1)
682701
var = term.scalar_term.variable_2
@@ -685,13 +704,13 @@ function _parametric_affine_terms(
685704
param_terms_dict[(var, output_idx)] =
686705
base + term.scalar_term.coefficient * model.parameters[p_idx_val]
687706
end
688-
707+
689708
for (term, coef) in f.affine_data
690709
output_idx = term.output_index
691710
var = term.scalar_term.variable
692711
param_terms_dict[(var, output_idx)] = coef
693712
end
694-
713+
695714
return param_terms_dict
696715
end
697716

@@ -700,44 +719,50 @@ function _delta_parametric_affine_terms(
700719
f::ParametricVectorQuadraticFunction{T},
701720
) where {T}
702721
delta_terms = Dict{Tuple{Int,MOI.VariableIndex},T}()
703-
722+
704723
# Handle parameter-variable quadratic terms (px) that become affine (x) when p is updated
705724
for term in f.pv
706725
p_idx_val = p_idx(term.scalar_term.variable_1)
707726
var = term.scalar_term.variable_2
708727
output_idx = term.output_index
709-
710-
if haskey(model.updated_parameters, p_idx_val) && !isnan(model.updated_parameters[p_idx_val])
728+
729+
if haskey(model.updated_parameters, p_idx_val) &&
730+
!isnan(model.updated_parameters[p_idx_val])
711731
old_param_val = model.parameters[p_idx_val]
712732
new_param_val = model.updated_parameters[p_idx_val]
713-
delta_coef = term.scalar_term.coefficient * (new_param_val - old_param_val)
714-
733+
delta_coef =
734+
term.scalar_term.coefficient * (new_param_val - old_param_val)
735+
715736
key = (output_idx, var)
716737
current_delta = get(delta_terms, key, zero(T))
717738
delta_terms[key] = current_delta + delta_coef
718739
end
719740
end
720-
741+
721742
# Handle parameter-only affine terms
722743
for term in f.p
723744
p_idx_val = p_idx(term.scalar_term.variable)
724745
output_idx = term.output_index
725-
726-
if haskey(model.updated_parameters, p_idx_val) && !isnan(model.updated_parameters[p_idx_val])
746+
747+
if haskey(model.updated_parameters, p_idx_val) &&
748+
!isnan(model.updated_parameters[p_idx_val])
727749
old_param_val = model.parameters[p_idx_val]
728750
new_param_val = model.updated_parameters[p_idx_val]
729-
751+
730752
# This becomes a constant change, not an affine term change
731753
# We'll handle this in the constant update function
732754
end
733755
end
734-
756+
735757
return delta_terms
736758
end
737759

738-
function _update_cache!(f::ParametricVectorQuadraticFunction{T}, model) where {T}
760+
function _update_cache!(
761+
f::ParametricVectorQuadraticFunction{T},
762+
model,
763+
) where {T}
739764
f.current_constant = _parametric_constant(model, f)
740-
f.current_terms_with_p = _parametric_affine_terms(model, f)
765+
f.current_terms_with_p = _parametric_affine_terms(model, f)
741766
return nothing
742767
end
743768

@@ -758,40 +783,47 @@ function _parametric_constant(
758783
f::ParametricVectorQuadraticFunction{T},
759784
) where {T}
760785
param_constant = f.c
761-
786+
762787
# Add contributions from parameter terms in affine part
763788
for term in vector_affine_parameter_terms(f)
764789
param_constant[term.output_index] +=
765790
term.scalar_term.coefficient *
766791
model.parameters[p_idx(term.scalar_term.variable)]
767792
end
768-
793+
769794
# Add contributions from parameter-parameter quadratic terms
770795
for term in vector_quadratic_parameter_parameter_terms(f)
771796
idx = term.output_index
772-
coef = term.scalar_term.coefficient /
797+
coef =
798+
term.scalar_term.coefficient /
773799
(term.scalar_term.variable_1 == term.scalar_term.variable_2 ? 2 : 1)
774-
param_constant[idx] += coef *
800+
param_constant[idx] +=
801+
coef *
775802
model.parameters[p_idx(term.scalar_term.variable_1)] *
776803
model.parameters[p_idx(term.scalar_term.variable_2)]
777804
end
778-
805+
779806
return param_constant
780807
end
781808

782809
function _current_function(f::ParametricVectorQuadraticFunction{T}) where {T}
783810
affine_terms = MOI.VectorAffineTerm{T}[]
784811
sizehint!(affine_terms, length(f.current_constant) + length(f.v))
785812
for ((var, idx), coef) in f.current_terms_with_p
786-
push!(affine_terms, MOI.VectorAffineTerm{T}(idx, MOI.ScalarAffineTerm{T}(coef, var)))
813+
push!(
814+
affine_terms,
815+
MOI.VectorAffineTerm{T}(idx, MOI.ScalarAffineTerm{T}(coef, var)),
816+
)
787817
end
788818
for ((var, idx), coef) in f.affine_data_np
789-
push!(affine_terms, MOI.VectorAffineTerm{T}(idx, MOI.ScalarAffineTerm{T}(coef, var)))
819+
push!(
820+
affine_terms,
821+
MOI.VectorAffineTerm{T}(idx, MOI.ScalarAffineTerm{T}(coef, var)),
822+
)
790823
end
791824
return MOI.VectorQuadraticFunction{T}(
792825
f.vv,
793826
affine_terms,
794827
f.current_constant,
795828
)
796829
end
797-

src/update_parameters.jl

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -335,42 +335,45 @@ function _delta_parametric_constant(
335335
f::ParametricVectorQuadraticFunction{T},
336336
) where {T}
337337
delta_constants = zeros(T, length(f.current_constant))
338-
338+
339339
# Handle parameter-only affine terms
340340
for term in f.p
341341
p_idx_val = p_idx(term.scalar_term.variable)
342342
output_idx = term.output_index
343-
343+
344344
if !isnan(model.updated_parameters[p_idx_val])
345345
old_param_val = model.parameters[p_idx_val]
346346
new_param_val = model.updated_parameters[p_idx_val]
347-
delta_constants[output_idx] += term.scalar_term.coefficient * (new_param_val - old_param_val)
347+
delta_constants[output_idx] +=
348+
term.scalar_term.coefficient * (new_param_val - old_param_val)
348349
end
349350
end
350-
351+
351352
# Handle parameter-parameter quadratic terms
352353
for term in f.pp
353354
idx = term.output_index
354355
var1 = term.scalar_term.variable_1
355356
var2 = term.scalar_term.variable_2
356357
p1 = p_idx(var1)
357358
p2 = p_idx(var2)
358-
359+
359360
if !isnan(model.updated_parameters[p1]) ||
360361
!isnan(model.updated_parameters[p2])
361-
362362
old_val1 = model.parameters[p1]
363363
old_val2 = model.parameters[p2]
364-
new_val1 = !isnan(model.updated_parameters[p1]) ?
365-
model.updated_parameters[p1] : old_val1
366-
new_val2 = !isnan(model.updated_parameters[p2]) ?
367-
model.updated_parameters[p2] : old_val2
368-
364+
new_val1 =
365+
!isnan(model.updated_parameters[p1]) ?
366+
model.updated_parameters[p1] : old_val1
367+
new_val2 =
368+
!isnan(model.updated_parameters[p2]) ?
369+
model.updated_parameters[p2] : old_val2
370+
369371
coef = term.scalar_term.coefficient / (var1 == var2 ? 2 : 1)
370-
delta_constants[idx] += coef * (new_val1 * new_val2 - old_val1 * old_val2)
372+
delta_constants[idx] +=
373+
coef * (new_val1 * new_val2 - old_val1 * old_val2)
371374
end
372375
end
373-
376+
374377
return delta_constants
375378
end
376379

@@ -403,10 +406,18 @@ function _update_vector_quadratic_constraints!(
403406
new_function = _current_function(pf)
404407
if _is_vector_affine(new_function)
405408
# Build new function if affine
406-
new_function = MOI.VectorAffineFunction(new_function.affine_terms, new_function.constants)
409+
new_function = MOI.VectorAffineFunction(
410+
new_function.affine_terms,
411+
new_function.constants,
412+
)
407413
end
408-
MOI.set(model.optimizer, MOI.ConstraintFunction(), inner_ci, new_function)
414+
MOI.set(
415+
model.optimizer,
416+
MOI.ConstraintFunction(),
417+
inner_ci,
418+
new_function,
419+
)
409420
end
410-
421+
411422
return
412423
end

test/jump_tests.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,10 +1279,10 @@ function test_jump_psd_cone_with_parameter()
12791279
model = Model(SCS.Optimizer)
12801280
@variable(model, x)
12811281
@variable(model, p in MOI.Parameter(1.0))
1282-
@constraint(model, [[0 (p * x + -1)];[(p * x + -1) 0]] in JuMP.PSDCone())
1282+
@constraint(model, [[0 (p * x + -1)]; [(p * x + -1) 0]] in JuMP.PSDCone())
12831283
optimize!(model)
12841284
@test value(x) 1.0 atol = 1e-5
12851285
set_parameter_value(p, 3.0)
12861286
optimize!(model)
1287-
@test value(x) 1/3 atol = 1e-5
1287+
@test value(x) 1 / 3 atol = 1e-5
12881288
end

0 commit comments

Comments
 (0)