Dear All,
I am trying to define a constraint to equate two symbolically symmetric matrices and I am wondering if there is a compact way so that JuMP
does not store redundant constraints. A simple example is as follows
using JuMP, Ipopt
test_model = Model(Ipopt.Optimizer)
n = 2
@variable(test_model, X[1:n,1:n], Symmetric)
@variable(test_model, Y[1:n,1:n], Symmetric)
@constraint(test_model, X .== Y)
where the last equality creates redundant constraint X[1,2] - Y[1,2] == 0.0
as shown below:
2×2 Matrix{ConstraintRef{Model, MathOptInterface.ConstraintIndex{MathOptInterface.ScalarAffineFunction{Float64}, MathOptInterface.EqualTo{Float64}}, ScalarShape}}:
X[1,1] - Y[1,1] == 0.0 X[1,2] - Y[1,2] == 0.0
X[1,2] - Y[1,2] == 0.0 X[2,2] - Y[2,2] == 0.0
Of course, I can avoid the redundant constraint by:
@constraint(test_model, sym_con[i=1:n, j=1:i], X[i,j] == Y[i,j])
or
for i in 1:n
for j in 1:i
@constraint(test_model, X[i,j] == Y[i,j])
end
end
and both work just fine, but is this the best way to do it?
(Note that for the given example one may wonder why I am equating two variables that are the same rather than defining only one of X
or Y
. But for the problem I am working on, I need to enforce equality between two symbolically symmetric matrices, where the matrix Y
corresponds to Y = z z^\top that is an outer product matrix, and the variable X
is introduced to turn a cubic constraint into a quadratic constraint.)
Any tips/suggestions will be much appreciated!