Operations on NonlinearExpressions

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.

1 Like