Skip to content

simplify and expand: ArgumentError: array must be non-empty #868

@omerchor

Description

@omerchor

Consider this simple code, simplifying the solution of some quadratic equation:

using Symbolics

@variables β

b = (1+8*β^2)/(2*(1-β^2))
x_coeff = (b^2 + 2*b - 2)
x2_coeff = 1
one_coeff = 1 - 2*b
sol = (- x_coeff + sqrt(x_coeff^2 - 4 * x2_coeff * one_coeff)) / (2 * x2_coeff)

# This works
simplify(sol, expand=false)

# This raises an exception
simplify(sol, expand=true)

# This works
expand(sol)

Strangely, the line simplify(sol, expand=true) causes an error, while simplification without expand, or just expand without simplification, work perfectly fine. simplify(expand(sol)) raises the same exception as well.

Stack trace:

ERROR: ArgumentError: array must be non-empty
Stacktrace:
[1] _throw_argerror(s::String)
@ Base .\array.jl:317
[2] pop!
@ .\array.jl:1613 [inlined]
[3] operate!(::typeof(MultivariatePolynomials.remove_leading_term), p::DynamicPolynomials.Polynomial{…})
@ DynamicPolynomials C:\Users\OmerChor.julia\packages\DynamicPolynomials\zmLM4\src\poly.jl:179
[4] buffered_operate!(buffer::Nothing, op::typeof(MultivariatePolynomials.pseudo_rem), f::DynamicPolynomials.Polynomial{…}, g::DynamicPolynomials.Polynomial{…}, algo::MultivariatePolynomials.SubresultantAlgorithm)
@ MultivariatePolynomials C:\Users\OmerChor.julia\packages\MultivariatePolynomials\yR88J\src\division.jl:318
[5] primitive_univariate_gcd!(p::DynamicPolynomials.Polynomial{…}, q::DynamicPolynomials.Polynomial{…}, algo::MultivariatePolynomials.SubresultantAlgorithm)
@ MultivariatePolynomials C:\Users\OmerChor.julia\packages\MultivariatePolynomials\yR88J\src\gcd.jl:598
[6] primitive_univariate_gcd!(p::DynamicPolynomials.Polynomial{…}, q::DynamicPolynomials.Polynomial{…}, algo::MultivariatePolynomials.SubresultantAlgorithm)
@ MultivariatePolynomials C:\Users\OmerChor.julia\packages\MultivariatePolynomials\yR88J\src\gcd.jl:604
[7] univariate_gcd(::MultivariatePolynomials.UniqueFactorizationDomain, p1::DynamicPolynomials.Polynomial{…}, p2::DynamicPolynomials.Polynomial{…}, algo::MultivariatePolynomials.SubresultantAlgorithm, m1::MutableArithmetics.IsNotMutable, m2::MutableArithmetics.IsNotMutable)
@ MultivariatePolynomials C:\Users\OmerChor.julia\packages\MultivariatePolynomials\yR88J\src\gcd.jl:773
[8] univariate_gcd
@ C:\Users\OmerChor.julia\packages\MultivariatePolynomials\yR88J\src\gcd.jl:754 [inlined]
[9] deflated_gcd(p1::DynamicPolynomials.Polynomial{…}, p2::DynamicPolynomials.Polynomial{…}, algo::MultivariatePolynomials.SubresultantAlgorithm, m1::MutableArithmetics.IsNotMutable, m2::MutableArithmetics.IsNotMutable)
@ MultivariatePolynomials C:\Users\OmerChor.julia\packages\MultivariatePolynomials\yR88J\src\gcd.jl:358
[10] gcd(p1::DynamicPolynomials.Polynomial{…}, p2::DynamicPolynomials.Polynomial{…}, algo::MultivariatePolynomials.SubresultantAlgorithm, m1::MutableArithmetics.IsNotMutable, m2::MutableArithmetics.IsNotMutable)
@ MultivariatePolynomials C:\Users\OmerChor.julia\packages\MultivariatePolynomials\yR88J\src\gcd.jl:207
[11] gcd (repeats 2 times)
@ C:\Users\OmerChor.julia\packages\MultivariatePolynomials\yR88J\src\gcd.jl:185 [inlined]
[12] gcd(p1::DynamicPolynomials.Polynomial{…}, p2::DynamicPolynomials.Polynomial{…})
@ MultivariatePolynomials C:\Users\OmerChor.julia\packages\MultivariatePolynomials\yR88J\src\gcd.jl:185
[13] safe_gcd(p1::DynamicPolynomials.Polynomial{…}, p2::DynamicPolynomials.Polynomial{…})
@ SymbolicUtils C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\polyform.jl:242
[14] simplify_div(num::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…}, den::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\polyform.jl:251
[15] simplify_div(d::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymReal})
@ SymbolicUtils C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\polyform.jl:198
[16] call_composed(fs::Tuple{…}, x::Tuple{…}, kw::@kwargs{})
@ Base .\operators.jl:1099
[17] (::ComposedFunction{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…}; kw::@kwargs{})
@ Base .\operators.jl:1096
[18] macro expansion
@ .\some.jl:158 [inlined]
[19] (::SymbolicUtils.Rewriters.Walk{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils.Rewriters C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\rewriters.jl:416
[20] (::SymbolicUtils.Rewriters.PassThrough{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils.Rewriters C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\rewriters.jl:388
[21] (::SymbolicUtils.Rewriters.Walk{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils.Rewriters C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\rewriters.jl:402
[22] (::SymbolicUtils.Rewriters.PassThrough{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils.Rewriters C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\rewriters.jl:388
[23] (::SymbolicUtils.Rewriters.Walk{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils.Rewriters C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\rewriters.jl:402
[24] (::SymbolicUtils.Rewriters.PassThrough{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils.Rewriters C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\rewriters.jl:388
[25] (::SymbolicUtils.Rewriters.Walk{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils.Rewriters C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\rewriters.jl:402
[26] (::SymbolicUtils.Rewriters.PassThrough{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils.Rewriters C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\rewriters.jl:388
[27] (::SymbolicUtils.Rewriters.Walk{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…})
@ SymbolicUtils.Rewriters C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\rewriters.jl:402
[28] call_composed(fs::Tuple{…}, x::Tuple{…}, kw::@kwargs{})
@ Base .\operators.jl:1099
[29] (::ComposedFunction{…})(x::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{…}; kw::@kwargs{})
@ Base .\operators.jl:1096
[30] simplify_fractions
@ C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\polyform.jl:481 [inlined]
[31] #simplify#431
@ C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\simplify.jl:42 [inlined]
[32] simplify
@ C:\Users\OmerChor.julia\packages\SymbolicUtils\OjG8E\src\simplify.jl:16 [inlined]
[33] simplify(n::Num; kw::@kwargs{expand::Bool})
@ Symbolics C:\Users\OmerChor.julia\packages\Symbolics\29fkz\src\Symbolics.jl:231
[34] top-level scope

I'm running Julia 1.12.5 with Symbolics v7.15.1 and SymbolicUtils v4.18.5.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions