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.6.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.6-cp312-abi3-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.12+Windows x86-64

simplipy-0.14.6-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

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

simplipy-0.14.6-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.6-cp312-abi3-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

simplipy-0.14.6-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.6.tar.gz.

File metadata

  • Download URL: simplipy-0.14.6.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.6.tar.gz
Algorithm Hash digest
SHA256 0c45242f275bed69079fa570fba39db77e95d9b302bd92a8797686a7013cd03d
MD5 ddc6e9e32bcd56f06f80ad7e79238dbb
BLAKE2b-256 bda86ee5d9e515ca895c1ded2c0581b5206da3700d843378a20ed190c466a995

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: simplipy-0.14.6-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.4 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.6-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f5377236f799685bcf2157f4f6bace57269236cf17dffcb1a7664564978fa309
MD5 342b199777f23543832733f7451f8422
BLAKE2b-256 adb0e70cb9b971018e2f4ac9dcc94ce31953f438152cf8850216c8e854088a4e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for simplipy-0.14.6-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 316d9cd81d82e6b66c8a44489e0a4102a34bf4ace1ec0b7977bd743b0f1e81f2
MD5 6afb6ffbea80554871496018c8e04126
BLAKE2b-256 3dece2859061915e823cf9f421b8c515ce32d9ac066d4f09cc65b3204b56f0ef

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for simplipy-0.14.6-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2083eaecce2c8dac0ba5fb12767b1fe74ea362772581eb28ccdda96e1daa11ea
MD5 cf6d7a53e66f8feabf750a94fe5f3bc1
BLAKE2b-256 729f03b914c829e7b9460c3f094566e48f930a5b958cf6b180861836a5807cc9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for simplipy-0.14.6-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 30b61958c50b75650d8002a9616e819f1f6680f66ba33d2ffe37d776b7240184
MD5 89ecf38f0e9c5b0765e235caad1c175a
BLAKE2b-256 6972717604a4b5a0b6f66e736ce9ce7e3feca051adfe02e306e6ed826f036eff

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for simplipy-0.14.6-cp312-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ac23f39bbfe605b71c03155f390655738ef575d2beb0f83877d6b85d50b01ef4
MD5 cb8a28651244f26b0cb262bc789d27ea
BLAKE2b-256 a5f13e70f9304b5f07815cbe6f55c3fe82d262bbe5221702a200e40761a57867

See more details on using hashes here.

Provenance

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

This release

0.14.6 This release

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

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