Changelog¶
0.7.0 (2026-09-14)¶
Packaging and tooling¶
- Python >= 3.12; wheels for CPython 3.12, 3.13, 3.14 and the free-threaded 3.14t on Linux x86_64 and macOS arm64.
pyproject.toml(PEP 621) with asrc/layout;setup.pyonly compiles the Cython extensions. Version0.7.0is exposed asopenabel.__version__.- Cython 3, numpy 2 and scipy >= 1.13.
- pytest replaces nose; ruff, ty and pre-commit; GitHub Actions CI (Linux 3.12-3.14t, macOS 3.14) replaces Travis.
- Documentation ported from Sphinx to mkdocs-material.
- The sdist ships the tests and no generated C files; the
examplesdependency group installs matplotlib and PyAbel for the example scripts.
Fixed¶
- Every
Abel(...)construction died with exit status 255 on glibc >= 2.38 (e.g. Ubuntu 24.04): the internal allocator requested alignment 0 fromaligned_allocand then calledexiton the NULL it got back. The allocator now uses 64-byte alignment, rounds the size up as C11 requires, and raisesMemoryErroron failure. - Backward transform with
method=0raisedFileNotFoundError(wrong coefficient path). - Modified forward transform (
forward_backward=-2) withshift=0.5raisedKeyErrorwithmethod=2and crashed withmethod=3(wrong coefficient key). - An unsupported
shiftwithmethod=3crashed the process instead of raisingNotImplementedError(uninitialised pointers were freed during cleanup). - The Hansen-Law method (
method=1) silently returned a copy of the input for the modified forward transform and leaked memory; it now raisesNotImplementedError. - With even
order(including the default2) the end-correction methods (2and3) read one sample past the end of the input, and the FMM (method=3) multiplied an uninitialised buffer element by a zero coefficient. When that element happened to hold a NaN or Inf bit pattern the result was garbage, so the backward transform withmethod=3failed sporadically. The buffers are now sized exactly; results are unchanged otherwise. method=0leaked a small allocation perAbel(...)construction.- The backward transforms with
method=0and ashiftother than0.0or0.5left the first desingularisation weight uninitialised, so the first output sample was off by up to 30% (or garbage). Abel(...)acceptedn_data < 2andexecuteaccepted inputs shorter than the plan needs; depending on the method the process crashed or the result was garbage. Both now raiseValueError, and the message names the required length (the boundary value3rule in the API reference).- An invalid
left_boundaryvalue leaked two temporary buffers with methods0and2. - An
orderwithout coefficient tables (20 and above) raisedKeyError; it now raisesValueError. - A
step_sizethat is not positive or a negativeshiftsilently produced NaN, Inf or mirrored results; both now raiseValueError. - The FMM (
method=3) with fewer than eight data points called DGEMM with a negative dimension; the results were right, but OpenBLAS printed an "illegal value" complaint. - The FMM (
method=3) sized its coefficient tables and indexed them withintarithmetic, which overflows forn_dataabove roughly 1e7; the sizes and offsets are now computed insize_t.
Changed¶
- The package is imported and installed as
openabel(pip install openabel,import openabel; PyPI treats it as the same project asopenAbel), and every name follows PEP 8 snake_case:Abel(n_data, forward_backward, shift, step_size, method=3, order=2, eps=...)andexecute(data_in, left_boundary=0, right_boundary=0). Positional calls from 0.6 keep working once the import is updated; keyword arguments need the new names. The Cython modulehansen_law, the internals and the coefficient data files are renamed the same way; the unusedmath_funmodule and the unusedcoeffs_inv_sqrt_singcoefficient tables are gone. - Cython 3 build: exception clauses moved after
nogil,cpow=Truekeeps the integer power semantics of the FMM code,freethreading_compatible=True. - The backward transform with
method=0was never usable before this release; its first-order accuracy is low (relative error around 7e-2 on the Gaussian test case), which is expected for the method.
Earlier versions¶
No changelog was kept before 0.7.0.