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

As of 0.3.0 the inline phase (simplify, conversions, validation) is a compiled Rust extension (simplipy._core). 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 unavailable at runtime, the package transparently falls back to a slower pure-Python implementation.

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

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 = 2025,
    publisher = {GitHub},
    version = {0.3.1},
    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.4.2.tar.gz (781.5 kB view details)

Uploaded Source

Built Distributions

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

simplipy-0.4.2-cp311-abi3-win_amd64.whl (568.4 kB view details)

Uploaded CPython 3.11+Windows x86-64

simplipy-0.4.2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (700.2 kB view details)

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

simplipy-0.4.2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (678.2 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

simplipy-0.4.2-cp311-abi3-macosx_11_0_arm64.whl (632.2 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

simplipy-0.4.2-cp311-abi3-macosx_10_12_x86_64.whl (649.5 kB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: simplipy-0.4.2.tar.gz
  • Upload date:
  • Size: 781.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for simplipy-0.4.2.tar.gz
Algorithm Hash digest
SHA256 ba8b3ab5632efd858f7fe772e9466d8e1d4ae79020512b8d4bda041ce29a78c7
MD5 2419ecf06825d3e3a06267135cb926ee
BLAKE2b-256 ceef76638303e2b2652235e4e483dd837c3ee7654703ec20d43dd646833c0dfd

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.4.2.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.4.2-cp311-abi3-win_amd64.whl.

File metadata

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

File hashes

Hashes for simplipy-0.4.2-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 57cb5ebaba9b45d189983efa0bbfc990b38ed0ae33cc20ddbbe217dfb1f5e2e6
MD5 042b2934f6ca12c6e12ed9e393135746
BLAKE2b-256 df1dbcbf7288482bf7b764b7af92b4c0d73b1bde114c4b5460e4e9b390d70352

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.4.2-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.4.2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for simplipy-0.4.2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 797a65c9e316396fd0fdd7dfa420db92958977b280272ae8203db9a933f9e42a
MD5 2d231bfea40bb6d8fc94f9192b599839
BLAKE2b-256 4b6a92d3d1733052849b0d11cc7406e5627b8eed9f14d8d77c7e581ed7204b41

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.4.2-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.4.2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for simplipy-0.4.2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7b5f992a977c3d8d83fc583a3d57d0d47194d963e099133b739f3ee78721d882
MD5 87f2e99f4d7d055fa41f85d6aefc45eb
BLAKE2b-256 32292997786fa800ce36e304586cb80bd53cf174e2fc0f540d62594dd5beadb0

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.4.2-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.4.2-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for simplipy-0.4.2-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eb00bd344d74025aa5841a8e2a9e77882e8dc543305d351a0cc55e98ed4da36e
MD5 76d382d70619a24874652503db6f21ba
BLAKE2b-256 5ae21ba58209b0eba4c19256d047c7d00db8fb1ead45c1ae4e44a357afed5458

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.4.2-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.4.2-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for simplipy-0.4.2-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 697d6f29fb6dc482bcc2bbe83f00da54cbbf56b231771593310a7818e624108e
MD5 99e34d0c4549b7d3195892db18a28e0d
BLAKE2b-256 8db01f4bb7bcb08d2ef336cecda1800c252a96ca25e143c1f1cbdb20f958b2c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.4.2-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

0.9.1

6 files

0.9.0

6 files

0.8.0

6 files

0.7.1

6 files

0.7.0

6 files

This release

0.4.2 This release

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