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.
Files changed (155) hide show
  1. whestbench-0.4.0/.githooks/pre-commit +30 -0
  2. whestbench-0.4.0/.githooks/pre-push +27 -0
  3. whestbench-0.4.0/.github/workflows/ci.yml +94 -0
  4. whestbench-0.4.0/.github/workflows/pypi-publish.yml +100 -0
  5. whestbench-0.4.0/.gitignore +250 -0
  6. whestbench-0.4.0/.gitlint +11 -0
  7. whestbench-0.4.0/CHANGELOG.md +64 -0
  8. whestbench-0.4.0/PKG-INFO +17 -0
  9. whestbench-0.4.0/README.md +136 -0
  10. whestbench-0.4.0/assets/logo/logo.png +0 -0
  11. whestbench-0.4.0/docs/how-to/parallel-bake.md +317 -0
  12. whestbench-0.4.0/docs/how-to/publish-to-hf-hub.md +219 -0
  13. whestbench-0.4.0/docs/index.md +32 -0
  14. whestbench-0.4.0/docs/reference/cli-reference.md +444 -0
  15. whestbench-0.4.0/docs/reference/code-patterns.md +144 -0
  16. whestbench-0.4.0/docs/reference/dataset-format.md +552 -0
  17. whestbench-0.4.0/docs/reference/estimator-contract.md +147 -0
  18. whestbench-0.4.0/docs/reference/flopscope-primer.md +160 -0
  19. whestbench-0.4.0/docs/reference/gpu-dataset-generation.md +284 -0
  20. whestbench-0.4.0/docs/reference/score-report-fields.md +196 -0
  21. whestbench-0.4.0/docs/release-process.md +132 -0
  22. whestbench-0.4.0/docs/superpowers/plans/2026-05-20-budget-exhaustion-warning.md +957 -0
  23. whestbench-0.4.0/docs/superpowers/specs/2026-05-20-budget-exhaustion-warning-design.md +325 -0
  24. whestbench-0.4.0/main.py +9 -0
  25. whestbench-0.4.0/profiling/Dockerfile +102 -0
  26. whestbench-0.4.0/profiling/README.md +310 -0
  27. whestbench-0.4.0/profiling/__init__.py +0 -0
  28. whestbench-0.4.0/profiling/build_and_push.sh +58 -0
  29. whestbench-0.4.0/profiling/collect_results.py +226 -0
  30. whestbench-0.4.0/profiling/dashboard_components.js +630 -0
  31. whestbench-0.4.0/profiling/dashboard_styles.css +354 -0
  32. whestbench-0.4.0/profiling/entrypoint.sh +91 -0
  33. whestbench-0.4.0/profiling/generate_dashboard.py +173 -0
  34. whestbench-0.4.0/profiling/instance_matrix.py +40 -0
  35. whestbench-0.4.0/profiling/results/.gitkeep +0 -0
  36. whestbench-0.4.0/profiling/run_benchmarks.py +399 -0
  37. whestbench-0.4.0/profiling/run_helpers.py +91 -0
  38. whestbench-0.4.0/profiling/setup_infra.sh +185 -0
  39. whestbench-0.4.0/profiling/teardown_infra.sh +92 -0
  40. whestbench-0.4.0/profiling/tests/__init__.py +0 -0
  41. whestbench-0.4.0/profiling/tests/test_collect_results.py +82 -0
  42. whestbench-0.4.0/profiling/tests/test_generate_dashboard.py +236 -0
  43. whestbench-0.4.0/profiling/tests/test_instance_matrix.py +44 -0
  44. whestbench-0.4.0/profiling/tests/test_run_helpers.py +44 -0
  45. whestbench-0.4.0/pyproject.toml +71 -0
  46. whestbench-0.4.0/pytest.ini +7 -0
  47. whestbench-0.4.0/scripts/run-test-harness.sh +31 -0
  48. whestbench-0.4.0/scripts/setup-git-hooks.sh +20 -0
  49. whestbench-0.4.0/src/whestbench/__init__.py +49 -0
  50. whestbench-0.4.0/src/whestbench/_provenance.py +85 -0
  51. whestbench-0.4.0/src/whestbench/_simulation_torch.py +96 -0
  52. whestbench-0.4.0/src/whestbench/cli.py +2184 -0
  53. whestbench-0.4.0/src/whestbench/concurrency.py +69 -0
  54. whestbench-0.4.0/src/whestbench/dataset.py +495 -0
  55. whestbench-0.4.0/src/whestbench/dataset_io.py +696 -0
  56. whestbench-0.4.0/src/whestbench/dataset_torch.py +506 -0
  57. whestbench-0.4.0/src/whestbench/doctor.py +339 -0
  58. whestbench-0.4.0/src/whestbench/domain.py +118 -0
  59. whestbench-0.4.0/src/whestbench/estimators.py +144 -0
  60. whestbench-0.4.0/src/whestbench/generation.py +48 -0
  61. whestbench-0.4.0/src/whestbench/hardware.py +153 -0
  62. whestbench-0.4.0/src/whestbench/hub.py +109 -0
  63. whestbench-0.4.0/src/whestbench/loader.py +127 -0
  64. whestbench-0.4.0/src/whestbench/naming.py +79 -0
  65. whestbench-0.4.0/src/whestbench/packaging.py +121 -0
  66. whestbench-0.4.0/src/whestbench/presentation/__init__.py +25 -0
  67. whestbench-0.4.0/src/whestbench/presentation/adapters.py +728 -0
  68. whestbench-0.4.0/src/whestbench/presentation/blocks.py +350 -0
  69. whestbench-0.4.0/src/whestbench/presentation/breakdowns.py +206 -0
  70. whestbench-0.4.0/src/whestbench/presentation/human.py +89 -0
  71. whestbench-0.4.0/src/whestbench/presentation/models.py +195 -0
  72. whestbench-0.4.0/src/whestbench/presentation/output.py +34 -0
  73. whestbench-0.4.0/src/whestbench/presentation/presenters.py +66 -0
  74. whestbench-0.4.0/src/whestbench/profiler.py +979 -0
  75. whestbench-0.4.0/src/whestbench/protocol.py +56 -0
  76. whestbench-0.4.0/src/whestbench/reporting.py +1562 -0
  77. whestbench-0.4.0/src/whestbench/runner.py +468 -0
  78. whestbench-0.4.0/src/whestbench/scoring.py +926 -0
  79. whestbench-0.4.0/src/whestbench/sdk.py +51 -0
  80. whestbench-0.4.0/src/whestbench/simulation.py +139 -0
  81. whestbench-0.4.0/src/whestbench/subprocess_worker.py +218 -0
  82. whestbench-0.4.0/src/whestbench/templates/dataset_card.md.j2 +315 -0
  83. whestbench-0.4.0/src/whestbench/templates/estimator.py.tmpl +11 -0
  84. whestbench-0.4.0/tests/_legacy_npz.py +130 -0
  85. whestbench-0.4.0/tests/conftest.py +6 -0
  86. whestbench-0.4.0/tests/fixtures/__init__.py +0 -0
  87. whestbench-0.4.0/tests/fixtures/multi_split_v3.0/README.md +191 -0
  88. whestbench-0.4.0/tests/fixtures/multi_split_v3.0/data/holdout-00000-of-00001.parquet +0 -0
  89. whestbench-0.4.0/tests/fixtures/multi_split_v3.0/data/public-00000-of-00001.parquet +0 -0
  90. whestbench-0.4.0/tests/fixtures/multi_split_v3.0/metadata.json +33 -0
  91. whestbench-0.4.0/tests/fixtures/seeded_estimator.py +32 -0
  92. whestbench-0.4.0/tests/fixtures/single_split_v3_protocol/README.md +223 -0
  93. whestbench-0.4.0/tests/fixtures/single_split_v3_protocol/data/public-00000-of-00001.parquet +0 -0
  94. whestbench-0.4.0/tests/fixtures/single_split_v3_protocol/metadata.json +15 -0
  95. whestbench-0.4.0/tests/helpers.py +22 -0
  96. whestbench-0.4.0/tests/test_cli.py +1009 -0
  97. whestbench-0.4.0/tests/test_cli_dataset.py +582 -0
  98. whestbench-0.4.0/tests/test_cli_debugger.py +287 -0
  99. whestbench-0.4.0/tests/test_cli_fallback.py +402 -0
  100. whestbench-0.4.0/tests/test_cli_participant_commands.py +1483 -0
  101. whestbench-0.4.0/tests/test_cli_run_hf.py +91 -0
  102. whestbench-0.4.0/tests/test_dataset.py +656 -0
  103. whestbench-0.4.0/tests/test_dataset_io_combine.py +245 -0
  104. whestbench-0.4.0/tests/test_dataset_io_merge.py +160 -0
  105. whestbench-0.4.0/tests/test_dataset_io_read.py +87 -0
  106. whestbench-0.4.0/tests/test_dataset_io_readme.py +864 -0
  107. whestbench-0.4.0/tests/test_dataset_io_schema.py +590 -0
  108. whestbench-0.4.0/tests/test_dataset_io_write.py +97 -0
  109. whestbench-0.4.0/tests/test_dataset_loader.py +115 -0
  110. whestbench-0.4.0/tests/test_dataset_multi_split_fixture.py +72 -0
  111. whestbench-0.4.0/tests/test_dataset_round_trip_cpu.py +136 -0
  112. whestbench-0.4.0/tests/test_dataset_round_trip_torch.py +102 -0
  113. whestbench-0.4.0/tests/test_dataset_seed_protocol.py +122 -0
  114. whestbench-0.4.0/tests/test_dataset_torch.py +422 -0
  115. whestbench-0.4.0/tests/test_dataset_v3_fixture.py +60 -0
  116. whestbench-0.4.0/tests/test_docs_quality.py +160 -0
  117. whestbench-0.4.0/tests/test_doctor.py +446 -0
  118. whestbench-0.4.0/tests/test_domain.py +98 -0
  119. whestbench-0.4.0/tests/test_estimators.py +41 -0
  120. whestbench-0.4.0/tests/test_estimators_module.py +92 -0
  121. whestbench-0.4.0/tests/test_evaluate.py +109 -0
  122. whestbench-0.4.0/tests/test_exhaustive_harness.py +29 -0
  123. whestbench-0.4.0/tests/test_generation.py +49 -0
  124. whestbench-0.4.0/tests/test_hardware.py +114 -0
  125. whestbench-0.4.0/tests/test_hub.py +83 -0
  126. whestbench-0.4.0/tests/test_inprocess_runner.py +104 -0
  127. whestbench-0.4.0/tests/test_loader.py +147 -0
  128. whestbench-0.4.0/tests/test_metadata_provenance.py +200 -0
  129. whestbench-0.4.0/tests/test_mlp_seed_plumbing.py +74 -0
  130. whestbench-0.4.0/tests/test_naming.py +146 -0
  131. whestbench-0.4.0/tests/test_packaging.py +114 -0
  132. whestbench-0.4.0/tests/test_presentation_adapters.py +440 -0
  133. whestbench-0.4.0/tests/test_presentation_parity.py +424 -0
  134. whestbench-0.4.0/tests/test_presentation_renderers.py +927 -0
  135. whestbench-0.4.0/tests/test_profiler.py +447 -0
  136. whestbench-0.4.0/tests/test_protocol.py +28 -0
  137. whestbench-0.4.0/tests/test_reporting.py +932 -0
  138. whestbench-0.4.0/tests/test_reporting_budget_gauge.py +682 -0
  139. whestbench-0.4.0/tests/test_runner_types.py +66 -0
  140. whestbench-0.4.0/tests/test_scoring_aggregates.py +158 -0
  141. whestbench-0.4.0/tests/test_scoring_budget_adjusted.py +118 -0
  142. whestbench-0.4.0/tests/test_scoring_combined_budget.py +99 -0
  143. whestbench-0.4.0/tests/test_scoring_effective_compute.py +86 -0
  144. whestbench-0.4.0/tests/test_scoring_failure_semantics.py +126 -0
  145. whestbench-0.4.0/tests/test_scoring_module.py +1173 -0
  146. whestbench-0.4.0/tests/test_scoring_subprocess_residual.py +84 -0
  147. whestbench-0.4.0/tests/test_scoring_warnings.py +131 -0
  148. whestbench-0.4.0/tests/test_sdk.py +37 -0
  149. whestbench-0.4.0/tests/test_setup_context_seed.py +627 -0
  150. whestbench-0.4.0/tests/test_simulation.py +105 -0
  151. whestbench-0.4.0/tests/test_subprocess_runner.py +158 -0
  152. whestbench-0.4.0/tests/test_subprocess_worker.py +251 -0
  153. whestbench-0.4.0/tests/test_subprocess_worker_memory.py +133 -0
  154. whestbench-0.4.0/tests/test_torch_flop_synthesis.py +66 -0
  155. 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'