Week 8: Weather

Commit before the path is known

The question

How do we commit to a wet-weather switch when the forecast contains several possible rain paths but only one will occur?

Last week priced one lap against one possible interruption. This week we compare one irreversible rule across four supplied weather futures.

Output: a feasible commitment lap, its position-first score, its downside and the caveat on its synthetic inputs.

A forecast is not the weather

  • a forecast path is one possible sequence of future weather states
  • a forecast ensemble is several paths available before the realised weather is known
  • a weight is the supplied scenario probability assigned to one path

Exactly one path will occur in our fixture. The forecast does not tell us which one. It gives the call several possible futures to survive.

The real boundary

ECMWF describes ensemble forecasting as multiple forecast realisations that represent flow-dependent uncertainty. Those realisations can carry useful information beyond one best-guess forecast.

ECMWF did not supply this race fixture.

Every path, weight, finishing position, adjusted finish time and tyre effect in this week is synthetic. The weights are not observations, ensemble-member frequencies or calibrated probabilities.

The rule we commit

A wet-weather set is one physical set of tyres supplied for the conditions this fixture labels wet. A commitment rule names the lap after which the strategy switches to that set.

It is irreversible inside this bounded exercise. We freeze it so that the realised weather cannot edit what the forecast justified beforehand. This is not an FIA rule, and it does not claim that a real team cannot revise strategy.

The rule names both a lap and a physical set.

Downside is a report, not the objective

The selected rule’s downside is its worst finishing position across the supplied paths, together with every path that produces it.

We also say whether those paths bring rain earlier, later or not within the supplied horizon.

We do not choose the smallest downside. The objective remains weighted mean finishing position, with adjusted finish used only for a position tie.

Information moves in one direction

forecast table available
        ↓
validate weights, laps and physical set
        ↓
score every feasible rule across every path
        ↓
save one rule and its reason
        ↓
realised path unlocks
        ↓
evaluate the saved call — never rewrite it

The save boundary separates a forecast-conditioned call from hindsight.

Failure before arithmetic: weights

Weights must be finite, non-negative and sum to one.

E: 0.20   M: 0.35   L: 0.30   D: 0.20
sum = 1.05  →  reject
assert rejects(weights=[0.20, 0.35, 0.30, 0.20])
assert score_calls == {}

Renormalising would silently replace the supplied forecast. Fail the fixture.

Failure before arithmetic: the set

Legal candidate laps are supplied. Each candidate also requires wet-weather set W1 from the physical-set ledger.

ledger: W1 returned
lap 34 → requires W1 → infeasible
lap 36 → requires W1 → infeasible
lap 38 → requires W1 → infeasible
assert feasible_candidates(returned={"W1"}) == []
assert score_calls == {}

A returned set makes every dependent commitment unavailable, not merely slow.

Tie-break micro-fixture

All values are synthetic.

Ruleearly · 0.50late · 0.50Mean PMean time
nowP2 · 602.0 sP6 · 608.0 s4.00605.0 s
laterP5 · 604.0 sP3 · 605.0 s4.00604.5 s

First establish the position tie. Only then does adjusted finish decide.

Work the tie in order

now position   = 0.50(2) + 0.50(6) = 4.00
later position = 0.50(5) + 0.50(3) = 4.00

now time       = 0.50(602.0) + 0.50(608.0) = 605.0 s
later time     = 0.50(604.0) + 0.50(605.0) = 604.5 s

The position scores tie, so the adjusted-time tie-break selects later.

assert select(now, later).rule == "later"  # after position tie

One assertion protects the objective

faster_but_worse = summary(mean_position=4.10, mean_time=600.0)
slower_but_better = summary(mean_position=4.00, mean_time=610.0)

assert select(faster_but_worse, slower_but_better) \
       == slower_but_better

A ten-second advantage cannot rescue a worse position score. Adjusted time is not a second objective waiting to take over.

Lap 32: the supplied forecast

At the end of lap 32, W1 is available and not returned. Legal rules commit after lap 34, 36 or 38. Actionable rain is the fixture’s label for weather that calls for W1; it is not a real tyre crossover claim.

PathSynthetic futureWeight
Eactionable rain from lap 340.20
Mactionable rain from lap 360.35
Lactionable rain from lap 380.30
Dno actionable rain before lap 410.15

0.20 + 0.35 + 0.30 + 0.15 = 1.00 — valid.

Your precommitment pause

The supplied model gives every candidate’s finishing position on every path. Complete the last column before advancing.

CommitEMLDWeighted mean P
lap 34P2P3P5P7?
lap 36P5P2P3P5?
lap 38P7P5P2P3?

Commit the winning rule in position-first terms. Then name the path or paths that produce that rule’s worst finish.

The realised path is still locked. These supplied outcomes describe the forecast possibilities; none says which path will occur.

Score every rule across every path

CommitEMLDWeighted mean P
lap 34P2P3P5P74.00
lap 36P5P2P3P53.35
lap 38P7P5P2P34.20
lap 34 = .20(2) + .35(3) + .30(5) + .15(7) = 4.00
lap 36 = .20(5) + .35(2) + .30(3) + .15(5) = 3.35
lap 38 = .20(7) + .35(5) + .30(2) + .15(3) = 4.20

The saved rule

Choose lap 36. It has the lowest weighted mean finishing position: 3.35. No position tie reaches adjusted finish.

Its downside is P5 on two paths:

  • E: actionable rain arrives earlier, so lap 36 switches late
  • D: actionable rain does not arrive within the supplied horizon, so the switch is unnecessarily early

Lap 34 and lap 38 each reach P7, but minimising the worst case was not our rule.

One reveal does not replace the forecast

Suppose path L unlocks. Lap 38 would finish P2 there; the saved lap-36 rule finishes P3.

That does not make lap 38 the better ex-ante call:

RuleForecast scoreRealised L
saved lap 363.35P3
lap 384.20P2

The reveal evaluates the call. It cannot move information backwards through the save boundary.

The complete decision report

commit_after_lap: 36
physical_set: W1
weighted_mean_position: 3.35
adjusted_time_tie_break: not used
worst_position: P5
worst_paths: E — rain earlier; D — no rain in horizon
weight_sum: 1.00
saved_before_reveal: true
reason: lowest weighted mean finishing position
caveat: synthetic scenario probabilities; not calibrated

The report carries the call, the evidence available when it was made and the downside it accepted.

What leaves this week

Your lab: validate the forecast and ledger, reproduce the finite weighted scores, preserve position first, save the rule before reveal and report its downside.

The boundary: no random draw, no weather generator, no tyre crossover claim and no calibration claim.

Week 9 will turn supplied uncertainty into repeated draws and full finishing- position distributions. It owns sampling. Stop here.