whestbench 0.4.0__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.
- whestbench-0.4.0/.githooks/pre-commit +30 -0
- whestbench-0.4.0/.githooks/pre-push +27 -0
- whestbench-0.4.0/.github/workflows/ci.yml +94 -0
- whestbench-0.4.0/.github/workflows/pypi-publish.yml +100 -0
- whestbench-0.4.0/.gitignore +250 -0
- whestbench-0.4.0/.gitlint +11 -0
- whestbench-0.4.0/CHANGELOG.md +64 -0
- whestbench-0.4.0/PKG-INFO +17 -0
- whestbench-0.4.0/README.md +136 -0
- whestbench-0.4.0/assets/logo/logo.png +0 -0
- whestbench-0.4.0/docs/how-to/parallel-bake.md +317 -0
- whestbench-0.4.0/docs/how-to/publish-to-hf-hub.md +219 -0
- whestbench-0.4.0/docs/index.md +32 -0
- whestbench-0.4.0/docs/reference/cli-reference.md +444 -0
- whestbench-0.4.0/docs/reference/code-patterns.md +144 -0
- whestbench-0.4.0/docs/reference/dataset-format.md +552 -0
- whestbench-0.4.0/docs/reference/estimator-contract.md +147 -0
- whestbench-0.4.0/docs/reference/flopscope-primer.md +160 -0
- whestbench-0.4.0/docs/reference/gpu-dataset-generation.md +284 -0
- whestbench-0.4.0/docs/reference/score-report-fields.md +196 -0
- whestbench-0.4.0/docs/release-process.md +132 -0
- whestbench-0.4.0/docs/superpowers/plans/2026-05-20-budget-exhaustion-warning.md +957 -0
- whestbench-0.4.0/docs/superpowers/specs/2026-05-20-budget-exhaustion-warning-design.md +325 -0
- whestbench-0.4.0/main.py +9 -0
- whestbench-0.4.0/profiling/Dockerfile +102 -0
- whestbench-0.4.0/profiling/README.md +310 -0
- whestbench-0.4.0/profiling/__init__.py +0 -0
- whestbench-0.4.0/profiling/build_and_push.sh +58 -0
- whestbench-0.4.0/profiling/collect_results.py +226 -0
- whestbench-0.4.0/profiling/dashboard_components.js +630 -0
- whestbench-0.4.0/profiling/dashboard_styles.css +354 -0
- whestbench-0.4.0/profiling/entrypoint.sh +91 -0
- whestbench-0.4.0/profiling/generate_dashboard.py +173 -0
- whestbench-0.4.0/profiling/instance_matrix.py +40 -0
- whestbench-0.4.0/profiling/results/.gitkeep +0 -0
- whestbench-0.4.0/profiling/run_benchmarks.py +399 -0
- whestbench-0.4.0/profiling/run_helpers.py +91 -0
- whestbench-0.4.0/profiling/setup_infra.sh +185 -0
- whestbench-0.4.0/profiling/teardown_infra.sh +92 -0
- whestbench-0.4.0/profiling/tests/__init__.py +0 -0
- whestbench-0.4.0/profiling/tests/test_collect_results.py +82 -0
- whestbench-0.4.0/profiling/tests/test_generate_dashboard.py +236 -0
- whestbench-0.4.0/profiling/tests/test_instance_matrix.py +44 -0
- whestbench-0.4.0/profiling/tests/test_run_helpers.py +44 -0
- whestbench-0.4.0/pyproject.toml +71 -0
- whestbench-0.4.0/pytest.ini +7 -0
- whestbench-0.4.0/scripts/run-test-harness.sh +31 -0
- whestbench-0.4.0/scripts/setup-git-hooks.sh +20 -0
- whestbench-0.4.0/src/whestbench/__init__.py +49 -0
- whestbench-0.4.0/src/whestbench/_provenance.py +85 -0
- whestbench-0.4.0/src/whestbench/_simulation_torch.py +96 -0
- whestbench-0.4.0/src/whestbench/cli.py +2184 -0
- whestbench-0.4.0/src/whestbench/concurrency.py +69 -0
- whestbench-0.4.0/src/whestbench/dataset.py +495 -0
- whestbench-0.4.0/src/whestbench/dataset_io.py +696 -0
- whestbench-0.4.0/src/whestbench/dataset_torch.py +506 -0
- whestbench-0.4.0/src/whestbench/doctor.py +339 -0
- whestbench-0.4.0/src/whestbench/domain.py +118 -0
- whestbench-0.4.0/src/whestbench/estimators.py +144 -0
- whestbench-0.4.0/src/whestbench/generation.py +48 -0
- whestbench-0.4.0/src/whestbench/hardware.py +153 -0
- whestbench-0.4.0/src/whestbench/hub.py +109 -0
- whestbench-0.4.0/src/whestbench/loader.py +127 -0
- whestbench-0.4.0/src/whestbench/naming.py +79 -0
- whestbench-0.4.0/src/whestbench/packaging.py +121 -0
- whestbench-0.4.0/src/whestbench/presentation/__init__.py +25 -0
- whestbench-0.4.0/src/whestbench/presentation/adapters.py +728 -0
- whestbench-0.4.0/src/whestbench/presentation/blocks.py +350 -0
- whestbench-0.4.0/src/whestbench/presentation/breakdowns.py +206 -0
- whestbench-0.4.0/src/whestbench/presentation/human.py +89 -0
- whestbench-0.4.0/src/whestbench/presentation/models.py +195 -0
- whestbench-0.4.0/src/whestbench/presentation/output.py +34 -0
- whestbench-0.4.0/src/whestbench/presentation/presenters.py +66 -0
- whestbench-0.4.0/src/whestbench/profiler.py +979 -0
- whestbench-0.4.0/src/whestbench/protocol.py +56 -0
- whestbench-0.4.0/src/whestbench/reporting.py +1562 -0
- whestbench-0.4.0/src/whestbench/runner.py +468 -0
- whestbench-0.4.0/src/whestbench/scoring.py +926 -0
- whestbench-0.4.0/src/whestbench/sdk.py +51 -0
- whestbench-0.4.0/src/whestbench/simulation.py +139 -0
- whestbench-0.4.0/src/whestbench/subprocess_worker.py +218 -0
- whestbench-0.4.0/src/whestbench/templates/dataset_card.md.j2 +315 -0
- whestbench-0.4.0/src/whestbench/templates/estimator.py.tmpl +11 -0
- whestbench-0.4.0/tests/_legacy_npz.py +130 -0
- whestbench-0.4.0/tests/conftest.py +6 -0
- whestbench-0.4.0/tests/fixtures/__init__.py +0 -0
- whestbench-0.4.0/tests/fixtures/multi_split_v3.0/README.md +191 -0
- whestbench-0.4.0/tests/fixtures/multi_split_v3.0/data/holdout-00000-of-00001.parquet +0 -0
- whestbench-0.4.0/tests/fixtures/multi_split_v3.0/data/public-00000-of-00001.parquet +0 -0
- whestbench-0.4.0/tests/fixtures/multi_split_v3.0/metadata.json +33 -0
- whestbench-0.4.0/tests/fixtures/seeded_estimator.py +32 -0
- whestbench-0.4.0/tests/fixtures/single_split_v3_protocol/README.md +223 -0
- whestbench-0.4.0/tests/fixtures/single_split_v3_protocol/data/public-00000-of-00001.parquet +0 -0
- whestbench-0.4.0/tests/fixtures/single_split_v3_protocol/metadata.json +15 -0
- whestbench-0.4.0/tests/helpers.py +22 -0
- whestbench-0.4.0/tests/test_cli.py +1009 -0
- whestbench-0.4.0/tests/test_cli_dataset.py +582 -0
- whestbench-0.4.0/tests/test_cli_debugger.py +287 -0
- whestbench-0.4.0/tests/test_cli_fallback.py +402 -0
- whestbench-0.4.0/tests/test_cli_participant_commands.py +1483 -0
- whestbench-0.4.0/tests/test_cli_run_hf.py +91 -0
- whestbench-0.4.0/tests/test_dataset.py +656 -0
- whestbench-0.4.0/tests/test_dataset_io_combine.py +245 -0
- whestbench-0.4.0/tests/test_dataset_io_merge.py +160 -0
- whestbench-0.4.0/tests/test_dataset_io_read.py +87 -0
- whestbench-0.4.0/tests/test_dataset_io_readme.py +864 -0
- whestbench-0.4.0/tests/test_dataset_io_schema.py +590 -0
- whestbench-0.4.0/tests/test_dataset_io_write.py +97 -0
- whestbench-0.4.0/tests/test_dataset_loader.py +115 -0
- whestbench-0.4.0/tests/test_dataset_multi_split_fixture.py +72 -0
- whestbench-0.4.0/tests/test_dataset_round_trip_cpu.py +136 -0
- whestbench-0.4.0/tests/test_dataset_round_trip_torch.py +102 -0
- whestbench-0.4.0/tests/test_dataset_seed_protocol.py +122 -0
- whestbench-0.4.0/tests/test_dataset_torch.py +422 -0
- whestbench-0.4.0/tests/test_dataset_v3_fixture.py +60 -0
- whestbench-0.4.0/tests/test_docs_quality.py +160 -0
- whestbench-0.4.0/tests/test_doctor.py +446 -0
- whestbench-0.4.0/tests/test_domain.py +98 -0
- whestbench-0.4.0/tests/test_estimators.py +41 -0
- whestbench-0.4.0/tests/test_estimators_module.py +92 -0
- whestbench-0.4.0/tests/test_evaluate.py +109 -0
- whestbench-0.4.0/tests/test_exhaustive_harness.py +29 -0
- whestbench-0.4.0/tests/test_generation.py +49 -0
- whestbench-0.4.0/tests/test_hardware.py +114 -0
- whestbench-0.4.0/tests/test_hub.py +83 -0
- whestbench-0.4.0/tests/test_inprocess_runner.py +104 -0
- whestbench-0.4.0/tests/test_loader.py +147 -0
- whestbench-0.4.0/tests/test_metadata_provenance.py +200 -0
- whestbench-0.4.0/tests/test_mlp_seed_plumbing.py +74 -0
- whestbench-0.4.0/tests/test_naming.py +146 -0
- whestbench-0.4.0/tests/test_packaging.py +114 -0
- whestbench-0.4.0/tests/test_presentation_adapters.py +440 -0
- whestbench-0.4.0/tests/test_presentation_parity.py +424 -0
- whestbench-0.4.0/tests/test_presentation_renderers.py +927 -0
- whestbench-0.4.0/tests/test_profiler.py +447 -0
- whestbench-0.4.0/tests/test_protocol.py +28 -0
- whestbench-0.4.0/tests/test_reporting.py +932 -0
- whestbench-0.4.0/tests/test_reporting_budget_gauge.py +682 -0
- whestbench-0.4.0/tests/test_runner_types.py +66 -0
- whestbench-0.4.0/tests/test_scoring_aggregates.py +158 -0
- whestbench-0.4.0/tests/test_scoring_budget_adjusted.py +118 -0
- whestbench-0.4.0/tests/test_scoring_combined_budget.py +99 -0
- whestbench-0.4.0/tests/test_scoring_effective_compute.py +86 -0
- whestbench-0.4.0/tests/test_scoring_failure_semantics.py +126 -0
- whestbench-0.4.0/tests/test_scoring_module.py +1173 -0
- whestbench-0.4.0/tests/test_scoring_subprocess_residual.py +84 -0
- whestbench-0.4.0/tests/test_scoring_warnings.py +131 -0
- whestbench-0.4.0/tests/test_sdk.py +37 -0
- whestbench-0.4.0/tests/test_setup_context_seed.py +627 -0
- whestbench-0.4.0/tests/test_simulation.py +105 -0
- whestbench-0.4.0/tests/test_subprocess_runner.py +158 -0
- whestbench-0.4.0/tests/test_subprocess_worker.py +251 -0
- whestbench-0.4.0/tests/test_subprocess_worker_memory.py +133 -0
- whestbench-0.4.0/tests/test_torch_flop_synthesis.py +66 -0
- whestbench-0.4.0/uv.lock +2935 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Pre-commit hook: run ruff checks on staged Python files only.
|
|
3
|
+
# Install: git config core.hooksPath .githooks
|
|
4
|
+
#
|
|
5
|
+
# Scope is intentionally narrow (staged files). The pre-push hook runs
|
|
6
|
+
# repo-wide checks; this one is the fast, focused guard against committing
|
|
7
|
+
# ruff drift in the first place.
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
if ! command -v uv >/dev/null; then
|
|
12
|
+
echo "[pre-commit] Missing 'uv' in PATH. Install: curl -LsSf https://astral.sh/uv/install.sh | sh" >&2
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
staged_py=$(git diff --cached --name-only --diff-filter=ACMR -- '*.py')
|
|
17
|
+
|
|
18
|
+
if [ -z "$staged_py" ]; then
|
|
19
|
+
exit 0
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
echo ">>> pre-commit: ruff on staged Python files"
|
|
23
|
+
|
|
24
|
+
echo "==> ruff check"
|
|
25
|
+
echo "$staged_py" | xargs uv run ruff check
|
|
26
|
+
|
|
27
|
+
echo "==> ruff format --check"
|
|
28
|
+
echo "$staged_py" | xargs uv run ruff format --check
|
|
29
|
+
|
|
30
|
+
echo "==> pre-commit checks passed"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Pre-push hook: run local checks that match CI before allowing push.
|
|
3
|
+
# Install: git config core.hooksPath .githooks
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
run_ci_like_checks() {
|
|
8
|
+
echo ">>> pre-push: running local checks required before push"
|
|
9
|
+
|
|
10
|
+
if ! command -v uv >/dev/null; then
|
|
11
|
+
echo "[pre-push] Missing 'uv' in PATH. Install with: curl -LsSf https://astral.sh/uv/install.sh | sh" >&2
|
|
12
|
+
exit 1
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
echo "==> ruff check"
|
|
16
|
+
uv run ruff check .
|
|
17
|
+
|
|
18
|
+
echo "==> ruff format --check"
|
|
19
|
+
uv run ruff format --check .
|
|
20
|
+
|
|
21
|
+
echo "==> pytest (non-exhaustive)"
|
|
22
|
+
uv run pytest -m "not exhaustive" -x -q
|
|
23
|
+
|
|
24
|
+
echo "==> pre-push checks passed"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
run_ci_like_checks
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
lint:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
with:
|
|
14
|
+
fetch-depth: 0
|
|
15
|
+
|
|
16
|
+
- name: Install uv
|
|
17
|
+
uses: astral-sh/setup-uv@v4
|
|
18
|
+
|
|
19
|
+
- name: Set up Python 3.12
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.12"
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies (with latest flopscope)
|
|
25
|
+
run: uv sync --group dev --upgrade-package flopscope --upgrade-package flopscope-server
|
|
26
|
+
|
|
27
|
+
- name: Lint
|
|
28
|
+
run: uv run ruff check .
|
|
29
|
+
|
|
30
|
+
- name: Format check
|
|
31
|
+
run: uv run ruff format --check .
|
|
32
|
+
|
|
33
|
+
- name: Type check
|
|
34
|
+
run: uv run pyright
|
|
35
|
+
|
|
36
|
+
- name: Conventional commits (gitlint)
|
|
37
|
+
if: github.event_name == 'pull_request'
|
|
38
|
+
run: uv run gitlint --commits origin/${{ github.base_ref }}..HEAD
|
|
39
|
+
|
|
40
|
+
- name: Pre-push hook hint
|
|
41
|
+
if: failure()
|
|
42
|
+
run: |
|
|
43
|
+
cat <<'EOF'
|
|
44
|
+
::notice title=Tip: catch this locally before CI::
|
|
45
|
+
This repo ships pre-commit and pre-push hooks that run ruff (and pytest on push)
|
|
46
|
+
before each commit/push. If they had been active on your machine, this failure
|
|
47
|
+
would have been blocked before reaching CI.
|
|
48
|
+
|
|
49
|
+
One-time setup per clone:
|
|
50
|
+
|
|
51
|
+
git config core.hooksPath .githooks
|
|
52
|
+
|
|
53
|
+
After that, every worktree of this clone runs the hooks automatically.
|
|
54
|
+
See .githooks/pre-commit and .githooks/pre-push for exact commands.
|
|
55
|
+
EOF
|
|
56
|
+
|
|
57
|
+
test:
|
|
58
|
+
runs-on: ubuntu-latest
|
|
59
|
+
steps:
|
|
60
|
+
- uses: actions/checkout@v4
|
|
61
|
+
|
|
62
|
+
- name: Install uv
|
|
63
|
+
uses: astral-sh/setup-uv@v4
|
|
64
|
+
|
|
65
|
+
- name: Set up Python 3.12
|
|
66
|
+
uses: actions/setup-python@v5
|
|
67
|
+
with:
|
|
68
|
+
python-version: "3.12"
|
|
69
|
+
|
|
70
|
+
- name: Install dependencies (with latest flopscope)
|
|
71
|
+
run: uv sync --group dev --upgrade-package flopscope --upgrade-package flopscope-server
|
|
72
|
+
|
|
73
|
+
- name: Test
|
|
74
|
+
run: uv run pytest -m "not exhaustive" -x -q
|
|
75
|
+
|
|
76
|
+
exhaustive-tests:
|
|
77
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
steps:
|
|
80
|
+
- uses: actions/checkout@v4
|
|
81
|
+
|
|
82
|
+
- name: Install uv
|
|
83
|
+
uses: astral-sh/setup-uv@v4
|
|
84
|
+
|
|
85
|
+
- name: Set up Python 3.12
|
|
86
|
+
uses: actions/setup-python@v5
|
|
87
|
+
with:
|
|
88
|
+
python-version: "3.12"
|
|
89
|
+
|
|
90
|
+
- name: Install dependencies (with latest flopscope)
|
|
91
|
+
run: uv sync --group dev --upgrade-package flopscope --upgrade-package flopscope-server
|
|
92
|
+
|
|
93
|
+
- name: Exhaustive tests
|
|
94
|
+
run: uv run pytest -m exhaustive -x -q
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
name: PyPI publish
|
|
2
|
+
|
|
3
|
+
# Triggered when a `v*` tag is pushed (typically via `cz bump` followed by
|
|
4
|
+
# `git push --follow-tags`). See docs/release-process.md for the
|
|
5
|
+
# end-to-end flow and the one-time PyPI Trusted Publisher setup.
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
tags:
|
|
10
|
+
- 'v*'
|
|
11
|
+
|
|
12
|
+
# Deny all default permissions; each job opts in to only what it needs.
|
|
13
|
+
permissions: {}
|
|
14
|
+
|
|
15
|
+
# Never run two publish jobs for the same tag in parallel. Don't cancel an
|
|
16
|
+
# in-flight publish if another tag arrives — let it finish atomically.
|
|
17
|
+
concurrency:
|
|
18
|
+
group: pypi-publish-${{ github.ref }}
|
|
19
|
+
cancel-in-progress: false
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
build:
|
|
23
|
+
name: Build sdist + wheel
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
permissions:
|
|
26
|
+
contents: read
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v4
|
|
29
|
+
|
|
30
|
+
- name: Install uv
|
|
31
|
+
uses: astral-sh/setup-uv@v4
|
|
32
|
+
|
|
33
|
+
- name: Build distributions
|
|
34
|
+
run: uv build
|
|
35
|
+
|
|
36
|
+
- name: Upload dist artifact
|
|
37
|
+
uses: actions/upload-artifact@v4
|
|
38
|
+
with:
|
|
39
|
+
name: dist
|
|
40
|
+
path: dist/
|
|
41
|
+
if-no-files-found: error
|
|
42
|
+
|
|
43
|
+
publish-pypi:
|
|
44
|
+
name: Publish to PyPI
|
|
45
|
+
needs: build
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
# The `pypi` environment in repo settings has Required Reviewers
|
|
48
|
+
# configured, so this job pauses for a human approval before running.
|
|
49
|
+
environment:
|
|
50
|
+
name: pypi
|
|
51
|
+
url: https://pypi.org/project/whestbench/
|
|
52
|
+
permissions:
|
|
53
|
+
# Required for Trusted Publishing (OIDC). No long-lived token stored.
|
|
54
|
+
id-token: write
|
|
55
|
+
steps:
|
|
56
|
+
- name: Download dist artifact
|
|
57
|
+
uses: actions/download-artifact@v4
|
|
58
|
+
with:
|
|
59
|
+
name: dist
|
|
60
|
+
path: dist/
|
|
61
|
+
|
|
62
|
+
- name: Publish to PyPI
|
|
63
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
64
|
+
|
|
65
|
+
github-release:
|
|
66
|
+
name: Create GitHub Release
|
|
67
|
+
needs: publish-pypi
|
|
68
|
+
runs-on: ubuntu-latest
|
|
69
|
+
permissions:
|
|
70
|
+
contents: write
|
|
71
|
+
steps:
|
|
72
|
+
- uses: actions/checkout@v4
|
|
73
|
+
|
|
74
|
+
- name: Extract CHANGELOG section for this tag
|
|
75
|
+
run: |
|
|
76
|
+
# Extract the section between `## v<version>` and the next `## ` header.
|
|
77
|
+
# commitizen writes headers like `## v0.4.0 (2026-05-26)`.
|
|
78
|
+
awk -v ver="${GITHUB_REF_NAME}" '
|
|
79
|
+
$1 == "##" && $2 == ver { capture = 1; next }
|
|
80
|
+
$1 == "##" && capture { exit }
|
|
81
|
+
capture { print }
|
|
82
|
+
' CHANGELOG.md > release-notes.md
|
|
83
|
+
|
|
84
|
+
# Fallback if no matching section (defensive — shouldn't happen if
|
|
85
|
+
# cz bump was used, but covers manual tags with no changelog entry).
|
|
86
|
+
if [ ! -s release-notes.md ]; then
|
|
87
|
+
printf 'Release %s\n\nSee CHANGELOG.md for details.\n' "${GITHUB_REF_NAME}" > release-notes.md
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
echo "--- release notes ---"
|
|
91
|
+
cat release-notes.md
|
|
92
|
+
echo "--- end ---"
|
|
93
|
+
|
|
94
|
+
- name: Create GitHub Release
|
|
95
|
+
env:
|
|
96
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
97
|
+
run: |
|
|
98
|
+
gh release create "$GITHUB_REF_NAME" \
|
|
99
|
+
--title "$GITHUB_REF_NAME" \
|
|
100
|
+
--notes-file release-notes.md
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
# Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
# uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
# poetry.lock
|
|
109
|
+
# poetry.toml
|
|
110
|
+
|
|
111
|
+
# pdm
|
|
112
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
113
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
114
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
115
|
+
# pdm.lock
|
|
116
|
+
# pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# pixi
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
122
|
+
# pixi.lock
|
|
123
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
124
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
125
|
+
.pixi
|
|
126
|
+
|
|
127
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
128
|
+
__pypackages__/
|
|
129
|
+
|
|
130
|
+
# Celery stuff
|
|
131
|
+
celerybeat-schedule
|
|
132
|
+
celerybeat.pid
|
|
133
|
+
|
|
134
|
+
# Redis
|
|
135
|
+
*.rdb
|
|
136
|
+
*.aof
|
|
137
|
+
*.pid
|
|
138
|
+
|
|
139
|
+
# RabbitMQ
|
|
140
|
+
mnesia/
|
|
141
|
+
rabbitmq/
|
|
142
|
+
rabbitmq-data/
|
|
143
|
+
|
|
144
|
+
# ActiveMQ
|
|
145
|
+
activemq-data/
|
|
146
|
+
|
|
147
|
+
# SageMath parsed files
|
|
148
|
+
*.sage.py
|
|
149
|
+
|
|
150
|
+
# Environments
|
|
151
|
+
.env
|
|
152
|
+
.envrc
|
|
153
|
+
.venv
|
|
154
|
+
env/
|
|
155
|
+
venv/
|
|
156
|
+
ENV/
|
|
157
|
+
env.bak/
|
|
158
|
+
venv.bak/
|
|
159
|
+
|
|
160
|
+
# Spyder project settings
|
|
161
|
+
.spyderproject
|
|
162
|
+
.spyproject
|
|
163
|
+
|
|
164
|
+
# Rope project settings
|
|
165
|
+
.ropeproject
|
|
166
|
+
|
|
167
|
+
# mkdocs documentation
|
|
168
|
+
/site
|
|
169
|
+
|
|
170
|
+
# mypy
|
|
171
|
+
.mypy_cache/
|
|
172
|
+
.dmypy.json
|
|
173
|
+
dmypy.json
|
|
174
|
+
|
|
175
|
+
# Pyre type checker
|
|
176
|
+
.pyre/
|
|
177
|
+
|
|
178
|
+
# pytype static type analyzer
|
|
179
|
+
.pytype/
|
|
180
|
+
|
|
181
|
+
# Cython debug symbols
|
|
182
|
+
cython_debug/
|
|
183
|
+
|
|
184
|
+
# PyCharm
|
|
185
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
186
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
187
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
188
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
189
|
+
# .idea/
|
|
190
|
+
|
|
191
|
+
# Abstra
|
|
192
|
+
# Abstra is an AI-powered process automation framework.
|
|
193
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
194
|
+
# Learn more at https://abstra.io/docs
|
|
195
|
+
.abstra/
|
|
196
|
+
|
|
197
|
+
# Visual Studio Code
|
|
198
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
199
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
200
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
201
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
202
|
+
# .vscode/
|
|
203
|
+
|
|
204
|
+
# Ruff stuff:
|
|
205
|
+
.ruff_cache/
|
|
206
|
+
|
|
207
|
+
# PyPI configuration file
|
|
208
|
+
.pypirc
|
|
209
|
+
|
|
210
|
+
# Marimo
|
|
211
|
+
marimo/_static/
|
|
212
|
+
marimo/_lsp/
|
|
213
|
+
__marimo__/
|
|
214
|
+
|
|
215
|
+
# Streamlit
|
|
216
|
+
.streamlit/secrets.toml
|
|
217
|
+
|
|
218
|
+
# Node (tools/whestbench-explorer)
|
|
219
|
+
node_modules/
|
|
220
|
+
|
|
221
|
+
# Local git worktrees
|
|
222
|
+
.worktrees/
|
|
223
|
+
|
|
224
|
+
internal agent config/
|
|
225
|
+
internal codex config/
|
|
226
|
+
.claude/
|
|
227
|
+
.cursor/
|
|
228
|
+
.roo/
|
|
229
|
+
.windsurf/
|
|
230
|
+
internal docs/sanitization/public-sync-state.local.env
|
|
231
|
+
|
|
232
|
+
# Cloud profiling infrastructure
|
|
233
|
+
profiling/results/*
|
|
234
|
+
!profiling/results/.gitkeep
|
|
235
|
+
profiling/.infra-config.json
|
|
236
|
+
profiling/.lib-cache/
|
|
237
|
+
|
|
238
|
+
internal config
|
|
239
|
+
|
|
240
|
+
# Local debug/profiling output
|
|
241
|
+
local-*.html
|
|
242
|
+
local-*.json
|
|
243
|
+
|
|
244
|
+
# Generated Cython C files
|
|
245
|
+
src/network_estimation/_cython_kernels.c
|
|
246
|
+
|
|
247
|
+
# Agent-generated plans
|
|
248
|
+
internal docs/
|
|
249
|
+
|
|
250
|
+
.aicrowd/
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
[general]
|
|
2
|
+
contrib=contrib-title-conventional-commits
|
|
3
|
+
# Body content rules don't fit our short, focused commit style.
|
|
4
|
+
ignore=body-is-missing,body-min-length,body-max-line-length
|
|
5
|
+
ignore-merge-commits=true
|
|
6
|
+
|
|
7
|
+
[contrib-title-conventional-commits]
|
|
8
|
+
types=feat,fix,docs,style,refactor,perf,test,build,ci,chore,revert
|
|
9
|
+
|
|
10
|
+
[title-max-length]
|
|
11
|
+
line-length=90
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
## v0.4.0 (2026-05-26)
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- `seed_protocol 3.0` (`whestbench_explicit_per_mlp_seeds`): each MLP's seed is an independent input rather than a derivation from a single root. Each `mlp_seed` value in the parquet column is the canonical input seed. Within-MLP three-stream derivation (weight/sample/estimator) is preserved via `SeedSequence(mlp_seed).spawn(3)`.
|
|
10
|
+
- `whest dataset bake --mlp-seeds FILE` (JSON array of N ints) for explicit per-MLP seeds. Omitting both `--mlp-seeds` and `--seed` auto-generates via `secrets.randbits(63)`.
|
|
11
|
+
- `create_dataset(mlp_seeds=[...])` / `create_dataset_torch(mlp_seeds=[...])`.
|
|
12
|
+
- `MLP.from_row(row, *, seed_protocol_version=...)`: protocol-aware estimator-seed derivation.
|
|
13
|
+
- Frozen fixture `tests/fixtures/single_split_v3_protocol/` for schema-drift regression.
|
|
14
|
+
- Multi-split dataset support: dataset directories can now contain multiple Parquet files in `data/`, one per split, described by an optional `splits:` sub-dict in `metadata.json`. Backward-compatible — single-split datasets are unchanged.
|
|
15
|
+
- `whest dataset combine-splits INPUT_DIR... --output OUTPUT_DIR` CLI subcommand for assembling multi-split datasets from N complete single-split inputs.
|
|
16
|
+
- `whestbench.combine_split_datasets()` Python helper (re-exported from `whestbench`).
|
|
17
|
+
- `whest dataset bake --split <name>` now accepts arbitrary split names matching `[a-z][a-z0-9]*(-[a-z0-9]+)*` (previously restricted to `public` / `holdout`).
|
|
18
|
+
- `whest dataset pull --split <name>` and `whest run --dataset ... --split <name>` for selecting one split from multi-split datasets.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- `create_dataset(seed=...)` / `create_dataset_torch(seed=...)` and `whest dataset bake --seed N` now reject with a migration hint pointing at `--mlp-seeds`.
|
|
23
|
+
- Parquet `mlp_seed` column semantics: under 3.0, the column stores the **input** seed (was: derived estimator seed under 2.0). `MLP.seed` (participant-facing) is unchanged across protocols — derived locally from the input under 3.0.
|
|
24
|
+
- `whest dataset inspect` now recognises multi-split datasets and prints a per-split summary, plus the `seed_protocol: <name> (version <version>)` line for all datasets.
|
|
25
|
+
- `whestbench.load_dataset()` returns `Dataset | DatasetDict` based on the dataset shape; explicit `split=` always returns `Dataset`.
|
|
26
|
+
- `whestbench.metadata()` accepts a `DatasetDict` and an optional `split=` filter that projects to single-split-shaped metadata.
|
|
27
|
+
- The dataset-card template gains a multi-split branch with leaderboard-specific wording when splits are `{public, holdout}`; the single-split `public` branch's wording is updated to point at the new evaluation repo.
|
|
28
|
+
|
|
29
|
+
### Compatibility
|
|
30
|
+
|
|
31
|
+
- `whestbench.load_dataset` reads both `seed_protocol 2.0` and `3.0` datasets indefinitely. Existing published datasets (e.g. `aicrowd/arc-whestbench-2026-smoke-test`) continue to work unchanged.
|
|
32
|
+
- New bakes only write 3.0.
|
|
33
|
+
- `schema_version` stays at `"3.0"`. The protocol discriminator is `seed_protocol.{name,version}`.
|
|
34
|
+
- The `splits:` field is purely additive.
|
|
35
|
+
- Old whestbench reading new multi-split datasets fails loudly with a missing-`n_mlps` error — upgrade whestbench to read multi-split.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 0.3.0 — 2026-05-25
|
|
40
|
+
|
|
41
|
+
### BREAKING
|
|
42
|
+
|
|
43
|
+
- **Dataset format migrated from `.npz` to HF Parquet+sidecar (schema 2.4 → 3.0).**
|
|
44
|
+
Datasets are now directories with `data/<split>-NNNNN.parquet`, `metadata.json`,
|
|
45
|
+
and `README.md`. The `whest create-dataset` command is replaced by
|
|
46
|
+
`whest dataset bake`. The `DatasetBundle` dataclass is removed; internal
|
|
47
|
+
consumers operate on `datasets.Dataset` directly.
|
|
48
|
+
- **Public estimator interface unchanged.** Estimators still receive `MLP`
|
|
49
|
+
instances via `predict(mlp: MLP)`.
|
|
50
|
+
|
|
51
|
+
### NEW
|
|
52
|
+
|
|
53
|
+
- `whestbench.load_dataset(path_or_repo, revision=..., split=..., token=...)` loads from local directories OR HF Hub.
|
|
54
|
+
- `whestbench.iter_mlps(ds)`, `whestbench.mlp_at(ds, i)`, `whestbench.metadata(ds)`.
|
|
55
|
+
- `whestbench.publish_dataset(local_dir, repo_id=..., tag=..., ...)` for HF Hub uploads.
|
|
56
|
+
- `whestbench.merge_datasets(input_dirs, output_dir=...)` — concatenate partial bakes.
|
|
57
|
+
- `whest dataset {bake, push, pull, merge, inspect}` CLI subcommands.
|
|
58
|
+
- Parallel bake via `--slice K/N` or `--mlp-range START-END` flags; merge with `whest dataset merge`.
|
|
59
|
+
- `whest run --dataset` now accepts HF Hub repos: `hf://owner/repo@v1` (inline revision) or `owner/repo --revision v1`.
|
|
60
|
+
|
|
61
|
+
### MIGRATION
|
|
62
|
+
|
|
63
|
+
- Legacy `.npz` datasets cannot be loaded by 0.3.0. Re-bake with `whest dataset bake` at the same `--seed` to reproduce.
|
|
64
|
+
- See `docs/reference/dataset-format.md` for the schema 3.0 specification.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: whestbench
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Requires-Python: >=3.10
|
|
5
|
+
Requires-Dist: datasets>=2.20
|
|
6
|
+
Requires-Dist: faker~=37.0
|
|
7
|
+
Requires-Dist: flopscope>=0.4.1
|
|
8
|
+
Requires-Dist: huggingface-hub>=0.24
|
|
9
|
+
Requires-Dist: jinja2>=3.1
|
|
10
|
+
Requires-Dist: plotext
|
|
11
|
+
Requires-Dist: pyarrow>=14
|
|
12
|
+
Requires-Dist: pyyaml>=6.0
|
|
13
|
+
Requires-Dist: rich
|
|
14
|
+
Requires-Dist: threadpoolctl>=3.0
|
|
15
|
+
Requires-Dist: tqdm
|
|
16
|
+
Provides-Extra: gpu
|
|
17
|
+
Requires-Dist: torch>=2.1; extra == 'gpu'
|