FA-93166 / EV charging session scheduling / Open access
Demand-response curtailment of a charge plan: overlapping events · case 01
When two events overlap the milder one can win.
ROOT CAUSE
The last listed active event replaces the level instead of the strongest one.
VERIFIED REPAIR
Apply the minimum percentage over active events.
Unsuccessful approach: Compounding the percentages curtails more deeply than any single event.
Case contract
profile is planned watts per slot. events are [start, end, pct, opt_out]; during [start, end) a non-opted-out event limits power to pct percent of plan (integer floor of p*pct/100), and overlapping events apply the lowest pct. Curtailed power never drops below min(plan, floor_w). Return [new profile, total curtailed watts over slots].
Why this case matters
Depot, workplace and public EV chargers schedule sessions against prices, circuit limits and departure deadlines; a wrong decision silently strands a driver or overloads a feeder.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(profile, events, floor_w):
out = []
for t, p in enumerate(profile):
pct = 100
for s, e, q, opt in events:
if opt:
continue
if s <= t < e:
pct = q
new = p * pct // 100
new = max(new, min(p, floor_w))
out.append(new)
return [out, sum(profile) - sum(out)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[7400, 1111, 3680, 7400, 3680, 0, 2345, 7400, 2345],
[[0, 5, 25, False], [0, 3, 50, False], [9, 10, 60, False]], 0],
[[1850, 277, 920, 1850, 920, 0, 2345, 7400, 2345], 17454]],
['regression: overlapping events (partial repair)',
[[1000, 0, 2345, 11000, 2345, 7400, 2345, 3680], [[1, 4, 50, False], [2, 5, 25, False]], 1380],
[[1000, 0, 1380, 2750, 1380, 7400, 2345, 3680], 10180]],
['control 1',
[[1000, 3333, 1111, 1380, 11000], [[1, 2, 75, True], [5, 8, 75, False], [4, 5, 25, False]], 0],
[[1000, 3333, 1111, 1380, 2750], 8250]],
['control 2',
[[1380, 1000, 1111, 1000, 1000, 3333, 3333, 7400, 1111, 3680, 11000, 1111],
[[8, 12, 60, False], [5, 7, 0, False]], 2000],
[[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[1111, 2345, 3333, 2345], [[2, 2, 75, False], [3, 5, 25, False], [3, 4, 75, False]], 1380],
[[1111, 2345, 3333, 1380], 965]],
['regression: overlapping events (partial repair)',
[[1111, 1380, 3333, 7400, 3333], [[2, 5, 60, False], [4, 8, 75, False]], 1380],
[[1111, 1380, 1999, 4440, 1999], 5628]],
['control 1',
[[3680, 1000, 3680, 1000, 3333, 2345, 1380, 1380, 1000, 3680, 7400],
[[6, 11, 25, True], [5, 10, 75, False]], 0],
[[3680, 1000, 3680, 1000, 3333, 1758, 1035, 1035, 750, 2760, 7400], 2447]],
['control 2',
[[7400, 3680, 7400, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380],
[[0, 3, 75, True], [0, 3, 50, False]], 0],
[[3700, 1840, 3700, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380], 9240]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[11000, 1111, 1111, 3680, 3333, 1111, 7400],
[[2, 4, 25, False], [6, 10, 0, False], [5, 8, 75, False]], 1380],
[[11000, 1111, 1111, 1380, 3333, 1111, 1380], 8320]],
['regression: overlapping events (partial repair)',
[[0, 0, 3680, 1000], [[4, 8, 25, False], [2, 6, 60, False], [3, 8, 50, False]], 0],
[[0, 0, 2208, 500], 1972]],
['control 1',
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], [[4, 8, 50, True], [5, 10, 75, True]], 0],
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], 0]],
['control 2',
[[3333, 7400, 1000, 2345, 11000, 2345], [[3, 7, 50, False], [5, 6, 25, True]], 2000],
[[3333, 7400, 1000, 2000, 5500, 2000], 6190]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[11000, 1111, 1111, 3680, 3333, 1111, 7400],
[[2, 4, 25, False], [6, 10, 0, False], [5, 8, 75, False]], 1380],
[[11000, 1111, 1111, 1380, 3333, 1111, 1380], 8320]],
['regression: overlapping events (partial repair)',
[[1000, 0, 11000, 11000, 3680, 7400, 1000], [[3, 8, 25, False], [3, 7, 75, False]], 0],
[[1000, 0, 11000, 2750, 920, 1850, 250], 17310]],
['control 1',
[[3680, 3680, 1000, 0, 3333, 1000, 3333, 3680],
[[1, 5, 0, False], [7, 11, 25, False], [6, 6, 60, False]], 2000],
[[3680, 2000, 1000, 0, 2000, 1000, 3333, 2000], 4693]],
['control 2',
[[1380, 7400, 7400, 1000, 1111, 2345, 1380], [[4, 8, 0, False], [6, 10, 0, False]], 0],
[[1380, 7400, 7400, 1000, 0, 0, 0], 4836]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[11000, 1111, 2345, 7400, 2345], [[1, 3, 25, False], [4, 4, 50, False], [1, 6, 60, False]],
1380],
[[11000, 1111, 1380, 4440, 1407], 4863]],
['regression: overlapping events (partial repair)',
[[0, 2345, 2345, 1000, 11000, 0, 11000, 0, 11000, 1111, 1380, 0],
[[5, 10, 60, False], [11, 15, 0, True], [5, 9, 25, False]], 2000],
[[0, 2345, 2345, 1000, 11000, 0, 2750, 0, 2750, 1111, 1380, 0], 16500]],
['control 1', [[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], [[5, 10, 0, True]], 1380],
[[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], 0]],
['control 2', [[2345, 7400, 1111, 3333, 3333, 7400, 3680], [[5, 8, 25, False]], 0],
[[2345, 7400, 1111, 3333, 3333, 1850, 920], 8310]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| boundary: event ends at slot | [[1840, 3680, 3680], 1840] | [[1840, 3680, 3680], 1840] | Passed |
| boundary: opted-out event | [[7400, 7400], 0] | [[7400, 7400], 0] | Passed |
| boundary: plan below floor | [[1000, 1380], 6020] | [[1000, 1380], 6020] | Passed |
| regression: overlapping events | [[3700, 555, 1840, 1850, 920, 0, 2345, 7400, 2345], 14406] | [[1850, 277, 920, 1850, 920, 0, 2345, 7400, 2345], 17454] | Failed |
| regression: overlapping events (partial repair) | [[1000, 0, 1380, 2750, 1380, 7400, 2345, 3680], 10180] | [[1000, 0, 1380, 2750, 1380, 7400, 2345, 3680], 10180] | Passed |
| control 1 | [[1000, 3333, 1111, 1380, 2750], 8250] | [[1000, 3333, 1111, 1380, 2750], 8250] | Passed |
| control 2 | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | Passed |
SHA-256 / e59a5a566c26efecf8f66e9ae1755afed473a75aaeb3430a7145a4972f775548
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(profile, events, floor_w):
out = []
for t, p in enumerate(profile):
pct = 100
for s, e, q, opt in events:
if opt:
continue
if s <= t < e:
pct = pct * q // 100
new = p * pct // 100
new = max(new, min(p, floor_w))
out.append(new)
return [out, sum(profile) - sum(out)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[7400, 1111, 3680, 7400, 3680, 0, 2345, 7400, 2345],
[[0, 5, 25, False], [0, 3, 50, False], [9, 10, 60, False]], 0],
[[1850, 277, 920, 1850, 920, 0, 2345, 7400, 2345], 17454]],
['regression: overlapping events (partial repair)',
[[1000, 0, 2345, 11000, 2345, 7400, 2345, 3680], [[1, 4, 50, False], [2, 5, 25, False]], 1380],
[[1000, 0, 1380, 2750, 1380, 7400, 2345, 3680], 10180]],
['control 1',
[[1000, 3333, 1111, 1380, 11000], [[1, 2, 75, True], [5, 8, 75, False], [4, 5, 25, False]], 0],
[[1000, 3333, 1111, 1380, 2750], 8250]],
['control 2',
[[1380, 1000, 1111, 1000, 1000, 3333, 3333, 7400, 1111, 3680, 11000, 1111],
[[8, 12, 60, False], [5, 7, 0, False]], 2000],
[[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[1111, 2345, 3333, 2345], [[2, 2, 75, False], [3, 5, 25, False], [3, 4, 75, False]], 1380],
[[1111, 2345, 3333, 1380], 965]],
['regression: overlapping events (partial repair)',
[[1111, 1380, 3333, 7400, 3333], [[2, 5, 60, False], [4, 8, 75, False]], 1380],
[[1111, 1380, 1999, 4440, 1999], 5628]],
['control 1',
[[3680, 1000, 3680, 1000, 3333, 2345, 1380, 1380, 1000, 3680, 7400],
[[6, 11, 25, True], [5, 10, 75, False]], 0],
[[3680, 1000, 3680, 1000, 3333, 1758, 1035, 1035, 750, 2760, 7400], 2447]],
['control 2',
[[7400, 3680, 7400, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380],
[[0, 3, 75, True], [0, 3, 50, False]], 0],
[[3700, 1840, 3700, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380], 9240]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[11000, 1111, 1111, 3680, 3333, 1111, 7400],
[[2, 4, 25, False], [6, 10, 0, False], [5, 8, 75, False]], 1380],
[[11000, 1111, 1111, 1380, 3333, 1111, 1380], 8320]],
['regression: overlapping events (partial repair)',
[[0, 0, 3680, 1000], [[4, 8, 25, False], [2, 6, 60, False], [3, 8, 50, False]], 0],
[[0, 0, 2208, 500], 1972]],
['control 1',
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], [[4, 8, 50, True], [5, 10, 75, True]], 0],
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], 0]],
['control 2',
[[3333, 7400, 1000, 2345, 11000, 2345], [[3, 7, 50, False], [5, 6, 25, True]], 2000],
[[3333, 7400, 1000, 2000, 5500, 2000], 6190]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[11000, 1111, 1111, 3680, 3333, 1111, 7400],
[[2, 4, 25, False], [6, 10, 0, False], [5, 8, 75, False]], 1380],
[[11000, 1111, 1111, 1380, 3333, 1111, 1380], 8320]],
['regression: overlapping events (partial repair)',
[[1000, 0, 11000, 11000, 3680, 7400, 1000], [[3, 8, 25, False], [3, 7, 75, False]], 0],
[[1000, 0, 11000, 2750, 920, 1850, 250], 17310]],
['control 1',
[[3680, 3680, 1000, 0, 3333, 1000, 3333, 3680],
[[1, 5, 0, False], [7, 11, 25, False], [6, 6, 60, False]], 2000],
[[3680, 2000, 1000, 0, 2000, 1000, 3333, 2000], 4693]],
['control 2',
[[1380, 7400, 7400, 1000, 1111, 2345, 1380], [[4, 8, 0, False], [6, 10, 0, False]], 0],
[[1380, 7400, 7400, 1000, 0, 0, 0], 4836]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[11000, 1111, 2345, 7400, 2345], [[1, 3, 25, False], [4, 4, 50, False], [1, 6, 60, False]],
1380],
[[11000, 1111, 1380, 4440, 1407], 4863]],
['regression: overlapping events (partial repair)',
[[0, 2345, 2345, 1000, 11000, 0, 11000, 0, 11000, 1111, 1380, 0],
[[5, 10, 60, False], [11, 15, 0, True], [5, 9, 25, False]], 2000],
[[0, 2345, 2345, 1000, 11000, 0, 2750, 0, 2750, 1111, 1380, 0], 16500]],
['control 1', [[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], [[5, 10, 0, True]], 1380],
[[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], 0]],
['control 2', [[2345, 7400, 1111, 3333, 3333, 7400, 3680], [[5, 8, 25, False]], 0],
[[2345, 7400, 1111, 3333, 3333, 1850, 920], 8310]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| boundary: event ends at slot | [[1840, 3680, 3680], 1840] | [[1840, 3680, 3680], 1840] | Passed |
| boundary: opted-out event | [[7400, 7400], 0] | [[7400, 7400], 0] | Passed |
| boundary: plan below floor | [[1000, 1380], 6020] | [[1000, 1380], 6020] | Passed |
| regression: overlapping events | [[888, 133, 441, 1850, 920, 0, 2345, 7400, 2345], 19039] | [[1850, 277, 920, 1850, 920, 0, 2345, 7400, 2345], 17454] | Failed |
| regression: overlapping events (partial repair) | [[1000, 0, 1380, 1380, 1380, 7400, 2345, 3680], 11550] | [[1000, 0, 1380, 2750, 1380, 7400, 2345, 3680], 10180] | Failed |
| control 1 | [[1000, 3333, 1111, 1380, 2750], 8250] | [[1000, 3333, 1111, 1380, 2750], 8250] | Passed |
| control 2 | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | Passed |
SHA-256 / 884a1f417f77eab11f5e88f4215d22fdd63dfcd86f8cb210f6ff2641f56193ba
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(profile, events, floor_w):
out = []
for t, p in enumerate(profile):
pct = 100
for s, e, q, opt in events:
if opt:
continue
if s <= t < e and q < pct:
pct = q
new = p * pct // 100
new = max(new, min(p, floor_w))
out.append(new)
return [out, sum(profile) - sum(out)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[7400, 1111, 3680, 7400, 3680, 0, 2345, 7400, 2345],
[[0, 5, 25, False], [0, 3, 50, False], [9, 10, 60, False]], 0],
[[1850, 277, 920, 1850, 920, 0, 2345, 7400, 2345], 17454]],
['regression: overlapping events (partial repair)',
[[1000, 0, 2345, 11000, 2345, 7400, 2345, 3680], [[1, 4, 50, False], [2, 5, 25, False]], 1380],
[[1000, 0, 1380, 2750, 1380, 7400, 2345, 3680], 10180]],
['control 1',
[[1000, 3333, 1111, 1380, 11000], [[1, 2, 75, True], [5, 8, 75, False], [4, 5, 25, False]], 0],
[[1000, 3333, 1111, 1380, 2750], 8250]],
['control 2',
[[1380, 1000, 1111, 1000, 1000, 3333, 3333, 7400, 1111, 3680, 11000, 1111],
[[8, 12, 60, False], [5, 7, 0, False]], 2000],
[[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[1111, 2345, 3333, 2345], [[2, 2, 75, False], [3, 5, 25, False], [3, 4, 75, False]], 1380],
[[1111, 2345, 3333, 1380], 965]],
['regression: overlapping events (partial repair)',
[[1111, 1380, 3333, 7400, 3333], [[2, 5, 60, False], [4, 8, 75, False]], 1380],
[[1111, 1380, 1999, 4440, 1999], 5628]],
['control 1',
[[3680, 1000, 3680, 1000, 3333, 2345, 1380, 1380, 1000, 3680, 7400],
[[6, 11, 25, True], [5, 10, 75, False]], 0],
[[3680, 1000, 3680, 1000, 3333, 1758, 1035, 1035, 750, 2760, 7400], 2447]],
['control 2',
[[7400, 3680, 7400, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380],
[[0, 3, 75, True], [0, 3, 50, False]], 0],
[[3700, 1840, 3700, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380], 9240]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[11000, 1111, 1111, 3680, 3333, 1111, 7400],
[[2, 4, 25, False], [6, 10, 0, False], [5, 8, 75, False]], 1380],
[[11000, 1111, 1111, 1380, 3333, 1111, 1380], 8320]],
['regression: overlapping events (partial repair)',
[[0, 0, 3680, 1000], [[4, 8, 25, False], [2, 6, 60, False], [3, 8, 50, False]], 0],
[[0, 0, 2208, 500], 1972]],
['control 1',
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], [[4, 8, 50, True], [5, 10, 75, True]], 0],
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], 0]],
['control 2',
[[3333, 7400, 1000, 2345, 11000, 2345], [[3, 7, 50, False], [5, 6, 25, True]], 2000],
[[3333, 7400, 1000, 2000, 5500, 2000], 6190]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[11000, 1111, 1111, 3680, 3333, 1111, 7400],
[[2, 4, 25, False], [6, 10, 0, False], [5, 8, 75, False]], 1380],
[[11000, 1111, 1111, 1380, 3333, 1111, 1380], 8320]],
['regression: overlapping events (partial repair)',
[[1000, 0, 11000, 11000, 3680, 7400, 1000], [[3, 8, 25, False], [3, 7, 75, False]], 0],
[[1000, 0, 11000, 2750, 920, 1850, 250], 17310]],
['control 1',
[[3680, 3680, 1000, 0, 3333, 1000, 3333, 3680],
[[1, 5, 0, False], [7, 11, 25, False], [6, 6, 60, False]], 2000],
[[3680, 2000, 1000, 0, 2000, 1000, 3333, 2000], 4693]],
['control 2',
[[1380, 7400, 7400, 1000, 1111, 2345, 1380], [[4, 8, 0, False], [6, 10, 0, False]], 0],
[[1380, 7400, 7400, 1000, 0, 0, 0], 4836]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: overlapping events',
[[11000, 1111, 2345, 7400, 2345], [[1, 3, 25, False], [4, 4, 50, False], [1, 6, 60, False]],
1380],
[[11000, 1111, 1380, 4440, 1407], 4863]],
['regression: overlapping events (partial repair)',
[[0, 2345, 2345, 1000, 11000, 0, 11000, 0, 11000, 1111, 1380, 0],
[[5, 10, 60, False], [11, 15, 0, True], [5, 9, 25, False]], 2000],
[[0, 2345, 2345, 1000, 11000, 0, 2750, 0, 2750, 1111, 1380, 0], 16500]],
['control 1', [[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], [[5, 10, 0, True]], 1380],
[[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], 0]],
['control 2', [[2345, 7400, 1111, 3333, 3333, 7400, 3680], [[5, 8, 25, False]], 0],
[[2345, 7400, 1111, 3333, 3333, 1850, 920], 8310]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| boundary: event ends at slot | [[1840, 3680, 3680], 1840] | [[1840, 3680, 3680], 1840] | Passed |
| boundary: opted-out event | [[7400, 7400], 0] | [[7400, 7400], 0] | Passed |
| boundary: plan below floor | [[1000, 1380], 6020] | [[1000, 1380], 6020] | Passed |
| regression: overlapping events | [[1850, 277, 920, 1850, 920, 0, 2345, 7400, 2345], 17454] | [[1850, 277, 920, 1850, 920, 0, 2345, 7400, 2345], 17454] | Passed |
| regression: overlapping events (partial repair) | [[1000, 0, 1380, 2750, 1380, 7400, 2345, 3680], 10180] | [[1000, 0, 1380, 2750, 1380, 7400, 2345, 3680], 10180] | Passed |
| control 1 | [[1000, 3333, 1111, 1380, 2750], 8250] | [[1000, 3333, 1111, 1380, 2750], 8250] | Passed |
| control 2 | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | Passed |
SHA-256 / 81bf8136a901c558da4d9ef9ec2aca424ada59b794d7ba002bd5cab95cb829b5
Verification & scope
Deterministic stipulated toy contract for teaching; no claim of conformance with any standard, vendor protocol or production controller. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:51:52.604048+00:00.
Case digest / 472ebfc7c736bdc35c31229b718e1d022f03354f333148e6234de0e873c11753