v2.0.0MAJOR Version Change Stable Release

Released: April 2026

Upgrading from v1.0.0

No user-facing API changes relative to v1.0.0. The v2.0 line hardens the internal test infrastructure, continuous-integration pipeline, and multi-backend support. All constructor signatures, parameter names, and return shapes are identical to v1.0.0.

Bug Fixes

  • Bug Fix Resolved TypeError: metaclass conflict that prevented importing the four Keras Loss sub-classes (MeanSquaredErrorLoss, QuantileLoss, HuberLoss, WeightedLoss) when the NNLearner mixin was present in the inheritance chain. Fixed by removing NNLearner from all four loss classes.

  • Bug Fix Resolved ModuleNotFoundError: No module named 'torch' that caused pytest collection to abort on environments where PyTorch is not installed. The bare import torch at module level in test_cov_implementations_gaps.py was replaced with pytest.importorskip("torch", ...) so the file is gracefully skipped.

  • Bug Fix Resolved TypeError: function() argument 'code' must be code, not str during test collection on TensorFlow-only environments. Root cause: the Keras-patch helper used lambda *a, **kw: None as the default fallback for unknown KERAS_DEPS attributes. Fixed by introducing _KerasStub — a genuine Python class — as the default fallback, and explicitly mapping "Loss", "Layer", "Model", and "register_keras_serializable" in _FALLBACKS.

  • Bug Fix Fixed TypeError: can't convert mps:0 device type tensor to numpy in CRPSLoss._crps_mixture_mc on Apple Silicon (MPS). The mixture MC computation now moves inputs to CPU at entry when an MPS device is detected.

  • Bug Fix Fixed ValueError: operands could not be broadcast together in CRPSLoss._crps_mixture_mc on Linux CI. Weight normalisation now uses explicit expand_dims for non-torch backends.

  • Bug Fix Fixed TypeError in SqueezeExcite1D.call and drop_path from MPS vs CPU device mismatches; added .to(x.device) guards.

  • Bug Fix Fixed np.asarray(mps_tensor) calls in test helpers; replaced with the _to_numpy helper (which calls .cpu() first on torch tensors).

  • Bug Fix Fixed _get_static_value in base_attentive/__init__.py: added a result is not value guard so the function correctly returns None for non-tensor Python objects.

  • Bug Fix Fixed _tf_build_positional_encoding to build the angle matrix entirely in NumPy, avoiding MPS in-place slice-assignment failures.

  • Bug Fix Fixed broadcast_like in layer_utils.py: added a _scalar_to_int helper to move rep scalars to CPU before tf_tile.

Infrastructure / CI

  • Internal Fixed PyPI publishing workflow — pypa/gh-action-pypi-publish now uses API token authentication exclusively; removed id-token: write permission that caused failed OIDC Trusted Publishing attempts, and added attestations: false to skip the OIDC code path entirely.

  • Internal Fixed CI hang on Linux and macOS runners: added CUDA_VISIBLE_DEVICES: '', TF_CPP_MIN_LOG_LEVEL: '3', and TF_ENABLE_ONEDNN_OPTS: '0'; set log_cli = false and log_file_level = WARNING in pytest.ini; added pytest-timeout>=2.3.0 with --timeout=120 and timeout-minutes: 30 at the job level.

  • Internal Fixed tomllib import error in the publish workflow version-detection step — replaced with a re.search on raw pyproject.toml text (Python 3.10 compatible).

  • Internal Fixed secret name mismatch: workflow now references the correct TEST_PYPI_API_TOKENS secret name.

  • Internal Test suite passes the full Linux × macOS × Windows CI matrix at 94 % coverage across Python 3.10, 3.11, and 3.12.

Documentation

  • Internal Split monolithic release_notes.rst into docs/release_notes/ directory; each version now has its own file.

  • Internal Added PyPI version, Semantic Versioning, GitHub last commit, Open Issues, and PRs Welcome badges to docs/index.rst.

  • Internal README logo updated to raw GitHub URL so it renders on PyPI; Quick Start updated to v2 API.

  • Internal Citation updated: year 2025 → 2026, title reflects multi-backend design; pyproject.toml classifier promoted to Development Status :: 5 - Production/Stable.

Removed from Repository

  • Internal V2_BACKENDS_IMPLEMENTATION.md, V2_IMPLEMENTATION_PLAN.md, and .claude/ directory removed from the remote; patterns added to .gitignore.