From 0ba42594936dcfec4e3771a1c6c3222d0f9f59e5 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Fri, 17 Jul 2026 10:42:48 +1200 Subject: [PATCH 1/2] [Nonlinear.SymbolicAD] simplify zero and one terms in simplify! --- src/Nonlinear/SymbolicAD/SymbolicAD.jl | 8 +++++++ test/Nonlinear/test_SymbolicAD.jl | 30 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/Nonlinear/SymbolicAD/SymbolicAD.jl b/src/Nonlinear/SymbolicAD/SymbolicAD.jl index 9285faa84b..c9b8c679b1 100644 --- a/src/Nonlinear/SymbolicAD/SymbolicAD.jl +++ b/src/Nonlinear/SymbolicAD/SymbolicAD.jl @@ -167,6 +167,14 @@ _iszero(x::Any)::Bool = _isnum(x) && iszero(x) _isone(x::Any)::Bool = _isnum(x) && isone(x) +_iszero(x::MOI.ScalarAffineFunction) = iszero(x) + +_isone(x::MOI.ScalarAffineFunction) = isone(x) + +_iszero(x::MOI.ScalarQuadraticFunction) = iszero(x) + +_isone(x::MOI.ScalarQuadraticFunction) = isone(x) + """ _isexpr(f::Any, head::Symbol[, n::Int]) diff --git a/test/Nonlinear/test_SymbolicAD.jl b/test/Nonlinear/test_SymbolicAD.jl index ad60d3541d..047e259ef6 100644 --- a/test/Nonlinear/test_SymbolicAD.jl +++ b/test/Nonlinear/test_SymbolicAD.jl @@ -755,6 +755,36 @@ function test_simplify_if_quadratic() return end +function test_simplify_drops_zeros() + x, y = MOI.VariableIndex.(1:2) + f = MOI.ScalarNonlinearFunction(:/, Any[1.0 * x * x, y]) + for F in ( + MOI.ScalarAffineFunction{Float64}, + MOI.ScalarQuadraticFunction{Float64}, + ) + g = MOI.ScalarNonlinearFunction(:+, Any[zero(F), f]) + @test isapprox(MOI.Nonlinear.SymbolicAD.simplify(g), f) + g = MOI.ScalarNonlinearFunction(:+, Any[f, zero(F)]) + @test isapprox(MOI.Nonlinear.SymbolicAD.simplify(g), f) + end + return +end + +function test_simplify_drops_zeros() + x, y = MOI.VariableIndex.(1:2) + f = MOI.ScalarNonlinearFunction(:/, Any[1.0 * x * x, y]) + for F in ( + MOI.ScalarAffineFunction{Float64}, + MOI.ScalarQuadraticFunction{Float64}, + ) + g = MOI.ScalarNonlinearFunction(:*, Any[one(F), f]) + @test isapprox(MOI.Nonlinear.SymbolicAD.simplify(g), f) + g = MOI.ScalarNonlinearFunction(:*, Any[f, one(F)]) + @test isapprox(MOI.Nonlinear.SymbolicAD.simplify(g), f) + end + return +end + end # module TestMathOptSymbolicAD.runtests() From 1f34cc10a94b13da1cb4562f63b62a292d0eaac3 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Fri, 17 Jul 2026 10:49:47 +1200 Subject: [PATCH 2/2] Update --- test/Nonlinear/test_SymbolicAD.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Nonlinear/test_SymbolicAD.jl b/test/Nonlinear/test_SymbolicAD.jl index 047e259ef6..a123100d17 100644 --- a/test/Nonlinear/test_SymbolicAD.jl +++ b/test/Nonlinear/test_SymbolicAD.jl @@ -757,7 +757,7 @@ end function test_simplify_drops_zeros() x, y = MOI.VariableIndex.(1:2) - f = MOI.ScalarNonlinearFunction(:/, Any[1.0 * x * x, y]) + f = MOI.ScalarNonlinearFunction(:/, Any[1.0*x*x, y]) for F in ( MOI.ScalarAffineFunction{Float64}, MOI.ScalarQuadraticFunction{Float64}, @@ -770,9 +770,9 @@ function test_simplify_drops_zeros() return end -function test_simplify_drops_zeros() +function test_simplify_drops_ones() x, y = MOI.VariableIndex.(1:2) - f = MOI.ScalarNonlinearFunction(:/, Any[1.0 * x * x, y]) + f = MOI.ScalarNonlinearFunction(:/, Any[1.0*x*x, y]) for F in ( MOI.ScalarAffineFunction{Float64}, MOI.ScalarQuadraticFunction{Float64},