Skip to main content

TorchSymPy

SymPy-to-Torch Transcompilation for Massively Batched, GPU-Accelerated Numerical Integration

PyPI - Version PyPI - Python Version License: MIT


TorchSymPy bridges the gap between SymPy's symbolic manipulation and PyTorch's highly optimized batched tensor operations. You can transcompile symbolic integrals directly into callable PyTorch engines capable of extremely fast, batched evaluation on GPUs and CPUs.

Note: this module was first developed for libphysics — then split out into a standalone library to tackle generalized parallel computational bottlenecks.


Why TorchSymPy?

When working with analytical integrals in computational physics or machine learning, researchers often hit a bottleneck:

  1. SymPy is great for exact manipulation but painfully slow (or fails) for heavy numeric evaluation.
  2. SciPy (e.g. scipy.integrate.nquad) is highly accurate but inherently sequential and single-threaded.
  3. PyTorch thrives on massively parallel grid evaluations, but writing integrators by hand is tedious.

TorchSymPy gives you the best of all worlds. You write math in SymPy, and TorchSymPy transpiles it into highly optimized TorchExpr kernels that run up to 2,700x faster than SciPy by leveraging torchquad and massively batched GPU architectures.

Installation

To install the latest stable version from PyPI:

pip install torchsympy

To install from source (development):

git clone https://github.com/ibeuler/TorchSymPy.git
cd TorchSymPy
pip install -e .

Note on PyTorch: For GPU acceleration, ensure you have a CUDA-compatible torch wheel installed (e.g., torch==2.5.1+cu121).

Quickstart

The easiest path from a symbolic integral to a batched GPU evaluation:

import torch
import torchsympy
import sympy as sp

# 1. Define your integrand symbolically
x = sp.Symbol("x", real=True)
p = sp.Symbol("p", real=True)
expr = sp.Integral(sp.exp(-p * x**2), (x, -sp.oo, sp.oo))

# 2. Compile to a TorchSymPy engine
lt = torchsympy.TorchSymPy()
texpr = lt.torchify(expr)

# 3. Evaluate massively batched parameter grids on accelerators
p_grid = torch.linspace(0.5, 100.0, 10000, dtype=torch.float64, device="cuda").unsqueeze(-1)
re, im = texpr.torch_integrate_batched(
    params_values=p_grid,
    method="gauss-legendre",
    N=501,                       # Quadrature nodes
    device="cuda",               # Target accelerator
    dtype=torch.float64,         
    chunk_size_params=4096       # Safely chunk massive batches to avoid OOM
)

print(f"Real part shape: {re.shape}") # Output: torch.Size([10000])

Core Concepts: Integration Methods

Once you compile an expression, TorchSymPy provides three execution paths depending on your memory and scaling constraints:

1. Batched Path: torch_integrate_batched() (Recommended)

This is the primary workhorse for large parameter sweeps. It automatically handles shape broadcasting, batches execution in chunks to prevent Out-Of-Memory (OOM) errors, and manages device placement. It is the safest and most structured way to evaluate dense multidimensional grids.

2. Vectorized Path: torchquad_integrate_vectorized()

This is the raw, broadcasting-first path. It passes unstructured parameter tensors directly into the integrand. You are completely responsible for ensuring that the parameter grids broadcast correctly against the spatial integration domain. While riskier for OOM errors, it can yield slightly higher throughput on specific architectures by eliminating chunking overhead.

3. Loop-Driven Path: torchquad_integrate()

This is a simpler, unbatched evaluation method. Instead of projecting the entire parameter space onto the GPU at once, it accepts a simple 1D array of parameter combinations and internally loops through them. Use this when memory is severely constrained, or when you only need to evaluate a handful of distinct parameter points rather than a massive grid sweep.

Benchmarks: Speed Gains & Accuracy vs. SciPy & SymPy

TorchSymPy evaluates parameterized integrals across vast grids immensely faster than traditional methods. In our benchmark suite evaluating a parameterized Damped Cosine $\int_{0}^{\infty} e^{-x} \cos(k x) dx$, we observe huge multi-order speedups on GPUs.

The following table demonstrates the inherent trade-off between quadrature resolution ($N$) and accuracy/speed:

Execution Time per Point Speedup vs SciPy Accuracy (vs Analytical)
SciPy (nquad) 1.664 ms 1.0x $\sim 2.90 \times 10^{-9}$
TorchSymPy (Vectorized, N=121) 0.00048 ms 3,467x $\sim 2.07 \times 10^{-1}$ (Low N)
TorchSymPy (Batched, N=121) 0.00073 ms 2,279x $\sim 2.07 \times 10^{-1}$ (Low N)
TorchSymPy (Vectorized, N=2001) 0.00854 ms 194x $\sim 5.72 \times 10^{-5}$ (Medium N)
TorchSymPy (Batched, N=2001) 0.05164 ms 32x $\sim 5.72 \times 10^{-5}$ (Medium N)
TorchSymPy (Vectorized, N=5001) 0.02589 ms 64x $\sim 2.90 \times 10^{-9}$ (High N)
TorchSymPy (Batched, N=5001) 0.55701 ms 3.0x $\sim 2.90 \times 10^{-9}$ (High N)

(Benchmarks run on an NVIDIA RTX GPU across a 10,000 parameter grid. TorchSymPy converges to parity with SciPy while remaining orders of magnitude faster at standard resolutions).

The "Hard Integrals" Problem (Experimental Analytical Check)

While TorchSymPy achieves numeric parity with SciPy for well-behaved integrals (like $\int x^{-x} dx$), evaluating conditionally convergent oscillatory integrals over infinite domains numerically pushes all quadrature engines to their breaking points.

Consider the famously difficult oscillatory integral: $$ \int_0^\infty \frac{\sin(x)}{\sqrt{x^2 + 1}} dx $$

The true, analytical exact value (calculated symbolically via SymPy hypergeometric functions) is 0.873084. However, if we force pure numerical evaluation without symbolic reduction:

Method Output Value Absolute Error Notes
SymPy (True Analytical) 0.873084 0.0 Solved symbolically via Hypergeometric functions
SymPy (Pure evalf()) -4.000000 4.873 Completely fails convergence natively
SciPy (nquad) 1.550175 0.677 Fails with IntegrationWarning (Divergent)
TorchSymPy (GaussLegendre) -1.343219 2.216 Breaks due to mapped infinite oscillations

Takeaway: TorchSymPy provides incredible performance scaling and accurate results matching SciPy on standard mapping domains. However, for pathological integrands (like conditionally convergent oscillations at infinity), you should rely on SymPy's exact symbolic analytical integrations before attempting numerical grid sweeps.

Running the Test Suite

pytest tests/ -v

Examples & Tutorials

Check the examples/ directory for specific physics applications and basic integration usage, including generating Wigner functions.

License

Distributed under the MIT License. See LICENSE for more information.

Download files

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

Source Distribution

torchsympy-0.3.0.tar.gz (30.7 kB view details)

Uploaded Source

Built Distribution

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

torchsympy-0.3.0-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

Details for the file torchsympy-0.3.0.tar.gz.

File metadata

  • Download URL: torchsympy-0.3.0.tar.gz
  • Upload date:
  • Size: 30.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for torchsympy-0.3.0.tar.gz
Algorithm Hash digest
SHA256 289ef26d5c8eb626b31c4788dc3bf5e3c5ea8b5fae5f6888a48e0b3e2a785802
MD5 31250f49d920a4208c6105115647fc48
BLAKE2b-256 aa061d5ef1e46f3bd42495b2ea2d438a2ef5c4e3689c848de8d00daed7bb15fd

See more details on using hashes here.

File details

Details for the file torchsympy-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: torchsympy-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for torchsympy-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bc74b282fc5351c9e4157993a85b02475b4a54f1489384505c6b7ac7f16b6406
MD5 752fb98bded0ad0ee8b55aa879e73c1d
BLAKE2b-256 8282c244c33c70e3635f2817a9e94bfc0c4d2c8f9f901f5b877810f20ab3e96f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page