@@ -596,18 +596,29 @@ moi_function(x::Number) = x
596596# `moi_function(AbstractArray{<:AbstractVariableRef})`
597597moi_function (x:: AbstractArray ) = moi_function .(x)
598598
599- function moi_function (f:: GenericNonlinearExpr{V} ) where {V}
599+ function moi_function (model:: GenericModel , f:: GenericNonlinearExpr{V} ) where {V}
600+ key = objectid (f)
601+ if haskey (model. subexpressions, key)
602+ return model. subexpressions[key]
603+ end
600604 ret = MOI. ScalarNonlinearFunction (f. head, similar (f. args))
601605 stack = Tuple{MOI. ScalarNonlinearFunction,Int,GenericNonlinearExpr{V}}[]
602606 for i in length (f. args): - 1 : 1
603607 if f. args[i] isa GenericNonlinearExpr{V}
604608 push! (stack, (ret, i, f. args[i]))
609+ elseif f. args[i] isa AbstractJuMPScalar
610+ ret. args[i] = moi_function (model, f. args[i])
605611 else
606612 ret. args[i] = moi_function (f. args[i])
607613 end
608614 end
609615 while ! isempty (stack)
610616 parent, i, arg = pop! (stack)
617+ arg_key = objectid (arg)
618+ if haskey (model. subexpressions, arg_key)
619+ parent. args[i] = model. subexpressions[arg_key]
620+ continue
621+ end
611622 child = MOI. ScalarNonlinearFunction (arg. head, similar (arg. args))
612623 parent. args[i] = child
613624 for j in length (arg. args): - 1 : 1
@@ -617,7 +628,9 @@ function moi_function(f::GenericNonlinearExpr{V}) where {V}
617628 child. args[j] = moi_function (arg. args[j])
618629 end
619630 end
631+ model. subexpressions[arg_key] = child
620632 end
633+ model. subexpressions[key] = ret
621634 return ret
622635end
623636
@@ -1239,7 +1252,8 @@ function moi_function(f::AbstractVector{<:GenericNonlinearExpr})
12391252end
12401253
12411254function MOI. VectorNonlinearFunction (f:: Vector{<:AbstractJuMPScalar} )
1242- return MOI. VectorNonlinearFunction (map (moi_function, f))
1255+ model = owner_model (first (f))
1256+ return MOI. VectorNonlinearFunction (moi_function .(model, f))
12431257end
12441258
12451259"""
12851299```
12861300"""
12871301function simplify (model:: GenericModel , f:: AbstractJuMPScalar )
1288- g = MOI. Nonlinear. SymbolicAD. simplify (moi_function (f))
1302+ g = MOI. Nonlinear. SymbolicAD. simplify (moi_function (model, f))
12891303 return jump_function (model, g)
12901304end
12911305
@@ -1336,7 +1350,8 @@ function derivative(
13361350 f:: AbstractJuMPScalar ,
13371351 x:: GenericVariableRef{T} ,
13381352) where {T}
1339- df_dx = MOI. Nonlinear. SymbolicAD. derivative (moi_function (f), index (x))
1353+ df_dx =
1354+ MOI. Nonlinear. SymbolicAD. derivative (moi_function (model, f), index (x))
13401355 return jump_function (model, MOI. Nonlinear. SymbolicAD. simplify! (df_dx))
13411356end
13421357
@@ -1381,7 +1396,7 @@ julia> ∇f[y]
13811396```
13821397"""
13831398function gradient (model:: GenericModel{T} , f:: AbstractJuMPScalar ) where {T}
1384- g = moi_function (f)
1399+ g = moi_function (model, f)
13851400 ∇f = Dict {GenericVariableRef{T},Any} ()
13861401 for xi in MOI. Nonlinear. SymbolicAD. variables (g)
13871402 df_dx = MOI. Nonlinear. SymbolicAD. simplify! (
0 commit comments