Skip to main content

SimpliPy:
Efficient Simplification of Mathematical Expressions

PyPI version PyPI license Documentation Status

pytest quality checks CodeQL Advanced

Publications

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.12, 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("acj-5-4-llm", install=True)   # a published ruleset artifact

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

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

simplify only simplifies: it answers in the form it was given -- a str in, a str out; explicit binary prefix in, explicit binary prefix out; the engine's native tagged form in (n-ary +/* bags are delimited: <add> ... </add>, <mul> ... </mul>), tagged out. To change the NOTATION, convert -- to_infix / to_prefix / to_tagged are pure syntactic conversions that never simplify -- and compose the two:

expr = ('/', '<constant>', '*', '/', '*', 'x3', '<constant>', 'x3', 'log', 'x3')

engine.to_infix(engine.simplify(expr))       # simplify, then render
# > '<constant> / log(x3)'

engine.simplify(engine.to_tagged(expr))      # convert, then simplify: the tagged answer
# > ['<mul>', '<constant>', '<div>', 'log', 'x3', '</mul>']

Normalization

The root-exported to_skeleton, to_expression, and normalize_variable_token helpers (also available as simplipy.normalization) canonicalize an expression so that two expressions that are "the same" up to variable renaming / constant values compare equal. Each takes all three forms (infix str, explicit prefix, tagged) and returns the one it was given; the canonicalization runs through the engine's internal state, so the answer does not depend on the dialect you passed.

import simplipy as sp

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

# Expression form: variables canonicalized, numeric values kept
sp.to_expression(['+', 'V1', '3'], engine)
# > ['+', 'x1', '3']

# 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

On a 65,536-expression symbolic-regression benchmark, paired per-row against SymPy's simplify (serial single-core, 1 s cap):

SimpliPy SymPy
Mean size ratio (lower is better) 0.97 1.09
Expressions strictly simplified 13.2% 22.3%
Expressions made bigger 0.00% 45.1%
Median per-row speedup ≈260×

Compression on the SR benchmark

Full results, figures, and methodology: simplify guide · paper.

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

@inproceedings{saegert2026breakingsimplificationbottleneckamortized,
  title   = {Breaking the Simplification Bottleneck in Amortized Neural Symbolic Regression},
  author  = {Paul Saegert and Ullrich Köthe},
  booktitle = {Proceedings of the 43rd International Conference on Machine Learning (ICML)},
  year    = {2026},
  eprint  = {2602.08885},
  archivePrefix =  {arXiv},
  primaryClass  = {cs.LG},
  url     = {https://arxiv.org/abs/2602.08885},
}

% Optionally
@software{simplipy-2026,
    author = {Paul Saegert},
    title = {Efficient Simplification of Mathematical Expressions},
    year = 2026,
    publisher = {GitHub},
    version = {0.14.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.14.1.tar.gz (3.1 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.14.1-cp312-abi3-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.12+Windows x86-64

simplipy-0.14.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

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

simplipy-0.14.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ ARM64

simplipy-0.14.1-cp312-abi3-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

simplipy-0.14.1-cp312-abi3-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for simplipy-0.14.1.tar.gz
Algorithm Hash digest
SHA256 9f479721fb13f94036de203d16ae80c4793082dd9cc2231965a7820d8c6df429
MD5 b92004e677b3c84ce229e9d851e32c47
BLAKE2b-256 794ba46613e0848e3b2738850d95cdfafff929a9c744d15539fe6f2f5af2c5d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.14.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.14.1-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: simplipy-0.14.1-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.12+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for simplipy-0.14.1-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 bb50800c0d830630df7d04e4a7d4040feaa1b37199c8a828ee862c9084c58034
MD5 33f8be1d29ca601c88d4653cca11fef4
BLAKE2b-256 16366412daeaf954b79f4aeea595e3352e16222c622ba90d7e331b27181545d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.14.1-cp312-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.14.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for simplipy-0.14.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 43b6949cee09bd4eff559e9506db2a04770b4fc101d03bc65107e8da7b41a764
MD5 4acc73682be06d8a43380254fb48a5e9
BLAKE2b-256 9395e9c0cece917b9f4fa97f30e02fa0a35f284674a189461e3cc66f7246c430

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.14.1-cp312-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.14.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for simplipy-0.14.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2f7380251b4c05b94efc06e41fac1f307c519e32f29ac24b60a520ad123b0700
MD5 2bbbc0c4c9bf1dc6a93d0885088a887b
BLAKE2b-256 a5f389213df819f8333fc8e77d7cb0283f7fa71983feb60268c9a69fdda0b074

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.14.1-cp312-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.14.1-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for simplipy-0.14.1-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8dac74c18f39ebded2a10630d3e7bdd6509c4d0f3858e47cb55968ec4f5a83a9
MD5 d686e780e353cc40ffd224dca4606ebb
BLAKE2b-256 1141cd38a426a5e15304b9acd7b97bd270eed5ec5833659bf0ec24b9918a85a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for simplipy-0.14.1-cp312-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.14.1-cp312-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for simplipy-0.14.1-cp312-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 40a2b6330d4d557f87501e3b6123a84328787618eaac39ee8d4978cb9cdfc724
MD5 aa0520e5c7f2aba8c112d0098b26954f
BLAKE2b-256 7af6819e69043cbb2047f9bca3258d1ad4a32551d384e8bd31b7e6b1fdf50488

See more details on using hashes here.

Provenance

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

This release

0.14.1 This release

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

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