Repository navigation
Releases: theforecastingcompany/tfc-t0
Release list
v0.6.0
Adds support for t0-gamma.
Changed
- Breaking.
tfc-t0is now one package with two runtimes, installed with
pip install "tfc-t0[torch]"orpip install "tfc-t0[mlx]". The MLX
runtime moves fromt0_mlxtot0.mlx, and the PyTorch model from
t0.modeltot0.torch.model. - The MLX runtime now runs the same
predictas the PyTorch runtime, with the
same arguments and results.
Added
- New inference parameters on
predictthat improve forecasts, using only
each series' own history. They are off by default inpredictand on by
default inT0Predictor:trim_leading_missingignores the missing values before a series' first
observation.symmetric_averagingalso forecasts the negated series and averages the two
forecasts. It doubles the compute and skips series whose minimum is zero.clip_nonnegativekeeps forecasts at or above zero when the history is
never negative.snap_integersrounds forecasts when the history holds only integers.
- Support for
t0-gamma, the third public model. It needs this release to
run correctly, since older releases ignore the conventions in itsconfig.json. cross_inferenceonT0Predictorforecasts several series of the same
window together, so the model can compare them. It is howt0-gamma's
GIFT-Eval scores are measured.xpos_scale_layoutandscaler_zero_no_valueonT0Config. They let a
checkpoint'sconfig.jsonstate two numerical conventions it was trained
with, and the defaults keep the current behaviour.- The MLX runtime accepts a
TimeSeriesas input, with covariate rows in any
order, and gainsTimeSeries.batch. - A notebook
forecasting European electricity spot prices. - A link to the
t0paper on arXiv.
Fixed
- Historical covariates are now handled over the forecast horizon as in
training. Forecasts that use them over a horizon longer than 32 steps change. - Known-future covariates no longer attend to the target and historical rows,
as in training. Forecasts that use them change by a few percent. - A covariate's first patch is no longer mistaken for a target when the
context length is not a multiple of 32. Forecasts change slightly for those
covariate rows only.
v0.5.0
Adds support for t0-beta, the 256M-parameter second public checkpoint.
Earlier releases load its weights without error but run them under
t0-alpha's normalization, which silently degrades the forecast — this is the
minimum version that serves it correctly.
Added
T0Config.large(), the 256M-parameter configuration published ast0-beta:
embed_dim1024 and a 21-level quantile head spanning 0.01 to 0.99.scaler_epsandscaler_eps_modeonT0Config, so the convention a
checkpoint was trained under travels in itsconfig.json.
"variance_offset"computessqrt(variance + eps)and"std_clamp"
computessqrt(variance).clamp(min=eps); the two agree wherever a series'
local standard deviation sits well aboveepsand diverge below it, so a
checkpoint is only valid under the one it trained with. The defaults
reproducet0-alpha, whose publishedconfig.jsonpredates both fields.
Changed
-
Breaking.
T0Forecaster.predict'squantilesargument is now
quantile_levels. It always carried levels rather than quantile values, and
the returnedForecastalready called themquantile_levels, so the same
concept had two names on either side of one call. Replace
predict(..., quantiles=[0.1, 0.5, 0.9])with
predict(..., quantile_levels=[0.1, 0.5, 0.9]).Forecast.quantiles, which
holds the forecast values, is unchanged. -
Quantile levels requested beyond the trained range (outside [0.1, 0.9]) now
follow IQF exponential tails
(Park et al., arXiv 2111.06581) pinned
through the outermost trained levels, instead of clamping flat to the nearest
trained level.
v0.4.0
Breaking. T0Forecaster now has two forecasting methods instead of four.
Changed
forward(model_input)runs a single differentiable pass over aTimeSeries, with
no rollout. Use it to fine-tune.predict(model_input, horizon, quantiles, ...)is inference-only and rolls out
autoregressively pastmax_horizon. It takes aTimeSeries, and still converts a
raw context array on the fly, so array callers are unaffected.context_lengthis optional and defaults to the start of the forecast region.prepare_rollout_bufferandpredict_stepare internal toRolloutManageragain.
Removed
predict_from_time_series. Replacepredict_from_time_series(ts, h, ctx, q)with
predict(ts, h, q, context_length=ctx).
Fixed
Patcher.padaligned the patch grid to the input's total width rather than to the
context boundary. It now left-pads to the context boundary and right-pads the
forecast region to whole patches.predictwas never affected, because
RolloutManageralready aligned its buffer. Callingforwarddirectly with
known-future covariates returned a wrong forecast that still looked valid. On
t0-alphawith a 24-step context and a 12-step horizon it moved MAE from 3.72 to 8.32.
Added
horizononTimeSeries.from_array, extending the target rows with that many
WITHHELDsteps to mark the region to predict. Future covariates imply it from
their width.Patcher.context_end, the index where the forecast region begins.time_series_from_arrayint0.data, to build aTimeSeriesfrom a raw context array.- Gradient tests in
tests/test_forward.pyand doctests onPatcher.pad.
tfc-t0-mlx v0.1.0a1
Fixed
- Preserve annotated release tags during source verification and build from
the verified commit. The0.1.0a0publication stopped at source verification;
this release contains the same runtime implementation. - Document the full FP32 setting used for checkpoint parity on Apple M5.
v0.3.1
Documentation-only release.
Fixed
- Image paths in README
- Hugging Face license links in the model card.
v0.3.0
Added
batch_series— batch series of different lengths and variate counts into one
padded context, the mask describing it, and the group ids that keep each
series' variates forecast jointly. Pass all three topredict.maskandgroup_idsarguments onT0Forecaster.predict.maskmarks every
context cell as an absent observation (MaskType.MISSING) or as padding for a
shorter series (MaskType.PAD);group_idssays which context rows are
variates of one series.MaskTypeis exported for building masks by hand.- Without a
mask, NaN in the context is read as a missing observation, as
before — padding is the one case NaN cannot express on its own.
Fixed
- Padding a batch of unequal-length series no longer moves the shorter rows'
forecasts. A patch covered entirely by padding drops out of attention, so a
series' forecast no longer depends on how long its batch mates are — it moved
by up to 12.5% before. Batch throughbatch_series, or mark the padding
MaskType.PAD, to get it.
v0.2.3
Fixed
- First patches were not attended to when leading time steps were padding.
It resulted in degraded performances of the model.
Changed
- Internals of the model regarding mask computation and patched variables handling.
v0.2.2
Changed
- Removed the upper version caps on all core runtime dependencies (
torch,
einops,rotary-embedding-torch,huggingface-hub,safetensors,
numpy,jaxtyping). Constraints are now floor-only, so downstream
integrators (e.g. Darts) can resolve newer releases without being blocked.
Floors are bumped when a new major is tested rather than capped speculatively. - Removed the upper version caps on the optional extras as well (
gluonts,
matplotlib,pandas), matching the floor-only policy. - Dropped the
requires-pythonupper bound (<3.15); the package now declares
>=3.10with no ceiling, so it never blocks users on newer Python releases.
v0.2.1
Added
- Python 3.10 support — the minimum supported version is now 3.10 (previously 3.11).
Fixed
- Inference quickstart notebook: move the median forecast to CPU before
computing the error metric, so the dtype-routing demo runs on GPU as well as
on CPU.