Arbitrary precision ball arithmetic (interval arithmetic) dtype in NumPy
Project description
numpy-flint-arb
Documentation: https://numpy-flint-arb.readthedocs.io
Source Code: https://github.com/34j/numpy-flint-arb
Arbitrary precision ball arithmetic (interval arithmetic) dtype in NumPy
Installation
Install this via pip (or your favourite package manager):
pip install numpy-flint-arb
Usage
Import numpy_flint_arb.np instead of numpy:
from numpy_flint_arb import np
A = np.random.normal(size=(2, 2))
b = np.random.normal(size=(2,))
x = np.linalg.solve(A, b)
b_approx = A @ x
assert np.all(np.contains(b_approx, b))
asarray() and Input Check
To avoid mixing ordinary floats like float or np.float, flarray for arb, acb only accepts integers, arb or acb and flarray for arf only accepts integers and arf, arb.
To relax this, allow_input() may be used:
import pytest
from numpy_flint_arb import allow_input
from flint import arb, arf
# arb array
with pytest.raises(Exception):
np.asarray(0.5, dtype=arb)
with pytest.raises(Exception):
with allow_input(float=True):
np.asarray(0.5, dtype=arb)
with allow_input(interval=True, float=True):
np.asarray(0.5, dtype=arb)
# arf array
with pytest.raises(Exception):
np.asarray(0.5, dtype=arf)
with allow_input(float=True):
np.asarray(0.5, dtype=arf)
with allow_input(interval=True, float=True):
np.asarray(0.5, dtype=arf)
Note that allow_input() does not affect for arf(), arb(), acb() constructors, but only for np.asarray() and flarray().
str input
One can input str to asarray().
If dtype is not specified, it will be automatically detected as arb. However, specifying dtype explicitly is recommended.
asarray(dtype=acb)
asarray() does not support separated input for real and imaginary parts.
Do the following instead, as acb(1j) is exact.
from flint import arb, acb
from numpy_flint_arb import np
with pytest.raises(Exception):
# python-flint does not support single argument str input for acb
np.asarray("[0.5 +/- 0.001] + [0.5 +/- 0.001]j", dtype=acb)
with pytest.raises(Exception):
# This is inexact and raises an error without allow_input()
np.asarray(0.5 + 0.5j, dtype=acb)
with pytest.raises(Exception):
# Mixing complex and arb is not supported by python-flint
np.asarray("0.5 +/- 0.001", dtype=arb) + 1j * np.asarray("0.5 +/- 0.001", dtype=arb)
>>> # This is possible but not recommended
>>> np.asarray("0.5 +/- 0.001", dtype=arb) + 1j * np.asarray("0.5 +/- 0.001", dtype=acb)
flarray([0.50 +/- 1.01e-3] + [0.50 +/- 1.01e-3]j,
dtype=<class 'flint.types.acb.acb'>)
>>> # Recommended
>>> np.asarray("0.5 +/- 0.001", dtype=arb) + acb(1j) * np.asarray("0.5 +/- 0.001", dtype=arb)
flarray([0.50 +/- 1.01e-3] + [0.50 +/- 1.01e-3]j,
dtype=<class 'flint.types.acb.acb'>)
Randomness
Since python-flint does not support random number generation, the random module just uses np.random.
Therefore, the return values may not be random up to the precision of arb, acb.
What it does
-
This package adds a
flarraywhich subclassesndarrayin order to- Override
__array_namespace__tonumpy_flint_arb.np - Override
dtypeto return newly added_fl_dtypeprivate attribute, since the actual internal dtypeobjectcannot be overridden. - Override
__array_finalize__as recommended by the NumPy docs to returnflarraywith proper_fl_dtypeinstead ofndarrayafter Numpy operations.
- Override
-
Partially supports
linalgand(scipy.)specialfunctions. -
Adds
tomat()andfrommat()to treatflarrayas array ofarb_mat/acb_mat, so that we can perform matrix operations likenp.linalg.solveonflarray. -
Does not perform any parallelization to avoid complexity and to fully utilize the great
python-flintlibrary- Using
arb_seriesandacb_seriesmay be faster for additions but this is too hacky. - Defining custom
dtypeis way too complicated - Writing C extension would be theoretically also possible but is still too complicated.
- Using
-
Does not support
inoperator since it tries to convert the return value to bool. Use newly addednp.contains(x, y)andnp.overlaps(x, y)instead. -
Currently
dtypeof resultingflarrayis inferred fromtype(output.flat[0]). If the output array is empty or its element type is inconsistent, the result will be inaccurate.>>> (np.asarray([0], dtype=arb) * acb(1j)).dtype <class 'flint.types.acb.acb'> >>> (np.asarray([], dtype=arb) * acb(1j)).dtype <class 'flint.types.arb.arb'>
Contributors ✨
Thanks goes to these wonderful people (emoji key):
34j 💻 🤔 📖 |
This project follows the all-contributors specification. Contributions of any kind welcome!
Credits
This package was created with Copier and the browniebroke/pypackage-template project template.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file numpy_flint_arb-1.4.1.tar.gz.
File metadata
- Download URL: numpy_flint_arb-1.4.1.tar.gz
- Upload date:
- Size: 16.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc98de09ba56c5ff8cbaa5beb6dde496e2854b7e79103075f20f41b579dda080
|
|
| MD5 |
fea7ac29e1e8c8a32707d569bdb8f290
|
|
| BLAKE2b-256 |
2215f6b27c27af8c07354cfc24cfb0cb6e80a7322f119e76ba550179dc2c28d7
|
Provenance
The following attestation bundles were made for numpy_flint_arb-1.4.1.tar.gz:
Publisher:
ci.yml on 34j/numpy-flint-arb
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
numpy_flint_arb-1.4.1.tar.gz -
Subject digest:
cc98de09ba56c5ff8cbaa5beb6dde496e2854b7e79103075f20f41b579dda080 - Sigstore transparency entry: 1185138181
- Sigstore integration time:
-
Permalink:
34j/numpy-flint-arb@dafdc3a5afab3e647347bad43aa8865fd10a62d9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/34j
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@dafdc3a5afab3e647347bad43aa8865fd10a62d9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file numpy_flint_arb-1.4.1-py3-none-any.whl.
File metadata
- Download URL: numpy_flint_arb-1.4.1-py3-none-any.whl
- Upload date:
- Size: 11.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfba1fbdf8b9429dbccaf1d18647b2c97bef4d2c379163a8471f436c37757fb9
|
|
| MD5 |
af1faee3eb31a346533eb3f9f7aa55dc
|
|
| BLAKE2b-256 |
49529a2db9d27f47224040fdf981a5f7cc814f436d62066b4e20358997693a25
|
Provenance
The following attestation bundles were made for numpy_flint_arb-1.4.1-py3-none-any.whl:
Publisher:
ci.yml on 34j/numpy-flint-arb
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
numpy_flint_arb-1.4.1-py3-none-any.whl -
Subject digest:
cfba1fbdf8b9429dbccaf1d18647b2c97bef4d2c379163a8471f436c37757fb9 - Sigstore transparency entry: 1185138186
- Sigstore integration time:
-
Permalink:
34j/numpy-flint-arb@dafdc3a5afab3e647347bad43aa8865fd10a62d9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/34j
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@dafdc3a5afab3e647347bad43aa8865fd10a62d9 -
Trigger Event:
push
-
Statement type: