|
1 | | -## Changelog |
2 | | - |
3 | | -### v1.0.0 |
4 | | - |
5 | | -First release under modern Python and modern packaging. Python 2.7 and 3.4 |
6 | | -are no longer supported. |
7 | | - |
8 | | -#### New |
9 | | - |
10 | | -- **Python 3.11 – 3.14 supported.** Pre-built wheels on PyPI for Linux, |
11 | | - macOS, and Windows, across all four Python versions, with OpenMP |
12 | | - parallelism enabled in every wheel. |
13 | | -- **Finite-difference stencil reproduction.** A WLSQM fit on a classical |
14 | | - central-difference stencil (3-point 1D, 5-point plus 2D, 7-point plus 3D) |
15 | | - now reproduces the hand-coded stencil result to machine precision on any |
16 | | - smooth input, not just polynomials. This is the natural generalization of |
17 | | - WLSQM's polynomial-recovery property and is pinned by the test suite. |
18 | | - |
19 | | -#### Fixed |
20 | | - |
21 | | -- **Data race in `fit_1D_many_parallel`**, pre-existing from 2016. The 1D |
22 | | - branch of the basic parallel many-case fitter passed a compile-time |
23 | | - constant `TASKID = 0` to `impl.solve()` instead of the per-thread |
24 | | - `taskid = openmp.omp_get_thread_num()`. Every OpenMP worker clobbered |
25 | | - thread-0's work buffer, producing silently wrong fits whenever the |
26 | | - parallel 1D many-case path ran with `ntasks > 1`. The 2D/3D branch, the |
27 | | - iterative parallel variant, and the serial variant were always correct. |
28 | | - A regression test (64 cases × 4 threads) now pins this. |
29 | | -- **`rescale_dgeequ` no longer silently accepts singular matrices.** It now |
30 | | - checks LAPACK's `info` return and raises `numpy.linalg.LinAlgError` when |
31 | | - a row or column is exactly zero, instead of returning nonsense scaling |
32 | | - factors that would poison the downstream solve. |
33 | | - |
34 | | -#### Changed |
35 | | - |
36 | | -- **Installation is now `pip install wlsqm`.** The old `python setup.py |
37 | | - install` path is gone; `setup.py` has been removed. The build system is |
38 | | - [meson-python](https://meson-python.readthedocs.io/), and dev environments |
39 | | - are managed with [PDM](https://pdm-project.org/). |
40 | | -- **Language change on "Taylor series."** The package's internal storage |
41 | | - layout still uses the same slots a Taylor expansion would (function |
42 | | - value, first derivatives, second derivatives divided by `2!`, …), but |
43 | | - the comments and docstrings no longer call the model a "Taylor series." |
44 | | - The coefficients come from a least-squares fit, not from analytic |
45 | | - differentiation, and the error behavior is much better than Taylor |
46 | | - truncation would predict. The internal C-API function names |
47 | | - `taylor_1D/2D/3D` are kept for backwards compatibility of downstream |
48 | | - `cimport`s — see [`wlsqm/fitter/polyeval.pyx`](wlsqm/fitter/polyeval.pyx). |
49 | | -- **Comprehensive pytest suite.** 57 tests covering polynomial recovery |
50 | | - across dimensions and orders, `ExpertSolver` prepare/solve round-trips, |
51 | | - interpolation accuracy at interior points, parallel ≡ serial equivalence, |
52 | | - finite-difference stencil reproduction, first-derivative robustness to |
53 | | - Gaussian noise, edge cases, the LAPACK driver layer, and `.pxd` |
54 | | - installability for downstream `cimport` users. |
55 | | - |
56 | | -#### Internal |
57 | | - |
58 | | -- Port from Cython 0.29 to Cython 3.x. `noexcept` audit on every `cdef |
59 | | - ... nogil` function, split between pure computational helpers |
60 | | - (`noexcept`) and LAPACK wrappers / fit dispatchers (`except -1`). `fma` |
61 | | - now imported from `libc.math` instead of a manual `cdef extern` hack |
62 | | - that worked around a long-fixed bug in Cython 0.20.1. |
63 | | -- All `DEF` compile-time constants replaced with module-level `cdef` |
64 | | - constants or inlined as literals at call sites (Cython 3 deprecated |
65 | | - `DEF`). Function-local protocol constants like `TASKID`, `NTASKS`, and |
66 | | - `MODE_BASIC` / `MODE_ITERATIVE` live at module scope in `simple.pyx` |
67 | | - where the value is a project-wide convention, and inside each function |
68 | | - where the value is per-function. |
69 | | -- `ScalingAlgo` is now a proper `enum.IntEnum`, replacing the old bare- |
70 | | - class Python 2 workaround. |
71 | | -- GitHub Actions CI: lint (ruff + cython-lint), test matrix (3 OSes × 4 |
72 | | - Python versions), cibuildwheel for Linux/macOS/Windows wheels, |
73 | | - meson-python sdist, and trusted-publisher PyPI publishing on `v*` tag |
74 | | - push. |
75 | | -- Copyright updated to 2016–2026 and affiliation updated to JAMK |
76 | | - University of Applied Sciences. |
77 | | - |
78 | | - |
79 | | -## Pre-v1.0 history |
80 | | - |
81 | | -### [v0.1.5] |
| 1 | +# Changelog |
| 2 | + |
| 3 | +## v1.0.0 (15 April 2026) |
| 4 | + |
| 5 | +First release under modern Python and modern packaging. |
| 6 | + |
| 7 | +Python 2.7 and 3.4 are no longer supported. |
| 8 | + |
| 9 | +### New |
| 10 | + |
| 11 | +- **Python 3.11 – 3.14 supported.** |
| 12 | + - Pre-built wheels on PyPI for Linux, macOS, and Windows, with OpenMP |
| 13 | + parallelism enabled in every wheel. |
| 14 | + |
| 15 | +### Fixed |
| 16 | + |
| 17 | +- **Data race in `fit_1D_many_parallel`**, pre-existing from 2016. |
| 18 | + - Every OpenMP worker clobbered thread-0's work buffer, producing silently |
| 19 | + wrong fits whenever the parallel 1D many-case path ran with `ntasks > 1`. The |
| 20 | + 2D/3D branch, the iterative parallel variant, and the serial variant were |
| 21 | + always correct. |
| 22 | + |
| 23 | +- **`rescale_dgeequ` no longer silently accepts singular matrices.** |
| 24 | + - It now checks LAPACK's `info` return and raises `numpy.linalg.LinAlgError` |
| 25 | + when a row or column is exactly zero. |
| 26 | + |
| 27 | +### Changed |
| 28 | + |
| 29 | +- **Installation is now `pip install wlsqm`.** |
| 30 | + - The old `python setup.py install` path is gone; `setup.py` has been removed. |
| 31 | + - The build system is [meson-python](https://meson-python.readthedocs.io/), |
| 32 | + and dev environments are managed with [PDM](https://pdm-project.org/). |
| 33 | + |
| 34 | +- **Language change on "Taylor series."** |
| 35 | + - The package's internal storage layout still uses the same slots a Taylor |
| 36 | + expansion would (e.g. in 2D, `f`, `∂f/∂x`, `∂f/∂y`, `(1/2!) ∂²f/∂x²`, |
| 37 | + `∂²f/∂x∂y`, `(1/2!) ∂²f/∂y²`, …), but the comments and docstrings no longer |
| 38 | + call the model a "Taylor series." |
| 39 | + - In the WLSQM method, the coefficients actually come from a least-squares |
| 40 | + fit, not from analytic differentiation. The error behavior is much better than |
| 41 | + Taylor truncation would predict. |
| 42 | + - The internal C-API function names `taylor_1D/2D/3D` are kept for backwards |
| 43 | + compatibility of downstream `cimport`s — see |
| 44 | + [`wlsqm/fitter/polyeval.pyx`](wlsqm/fitter/polyeval.pyx). |
| 45 | + |
| 46 | +### Internal |
| 47 | + |
| 48 | +- **Port from Cython 0.29 to Cython 3.x**. |
| 49 | + |
| 50 | +- **Comprehensive pytest suite.** 57 tests, covering: |
| 51 | + - polynomial recovery across dimensions and orders, |
| 52 | + - `ExpertSolver` prepare/solve round-trips, |
| 53 | + - interpolation accuracy at interior points, |
| 54 | + - parallel ≡ serial implementation equivalence, |
| 55 | + - finite-difference stencil reproduction, |
| 56 | + - first-derivative robustness to Gaussian noise, |
| 57 | + - edge cases, |
| 58 | + - the LAPACK driver layer, and |
| 59 | + - `.pxd` installability for downstream `cimport` users. |
| 60 | + |
| 61 | +- `ScalingAlgo` is now a proper `enum.IntEnum`, replacing the old bare-class |
| 62 | + Python 2 workaround. |
| 63 | + |
| 64 | +- **GitHub Actions CI**: lint (ruff + cython-lint), test matrix |
| 65 | + (3 OSes × 4 Python versions), cibuildwheel for Linux/macOS/Windows |
| 66 | + wheels, meson-python sdist, and auto-publishing of releases on PyPI. |
| 67 | + |
| 68 | + |
| 69 | +# Pre-v1.0 history (2016-2017) |
| 70 | + |
| 71 | +## [v0.1.5] |
82 | 72 | - support both Python 3.4 and 2.7 |
83 | 73 |
|
84 | | -### [v0.1.4] |
| 74 | +## [v0.1.4] |
85 | 75 | - actually use the shorter short description (oops) |
86 | 76 |
|
87 | | -### [v0.1.3] |
| 77 | +## [v0.1.3] |
88 | 78 | - setup.py is now Python 3 compatible (but wlsqm itself is not yet!) |
89 | 79 | - fixed sdist: package also CHANGELOG.md |
90 | 80 |
|
91 | | -### [v0.1.2] |
| 81 | +## [v0.1.2] |
92 | 82 | - set zip_safe to False to better work with Cython (important for libs that depend on this one) |
93 | 83 |
|
94 | | -### [v0.1.1] |
| 84 | +## [v0.1.1] |
95 | 85 | - change distribution system from distutils to setuptools |
96 | 86 |
|
97 | | -### [v0.1.0] |
| 87 | +## [v0.1.0] |
98 | 88 | - initial version |
0 commit comments