Skip to content

Add missing ArrayMaker case to __get_degrees#860

Merged
AayushSabharwal merged 1 commit intoJuliaSymbolics:masterfrom
xtalax:fix-arraymaker-get-degrees
Feb 16, 2026
Merged

Add missing ArrayMaker case to __get_degrees#860
AayushSabharwal merged 1 commit intoJuliaSymbolics:masterfrom
xtalax:fix-arraymaker-get-degrees

Conversation

@xtalax
Copy link

@xtalax xtalax commented Feb 16, 2026

Summary

The @match in __get_degrees (in src/ordering.jl) handles Const, Sym, Term, Div, AddMul, and ArrayOp but is missing ArrayMaker, causing a MatchError when ArrayMaker expressions are compared using the <ₑ ordering operator. This blocks MethodOfLines.jl array discretization which produces ArrayMaker expressions that need to participate in symbolic ordering.

Changes:

  • Add BSImpl.ArrayMaker(;) case to __get_degrees, using the same default-degrees logic as ArrayOp
  • Add a _ fallthrough case for defensive programming against future ADT variant expansions

Test plan

  • Existing SymbolicUtils tests pass (no regressions — the new cases only handle previously-crashing inputs)
  • MethodOfLines.jl array discretization no longer hits MatchError when ArrayMaker expressions are ordered

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Contributor

Benchmark Results (Julia vlts)

Time benchmarks
master 5960a51... master / 5960a51...
arithmetic/2-arg mul 13.7 ± 0.38 μs 13.1 ± 0.35 μs 1.05 ± 0.04
arithmetic/addition 0.0824 ± 0.0012 ms 0.0782 ± 0.0014 ms 1.05 ± 0.024
arithmetic/division 27.9 ± 0.66 μs 26.7 ± 0.71 μs 1.05 ± 0.037
arithmetic/multiplication 0.0654 ± 0.0021 ms 0.0621 ± 0.0023 ms 1.05 ± 0.051
overhead/acrule/a+2 2.3 ± 0.04 μs 2.35 ± 0.041 μs 0.983 ± 0.024
overhead/acrule/a+2+b 0.07 ± 0.001 μs 0.07 ± 0 μs 1 ± 0.014
overhead/acrule/a+b 3.99 ± 0.071 μs 4.13 ± 0.18 μs 0.966 ± 0.046
overhead/acrule/noop:Int 0.049 ± 0.01 μs 0.05 ± 0.01 μs 0.98 ± 0.28
overhead/acrule/noop:Sym 0.051 ± 0.01 μs 0.051 ± 0.01 μs 1 ± 0.28
overhead/get_degrees/large_poly 0.08 ± 0.001 μs 0.09 ± 0.01 μs 0.889 ± 0.099
overhead/rule/noop:Int 0.06 ± 0.01 μs 0.069 ± 0.01 μs 0.87 ± 0.19
overhead/rule/noop:Sym 0.06 ± 0.01 μs 0.06 ± 0.001 μs 1 ± 0.17
overhead/rule/noop:Term 0.06 ± 0.01 μs 0.06 ± 0.001 μs 1 ± 0.17
overhead/ruleset/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/ruleset/noop:Sym 0.301 ± 0.001 μs 0.301 ± 0.001 μs 1 ± 0.0047
overhead/ruleset/noop:Term 1.21 ± 0.02 μs 1.23 ± 0.02 μs 0.984 ± 0.023
overhead/simplify/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/simplify/noop:Sym 30 ± 10 ns 30 ± 10 ns 1 ± 0.47
overhead/simplify/noop:Term 27.4 ± 0.84 μs 28.3 ± 0.98 μs 0.968 ± 0.045
overhead/simplify/randterm (+, *):serial 0.23 ± 0.0017 s 0.237 ± 0.0025 s 0.972 ± 0.012
overhead/simplify/randterm (+, *):thread 0.252 ± 0.0078 s 0.265 ± 0.019 s 0.952 ± 0.076
overhead/simplify/randterm (/, *):serial 0.0851 ± 0.0025 ms 0.0855 ± 0.0026 ms 0.995 ± 0.043
overhead/simplify/randterm (/, *):thread 0.0891 ± 0.0025 ms 0.0891 ± 0.0024 ms 1 ± 0.039
overhead/substitute/a 0.0415 ± 0.0012 ms 0.0416 ± 0.0012 ms 0.997 ± 0.039
overhead/substitute/a,b 0.0494 ± 0.0013 ms 0.0498 ± 0.0013 ms 0.992 ± 0.036
overhead/substitute/a,b,c 0.0445 ± 0.0011 ms 0.0461 ± 0.0012 ms 0.964 ± 0.034
polyform/easy_iszero 22.5 ± 0.5 μs 22.9 ± 0.5 μs 0.982 ± 0.031
polyform/isone 1.06 ± 0.03 ms 1.06 ± 0.028 ms 1 ± 0.039
polyform/isone:noop 0.081 ± 0.01 μs 0.09 ± 0.01 μs 0.9 ± 0.15
polyform/iszero 0.909 ± 0.027 ms 0.905 ± 0.023 ms 1.01 ± 0.039
polyform/iszero:noop 0.09 ± 0 μs 0.09 ± 0.01 μs 1 ± 0.11
polyform/simplify_fractions 1.15 ± 0.028 ms 1.15 ± 0.028 ms 1 ± 0.035
printing/large_poly 0.207 ± 0.00091 s 0.208 ± 0.00099 s 0.996 ± 0.0065
time_to_load 1.27 ± 0.014 s 1.26 ± 0.0037 s 1.01 ± 0.011
Memory benchmarks
master 5960a51... master / 5960a51...
arithmetic/2-arg mul 0.077 k allocs: 2.69 kB 0.078 k allocs: 2.72 kB 0.989
arithmetic/addition 0.438 k allocs: 16 kB 0.438 k allocs: 16 kB 1
arithmetic/division 0.14 k allocs: 5.41 kB 0.142 k allocs: 5.47 kB 0.989
arithmetic/multiplication 0.356 k allocs: 11.7 kB 0.356 k allocs: 11.7 kB 1
overhead/acrule/a+2 0.033 k allocs: 1.23 kB 0.034 k allocs: 1.25 kB 0.988
overhead/acrule/a+2+b 0 allocs: 0 B 0 allocs: 0 B
overhead/acrule/a+b 0.045 k allocs: 1.77 kB 0.047 k allocs: 1.8 kB 0.983
overhead/acrule/noop:Int 0 allocs: 0 B 0 allocs: 0 B
overhead/acrule/noop:Sym 0 allocs: 0 B 0 allocs: 0 B
overhead/get_degrees/large_poly 2 allocs: 32 B 2 allocs: 32 B 1
overhead/rule/noop:Int 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
overhead/rule/noop:Sym 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
overhead/rule/noop:Term 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
overhead/ruleset/noop:Int 0 allocs: 0 B 0 allocs: 0 B
overhead/ruleset/noop:Sym 3 allocs: 0.109 kB 3 allocs: 0.109 kB 1
overhead/ruleset/noop:Term 12 allocs: 0.391 kB 12 allocs: 0.391 kB 1
overhead/simplify/noop:Int 0 allocs: 0 B 0 allocs: 0 B
overhead/simplify/noop:Sym 0 allocs: 0 B 0 allocs: 0 B
overhead/simplify/noop:Term 0.282 k allocs: 11.4 kB 0.298 k allocs: 11.6 kB 0.979
overhead/simplify/randterm (+, *):serial 2.21 M allocs: 0.0869 GB 2.3 M allocs: 0.0882 GB 0.986
overhead/simplify/randterm (+, *):thread 2.26 M allocs: 0.245 GB 2.34 M allocs: 0.246 GB 0.995
overhead/simplify/randterm (/, *):serial 0.781 k allocs: 29.4 kB 0.844 k allocs: 30.4 kB 0.968
overhead/simplify/randterm (/, *):thread 0.816 k allocs: 30.5 kB 0.879 k allocs: 31.5 kB 0.969
overhead/substitute/a 0.22 k allocs: 8.42 kB 0.22 k allocs: 8.42 kB 1
overhead/substitute/a,b 0.267 k allocs: 10.1 kB 0.267 k allocs: 10.1 kB 1
overhead/substitute/a,b,c 0.238 k allocs: 8.62 kB 0.238 k allocs: 8.62 kB 1
polyform/easy_iszero 0.127 k allocs: 4.48 kB 0.133 k allocs: 4.58 kB 0.98
polyform/isone 8 k allocs: 0.561 MB 8.34 k allocs: 0.567 MB 0.99
polyform/isone:noop 1 allocs: 16 B 1 allocs: 16 B 1
polyform/iszero 6.71 k allocs: 0.464 MB 6.87 k allocs: 0.467 MB 0.994
polyform/iszero:noop 1 allocs: 16 B 1 allocs: 16 B 1
polyform/simplify_fractions 8.65 k allocs: 0.586 MB 8.82 k allocs: 0.59 MB 0.995
printing/large_poly 1.86 M allocs: 0.082 GB 1.86 M allocs: 0.082 GB 1
time_to_load 0.153 k allocs: 14.5 kB 0.153 k allocs: 14.5 kB 1

@github-actions
Copy link
Contributor

Benchmark Results (Julia v1)

Time benchmarks
master 5960a51... master / 5960a51...
arithmetic/2-arg mul 10.3 ± 0.25 μs 10.5 ± 0.35 μs 0.985 ± 0.041
arithmetic/addition 0.0683 ± 0.0009 ms 0.0692 ± 0.0012 ms 0.987 ± 0.021
arithmetic/division 23.9 ± 0.6 μs 24.4 ± 0.88 μs 0.983 ± 0.043
arithmetic/multiplication 0.0518 ± 0.0019 ms 0.0523 ± 0.0022 ms 0.992 ± 0.056
overhead/acrule/a+2 2.16 ± 0.05 μs 2.16 ± 0.051 μs 1 ± 0.033
overhead/acrule/a+2+b 0.08 ± 0.001 μs 0.08 ± 0.001 μs 1 ± 0.018
overhead/acrule/a+b 3.7 ± 0.06 μs 3.77 ± 0.08 μs 0.981 ± 0.026
overhead/acrule/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/acrule/noop:Sym 0.07 ± 0.01 μs 0.07 ± 0.001 μs 1 ± 0.14
overhead/get_degrees/large_poly 0.09 ± 0 μs 0.081 ± 0.01 μs 1.11 ± 0.14
overhead/rule/noop:Int 0.07 ± 0.01 μs 0.07 ± 0.01 μs 1 ± 0.2
overhead/rule/noop:Sym 0.07 ± 0 μs 0.07 ± 0.001 μs 1 ± 0.014
overhead/rule/noop:Term 0.07 ± 0 μs 0.07 ± 0 μs 1 ± 0
overhead/ruleset/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/ruleset/noop:Sym 0.311 ± 0.01 μs 0.311 ± 0.011 μs 1 ± 0.048
overhead/ruleset/noop:Term 1.21 ± 0.021 μs 1.19 ± 0.03 μs 1.02 ± 0.031
overhead/simplify/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/simplify/noop:Sym 30 ± 10 ns 30 ± 10 ns 1 ± 0.47
overhead/simplify/noop:Term 26.3 ± 0.54 μs 27.2 ± 0.89 μs 0.968 ± 0.038
overhead/simplify/randterm (+, *):serial 0.185 ± 0.029 s 0.201 ± 0.03 s 0.922 ± 0.2
overhead/simplify/randterm (+, *):thread 0.255 ± 0.088 s 0.246 ± 0.046 s 1.04 ± 0.41
overhead/simplify/randterm (/, *):serial 0.085 ± 0.0028 ms 0.0865 ± 0.0041 ms 0.982 ± 0.057
overhead/simplify/randterm (/, *):thread 0.0947 ± 0.0099 ms 0.0973 ± 0.01 ms 0.973 ± 0.14
overhead/substitute/a 0.0332 ± 0.00079 ms 0.0339 ± 0.0011 ms 0.979 ± 0.04
overhead/substitute/a,b 0.0414 ± 0.001 ms 0.0423 ± 0.0017 ms 0.977 ± 0.046
overhead/substitute/a,b,c 0.0398 ± 0.00089 ms 0.0406 ± 0.0013 ms 0.981 ± 0.038
polyform/easy_iszero 18.5 ± 0.39 μs 18.7 ± 0.51 μs 0.988 ± 0.034
polyform/isone 0.872 ± 0.013 ms 0.95 ± 0.067 ms 0.918 ± 0.066
polyform/isone:noop 0.09 ± 0.01 μs 0.08 ± 0.001 μs 1.12 ± 0.13
polyform/iszero 0.757 ± 0.013 ms 0.823 ± 0.048 ms 0.919 ± 0.055
polyform/iszero:noop 0.08 ± 0 μs 0.09 ± 0.01 μs 0.889 ± 0.099
polyform/simplify_fractions 0.943 ± 0.013 ms 1.02 ± 0.056 ms 0.921 ± 0.052
printing/large_poly 0.188 ± 0.012 s 0.198 ± 0.015 s 0.947 ± 0.096
time_to_load 1.42 ± 0.0095 s 1.5 ± 0.0012 s 0.95 ± 0.0064
Memory benchmarks
master 5960a51... master / 5960a51...
arithmetic/2-arg mul 0.055 k allocs: 1.77 kB 0.055 k allocs: 1.77 kB 1
arithmetic/addition 0.3 k allocs: 10.3 kB 0.3 k allocs: 10.3 kB 1
arithmetic/division 0.131 k allocs: 4.75 kB 0.131 k allocs: 4.75 kB 1
arithmetic/multiplication 0.252 k allocs: 6.5 kB 0.252 k allocs: 6.5 kB 1
overhead/acrule/a+2 0.033 k allocs: 1.11 kB 0.033 k allocs: 1.11 kB 1
overhead/acrule/a+2+b 0 allocs: 0 B 0 allocs: 0 B
overhead/acrule/a+b 0.044 k allocs: 1.52 kB 0.044 k allocs: 1.52 kB 1
overhead/acrule/noop:Int 0 allocs: 0 B 0 allocs: 0 B
overhead/acrule/noop:Sym 0 allocs: 0 B 0 allocs: 0 B
overhead/get_degrees/large_poly 2 allocs: 32 B 2 allocs: 32 B 1
overhead/rule/noop:Int 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
overhead/rule/noop:Sym 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
overhead/rule/noop:Term 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
overhead/ruleset/noop:Int 0 allocs: 0 B 0 allocs: 0 B
overhead/ruleset/noop:Sym 3 allocs: 0.109 kB 3 allocs: 0.109 kB 1
overhead/ruleset/noop:Term 12 allocs: 0.391 kB 12 allocs: 0.391 kB 1
overhead/simplify/noop:Int 0 allocs: 0 B 0 allocs: 0 B
overhead/simplify/noop:Sym 0 allocs: 0 B 0 allocs: 0 B
overhead/simplify/noop:Term 0.276 k allocs: 9.89 kB 0.276 k allocs: 9.89 kB 1
overhead/simplify/randterm (+, *):serial 2.1 M allocs: 0.0744 GB 2.09 M allocs: 0.0744 GB 1
overhead/simplify/randterm (+, *):thread 2.26 M allocs: 0.236 GB 2.25 M allocs: 0.236 GB 1
overhead/simplify/randterm (/, *):serial 0.776 k allocs: 28.1 kB 0.776 k allocs: 28.1 kB 1
overhead/simplify/randterm (/, *):thread 0.911 k allocs: 0.0324 MB 0.911 k allocs: 0.0324 MB 1
overhead/substitute/a 0.168 k allocs: 5.98 kB 0.168 k allocs: 5.98 kB 1
overhead/substitute/a,b 0.217 k allocs: 7.59 kB 0.217 k allocs: 7.59 kB 1
overhead/substitute/a,b,c 0.223 k allocs: 7.72 kB 0.223 k allocs: 7.72 kB 1
polyform/easy_iszero 0.091 k allocs: 2.92 kB 0.091 k allocs: 2.92 kB 1
polyform/isone 10.9 k allocs: 0.579 MB 10.9 k allocs: 0.579 MB 1
polyform/isone:noop 1 allocs: 16 B 1 allocs: 16 B 1
polyform/iszero 8.96 k allocs: 0.48 MB 8.95 k allocs: 0.48 MB 1
polyform/iszero:noop 1 allocs: 16 B 1 allocs: 16 B 1
polyform/simplify_fractions 11.4 k allocs: 0.596 MB 11.4 k allocs: 0.596 MB 1
printing/large_poly 2.15 M allocs: 0.079 GB 2.15 M allocs: 0.079 GB 1
time_to_load 0.145 k allocs: 11 kB 0.145 k allocs: 11 kB 1

@AayushSabharwal AayushSabharwal merged commit a6155ac into JuliaSymbolics:master Feb 16, 2026
17 of 21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants