Skip to content

Commit 742d7d6

Browse files
authored
Add support for value(::AbstractArray) without broadcasting (#4010)
1 parent 832aeda commit 742d7d6

File tree

4 files changed

+32
-30
lines changed

4 files changed

+32
-30
lines changed

src/variables.jl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2698,11 +2698,12 @@ function dual(::GenericVariableRef)
26982698
)
26992699
end
27002700

2701-
function value(::AbstractArray{<:AbstractJuMPScalar})
2702-
return error(
2703-
"`JuMP.value` is not defined for collections of JuMP types. Use" *
2704-
" Julia's broadcast syntax instead: `JuMP.value.(x)`.",
2705-
)
2701+
function value(var_value::Function, Q::AbstractArray{<:AbstractJuMPScalar})
2702+
return value.(var_value, Q)
2703+
end
2704+
2705+
function value(Q::AbstractArray{<:AbstractJuMPScalar}; result::Int = 1)
2706+
return value.(Q; result)
27062707
end
27072708

27082709
# Fallback. See JuMP#3775

test/test_generate_and_solve.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,4 +692,30 @@ function test_value_hermitian()
692692
return
693693
end
694694

695+
function test_value_array()
696+
inner = MOI.Utilities.MockOptimizer(
697+
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()),
698+
)
699+
model = direct_model(inner)
700+
@variable(model, x[i in 1:2], start = 3 - i)
701+
@variable(
702+
model,
703+
y[i in 1:2, j in 1:2] in ComplexPlane(),
704+
start = i + im * j
705+
)
706+
@test_throws OptimizeNotCalled value(x)
707+
@test_throws OptimizeNotCalled value(y)
708+
@test value(start_value, x) == [2, 1]
709+
@test value(start_value, y) == [1+im 1+2im; 2+im 2+2im]
710+
optimize!(model)
711+
MOI.set(inner, MOI.TerminationStatus(), MOI.OPTIMAL)
712+
idx = index.(all_variables(model))
713+
MOI.set.(inner, MOI.VariablePrimal(), idx, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
714+
@test value(x) == [1, 2]
715+
@test value(y) == [3+4im 7+8im; 5+6im 9+10im]
716+
@test_throws MOI.ResultIndexBoundsError value(x; result = 2)
717+
@test_throws MOI.ResultIndexBoundsError value(y; result = 2)
718+
return
719+
end
720+
695721
end # module

test/test_nlp.jl

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,20 +1270,6 @@ function test_multivariate_NLconstraint_is_valid()
12701270
return
12711271
end
12721272

1273-
function test_broadcast_error_NLexpression()
1274-
model = Model()
1275-
@variable(model, x)
1276-
@NLexpression(model, expr, sin(x))
1277-
@test_throws(
1278-
ErrorException(
1279-
"`JuMP.value` is not defined for collections of JuMP types. " *
1280-
"Use Julia's broadcast syntax instead: `JuMP.value.(x)`.",
1281-
),
1282-
value([x, x]),
1283-
)
1284-
return
1285-
end
1286-
12871273
function test_interval_errors()
12881274
model = Model()
12891275
@variable(model, x)

test/test_variable.jl

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -747,17 +747,6 @@ function test_dual_variable()
747747
return
748748
end
749749

750-
function test_value_containers()
751-
model = Model()
752-
@variable(model, x[1:2])
753-
exception = ErrorException(
754-
"`JuMP.value` is not defined for collections of JuMP types. Use " *
755-
"Julia's broadcast syntax instead: `JuMP.value.(x)`.",
756-
)
757-
@test_throws exception value(x)
758-
return
759-
end
760-
761750
function test_get_variable_coefficient()
762751
m = Model()
763752
x = @variable(m, x)

0 commit comments

Comments
 (0)