millwright 0.2.1__tar.gz → 2.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- millwright-2.2.1/.cargo/audit.toml +5 -0
- millwright-2.2.1/.github/dependabot.yml +59 -0
- millwright-2.2.1/.github/workflows/ci.yml +270 -0
- {millwright-0.2.1 → millwright-2.2.1}/.github/workflows/release-crate.yml +1 -1
- {millwright-0.2.1 → millwright-2.2.1}/.github/workflows/release-python.yml +32 -13
- {millwright-0.2.1 → millwright-2.2.1}/CHANGELOG.md +44 -3
- {millwright-0.2.1 → millwright-2.2.1}/CONTRIBUTING.md +2 -1
- {millwright-0.2.1 → millwright-2.2.1}/Cargo.lock +107 -80
- {millwright-0.2.1 → millwright-2.2.1}/Cargo.toml +7 -5
- {millwright-0.2.1 → millwright-2.2.1}/GUIDE.md +1 -1
- {millwright-0.2.1 → millwright-2.2.1}/PKG-INFO +4 -7
- {millwright-0.2.1 → millwright-2.2.1}/README.md +3 -6
- {millwright-0.2.1 → millwright-2.2.1}/RELEASING.md +10 -5
- millwright-2.2.1/deny.toml +34 -0
- {millwright-0.2.1 → millwright-2.2.1}/docs/index.html +2 -2
- {millwright-0.2.1 → millwright-2.2.1}/guide.html +3 -2
- {millwright-0.2.1 → millwright-2.2.1}/index.html +3 -3
- {millwright-0.2.1 → millwright-2.2.1}/pyproject.toml +5 -1
- millwright-2.2.1/scripts/release.ps1 +64 -0
- {millwright-0.2.1 → millwright-2.2.1}/scripts/release.sh +13 -4
- millwright-2.2.1/scripts/sync-version.py +80 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/automl.rs +48 -2
- {millwright-0.2.1 → millwright-2.2.1}/src/backends/smartcore.rs +30 -11
- {millwright-0.2.1 → millwright-2.2.1}/src/ensemble.rs +2 -89
- millwright-2.2.1/src/ensemble_tests.rs +87 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/evaluate.rs +29 -4
- {millwright-0.2.1 → millwright-2.2.1}/src/explain.rs +3 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/lib.rs +1 -1
- {millwright-0.2.1 → millwright-2.2.1}/src/monitor.rs +52 -9
- millwright-2.2.1/src/onnx.rs +349 -0
- millwright-2.2.1/src/onnx_native.rs +565 -0
- millwright-2.2.1/src/onnx_tests.rs +161 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/pipeline.rs +3 -1
- {millwright-0.2.1 → millwright-2.2.1}/src/profile.rs +7 -353
- millwright-2.2.1/src/profile_render.rs +197 -0
- millwright-2.2.1/src/profile_tests.rs +156 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/python.rs +16 -174
- millwright-2.2.1/src/python_data.rs +163 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/registry.rs +195 -39
- {millwright-0.2.1 → millwright-2.2.1}/src/selection/mod.rs +3 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/selection/scoring.rs +21 -14
- {millwright-0.2.1 → millwright-2.2.1}/src/serve.rs +139 -10
- {millwright-0.2.1 → millwright-2.2.1}/src/table.rs +10 -2
- millwright-2.2.1/src/transform.rs +468 -0
- millwright-2.2.1/src/transform_advanced.rs +437 -0
- millwright-2.2.1/src/transform_tests.rs +196 -0
- millwright-2.2.1/tests/python/conftest.py +21 -0
- millwright-2.2.1/tests/python/test_frame_and_profile.py +42 -0
- millwright-2.2.1/tests/python/test_pipeline.py +46 -0
- millwright-2.2.1/tests/python/test_search_and_portability.py +53 -0
- millwright-0.2.1/.github/workflows/ci.yml +0 -168
- millwright-0.2.1/src/onnx.rs +0 -1075
- millwright-0.2.1/src/transform.rs +0 -1096
- {millwright-0.2.1 → millwright-2.2.1}/.gitignore +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/CNAME +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/LICENSE +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/benches/throughput.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/docs/data.html +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/docs/deploy.html +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/docs/insight.html +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/docs/pipelines.html +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/docs/python.html +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/docs/site.css +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/automl.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/backends.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/explore.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/insight.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/operations.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/portability.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/specialized.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/spine.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/trust.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/examples/workflow.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/anomaly.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/backends/chronos.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/backends/incremental.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/backends/linfa.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/backends/mod.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/balance.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/calibration.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/diagnostics.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/error.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/frame.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/logistic.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/rng.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/selection/cv.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/selection/search.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/traits.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/src/viz.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/tests/ensemble_zoo.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/tests/golden.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/tests/hero_snippet.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/tests/onnx_export.rs +0 -0
- {millwright-0.2.1 → millwright-2.2.1}/tests/real_data.rs +0 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
[advisories]
|
|
2
|
+
# quick-xml 0.39.4 is retained in Cargo.lock by an inactive optional dependency
|
|
3
|
+
# and does not appear in Cargo's resolved graph for any target or feature set.
|
|
4
|
+
# Keep these explicit until the upstream package drops that stale lock edge.
|
|
5
|
+
ignore = ["RUSTSEC-2026-0194", "RUSTSEC-2026-0195"]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: cargo
|
|
4
|
+
directory: /
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
open-pull-requests-limit: 5
|
|
8
|
+
groups:
|
|
9
|
+
rust-infrastructure:
|
|
10
|
+
patterns: ["*"]
|
|
11
|
+
exclude-patterns:
|
|
12
|
+
# These crates form type/serialization boundaries with the exact-pinned
|
|
13
|
+
# ML engines. Upgrade them deliberately, with the full feature matrix.
|
|
14
|
+
- "ndarray"
|
|
15
|
+
- "prost"
|
|
16
|
+
- "sha2"
|
|
17
|
+
- "criterion"
|
|
18
|
+
ignore:
|
|
19
|
+
# Engine versions are exact by design. Dependabot PRs cannot safely infer
|
|
20
|
+
# coordinated upgrades across their ndarray and ONNX type boundaries.
|
|
21
|
+
- dependency-name: "ndarray"
|
|
22
|
+
- dependency-name: "prost"
|
|
23
|
+
- dependency-name: "sha2"
|
|
24
|
+
- dependency-name: "criterion"
|
|
25
|
+
- dependency-name: "smartcore"
|
|
26
|
+
- dependency-name: "imbalance-rs"
|
|
27
|
+
- dependency-name: "model-selection-rs"
|
|
28
|
+
- dependency-name: "linfa*"
|
|
29
|
+
- dependency-name: "hyperopt-rs"
|
|
30
|
+
- dependency-name: "regression-diagnostics"
|
|
31
|
+
- dependency-name: "shap-rs"
|
|
32
|
+
- dependency-name: "plotters-statistical"
|
|
33
|
+
- dependency-name: "onnx-export-rs"
|
|
34
|
+
- dependency-name: "driftwatch"
|
|
35
|
+
- dependency-name: "chronos-ts"
|
|
36
|
+
- dependency-name: "incremental-rs"
|
|
37
|
+
- dependency-name: "polars"
|
|
38
|
+
labels: ["dependencies", "rust"]
|
|
39
|
+
|
|
40
|
+
- package-ecosystem: github-actions
|
|
41
|
+
directory: /
|
|
42
|
+
schedule:
|
|
43
|
+
interval: weekly
|
|
44
|
+
groups:
|
|
45
|
+
actions:
|
|
46
|
+
patterns: ["*"]
|
|
47
|
+
exclude-patterns: ["dtolnay/rust-toolchain"]
|
|
48
|
+
ignore:
|
|
49
|
+
# @1.95 is a Rust toolchain selector, not an action release. It is also
|
|
50
|
+
# expressed as an input in CI, but keep this guard against regressions.
|
|
51
|
+
- dependency-name: "dtolnay/rust-toolchain"
|
|
52
|
+
labels: ["dependencies", "github-actions"]
|
|
53
|
+
|
|
54
|
+
- package-ecosystem: pip
|
|
55
|
+
directory: /
|
|
56
|
+
schedule:
|
|
57
|
+
interval: weekly
|
|
58
|
+
open-pull-requests-limit: 3
|
|
59
|
+
labels: ["dependencies", "python"]
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
# One in-flight run per ref; a new push cancels the previous.
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ci-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
|
|
14
|
+
env:
|
|
15
|
+
CARGO_TERM_COLOR: always
|
|
16
|
+
# Every job builds against the committed Cargo.lock. `--locked` turns a stale
|
|
17
|
+
# or drifted lockfile into a hard error — the reproducibility guarantee that
|
|
18
|
+
# pairs with the exact-version engine pins in Cargo.toml.
|
|
19
|
+
CARGO_NET_RETRY: "3"
|
|
20
|
+
RUSTFLAGS: "-D warnings"
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
consistency:
|
|
24
|
+
name: version & links
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v7
|
|
28
|
+
- uses: actions/setup-python@v7
|
|
29
|
+
with:
|
|
30
|
+
python-version: "3.x"
|
|
31
|
+
- name: verify every public version marker
|
|
32
|
+
run: python scripts/sync-version.py --check
|
|
33
|
+
- name: check local and external HTML links
|
|
34
|
+
uses: lycheeverse/lychee-action@v2
|
|
35
|
+
with:
|
|
36
|
+
args: >-
|
|
37
|
+
--no-progress
|
|
38
|
+
--accept 200,204,206,429
|
|
39
|
+
--retry-wait-time 2
|
|
40
|
+
index.html guide.html docs/*.html README.md CONTRIBUTING.md RELEASING.md
|
|
41
|
+
fail: true
|
|
42
|
+
|
|
43
|
+
fmt:
|
|
44
|
+
name: rustfmt
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
steps:
|
|
47
|
+
- uses: actions/checkout@v7
|
|
48
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
49
|
+
with:
|
|
50
|
+
components: rustfmt
|
|
51
|
+
- run: cargo fmt --all --check
|
|
52
|
+
|
|
53
|
+
clippy:
|
|
54
|
+
name: clippy (${{ matrix.features }})
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
strategy:
|
|
57
|
+
fail-fast: false
|
|
58
|
+
matrix:
|
|
59
|
+
include:
|
|
60
|
+
- features: "--no-default-features"
|
|
61
|
+
- features: "" # default features
|
|
62
|
+
- features: "--features full"
|
|
63
|
+
steps:
|
|
64
|
+
- uses: actions/checkout@v7
|
|
65
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
66
|
+
with:
|
|
67
|
+
components: clippy
|
|
68
|
+
- uses: Swatinem/rust-cache@v2
|
|
69
|
+
- run: cargo clippy --locked --all-targets ${{ matrix.features }}
|
|
70
|
+
|
|
71
|
+
docs:
|
|
72
|
+
name: doc
|
|
73
|
+
runs-on: ubuntu-latest
|
|
74
|
+
env:
|
|
75
|
+
RUSTDOCFLAGS: "-D warnings"
|
|
76
|
+
steps:
|
|
77
|
+
- uses: actions/checkout@v7
|
|
78
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
79
|
+
- uses: Swatinem/rust-cache@v2
|
|
80
|
+
# `full` is every Rust-facing feature (python is a cdylib, doc'd separately
|
|
81
|
+
# by maturin/pyo3), so this exercises the whole documented surface.
|
|
82
|
+
- run: cargo doc --locked --no-deps --features full
|
|
83
|
+
|
|
84
|
+
test:
|
|
85
|
+
name: test (${{ matrix.name }})
|
|
86
|
+
runs-on: ubuntu-latest
|
|
87
|
+
strategy:
|
|
88
|
+
fail-fast: false
|
|
89
|
+
matrix:
|
|
90
|
+
include:
|
|
91
|
+
# The spine, minimal: no backend at all, then the smartcore spine.
|
|
92
|
+
- { name: "core-only", features: "--no-default-features" }
|
|
93
|
+
- { name: "spine", features: "--no-default-features --features smartcore-backend" }
|
|
94
|
+
# The default install.
|
|
95
|
+
- { name: "default", features: "" }
|
|
96
|
+
# Each feature in isolation. Dependencies declared by that feature are
|
|
97
|
+
# enabled transitively; unrelated defaults cannot hide a bad edge.
|
|
98
|
+
- { name: "eda", features: "--no-default-features --features eda" }
|
|
99
|
+
- { name: "calibration", features: "--no-default-features --features calibration" }
|
|
100
|
+
- { name: "anomaly", features: "--no-default-features --features anomaly" }
|
|
101
|
+
- { name: "linfa", features: "--no-default-features --features linfa-backend" }
|
|
102
|
+
- { name: "hpo", features: "--no-default-features --features hpo" }
|
|
103
|
+
- { name: "diagnostics", features: "--no-default-features --features diagnostics" }
|
|
104
|
+
- { name: "explain", features: "--no-default-features --features explain" }
|
|
105
|
+
- { name: "viz", features: "--no-default-features --features viz" }
|
|
106
|
+
- { name: "onnx", features: "--no-default-features --features onnx" }
|
|
107
|
+
- { name: "registry", features: "--no-default-features --features registry" }
|
|
108
|
+
- { name: "monitor", features: "--no-default-features --features monitor" }
|
|
109
|
+
- { name: "serve", features: "--no-default-features --features serve" }
|
|
110
|
+
- { name: "timeseries", features: "--no-default-features --features timeseries" }
|
|
111
|
+
- { name: "incremental", features: "--no-default-features --features incremental" }
|
|
112
|
+
- { name: "automl", features: "--no-default-features --features automl" }
|
|
113
|
+
# Everything at once — the superset build, including both ndarray worlds.
|
|
114
|
+
- { name: "full", features: "--features full" }
|
|
115
|
+
steps:
|
|
116
|
+
- uses: actions/checkout@v7
|
|
117
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
118
|
+
- uses: Swatinem/rust-cache@v2
|
|
119
|
+
with:
|
|
120
|
+
key: ${{ matrix.name }}
|
|
121
|
+
- run: cargo test --locked ${{ matrix.features }}
|
|
122
|
+
|
|
123
|
+
# Cross-platform confidence on the default install, without multiplying the
|
|
124
|
+
# whole feature matrix across three operating systems.
|
|
125
|
+
os:
|
|
126
|
+
name: test (${{ matrix.os }})
|
|
127
|
+
runs-on: ${{ matrix.os }}
|
|
128
|
+
strategy:
|
|
129
|
+
fail-fast: false
|
|
130
|
+
matrix:
|
|
131
|
+
os: [windows-latest, macos-latest]
|
|
132
|
+
steps:
|
|
133
|
+
- uses: actions/checkout@v7
|
|
134
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
135
|
+
- uses: Swatinem/rust-cache@v2
|
|
136
|
+
- run: cargo test --locked
|
|
137
|
+
|
|
138
|
+
msrv:
|
|
139
|
+
name: minimum Rust 1.95
|
|
140
|
+
runs-on: ubuntu-latest
|
|
141
|
+
steps:
|
|
142
|
+
- uses: actions/checkout@v7
|
|
143
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
144
|
+
with:
|
|
145
|
+
toolchain: "1.95"
|
|
146
|
+
- uses: Swatinem/rust-cache@v2
|
|
147
|
+
- run: cargo check --locked --all-targets --features full
|
|
148
|
+
|
|
149
|
+
supply-chain:
|
|
150
|
+
name: advisories
|
|
151
|
+
runs-on: ubuntu-latest
|
|
152
|
+
steps:
|
|
153
|
+
- uses: actions/checkout@v7
|
|
154
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
155
|
+
- run: cargo install cargo-audit --locked
|
|
156
|
+
- run: cargo audit
|
|
157
|
+
|
|
158
|
+
dependency-policy:
|
|
159
|
+
name: dependency policy
|
|
160
|
+
runs-on: ubuntu-latest
|
|
161
|
+
steps:
|
|
162
|
+
- uses: actions/checkout@v7
|
|
163
|
+
- uses: taiki-e/install-action@cargo-deny
|
|
164
|
+
- run: cargo deny check
|
|
165
|
+
|
|
166
|
+
coverage:
|
|
167
|
+
name: coverage
|
|
168
|
+
runs-on: ubuntu-latest
|
|
169
|
+
steps:
|
|
170
|
+
- uses: actions/checkout@v7
|
|
171
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
172
|
+
with:
|
|
173
|
+
components: llvm-tools-preview
|
|
174
|
+
- uses: taiki-e/install-action@cargo-llvm-cov
|
|
175
|
+
- uses: Swatinem/rust-cache@v2
|
|
176
|
+
- name: measure full-feature Rust coverage
|
|
177
|
+
run: cargo llvm-cov --locked --features full --workspace --lcov --output-path lcov.info
|
|
178
|
+
- name: enforce coverage floor
|
|
179
|
+
run: >-
|
|
180
|
+
cargo llvm-cov report --summary-only
|
|
181
|
+
--fail-under-lines 82
|
|
182
|
+
--fail-under-functions 75
|
|
183
|
+
--fail-under-regions 84
|
|
184
|
+
- uses: actions/upload-artifact@v7
|
|
185
|
+
with:
|
|
186
|
+
name: rust-coverage
|
|
187
|
+
path: lcov.info
|
|
188
|
+
if-no-files-found: error
|
|
189
|
+
|
|
190
|
+
branch-coverage:
|
|
191
|
+
name: branch coverage
|
|
192
|
+
runs-on: ubuntu-latest
|
|
193
|
+
steps:
|
|
194
|
+
- uses: actions/checkout@v7
|
|
195
|
+
# LLVM branch instrumentation remains a nightly-only cargo-llvm-cov mode.
|
|
196
|
+
- uses: dtolnay/rust-toolchain@nightly
|
|
197
|
+
with:
|
|
198
|
+
components: llvm-tools-preview
|
|
199
|
+
- uses: taiki-e/install-action@cargo-llvm-cov
|
|
200
|
+
- uses: Swatinem/rust-cache@v2
|
|
201
|
+
with:
|
|
202
|
+
key: branch-coverage
|
|
203
|
+
- name: measure decision coverage
|
|
204
|
+
run: >-
|
|
205
|
+
cargo +nightly llvm-cov --locked --features full --workspace --branch
|
|
206
|
+
--cobertura --output-path branch-coverage.xml
|
|
207
|
+
- uses: actions/upload-artifact@v7
|
|
208
|
+
with:
|
|
209
|
+
name: rust-branch-coverage
|
|
210
|
+
path: branch-coverage.xml
|
|
211
|
+
if-no-files-found: error
|
|
212
|
+
|
|
213
|
+
semver:
|
|
214
|
+
name: public API compatibility
|
|
215
|
+
runs-on: ubuntu-latest
|
|
216
|
+
steps:
|
|
217
|
+
- uses: actions/checkout@v7
|
|
218
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
219
|
+
- run: cargo install cargo-semver-checks --locked
|
|
220
|
+
- run: cargo semver-checks check-release
|
|
221
|
+
|
|
222
|
+
# Compile and *run* the examples (the `test` jobs only build the library and
|
|
223
|
+
# its tests), plus a compile-check of the benchmarks. The dedicated `msrv`
|
|
224
|
+
# job above proves the declared Rust 1.95 floor independently.
|
|
225
|
+
examples:
|
|
226
|
+
name: examples & benches
|
|
227
|
+
runs-on: ubuntu-latest
|
|
228
|
+
steps:
|
|
229
|
+
- uses: actions/checkout@v7
|
|
230
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
231
|
+
- uses: Swatinem/rust-cache@v2
|
|
232
|
+
- name: run every example
|
|
233
|
+
run: |
|
|
234
|
+
for ex in spine explore trust workflow backends insight portability operations specialized automl; do
|
|
235
|
+
echo "::group::$ex"
|
|
236
|
+
cargo run --locked --features full --example "$ex"
|
|
237
|
+
echo "::endgroup::"
|
|
238
|
+
done
|
|
239
|
+
- name: compile benchmarks
|
|
240
|
+
run: cargo bench --locked --features full --no-run
|
|
241
|
+
|
|
242
|
+
package:
|
|
243
|
+
name: package (publish dry-run)
|
|
244
|
+
runs-on: ubuntu-latest
|
|
245
|
+
steps:
|
|
246
|
+
- uses: actions/checkout@v7
|
|
247
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
248
|
+
# No rust-cache here: `cargo publish` builds a copy under target/package,
|
|
249
|
+
# which the cache action's post-step chokes on.
|
|
250
|
+
# Prove the crate packages and builds from its packaged form as it would on
|
|
251
|
+
# crates.io — catches missing files, bad metadata, and path/dev-dep leaks.
|
|
252
|
+
- run: cargo publish --dry-run --locked
|
|
253
|
+
|
|
254
|
+
python:
|
|
255
|
+
name: python wheel
|
|
256
|
+
runs-on: ubuntu-latest
|
|
257
|
+
steps:
|
|
258
|
+
- uses: actions/checkout@v7
|
|
259
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
260
|
+
- uses: actions/setup-python@v7
|
|
261
|
+
with:
|
|
262
|
+
python-version: "3.9"
|
|
263
|
+
- uses: Swatinem/rust-cache@v2
|
|
264
|
+
# The `python` feature can't be linked by `cargo test` (pyo3's
|
|
265
|
+
# extension-module defers libpython), so it is built the way it ships:
|
|
266
|
+
# as an abi3 wheel via maturin, then smoke-imported.
|
|
267
|
+
- run: pip install maturin pytest
|
|
268
|
+
- run: maturin build --locked --release
|
|
269
|
+
- run: pip install --find-links target/wheels millwright
|
|
270
|
+
- run: pytest -q tests/python
|
|
@@ -12,15 +12,32 @@ permissions:
|
|
|
12
12
|
contents: read
|
|
13
13
|
|
|
14
14
|
jobs:
|
|
15
|
+
verify-version:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v7
|
|
19
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
20
|
+
- name: check Cargo, Python, and tag versions agree
|
|
21
|
+
shell: bash
|
|
22
|
+
run: |
|
|
23
|
+
cargo_version="$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')"
|
|
24
|
+
python_version="$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")"
|
|
25
|
+
test "$cargo_version" = "$python_version" || { echo "::error::Cargo $cargo_version != Python $python_version"; exit 1; }
|
|
26
|
+
if [[ "$GITHUB_REF" == refs/tags/* ]]; then
|
|
27
|
+
tag="${GITHUB_REF_NAME#v}"
|
|
28
|
+
test "$tag" = "$cargo_version" || { echo "::error::tag $tag != package $cargo_version"; exit 1; }
|
|
29
|
+
fi
|
|
30
|
+
|
|
15
31
|
linux:
|
|
32
|
+
needs: verify-version
|
|
16
33
|
runs-on: ubuntu-latest
|
|
17
34
|
strategy:
|
|
18
35
|
fail-fast: false
|
|
19
36
|
matrix:
|
|
20
37
|
target: [x86_64, aarch64]
|
|
21
38
|
steps:
|
|
22
|
-
- uses: actions/checkout@
|
|
23
|
-
- uses: actions/setup-python@
|
|
39
|
+
- uses: actions/checkout@v7
|
|
40
|
+
- uses: actions/setup-python@v7
|
|
24
41
|
with:
|
|
25
42
|
python-version: "3.x"
|
|
26
43
|
- name: build wheel (${{ matrix.target }})
|
|
@@ -31,20 +48,21 @@ jobs:
|
|
|
31
48
|
# `[tool.maturin] features = ["python"]` in pyproject.toml selects the
|
|
32
49
|
# feature; abi3-py39 means one wheel covers Python 3.9+.
|
|
33
50
|
args: --release --locked --out dist
|
|
34
|
-
- uses: actions/upload-artifact@
|
|
51
|
+
- uses: actions/upload-artifact@v7
|
|
35
52
|
with:
|
|
36
53
|
name: wheels-linux-${{ matrix.target }}
|
|
37
54
|
path: dist
|
|
38
55
|
|
|
39
56
|
windows:
|
|
57
|
+
needs: verify-version
|
|
40
58
|
runs-on: windows-latest
|
|
41
59
|
strategy:
|
|
42
60
|
fail-fast: false
|
|
43
61
|
matrix:
|
|
44
62
|
target: [x64]
|
|
45
63
|
steps:
|
|
46
|
-
- uses: actions/checkout@
|
|
47
|
-
- uses: actions/setup-python@
|
|
64
|
+
- uses: actions/checkout@v7
|
|
65
|
+
- uses: actions/setup-python@v7
|
|
48
66
|
with:
|
|
49
67
|
python-version: "3.x"
|
|
50
68
|
architecture: ${{ matrix.target }}
|
|
@@ -53,20 +71,21 @@ jobs:
|
|
|
53
71
|
with:
|
|
54
72
|
target: ${{ matrix.target }}
|
|
55
73
|
args: --release --locked --out dist
|
|
56
|
-
- uses: actions/upload-artifact@
|
|
74
|
+
- uses: actions/upload-artifact@v7
|
|
57
75
|
with:
|
|
58
76
|
name: wheels-windows-${{ matrix.target }}
|
|
59
77
|
path: dist
|
|
60
78
|
|
|
61
79
|
macos:
|
|
80
|
+
needs: verify-version
|
|
62
81
|
runs-on: macos-latest
|
|
63
82
|
strategy:
|
|
64
83
|
fail-fast: false
|
|
65
84
|
matrix:
|
|
66
85
|
target: [x86_64, aarch64]
|
|
67
86
|
steps:
|
|
68
|
-
- uses: actions/checkout@
|
|
69
|
-
- uses: actions/setup-python@
|
|
87
|
+
- uses: actions/checkout@v7
|
|
88
|
+
- uses: actions/setup-python@v7
|
|
70
89
|
with:
|
|
71
90
|
python-version: "3.x"
|
|
72
91
|
- name: build wheel (${{ matrix.target }})
|
|
@@ -74,21 +93,22 @@ jobs:
|
|
|
74
93
|
with:
|
|
75
94
|
target: ${{ matrix.target }}
|
|
76
95
|
args: --release --locked --out dist
|
|
77
|
-
- uses: actions/upload-artifact@
|
|
96
|
+
- uses: actions/upload-artifact@v7
|
|
78
97
|
with:
|
|
79
98
|
name: wheels-macos-${{ matrix.target }}
|
|
80
99
|
path: dist
|
|
81
100
|
|
|
82
101
|
sdist:
|
|
102
|
+
needs: verify-version
|
|
83
103
|
runs-on: ubuntu-latest
|
|
84
104
|
steps:
|
|
85
|
-
- uses: actions/checkout@
|
|
105
|
+
- uses: actions/checkout@v7
|
|
86
106
|
- name: build sdist
|
|
87
107
|
uses: PyO3/maturin-action@v1
|
|
88
108
|
with:
|
|
89
109
|
command: sdist
|
|
90
110
|
args: --out dist
|
|
91
|
-
- uses: actions/upload-artifact@
|
|
111
|
+
- uses: actions/upload-artifact@v7
|
|
92
112
|
with:
|
|
93
113
|
name: wheels-sdist
|
|
94
114
|
path: dist
|
|
@@ -102,7 +122,7 @@ jobs:
|
|
|
102
122
|
permissions:
|
|
103
123
|
id-token: write # PyPI Trusted Publishing (OIDC) — no stored token
|
|
104
124
|
steps:
|
|
105
|
-
- uses: actions/download-artifact@
|
|
125
|
+
- uses: actions/download-artifact@v8
|
|
106
126
|
with:
|
|
107
127
|
pattern: wheels-*
|
|
108
128
|
merge-multiple: true
|
|
@@ -111,4 +131,3 @@ jobs:
|
|
|
111
131
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
112
132
|
with:
|
|
113
133
|
packages-dir: dist
|
|
114
|
-
skip-existing: true
|
|
@@ -6,6 +6,48 @@ All notable changes to Millwright are recorded here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [2.2.1] - 2026-08-24
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- Enforced line, function, and region coverage floors, plus nightly LLVM branch
|
|
13
|
+
coverage artifacts.
|
|
14
|
+
- Expanded the installed-wheel Python suite to cover validation, classification,
|
|
15
|
+
regression, search, explainability, profiling, and ONNX round trips.
|
|
16
|
+
- Added protected MSRV, branch-coverage, Windows, and macOS checks on `main`.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- Isolated ONNX native execution, profile rendering, advanced transforms, and
|
|
20
|
+
Python data/EDA bindings into focused production modules.
|
|
21
|
+
- Hardened Dependabot so compatibility-boundary and exact-pinned engine upgrades
|
|
22
|
+
remain deliberate, while safe GitHub Actions updates stay automated.
|
|
23
|
+
- Updated GitHub Actions and kept release publishing on trusted OIDC workflows.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
- Version synchronization now includes the root `Cargo.lock` package entry and
|
|
27
|
+
the maintained Python version assertion.
|
|
28
|
+
- Removed the obsolete standalone Python smoke script after migrating CI to the
|
|
29
|
+
pytest behavioral suite.
|
|
30
|
+
- Corrected the MSRV workflow selector so dependency automation cannot rewrite
|
|
31
|
+
Rust 1.95 as an action version.
|
|
32
|
+
|
|
33
|
+
## [2.2.0] - 2026-08-24
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
- Complete Rust and Python ML lifecycle: typed ingest and EDA, preprocessing,
|
|
37
|
+
model selection and HPO, ensembles, diagnostics and explainability, ONNX
|
|
38
|
+
portability, serving, registry, drift monitoring, specialized estimators, and
|
|
39
|
+
AutoML.
|
|
40
|
+
- Cross-platform Python abi3 wheels and synchronized crates.io/PyPI releases.
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
- Hardened feature isolation, packaging, MSRV, SemVer, advisory, example, and
|
|
44
|
+
benchmark checks across the full CI matrix.
|
|
45
|
+
- Updated the Python extension to PyO3 0.29 and documented the stable 2.2 API.
|
|
46
|
+
|
|
47
|
+
### Security
|
|
48
|
+
- Added explicit dependency advisory handling and removed vulnerable PyO3
|
|
49
|
+
releases from the resolved graph.
|
|
50
|
+
|
|
9
51
|
## [0.2.1] - 2026-08-23
|
|
10
52
|
|
|
11
53
|
### Added
|
|
@@ -125,9 +167,8 @@ All notable changes to Millwright are recorded here. The format follows
|
|
|
125
167
|
feature-matrix CI (fmt, clippy `-D warnings`, docs, matrix, OS, examples,
|
|
126
168
|
benches, publish dry-run, wheel).
|
|
127
169
|
- `selection.rs` split into `selection/{scoring,cv,search}`.
|
|
128
|
-
- MSRV is **1.95** (dep-dictated — `sysinfo` via tract, and polars)
|
|
129
|
-
|
|
130
|
-
every transitive bump). The default install needs 1.85.
|
|
170
|
+
- MSRV is **1.95** (dep-dictated — `sysinfo` via tract, and polars), declared
|
|
171
|
+
through `rust-version` and exercised by a dedicated CI job.
|
|
131
172
|
- De-staled the crate and module docs (no more "Phase 0 · the spine").
|
|
132
173
|
|
|
133
174
|
### Fixed
|
|
@@ -45,7 +45,8 @@ cargo doc --no-deps --features full # with RUSTDOCFLAGS="-D warnings"
|
|
|
45
45
|
|
|
46
46
|
Maintainers: bump `Cargo.toml` + `pyproject.toml`, roll `CHANGELOG.md`, and tag
|
|
47
47
|
`vX.Y.Z` — the workflows publish to crates.io and PyPI via OIDC. The helper
|
|
48
|
-
`scripts/release.sh X.Y.Z`
|
|
48
|
+
`scripts/release.sh X.Y.Z` (Linux/macOS) or `scripts/release.ps1 X.Y.Z`
|
|
49
|
+
(Windows) does the mechanical steps. See
|
|
49
50
|
[`RELEASING.md`](RELEASING.md).
|
|
50
51
|
|
|
51
52
|
## Scope & conduct
|