CarlAlbertCode commited on
Commit
683afec
·
1 Parent(s): 3888717

Submission 011: workload variant, scheduled_fraction 0.046

Browse files
.gitignore CHANGED
@@ -33,3 +33,4 @@ submission_artifacts/*
33
  catboost_info/
34
  submission.csv
35
  !submission_artifacts/weekly_planner.joblib
 
 
33
  catboost_info/
34
  submission.csv
35
  !submission_artifacts/weekly_planner.joblib
36
+ !submission_artifacts/workload_planner.joblib
README.md CHANGED
@@ -1,66 +1,69 @@
1
- # BatterySwapAI 2026 — temperature-gated identity candidate
 
 
 
 
 
 
 
 
2
 
3
- Local candidate only. It has not been submitted to the evaluator. The publicly proven V05 artifact
4
- remains preserved in the Hugging Face repository and its history (`1541.3141`, Hub revision
5
- `dfa8acbc`, artifact SHA-256 `63d71091d7f46e8fb11798b7c2be936cc7e0022954824a4eb98c07dc1bf9b0b3`).
6
 
7
- ## Current result
 
 
8
 
9
- The primary candidate combines the V06 full-lookback planner with two independently fitted identity-preserving
10
- rank signals (censored long-term first-passage AFT and K=8 cross-building trajectory similarity),
11
- then applies a seasonal temperature forecast only to batteries whose forecast minimum smoothed
12
- voltage is at most **2.50 V**. The 2.50 V gate is fixed in production and preserves the planner's
13
- risk multiset within each freshness stratum.
14
 
15
- Leakage-clean outer replay on all 48 official train scenarios:
 
16
 
17
- | candidate | mean total | delta vs clean operational reference | first / second half | paired t |
18
- |---|---:|---:|---:|---:|
19
- | **temperature <=2.50 V (primary)** | **1534.8431** | **-78.4134** | **-110.9689 / -45.8578** | **-2.3034** |
20
- | identity-only fallback | 1569.8205 | -43.4359 | -75.3522 / -11.5196 | -1.1667 |
21
- | clean V05 predictions + V06/V07 policy reference | 1613.2564 | — | — | — |
 
 
 
22
 
23
- The primary improved 23 scenarios, tied 12, and worsened 13. It passes the predeclared gate:
24
- delta <= -40, neither chronological half worse, and paired t <= -2. The unrestricted temperature
25
- rerank and the tighter 2.40 V gate were both weaker; no post-result grid search is used.
26
 
27
- These local absolute totals are not directly comparable with the public leaderboard. The evidence
28
- supports the candidate by paired delta against the same clean reference, not by claiming a public
29
- score. The public V05 result remains the only submitted anchor.
 
 
 
 
 
30
 
31
  ## Causal and official contract
32
 
33
  - Every scenario uses only readings with `end_time <= scenario.start_time`.
34
- - EOL is reconstructed exactly as the organizer evaluator does: strict `10 < temperature < 30`,
35
- daily median, days with fewer than five readings masked, seven-calendar-day rolling median with
36
- `min_periods=3`, and first smoothed voltage `<= 2.40 V`.
37
- - The reconstruction matches all 82 observed train EOL devices exactly; censored devices remain
38
- censored.
39
- - Each outer validation fold rebuilds trajectory, EOL, and model state from outer-train batteries
40
- only. Assertions require zero held-out battery, building, trajectory, and EOL overlap.
41
- - Production feature replay matches all 19,890 frozen causal rows; see
42
- `artifacts/identity_feature_parity.json` after running the release checks.
43
- - Runtime uses `batteryswap_public==0.3.4`, CPU only, no network, and emits every live battery once
44
- with a valid plan date.
45
 
46
- ## Artifacts
47
 
48
- - `submission_artifacts/temperature_planner.joblib`: primary candidate and the default in
49
- `script.py`.
50
- - `submission_artifacts/identity_planner.joblib`: identity-only fallback.
51
- - `submission_artifacts/planner.joblib`: byte-preserved V06 full-lookback base, SHA-256
52
- `3cfca2e7dd2c05ddd84f2eca42a484168a1ab4ad3cd454806ef4e687fe8f1569`.
53
- - During the Hub upload, the public V05 artifact is archived byte-for-byte as
54
- `submission_artifacts/v05_planner.joblib` before the local V06 base is placed at
55
- `submission_artifacts/planner.joblib`.
56
 
57
- Each candidate manifest records its artifact hash, raw dataset hashes, source hashes, fitted AFT
58
- parameters, donor-library hashes, temperature coefficient/gate, dependency versions, and the
59
- unchanged embedded V06 base hash. Exact release commands and evidence are in `REPRODUCIBILITY.md`.
60
 
61
- ## External eligibility checks
62
 
63
- Participant code is MIT. The organizer-required `batteryswap_public` package does not declare a
64
- license in its PyPI metadata, and the official evaluator base includes an NVIDIA container license
65
- notice. These are recorded in `THIRD_PARTY_LICENSES.md`; organizer confirmation is the only
66
- remaining user-owned licensing check.
 
1
+ ---
2
+ license: mit
3
+ library_name: joblib
4
+ tags:
5
+ - batteryswapai-2026
6
+ - predictive-maintenance
7
+ - survival-analysis
8
+ - scheduling
9
+ ---
10
 
11
+ # BatterySwapAI 2026 MnesisLab
 
 
12
 
13
+ Causal battery-swap planning. Current submission **011**: hierarchical Wiener
14
+ first-passage reranking plus operational capacity policy, over the byte-preserved
15
+ public V05 base.
16
 
17
+ ## Deployed artifact
 
 
 
 
18
 
19
+ `submission_artifacts/workload_planner.joblib` SHA-256
20
+ `336713ecfec29f070e2209b71906d1016755363d9fd570a80e40040e7ec2db13`
21
 
22
+ | setting | value |
23
+ |---|---|
24
+ | FPT rank residual weight | 0.15 |
25
+ | capacity lookback | 42 days |
26
+ | emergency operational scale | 0.5 |
27
+ | scheduled fraction | 0.046 |
28
+ | capacity weekly limit fraction | 0.95 (public V05 default) |
29
+ | embedded public V05 base | `63d71091d7f46e8fb11798b7c2be936cc7e0022954824a4eb98c07dc1bf9b0b3` |
30
 
31
+ ## Submission history
 
 
32
 
33
+ | # | public score | note |
34
+ |---|---:|---|
35
+ | V05 | 1541.31 | causal anchor, revision `dfa8acbc` |
36
+ | 007 | 1563.95 | identity + temperature rerank |
37
+ | **008** | **1517.22** | FPT residual + emergency repricing |
38
+ | 009 | 1528.06 | FPT residual 0.25, emergency buffer 3 |
39
+ | 010 | pending | weekly margin 0.95 -> 0.98 on the 008 stack |
40
+ | 011 | pending | workload variant, scheduled_fraction 0.046 |
41
 
42
  ## Causal and official contract
43
 
44
  - Every scenario uses only readings with `end_time <= scenario.start_time`.
45
+ - EOL is reconstructed exactly as the evaluator defines it: strict `10 < T < 30`,
46
+ daily median, days with fewer than five readings masked, seven-calendar-day
47
+ rolling median with `min_periods=3`, first smoothed voltage `<= 2.40 V`.
48
+ The reconstruction matches all 82 observed train EOL devices; censored devices
49
+ remain censored.
50
+ - Runtime uses `batteryswap_public==0.3.4`, CPU only, no network, and emits every
51
+ live battery exactly once with a valid plan date.
 
 
 
 
52
 
53
+ ## Evidence discipline
54
 
55
+ Local totals are not comparable with the public leaderboard, and neither 010 nor 011
56
+ carries a validated local gain: measured against the shipped 008 configuration, 010 is
57
+ -5.25 (paired t = -1.49, worse in the first chronological half) and 011 is a wash locally,
58
+ motivated only by the public/local difference in early-swap pricing. 008 (1517.22) remains
59
+ the anchor. Every artifact passes 57/57 tests with byte-identical replays and 19,890 rows
60
+ well inside the 30-minute budget.
 
 
61
 
62
+ Local totals are not directly comparable with the public leaderboard; candidates
63
+ are supported by paired deltas against the same clean reference, never by claiming
64
+ a public score in advance.
65
 
66
+ ## License
67
 
68
+ Participant code is MIT (`LICENSE`). Third-party notices are recorded in
69
+ `THIRD_PARTY_LICENSES.md`; reproduction steps are in `REPRODUCIBILITY.md`.
 
 
script.py CHANGED
@@ -45,7 +45,7 @@ def main() -> None:
45
  artifact_path = Path(
46
  os.environ.get(
47
  "BATTERYSWAP_PLANNER_PATH",
48
- "submission_artifacts/weekly_planner.joblib",
49
  )
50
  )
51
  splits = [
 
45
  artifact_path = Path(
46
  os.environ.get(
47
  "BATTERYSWAP_PLANNER_PATH",
48
+ "submission_artifacts/workload_planner.joblib",
49
  )
50
  )
51
  splits = [
submission_artifacts/workload_planner.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:336713ecfec29f070e2209b71906d1016755363d9fd570a80e40040e7ec2db13
3
+ size 16272000
submission_artifacts/workload_planner.json ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "artifact": "submission_artifacts/workload_planner.joblib",
3
+ "artifact_sha256": "336713ecfec29f070e2209b71906d1016755363d9fd570a80e40040e7ec2db13",
4
+ "schema_version": 1,
5
+ "base_artifact": "public/v05:submission_artifacts/planner.joblib",
6
+ "base_artifact_sha256": "63d71091d7f46e8fb11798b7c2be936cc7e0022954824a4eb98c07dc1bf9b0b3",
7
+ "configuration": {
8
+ "eol_voltage": 2.4,
9
+ "horizon_days": 42.0,
10
+ "terminal_nonoverlap_weeks": 12,
11
+ "minimum_weekly_increments": 4,
12
+ "maximum_state_staleness_days": 7.0,
13
+ "rank_residual_weight": 0.15,
14
+ "capacity_lookback_days": 42,
15
+ "emergency_operational_scale": 0.5,
16
+ "scheduled_fraction": 0.046,
17
+ "outer_pool": "leave current target building out",
18
+ "smoothing": "strict 10<T<30; daily median count>=5; rolling seven-calendar-day median min_periods=3; terminal calendar day strictly before cutoff"
19
+ },
20
+ "promotion_evidence": {
21
+ "official_48": "artifacts/hierarchical_fpt_official.json",
22
+ "robust_48x27": "artifacts/hierarchical_fpt_grid.cases.json"
23
+ },
24
+ "source_sha256": {
25
+ "src/batteryswapai/hierarchical_fpt.py": "51874f5fde70a2c868e5300cce3648d778279cfdb1d64ee3af5f6a30683eca0b",
26
+ "src/batteryswapai/identity_ensemble.py": "fa1f9aeaa89fba1bc5fc437c478c876544f2973960db18ef2c83f0042cc9df4a",
27
+ "src/batteryswapai/competition_planner.py": "a56bfe549a3d6fcfe59217f7bd8a647533a4484fdbb26fe3ef8f1d6c84035a98",
28
+ "scripts/experiment_hierarchical_fpt.py": "1ce854654813752930194413bcd5dff44984d105493a36c42e10945e23fa6b60",
29
+ "scripts/evaluate_hierarchical_fpt_grid.py": "90f764da5df050e37af15fc47524c629cce2b021de34b0eab39095383639a51e",
30
+ "scripts/build_hierarchical_fpt_submission.py": "d931e7b2fd2b220ae7fca8b27e267afd74f9ad31e4609ea9ecdce5f2ae6e07da",
31
+ "script.py": "3b95b55eed638fbe90f17efc0fea62866ebc6266f6222738263b0d55ab07cecb",
32
+ "Dockerfile": "84a3f71b2ba664f91ceb8a2980dd5397a002eed02af9fdd264325caf89158573",
33
+ "requirements.txt": "53d9c582b98b392c0517dc87c78949cd13b99b3f09ebfce601d0c8eadd4f2db3"
34
+ },
35
+ "runtime_versions": {
36
+ "batteryswap_public": "0.3.4",
37
+ "joblib": "1.5.3",
38
+ "numpy": "2.2.6",
39
+ "pandas": "2.3.3",
40
+ "scipy": "1.14.1",
41
+ "scikit-learn": "1.7.2"
42
+ }
43
+ }