diff --git a/src/Bridges/Constraint/bridges/IntegerToZeroOneBridge.jl b/src/Bridges/Constraint/bridges/IntegerToZeroOneBridge.jl index 136d64905e..911b28f62a 100644 --- a/src/Bridges/Constraint/bridges/IntegerToZeroOneBridge.jl +++ b/src/Bridges/Constraint/bridges/IntegerToZeroOneBridge.jl @@ -152,7 +152,8 @@ function MOI.Bridges.final_touch( bridge::IntegerToZeroOneBridge{T}, model::MOI.ModelLike, ) where {T} - ret = MOI.Utilities.get_bounds(model, T, bridge.x) + # Type annotation needed for JET + ret = MOI.Utilities.get_bounds(model, T, bridge.x)::Tuple{T,T} if ret === bridge.last_bounds return nothing # final_touch already called elseif ret[1] == typemin(T) || ret[2] == typemax(T) diff --git a/src/Bridges/Constraint/bridges/SplitIntervalBridge.jl b/src/Bridges/Constraint/bridges/SplitIntervalBridge.jl index ab720e9f46..a0c789f932 100644 --- a/src/Bridges/Constraint/bridges/SplitIntervalBridge.jl +++ b/src/Bridges/Constraint/bridges/SplitIntervalBridge.jl @@ -325,17 +325,15 @@ function MOI.get( upper_stat = MOI.get(model, attr, bridge.upper) if upper_stat == MOI.NONBASIC return MOI.NONBASIC_AT_UPPER + elseif bridge.lower === nothing + return upper_stat end - end - if bridge.lower === nothing - if bridge.upper === nothing - # The only case where the interval `[-∞, ∞]` is allowed is for - # `VariableIndex` constraints but `ConstraintBasisStatus` is not - # defined for `VariableIndex` constraints. - msg = "Cannot get `$attr` for a constraint in the interval `[-Inf, Inf]`." - throw(MOI.GetAttributeNotAllowed(attr, msg)) - end - return upper_stat + elseif bridge.lower === nothing + # The only case where the interval `[-∞, ∞]` is allowed is for + # `VariableIndex` constraints but `ConstraintBasisStatus` is not + # defined for `VariableIndex` constraints. + msg = "Cannot get `$attr` for a constraint in the interval `[-Inf, Inf]`." + throw(MOI.GetAttributeNotAllowed(attr, msg)) end lower_stat = MOI.get(model, attr, bridge.lower) if lower_stat == MOI.NONBASIC diff --git a/src/Bridges/Constraint/single_bridge_optimizer.jl b/src/Bridges/Constraint/single_bridge_optimizer.jl index 496447f25e..a70d118cb3 100644 --- a/src/Bridges/Constraint/single_bridge_optimizer.jl +++ b/src/Bridges/Constraint/single_bridge_optimizer.jl @@ -48,15 +48,15 @@ mutable struct SingleBridgeOptimizer{BT<:AbstractBridge,OT<:MOI.ModelLike} <: map::Map # index of bridged constraint -> constraint bridge con_to_name::Dict{MOI.ConstraintIndex,String} name_to_con::Union{Dict{String,MOI.ConstraintIndex},Nothing} -end -function SingleBridgeOptimizer{BT}(model::OT) where {BT,OT<:MOI.ModelLike} - return SingleBridgeOptimizer{BT,OT}( - model, - Map(), - Dict{MOI.ConstraintIndex,String}(), - nothing, - ) + function SingleBridgeOptimizer{BT}(model::OT) where {BT,OT<:MOI.ModelLike} + return new{BT,OT}( + model, + Map(), + Dict{MOI.ConstraintIndex,String}(), + nothing, + ) + end end bridges(::MOI.Bridges.AbstractBridgeOptimizer) = EmptyMap() diff --git a/src/Bridges/Objective/single_bridge_optimizer.jl b/src/Bridges/Objective/single_bridge_optimizer.jl index bd6be6bde2..d0eac538e2 100644 --- a/src/Bridges/Objective/single_bridge_optimizer.jl +++ b/src/Bridges/Objective/single_bridge_optimizer.jl @@ -41,10 +41,10 @@ mutable struct SingleBridgeOptimizer{BT<:AbstractBridge,OT<:MOI.ModelLike} <: MOI.Bridges.AbstractBridgeOptimizer model::OT map::Map # `MOI.ObjectiveFunction` -> objective bridge -end -function SingleBridgeOptimizer{BT}(model::OT) where {BT,OT<:MOI.ModelLike} - return SingleBridgeOptimizer{BT,OT}(model, Map()) + function SingleBridgeOptimizer{BT}(model::OT) where {BT,OT<:MOI.ModelLike} + return new{BT,OT}(model, Map()) + end end bridges(::MOI.Bridges.AbstractBridgeOptimizer) = EmptyMap() diff --git a/src/Bridges/Variable/single_bridge_optimizer.jl b/src/Bridges/Variable/single_bridge_optimizer.jl index 3b7ca9a022..5d466cb609 100644 --- a/src/Bridges/Variable/single_bridge_optimizer.jl +++ b/src/Bridges/Variable/single_bridge_optimizer.jl @@ -50,17 +50,17 @@ mutable struct SingleBridgeOptimizer{BT<:AbstractBridge,OT<:MOI.ModelLike} <: name_to_var::Union{Dict{String,MOI.VariableIndex},Nothing} con_to_name::Dict{MOI.ConstraintIndex,String} name_to_con::Union{Dict{String,MOI.ConstraintIndex},Nothing} -end -function SingleBridgeOptimizer{BT}(model::OT) where {BT,OT<:MOI.ModelLike} - return SingleBridgeOptimizer{BT,OT}( - model, - Map(), - Dict{MOI.VariableIndex,String}(), - nothing, - Dict{MOI.ConstraintIndex,String}(), - nothing, - ) + function SingleBridgeOptimizer{BT}(model::OT) where {BT,OT<:MOI.ModelLike} + return new{BT,OT}( + model, + Map(), + Dict{MOI.VariableIndex,String}(), + nothing, + Dict{MOI.ConstraintIndex,String}(), + nothing, + ) + end end bridges(::MOI.Bridges.AbstractBridgeOptimizer) = EmptyMap() diff --git a/src/Bridges/bridge_optimizer.jl b/src/Bridges/bridge_optimizer.jl index 9851d1ace9..a13ab5093d 100644 --- a/src/Bridges/bridge_optimizer.jl +++ b/src/Bridges/bridge_optimizer.jl @@ -2389,7 +2389,10 @@ end Substitute any bridged [`MOI.VariableIndex`](@ref) in `value` by an equivalent expression in terms of variables of `b.model`. """ -function bridged_function(bridge::AbstractBridgeOptimizer, value) +function bridged_function( + bridge::AbstractBridgeOptimizer, + value::V, +)::V where {V} if !Variable.has_bridges(Variable.bridges(bridge)) # Shortcut, this allows performance to be unaltered when no variable # bridges are used. @@ -2398,10 +2401,9 @@ function bridged_function(bridge::AbstractBridgeOptimizer, value) # We assume that the type of `value` is not altered. This restricts # variable bridges to only return `ScalarAffineFunction` but otherwise, # the performance would be bad. - return MOI.Utilities.substitute_variables( - vi -> bridged_variable_function(bridge, vi), - value, - )::typeof(value) + return MOI.Utilities.substitute_variables(value) do vi + return bridged_variable_function(bridge, vi) + end end function bridged_function(b::AbstractBridgeOptimizer, func::MOI.VariableIndex) diff --git a/src/FileFormats/LP/read.jl b/src/FileFormats/LP/read.jl index 48a0da2893..2aac656a7c 100644 --- a/src/FileFormats/LP/read.jl +++ b/src/FileFormats/LP/read.jl @@ -511,6 +511,11 @@ end _is_number(c::Char) = isdigit(c) || c in ('.', 'e', 'E', '+', '-') +function _is_negative_digit(state, c) + # The type annotation is needed for JET. + return c == '-' && isdigit(peek(state, Char)::Char) +end + function _peek_inner(state::_LexerState) while (c = peek(state, Char)) !== nothing pos = position(state.io) @@ -523,7 +528,7 @@ function _peek_inner(state::_LexerState) while (c = peek(state, Char)) !== nothing && c != '\n' _ = read(state, Char) end - elseif isdigit(c) || (c == '-' && isdigit(peek(state, Char))) # Number + elseif isdigit(c) || _is_negative_digit(state, c) # Number buf = IOBuffer() while (c = peek(state, Char)) !== nothing && _is_number(c) write(buf, c) @@ -826,7 +831,8 @@ function _parse_term( # return _parse_quadratic_expression(state, cache, prefix) end - token = peek(state, _Token) + # The type annotation is needed for JET. + token = peek(state, _Token)::_Token return _throw_parse_error( state, token, @@ -1050,7 +1056,8 @@ function _parse_constraint_sos( f, w = MOI.VectorOfVariables(MOI.VariableIndex[]), T[] while true if _next_token_is(state, _TOKEN_NEWLINE) - t = peek(state, _Token) + # The type annotation is needed for JET. + t = peek(state, _Token)::_Token _throw_parse_error( state, t, @@ -1096,7 +1103,8 @@ function _parse_constraint_indicator( end _ = read(state, _Token, _TOKEN_IMPLIES) f = _parse_expression(state, cache) - set = _parse_set_suffix(state, cache) + # The type annotation is needed for JET. + set = _parse_set_suffix(state, cache)::MOI.AbstractScalarSet return MOI.add_constraint( cache.model, MOI.Utilities.operate(vcat, T, z, f), @@ -1117,7 +1125,8 @@ function _parse_constraint(state::_LexerState, cache::_ReadCache) _parse_constraint_indicator(state, cache) else f = _parse_expression(state, cache) - set = _parse_set_suffix(state, cache) + # The type annotation is needed for JET. + set = _parse_set_suffix(state, cache)::MOI.AbstractScalarSet MOI.add_constraint(cache.model, f, set) end if name !== nothing diff --git a/src/FileFormats/MPS/read.jl b/src/FileFormats/MPS/read.jl index 29d5162d9e..8fe37111e8 100644 --- a/src/FileFormats/MPS/read.jl +++ b/src/FileFormats/MPS/read.jl @@ -432,7 +432,8 @@ function _add_indicator_constraint( scalar = MOI.ScalarAffineTerm(coef, variable_map[data.col_to_name[i]]) push!(terms, MOI.VectorAffineTerm(2, scalar)) end - f = MOI.VectorAffineFunction(terms, zeros(T, 2)) + # The type annotation is needed for JET. + f = MOI.VectorAffineFunction(terms, zeros(T, 2)::Vector{T}) c = MOI.add_constraint(model, f, MOI.Indicator{activate}(set)) MOI.set(model, MOI.ConstraintName(), c, c_name) return diff --git a/src/FileFormats/NL/read.jl b/src/FileFormats/NL/read.jl index 267edea6e3..28e718a4ff 100644 --- a/src/FileFormats/NL/read.jl +++ b/src/FileFormats/NL/read.jl @@ -271,13 +271,15 @@ _try_scalar_affine_function(x::MOI.VariableIndex) = x function _try_scalar_affine_function(expr::Expr) if expr.args[1] == :+ args = _try_scalar_affine_function.(expr.args[2:end]) - if any(isnothing, args) + # The type annotation is needed for JET. + if any(isnothing, args)::Bool return nothing end return MOI.Utilities.operate(+, Float64, args...) elseif expr.args[1] == :* args = _try_scalar_affine_function.(expr.args[2:end]) - if any(isnothing, args) + # The type annotation is needed for JET. + if any(isnothing, args)::Bool return nothing end n_affine_terms = 0 diff --git a/src/Nonlinear/SymbolicAD/SymbolicAD.jl b/src/Nonlinear/SymbolicAD/SymbolicAD.jl index b1c4c8573e..9285faa84b 100644 --- a/src/Nonlinear/SymbolicAD/SymbolicAD.jl +++ b/src/Nonlinear/SymbolicAD/SymbolicAD.jl @@ -1333,7 +1333,12 @@ function Evaluator( constraint_index_by_hash = Dict{UInt64,Vector{Int}}() jac_offset, hess_offset = 0, 0 if model.objective !== nothing - o_sym = _to_symbolic_form(model, model.objective, variable_to_column) + o_sym = _to_symbolic_form( + model, + # The type annotation is needed for JET. + model.objective::MOI.Nonlinear.Expression, + variable_to_column, + ) x, ∇f, H, ∇²f = gradient_and_hessian(x -> x.value > 0, o_sym.f) dag = _DAG(model.operators, Any[o_sym.f; ∇f; ∇²f]) hash_to_dag[o_sym.hash] = dag diff --git a/src/Test/test_conic.jl b/src/Test/test_conic.jl index c353ff0a29..3d69c2abbf 100644 --- a/src/Test/test_conic.jl +++ b/src/Test/test_conic.jl @@ -2175,6 +2175,8 @@ function _test_conic_RotatedSecondOrderCone_helper( MOI.RotatedSecondOrderCone, ) end + # These variables are needed for JET. + vc1, vc2 = nothing, nothing if abvars abx, rsoc = MOI.add_constrained_variables(model, MOI.RotatedSecondOrderCone(4)) @@ -5938,6 +5940,8 @@ function _test_det_cone_helper_ellipsoid( @test MOI.get(model, MOI.NumberOfVariables()) == 1 Q = MOI.add_variables(model, square ? 4 : 3) @test MOI.get(model, MOI.NumberOfVariables()) == (square ? 5 : 4) + # These variables are needed for JET. + u, vc = nothing, nothing if use_logdet u = MOI.add_variable(model) vc = MOI.add_constraint(model, u, MOI.EqualTo(T(1))) diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index 0a37eb4fd6..f3392bbf07 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -382,48 +382,45 @@ function MOI.optimize!(m::CachingOptimizer) end function MOI.add_variable(m::CachingOptimizer) - if m.state == ATTACHED_OPTIMIZER - if m.mode == AUTOMATIC - try - vindex_optimizer = - MOI.add_variable(m.optimizer)::MOI.VariableIndex - catch err - _rethrow_if_not_NotAllowedError(err) - reset_optimizer(m) - end - else - vindex_optimizer = MOI.add_variable(m.optimizer)::MOI.VariableIndex + if m.state != ATTACHED_OPTIMIZER + return MOI.add_variable(m.model_cache) + end + vindex_optimizer = if m.mode == AUTOMATIC + try + MOI.add_variable(m.optimizer)::MOI.VariableIndex + catch err + _rethrow_if_not_NotAllowedError(err) + reset_optimizer(m) + return MOI.add_variable(m) end + else + MOI.add_variable(m.optimizer)::MOI.VariableIndex end vindex = MOI.add_variable(m.model_cache) - if m.state == ATTACHED_OPTIMIZER - m.model_to_optimizer_map[vindex] = vindex_optimizer - m.optimizer_to_model_map[vindex_optimizer] = vindex - end + m.model_to_optimizer_map[vindex] = vindex_optimizer + m.optimizer_to_model_map[vindex_optimizer] = vindex return vindex end function MOI.add_variables(m::CachingOptimizer, n) - if m.state == ATTACHED_OPTIMIZER - if m.mode == AUTOMATIC - try - vindices_optimizer = - MOI.add_variables(m.optimizer, n)::Vector{MOI.VariableIndex} - catch err - _rethrow_if_not_NotAllowedError(err) - reset_optimizer(m) - end - else - vindices_optimizer = - MOI.add_variables(m.optimizer, n)::Vector{MOI.VariableIndex} + if m.state != ATTACHED_OPTIMIZER + return MOI.add_variables(m.model_cache, n) + end + vindices_optimizer = if m.mode == AUTOMATIC + try + MOI.add_variables(m.optimizer, n)::Vector{MOI.VariableIndex} + catch err + _rethrow_if_not_NotAllowedError(err) + reset_optimizer(m) + return MOI.add_variables(m, n) end + else + MOI.add_variables(m.optimizer, n)::Vector{MOI.VariableIndex} end vindices = MOI.add_variables(m.model_cache, n) - if m.state == ATTACHED_OPTIMIZER - for (vindex, vindex_optimizer) in zip(vindices, vindices_optimizer) - m.model_to_optimizer_map[vindex] = vindex_optimizer - m.optimizer_to_model_map[vindex_optimizer] = vindex - end + for (vindex, vindex_optimizer) in zip(vindices, vindices_optimizer) + m.model_to_optimizer_map[vindex] = vindex_optimizer + m.optimizer_to_model_map[vindex_optimizer] = vindex end return vindices end @@ -442,38 +439,26 @@ function MOI.add_constrained_variable( m::CachingOptimizer, set::S, ) where {S<:MOI.AbstractScalarSet} - if m.state == ATTACHED_OPTIMIZER - if m.mode == AUTOMATIC - try - vindex_optimizer, cindex_optimizer = - MOI.add_constrained_variable( - m.optimizer, - set, - )::Tuple{ - MOI.VariableIndex, - MOI.ConstraintIndex{MOI.VariableIndex,S}, - } - catch err - _rethrow_if_not_NotAllowedError(err) - reset_optimizer(m) - end - else - vindex_optimizer, cindex_optimizer = MOI.add_constrained_variable( - m.optimizer, - set, - )::Tuple{ - MOI.VariableIndex, - MOI.ConstraintIndex{MOI.VariableIndex,S}, - } + if m.state != ATTACHED_OPTIMIZER + return MOI.add_constrained_variable(m.model_cache, set) + end + R = Tuple{MOI.VariableIndex,MOI.ConstraintIndex{MOI.VariableIndex,S}} + vindex_optimizer, cindex_optimizer = if m.mode == AUTOMATIC + try + MOI.add_constrained_variable(m.optimizer, set)::R + catch err + _rethrow_if_not_NotAllowedError(err) + reset_optimizer(m) + return MOI.add_constrained_variable(m, set) end + else + MOI.add_constrained_variable(m.optimizer, set)::R end vindex, cindex = MOI.add_constrained_variable(m.model_cache, set) - if m.state == ATTACHED_OPTIMIZER - m.model_to_optimizer_map[vindex] = vindex_optimizer - m.optimizer_to_model_map[vindex_optimizer] = vindex - m.model_to_optimizer_map[cindex] = cindex_optimizer - m.optimizer_to_model_map[cindex_optimizer] = cindex - end + m.model_to_optimizer_map[vindex] = vindex_optimizer + m.optimizer_to_model_map[vindex_optimizer] = vindex + m.model_to_optimizer_map[cindex] = cindex_optimizer + m.optimizer_to_model_map[cindex_optimizer] = cindex return vindex, cindex end @@ -506,41 +491,39 @@ function MOI.add_constrained_variables( m::CachingOptimizer, set::S, ) where {S<:MOI.AbstractVectorSet} - if m.state == ATTACHED_OPTIMIZER - if m.mode == AUTOMATIC - try - vindices_optimizer, cindex_optimizer = - MOI.add_constrained_variables( - m.optimizer, - set, - )::Tuple{ - Vector{MOI.VariableIndex}, - MOI.ConstraintIndex{MOI.VectorOfVariables,S}, - } - catch err - _rethrow_if_not_NotAllowedError(err) - reset_optimizer(m) - end - else - vindices_optimizer, cindex_optimizer = - MOI.add_constrained_variables( - m.optimizer, - set, - )::Tuple{ - Vector{MOI.VariableIndex}, - MOI.ConstraintIndex{MOI.VectorOfVariables,S}, - } + if m.state != ATTACHED_OPTIMIZER + return MOI.add_constrained_variables(m.model_cache, set) + end + vindices_optimizer, cindex_optimizer = if m.mode == AUTOMATIC + try + MOI.add_constrained_variables( + m.optimizer, + set, + )::Tuple{ + Vector{MOI.VariableIndex}, + MOI.ConstraintIndex{MOI.VectorOfVariables,S}, + } + catch err + _rethrow_if_not_NotAllowedError(err) + reset_optimizer(m) + return MOI.add_constrained_variables(m, set) end + else + MOI.add_constrained_variables( + m.optimizer, + set, + )::Tuple{ + Vector{MOI.VariableIndex}, + MOI.ConstraintIndex{MOI.VectorOfVariables,S}, + } end vindices, cindex = MOI.add_constrained_variables(m.model_cache, set) - if m.state == ATTACHED_OPTIMIZER - for (vindex, vindex_optimizer) in zip(vindices, vindices_optimizer) - m.model_to_optimizer_map[vindex] = vindex_optimizer - m.optimizer_to_model_map[vindex_optimizer] = vindex - end - m.model_to_optimizer_map[cindex] = cindex_optimizer - m.optimizer_to_model_map[cindex_optimizer] = cindex + for (vindex, vindex_optimizer) in zip(vindices, vindices_optimizer) + m.model_to_optimizer_map[vindex] = vindex_optimizer + m.optimizer_to_model_map[vindex_optimizer] = vindex end + m.model_to_optimizer_map[cindex] = cindex_optimizer + m.optimizer_to_model_map[cindex_optimizer] = cindex return vindices, cindex end @@ -560,34 +543,34 @@ function MOI.add_constraint( func::F, set::S, ) where {F<:MOI.AbstractFunction,S<:MOI.AbstractSet} - if m.state == ATTACHED_OPTIMIZER - if m.mode == AUTOMATIC - try - cindex_optimizer = MOI.add_constraint( - m.optimizer, - map_indices(m.model_to_optimizer_map, func), - set, - )::MOI.ConstraintIndex{F,S} - catch err - _rethrow_if_not_NotAllowedError(err) - # It could be MOI.AddConstraintNotAllowed{F', S'} with F' != F - # or S' != S if, for example, the `F`-in-`S` constraint is bridged - # to other constraints in `m.optimizer` - reset_optimizer(m) - end - else - cindex_optimizer = MOI.add_constraint( + if m.state != ATTACHED_OPTIMIZER + return MOI.add_constraint(m.model_cache, func, set) + end + cindex_optimizer = if m.mode == AUTOMATIC + try + MOI.add_constraint( m.optimizer, map_indices(m.model_to_optimizer_map, func), set, )::MOI.ConstraintIndex{F,S} + catch err + _rethrow_if_not_NotAllowedError(err) + # It could be MOI.AddConstraintNotAllowed{F', S'} with F' != F + # or S' != S if, for example, the `F`-in-`S` constraint is bridged + # to other constraints in `m.optimizer` + reset_optimizer(m) + return MOI.add_constraint(m, func, set) end + else + MOI.add_constraint( + m.optimizer, + map_indices(m.model_to_optimizer_map, func), + set, + )::MOI.ConstraintIndex{F,S} end cindex = MOI.add_constraint(m.model_cache, func, set) - if m.state == ATTACHED_OPTIMIZER - m.model_to_optimizer_map[cindex] = cindex_optimizer - m.optimizer_to_model_map[cindex_optimizer] = cindex - end + m.model_to_optimizer_map[cindex] = cindex_optimizer + m.optimizer_to_model_map[cindex_optimizer] = cindex return cindex end diff --git a/src/Utilities/distance_to_set.jl b/src/Utilities/distance_to_set.jl index ab485cc749..44dcdb85de 100644 --- a/src/Utilities/distance_to_set.jl +++ b/src/Utilities/distance_to_set.jl @@ -504,9 +504,13 @@ function _reshape(x::AbstractVector, set::MOI.PositiveSemidefiniteConeSquare) return reshape(x, (n, n)) end -function _reshape(x::AbstractVector, set::MOI.PositiveSemidefiniteConeTriangle) +function _reshape( + x::AbstractVector{T}, + set::MOI.PositiveSemidefiniteConeTriangle, +) where {T} n = MOI.side_dimension(set) - X = zeros(eltype(x), n, n) + # The type annotation is needed for JET. + X = zeros(T, n, n)::Matrix{T} k = 1 for i in 1:n for j in 1:i diff --git a/src/Utilities/functions.jl b/src/Utilities/functions.jl index 5826319ec4..e88ae35416 100644 --- a/src/Utilities/functions.jl +++ b/src/Utilities/functions.jl @@ -932,12 +932,14 @@ Sums the coefficients of `t1` and `t2` and returns an output `variable` of `t1` as the `output_index` and `variable` of the output term without checking that they are equal to those of `t2`. """ -function unsafe_add( - t1::T, - t2::T, -) where {T<:Union{MOI.VectorAffineTerm,MOI.VectorQuadraticTerm}} +function unsafe_add(t1::MOI.VectorAffineTerm, t2::MOI.VectorAffineTerm) scalar_term = unsafe_add(t1.scalar_term, t2.scalar_term) - return T(t1.output_index, scalar_term) + return MOI.VectorAffineTerm(t1.output_index, scalar_term) +end + +function unsafe_add(t1::MOI.VectorQuadraticTerm, t2::MOI.VectorQuadraticTerm) + scalar_term = unsafe_add(t1.scalar_term, t2.scalar_term) + return MOI.VectorQuadraticTerm(t1.output_index, scalar_term) end # Generic fallback for items inside NonlinearFunctions like numbers. diff --git a/src/Utilities/lazy_iterators.jl b/src/Utilities/lazy_iterators.jl index 1075fefa04..71c100ab05 100644 --- a/src/Utilities/lazy_iterators.jl +++ b/src/Utilities/lazy_iterators.jl @@ -31,10 +31,10 @@ depending on the type of `data`. struct LazyMap{T,VT,F} f::F data::VT -end -function LazyMap{T}(f, data) where {T} - return LazyMap{T,typeof(data),typeof(f)}(f, data) + function LazyMap{T}(f, data) where {T} + return new{T,typeof(data),typeof(f)}(f, data) + end end """ @@ -62,10 +62,10 @@ depending on the type of `data`. struct VectorLazyMap{T,VT<:AbstractVector,F} <: AbstractVector{T} f::F data::VT -end -function VectorLazyMap{T}(f, data) where {T} - return VectorLazyMap{T,typeof(data),typeof(f)}(f, data) + function VectorLazyMap{T}(f, data) where {T} + return new{T,typeof(data),typeof(f)}(f, data) + end end function lazy_map(::Type{T}, f, data::AbstractVector) where {T} diff --git a/src/Utilities/model.jl b/src/Utilities/model.jl index 93d34e9dc1..fe06b53763 100644 --- a/src/Utilities/model.jl +++ b/src/Utilities/model.jl @@ -295,7 +295,9 @@ function MOI.get(model::AbstractModel, ::Type{MOI.VariableIndex}, name::String) if model.name_to_var === nothing model.name_to_var = build_name_to_var_map(model.var_to_name) end - result = get(model.name_to_var, name, nothing) + # The type annotation is needed for JET. + result = + get(model.name_to_var::Dict{String,MOI.VariableIndex}, name, nothing) throw_if_multiple_with_name(result, name) return result end diff --git a/src/Utilities/set_dot.jl b/src/Utilities/set_dot.jl index a3f7ade562..5abbdc7641 100644 --- a/src/Utilities/set_dot.jl +++ b/src/Utilities/set_dot.jl @@ -292,10 +292,10 @@ julia> MOI.Utilities.operate(*, Float64, Diagonal(a), ones(3)) """ struct SetDotScalingVector{T,S<:MOI.AbstractSet} <: AbstractVector{T} set::S -end -function SetDotScalingVector{T}(s::MOI.AbstractSet) where {T} - return SetDotScalingVector{T,typeof(s)}(s) + function SetDotScalingVector{T}(s::MOI.AbstractSet) where {T} + return new{T,typeof(s)}(s) + end end function Base.getindex(s::SetDotScalingVector{T}, i::Base.Integer) where {T} diff --git a/src/constraints.jl b/src/constraints.jl index 65f6fd27dc..bba3a5a01a 100644 --- a/src/constraints.jl +++ b/src/constraints.jl @@ -95,6 +95,10 @@ An error indicating that the constant part of the function in the constraint """ struct ScalarFunctionConstantNotZero{T,F,S} <: Exception constant::T + + function ScalarFunctionConstantNotZero{T,F,S}(constant::T) where {T,F,S} + return new{T,F,S}(constant) + end end function Base.:(==)(