Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions docs/RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,6 @@ The following names are exported from `rtdfeatures.__init__` and form the stable
- `GammaKernel`
- `ExponentialKernel`
- `DelayedExponentialKernel`
- `ErlangKernel`
- `LogNormalKernel`
- `SimplexKernelLearner`
- `GammaKernelLearner`
- `ExponentialKernelLearner`
Expand All @@ -55,6 +53,10 @@ The following names are exported from `rtdfeatures.__init__` and form the stable
- `FeatureSpec`
- `TransformResult`

Specialised kernels and learners that are not root-exported remain available from
`rtdfeatures.kernels` and `rtdfeatures.learners`. They are usable, but the
root-level V1 stability promise applies only to the stable public API list above.

## Advanced and provisional APIs

The following subpackages and modules are usable but not covered by the major-version stability guarantee. They may change or be removed in minor releases with migration notes.
Expand Down
3 changes: 2 additions & 1 deletion docs/api/kernels.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ kernel = UniformKernel(min_lag_steps=0, max_lag_steps=10, dt=60.0)
## Parametric kernels

```python
from rtdfeatures import GammaKernel, ExponentialKernel, DelayedExponentialKernel, ErlangKernel, LogNormalKernel
from rtdfeatures import GammaKernel, ExponentialKernel, DelayedExponentialKernel
from rtdfeatures.kernels import ErlangKernel, LogNormalKernel
```

These convert family parameters onto a discrete lag grid. They do not perform fitting — use the corresponding learner for that.
Expand Down
10 changes: 5 additions & 5 deletions docs/api/learners.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ fit = learner.fit(df, input_col="in", target_col="out", time_col="t", order_by_t
Deterministic fixed-delay learner (single active lag).

```python
from rtdfeatures import FixedDelayKernelLearner
from rtdfeatures.learners import FixedDelayKernelLearner

fixed = FixedDelayKernelLearner(max_lag="20m", min_lag=0)
fit = fixed.fit(df, input_col="in", target_col="out", time_col="t", order_by_time=False)
Expand All @@ -42,7 +42,7 @@ fit = fixed.fit(df, input_col="in", target_col="out", time_col="t", order_by_tim
Deterministic uniform-window learner (equal mass across the active lag window).

```python
from rtdfeatures import UniformKernelLearner
from rtdfeatures.learners import UniformKernelLearner

uniform = UniformKernelLearner(max_lag="20m", min_lag=0)
fit = uniform.fit(df, input_col="in", target_col="out", time_col="t", order_by_time=False)
Expand Down Expand Up @@ -101,7 +101,7 @@ fit = exp.fit(df, input_col="in", target_col="out", time_col="t")
Parametric delayed-exponential kernel learner.

```python
from rtdfeatures import DelayedExponentialKernelLearner
from rtdfeatures.learners import DelayedExponentialKernelLearner

delayed_exp = DelayedExponentialKernelLearner(
max_lag="6h", min_lag="10m", loss="huber", init_delay=None, init_rate_lambda=None
Expand All @@ -116,7 +116,7 @@ fit = delayed_exp.fit(df, input_col="in", target_col="out", time_col="t")
Parametric lognormal kernel learner.

```python
from rtdfeatures import LogNormalKernelLearner
from rtdfeatures.learners import LogNormalKernelLearner

lognormal = LogNormalKernelLearner(
max_lag="6h", min_lag="10m", loss="huber", init_log_mu=None, init_log_sigma=0.5
Expand All @@ -131,7 +131,7 @@ fit = lognormal.fit(df, input_col="in", target_col="out", time_col="t")
Parametric Erlang kernel learner.

```python
from rtdfeatures import ErlangKernelLearner
from rtdfeatures.learners import ErlangKernelLearner

erlang = ErlangKernelLearner(
max_lag="6h", min_lag="10m", loss="huber", shape_k_candidates=None, init_rate_beta=None
Expand Down
36 changes: 17 additions & 19 deletions docs/api/stability.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,25 +39,23 @@ Removals or renames in the stable API require a **major version bump**. Additive

**Stable root imports:**

```python
from rtdfeatures import (
Kernel,
FixedDelayKernel,
UniformKernel,
GammaKernel,
ExponentialKernel,
DelayedExponentialKernel,
ErlangKernel,
LogNormalKernel,
SimplexKernelLearner,
GammaKernelLearner,
ExponentialKernelLearner,
KernelFeatureBuilder,
FeatureRegistry,
FeatureSpec,
TransformResult,
)
```
- `Kernel`
- `FixedDelayKernel`
- `UniformKernel`
- `GammaKernel`
- `ExponentialKernel`
- `DelayedExponentialKernel`
- `SimplexKernelLearner`
- `GammaKernelLearner`
- `ExponentialKernelLearner`
- `KernelFeatureBuilder`
- `FeatureRegistry`
- `FeatureSpec`
- `TransformResult`

The stable root import list is intentionally smaller than the full package
surface. More specialised kernels and learners remain available from their
submodules but are not part of the root-level V1 stability promise.

## Provisional V1 API

Expand Down
96 changes: 41 additions & 55 deletions docs/development/release-gate-1.0.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,78 +2,64 @@

## Commit

918fe6b5aa4ac8ff012d153033822e033af1a606
TBD until merge

## Date

Sat May 16 10:00:00 UTC 2026
Sun May 31 17:21:11 ChST 2026

## Environment

- Python 3.13.5
- rtdfeatures 1.0.0 (editable install)
- rtdfeatures 1.0.0
- Install mode: editable install with dev/examples/sklearn extras

## Commands Run

### Phase 12.1 — Clean local gate

| Command | Result |
|---------|--------|
| `ruff check .` | PASS (1 fixable I001 error auto-fixed with `--fix`, clean after) |
| `mypy src tests --ignore-missing-imports` | FAIL — 14 errors in 4 files (see note below) |
| `pytest -m "not external_data" -x --tb=short` | PASS — 526 passed, 3 deselected, 2 xfailed |

Note: mypy reported 14 errors in `tests/test_release_metadata.py`, `tests/test_learner_base_contract_v1.py`, `tests/test_semver_contract.py`, and `src/rtdfeatures/integrations/sklearn.py`. These are pre-existing type annotation issues and not release-blocking for v1.0. mypy is not fully configured in the project yet.
|---|---|
| `ruff check .` | PASS |
| `mypy src tests` | PASS |
| `pytest -m "not external_data" -v` | PASS — 823 passed, 3 deselected, 2 xfailed |
| `python -m build` | PASS |
| `twine check dist/*` | PASS |

### Phase 12.2 — sklearn gate
## Targeted checks

| Command | Result |
|---------|--------|
| `pytest tests/test_sklearn_adapter.py -v` | PASS — 21 passed |
| `python examples/08_sklearn_adapter.py` | PASS — completed successfully |

### Phase 12.3 — Example gate

| Example | Result |
|---------|--------|
| `01_quickstart_simplex.py` | PASS |
| `02_parametric_vs_empirical.py` | PASS |
| `03_categorical_genealogy.py` | PASS |
| `04_multimodal_kernel.py` | PASS |
| `05_weak_identifiability.py` | PASS |
| `06_oof_feature_generation.py` | PASS |
| `07_bypass_recycle.py` | PASS |
| `08_sklearn_adapter.py` | PASS |

## Results

- ruff: PASS
- mypy: FAIL (14 pre-existing errors, not release-blocking)
- pytest: 526 passed
- sklearn tests: 21 passed
- examples 01-08: all PASS
|---|---|
| `pytest tests/test_semver_contract.py -v` | PASS — 33 passed |
| `pytest tests/test_public_api_docs_contract.py -v` | PASS — 3 passed |
| `pytest tests/test_sklearn_adapter.py -v` | PASS — 26 passed |
| `python examples/08_sklearn_adapter.py` | PASS |

## Root API

Stable V1 root exports:

- `Kernel`
- `FixedDelayKernel`
- `UniformKernel`
- `GammaKernel`
- `ExponentialKernel`
- `DelayedExponentialKernel`
- `SimplexKernelLearner`
- `GammaKernelLearner`
- `ExponentialKernelLearner`
- `KernelFeatureBuilder`
- `FeatureRegistry`
- `FeatureSpec`
- `TransformResult`

## Result

Release gate passed. No failed checks are waived.

## Deferred Items

- Learner fit-pipeline simplification deferred to V1.1
- Learner fit-pipeline simplification remains deferred to V1.1.
- Specialised kernels and learners remain available from submodules but are not root-stable V1 exports.

## TestPyPI Validation

Deferred to maintainer. User will handle TestPyPI publish, install verification, and git tag v1.0.0 manually.

## Completed Work Packages

1. Phase 00 — Preflight ✅
2. Phase 01 — sklearn skeleton ✅
3. Phase 02 — sklearn transformer ✅
4. Phase 03 — sklearn tests ✅
5. Phase 04 — sklearn docs/CI ✅
6. Phase 05 — parametric root exports ✅ (already complete from earlier PR)
7. Phase 06 — API stability policy ✅
8. Phase 07 — docs hygiene ✅
9. Phase 08 — examples gallery ✅
10. Phase 09 — release notes ✅
11. Phase 10 — V1.1 deferral plan ✅
12. Phase 11 — final metadata ✅
13. Phase 12 — release gate ✅
14. Phase 13 — TestPyPI/tag (deferred to maintainer)
Not part of the automated release gate. Release artefacts are validated through clean wheel and sdist install checks before trusted publishing.
6 changes: 4 additions & 2 deletions docs/user-guide/fitting-kernels.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@ exponential, lognormal, and erlang):

```python
from rtdfeatures import (
DelayedExponentialKernelLearner,
ErlangKernelLearner,
ExponentialKernelLearner,
GammaKernelLearner,
)
from rtdfeatures.learners import (
DelayedExponentialKernelLearner,
ErlangKernelLearner,
LogNormalKernelLearner,
)

Expand Down
2 changes: 1 addition & 1 deletion examples/nrtd_laminar_flow_worked_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@

from rtdfeatures import (
ExponentialKernelLearner,
FixedDelayKernelLearner,
GammaKernelLearner,
KernelFeatureBuilder,
SimplexKernelLearner,
)
from rtdfeatures.diagnostics.fit import KernelFitResult
from rtdfeatures.learners import FixedDelayKernelLearner

INPUT_PATH = Path("test_data/benchmarks/nrtd/hsa_000_laminar_flow_signals.parquet")
OUTPUT_DIR = Path("docs/examples/generated")
Expand Down
12 changes: 7 additions & 5 deletions examples/plant_first_example_gallery.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,20 @@
)

from rtdfeatures import (
DelayedExponentialKernelLearner,
ErlangKernelLearner,
ExponentialKernelLearner,
FixedDelayKernelLearner,
GammaKernelLearner,
KernelFeatureBuilder,
LogNormalKernelLearner,
SimplexKernelLearner,
UniformKernelLearner,
)
from rtdfeatures.diagnostics import KernelFitResult
from rtdfeatures.kernels.base import Kernel
from rtdfeatures.learners import (
DelayedExponentialKernelLearner,
ErlangKernelLearner,
FixedDelayKernelLearner,
LogNormalKernelLearner,
UniformKernelLearner,
)

OUTPUT_DIR = Path("docs/examples/generated")
OUTPUT_GALLERY = Path("docs/examples/plant_first_gallery.md")
Expand Down
30 changes: 8 additions & 22 deletions src/rtdfeatures/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,44 +17,30 @@
from rtdfeatures.features.registry import FeatureRegistry, FeatureSpec, TransformResult
from rtdfeatures.kernels import (
DelayedExponentialKernel,
ErlangKernel,
ExponentialKernel,
FixedDelayKernel,
GammaKernel,
Kernel,
LogNormalKernel,
UniformKernel,
)
from rtdfeatures.learners import (
DelayedExponentialKernelLearner,
ErlangKernelLearner,
ExponentialKernelLearner,
FixedDelayKernelLearner,
GammaKernelLearner,
LogNormalKernelLearner,
SimplexKernelLearner,
UniformKernelLearner,
)

__all__ = [
"DelayedExponentialKernel",
"DelayedExponentialKernelLearner",
"ErlangKernelLearner",
"ErlangKernel",
"ExponentialKernel",
"ExponentialKernelLearner",
"FeatureRegistry",
"FeatureSpec",
"Kernel",
"FixedDelayKernel",
"FixedDelayKernelLearner",
"UniformKernel",
"GammaKernel",
"ExponentialKernel",
"DelayedExponentialKernel",
"SimplexKernelLearner",
"GammaKernelLearner",
"Kernel",
"ExponentialKernelLearner",
"KernelFeatureBuilder",
"LogNormalKernel",
"LogNormalKernelLearner",
"SimplexKernelLearner",
"FeatureRegistry",
"FeatureSpec",
"TransformResult",
"UniformKernel",
"UniformKernelLearner",
]
3 changes: 1 addition & 2 deletions tests/test_architecture_invariants_v1.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,11 @@
from rtdfeatures import (
FeatureRegistry,
FixedDelayKernel,
FixedDelayKernelLearner,
Kernel,
KernelFeatureBuilder,
TransformResult,
UniformKernelLearner,
)
from rtdfeatures.learners import FixedDelayKernelLearner, UniformKernelLearner

_RUNTIME_SOURCE_FILES = tuple(sorted(Path("src").rglob("*.py")))

Expand Down
9 changes: 3 additions & 6 deletions tests/test_kernel_family_learners.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import polars as pl
import pytest

import rtdfeatures
from rtdfeatures.learners import FixedDelayKernelLearner, UniformKernelLearner
from rtdfeatures.synthetic import make_diffuse_kernel_dataset, make_single_delay_dataset

Expand Down Expand Up @@ -132,11 +131,9 @@ def test_fixed_and_uniform_unsorted_handling_uses_shared_preparation_path() -> N
assert fit.kernel.max_lag_steps == 7


def test_fixed_and_uniform_root_exports_are_available() -> None:
assert "FixedDelayKernelLearner" in rtdfeatures.__all__
assert "UniformKernelLearner" in rtdfeatures.__all__
assert rtdfeatures.FixedDelayKernelLearner is FixedDelayKernelLearner
assert rtdfeatures.UniformKernelLearner is UniformKernelLearner
def test_fixed_and_uniform_learners_are_available_from_learners_submodule() -> None:
assert FixedDelayKernelLearner is not None
assert UniformKernelLearner is not None


def test_fixed_and_uniform_constructor_validation_is_strict() -> None:
Expand Down
6 changes: 5 additions & 1 deletion tests/test_parametric_kernels.py
Original file line number Diff line number Diff line change
Expand Up @@ -429,10 +429,14 @@ def test_all_v1_parametric_kernels_are_root_exported() -> None:
"GammaKernel",
"ExponentialKernel",
"DelayedExponentialKernel",
}
assert required.issubset(set(rtdfeatures.__all__))

specialist_non_root = {
"LogNormalKernel",
"ErlangKernel",
}
assert required.issubset(set(rtdfeatures.__all__))
assert specialist_non_root.isdisjoint(set(rtdfeatures.__all__))


def test_make_parametric_learned_kernel_supports_all_v1_families() -> None:
Expand Down
Loading
Loading