Commit ·
683afec
1
Parent(s): 3888717
Submission 011: workload variant, scheduled_fraction 0.046
Browse files- .gitignore +1 -0
- README.md +53 -50
- script.py +1 -1
- submission_artifacts/workload_planner.joblib +3 -0
- submission_artifacts/workload_planner.json +43 -0
.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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
-
|
| 4 |
-
remains preserved in the Hugging Face repository and its history (`1541.3141`, Hub revision
|
| 5 |
-
`dfa8acbc`, artifact SHA-256 `63d71091d7f46e8fb11798b7c2be936cc7e0022954824a4eb98c07dc1bf9b0b3`).
|
| 6 |
|
| 7 |
-
|
|
|
|
|
|
|
| 8 |
|
| 9 |
-
|
| 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 |
-
|
|
|
|
| 16 |
|
| 17 |
-
|
|
| 18 |
-
|---|---
|
| 19 |
-
|
|
| 20 |
-
|
|
| 21 |
-
|
|
|
|
|
|
|
|
|
|
|
| 22 |
|
| 23 |
-
|
| 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 |
-
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 35 |
-
daily median, days with fewer than five readings masked, seven-calendar-day
|
| 36 |
-
`min_periods=3`,
|
| 37 |
-
|
| 38 |
-
censored.
|
| 39 |
-
-
|
| 40 |
-
|
| 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 |
-
##
|
| 47 |
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
`submission_artifacts/v05_planner.joblib` before the local V06 base is placed at
|
| 55 |
-
`submission_artifacts/planner.joblib`.
|
| 56 |
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
|
| 61 |
-
##
|
| 62 |
|
| 63 |
-
Participant code is MIT
|
| 64 |
-
|
| 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/
|
| 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 |
+
}
|