From f0838e92ab40efd8623115db815450058e738cf4 Mon Sep 17 00:00:00 2001 From: odow Date: Thu, 2 Nov 2023 14:08:07 +1300 Subject: [PATCH 1/2] [Bridges] add VariablePrimalStart support to ParameterToEqualTo and RSOCtoPSD --- src/Bridges/Variable/bridges/parameter.jl | 26 +++++++++++++++++++++ src/Bridges/Variable/bridges/rsoc_to_psd.jl | 26 +++++++++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/Bridges/Variable/bridges/parameter.jl b/src/Bridges/Variable/bridges/parameter.jl index 794d6a2c98..be6bad31c6 100644 --- a/src/Bridges/Variable/bridges/parameter.jl +++ b/src/Bridges/Variable/bridges/parameter.jl @@ -115,3 +115,29 @@ function unbridged_map( ) where {T} return [bridge.x => _to_one(T, x)] end + +function MOI.supports( + model::MOI.ModelLike, + attr::MOI.VariablePrimalStart, + ::Type{<:ParameterToEqualToBridge}, +) + return MOI.supports(model, attr, MOI.VariableIndex) +end + +function MOI.get( + model::MOI.ModelLike, + attr::Union{MOI.VariablePrimal,MOI.VariablePrimalStart}, + bridge::ParameterToEqualToBridge, +) + return MOI.get(model, attr, bridge.x) +end + +function MOI.set( + model::MOI.ModelLike, + attr::MOI.VariablePrimalStart, + bridge::ParameterToEqualToBridge, + value, +) + MOI.set(model, attr, bridge.x, value) + return +end diff --git a/src/Bridges/Variable/bridges/rsoc_to_psd.jl b/src/Bridges/Variable/bridges/rsoc_to_psd.jl index 2140e70cc1..2cce888680 100644 --- a/src/Bridges/Variable/bridges/rsoc_to_psd.jl +++ b/src/Bridges/Variable/bridges/rsoc_to_psd.jl @@ -248,19 +248,41 @@ function MOI.get( return dual end +function MOI.supports( + model::MOI.ModelLike, + attr::MOI.VariablePrimalStart, + ::Type{<:RSOCtoPSDBridge}, +) + return MOI.supports(model, attr, MOI.VariableIndex) +end + function MOI.get( model::MOI.ModelLike, - attr::MOI.VariablePrimal, + attr::Union{MOI.VariablePrimal,MOI.VariablePrimalStart}, bridge::RSOCtoPSDBridge, i::MOI.Bridges.IndexInVector, ) value = MOI.get(model, attr, _variable(bridge, i)) - if i.value == 2 + if value !== nothing && i.value == 2 return value / 2 end return value end +function MOI.set( + model::MOI.ModelLike, + attr::MOI.VariablePrimalStart, + bridge::RSOCtoPSDBridge, + value, + i::MOI.Bridges.IndexInVector, +) + if value !== nothing && i.value == 2 + value = 2 * value + end + MOI.set(model, attr, _variable(bridge, i), value) + return +end + function MOI.Bridges.bridged_function( bridge::RSOCtoPSDBridge{T}, i::MOI.Bridges.IndexInVector, From 16cc282fed2b9568664e6435cb95034a4114f73a Mon Sep 17 00:00:00 2001 From: odow Date: Fri, 3 Nov 2023 10:48:11 +1300 Subject: [PATCH 2/2] Update set set u submatrix --- src/Bridges/Variable/bridges/rsoc_to_psd.jl | 22 ++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Bridges/Variable/bridges/rsoc_to_psd.jl b/src/Bridges/Variable/bridges/rsoc_to_psd.jl index 2cce888680..aeaa4b3154 100644 --- a/src/Bridges/Variable/bridges/rsoc_to_psd.jl +++ b/src/Bridges/Variable/bridges/rsoc_to_psd.jl @@ -269,17 +269,29 @@ function MOI.get( return value end +_u_start_values(::Nothing) = nothing, nothing +_u_start_values(value::T) where {T} = 2 * value, zero(T) + function MOI.set( model::MOI.ModelLike, attr::MOI.VariablePrimalStart, - bridge::RSOCtoPSDBridge, + bridge::RSOCtoPSDBridge{T}, value, i::MOI.Bridges.IndexInVector, -) - if value !== nothing && i.value == 2 - value = 2 * value +) where {T} + if i.value != 2 + MOI.set(model, attr, _variable(bridge, i), value) + return + end + diag_value, offdiag_value = _u_start_values(value) + n = length(bridge.variables) + for col in 2:MOI.Utilities.side_dimension_for_vectorized_dimension(n) + for row in 2:col + k = MOI.Utilities.trimap(row, col) + v = row == col ? diag_value : offdiag_value + MOI.set(model, attr, bridge.variables[k], v) + end end - MOI.set(model, attr, _variable(bridge, i), value) return end