JuliaSymbolics / Symbolics.jl

Symbolic programming for the next generation of numerical software
https://docs.sciml.ai/Symbolics/stable/
Other
1.36k stars 151 forks source link

`islinear` fails on expressions when getindex on other variables is involved #847

Open lassepe opened 1 year ago

lassepe commented 1 year ago

The following MWE fails:

using Symbolics: Symbolics

x = Symbolics.scalarize(only(Symbolics.@variables(x[1:2])))
y = Symbolics.scalarize(only(Symbolics.@variables(y[1:2])))
z = (x[1] + x[2]) * (y[1] + y[2])
Symbolics.islinear(z, x)

with the error: ERROR: Failed to apply rule (~f)(~x, ~y) => begin ... caused by: Function of unknown linearity used: getindex

Click for full error message. ```julia ERROR: Failed to apply rule (~f)(~x, ~y) => begin #= /home/lassepe/.julia/packages/Symbolics/Pc9IW/src/diff.jl:638 =# if haslinearity_2(~f) #= /home/lassepe/.julia/packages/Symbolics/Pc9IW/src/diff.jl:639 =# a = if isidx(~x) ~x else _scalar end #= /home/lassepe/.julia/packages/Symbolics/Pc9IW/src/diff.jl:640 =# b = if isidx(~y) ~y else _scalar end #= /home/lassepe/.julia/packages/Symbolics/Pc9IW/src/diff.jl:641 =# combine_terms_2(linearity_2(~f), a, b) else #= /home/lassepe/.julia/packages/Symbolics/Pc9IW/src/diff.jl:643 =# error("Function of unknown linearity used: ", ~f) end end on expression 0[1] Stacktrace: [1] (::SymbolicUtils.Rule{SymbolicUtils.BasicSymbolic{Any}, SymbolicUtils.var"#term_matcher#98"{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}, Symbolics.var"#247#255"{Symbolics.TermCombination}})(term::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/rule.jl:145 [2] (::SymbolicUtils.Rewriters.Chain)(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:69 [3] (::SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:200 [4] (::SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:188 [5] iterate @ ./generator.jl:47 [inlined] [6] _collect(c::Vector{Any}, itr::Base.Generator{Vector{Any}, SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{1}) @ Base ./array.jl:807 [7] collect_similar @ ./array.jl:716 [inlined] [8] map(f::SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}, A::Vector{Any}) @ Base ./abstractarray.jl:2933 [9] (::SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:198 [10] (::SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:188 [11] iterate @ ./generator.jl:47 [inlined] [12] collect_to!(dest::Vector{Symbolics.TermCombination}, itr::Base.Generator{Vector{Any}, SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}}, offs::Int64, st::Int64) @ Base ./array.jl:845 [13] collect_to_with_first!(dest::Vector{Symbolics.TermCombination}, v1::Symbolics.TermCombination, itr::Base.Generator{Vector{Any}, SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}}, st::Int64) @ Base ./array.jl:823 [14] _collect(c::Vector{Any}, itr::Base.Generator{Vector{Any}, SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{1}) @ Base ./array.jl:817 [15] collect_similar @ ./array.jl:716 [inlined] [16] map(f::SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}, A::Vector{Any}) @ Base ./abstractarray.jl:2933 [17] (::SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:198 [18] (::SymbolicUtils.Rewriters.Fixpoint{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:118 [19] hessian_sparsity(expr::Symbolics.Num, vars::Vector{Symbolics.Num}) @ Symbolics ~/.julia/packages/Symbolics/Pc9IW/src/diff.jl:682 [20] isaffine @ ~/.julia/packages/Symbolics/Pc9IW/src/diff.jl:721 [inlined] [21] islinear(ex::Symbolics.Num, u::Vector{Symbolics.Num}) @ Symbolics ~/.julia/packages/Symbolics/Pc9IW/src/diff.jl:730 [22] top-level scope @ REPL[15]:1 [23] top-level scope @ ~/.julia/packages/Infiltrator/r3Hf5/src/Infiltrator.jl:710 caused by: Function of unknown linearity used: getindex Stacktrace: [1] error(::String, ::Function) @ Base ./error.jl:44 [2] macro expansion @ ~/.julia/packages/Symbolics/Pc9IW/src/diff.jl:643 [inlined] [3] (::Symbolics.var"#247#255"{Symbolics.TermCombination})(__MATCHES__::Base.ImmutableDict{Symbol, Any}) @ Symbolics ~/.julia/packages/SymbolicUtils/Vzo2s/src/rule.jl:314 [4] macro expansion @ ~/.julia/packages/SymbolicUtils/Vzo2s/src/utils.jl:11 [inlined] [5] (::SymbolicUtils.var"#success#85"{Symbolics.var"#247#255"{Symbolics.TermCombination}})(bindings::Base.ImmutableDict{Symbol, Any}, n::Int64) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/rule.jl:142 [6] (::SymbolicUtils.var"#loop#99"{SymbolicUtils.var"#success#85"{Symbolics.var"#247#255"{Symbolics.TermCombination}}})(term::SymbolicUtils.LL{Vector{Any}}, bindings′::Base.ImmutableDict{Symbol, Any}, matchers′::SymbolicUtils.LL{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:97 [7] (::SymbolicUtils.var"#97#100"{SymbolicUtils.LL{Vector{Any}}, SymbolicUtils.LL{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}})(b::Base.ImmutableDict{Symbol, Any}, n::Int64) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:102 [8] (::SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}})(next::SymbolicUtils.var"#97#100"{SymbolicUtils.LL{Vector{Any}}, SymbolicUtils.LL{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}}, data::SymbolicUtils.LL{Vector{Any}}, bindings::Base.ImmutableDict{Symbol, Any}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:25 [9] (::SymbolicUtils.var"#loop#99"{SymbolicUtils.var"#success#85"{Symbolics.var"#247#255"{Symbolics.TermCombination}}})(term::SymbolicUtils.LL{Vector{Any}}, bindings′::Base.ImmutableDict{Symbol, Any}, matchers′::SymbolicUtils.LL{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:101 [10] (::SymbolicUtils.var"#97#100"{SymbolicUtils.LL{Vector{Any}}, SymbolicUtils.LL{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}})(b::Base.ImmutableDict{Symbol, Any}, n::Int64) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:102 [11] (::SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}})(next::SymbolicUtils.var"#97#100"{SymbolicUtils.LL{Vector{Any}}, SymbolicUtils.LL{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}}, data::SymbolicUtils.LL{Vector{Any}}, bindings::Base.ImmutableDict{Symbol, Any}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:25 [12] (::SymbolicUtils.var"#loop#99"{SymbolicUtils.var"#success#85"{Symbolics.var"#247#255"{Symbolics.TermCombination}}})(term::SymbolicUtils.LL{Vector{Any}}, bindings′::Base.ImmutableDict{Symbol, Any}, matchers′::SymbolicUtils.LL{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:101 [13] (::SymbolicUtils.var"#97#100"{SymbolicUtils.BasicSymbolic{Any}, Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}})(b::Base.ImmutableDict{Symbol, Any}, n::Int64) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:102 [14] (::SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}})(next::SymbolicUtils.var"#97#100"{SymbolicUtils.BasicSymbolic{Any}, Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}, data::SymbolicUtils.BasicSymbolic{Any}, bindings::Base.ImmutableDict{Symbol, Any}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:25 [15] (::SymbolicUtils.var"#loop#99"{SymbolicUtils.var"#success#85"{Symbolics.var"#247#255"{Symbolics.TermCombination}}})(term::SymbolicUtils.BasicSymbolic{Any}, bindings′::Base.ImmutableDict{Symbol, Any}, matchers′::Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:101 [16] (::SymbolicUtils.var"#term_matcher#98"{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}})(success::SymbolicUtils.var"#success#85"{Symbolics.var"#247#255"{Symbolics.TermCombination}}, data::Tuple{SymbolicUtils.BasicSymbolic{Any}}, bindings::Base.ImmutableDict{Symbol, Any}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/matchers.jl:106 [17] (::SymbolicUtils.Rule{SymbolicUtils.BasicSymbolic{Any}, SymbolicUtils.var"#term_matcher#98"{Tuple{SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}, SymbolicUtils.var"#slot_matcher#95"{SymbolicUtils.Slot{typeof(SymbolicUtils.alwaystrue)}}}}, Symbolics.var"#247#255"{Symbolics.TermCombination}})(term::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils ~/.julia/packages/SymbolicUtils/Vzo2s/src/rule.jl:143 [18] (::SymbolicUtils.Rewriters.Chain)(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:69 [19] (::SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:200 [20] (::SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:188 [21] iterate @ ./generator.jl:47 [inlined] [22] _collect(c::Vector{Any}, itr::Base.Generator{Vector{Any}, SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{1}) @ Base ./array.jl:807 [23] collect_similar @ ./array.jl:716 [inlined] [24] map(f::SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}, A::Vector{Any}) @ Base ./abstractarray.jl:2933 [25] (::SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:198 [26] (::SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:188 [27] iterate @ ./generator.jl:47 [inlined] [28] collect_to!(dest::Vector{Symbolics.TermCombination}, itr::Base.Generator{Vector{Any}, SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}}, offs::Int64, st::Int64) @ Base ./array.jl:845 [29] collect_to_with_first!(dest::Vector{Symbolics.TermCombination}, v1::Symbolics.TermCombination, itr::Base.Generator{Vector{Any}, SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}}, st::Int64) @ Base ./array.jl:823 [30] _collect(c::Vector{Any}, itr::Base.Generator{Vector{Any}, SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{1}) @ Base ./array.jl:817 [31] collect_similar @ ./array.jl:716 [inlined] [32] map(f::SymbolicUtils.Rewriters.PassThrough{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}}, A::Vector{Any}) @ Base ./abstractarray.jl:2933 [33] (::SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:198 [34] (::SymbolicUtils.Rewriters.Fixpoint{SymbolicUtils.Rewriters.Walk{:post, SymbolicUtils.Rewriters.Chain, typeof(Symbolics.basic_simterm), false}})(x::SymbolicUtils.BasicSymbolic{Any}) @ SymbolicUtils.Rewriters ~/.julia/packages/SymbolicUtils/Vzo2s/src/rewriters.jl:118 [35] hessian_sparsity(expr::Symbolics.Num, vars::Vector{Symbolics.Num}) @ Symbolics ~/.julia/packages/Symbolics/Pc9IW/src/diff.jl:682 [36] isaffine @ ~/.julia/packages/Symbolics/Pc9IW/src/diff.jl:721 [inlined] [37] islinear(ex::Symbolics.Num, u::Vector{Symbolics.Num}) @ Symbolics ~/.julia/packages/Symbolics/Pc9IW/src/diff.jl:730 [38] top-level scope @ REPL[15]:1 [39] top-level scope @ ~/.julia/packages/Infiltrator/r3Hf5/src/Infiltrator.jl:710 ```

Interestingly, however, getindex is not a problem if no other variables are involved. For example, the following code works as expected:

x = Symbolics.scalarize(only(Symbolics.@variables(x[1:2])))
z = (x[1] + x[2])
Symbolics.islinear(z, x)
tmigot commented 1 year ago

This seems connected to #790