Skip to content

Commit 9bfacfa

Browse files
authored
[FileFormats.NL] fix nested scalar affine and quadratic functions (#2231)
1 parent 0789f40 commit 9bfacfa

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/FileFormats/NL/NLExpr.jl

+12
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,18 @@ function _process_expr!(expr::_NLExpr, arg::Expr)
409409
return error("Unsupported expression: $(arg)")
410410
end
411411

412+
function _process_expr!(
413+
expr::_NLExpr,
414+
arg::Union{MOI.ScalarAffineFunction,MOI.ScalarQuadraticFunction},
415+
)
416+
# This method gets called recursively from the arguments to
417+
# ScalarNonlinearFunction, so we cannot add the linear parts to
418+
# `expr.linear_terms`.
419+
f = convert(MOI.ScalarNonlinearFunction, arg)
420+
_process_expr!(expr, f)
421+
return
422+
end
423+
412424
function _process_expr!(expr::_NLExpr, arg::MOI.ScalarNonlinearFunction)
413425
if length(arg.args) == 1
414426
f = get(_UNARY_SPECIAL_CASES, arg.head, nothing)

test/FileFormats/NL/NL.jl

+18
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,24 @@ function test_nlexpr_scalarnonlinearfunction_ternary_multiplication()
167167
return
168168
end
169169

170+
function test_nlexpr_scalarnonlinearfunction_inner_functions()
171+
x = MOI.VariableIndex(1)
172+
f = 1.0 * x + 1.0
173+
g = 2.0 * x * x + 3.0 * x + 4.0
174+
f = MOI.ScalarNonlinearFunction(:*, Any[2.0, x, f, g])
175+
ex = Expr(
176+
:call,
177+
:*,
178+
2.0,
179+
x,
180+
:(1.0 * $x + 1.0),
181+
:(2.0 * $x * $x + 3.0 * $x + 4.0),
182+
)
183+
expr = NL._NLExpr(ex)
184+
_test_nlexpr(f, expr.nonlinear_terms, Dict(x => 0), 0.0)
185+
return
186+
end
187+
170188
function test_nlexpr_unary_addition()
171189
x = MOI.VariableIndex(1)
172190
return _test_nlexpr(:(+$x), [x], Dict(x => 0), 0.0)

0 commit comments

Comments
 (0)