FAILURE MAP
← Case archive

FA-68496 / Toll and parking fee computation / Open access

Closed-system distance toll: the class percentage is truncated to a whole factor · case 01

Closed-system distance toll returns a wrong result when the class percentage is truncated to a whole factor.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The class multiplier is applied after rounding to 5 cents, so class tolls are not multiples of 5 cents.

VERIFIED REPAIR

Restore the class multiplier stage rule so that the step reads `raw = dist * x['rate_milli'] * mult // 100 toll = (raw + 2500) // 5000 * 5`.

Unsuccessful approach: Integer-dividing the percentage first turns 150 percent into 1x.

Case contract

Input {plazas: [[name, km]], entry (null = lost ticket), exit, class_pct, vclass, rate_milli (milli-cents per km), min_toll, uturn_fee}. Entry equal to exit pays uturn_fee. A lost ticket is charged from the plaza farthest from the exit. raw = km distance * rate * class percent / 100 (milli-cents, floored); the toll is raw rounded half-up to the nearest 5 cents, at least min_toll.

Why this case matters

Fee engines bill customers in integer cents; a wrong boundary, rounding stage or cap scope silently over- or under-charges.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    km = dict(x['plazas'])
    ex = km[x['exit']]
    if x['entry'] is None:
        dist = max(abs(ex - k) for k in km.values())
    elif x['entry'] == x['exit']:
        return x['uturn_fee']
    else:
        dist = abs(ex - km[x['entry']])
    mult = dict(x['class_pct'])[x['vclass']]
    raw = dist * x['rate_milli']
    toll = (raw + 2500) // 5000 * 5 * mult // 100
    return max(toll, x['min_toll'])
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'plazas': [['P0', 50], ['P1', 52], ['P2', 111], ['P3', 134], ['P4', 163]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 1065), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 47], ['P1', 80], ['P2', 145], ['P3', 160], ['P4', 171], ['P5', 191]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 310), ({'plazas': [['P0', 1], ['P1', 12], ['P2', 60], ['P3', 92], ['P4', 101], ['P5', 173]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 18], ['P1', 44], ['P2', 181], ['P3', 185]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 4400), ({'plazas': [['P0', 114], ['P1', 136], ['P2', 151]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 150), ({'plazas': [['P0', 32], ['P1', 67], ['P2', 76], ['P3', 86], ['P4', 95], ['P5', 114]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 285)], [({'plazas': [['P0', 14], ['P1', 101], ['P2', 158]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 385), ({'plazas': [['P0', 1], ['P1', 46], ['P2', 104], ['P3', 106], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 76], ['P1', 103], ['P2', 138], ['P3', 193]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 63], ['P1', 87], ['P2', 92], ['P3', 94], ['P4', 158]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 420), ({'plazas': [['P0', 52], ['P1', 68], ['P2', 137], ['P3', 151]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 46], ['P1', 68], ['P2', 103], ['P3', 127], ['P4', 157], ['P5', 165]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 1255)], [({'plazas': [['P0', 18], ['P1', 51], ['P2', 77], ['P3', 104], ['P4', 151]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 715), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 39], ['P1', 78], ['P2', 81], ['P3', 194]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 9], ['P1', 81], ['P2', 137]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 970), ({'plazas': [['P0', 111], ['P1', 114], ['P2', 169]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 10], ['P1', 63], ['P2', 121]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 3], ['P1', 22], ['P2', 95], ['P3', 131], ['P4', 183]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 2485)], [({'plazas': [['P0', 21], ['P1', 23], ['P2', 36], ['P3', 168], ['P4', 188]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 205), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 5], ['P1', 28], ['P2', 70], ['P3', 127], ['P4', 130]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 255), ({'plazas': [['P0', 24], ['P1', 121], ['P2', 158], ['P3', 198]], 'entry': None, 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 2025), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 29], ['P1', 45], ['P2', 49], ['P3', 122]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1885), ({'plazas': [['P0', 96], ['P1', 105], ['P2', 136], ['P3', 138]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 720), ({'plazas': [['P0', 34], ['P1', 128], ['P2', 173]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 610)], [({'plazas': [['P0', 4], ['P1', 68], ['P2', 71], ['P3', 123], ['P4', 190]], 'entry': 'P2', 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 1660), ({'plazas': [['P0', 19], ['P1', 35], ['P2', 47], ['P3', 137], ['P4', 186]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 1405), ({'plazas': [['P0', 3], ['P1', 26], ['P2', 48]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 0], ['P1', 35], ['P2', 45], ['P3', 64], ['P4', 99], ['P5', 125]], 'entry': 'P4', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 455), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 1], ['P1', 37], ['P2', 87], ['P3', 89]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 100), ({'plazas': [['P0', 10], ['P1', 45], ['P2', 161], ['P3', 194]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885)]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('fee oracle' + ' %d' % i, 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 fixtureActualExpectedOutcome
fee oracle 010681065Failed
fee oracle 1340340Passed
fee oracle 2885885Passed
fee oracle 3307310Failed
fee oracle 4200200Passed
fee oracle 543954400Failed
fee oracle 6150150Passed
fee oracle 7285285Passed

SHA-256 / 3065ef95a07bbb258030b4d28d2788ae757e88ab6fd00d5a5741c21326d89132

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    km = dict(x['plazas'])
    ex = km[x['exit']]
    if x['entry'] is None:
        dist = max(abs(ex - k) for k in km.values())
    elif x['entry'] == x['exit']:
        return x['uturn_fee']
    else:
        dist = abs(ex - km[x['entry']])
    mult = dict(x['class_pct'])[x['vclass']]
    raw = dist * x['rate_milli'] * (mult // 100)
    toll = (raw + 2500) // 5000 * 5
    return max(toll, x['min_toll'])
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'plazas': [['P0', 50], ['P1', 52], ['P2', 111], ['P3', 134], ['P4', 163]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 1065), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 47], ['P1', 80], ['P2', 145], ['P3', 160], ['P4', 171], ['P5', 191]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 310), ({'plazas': [['P0', 1], ['P1', 12], ['P2', 60], ['P3', 92], ['P4', 101], ['P5', 173]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 18], ['P1', 44], ['P2', 181], ['P3', 185]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 4400), ({'plazas': [['P0', 114], ['P1', 136], ['P2', 151]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 150), ({'plazas': [['P0', 32], ['P1', 67], ['P2', 76], ['P3', 86], ['P4', 95], ['P5', 114]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 285)], [({'plazas': [['P0', 14], ['P1', 101], ['P2', 158]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 385), ({'plazas': [['P0', 1], ['P1', 46], ['P2', 104], ['P3', 106], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 76], ['P1', 103], ['P2', 138], ['P3', 193]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 63], ['P1', 87], ['P2', 92], ['P3', 94], ['P4', 158]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 420), ({'plazas': [['P0', 52], ['P1', 68], ['P2', 137], ['P3', 151]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 46], ['P1', 68], ['P2', 103], ['P3', 127], ['P4', 157], ['P5', 165]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 1255)], [({'plazas': [['P0', 18], ['P1', 51], ['P2', 77], ['P3', 104], ['P4', 151]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 715), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 39], ['P1', 78], ['P2', 81], ['P3', 194]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 9], ['P1', 81], ['P2', 137]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 970), ({'plazas': [['P0', 111], ['P1', 114], ['P2', 169]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 10], ['P1', 63], ['P2', 121]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 3], ['P1', 22], ['P2', 95], ['P3', 131], ['P4', 183]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 2485)], [({'plazas': [['P0', 21], ['P1', 23], ['P2', 36], ['P3', 168], ['P4', 188]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 205), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 5], ['P1', 28], ['P2', 70], ['P3', 127], ['P4', 130]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 255), ({'plazas': [['P0', 24], ['P1', 121], ['P2', 158], ['P3', 198]], 'entry': None, 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 2025), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 29], ['P1', 45], ['P2', 49], ['P3', 122]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1885), ({'plazas': [['P0', 96], ['P1', 105], ['P2', 136], ['P3', 138]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 720), ({'plazas': [['P0', 34], ['P1', 128], ['P2', 173]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 610)], [({'plazas': [['P0', 4], ['P1', 68], ['P2', 71], ['P3', 123], ['P4', 190]], 'entry': 'P2', 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 1660), ({'plazas': [['P0', 19], ['P1', 35], ['P2', 47], ['P3', 137], ['P4', 186]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 1405), ({'plazas': [['P0', 3], ['P1', 26], ['P2', 48]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 0], ['P1', 35], ['P2', 45], ['P3', 64], ['P4', 99], ['P5', 125]], 'entry': 'P4', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 455), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 1], ['P1', 37], ['P2', 87], ['P3', 89]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 100), ({'plazas': [['P0', 10], ['P1', 45], ['P2', 161], ['P3', 194]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885)]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('fee oracle' + ' %d' % i, 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 fixtureActualExpectedOutcome
fee oracle 09451065Failed
fee oracle 1340340Passed
fee oracle 2590885Failed
fee oracle 3205310Failed
fee oracle 4200200Passed
fee oracle 544004400Passed
fee oracle 6150150Passed
fee oracle 7285285Passed

SHA-256 / 9028676c19561ad0c4d4dd6a8eb82096c4ecdf62e74d970982f64e5e3fb7c364

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    km = dict(x['plazas'])
    ex = km[x['exit']]
    if x['entry'] is None:
        dist = max(abs(ex - k) for k in km.values())
    elif x['entry'] == x['exit']:
        return x['uturn_fee']
    else:
        dist = abs(ex - km[x['entry']])
    mult = dict(x['class_pct'])[x['vclass']]
    raw = dist * x['rate_milli'] * mult // 100
    toll = (raw + 2500) // 5000 * 5
    return max(toll, x['min_toll'])
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'plazas': [['P0', 50], ['P1', 52], ['P2', 111], ['P3', 134], ['P4', 163]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 1065), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 47], ['P1', 80], ['P2', 145], ['P3', 160], ['P4', 171], ['P5', 191]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 310), ({'plazas': [['P0', 1], ['P1', 12], ['P2', 60], ['P3', 92], ['P4', 101], ['P5', 173]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 18], ['P1', 44], ['P2', 181], ['P3', 185]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 4400), ({'plazas': [['P0', 114], ['P1', 136], ['P2', 151]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 150), ({'plazas': [['P0', 32], ['P1', 67], ['P2', 76], ['P3', 86], ['P4', 95], ['P5', 114]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 285)], [({'plazas': [['P0', 14], ['P1', 101], ['P2', 158]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 385), ({'plazas': [['P0', 1], ['P1', 46], ['P2', 104], ['P3', 106], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 76], ['P1', 103], ['P2', 138], ['P3', 193]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 63], ['P1', 87], ['P2', 92], ['P3', 94], ['P4', 158]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 420), ({'plazas': [['P0', 52], ['P1', 68], ['P2', 137], ['P3', 151]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 46], ['P1', 68], ['P2', 103], ['P3', 127], ['P4', 157], ['P5', 165]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 1255)], [({'plazas': [['P0', 18], ['P1', 51], ['P2', 77], ['P3', 104], ['P4', 151]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 715), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 39], ['P1', 78], ['P2', 81], ['P3', 194]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 9], ['P1', 81], ['P2', 137]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 970), ({'plazas': [['P0', 111], ['P1', 114], ['P2', 169]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 10], ['P1', 63], ['P2', 121]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 3], ['P1', 22], ['P2', 95], ['P3', 131], ['P4', 183]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 2485)], [({'plazas': [['P0', 21], ['P1', 23], ['P2', 36], ['P3', 168], ['P4', 188]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 205), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 5], ['P1', 28], ['P2', 70], ['P3', 127], ['P4', 130]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 255), ({'plazas': [['P0', 24], ['P1', 121], ['P2', 158], ['P3', 198]], 'entry': None, 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 2025), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 29], ['P1', 45], ['P2', 49], ['P3', 122]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1885), ({'plazas': [['P0', 96], ['P1', 105], ['P2', 136], ['P3', 138]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 720), ({'plazas': [['P0', 34], ['P1', 128], ['P2', 173]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 610)], [({'plazas': [['P0', 4], ['P1', 68], ['P2', 71], ['P3', 123], ['P4', 190]], 'entry': 'P2', 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 1660), ({'plazas': [['P0', 19], ['P1', 35], ['P2', 47], ['P3', 137], ['P4', 186]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 1405), ({'plazas': [['P0', 3], ['P1', 26], ['P2', 48]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 0], ['P1', 35], ['P2', 45], ['P3', 64], ['P4', 99], ['P5', 125]], 'entry': 'P4', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 455), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 1], ['P1', 37], ['P2', 87], ['P3', 89]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 100), ({'plazas': [['P0', 10], ['P1', 45], ['P2', 161], ['P3', 194]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885)]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('fee oracle' + ' %d' % i, 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 fixtureActualExpectedOutcome
fee oracle 010651065Passed
fee oracle 1340340Passed
fee oracle 2885885Passed
fee oracle 3310310Passed
fee oracle 4200200Passed
fee oracle 544004400Passed
fee oracle 6150150Passed
fee oracle 7285285Passed

SHA-256 / 91d8d84c3e78fffe73041ffa788bdbfab86c323418cc0e01ecac19fc961b5bf1

Verification & scope

A deterministic, bounded toy model with a stipulated contract; it makes no claim of conformance to any agency manual or standard. 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:48:02.787691+00:00.

Case digest / a8a9a9dd82b01230b4c3ab51f6d78e60ddcc61bca337f1fc5edd5742ed0157cf