Skip to content

Commit d26c9bf

Browse files
authored
Fix missing value_type methods for expressions (#4002)
1 parent a032e4a commit d26c9bf

File tree

5 files changed

+37
-0
lines changed

5 files changed

+37
-0
lines changed

src/JuMP.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,15 @@ BigFloat
9494
"""
9595
value_type(::Type{<:AbstractModel}) = Float64
9696

97+
value_type(::Type{T}) where {T<:Number} = T
98+
99+
function value_type(::Type{T}) where {T}
100+
return error(
101+
"Unable to compute the `value_type($T)`. If you are developing a " *
102+
"JuMP extension, define a new method for `JuMP.value_type(::Type{$T})`",
103+
)
104+
end
105+
97106
mutable struct GenericModel{T<:Real} <: AbstractModel
98107
# In MANUAL and AUTOMATIC modes, CachingOptimizer.
99108
# In DIRECT mode, will hold an AbstractOptimizer.

src/aff_expr.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ end
143143

144144
variable_ref_type(::Type{GenericAffExpr{C,V}}) where {C,V} = V
145145

146+
value_type(::Type{GenericAffExpr{C,V}}) where {C,V} = C
147+
146148
function owner_model(x::GenericAffExpr)
147149
if !isempty(x.terms)
148150
return owner_model(first(keys(x.terms)))

src/nlp_expr.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ function variable_ref_type(::Type{GenericNonlinearExpr}, x::AbstractJuMPScalar)
112112
return variable_ref_type(x)
113113
end
114114

115+
value_type(::Type{GenericNonlinearExpr{V}}) where {V} = value_type(V)
116+
115117
function _has_variable_ref_type(a)
116118
return variable_ref_type(GenericNonlinearExpr, a) !== nothing
117119
end

src/quad_expr.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ end
8787

8888
variable_ref_type(::Type{GenericQuadExpr{C,V}}) where {C,V} = V
8989

90+
value_type(::Type{GenericQuadExpr{C,V}}) where {C,V} = C
91+
9092
function owner_model(x::GenericQuadExpr)
9193
model = owner_model(x.aff)
9294
if model !== nothing

test/test_expr.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,4 +595,26 @@ function test_issue_3982_core()
595595
return
596596
end
597597

598+
function test_value_type()
599+
for T in (Int, Float64, BigFloat)
600+
model = GenericModel{T}()
601+
@variable(model, x)
602+
@test value_type(T) == T
603+
@test value_type(typeof(model)) == T
604+
@test value_type(typeof(x)) == T
605+
@test value_type(typeof(one(T) * x)) == T
606+
@test value_type(typeof(one(T) * x * x)) == T
607+
@test value_type(typeof(log(x))) == T
608+
end
609+
T = Symbol
610+
@test_throws(
611+
ErrorException(
612+
"Unable to compute the `value_type($T)`. If you are developing a " *
613+
"JuMP extension, define a new method for `JuMP.value_type(::Type{$T})`",
614+
),
615+
value_type(T),
616+
)
617+
return
618+
end
619+
598620
end # TestExpr

0 commit comments

Comments
 (0)