FAILURE MAP
← Case archive

FA-87256 / Physics integrator stability / Open access

Sleep accumulates when either linear or angular speed is low · case 01

Spinning bodies with no linear motion fall asleep and freeze.

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

ROOT CAUSE

The rest test uses or.

VERIFIED REPAIR

Both linear and angular speeds must be below threshold.

Unsuccessful approach: Comparing signed omega lets fast negative spin count as resting.

Case contract

solve(v, omega, lin_damp, ang_damp, dt, max_speed, sleep_lin, sleep_ang, sleep_time, kicks): per frame, a sleeping body wakes (timer reset) only when that frame's kick is nonzero, else it is skipped. Add the kick [dvx,dvy,domega], damp with 1/(1+dt*c) (linear and angular coefficients), clamp speed magnitude, then accumulate sleep time while |v|<sleep_lin and |omega|<sleep_ang (else reset). When timer>=sleep_time the body sleeps and velocities are zeroed. Return [vx, vy, omega, timer, asleep, frame index slept or -1].

Why this case matters

Game and robotics physics loops depend on integrator update order, step control and stabilization terms; a wrong decision point turns a stable simulation into drifting or exploding motion.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(v, omega, lin_damp, ang_damp, dt, max_speed, sleep_lin, sleep_ang, sleep_time, kicks):
    vx, vy = v
    w = omega
    timer = 0.0
    asleep = False
    slept_at = -1
    for f, (ax, ay, aw) in enumerate(kicks):
        if asleep:
            if ax or ay or aw:
                asleep = False
                timer = 0.0
            else:
                continue
        vx += ax
        vy += ay
        w += aw
        dl = 1.0 / (1.0 + dt * lin_damp)
        vx *= dl
        vy *= dl
        w *= 1.0 / (1.0 + dt * ang_damp)
        sp = math.hypot(vx, vy)
        if sp > max_speed:
            s = max_speed / sp
            vx *= s
            vy *= s
        if math.hypot(vx, vy) < sleep_lin or abs(w) < sleep_ang:
            timer += dt
        else:
            timer = 0.0
        if timer >= sleep_time:
            asleep = True
            slept_at = f
            vx = vy = w = 0.0
    return [round(vx, 6), round(vy, 6), round(w, 6), round(timer, 6), asleep, slept_at]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[-1.03, -4.82], -0.81, 20.0, 5.0, 0.0625, 3.0, 2.0, 0.3, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 0]]], [0.0, 0.0, 0.0, 0.125, True, 4]], [[[0.06, 0.07], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.046875, [[0, 0, -1.5], [0, 0, 1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, -1.5]]], [0.057263, 0.066807, -0.023162, 0.015625, False, -1]], [[[0.04, -0.04], 0.63, 2.0, 5.0, 0.0625, 3.0, 2.0, 1.0, 0.0625, [[-2, 0, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, 0.5]]], [0.0, 0.0, 0.0, 0.0625, True, 4]], [[[1.53, -3.53], 1.25, 20.0, 40.0, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.515578, -1.189536, 0.179265, 0.03125, False, -1]], [[[0.42, -5.21], -1.72, 80.0, 40.0, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 2], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.175583, 0.03125, False, 3]], [[[-0.05, 0.04], 0.79, 2.0, 40.0, 0.03125, 8.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0.5], [0, 0, 0]]], [4.429066, 0.0, 0.098765, 0.0, False, 0]], [[[-3.54, -2.83], 1.95, 80.0, 5.0, 0.03125, 3.0, 2.0, 0.3, 0.09375, [[0, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-0.00674, -0.0111, 0.45969, 0.0, False, -1]], [[[0.03, 0.07], 0.0, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.1875, [[0, 0, 0], [0, 0, 0.5], [0, 0, 0.5], [0, 0, 0], [0, 0, -0.5], [0, 0, -0.5]]], [0.0, 0.0, -0.955005, 0.125, False, 2]]], [[[[3.71, -5.39], 0.21, 0.5, 5.0, 0.0625, 3.0, 0.5, 0.3, 0.125, [[0, 0, 0], [0, 1, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 1, 0], [1, 1, 2]]], [2.924827, 0.667375, 1.580911, 0.0, False, -1]], [[[-1.82, -3.97], -1.03, 0.5, 40.0, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 8, 0.5], [0, 0, 0]]], [-0.541146, 2.858316, 0.040771, 0.0, False, -1]], [[[-0.03, 0.03], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 1]], [[[0.01, 0.01], 1.94, 0.5, 5.0, 0.015625, 8.0, 2.0, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, -1]]], [0.0, 0.0, 0.0, 0.015625, True, 8]], [[[-5.42, -3.46], -1.79, 20.0, 5.0, 0.0625, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [1, 0, 0.5], [1, 8, 2], [1, 8, 0], [0, 0, 0], [1, 8, -1], [0, 0, 0], [0, 0, 0]]], [0.112598, 0.900382, -0.1314, 0.0, False, -1]], [[[0.04, -0.01], 0.0, 2.0, 0.5, 0.0625, 8.0, 0.5, 0.3, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 1.5]]], [0.0, 0.0, -2.60974, 0.0, False, 1]], [[[0.02, 0.02], 1.76, 80.0, 40.0, 0.03125, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 0]], [[[-0.04, -0.09], 0.0, 2.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, -1.5], [0, 0, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, -1.5]]], [-0.02954, -0.066466, -5.729036, 0.0, False, -1]]], [[[[0.02, -0.03], 0.0, 2.0, 5.0, 0.0625, 8.0, 0.5, 1.0, 0.1875, [[0, 0, -1.5], [0, 0, -1.5], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 0], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.1875, True, 7]], [[[0.01, -0.0], 0.7, 0.5, 0.5, 0.0625, 8.0, 2.0, 1.0, 0.1875, [[0, 0, 0], [0, 0, 0], [1, 8, 0.5], [5, -3, 2]]], [5.797639, 4.613407, 3.028481, 0.0, False, -1]], [[[0.04, 0.1], 0.0, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0.5], [0, 0, 0.5], [0, 0, -0.5], [0, 0, 0.5], [0, 0, -0.5], [0, 0, -0.5], [0, 0, 0.5]]], [0.0, 0.0, 0.463768, 0.015625, False, 5]], [[[-0.05, -0.07], 0.0, 2.0, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.03125, [[0, 0, -0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0.5], [0, 0, -0.5], [0, 0, 0], [0, 0, 0.5], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 7]], [[[0.05, -0.02], 0.0, 2.0, 0.5, 0.015625, 8.0, 0.5, 1.0, 0.046875, [[0, 0, -1.5], [0, 0, 1.5], [0, 0, -1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5]]], [0.0, 0.0, 0.011538, 0.015625, False, 5]], [[[0.18, 0.67], -0.31, 0.5, 5.0, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, -1], [0, -3, 2], [0, 0, 0], [1, 1, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 5]], [[[1.3, 3.51], 1.97, 80.0, 0.5, 0.015625, 3.0, 2.0, 1.0, 0.046875, [[5, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.046875, True, 3]], [[[0.01, 0.06], 0.0, 2.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5]]], [0.0, 0.0, 0.022722, 0.03125, False, 6]]], [[[[0.0, -0.03], 0.5, 80.0, 0.5, 0.0625, 3.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [-2, 0, -1], [0, 0, 0], [5, 1, -1], [1, 0, 2], [0, 0, 0], [0, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 6]], [[[-1.17, -2.61], 0.84, 80.0, 0.5, 0.03125, 8.0, 0.5, 0.3, 0.09375, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-0.002228, -0.004969, 0.777342, 0.0, False, -1]], [[[-0.04, 0.03], -0.91, 20.0, 5.0, 0.0625, 3.0, 2.0, 0.3, 0.0625, [[5, 8, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 2], [0, 0, 0]]], [0.706665, 1.130664, 1.160998, 0.0, False, 6]], [[[0.03, 0.01], -0.32, 2.0, 5.0, 0.03125, 8.0, 2.0, 0.3, 0.09375, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.09375, True, 2]], [[[-0.03, -0.0], 0.97, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 1, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 0]]], [3.941435, 6.961687, 0.295315, 0.0, False, 0]], [[[3.82, 5.03], 0.39, 2.0, 5.0, 0.03125, 3.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, -3, 0], [0, 0, 0], [-2, -3, 0.5], [0, 0, 0]]], [-1.566212, -2.349318, 0.373996, 0.0, False, 2]], [[[0.04, -0.08], 0.0, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, -0.5], [0, 0, -0.5], [0, 0, 0.5], [0, 0, -0.5], [0, 0, 0], [0, 0, 0.5], [0, 0, -0.5]]], [0.0, 0.0, -0.033606, 0.03125, False, 5]], [[[0.05, -0.02], 0.0, 0.5, 5.0, 0.03125, 8.0, 0.5, 0.3, 0.09375, [[0, 0, 0], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 0], [0, 0, 1.5], [0, 0, 1.5]]], [0.043488, -0.017395, 1.195333, 0.0, False, -1]]], [[[[0.07, -0.09], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[0, 0, -3.0], [0, 0, 3.0], [0, 0, 0], [0, 0, 3.0], [0, 0, 0]]], [0.064779, -0.083287, 2.951781, 0.0, False, -1]], [[[-0.03, -0.02], 0.88, 2.0, 5.0, 0.015625, 8.0, 2.0, 0.3, 0.03125, [[0, 0, 0], [0, 8, 0], [5, 1, -1], [0, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, -3, 0.5], [5, 0, 0], [0, 0, 0]]], [7.375353, 2.405025, -0.324717, 0.0, False, -1]], [[[0.04, -0.02], -0.56, 20.0, 5.0, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [-2, 8, 0], [1, -3, 2], [0, 0, 0], [0, 1, 0.5]]], [0.065203, 0.594939, 1.45528, 0.0, False, -1]], [[[0.02, -0.01], -1.91, 2.0, 40.0, 0.0625, 8.0, 2.0, 0.3, 0.125, [[-2, 1, 0], [0, 0, 0], [-2, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-2.225265, -1.384548, -0.007703, 0.0, False, -1]], [[[-0.04, -0.02], 1.89, 20.0, 40.0, 0.0625, 3.0, 0.5, 1.0, 0.125, [[0, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, -3, -1], [-2, 0, 0.5]]], [-1.283951, -0.592593, 0.061224, 0.0, False, 1]], [[[-5.17, -2.18], 1.53, 0.5, 40.0, 0.015625, 8.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [1, 8, 2], [1, 8, 2], [5, -3, -1], [0, 0, 0], [0, -3, -1]]], [3.17179, 1.717873, -0.302003, 0.0, False, -1]], [[[-0.08, 0.04], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, -3.0], [0, 0, 0], [0, 0, 3.0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 3]], [[[-0.36, 5.34], -0.71, 2.0, 40.0, 0.015625, 3.0, 2.0, 0.3, 0.03125, [[0, 0, 0], [1, 1, 0], [1, 8, 2], [0, 0, 0], [5, 1, 0], [1, 8, 0.5], [0, 0, 0], [-2, 0, -1], [0, 0, 0], [0, 0, 0]]], [-0.940955, 2.501391, -0.153314, 0.0, False, -1]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("case %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
case 0[0.0, 0.444444, 0.0, 0.0625, False, 2][0.0, 0.0, 0.0, 0.125, True, 4]Failed
case 1[0.0, 0.0, -1.488372, 0.015625, False, 2][0.057263, 0.066807, -0.023162, 0.015625, False, -1]Failed
case 2[0.0, 0.0, 0.0, 0.0625, True, 4][0.0, 0.0, 0.0, 0.0625, True, 4]Passed
case 3[0.515578, -1.189536, 0.179265, 0.03125, False, -1][0.515578, -1.189536, 0.179265, 0.03125, False, -1]Passed
case 4[0.0, 0.0, 0.0, 0.0625, True, 7][0.0, 0.0, 0.175583, 0.03125, False, 3]Failed
case 5[0.0, 0.0, 0.0, 0.03125, True, 6][4.429066, 0.0, 0.098765, 0.0, False, 0]Failed
case 6[0.0, 0.0, 0.0, 0.09375, True, 2][-0.00674, -0.0111, 0.45969, 0.0, False, -1]Failed
case 7[0.0, 0.0, -0.955005, 0.125, False, 2][0.0, 0.0, -0.955005, 0.125, False, 2]Passed

SHA-256 / 6e8c9665662fe071e647fcced3225c320c3d4f41d23829cb299f9c86689a929e

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(v, omega, lin_damp, ang_damp, dt, max_speed, sleep_lin, sleep_ang, sleep_time, kicks):
    vx, vy = v
    w = omega
    timer = 0.0
    asleep = False
    slept_at = -1
    for f, (ax, ay, aw) in enumerate(kicks):
        if asleep:
            if ax or ay or aw:
                asleep = False
                timer = 0.0
            else:
                continue
        vx += ax
        vy += ay
        w += aw
        dl = 1.0 / (1.0 + dt * lin_damp)
        vx *= dl
        vy *= dl
        w *= 1.0 / (1.0 + dt * ang_damp)
        sp = math.hypot(vx, vy)
        if sp > max_speed:
            s = max_speed / sp
            vx *= s
            vy *= s
        if math.hypot(vx, vy) < sleep_lin and w < sleep_ang:
            timer += dt
        else:
            timer = 0.0
        if timer >= sleep_time:
            asleep = True
            slept_at = f
            vx = vy = w = 0.0
    return [round(vx, 6), round(vy, 6), round(w, 6), round(timer, 6), asleep, slept_at]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[-1.03, -4.82], -0.81, 20.0, 5.0, 0.0625, 3.0, 2.0, 0.3, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 0]]], [0.0, 0.0, 0.0, 0.125, True, 4]], [[[0.06, 0.07], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.046875, [[0, 0, -1.5], [0, 0, 1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, -1.5]]], [0.057263, 0.066807, -0.023162, 0.015625, False, -1]], [[[0.04, -0.04], 0.63, 2.0, 5.0, 0.0625, 3.0, 2.0, 1.0, 0.0625, [[-2, 0, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, 0.5]]], [0.0, 0.0, 0.0, 0.0625, True, 4]], [[[1.53, -3.53], 1.25, 20.0, 40.0, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.515578, -1.189536, 0.179265, 0.03125, False, -1]], [[[0.42, -5.21], -1.72, 80.0, 40.0, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 2], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.175583, 0.03125, False, 3]], [[[-0.05, 0.04], 0.79, 2.0, 40.0, 0.03125, 8.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0.5], [0, 0, 0]]], [4.429066, 0.0, 0.098765, 0.0, False, 0]], [[[-3.54, -2.83], 1.95, 80.0, 5.0, 0.03125, 3.0, 2.0, 0.3, 0.09375, [[0, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-0.00674, -0.0111, 0.45969, 0.0, False, -1]], [[[0.03, 0.07], 0.0, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.1875, [[0, 0, 0], [0, 0, 0.5], [0, 0, 0.5], [0, 0, 0], [0, 0, -0.5], [0, 0, -0.5]]], [0.0, 0.0, -0.955005, 0.125, False, 2]]], [[[[3.71, -5.39], 0.21, 0.5, 5.0, 0.0625, 3.0, 0.5, 0.3, 0.125, [[0, 0, 0], [0, 1, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 1, 0], [1, 1, 2]]], [2.924827, 0.667375, 1.580911, 0.0, False, -1]], [[[-1.82, -3.97], -1.03, 0.5, 40.0, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 8, 0.5], [0, 0, 0]]], [-0.541146, 2.858316, 0.040771, 0.0, False, -1]], [[[-0.03, 0.03], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 1]], [[[0.01, 0.01], 1.94, 0.5, 5.0, 0.015625, 8.0, 2.0, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, -1]]], [0.0, 0.0, 0.0, 0.015625, True, 8]], [[[-5.42, -3.46], -1.79, 20.0, 5.0, 0.0625, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [1, 0, 0.5], [1, 8, 2], [1, 8, 0], [0, 0, 0], [1, 8, -1], [0, 0, 0], [0, 0, 0]]], [0.112598, 0.900382, -0.1314, 0.0, False, -1]], [[[0.04, -0.01], 0.0, 2.0, 0.5, 0.0625, 8.0, 0.5, 0.3, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 1.5]]], [0.0, 0.0, -2.60974, 0.0, False, 1]], [[[0.02, 0.02], 1.76, 80.0, 40.0, 0.03125, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 0]], [[[-0.04, -0.09], 0.0, 2.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, -1.5], [0, 0, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, -1.5]]], [-0.02954, -0.066466, -5.729036, 0.0, False, -1]]], [[[[0.02, -0.03], 0.0, 2.0, 5.0, 0.0625, 8.0, 0.5, 1.0, 0.1875, [[0, 0, -1.5], [0, 0, -1.5], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 0], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.1875, True, 7]], [[[0.01, -0.0], 0.7, 0.5, 0.5, 0.0625, 8.0, 2.0, 1.0, 0.1875, [[0, 0, 0], [0, 0, 0], [1, 8, 0.5], [5, -3, 2]]], [5.797639, 4.613407, 3.028481, 0.0, False, -1]], [[[0.04, 0.1], 0.0, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0.5], [0, 0, 0.5], [0, 0, -0.5], [0, 0, 0.5], [0, 0, -0.5], [0, 0, -0.5], [0, 0, 0.5]]], [0.0, 0.0, 0.463768, 0.015625, False, 5]], [[[-0.05, -0.07], 0.0, 2.0, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.03125, [[0, 0, -0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0.5], [0, 0, -0.5], [0, 0, 0], [0, 0, 0.5], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 7]], [[[0.05, -0.02], 0.0, 2.0, 0.5, 0.015625, 8.0, 0.5, 1.0, 0.046875, [[0, 0, -1.5], [0, 0, 1.5], [0, 0, -1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5]]], [0.0, 0.0, 0.011538, 0.015625, False, 5]], [[[0.18, 0.67], -0.31, 0.5, 5.0, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, -1], [0, -3, 2], [0, 0, 0], [1, 1, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 5]], [[[1.3, 3.51], 1.97, 80.0, 0.5, 0.015625, 3.0, 2.0, 1.0, 0.046875, [[5, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.046875, True, 3]], [[[0.01, 0.06], 0.0, 2.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5]]], [0.0, 0.0, 0.022722, 0.03125, False, 6]]], [[[[0.0, -0.03], 0.5, 80.0, 0.5, 0.0625, 3.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [-2, 0, -1], [0, 0, 0], [5, 1, -1], [1, 0, 2], [0, 0, 0], [0, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 6]], [[[-1.17, -2.61], 0.84, 80.0, 0.5, 0.03125, 8.0, 0.5, 0.3, 0.09375, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-0.002228, -0.004969, 0.777342, 0.0, False, -1]], [[[-0.04, 0.03], -0.91, 20.0, 5.0, 0.0625, 3.0, 2.0, 0.3, 0.0625, [[5, 8, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 2], [0, 0, 0]]], [0.706665, 1.130664, 1.160998, 0.0, False, 6]], [[[0.03, 0.01], -0.32, 2.0, 5.0, 0.03125, 8.0, 2.0, 0.3, 0.09375, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.09375, True, 2]], [[[-0.03, -0.0], 0.97, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 1, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 0]]], [3.941435, 6.961687, 0.295315, 0.0, False, 0]], [[[3.82, 5.03], 0.39, 2.0, 5.0, 0.03125, 3.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, -3, 0], [0, 0, 0], [-2, -3, 0.5], [0, 0, 0]]], [-1.566212, -2.349318, 0.373996, 0.0, False, 2]], [[[0.04, -0.08], 0.0, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, -0.5], [0, 0, -0.5], [0, 0, 0.5], [0, 0, -0.5], [0, 0, 0], [0, 0, 0.5], [0, 0, -0.5]]], [0.0, 0.0, -0.033606, 0.03125, False, 5]], [[[0.05, -0.02], 0.0, 0.5, 5.0, 0.03125, 8.0, 0.5, 0.3, 0.09375, [[0, 0, 0], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 0], [0, 0, 1.5], [0, 0, 1.5]]], [0.043488, -0.017395, 1.195333, 0.0, False, -1]]], [[[[0.07, -0.09], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[0, 0, -3.0], [0, 0, 3.0], [0, 0, 0], [0, 0, 3.0], [0, 0, 0]]], [0.064779, -0.083287, 2.951781, 0.0, False, -1]], [[[-0.03, -0.02], 0.88, 2.0, 5.0, 0.015625, 8.0, 2.0, 0.3, 0.03125, [[0, 0, 0], [0, 8, 0], [5, 1, -1], [0, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, -3, 0.5], [5, 0, 0], [0, 0, 0]]], [7.375353, 2.405025, -0.324717, 0.0, False, -1]], [[[0.04, -0.02], -0.56, 20.0, 5.0, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [-2, 8, 0], [1, -3, 2], [0, 0, 0], [0, 1, 0.5]]], [0.065203, 0.594939, 1.45528, 0.0, False, -1]], [[[0.02, -0.01], -1.91, 2.0, 40.0, 0.0625, 8.0, 2.0, 0.3, 0.125, [[-2, 1, 0], [0, 0, 0], [-2, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-2.225265, -1.384548, -0.007703, 0.0, False, -1]], [[[-0.04, -0.02], 1.89, 20.0, 40.0, 0.0625, 3.0, 0.5, 1.0, 0.125, [[0, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, -3, -1], [-2, 0, 0.5]]], [-1.283951, -0.592593, 0.061224, 0.0, False, 1]], [[[-5.17, -2.18], 1.53, 0.5, 40.0, 0.015625, 8.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [1, 8, 2], [1, 8, 2], [5, -3, -1], [0, 0, 0], [0, -3, -1]]], [3.17179, 1.717873, -0.302003, 0.0, False, -1]], [[[-0.08, 0.04], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, -3.0], [0, 0, 0], [0, 0, 3.0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 3]], [[[-0.36, 5.34], -0.71, 2.0, 40.0, 0.015625, 3.0, 2.0, 0.3, 0.03125, [[0, 0, 0], [1, 1, 0], [1, 8, 2], [0, 0, 0], [5, 1, 0], [1, 8, 0.5], [0, 0, 0], [-2, 0, -1], [0, 0, 0], [0, 0, 0]]], [-0.940955, 2.501391, -0.153314, 0.0, False, -1]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("case %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
case 0[0.0, 0.444444, 0.0, 0.0625, False, 2][0.0, 0.0, 0.0, 0.125, True, 4]Failed
case 1[0.057263, 0.066807, -0.023162, 0.015625, False, -1][0.057263, 0.066807, -0.023162, 0.015625, False, -1]Passed
case 2[0.0, 0.0, 0.0, 0.0625, True, 4][0.0, 0.0, 0.0, 0.0625, True, 4]Passed
case 3[0.515578, -1.189536, 0.179265, 0.03125, False, -1][0.515578, -1.189536, 0.179265, 0.03125, False, -1]Passed
case 4[0.0, 0.0, 0.175583, 0.03125, False, 1][0.0, 0.0, 0.175583, 0.03125, False, 3]Failed
case 5[4.429066, 0.0, 0.098765, 0.0, False, 0][4.429066, 0.0, 0.098765, 0.0, False, 0]Passed
case 6[-0.00674, -0.0111, 0.45969, 0.0, False, -1][-0.00674, -0.0111, 0.45969, 0.0, False, -1]Passed
case 7[0.0, 0.0, -0.955005, 0.125, False, 2][0.0, 0.0, -0.955005, 0.125, False, 2]Passed

SHA-256 / c0b4f5caa505d9b65ab2840ed4ef68a9c40b123190ba17ba9be4da5fde229a3e

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(v, omega, lin_damp, ang_damp, dt, max_speed, sleep_lin, sleep_ang, sleep_time, kicks):
    vx, vy = v
    w = omega
    timer = 0.0
    asleep = False
    slept_at = -1
    for f, (ax, ay, aw) in enumerate(kicks):
        if asleep:
            if ax or ay or aw:
                asleep = False
                timer = 0.0
            else:
                continue
        vx += ax
        vy += ay
        w += aw
        dl = 1.0 / (1.0 + dt * lin_damp)
        vx *= dl
        vy *= dl
        w *= 1.0 / (1.0 + dt * ang_damp)
        sp = math.hypot(vx, vy)
        if sp > max_speed:
            s = max_speed / sp
            vx *= s
            vy *= s
        if math.hypot(vx, vy) < sleep_lin and abs(w) < sleep_ang:
            timer += dt
        else:
            timer = 0.0
        if timer >= sleep_time:
            asleep = True
            slept_at = f
            vx = vy = w = 0.0
    return [round(vx, 6), round(vy, 6), round(w, 6), round(timer, 6), asleep, slept_at]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[-1.03, -4.82], -0.81, 20.0, 5.0, 0.0625, 3.0, 2.0, 0.3, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 0]]], [0.0, 0.0, 0.0, 0.125, True, 4]], [[[0.06, 0.07], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.046875, [[0, 0, -1.5], [0, 0, 1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, -1.5]]], [0.057263, 0.066807, -0.023162, 0.015625, False, -1]], [[[0.04, -0.04], 0.63, 2.0, 5.0, 0.0625, 3.0, 2.0, 1.0, 0.0625, [[-2, 0, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, 0.5]]], [0.0, 0.0, 0.0, 0.0625, True, 4]], [[[1.53, -3.53], 1.25, 20.0, 40.0, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.515578, -1.189536, 0.179265, 0.03125, False, -1]], [[[0.42, -5.21], -1.72, 80.0, 40.0, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 2], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.175583, 0.03125, False, 3]], [[[-0.05, 0.04], 0.79, 2.0, 40.0, 0.03125, 8.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0.5], [0, 0, 0]]], [4.429066, 0.0, 0.098765, 0.0, False, 0]], [[[-3.54, -2.83], 1.95, 80.0, 5.0, 0.03125, 3.0, 2.0, 0.3, 0.09375, [[0, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-0.00674, -0.0111, 0.45969, 0.0, False, -1]], [[[0.03, 0.07], 0.0, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.1875, [[0, 0, 0], [0, 0, 0.5], [0, 0, 0.5], [0, 0, 0], [0, 0, -0.5], [0, 0, -0.5]]], [0.0, 0.0, -0.955005, 0.125, False, 2]]], [[[[3.71, -5.39], 0.21, 0.5, 5.0, 0.0625, 3.0, 0.5, 0.3, 0.125, [[0, 0, 0], [0, 1, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 1, 0], [1, 1, 2]]], [2.924827, 0.667375, 1.580911, 0.0, False, -1]], [[[-1.82, -3.97], -1.03, 0.5, 40.0, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 8, 0.5], [0, 0, 0]]], [-0.541146, 2.858316, 0.040771, 0.0, False, -1]], [[[-0.03, 0.03], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 1]], [[[0.01, 0.01], 1.94, 0.5, 5.0, 0.015625, 8.0, 2.0, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, -1]]], [0.0, 0.0, 0.0, 0.015625, True, 8]], [[[-5.42, -3.46], -1.79, 20.0, 5.0, 0.0625, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [1, 0, 0.5], [1, 8, 2], [1, 8, 0], [0, 0, 0], [1, 8, -1], [0, 0, 0], [0, 0, 0]]], [0.112598, 0.900382, -0.1314, 0.0, False, -1]], [[[0.04, -0.01], 0.0, 2.0, 0.5, 0.0625, 8.0, 0.5, 0.3, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 1.5]]], [0.0, 0.0, -2.60974, 0.0, False, 1]], [[[0.02, 0.02], 1.76, 80.0, 40.0, 0.03125, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 0]], [[[-0.04, -0.09], 0.0, 2.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, -1.5], [0, 0, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, -1.5]]], [-0.02954, -0.066466, -5.729036, 0.0, False, -1]]], [[[[0.02, -0.03], 0.0, 2.0, 5.0, 0.0625, 8.0, 0.5, 1.0, 0.1875, [[0, 0, -1.5], [0, 0, -1.5], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 0], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.1875, True, 7]], [[[0.01, -0.0], 0.7, 0.5, 0.5, 0.0625, 8.0, 2.0, 1.0, 0.1875, [[0, 0, 0], [0, 0, 0], [1, 8, 0.5], [5, -3, 2]]], [5.797639, 4.613407, 3.028481, 0.0, False, -1]], [[[0.04, 0.1], 0.0, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0.5], [0, 0, 0.5], [0, 0, -0.5], [0, 0, 0.5], [0, 0, -0.5], [0, 0, -0.5], [0, 0, 0.5]]], [0.0, 0.0, 0.463768, 0.015625, False, 5]], [[[-0.05, -0.07], 0.0, 2.0, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.03125, [[0, 0, -0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0.5], [0, 0, -0.5], [0, 0, 0], [0, 0, 0.5], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 7]], [[[0.05, -0.02], 0.0, 2.0, 0.5, 0.015625, 8.0, 0.5, 1.0, 0.046875, [[0, 0, -1.5], [0, 0, 1.5], [0, 0, -1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5]]], [0.0, 0.0, 0.011538, 0.015625, False, 5]], [[[0.18, 0.67], -0.31, 0.5, 5.0, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, -1], [0, -3, 2], [0, 0, 0], [1, 1, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 5]], [[[1.3, 3.51], 1.97, 80.0, 0.5, 0.015625, 3.0, 2.0, 1.0, 0.046875, [[5, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.046875, True, 3]], [[[0.01, 0.06], 0.0, 2.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 0], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5]]], [0.0, 0.0, 0.022722, 0.03125, False, 6]]], [[[[0.0, -0.03], 0.5, 80.0, 0.5, 0.0625, 3.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [-2, 0, -1], [0, 0, 0], [5, 1, -1], [1, 0, 2], [0, 0, 0], [0, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 6]], [[[-1.17, -2.61], 0.84, 80.0, 0.5, 0.03125, 8.0, 0.5, 0.3, 0.09375, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-0.002228, -0.004969, 0.777342, 0.0, False, -1]], [[[-0.04, 0.03], -0.91, 20.0, 5.0, 0.0625, 3.0, 2.0, 0.3, 0.0625, [[5, 8, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 2], [0, 0, 0]]], [0.706665, 1.130664, 1.160998, 0.0, False, 6]], [[[0.03, 0.01], -0.32, 2.0, 5.0, 0.03125, 8.0, 2.0, 0.3, 0.09375, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.09375, True, 2]], [[[-0.03, -0.0], 0.97, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 1, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 0]]], [3.941435, 6.961687, 0.295315, 0.0, False, 0]], [[[3.82, 5.03], 0.39, 2.0, 5.0, 0.03125, 3.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, -3, 0], [0, 0, 0], [-2, -3, 0.5], [0, 0, 0]]], [-1.566212, -2.349318, 0.373996, 0.0, False, 2]], [[[0.04, -0.08], 0.0, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, -0.5], [0, 0, -0.5], [0, 0, 0.5], [0, 0, -0.5], [0, 0, 0], [0, 0, 0.5], [0, 0, -0.5]]], [0.0, 0.0, -0.033606, 0.03125, False, 5]], [[[0.05, -0.02], 0.0, 0.5, 5.0, 0.03125, 8.0, 0.5, 0.3, 0.09375, [[0, 0, 0], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 0], [0, 0, 1.5], [0, 0, 1.5]]], [0.043488, -0.017395, 1.195333, 0.0, False, -1]]], [[[[0.07, -0.09], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[0, 0, -3.0], [0, 0, 3.0], [0, 0, 0], [0, 0, 3.0], [0, 0, 0]]], [0.064779, -0.083287, 2.951781, 0.0, False, -1]], [[[-0.03, -0.02], 0.88, 2.0, 5.0, 0.015625, 8.0, 2.0, 0.3, 0.03125, [[0, 0, 0], [0, 8, 0], [5, 1, -1], [0, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, -3, 0.5], [5, 0, 0], [0, 0, 0]]], [7.375353, 2.405025, -0.324717, 0.0, False, -1]], [[[0.04, -0.02], -0.56, 20.0, 5.0, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [-2, 8, 0], [1, -3, 2], [0, 0, 0], [0, 1, 0.5]]], [0.065203, 0.594939, 1.45528, 0.0, False, -1]], [[[0.02, -0.01], -1.91, 2.0, 40.0, 0.0625, 8.0, 2.0, 0.3, 0.125, [[-2, 1, 0], [0, 0, 0], [-2, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-2.225265, -1.384548, -0.007703, 0.0, False, -1]], [[[-0.04, -0.02], 1.89, 20.0, 40.0, 0.0625, 3.0, 0.5, 1.0, 0.125, [[0, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, -3, -1], [-2, 0, 0.5]]], [-1.283951, -0.592593, 0.061224, 0.0, False, 1]], [[[-5.17, -2.18], 1.53, 0.5, 40.0, 0.015625, 8.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [1, 8, 2], [1, 8, 2], [5, -3, -1], [0, 0, 0], [0, -3, -1]]], [3.17179, 1.717873, -0.302003, 0.0, False, -1]], [[[-0.08, 0.04], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, -3.0], [0, 0, 0], [0, 0, 3.0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 3]], [[[-0.36, 5.34], -0.71, 2.0, 40.0, 0.015625, 3.0, 2.0, 0.3, 0.03125, [[0, 0, 0], [1, 1, 0], [1, 8, 2], [0, 0, 0], [5, 1, 0], [1, 8, 0.5], [0, 0, 0], [-2, 0, -1], [0, 0, 0], [0, 0, 0]]], [-0.940955, 2.501391, -0.153314, 0.0, False, -1]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("case %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
case 0[0.0, 0.0, 0.0, 0.125, True, 4][0.0, 0.0, 0.0, 0.125, True, 4]Passed
case 1[0.057263, 0.066807, -0.023162, 0.015625, False, -1][0.057263, 0.066807, -0.023162, 0.015625, False, -1]Passed
case 2[0.0, 0.0, 0.0, 0.0625, True, 4][0.0, 0.0, 0.0, 0.0625, True, 4]Passed
case 3[0.515578, -1.189536, 0.179265, 0.03125, False, -1][0.515578, -1.189536, 0.179265, 0.03125, False, -1]Passed
case 4[0.0, 0.0, 0.175583, 0.03125, False, 3][0.0, 0.0, 0.175583, 0.03125, False, 3]Passed
case 5[4.429066, 0.0, 0.098765, 0.0, False, 0][4.429066, 0.0, 0.098765, 0.0, False, 0]Passed
case 6[-0.00674, -0.0111, 0.45969, 0.0, False, -1][-0.00674, -0.0111, 0.45969, 0.0, False, -1]Passed
case 7[0.0, 0.0, -0.955005, 0.125, False, 2][0.0, 0.0, -0.955005, 0.125, False, 2]Passed

SHA-256 / 17c51e18ac341c962f7d83702e2b638c5a7e39b7a247bdca1c3983d8de825ea0

Verification & scope

A deterministic bounded teaching model with stipulated toy conventions and rounded float output; not a production physics engine or a proof of numerical stability. 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:50:57.076916+00:00.

Case digest / a2c962f160613a203c2807d9658dd1e9603ed2857ad3694eeb54a61ac3afc853