From a2548b8ca1ea554e4e73ab1b91ca4be305ee838b Mon Sep 17 00:00:00 2001 From: AzulGarza Date: Thu, 24 Sep 2026 14:41:29 -0700 Subject: [PATCH 1/2] chore(release): prepare v0.1.9 Bump version for quantile interpolation, native-backend clamping, and PatchTST-FM family documentation. Sync gift-eval lockfile. Co-authored-by: Cursor --- README.md | 3 ++- docs/changelogs/index.md | 1 + docs/changelogs/v0.1.9.md | 37 +++++++++++++++++++++++++++++++++++ experiments/gift-eval/uv.lock | 2 +- mkdocs.yml | 1 + pyproject.toml | 2 +- uv.lock | 2 +- 7 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 docs/changelogs/v0.1.9.md diff --git a/README.md b/README.md index 63e837a..4cb0ed4 100644 --- a/README.md +++ b/README.md @@ -118,10 +118,11 @@ Some models require specific Python versions (e.g. FlowState 3.11-3.13, TabPFN & ## News -Recent additions and checkpoints (newest first). See the [changelog](https://github.com/TimeCopilot/foundationforecast/blob/main/docs/changelogs/v0.1.8.md) for full release notes. +Recent additions and checkpoints (newest first). See the [changelog](https://github.com/TimeCopilot/foundationforecast/blob/main/docs/changelogs/v0.1.9.md) for full release notes. | When | What | Checkpoint / detail | |------|------|---------------------| +| Sep 2026 | **Quantile interpolation** | Arbitrary `level` / `quantiles` on fixed-knot models with edge clamping; removed `level=0` sentinel ([v0.1.9](https://github.com/TimeCopilot/foundationforecast/blob/main/docs/changelogs/v0.1.9.md)) | | Sep 2026 | [**Granite PatchTST-FM r2**](https://huggingface.co/ibm-granite/granite-timeseries-patchtst-fm-r2) | `ibm-granite/granite-timeseries-patchtst-fm-r2` — Apache-2.0 / OpenMDW; requires `granite-tsfm>=0.3.9` ([v0.1.8](https://github.com/TimeCopilot/foundationforecast/blob/main/docs/changelogs/v0.1.8.md)) | | Sep 2026 | [**T0 beta**](https://huggingface.co/theforecastingcompany/t0-beta) | `theforecastingcompany/t0-beta` — requires `tfc-t0>=0.5.0` ([v0.1.8](https://github.com/TimeCopilot/foundationforecast/blob/main/docs/changelogs/v0.1.8.md)) | | Sep 2026 | **TiRex-2 zeroshot (GIFT-Eval CI)** | `NX-AI/TiRex-2-gifteval-zs` added to gift-eval replication ([v0.1.8](https://github.com/TimeCopilot/foundationforecast/blob/main/docs/changelogs/v0.1.8.md)) | diff --git a/docs/changelogs/index.md b/docs/changelogs/index.md index c3ca65f..9741218 100644 --- a/docs/changelogs/index.md +++ b/docs/changelogs/index.md @@ -2,6 +2,7 @@ Welcome to the FoundationForecast Changelog. Here you will find a list of changes, updates, and improvements for each release. Explore the details of each version below. +- [v0.1.9](v0.1.9.md) - [v0.1.8](v0.1.8.md) - [v0.1.7](v0.1.7.md) - [v0.1.6](v0.1.6.md) diff --git a/docs/changelogs/v0.1.9.md b/docs/changelogs/v0.1.9.md new file mode 100644 index 0000000..15eb5aa --- /dev/null +++ b/docs/changelogs/v0.1.9.md @@ -0,0 +1,37 @@ +### Features + +* **Quantile interpolation for arbitrary `level` and `quantiles`**: Fixed-knot models (TiRex, TimesFM, TabPFN, FlowState, Tafsut, Toto 2.0, and others) always run their native quantile knots, then linearly interpolate (with edge clamping) to any requested prediction level or quantile. PatchTST-FM continues to evaluate quantiles natively in the 0.01–0.99 range. + + ```python + import pandas as pd + from foundationforecast.models.tirex import TiRex + + df = pd.read_csv( + "https://timecopilot.s3.amazonaws.com/public/data/air_passengers.csv", + parse_dates=["ds"], + ) + model = TiRex() + fcst = model.forecast(df, h=12, freq="MS", level=[50, 80]) + assert "TiRex-lo-50" in fcst.columns + ``` + +* **`foundationforecast.core.quantiles`**: Shared helpers (`interpolate_quantiles`, `resolve_quantile_values`, `backend_quantile_levels`, `select_clipped_quantile_values`) and documentation for edge clamping when requests fall outside a model's supported quantile range. Output column names always reflect the user's request. + +* **PatchTST-FM family example notebook**: Added [`patchtst-fm-family.ipynb`](../examples/patchtst-fm-family.ipynb) comparing IBM Research and Granite PatchTST-FM r1/r2 checkpoints. + +### Fixes + +* **Removed undocumented `level=0` sentinel**: Point forecasts always appear in the model alias column; pass standard `level` values or `quantiles=` directly. +* **TimesFM v1**: Restore default quantiles on point-only forecasts; strip native q-columns before assigning interpolated output. +* **FlowState / TimesFM v2–v3**: Drop legacy exact-length quantile guards in favor of interpolation. +* **Chronos**: Map clipped quantiles on the last axis after batching `(batch, horizon, n_quantiles)` tensors. +* **Duplicate quantile columns**: Reject requests whose `int(100 × quantile)` suffixes collide (for example `0.151` and `0.159`). + +### Documentation + +* Expanded [Probabilistic forecasting](../forecasting-parameters.md) with interpolation, edge clamping, and native-backend clamping behavior. +* Updated TiRex, TimesFM, TabPFN, and related family notebooks for the new API. + +--- + +**Full Changelog**: https://github.com/TimeCopilot/foundationforecast/compare/v0.1.8...v0.1.9 diff --git a/experiments/gift-eval/uv.lock b/experiments/gift-eval/uv.lock index 47e2f9e..4de337d 100644 --- a/experiments/gift-eval/uv.lock +++ b/experiments/gift-eval/uv.lock @@ -1259,7 +1259,7 @@ dependencies = [ ] name = "foundationforecast" source = {editable = "../../"} -version = "0.1.8" +version = "0.1.9" [package.metadata] provides-extras = ["plot"] diff --git a/mkdocs.yml b/mkdocs.yml index b91481b..c249515 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -42,6 +42,7 @@ nav: - Contributing: contributing.md - Changelogs: - changelogs/index.md + - changelogs/v0.1.9.md - changelogs/v0.1.8.md - changelogs/v0.1.7.md - changelogs/v0.1.6.md diff --git a/pyproject.toml b/pyproject.toml index 3c6d33e..ef1f3cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,7 +73,7 @@ license = "Apache-2.0" name = "foundationforecast" readme = "README.md" requires-python = ">=3.10" -version = "0.1.8" +version = "0.1.9" [project.optional-dependencies] plot = [ diff --git a/uv.lock b/uv.lock index 9bb9621..c585457 100644 --- a/uv.lock +++ b/uv.lock @@ -1529,7 +1529,7 @@ dependencies = [ ] name = "foundationforecast" source = {editable = "."} -version = "0.1.8" +version = "0.1.9" [package.dev-dependencies] dev = [ From 2140e9d6d707c24f0674df9221c698796a84bdfd Mon Sep 17 00:00:00 2001 From: AzulGarza Date: Thu, 24 Sep 2026 14:45:49 -0700 Subject: [PATCH 2/2] ci(release): notify Discord on version tags Mirror TimeCopilot's notify-release workflow: post changelog contents to Discord when a v* tag is pushed (or via workflow_dispatch). Co-authored-by: Cursor --- .github/workflows/notify-release.yaml | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/notify-release.yaml diff --git a/.github/workflows/notify-release.yaml b/.github/workflows/notify-release.yaml new file mode 100644 index 0000000..ba81fd2 --- /dev/null +++ b/.github/workflows/notify-release.yaml @@ -0,0 +1,42 @@ +name: Notify Release + +on: + push: + tags: + - v* + workflow_dispatch: + inputs: + tag: + description: "Release tag to simulate" + required: true + +jobs: + discord: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Prepare env + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "TAG=${{ github.event.inputs.tag }}" >> "$GITHUB_ENV" + else + echo "TAG=${GITHUB_REF_NAME}" >> "$GITHUB_ENV" + fi + + - name: Read changelog + id: changelog + uses: andstor/file-reader-action@v1 + with: + path: "docs/changelogs/${{ env.TAG }}.md" + + - name: Notify Discord + uses: rjstone/discord-webhook-notify@v2 + with: + webhookUrl: ${{ secrets.DISCORD_WEBHOOK_URL }} + username: FoundationForecast Releases + severity: info + title: "🚀 New release ${{ env.TAG }}" + description: "Changelog: https://github.com/TimeCopilot/foundationforecast/blob/main/docs/changelogs/${{ env.TAG }}.md" + details: ${{ steps.changelog.outputs.contents }} + footer: "pushed via GitHub Actions"