Operator overloading causes a large number of intermediate expressions to be generated:
julia> using JuMP
julia> function Base.:+(a::NonlinearExpression, b::NonlinearExpression)
return @NLexpression(model, a + b)
end
julia> model = Model()
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: NO_OPTIMIZER
Solver name: No optimizer attached.
julia> @variable(model, x)
x
julia> expr = @NLexpression(model, sin(x))
"Reference to nonlinear expression #1"
julia> expr_2 = sum(expr for _ in 1:10)
"Reference to nonlinear expression #10"
The macros rewrite things behind the scenes for efficiency, which is critical for achieving performance in any realistic sized instances.