From 6ea5d7a27e7e24c6abc18dc7fbef6c2c6984239b Mon Sep 17 00:00:00 2001 From: Maksim Date: Sat, 7 Nov 2026 13:11:01 +0300 Subject: [PATCH] Release 1.4.0: align the in-code version with the release line The repository carries a v1.0.0 tag from 2026-07-10 while the code version has evolved 0.1.0 -> 0.4.0 through the correctness and Riemannian-Adam work. This release is code-identical to 0.4.0 and aligns the version metadata with the release line: pyproject.toml, dsa.__version__ and the packaging-test check are bumped together (the CI wheel check already reads the version from pyproject). The CHANGELOG gains a 1.4.0 entry that explains the alignment; the 0.2.0 - 0.4.0 history below documents the actual changes. --- CHANGELOG.md | 17 +++++++++++++++++ dsa/__init__.py | 2 +- pyproject.toml | 2 +- tests/test_packaging.py | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 358823c..b81d36b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## 1.4.0 — 2026-11-07 + +First release after the `v1.0.0` tag (2026-07-10) and the first one +where the in-code version matches the tag. Code-identical to 0.4.0: +the number jump is versioning alignment with the release line, not a +feature delta. The 0.2.0-0.4.0 entries below are the actual change +history this release ships — the correctness overhaul (F1-F8, R1-R3), +the full Riemannian Adam with portable checkpoints (C1-C5, A1-A4, +H1-H4), the audit fixes (crash-safe reinitialisation, corrupted +counters, weight-decay-mode warnings) and the scalar metric-weighted +second moment, verified against independent oracles: multi-step +trajectory equality with geoopt's `RiemannianAdam` on +`PoincareBallExact` (~2e-7), exact equality with +`torch.optim.Adam`/`AdamW` at `k=0`, end-to-end descent on a hyperbolic +objective and near-boundary stress coverage. + + ## 0.4.0 — 2026-11-07 The full-verification pass: the optimizer is now checked against two diff --git a/dsa/__init__.py b/dsa/__init__.py index 3740153..cde550a 100644 --- a/dsa/__init__.py +++ b/dsa/__init__.py @@ -1,6 +1,6 @@ from .optimizer import DiskSparseRiemannianAdam from .async_writer import AsyncDiskWriter, WriterState -__version__ = "0.4.0" +__version__ = "1.4.0" __all__ = ["DiskSparseRiemannianAdam", "AsyncDiskWriter", "WriterState"] diff --git a/pyproject.toml b/pyproject.toml index 590beef..a054a60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "dsa" -version = "0.4.0" +version = "1.4.0" description = "Disk Sparse Adam (DSA): an out-of-core sparse Riemannian Adam optimizer for PyTorch" readme = "README.md" license = "MIT" diff --git a/tests/test_packaging.py b/tests/test_packaging.py index 70c87ad..9fef8a4 100644 --- a/tests/test_packaging.py +++ b/tests/test_packaging.py @@ -30,7 +30,7 @@ def test_version_matches_package(): assert data["project"]["version"] == dsa.__version__ else: # pragma: no cover text = open(os.path.join(ROOT, "pyproject.toml")).read() - assert re.search(r'version\s*=\s*"0\.4\.0"', text) + assert re.search(r'version\s*=\s*"1\.4\.0"', text) def test_torch_floor_matches_readme_badge():