Skip to main content

SimpliPy:
Efficient Simplification of Mathematical Expressions

PyPI version PyPI license Documentation Status

pytest quality checks CodeQL Advanced

Publications

  • Saegert & Köthe 2026, Breaking the Simplification Bottleneck in Amortized Neural Symbolic Regression (preprint, under review) https://arxiv.org/abs/2602.08885

Usage

pip install simplipy

The compiled Rust extension (simplipy._core) is required: the inline phase (simplify, conversions, validation) runs on it exclusively, and there is no pure-Python fallback. Prebuilt wheels are published for Linux (x86_64/aarch64), macOS (x86_64/arm64) and Windows (x64) on CPython ≥ 3.11, so pip install simplipy does not compile anything for most users. Installing from the source distribution (an unsupported platform, or --no-binary) requires a Rust toolchain (rustup, MSRV 1.83). If the extension is missing at runtime, constructing an engine raises ImportError.

import simplipy as sp

engine = sp.SimpliPyEngine.load("dev_7-3", install=True)

# Simplify prefix expressions
engine.simplify(('/', '<constant>', '*', '/', '*', 'x3', '<constant>', 'x3', 'log', 'x3'))
# > ('/', '<constant>', 'log', 'x3')

# Simplify infix expressions
engine.simplify('x3 * sin(<constant> + 1) / (x3 * x3)')
# > '<constant> / x3'

Normalization

The root-exported normalize_skeleton, normalize_expression, and normalize_variable_token helpers (also available as simplipy.normalization) canonicalize a prefix token sequence so that two expressions that are "the same" up to variable renaming / constant values compare equal. They are pure-string helpers with no engine state, so consumers such as holdout matching and symbolic-recovery scoring share identical behavior by construction.

import simplipy as sp

# Skeleton form: variables -> x{n}, numeric literals -> <constant>
sp.normalize_skeleton(['+', 'v1', '2.5'])
# > ['+', 'x1', '<constant>']

# Expression form: variables canonicalized, numeric literals kept intact
sp.normalize_expression(['+', 'V1', '2.5'])
# > ['+', 'x1', '2.5']

# Classify / canonicalize a single token -> (normalized_token, is_variable)
sp.normalize_variable_token('X3')
# > ('x3', True)
sp.normalize_variable_token('sin')
# > ('sin', False)

More examples can be found in the documentation.

Performance

As of 0.6.0 the simplify hot path defers match-time certificates to completed matches (memoized generationally, never stopping memoization), memoizes whole fixpoint passes and rule-normal subtrees, and runs on interned token ids (~20× fewer allocations per call) — all at byte-identical outputs. On a 65,536-expression training-prior benchmark, large certificate-bearing rulesets simplify ~59× faster than 0.5.0 and certificate-free rulesets ~2.3× faster; see the CHANGELOG for details. As of 0.7.0 there is a single engine line; to reproduce the historical dev_7-3 / v23.0-era behavior byte-for-byte, install simplipy<=0.6.0. The comparison below dates from the 0.3.0 Rust cutover:

Simplification time and ratio ECDFs: SymPy vs SimpliPy (Python 0.2.15) vs SimpliPy (Rust 0.3.0)

Top row: SimpliPy 0.3.0 (Rust inline engine, green). Bottom row: SimpliPy 0.2.15 (pure Python, blue). Left: Empirical Cumulative Distribution Functions (ECDFs) of simplification wall-clock time across maximum pattern lengths Lmax = 0–7, with the SymPy [Meurer et al. 2017] baseline (orange, red). The Rust inline engine is roughly 5× to 100× faster than the pure-Python engine at the same Lmax (≈ 15× at Lmax = 4), and both are orders of magnitude faster than SymPy. Right: ECDF of the simplification ratio |τ ∗|/|τ | (inset: zoom on the low-ratio region where the Lmax curves separate); the Rust and Python engines produce near-identical simplification-ratio distributions, so the Rust rewrite buys the speed-up without sacrificing simplification quality. (0.3.0 does deliberately change behaviour on a small fraction of inputs via the conversion-quirk fixes and numeric folding; see the CHANGELOG.)
Source expressions are sampled with 0 to 17 unique variables and 1 to 35 symbols [Saegert & Köthe 2026]

Development

Setup

To set up the development environment, run the following commands:

pip install -e .[dev]
pre-commit install

Tests

Test the package with pytest:

pytest tests --cov src --cov-report html

or to skip integration tests,

pytest tests --cov src --cov-report html -m "not integration"

Citation

@misc{saegert2026breakingsimplificationbottleneckamortized,
  title   = {Breaking the Simplification Bottleneck in Amortized Neural Symbolic Regression},
  author  = {Paul Saegert and Ullrich Köthe},
  year    = {2026},
  eprint  = {2602.08885},
  archivePrefix =  {arXiv},
  primaryClass  = {cs.LG},
  url     = {https://arxiv.org/abs/2602.08885},
}

% Optionally
@software{simplipy-2025,
    author = {Paul Saegert},
    title = {Efficient Simplification of Mathematical Expressions},
    year = 2026,
    publisher = {GitHub},
    version = {0.7.0},
    url = {https://github.com/psaegert/simplipy}
}

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

simplipy-0.9.1.tar.gz (1.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

simplipy-0.9.1-cp311-abi3-win_amd64.whl (875.6 kB view details)

Uploaded CPython 3.11+Windows x86-64

simplipy-0.9.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64

simplipy-0.9.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (967.0 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

simplipy-0.9.1-cp311-abi3-macosx_11_0_arm64.whl (909.9 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

simplipy-0.9.1-cp311-abi3-macosx_10_12_x86_64.whl (945.4 kB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

Details for the file simplipy-0.9.1.tar.gz.

File metadata

  • Download URL: simplipy-0.9.1.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for simplipy-0.9.1.tar.gz
Algorithm Hash digest
SHA256 5f0e94209cb8928cf0c29fb998b109032a4143cd5769e7301d7f7fa6eca75532
MD5 aa14d1afd239238e400a42d2a581c993
BLAKE2b-256 4e5f25a1e6306da8ec64ab5c52e0b7a8f2bfe74ab98238d119a2e96f9f61f292

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.9.1.tar.gz:

Publisher: publish.yml on psaegert/simplipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file simplipy-0.9.1-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: simplipy-0.9.1-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 875.6 kB
  • Tags: CPython 3.11+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for simplipy-0.9.1-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 2bf3bd5b3725a4620c37d72aacfe1e9397cbc08096f907220563156156c6d20b
MD5 4b96ce0506540d91049afe36083218bf
BLAKE2b-256 c375404f05ab23efc21c39a503481d9d5799090a84b68dcec7d1b9d999b6e6b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.9.1-cp311-abi3-win_amd64.whl:

Publisher: publish.yml on psaegert/simplipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file simplipy-0.9.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for simplipy-0.9.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bf368989e6f5a3d74f05b1da295263aa3d377f74d110705e5170598f852796c5
MD5 060533323668bdb2fa57912c3c725814
BLAKE2b-256 84c92d389dd1669d4eb0199f3fd0e08957bb9ecaa58696055ba7e44bd83bf45f

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.9.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on psaegert/simplipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file simplipy-0.9.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for simplipy-0.9.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3f19ff7f8e50813074053bfcac9415f8bd826ed29b8d145531e12e4c76b1459d
MD5 7846aa336ec531d8870c36c398e30638
BLAKE2b-256 ffb41e35198953841ea03a61e74319f860656188b7bff15493abbd9532737b65

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.9.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on psaegert/simplipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file simplipy-0.9.1-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for simplipy-0.9.1-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e22d1b3ecdf000533d2039b3a0c4c1fe8c671b755d7bb1af2c498e2c169f757a
MD5 bf00bb72e957b46a77e48b1de24ddd0e
BLAKE2b-256 386fd66f4dda789f8f19a8ed03e9a7e952bf5d63e160275ddb9d1d3070c8e3f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.9.1-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: publish.yml on psaegert/simplipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file simplipy-0.9.1-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for simplipy-0.9.1-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 37b3e7942b7b06a5f7112614533fb1866d0054922fc08176c9736d458e956a0f
MD5 2cf5907a1407f0114a26a601acb77a78
BLAKE2b-256 928b827ee915b79712347d8678ef976e9007db20c19b3d346d4b1a4bfe857b8a

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.9.1-cp311-abi3-macosx_10_12_x86_64.whl:

Publisher: publish.yml on psaegert/simplipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.14.6

6 files

0.14.5

6 files

0.14.4

6 files

0.14.2

6 files

0.14.1

6 files

0.14.0

6 files

0.13.1

6 files

0.13.0

6 files

0.12.0

6 files

0.11.0

6 files

0.10.1

6 files

0.10.0

6 files

This release

0.9.1 This release

6 files

0.9.0

6 files

0.8.0

6 files

0.7.1

6 files

0.7.0

6 files

0.4.2

6 files

0.4.1

6 files

0.4.0

6 files

0.3.1

6 files

0.3.0

6 files

0.2.15

2 files

0.2.14

2 files

0.2.13

2 files

0.2.12

2 files

0.2.11

2 files

0.2.10

2 files

0.2.9

2 files

0.2.8

2 files

0.2.7

2 files

0.2.6

2 files

0.2.5

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page