Skip to content

Commit e23edff

Browse files
committed
bump: version 1.8.0 → 2.0.0rc1
1 parent 603618d commit e23edff

4 files changed

Lines changed: 220 additions & 32 deletions

File tree

CHANGELOG.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,135 @@ Going forward, this file is updated automatically by `cz bump` on each release.
99

1010
---
1111

12+
## v2.0.0rc1 (2026-06-21)
13+
14+
### BREAKING CHANGE
15+
16+
- internal package layout, configuration objects, and import
17+
paths have changed. See the migration guide for details.
18+
19+
### Feat
20+
21+
- DeepTab v2 API with split-config design (#400)
22+
- **config**: warn on misplaced config slots
23+
- **training**: add unregister_optimizer, unregister_scheduler with built-in protection
24+
- **inspection**: expose public read-only task_model property
25+
- **models**: thread observability_config through all estimators
26+
- **core**: add ObservabilityConfig
27+
- **models**: expose ObservabilityConfig on base estimator constructor
28+
- **models**: add observability mixin wiring ObservabilityConfig to base estimators
29+
- **models**: integrate ObservabilityConfig into fit mixin
30+
- **training**: rewrite configure_optimizers, add contrastive pretraining fixes, and cleanup
31+
- introduce IDataModule/ITaskModel protocols and default factories, wire into SklearnBase
32+
- **configs**: add optimizer/scheduler fields to TrainerConfig and InferenceModel support
33+
- **training**: wire optimizer/scheduler registry into LightningModule and extend losses
34+
- **training**: add optimizer/scheduler registry with all torch.optim classes
35+
- **api**: export exception and warning types from deeptab and deeptab.core
36+
- **configs,models**: add __post_init__ validation using typed exceptions
37+
- **core**: add exception hierarchy and message factories
38+
- **models**: wire evaluate() in lss_base, regressor_base, and classifier_base to new deeptab.metrics registry
39+
- **metrics**: add deeptab metrics ABC, regression, classification, lss
40+
- add tweedie, inflated poissons, log normal etc. distribution
41+
- light weight inference wrapper
42+
- **serialization**: warn when save/load path lacks .deeptab extension
43+
- **inspection**: add profile() method for pre-training dry-run diagnostics
44+
- **training**: add class-imbalance loss registry and weighted sampling
45+
- **core**: add set_seed/seed_context reproducibility helpers
46+
- **core**: add sklearn_compat module and update serialization/core exports
47+
- add rich model artifact serialization metadata
48+
- model inspection api added
49+
- **data**: add optional TabularBatch return mode
50+
- **data**: add stratified splitting for classification and schema property
51+
- **data**: add FeatureSchema and TabularBatch typed containers
52+
- **configs**: add SplitConfig for train/validation splitting parameters
53+
- **root**: expose configs, data, distributions, metrics, models in top-level __init__
54+
- **models**: add _docstring helper to centralize generate_docstring for all models
55+
- **models**: expose stable classes in __all__ and add __getattr__ shim for experimental
56+
- **models**: add split base classes for classifier, regressor, and LSS task variants
57+
- **configs**: add configs/core.py with shared base configuration definitions
58+
- **configs**: add configs/experimental sub module for ModernNCA, Tangos, Trompt
59+
- **configs**: add configs sub module with per-model config modules
60+
- **hpo**: add hpo module with get_search_space mapper
61+
- **metrics**: add metrics module stubs for classification, regression, distributional
62+
- **distributions**: add distributions module with 12 distribution classes
63+
- **data**: add data module with MambularDataModule, MambularDataset, batch, schema, split
64+
- **training**: add training module with lightning module, losses, optimizers, schedulers
65+
- **core**: add core module with BaseModel, registry, embeddings, pooling, serialization
66+
- **architectures**: add experimental sub-package with ModernNCA, Tangos, Trompt
67+
- **architectures**: add architectures module with all stable model definitions
68+
- **nn**: add nn module with blocks, normalization, and initialization
69+
- **config**: split config into trainer, model and preprocessing config
70+
- **sklearn_parent**: implement split-config path in SklearnBase.__init__, get_params, set_params
71+
- **models**: add split config __init__ to all Classifier and Regressor wrappers
72+
- **base_models**: replace DefaultXXConfig with XXConfig in all base model constructors
73+
- **configs**: add *Config for all architectures
74+
- **configs**: add ENODEConfig architecture only config
75+
76+
### Fix
77+
78+
- **modernnca**: support LSS prediction and add experimental model tests
79+
- **models**: adapt child class to use class var, update docstring example
80+
- **transformer**: use batch_first attention to prevent cross-sample leakage
81+
- **hpo**: rebuild model per trial and map activation names to modules
82+
- save default artificats to <run_dir>/artifacts/model.deeptab
83+
- pyright issues
84+
- resolve Pyright type errors in base, classifier_base, regressor_base, lss_base
85+
- **base**: add __sklearn_is_fitted__, use check_is_fitted
86+
- **sklearn_compat**: raise ValueError for 1D array input in ensure_dataframe
87+
- **exceptions**: inherit EmptyDataError and ColumnCountError from ValueError for sklearn compat
88+
- add seed to DataLoader/sampler generators
89+
- data validation for parameters
90+
- **models**: read optimizer_type and preprocessor live from config in _build_model
91+
- suppress unsupported dunderall
92+
- **test**: add typed error, fix preprocessing config
93+
- **architectures,distributions**: replace ValueError with typed exceptions
94+
- **docs**: remove dead cross-reference links and fix tables
95+
- **training**: apply distribution parameter transform before passing predictions to metrics
96+
- pyright issues
97+
- ruff issue
98+
- use r2 metric for regresion as default
99+
- use getattr for task_model access in InspectionMixin
100+
- resolve pyright type errors
101+
- enable side bar navigation for api reference
102+
- **tests**: update flat-kwarg error assertions to match native TypeError message
103+
- **tests**: update config lookup to search configs.models and configs.experimental
104+
- **nn**: suppress pyright reportOptionalCall on RotaryEmbedding optional import
105+
- training parameter added
106+
- modernca config and model update
107+
- **lss**: use getattr fallback for lr/weight_decay in SklearnBaseLSS.fit()
108+
109+
### Refactor
110+
111+
- replace SplitConfig with TrainerConfig.stratify and refresh docs
112+
- **models**: adopt declarative class variable estimator pattern
113+
- **hpo**: rename mapper.py to search_space.py and fix lss_base error
114+
- **core**: update inspection and serialization for _ attribute rename
115+
- **models**: prefix non-constructor attributes with _ for sklearn compliance
116+
- extract _FitMixin, _PredictMixin, _SerializationMixin, _HyperparameterMixin, _ObservabilityMixin from SklearnBase
117+
- **configs**: remove legacy BaseConfig class
118+
- **distributions**: separate dist classes, add registry
119+
- consolidate save/load into core.serialization helpers
120+
- **models**: update base classifier/regressor/lss model internals
121+
- **data**: update datamodule and dataset internals
122+
- **models**: update imports to use TabularDataModule
123+
- **data**: rename to TabularDataset/TabularDataModule and move task-specific label logic to DataModule
124+
- **models**: replace **kwargs with explicit signatures in stable model constructors
125+
- **hpo**: add missing exports to hpo/__init__.py
126+
- **models**: update training and hpo imports to go through package boundaries
127+
- **architectures**: update core imports to go through package boundary
128+
- **architectures**: add lazy __getattr__ boundary with TYPE_CHECKING guards
129+
- **nn**: expose public API via nn/__init__.py boundary
130+
- **training**: expose public API via training/__init__.py boundary
131+
- **core**: expose public API via core/__init__.py boundary
132+
- **architectures**: update config imports to use configs/models/ and configs/experimental/
133+
- **models**: update config imports to use configs/models/, configs/experimental/, and configs/core
134+
- **architectures**: update config imports to use configs/models/ and configs/experimental/
135+
- **configs**: update __init__ to import from core, models/, and experimental/
136+
- **configs**: remove deprecated flat config files superseded by models/ and experimental/
137+
- **models**: update import paths in experimental ModernNCA, Tangos, Trompt modules
138+
- **models**: update import paths in ndtf, node, resnet, saint, tabm, tabr, tabtransformer, tabularnn
139+
- **modules**: remove legacy arch_utils, base_models, data_utils, utils
140+
12141
## v1.8.0 (2026-05-24)
13142

14143
### Feat

docs/developer_guide/release.md

Lines changed: 68 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ flowchart TD
2222
QAP -->|Yes| D["Build docs: just docs"]:::setup
2323
D --> E[Commit changes &#38; push branch]:::git
2424
E --> F{Release type?}:::decision
25-
F -->|RC| RC1["cz bump --dry-run<br/>then cz bump rcN"]:::setup
26-
F -->|Stable| ST1["cz bump --dry-run<br/>then cz bump"]:::setup
27-
RC1 --> RC2["git tag vX.Y.ZrcN<br/>git push origin vX.Y.ZrcN"]:::git
25+
F -->|RC| RC1["just bump-rc-preview<br/>then just bump-rc"]:::setup
26+
F -->|Stable| ST1["just bump-preview<br/>then just bump"]:::setup
27+
RC1 --> RC2["git push --follow-tags<br/>(pushes vX.Y.ZrcN)"]:::git
2828
RC2 --> RC3[CI: publish-testpypi.yml]:::ci
2929
RC3 --> RC4[TestPyPI + GitHub pre-release]:::rc
3030
RC4 -->|Issues found| B
3131
RC4 -->|RC approved| ST1
3232
ST1 --> ST2["Open PR: release/vX.Y.Z → main"]:::pr
3333
ST2 --> ST3{Review &#38; approve}:::decision
3434
ST3 --> ST4[Merge PR into main]:::pr
35-
ST4 --> ST5["git checkout main &#38;&#38; git pull<br/>git tag vX.Y.Z<br/>git push origin vX.Y.Z"]:::git
35+
ST4 --> ST5["git checkout main &#38;&#38; git pull<br/>git tag -d vX.Y.Z (local)<br/>git tag vX.Y.Z &#38;&#38; git push origin vX.Y.Z"]:::git
3636
ST5 --> ST6[CI: publish-pypi.yml]:::ci
3737
ST6 --> ST7[PyPI + GitHub Release]:::stable
3838
@@ -75,10 +75,10 @@ If you update any dependencies (e.g. to resolve security findings), regenerate t
7575
Then verify the change does not break any tests.
7676
```
7777

78-
**Security audit:** run `pip-audit` and resolve any vulnerability with an available fix before bumping the version:
78+
**Security audit:** run `just audit` and resolve any vulnerability with an available fix before bumping the version:
7979

8080
```bash
81-
poetry run pip-audit
81+
just audit
8282
```
8383

8484
Vulnerabilities with no upstream fix available should be noted and tracked as known accepted risks.
@@ -159,69 +159,105 @@ Prefer `just commit` over a manual `git commit` to stay consistent with the conv
159159

160160
## 6. Version bump
161161

162+
The version bump is driven entirely by [Commitizen](https://commitizen-tools.github.io/commitizen/). The increment (MAJOR / MINOR / PATCH) is inferred from the conventional-commit messages since the last tag, the version in `pyproject.toml` is updated, and the matching `CHANGELOG.md` section is generated and committed with an annotated tag.
163+
162164
```{important}
163-
Always run `--dry-run` first and review the proposed CHANGELOG entries carefully before applying the bump.
165+
Always run `--dry-run` first and review the proposed version and CHANGELOG entries carefully before applying the bump.
166+
```
167+
168+
The following Commitizen settings in `pyproject.toml` shape this behaviour:
169+
170+
| Setting | Value | Effect |
171+
| --- | --- | --- |
172+
| `prerelease_offset` | `1` | Prereleases start at `rc1` (not the default `rc0`) |
173+
| `changelog_merge_prerelease` | `true` | On the stable bump, all `rcN` CHANGELOG sections are rolled up into a single `vX.Y.Z` section |
174+
| `update_changelog_on_bump` | `true` | `CHANGELOG.md` is regenerated automatically on every bump |
175+
176+
The bump commands are wrapped in `just` recipes so the correct Commitizen flags are applied consistently:
177+
178+
| Recipe | Wraps | Use for |
179+
| --- | --- | --- |
180+
| `just bump-rc-preview` | `cz bump --prerelease rc --dry-run` | Preview an RC bump |
181+
| `just bump-rc` | `cz bump --prerelease rc` | Apply an RC bump |
182+
| `just bump-preview` | `cz bump --dry-run` | Preview a stable bump |
183+
| `just bump` | `cz bump` | Apply a stable bump |
184+
185+
Each recipe forwards extra arguments to Commitizen, so flags such as `--increment MAJOR` can be appended directly (e.g. `just bump-rc-preview --increment MAJOR`).
186+
187+
### 6a. Release candidate bump
188+
189+
Use the `bump-rc` recipes to cut an RC. The first prerelease of a cycle is `rc1` (thanks to `prerelease_offset = 1`); subsequent ones increment to `rc2`, `rc3`, and so on.
190+
191+
```{note}
192+
Commitizen can only infer the target version from commits. For a **major** release where the commit history does not contain a `feat!:` / `BREAKING CHANGE:` marker, force the increment explicitly with `--increment MAJOR` (likewise `MINOR` / `PATCH`).
164193
```
165194

166195
**Step 1, preview:**
167196

168197
```bash
169-
poetry run cz bump --dry-run
198+
# Append --increment MAJOR/MINOR/PATCH if the bump is not inferred correctly
199+
just bump-rc-preview
170200
```
171201

172-
Inspect the output:
173-
174-
- The proposed increment (MAJOR / MINOR / PATCH) matches expectations
175-
- The CHANGELOG entries are complete and correctly classified
176-
- There are no duplicate entries (can happen when multiple commits share identical messages)
202+
Confirm the proposed tag (e.g. `v2.0.0rc1`) and that the CHANGELOG entries are complete and correctly classified.
177203

178204
**Step 2, apply:**
179205

180206
```bash
181-
poetry run cz bump
207+
just bump-rc
182208
```
183209

184-
This will:
185-
186-
- Update `version` in `pyproject.toml`
187-
- Append the new section to `CHANGELOG.md`
188-
- Create a local commit: `bump: version X.Y.Z-1 → X.Y.Z`
210+
This updates `version` in `pyproject.toml`, appends the `vX.Y.ZrcN` section to `CHANGELOG.md`, creates the `bump:` commit, and creates the `vX.Y.ZrcN` tag locally.
189211

190-
**Step 3, review the bump commit:**
212+
**Step 3, review and push** (commit and tag together):
191213

192214
```bash
193215
git show HEAD
216+
git push --follow-tags origin release/vX.Y.Z
194217
```
195218

196-
Check that `pyproject.toml` shows the correct version and that `CHANGELOG.md` reads cleanly. Manually amend duplicate entries if present, then push:
219+
```{note}
220+
`--follow-tags` pushes the annotated `vX.Y.ZrcN` tag along with the branch in one step, which triggers `publish-testpypi.yml`. See **[Tag and publish a release candidate](#7-tag-and-publish-a-release-candidate)** below if you prefer to push the tag separately.
221+
```
222+
223+
### 6b. Stable bump
224+
225+
When all RCs are approved, cut the final stable version with the plain `bump` recipes. Because `changelog_merge_prerelease = true`, the intermediate `rcN` sections are merged into a single complete `vX.Y.Z` CHANGELOG section, so end users see the full release notes in one place.
197226

198227
```bash
199-
git push origin release/vX.Y.Z
228+
just bump-preview # append --increment MAJOR if needed
229+
just bump
200230
```
201231

202-
**For a release candidate**, set the version explicitly instead of using `cz bump`:
232+
This updates `pyproject.toml`, regenerates `CHANGELOG.md` (with prereleases merged), and creates the `bump:` commit plus the `vX.Y.Z` tag.
233+
234+
**Review the bump commit:**
203235

204236
```bash
205-
poetry version X.Y.ZrcN
206-
poetry lock
207-
git add pyproject.toml poetry.lock CHANGELOG.md
208-
git commit -m "bump: version X.Y.Z-1 → X.Y.ZrcN"
237+
git show HEAD
238+
```
239+
240+
Check that `pyproject.toml` shows the correct version and that `CHANGELOG.md` reads cleanly. Manually amend duplicate entries if present, then push the branch (the stable tag is pushed later, after the release PR is merged — see step 9):
241+
242+
```bash
243+
git push origin release/vX.Y.Z
209244
```
210245

211246
See **[Versioning](versioning.md)** for the full SemVer rules and commit-type reference.
212247

213248
## 7. Tag and publish a release candidate
214249

215-
RC tags are pushed **directly from the release branch**, with no PR to `main` required.
250+
`cz bump --prerelease rc` (step 6a) already created the annotated `vX.Y.ZrcN` tag locally. RC tags are pushed **directly from the release branch**, with no PR to `main` required.
251+
252+
If you pushed with `git push --follow-tags` in step 6a, the tag is already live and you can skip to verifying CI. Otherwise, push the tag explicitly:
216253

217254
```bash
218-
git tag -a vX.Y.ZrcN -m "Release candidate vX.Y.ZrcN"
219255
git push origin vX.Y.ZrcN
220256
```
221257

222258
This triggers `publish-testpypi.yml`, which publishes to **TestPyPI** and creates a GitHub pre-release.
223259

224-
If issues are found, fix them on the release branch (return to step 2), bump to the next RC (`rcN+1`), and repeat.
260+
If issues are found, fix them on the release branch (return to step 2), bump to the next RC with `cz bump --prerelease rc` (which yields `rcN+1`), and repeat.
225261

226262
## 8. Release PR (stable only)
227263

@@ -236,10 +272,11 @@ Once all RCs are approved (or skipping RC for a straightforward release), open a
236272

237273
## 9. Create and push the stable tag
238274

239-
After the release PR is merged into `main`:
275+
The stable `cz bump` in step 6b created a local `vX.Y.Z` tag on the release branch, but the authoritative tag must point at the merge commit on `main`. After the release PR is merged into `main`, drop the local tag and re-create it on `main`:
240276

241277
```bash
242278
git checkout main && git pull
279+
git tag -d vX.Y.Z # remove the local tag created by cz bump
243280
git tag -a vX.Y.Z -m "Release vX.Y.Z"
244281
git push origin vX.Y.Z
245282
```

justfile

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,23 @@ check:
5050
# create a conventional commit using commitizen
5151
commit:
5252
poetry run cz commit
53+
54+
# audit installed dependencies for known vulnerabilities
55+
audit:
56+
poetry run pip-audit
57+
58+
# preview the next stable version bump (pass extra cz args, e.g. `just bump-preview --increment MAJOR`)
59+
bump-preview *args:
60+
poetry run cz bump --dry-run {{ args }}
61+
62+
# apply the next stable version bump (updates version, CHANGELOG, commit, and tag)
63+
bump *args:
64+
poetry run cz bump {{ args }}
65+
66+
# preview the next release-candidate bump (pass extra cz args, e.g. `just bump-rc-preview --increment MAJOR`)
67+
bump-rc-preview *args:
68+
poetry run cz bump --prerelease rc --dry-run {{ args }}
69+
70+
# apply the next release-candidate bump (rcN; updates version, CHANGELOG, commit, and tag)
71+
bump-rc *args:
72+
poetry run cz bump --prerelease rc {{ args }}

pyproject.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[tool.poetry]
22
name = "deeptab"
33

4-
version = "1.8.0"
4+
version = "2.0.0rc1"
55

66

77
description = "A python package for tabular deep learning."
@@ -180,3 +180,5 @@ version_provider = "poetry"
180180
tag_format = "v$version"
181181
update_changelog_on_bump = true
182182
major_version_zero = false
183+
prerelease_offset = 1
184+
changelog_merge_prerelease = true

0 commit comments

Comments
 (0)