Skip to content

Commit d790a29

Browse files
authored
Fix value for partially initialized matrices (#4007)
1 parent d26c9bf commit d790a29

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

src/sd.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ function value(
859859
Q::LinearAlgebra.Symmetric{V,Matrix{V}},
860860
) where {V<:AbstractJuMPScalar}
861861
return LinearAlgebra.Symmetric(
862-
value.(var_value, LinearAlgebra.parent(Q)),
862+
value.(var_value, Q),
863863
LinearAlgebra.sym_uplo(Q.uplo),
864864
)
865865
end
@@ -869,7 +869,7 @@ function value(
869869
result::Int = 1,
870870
) where {V<:AbstractJuMPScalar}
871871
return LinearAlgebra.Symmetric(
872-
value.(LinearAlgebra.parent(Q); result),
872+
value.(Q; result),
873873
LinearAlgebra.sym_uplo(Q.uplo),
874874
)
875875
end
@@ -879,7 +879,7 @@ function value(
879879
Q::LinearAlgebra.Hermitian{V,Matrix{V}},
880880
) where {V<:AbstractJuMPScalar}
881881
return LinearAlgebra.Hermitian(
882-
value.(var_value, LinearAlgebra.parent(Q)),
882+
value.(var_value, Q),
883883
LinearAlgebra.sym_uplo(Q.uplo),
884884
)
885885
end
@@ -889,7 +889,7 @@ function value(
889889
result::Int = 1,
890890
) where {V<:AbstractJuMPScalar}
891891
return LinearAlgebra.Hermitian(
892-
value.(LinearAlgebra.parent(Q); result),
892+
value.(Q; result),
893893
LinearAlgebra.sym_uplo(Q.uplo),
894894
)
895895
end

test/test_generate_and_solve.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,15 +654,18 @@ function test_value_symmetric()
654654
model = direct_model(inner)
655655
@variable(model, x[i in 1:2, j in 1:2], Symmetric, start = i + j)
656656
Y = LinearAlgebra.Symmetric(1.0 .* x)
657+
Z = LinearAlgebra.I - Y #element Z.data[2, 1] is #undef
657658
@test_throws OptimizeNotCalled value(x)
658659
@test_throws OptimizeNotCalled value(Y)
659660
@test value(start_value, x) == LinearAlgebra.Symmetric([2 3; 3 4])
660661
@test value(start_value, Y) == LinearAlgebra.Symmetric([2 3; 3 4])
662+
@test value(start_value, Z) == LinearAlgebra.Symmetric([-1 -3; -3 -3])
661663
optimize!(model)
662664
MOI.set(inner, MOI.TerminationStatus(), MOI.OPTIMAL)
663665
MOI.set.(inner, MOI.VariablePrimal(), index.(x), [3 4; 4 5])
664666
@test value(x) == LinearAlgebra.Symmetric([3 4; 4 5])
665667
@test value(Y) == LinearAlgebra.Symmetric([3 4; 4 5])
668+
@test value(Z) == LinearAlgebra.Symmetric([-2 -4; -4 -4])
666669
@test_throws MOI.ResultIndexBoundsError value(x; result = 2)
667670
@test_throws MOI.ResultIndexBoundsError value(Y; result = 2)
668671
return
@@ -675,13 +678,16 @@ function test_value_hermitian()
675678
model = direct_model(inner)
676679
H = [1 2+3im; 2-3im 4]
677680
@variable(model, x[i in 1:2, j in 1:2], Hermitian, start = H[i, j])
681+
Z = LinearAlgebra.I - x
678682
@test_throws OptimizeNotCalled value(x)
679683
@test value(start_value, x) == LinearAlgebra.Hermitian(H)
684+
@test value(start_value, Z) == LinearAlgebra.Hermitian(LinearAlgebra.I - H)
680685
optimize!(model)
681686
MOI.set(inner, MOI.TerminationStatus(), MOI.OPTIMAL)
682687
y = index.(all_variables(model))
683688
MOI.set.(inner, MOI.VariablePrimal(), y, [3, 4, 5, 6])
684689
@test value(x) == LinearAlgebra.Hermitian([3 4+6im; 4-6im 5])
690+
@test value(Z) == LinearAlgebra.Hermitian([-2 -4-6im; 4+6im -4])
685691
@test_throws MOI.ResultIndexBoundsError value(x; result = 2)
686692
return
687693
end

0 commit comments

Comments
 (0)