Skip to content

Conversation

bowenszhu
Copy link
Member

This PR adds the citation for our recent paper "Efficient Symbolic Computation via Hash Consing" (arXiv:2509.20534).

The paper documents the hash consing optimizations that significantly improve symbolic computation performance in SymbolicUtils.jl.

What is hash consing?
Hash consing is a memory optimization technique that ensures structural equality by storing only one copy of each unique symbolic expression. This reduces memory usage and enables faster equality comparisons through pointer equality, leading to substantial performance improvements in symbolic-numeric computation workflows.

Copy link
Contributor

github-actions bot commented Sep 29, 2025

Benchmark Results (Julia v1)

Time benchmarks
master a674da2... master / a674da2...
arithmetic/addition 0.0933 ± 0.0014 ms 0.0953 ± 0.0081 ms 0.979 ± 0.084
arithmetic/division 29 ± 0.83 μs 29.3 ± 0.76 μs 0.991 ± 0.038
arithmetic/multiplication 0.0845 ± 0.0058 ms 0.0824 ± 0.0086 ms 1.03 ± 0.13
overhead/acrule/a+2 2.71 ± 0.06 μs 2.65 ± 0.08 μs 1.02 ± 0.038
overhead/acrule/a+2+b 0.07 ± 0 μs 0.07 ± 0.01 μs 1 ± 0.14
overhead/acrule/a+b 4.8 ± 0.1 μs 4.76 ± 0.12 μs 1.01 ± 0.033
overhead/acrule/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/acrule/noop:Sym 0.06 ± 0.01 μs 0.06 ± 0.01 μs 1 ± 0.24
overhead/get_degrees/large_poly 0.0943 ± 0.0083 s 0.0976 ± 0.0089 s 0.966 ± 0.12
overhead/rule/noop:Int 0.06 ± 0 μs 0.06 ± 0 μs 1 ± 0
overhead/rule/noop:Sym 0.06 ± 0.01 μs 0.069 ± 0.01 μs 0.87 ± 0.19
overhead/rule/noop:Term 0.06 ± 0.01 μs 0.06 ± 0.01 μs 1 ± 0.24
overhead/ruleset/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/ruleset/noop:Sym 0.11 ± 0.01 μs 0.11 ± 0.001 μs 1 ± 0.091
overhead/ruleset/noop:Term 0.822 ± 0.02 μs 0.802 ± 0.02 μs 1.02 ± 0.036
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 0.0324 ± 0.00068 ms 0.0327 ± 0.00077 ms 0.992 ± 0.031
overhead/simplify/randterm (+, *):serial 0.328 ± 0.03 s 0.336 ± 0.032 s 0.976 ± 0.13
overhead/simplify/randterm (+, *):thread 0.343 ± 0.011 s 0.356 ± 0.022 s 0.963 ± 0.067
overhead/simplify/randterm (/, *):serial 0.0968 ± 0.014 ms 0.0903 ± 0.013 ms 1.07 ± 0.22
overhead/simplify/randterm (/, *):thread 0.0989 ± 0.015 ms 0.0909 ± 0.014 ms 1.09 ± 0.23
overhead/substitute/a 0.0725 ± 0.006 ms 0.0732 ± 0.006 ms 0.99 ± 0.12
overhead/substitute/a,b 0.0897 ± 0.0067 ms 0.0902 ± 0.0056 ms 0.994 ± 0.097
overhead/substitute/a,b,c 0.0735 ± 0.003 ms 0.0738 ± 0.0048 ms 0.996 ± 0.077
polyform/easy_iszero 31.3 ± 0.83 μs 0.0321 ± 0.00069 ms 0.974 ± 0.033
polyform/isone 1.13 ± 0.027 ms 1.15 ± 0.026 ms 0.989 ± 0.032
polyform/isone:noop 0.15 ± 0.009 μs 0.151 ± 0.01 μs 0.993 ± 0.089
polyform/iszero 0.979 ± 0.021 ms 0.99 ± 0.02 ms 0.989 ± 0.029
polyform/iszero:noop 0.15 ± 0.001 μs 0.16 ± 0.01 μs 0.938 ± 0.059
polyform/simplify_fractions 1.25 ± 0.026 ms 1.27 ± 0.029 ms 0.982 ± 0.03
time_to_load 1.46 ± 0.0089 s 1.49 ± 0.038 s 0.981 ± 0.026
Memory benchmarks
master a674da2... master / a674da2...
arithmetic/addition 0.538 k allocs: 21.3 kB 0.538 k allocs: 21.3 kB 1
arithmetic/division 0.176 k allocs: 6.22 kB 0.176 k allocs: 6.22 kB 1
arithmetic/multiplication 0.475 k allocs: 17.6 kB 0.475 k allocs: 17.6 kB 1
overhead/acrule/a+2 0.038 k allocs: 1.33 kB 0.038 k allocs: 1.33 kB 1
overhead/acrule/a+2+b 0 allocs: 0 B 0 allocs: 0 B
overhead/acrule/a+b 0.054 k allocs: 1.95 kB 0.054 k allocs: 1.95 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 0.601 M allocs: 18.9 MB 0.601 M allocs: 18.9 MB 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 14 allocs: 0.422 kB 14 allocs: 0.422 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.333 k allocs: 12.3 kB 0.333 k allocs: 12.3 kB 1
overhead/simplify/randterm (+, *):serial 2.8 M allocs: 0.106 GB 2.8 M allocs: 0.106 GB 0.999
overhead/simplify/randterm (+, *):thread 2.85 M allocs: 0.264 GB 2.85 M allocs: 0.264 GB 1
overhead/simplify/randterm (/, *):serial 0.851 k allocs: 30.6 kB 0.851 k allocs: 30.6 kB 1
overhead/simplify/randterm (/, *):thread 0.882 k allocs: 31.5 kB 0.882 k allocs: 31.5 kB 1
overhead/substitute/a 0.372 k allocs: 14 kB 0.372 k allocs: 14 kB 1
overhead/substitute/a,b 0.446 k allocs: 16.5 kB 0.446 k allocs: 16.5 kB 1
overhead/substitute/a,b,c 0.369 k allocs: 12.6 kB 0.369 k allocs: 12.6 kB 1
polyform/easy_iszero 0.186 k allocs: 6.06 kB 0.186 k allocs: 6.06 kB 1
polyform/isone 12.3 k allocs: 0.528 MB 12.3 k allocs: 0.568 MB 0.93
polyform/isone:noop 2 allocs: 32 B 2 allocs: 32 B 1
polyform/iszero 9.69 k allocs: 0.435 MB 9.73 k allocs: 0.467 MB 0.932
polyform/iszero:noop 2 allocs: 32 B 2 allocs: 32 B 1
polyform/simplify_fractions 12.7 k allocs: 0.552 MB 12.7 k allocs: 0.592 MB 0.933
time_to_load 0.159 k allocs: 11.2 kB 0.159 k allocs: 11.2 kB 1

Copy link
Contributor

github-actions bot commented Sep 29, 2025

Benchmark Results (Julia vlts)

Time benchmarks
master a674da2... master / a674da2...
arithmetic/addition 0.0974 ± 0.0011 ms 0.0982 ± 0.00099 ms 0.992 ± 0.015
arithmetic/division 0.0319 ± 0.00078 ms 31 ± 0.63 μs 1.03 ± 0.033
arithmetic/multiplication 0.0802 ± 0.0024 ms 0.0852 ± 0.0026 ms 0.942 ± 0.041
overhead/acrule/a+2 2.88 ± 0.04 μs 2.81 ± 0.041 μs 1.02 ± 0.021
overhead/acrule/a+2+b 0.07 ± 0.01 μs 0.07 ± 0 μs 1 ± 0.14
overhead/acrule/a+b 5.3 ± 0.07 μs 5.22 ± 0.071 μs 1.02 ± 0.019
overhead/acrule/noop:Int 0.05 ± 0.01 μs 0.05 ± 0.01 μs 1 ± 0.28
overhead/acrule/noop:Sym 0.051 ± 0.01 μs 0.05 ± 0.01 μs 1.02 ± 0.29
overhead/get_degrees/large_poly 0.1 ± 0.0044 s 0.104 ± 0.0046 s 0.963 ± 0.06
overhead/rule/noop:Int 0.06 ± 0.001 μs 0.06 ± 0.001 μs 1 ± 0.024
overhead/rule/noop:Sym 0.06 ± 0.01 μs 0.06 ± 0.01 μs 1 ± 0.24
overhead/rule/noop:Term 0.06 ± 0.01 μs 0.06 ± 0.01 μs 1 ± 0.24
overhead/ruleset/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/ruleset/noop:Sym 0.11 ± 0.011 μs 0.11 ± 0.01 μs 1 ± 0.14
overhead/ruleset/noop:Term 0.841 ± 0.019 μs 0.852 ± 0.011 μs 0.987 ± 0.026
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 0.0348 ± 0.00069 ms 0.0343 ± 0.00086 ms 1.01 ± 0.032
overhead/simplify/randterm (+, *):serial 0.334 ± 0.007 s 0.34 ± 0.0065 s 0.981 ± 0.028
overhead/simplify/randterm (+, *):thread 0.411 ± 0.15 s 0.406 ± 0.15 s 1.01 ± 0.53
overhead/simplify/randterm (/, *):serial 0.089 ± 0.002 ms 0.0905 ± 0.0019 ms 0.983 ± 0.03
overhead/simplify/randterm (/, *):thread 0.0912 ± 0.002 ms 0.0934 ± 0.0017 ms 0.977 ± 0.028
overhead/substitute/a 0.0716 ± 0.0015 ms 0.0737 ± 0.0016 ms 0.971 ± 0.029
overhead/substitute/a,b 0.0871 ± 0.0017 ms 0.0908 ± 0.0019 ms 0.959 ± 0.027
overhead/substitute/a,b,c 0.0765 ± 0.0014 ms 0.0794 ± 0.0016 ms 0.962 ± 0.026
polyform/easy_iszero 0.0323 ± 0.00066 ms 0.0321 ± 0.00057 ms 1.01 ± 0.027
polyform/isone 1.22 ± 0.023 ms 1.25 ± 0.022 ms 0.972 ± 0.025
polyform/isone:noop 0.15 ± 0.001 μs 0.18 ± 0.01 μs 0.833 ± 0.047
polyform/iszero 1.06 ± 0.018 ms 1.1 ± 0.016 ms 0.964 ± 0.022
polyform/iszero:noop 0.15 ± 0.009 μs 0.181 ± 0.01 μs 0.829 ± 0.068
polyform/simplify_fractions 1.36 ± 0.024 ms 1.4 ± 0.022 ms 0.969 ± 0.023
time_to_load 1.28 ± 0.034 s 1.29 ± 0.0038 s 0.999 ± 0.027
Memory benchmarks
master a674da2... master / a674da2...
arithmetic/addition 0.538 k allocs: 21.3 kB 0.538 k allocs: 21.3 kB 1
arithmetic/division 0.183 k allocs: 6.38 kB 0.182 k allocs: 6.44 kB 0.99
arithmetic/multiplication 0.476 k allocs: 17.6 kB 0.476 k allocs: 17.6 kB 1
overhead/acrule/a+2 0.037 k allocs: 1.38 kB 0.037 k allocs: 1.38 kB 1
overhead/acrule/a+2+b 0 allocs: 0 B 0 allocs: 0 B
overhead/acrule/a+b 0.053 k allocs: 2.05 kB 0.053 k allocs: 2.05 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 0.712 M allocs: 20.6 MB 0.712 M allocs: 20.6 MB 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.33 k allocs: 12.9 kB 0.33 k allocs: 12.9 kB 1
overhead/simplify/randterm (+, *):serial 2.77 M allocs: 0.109 GB 2.77 M allocs: 0.109 GB 1
overhead/simplify/randterm (+, *):thread 2.8 M allocs: 0.267 GB 2.8 M allocs: 0.267 GB 1
overhead/simplify/randterm (/, *):serial 0.875 k allocs: 31.4 kB 0.875 k allocs: 31.4 kB 1
overhead/simplify/randterm (/, *):thread 0.9 k allocs: 0.0313 MB 0.9 k allocs: 0.0313 MB 1
overhead/substitute/a 0.37 k allocs: 14 kB 0.37 k allocs: 14 kB 1
overhead/substitute/a,b 0.442 k allocs: 16.5 kB 0.442 k allocs: 16.5 kB 1
overhead/substitute/a,b,c 0.365 k allocs: 12.6 kB 0.365 k allocs: 12.6 kB 1
polyform/easy_iszero 0.187 k allocs: 6.08 kB 0.187 k allocs: 6.08 kB 1
polyform/isone 9.19 k allocs: 0.527 MB 9.3 k allocs: 0.613 MB 0.86
polyform/isone:noop 2 allocs: 32 B 2 allocs: 32 B 1
polyform/iszero 7.89 k allocs: 0.447 MB 7.99 k allocs: 0.516 MB 0.866
polyform/iszero:noop 2 allocs: 32 B 2 allocs: 32 B 1
polyform/simplify_fractions 10 k allocs: 0.557 MB 10.1 k allocs: 0.643 MB 0.867
time_to_load 0.153 k allocs: 14.5 kB 0.153 k allocs: 14.5 kB 1

Include citation for "Efficient Symbolic Computation via Hash Consing"
(arXiv:2509.20534) documenting the hash consing optimizations
implemented in SymbolicUtils.jl [skip ci]
@bowenszhu bowenszhu force-pushed the b/add-hash-consing-citation branch from baffd37 to a674da2 Compare September 29, 2025 02:32
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.

1 participant