Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/Bridges/Constraint/bridges/SquareBridge.jl
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ function MOI.get(
f_ji = MOI.Utilities.operate(-, T, f[offset+i+(j-1)*dim], diff)
# But we need to account for the constant moved into the set
rhs = MOI.constant(MOI.get(model, MOI.ConstraintSet(), ci))
f_ji = MOI.Utilities.operate!(-, T, f_ji, rhs)
f_ji = MOI.Utilities.operate!(+, T, f_ji, rhs)
f[offset+j+(i-1)*dim] = MOI.Utilities.convert_approx(eltype(f), f_ji)
end
return MOI.Utilities.vectorize(f)
Expand Down Expand Up @@ -320,7 +320,7 @@ function MOI.get(
primal[offset+i+(j-1)*dim] = primal[offset+j+(i-1)*dim] = value[k]
end
for ((i, j), ci) in bridge.sym
primal[offset+i+(j-1)*dim] += MOI.get(model, attr, ci)
primal[offset+j+(i-1)*dim] -= MOI.get(model, attr, ci)
end
return primal
end
Expand All @@ -341,7 +341,7 @@ function MOI.set(
k = offset
for j in 1:dim, i in 1:j
k += 1
primal[k] = value[offset+j+(i-1)*dim]
primal[k] = value[offset+i+(j-1)*dim]
end
MOI.set(model, attr, bridge.triangle, primal)
for ((i, j), ci) in bridge.sym
Expand Down
34 changes: 34 additions & 0 deletions test/Bridges/Constraint/test_SquareBridge.jl
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,40 @@ function test_VectorNonlinearFunction_mixed_type()
return
end

function test_square_bridge_with_constant()
MOI.Bridges.runtests(
MOI.Bridges.Constraint.SquareBridge,
"""
variables: x11, x21, x12, x22
[x11 + 1.0, x21 + 2.0, x12 + 3.0, x22 + 4.0] in PositiveSemidefiniteConeSquare(2)
""",
"""
variables: x11, x21, x12, x22
[x11 + 1.0, x12 + 3.0, x22 + 4.0] in PositiveSemidefiniteConeTriangle(2)
x12 + -1.0 * x21 == -1.0
""",
)
return
end

function test_constraint_primal_start()
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
model = MOI.Bridges.Constraint.Square{Float64}(inner)
x = MOI.add_variables(model, 4)
f = MOI.Utilities.vectorize(1.0 .* x .+ (1.0:4.0))
ci = MOI.add_constraint(model, f, MOI.PositiveSemidefiniteConeSquare(2))
bridge = MOI.Bridges.bridge(model, ci)
start = [11.0, 21.0, 12.0, 22.0]
MOI.set(model, MOI.ConstraintPrimalStart(), ci, start)
@test isapprox(
MOI.get(inner, MOI.ConstraintPrimalStart(), bridge.triangle),
[11.0, 12.0, 22.0]
Comment thread
odow marked this conversation as resolved.
Outdated
)
@test ≈(MOI.get(inner, MOI.ConstraintPrimalStart(), bridge.sym[1][2]), -9.0)
@test ≈(MOI.get(model, MOI.ConstraintFunction(), ci), f)
return
end

end # module

TestConstraintSquare.runtests()
Loading