v2.0.0 —
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
Resolved
TypeError: metaclass conflictthat prevented importing the four KerasLosssub-classes (MeanSquaredErrorLoss,QuantileLoss,HuberLoss,WeightedLoss) when theNNLearnermixin was present in the inheritance chain. Fixed by removingNNLearnerfrom all four loss classes.Resolved
ModuleNotFoundError: No module named 'torch'that caused pytest collection to abort on environments where PyTorch is not installed. The bareimport torchat module level intest_cov_implementations_gaps.pywas replaced withpytest.importorskip("torch", ...)so the file is gracefully skipped.Resolved
TypeError: function() argument 'code' must be code, not strduring test collection on TensorFlow-only environments. Root cause: the Keras-patch helper usedlambda *a, **kw: Noneas the default fallback for unknownKERAS_DEPSattributes. Fixed by introducing_KerasStub— a genuine Python class — as the default fallback, and explicitly mapping"Loss","Layer","Model", and"register_keras_serializable"in_FALLBACKS.Fixed
TypeError: can't convert mps:0 device type tensor to numpyinCRPSLoss._crps_mixture_mcon Apple Silicon (MPS). The mixture MC computation now moves inputs to CPU at entry when an MPS device is detected.Fixed
ValueError: operands could not be broadcast togetherinCRPSLoss._crps_mixture_mcon Linux CI. Weight normalisation now uses explicitexpand_dimsfor non-torch backends.Fixed
TypeErrorinSqueezeExcite1D.callanddrop_pathfrom MPS vs CPU device mismatches; added.to(x.device)guards.Fixed
np.asarray(mps_tensor)calls in test helpers; replaced with the_to_numpyhelper (which calls.cpu()first on torch tensors).Fixed
_get_static_valueinbase_attentive/__init__.py: added aresult is not valueguard so the function correctly returnsNonefor non-tensor Python objects.Fixed
_tf_build_positional_encodingto build the angle matrix entirely in NumPy, avoiding MPS in-place slice-assignment failures.Fixed
broadcast_likeinlayer_utils.py: added a_scalar_to_inthelper to move rep scalars to CPU beforetf_tile.
Infrastructure / CI
Fixed PyPI publishing workflow —
pypa/gh-action-pypi-publishnow uses API token authentication exclusively; removedid-token: writepermission that caused failed OIDC Trusted Publishing attempts, and addedattestations: falseto skip the OIDC code path entirely.Fixed CI hang on Linux and macOS runners: added
CUDA_VISIBLE_DEVICES: '',TF_CPP_MIN_LOG_LEVEL: '3', andTF_ENABLE_ONEDNN_OPTS: '0'; setlog_cli = falseandlog_file_level = WARNINGinpytest.ini; addedpytest-timeout>=2.3.0with--timeout=120andtimeout-minutes: 30at the job level.Fixed
tomllibimport error in the publish workflow version-detection step — replaced with are.searchon rawpyproject.tomltext (Python 3.10 compatible).Fixed secret name mismatch: workflow now references the correct
TEST_PYPI_API_TOKENSsecret name.Test suite passes the full Linux × macOS × Windows CI matrix at 94 % coverage across Python 3.10, 3.11, and 3.12.
Documentation
Split monolithic
release_notes.rstintodocs/release_notes/directory; each version now has its own file.Added PyPI version, Semantic Versioning, GitHub last commit, Open Issues, and PRs Welcome badges to
docs/index.rst.README logo updated to raw GitHub URL so it renders on PyPI; Quick Start updated to v2 API.
Citation updated: year 2025 → 2026, title reflects multi-backend design;
pyproject.tomlclassifier promoted toDevelopment Status :: 5 - Production/Stable.
Removed from Repository
V2_BACKENDS_IMPLEMENTATION.md,V2_IMPLEMENTATION_PLAN.md, and.claude/directory removed from the remote; patterns added to.gitignore.