-
Notifications
You must be signed in to change notification settings - Fork 0
The Engine
The engine is deterministic bookkeeping. Each simulated hour you commit three numbers, the engine resolves them by fixed rules, and the same commitments always produce the same day.
Anything not stated here is not in the model.
Curtailment resolves first, then battery discharge, then the generator, and the grid supplies whatever load remains. Nothing exports: discharge and generation are capped at the load still unserved, and every cap is reported the moment it is applied.
Round-trip efficiency is charged entirely against filling. Fill at 50 MW for an hour on a ninety percent battery and the grid bills you for 50 MWh while 45 MWh reach the tank. Draining returns exactly what the tank holds: drain 45 MWh and 45 MWh serve your load.
Two consequences follow.
Filling near the top is limited by headroom. A battery that can hold 24 more MWh will accept only about 27 MWh of grid draw at eighty-eight percent efficiency, and the engine trims your number and tells you so.
A fill that feels like it should top the tank often will not. From half full, a 400 MWh battery at eighty-eight percent takes 176 MWh from two hours of 100 MW charging and sits at 376. The last 24 MWh cost a third hour at about 27 MW.
Where the loss is booked is a convention. The engine books the whole round trip against filling rather than splitting the square root of efficiency across both legs. Either is defensible as long as the product is right and the choice is stated. Booking it on one leg keeps the optimizer's constraints linear, which is what allows an exact solver to certify optima. Changing the convention would change every certified optimum and break replay for every stored episode.
The hour's bill is grid energy at the hour's price, plus generator fuel at its stated cost, plus SLA refunds for every megawatt-hour of customer load you shed, minus any conservation credit you earned.
On scenarios where the grid answers back, the price you pay also moves with your own deviation from nominal draw.
The generator permit counts hours of use, not energy. Running 1 MW for an hour consumes a full permit hour, the same as running the whole unit.
Real run-hour permits work this way. Spend permit hours where prices peak.
There are no dice anywhere in the runtime. Replaying a stored episode log through the published scoring function reproduces the stored score exactly, and anyone can run that replay from the log download on any settled episode.
Forecasts that mislead you are data compiled with a documented error model, not randomness.
Modeled: hourly energy accounting on real public price and load series, conservation appeals and curtailment orders with credits and measured delivery, battery and generator limits, and a certified maximum score where one can be proven.
Not modeled: power flow, voltage, frequency, ramp rates, battery degradation, temperature, and the rest of the grid's machinery.
The posture is believable, not certified. Every pack names its source data and the derivations applied, and the settlement says plainly where its numbers stop seeing.
Anything added to the engine extends that list or falsifies it.
Starred scenarios carry an optimum solved offline by exact optimization, then replayed through this same engine to the penny before publication. Your gap to that line is measured against the true best play, not against other players.
Where no optimum can be certified, the scenario says so and awards no stars.
This file is generated. One copy of the engine governs every scored episode everywhere, and a second copy that drifted would let a pack pass its gate on your machine and score differently at the venue, silently.
If the engine is wrong, send a scenario that demonstrates it, or an issue. See Hydration.
Exedra
Why
How it is built
What you write
Boundaries
For reviewers