Skip to main content
precise-numpy logo

precise-numpy

Interval arithmetic with guaranteed error bounds for Python, powered by Rust SIMD.

PyPI Version Python Versions License: MIT Rust


Overview

precise-numpy is a Python library for numerical computing with provable error bounds. Every element is an interval stored as (midpoint, radius); every operation propagates both values with hardware-directed rounding (MXCSR on x86_64), so results carry a rigorous enclosure of the true mathematical value.

This is not a drop-in replacement for NumPy — arrays track two f64 values per element and intervals behave differently from plain floats (see Semantics). It is a fast, NumPy-flavored API for interval arithmetic.

Key capabilities:

  • Hardware-directed rounding for guaranteed mathematical enclosures.
  • Rust SIMD acceleration (AVX-512, AVX2/FMA, NEON) with Rayon parallelism.
  • NumPy-like API: creation, indexing, broadcasting, reductions, stacking, linalg, random, I/O.
  • GIL release during long computations.

Installation

pip install precise-numpy

Build from source:

git clone https://github.com/your-org/precise-numpy.git
cd precise-numpy
maturin develop --release

Requires Python >= 3.10 and a Rust toolchain. Wheels are built for CPython (abi3).


Quick Start

import precise_numpy as pnp

# Create interval arrays with error bounds
a = pnp.array([0.1, 0.2, 0.3], error=1e-4)
b = pnp.array([0.4, 0.5, 0.6], error=1e-4)

# Arithmetic propagates both midpoints and radii
c = a + b
print(c.radii())            # [2e-4, 2e-4, 2e-4]
print(c.max_radius())       # 2e-4

# Reductions return (midpoint, radius) tuples
mid, err = c.sum()
print(f"sum = {mid} +/- {err}")

# Inspect error growth
print("max relative error:", c.max_relative_error())

Semantics

  • Values: get(i), a[0], sum(), etc. return a (midpoint, radius) tuple. To get raw float arrays use a.values() / a.radii().
  • == / != mean interval overlap; <, <=, >, >= use strict endpoint ordering (a.hi < b.lo, etc.).
  • Division by zero raises a RuntimeWarning and produces the entire real line (radius inf) for the affected element.
  • len(a) is a.shape[0], matching NumPy.
  • Reductions (sum, mean, ...) support an optional axis argument; scalar results come back as (midpoint, radius) tuples, axis results as IntervalArrays.
  • dtype is "interval64", itemsize is 16 (two f64s per element).
  • Rounding (round) uses round-half-to-even, like Python and NumPy.
  • reshape(-1, ...) infers the missing dimension; transpose/.t support 1D/2D.

API Reference

Array creation

array(values, error=0.0), asarray, zeros(shape), ones, empty, full(shape, value, error=0.0), eye(n, m=None, k=0), identity(n), diag(v), arange(start, stop, step=1.0), linspace(start, stop, num=50, endpoint=True), from_raw_parts(midpoints, radii, shape).

Properties & conversions

shape, ndim, size, dtype, itemsize, nbytes, strides, t, values(), radii(), tolist(), get(i), item(i), midpoint(i), radius(i), copy(), flatten(), ravel(), reshape(*shape), transpose(), sort(), argsort().

Indexing

Integer (with negatives), slices (a[1:4], a[::-1]), fancy integer lists (a[[0, 2]]), boolean masks (a[a > 2.0], a[BoolArray]), and 2D tuples (m[1, :], m[:, 0]). Assignment works for integers, slices, and lists.

Arithmetic & math

+ - * / ** @, in-place variants, scalar operands on either side, NumPy broadcasting. sin, cos, tan, exp, ln, log2, log10, sqrt, abs, floor, ceil, trunc, round, clip(a_min, a_max), sign, nan_to_num, power(x, y), maximum(x, y), minimum(x, y).

Comparisons

==, != (overlap), <, <=, >, >= (strict ordering) return BoolArray values with & | ^ ~, any(), all(), sum(), count_nonzero(), tolist().

Reductions

sum, mean, prod, var, std, min, max, argmin, argmax, all, any — each with an optional axis; plus min_val(), max_val(), cumsum(axis=None), norm() (L2).

Stacking & selection

concatenate(arrays, axis=0), stack, vstack, hstack, split(a, sections_or_indices, axis=0), where(condition, x, y), nonzero(a) (tuple of index lists per axis).

Linear algebra (precise_numpy.linalg)

det, inv, solve(A, b), lstsq(A, b), pinv, eig, svd, norm.

Notes: eig (symmetric, Jacobi) and eig_general-style Hessenberg QR with real eigenvalues only — complex pairs raise NotImplementedError/ValueError. svd returns the thin decomposition U (m, k), s (k,), Vh (k, n) with k = min(m, n). All linalg routines operate on midpoints (radius 0 results) except solve, which uses interval LU.

Random (precise_numpy.random)

seed, rand(*size), random_sample(*size), random(*size), randn(*size), randint(low, high, *size), uniform(low, high, *size), normal(loc=0.0, scale=1.0, *size). Deterministic xoshiro256** generator; no size argument returns a Python float.

File I/O

save(path, arr) / load(path) (binary) and savetxt(path, arr, fmt="%.17g") / loadtxt(path) (text with a shape header). Both round-trip midpoints and radii.


Error-Bound Example: AI Quantization Audit

import precise_numpy as pnp

# Wrap input data with interval error bounds
X = pnp.array(floats, error=1e-4).reshape([128, 64])
W = pnp.array(weights).reshape([64, 64])

# Propagate error through a linear layer
Q = X.matmul(W)

print("Max Radius Error:", Q.max_radius())
print("Max Relative Error:", Q.max_relative_error())

See examples/quantization_safety_audit.py and examples/precision_audit_test.py.


Performance Notes

Each element stores two f64 values and each op enforces directed rounding, so the library is roughly 1.1x–1.7x slower than plain NumPy element-wise ops on large arrays while tracking rigorous error bounds — and it is often faster than NumPy on small arrays because the PyO3 extension avoids per-call Python dispatch overhead. See examples/full_benchmark.py.


Technical Architecture

  1. Structure-of-Arrays (SoA) buffer: midpoints and radii in contiguous, 64-byte aligned memory (AlignedBuffer), enabling direct SIMD loads.
  2. Single-pass streaming SIMD: radius bounds fused into one pass over both buffers (AVX-512, AVX2+FMA, NEON).
  3. Shared buffers: IntervalArray clones, slices, and reshapes are O(1) reference-counted.
  4. GIL release: long-running kernels run under py.allow_threads() with Rayon parallelism.
  5. No external dependencies at runtime; pure Rust + pyo3.

Testing

cargo test          # Rust unit tests (arithmetic, linalg, reduction, extra, random)
python -m unittest tests/python/test_api.py   # Python integration tests

License

MIT License. See LICENSE for details.

Metadata

Release files for precise-numpy 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for precise-numpy 0.2.1
File Size Uploaded Provenance
precise_numpy-0.2.1.tar.gz 461.4 kB Without provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for precise-numpy 0.2.1
File
precise_numpy-0.2.1-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
precise_numpy-0.2.1-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
precise_numpy-0.2.1-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 2.5 MB

Release files / precise_numpy-0.2.1.tar.gz

Download URL precise_numpy-0.2.1.tar.gz
Size 461.4 kB
Tags Source
SHA-256 checksum
How to use checksums
098e8b53a3ce411e3ae754a88536eeb5653804a4ff8efe3832db0ba3ef262082
BLAKE2b-256 checksum
How to use checksums
555a375e3baac3d8523ff358b010bd443eba2c30c0417199f8f70cd4a810f904
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / precise_numpy-0.2.1-cp310-abi3-win_amd64.whl

Download URL precise_numpy-0.2.1-cp310-abi3-win_amd64.whl
Size 366.4 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
878c43d3934d4c45c7e2e2f4256f47ef6202b8bc5d895f13b7342e4bc24da8e0
BLAKE2b-256 checksum
How to use checksums
499cb441a3ba605aa1a8bb246c08fbc1a273a9af18bfea000a39ed8684148362
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 471.2 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
1ce385a6e9465c0dcff3ffdbed444f3b75d47be64e3f399398a70bb2036f82c2
BLAKE2b-256 checksum
How to use checksums
ec6688fd6b458f49ae0edec90d77655c0b27e1ad32f96b94f11fc9c66dd52e45
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 417.8 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
edd295a8e8ee3a4434ce8f9df60f25c7b7939a15e1b475d20420c404c235ec39
BLAKE2b-256 checksum
How to use checksums
5afb3c6d46ae6828aa6d2518041be66ce02aceb5a264512259db9553f80c8bee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / precise_numpy-0.2.1-cp310-abi3-macosx_11_0_arm64.whl

Download URL precise_numpy-0.2.1-cp310-abi3-macosx_11_0_arm64.whl
Size 380.7 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e7b3c40b02a972ce8c8b6fc3da8e96df0373fc65db94a4948967d1ac393ff995
BLAKE2b-256 checksum
How to use checksums
03b6d913b9bfca2d4127e896a3b1b37f823cbc2dbbd934ef531007ffee4ebe2b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / precise_numpy-0.2.1-cp310-abi3-macosx_10_12_x86_64.whl

Download URL precise_numpy-0.2.1-cp310-abi3-macosx_10_12_x86_64.whl
Size 435.0 kB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
04da83c07dab719a72ed71f81942b7ddc679d9e07cbd89dfe3cfacbb24bc10c6
BLAKE2b-256 checksum
How to use checksums
7f89f456387506226690d7b7044ec2c20655a344d8badf939a0b498931b9792a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Security for precise-numpy 0.2.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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