Tasks/Earth & Energy/Renewables & Storage

Design a fast-charging protocol that spares the battery

Design a fast-charge current table that spares the cell

fast_charge_protocol Earth & Energy Renewables & Storage
instruction.mdthis is what the agent is given

Your job is to design the charging current profile for a lithium-ion cell that must be rushed from empty to 90% state-of-charge in at most half an hour, over and over, without wrecking the cell. The physics engine is PyBaMM's Doyle-Fuller-Newman model with the full degradation stack switched on — SEI growth (also on crack surfaces), particle swelling and cracking, stress-driven loss of active material, lumped thermal dynamics, plus an overvoltage capacity-loss term dQ/dt = 0.3·max(V − 4.2, 0)³. Aggressive current charges fast but grows SEI, cracks particles and burns capacity above 4.2 V; timid current fails to reach the SOC target inside the window. Your protocol must thread that needle across cells that differ in ambient temperature, ageing state and cycle count.

A protocol is a 41-entry table of charging currents (amps), indexed by SOC bins [0.10, 0.12), [0.12, 0.14), …, [0.88, 0.90); below SOC 0.10 the first entry applies. The verifier rebuilds a smooth (sigmoid-blended) current profile from your table and simulates the full cycling experiment — discharge to 3.0 V, CV hold, YOUR charge step, rest — for the instance's number of cycles, on its own trusted copy of the model.

Hard Constraints

  • Solution format: /app/methods/main/solver.py exposing solve(instance: dict, time_budget_s: float) -> list[41 floats], currents in amps; values are clipped to [0.05, 6.0] A.
  • The charge step gets at most 1800 s per cycle and terminates only when SOC reaches the target. The target must genuinely be met: a successful charge stops exactly at it, so if any cycle ends below soc_target − 0.002 the whole instance scores the failure loss 3.0. There is no top-up rescue and no voltage-cap termination — overvoltage is penalized through physics (the Q_loss ODE), not clipped for you.
  • Per instance your solver gets a 600 s wall-clock budget in the verifier. Overrunning it is recorded and the child is killed shortly after; if you printed a complete table before that, the last one you printed is what gets scored, and if you printed nothing usable the instance scores the failure loss 3.0.
  • Do not modify /app/fastcharge.py or the verifier; your solver may read every file under /app and simulate freely.
  • The verifier re-simulates your table from scratch; only the 41 numbers you return matter — any SOH your own simulation claims is ignored.
  • table_protocol builds a SYMBOLIC pybamm expression: the callable is evaluated once with symbolic variables, so Python if soc < x: branching silently misbehaves. Use the provided sigmoid-table builder.

What You Have

  • /app/fastcharge.py — the exact evaluator the verifier uses (table_protocol, evaluate_protocol, model options, parameters).
  • /app/instances_visible.json — three development instances: base (10 cycles, 308.5 K), hot (318.15 K), aged_sei (SEI kinetics ×8). Held-out instances vary the same knobs (temperature, ageing severity, cycle count) within physically sensible ranges — no new mechanisms, but you cannot memorize the pool.
  • /app/methods/main/solver.py — a working weak baseline (3-step CC staircase 5.6/4.8/4.0 A) to replace.
  • /app/probe_window.py — a ~20 s single-cycle diagnostic that reports, for a candidate table, how much of the 1800 s window it uses, whether it reaches the target, its peak voltage, seconds above 4.2 V and the resulting overvoltage capacity loss. Far cheaper than a scored run.
  • /app/selfcheck.py — ~1-minute smoke test of the toolchain.
  • One full 10-cycle simulation of one instance takes ≈60 s on 4 CPUs (IDAKLU). Budget your experiments.

What You Submit

The modified /app/methods/main/solver.py (plus any helper files it imports from /app/methods/). It must return the 41-float current table within the per-instance budget, for any instance dict shaped like the visible ones.

How It Is Judged

Per hidden instance, the verifier simulates your protocol and scores loss = −ln((SOH_end − 0.6)/0.4); lower is better, 0.0 would be a pristine cell. Simulation failure, a malformed table, a short-charge, or a budget overrun with no usable table printed all score 3.0. The task score is the MEAN loss over the hidden instances, mapped to a reward band that rises as the loss falls. The band is bounded above: no submission can score 1.0 or higher, however good its protocol is.

Metric

mean degradation loss over the hidden cells · lower is better

loss = -ln((SOH_end - 0.6)/0.4) per instance; a failed sim, short charge or bad table books 3.0

anchorheld-outreward
Bshipped 3-step CC staircase0.0691010.00
Rfour-stage taper (reference)0.0436830.30
Swindow-hugging taper (SOTA)0.0406900.60
normalisation
m >= B0
B > m >= R0.3 * (B - m) / (B - R)
R > m >= S0.3 + 0.3 * (R - m) / (R - S)
m < S1 - 0.4 / (1 + (S - m) / (R - S))

m = this run's held-out metric  ·  B = shipped 3-step CC staircase  ·  R = four-stage taper (reference)  ·  S = window-hugging taper (SOTA)

Linear in the loss, which is already a log. Mapped once from the MEAN, not per case. No upper anchor: past SOTA a soft cap nears 1.0.

Rollouts

114 minwall clock
$24.39spend
33.2Mtokens
34versions, 6 kept
2.417 2.417 2.417 2.417 2.417 $0 $5 $10 $15 $20 cumulative spend on the run base cycle-2 discharge capacity (Ah), higher is better v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 v34
keptrevertedno scoreturning point
  1. v1Inherited 3-step CC staircase, 5.6/4.8/4.0 Aone-cycle probe only7 min · $0.73
  2. v2Front-load 6.0 A below SOC 0.70, 2.5 A aboveGet the current under the 4.2 V overvoltage term instead of chasing SOC: hard while the cell is empty, gentle once it fills.2.417514 min · $1.29
  3. v35.2 A below SOC 0.80 then 2.35 A, same charge time2.417520 min · $1.76
  4. v4State-aware tail: 2.8 A to SOC 0.86, 1.75 A after2.417522 min · $1.93
  5. v5Stronger tail split, 3.0 A to SOC 0.88 then 1.0 A2.417524 min · $2.10
  6. v6Milder equal-time taper, 2.8 A to SOC 0.84 then 2.0 A2.417526 min · $2.27
  7. v7Scale v4 currents by 0.98, buying a 1766.9 s charge2.417528 min · $2.51
  8. v8Midpoint 1% slowdown of v4, 5.94/2.772/1.7325 A2.417529 min · $2.69
  9. v9Smooth 3.034 to 1.618 A taper over SOC 0.70-0.90Replace the stepped tail with a continuous taper at equal ideal time, so no SOC bin sits on a current jump.2.417541 min · $4.35
  10. v10Gentler taper shape, 2.924 to 1.764 Aone-cycle LLI only42 min · $4.64
  11. v11Stronger power-law taper, 3.107 to 1.553 Aone-cycle LLI only44 min · $4.94
  12. v12Scale the v9 tail by 1.20, finishing before the window closesone-cycle LLI only47 min · $5.43
  13. v13Scale the v9 tail by 1.40, charge 1533.1 sone-cycle LLI only48 min · $5.62
  14. v14Scale the v9 tail by 1.50, peak 4.196 Vone-cycle LLI only49 min · $5.80
  15. v15Tail scale 1.55; first measured crossing above 4.2 Vone-cycle LLI only50 min · $6.12
  16. v16Tail scale 1.57, 17.2 s above 4.2 VSEI/q_loss only53 min · $6.68
  17. v17Tail scale adapted per instance to temperature, cycles and SEI factorIts 10-cycle base loss was worse than v2's, so one-cycle SEI stopped being the selection metric and the fast tail was dropped.10-cycle run only60 min · $7.72
  18. v18Slow only the v9 smooth tail, scale 0.952.417563 min · $8.33
  19. v19Tail scale 0.93, charge 1785.6 s; the submitted table2.417564 min · $8.56
  20. v20Gentler tail curvature, 2.924 to 1.764 shape at scale 0.932.417577 min · $10.80
  21. v21Stronger tail curvature, 3.107 to 1.553 shape at scale 0.932.417578 min · $11.15
  22. v22Power tail, endpoint ratio 0.70 and exponent 2.52.417579 min · $11.50
  23. v23Flatten the endpoint ratio to 0.802.417580 min · $11.85
  24. v24Endpoint ratio 0.70 with power exponent 2.02.417581 min · $12.19
  25. v25Endpoint ratio 0.70 with power exponent 3.02.417582 min · $12.55
  26. v26Endpoint ratio 0.68 at exponent 2.52.417583 min · $12.90
  27. v27Endpoint ratio 0.72 at exponent 2.52.417584 min · $13.17
  28. v28Extend the 6 A stage to SOC 0.72, resample the tail at equal time2.417594 min · $16.04
  29. v29Move the 6 A transition down to SOC 0.682.417595 min · $16.35
  30. v30Alternate high and low tail bins as pulse relaxation2.417598 min · $17.29
  31. v31Cut the last 2%-SOC current 10%, raise the tail before it2.417599 min · $18.48
  32. v32Raise the last 2%-SOC current 10%, lower the tail before it2.4175101 min · $18.91
  33. v330.8 A post-target bin, micro-tapering just below SOC 0.90+0.233 uAh vs v19103 min · $19.45
  34. v34Keep the v33 sentinel, rescale the tail 0.93 to 0.93465 for timing2.4175104 min · $19.77

34 versions, 114 minutes, $24.39. Selection ran on 1-2 cycle proxies at initial SOC 0.995: the evaluator's own 0.999 start would not initialise here.

On the hidden set

held-out metricreward
shipped 3-step CC staircase0.0691010.00
four-stage taper (reference)0.0436830.30
window-hugging taper (SOTA)0.0406900.60
this run3.0 (failure loss)0