Changelog#
The repository’s CHANGELOG.md is authoritative — this page mirrors it.
All notable changes to mononet will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased#
Added#
mononet.legacy— a deprecated, backend-agnostic (Keras 3) drop-in port of the originalairtai/monotonic-nnMonoDenselayer, itscreate_type_1/create_type_2builders, and helper functions. Emits aDeprecationWarningon use; keeps the original{-1, 0, 1}monotonicity indicator. Serves as a migration bridge for existingairtai/monotonic-nnusers. Numeric equivalence to the original is pinned by committed goldens.Public package skeleton with
mononet.core,mononet.torch,mononet.jax,mononet.keraslayers implementing the constrained monotonic construction.MonotonicityMask,ActivationSpec,InitSpec,MonoConfigframework-agnostic value objects inmononet.core.NumPy reference function signatures pinned by tests.
Cross-backend equivalence test directory (
tests/equivalence/) ready for the future harness.Four devcontainer flavors:
default(CPU) +gpu-torch,gpu-jax,gpu-keras(CUDA 12.4 base, Python 3.13).CI matrix: 3 Python versions × 3 backends on Ubuntu + Python 3.13 on macOS and Windows.
PyPI trusted publishing (OIDC) workflow.
Sphinx (myst-nb) site rewrite with guides, concepts, benchmarks, and about sections; benchmark notebooks committed with their outputs.
NOTICE.mdwith patent reservation + commercial-license contact.tools/execute-benchmarks.shfor manual notebook re-runs before releases.
Changed#
BREAKING: the default
modeis now"mixed"(was"split") forMonoLinear/MonoDense/MonoResidual/MonoConfig/MonoResidualConfig.mixeduses the static init (noinitneeded) and is the paper’s base|W|construction — passmode="split"explicitly to keep the previous behaviour.BREAKING: renamed the
modevalues"absolute"→"mixed"and"switch"→"split"(MonoLinear/MonoDense/MonoResidual/MonoConfig/MonoResidualConfig); the old names now raiseValueErrornaming the replacement.BREAKING:
MonoLinear/MonoDensenow defaultactivationtoNone, meaning"identity"— a linear monotone map, matchingtorch.nn.Linearandkeras.layers.Dense(activation=None)(MonoConfigkeeps a concreteActivationSpec("identity")default). Layers that relied on the implicit ReLU are now linear — passactivation="relu"explicitly to restore the previous behavior.BREAKING:
MonoResidualandMonoResidualConfignow require an explicitactivationwhen the defaultFis built (a customFmust not also passactivation), preventing a silently-linear residual branch.Layer
activationparameters are now typedActivationSpec | ActivationName(ActivationName = Literal["relu","elu","selu","softplus","identity"]) instead of accepting an arbitrarystr, so unknown names are rejected at type-check time.Relicensed from PolyForm Noncommercial License 1.0.0 to the Apache License 2.0, following AIRT Technologies Ltd.’s decision to discontinue patent-related activities. Apache-2.0’s section 3 grants the patent rights needed to use the code. Effective from the first PyPI release.
Switched LICENSE from proprietary (cookiecutter default) to PolyForm Noncommercial License 1.0.0 (assignee: AIRT Technologies Ltd.).
Python support range broadened from 3.13-only to 3.11–3.13.
Removed runtime
pydanticdependency; configs use stdlibdataclasses.
Removed#
1Password integration in devcontainer initialization.
Legacy private PyPI index registry (
synthpop-pkgs) and matchingUV_INDEX_SYNTHPOP_PKGS_*workflow secrets.Linear workflow files (
.linear.toml,LINEAR_GUIDE.md, thelinear-cliClaude skill).Codecov configuration and CI upload step.
Second cookiecutter devcontainer flavor (
partner).HelloWorldplaceholder inmononet/__init__.py.
0.1.0 - 2026-04-13#
Added#
Initial release of mononet
Basic package structure with Python 3.11+ support
Development toolchain with uv, pytest, and pre-commit hooks
Comprehensive linting and static analysis setup
Documentation framework with Sphinx
CI/CD pipeline with GitHub Actions
Automated version management and publishing