FA-87266 / Physics integrator stability / Open access
Angular velocity is damped with the linear coefficient · case 01
Tuning angular damping has no effect.
ROOT CAUSE
omega is multiplied by the linear factor dl.
VERIFIED REPAIR
Use 1/(1+dt*ang_damp) for omega.
Unsuccessful approach: Omitting dt makes angular damping frame-rate dependent.
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 *= dl
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 = [[[[[0.05, 0.07], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 3]], [[[-0.01, -0.01], 1.26, 0.5, 40.0, 0.015625, 3.0, 0.5, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 8, 2]]], [0.363645, 2.977879, 1.230769, 0.0, False, 0]], [[[-0.12, -5.54], -0.33, 0.5, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.03125, [[1, 8, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.853029, 2.384603, 1.618816, 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, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5]]], [-0.065791, 0.084588, -1.387079, 0.0, False, -1]], [[[4.02, 0.82], -0.26, 2.0, 40.0, 0.0625, 3.0, 2.0, 1.0, 0.1875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 2]]], [0.0, 0.888889, 0.571429, 0.0625, False, 6]], [[[-2.26, -0.28], 0.89, 2.0, 40.0, 0.0625, 3.0, 2.0, 0.3, 0.125, [[0, 0, 0.5], [0, 0, 0], [1, 0, -1], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.125, True, 2]], [[[0.0, -0.02], -0.16, 20.0, 40.0, 0.015625, 8.0, 2.0, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0.5], [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.046875, True, 5]], [[[-4.46, -2.51], 0.66, 0.5, 0.5, 0.015625, 8.0, 2.0, 1.0, 0.03125, [[-2, -3, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-5.900121, -5.032456, 0.634812, 0.0, False, -1]]], [[[[2.02, -3.34], -1.78, 20.0, 0.5, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, -3, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.229381, -0.966121, -1.672561, 0.0, False, -1]], [[[3.02, -0.11], 0.43, 0.5, 5.0, 0.0625, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0.5], [1, 0, 2], [-2, -3, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [5.304661, -2.733316, 1.32246, 0.0, False, -1]], [[[-5.17, 4.65], 0.37, 20.0, 40.0, 0.0625, 8.0, 0.5, 1.0, 0.125, [[0, 0, 0], [1, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.125, True, 3]], [[[-2.24, -3.75], -1.0, 20.0, 0.5, 0.015625, 3.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 0, 2], [1, 1, 0.5]]], [-0.57379, 0.469444, 1.532879, 0.0, False, -1]], [[[0.0, 0.02], 1.7, 2.0, 5.0, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 0, 0.5], [0, 0, 0], [0, 0, 0]]], [-1.823636, 0.015162, 1.262818, 0.0, False, -1]], [[[0.04, 0.05], -1.81, 20.0, 40.0, 0.0625, 3.0, 2.0, 1.0, 0.1875, [[5, 0, 0.5], [0, 0, 0], [1, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 1, 0], [0, 8, 0]]], [0.157676, 2.995853, 0.0, 0.0, False, 3]], [[[-0.05, -0.0], 0.0, 0.5, 5.0, 0.015625, 8.0, 0.5, 0.3, 0.03125, [[0, 0, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5], [0, 0, -1.5]]], [-0.048092, 0.0, -2.327574, 0.0, False, -1]], [[[0.68, 3.27], 1.49, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [1, -3, 0], [0, 0, 0], [0, 0, 0]]], [1.513065, 0.155838, 1.317439, 0.0, False, -1]]], [[[[3.86, -4.4], 0.73, 80.0, 0.5, 0.0625, 3.0, 2.0, 1.0, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, -1], [5, 0, -1], [0, 0, 0], [0, 0, 0]]], [0.027006, 0.0, -1.796005, 0.0, False, 1]], [[[0.04, -0.02], 1.78, 80.0, 40.0, 0.03125, 3.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [5, 0, 2], [5, 0, -1], [0, 0, 0], [0, -3, 0], [0, 0, 0], [5, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 7]], [[[0.09, -0.1], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.082005, -0.091117, 1.388111, 0.0, False, -1]], [[[-0.1, -0.05], 0.0, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0], [0, 0, 3.0], [0, 0, 0], [0, 0, 0]]], [-0.088419, -0.044209, 2.393944, 0.0, False, -1]], [[[0.09, 0.08], 0.0, 2.0, 5.0, 0.03125, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0.5], [0, 0, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, -0.5], [0, 0, 0], [0, 0, 0.5], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.323456, 0.0, False, 5]], [[[1.9, 0.51], -1.66, 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], [5, 0, -1], [0, 0, 0]]], [6.708099, 0.479217, -1.769724, 0.0, False, -1]], [[[-0.02, 0.02], -1.06, 0.5, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, -3, 2], [0, 1, -1], [0, 0, 2], [0, 0, 0]]], [-0.01894, -1.912189, 1.927089, 0.0, False, -1]], [[[0.04, -0.02], 1.1, 80.0, 40.0, 0.03125, 3.0, 0.5, 0.3, 0.0625, [[0, -3, 0], [0, 0, 0], [0, 0, 0], [5, 0, -1], [0, 0, 0], [0, 0, 0], [0, 1, -1], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 8]]], [[[[-0.05, 0.04], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, -3.0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 3.0], [0, 0, -3.0], [0, 0, -3.0]]], [-0.046618, 0.037294, -5.840587, 0.0, False, -1]], [[[-0.03, 0.05], -1.01, 80.0, 0.5, 0.03125, 8.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0.5], [0, 0, 0], [0, 0, 0], [5, 0, 2], [0, 0, 0], [0, 0, 0]]], [0.116618, 0.0, 1.909105, 0.0, False, 3]], [[[0.02, 0.03], -1.95, 2.0, 5.0, 0.015625, 3.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 4]], [[[-0.05, -0.02], 1.89, 0.5, 40.0, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 0, 0], [5, 0, -1], [1, 1, -1], [0, 0, 0], [1, 0, 2]]], [2.951277, 0.538484, 0.54504, 0.0, False, -1]], [[[-0.05, -0.03], 1.51, 0.5, 0.5, 0.03125, 3.0, 2.0, 0.3, 0.03125, [[0, 0, 0], [0, 0, 0], [5, 1, 0], [0, 1, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [2.524203, 1.35238, 1.824634, 0.0, False, -1]], [[[-0.01, 0.0], 0.0, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.125, [[0, 0, 1.5], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, 0]]], [-0.008062, 0.0, 1.370126, 0.0, False, -1]], [[[-0.01, -0.03], 0.0, 0.5, 0.5, 0.0625, 8.0, 2.0, 0.3, 0.125, [[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.125, True, 1]], [[[-0.03, 0.08], 0.0, 2.0, 5.0, 0.03125, 8.0, 0.5, 0.3, 0.09375, [[0, 0, 0], [0, 0, 1.5], [0, 0, 0], [0, 0, 0]]], [-0.02354, 0.062773, 0.970367, 0.0, False, -1]]], [[[[-0.05, -0.05], -0.5, 0.5, 0.5, 0.03125, 3.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [1.513799, 2.430833, 0.021357, 0.0, False, -1]], [[[0.08, -0.08], 0.0, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.125, [[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.125, True, 5]], [[[4.96, -1.21], -1.7, 80.0, 0.5, 0.0625, 8.0, 2.0, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.003827, -0.000934, -1.503118, 0.0, False, -1]], [[[-4.04, -5.1], 0.88, 80.0, 40.0, 0.0625, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 1]], [[[5.74, -4.33], -1.41, 80.0, 0.5, 0.0625, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [-2, 8, 0.5], [0, 0, -1], [0, 0, 0], [5, 0, 0.5]]], [0.831913, 0.00608, -1.157167, 0.0, False, -1]], [[[0.03, -0.04], -1.19, 2.0, 5.0, 0.0625, 3.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, -3, 2]]], [2.572479, -1.543487, 1.52381, 0.0, False, 0]], [[[0.04, 0.03], 0.6, 2.0, 0.5, 0.015625, 3.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 1, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.030324, 0.82896, -0.387568, 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]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| case 0 | [0.0, 0.0, 0.0, 0.0625, True, 3] | [0.0, 0.0, 0.0, 0.0625, True, 3] | Passed |
| case 1 | [0.360568, 2.978253, 3.177694, 0.0, False, -1] | [0.363645, 2.977879, 1.230769, 0.0, False, 0] | Failed |
| case 2 | [0.853029, 2.384603, 1.618816, 0.0, False, -1] | [0.853029, 2.384603, 1.618816, 0.0, False, -1] | Passed |
| case 3 | [-0.065791, 0.084588, -1.387079, 0.0, False, -1] | [-0.065791, 0.084588, -1.387079, 0.0, False, -1] | Passed |
| case 4 | [0.0, 0.888889, 1.777778, 0.0, False, 6] | [0.0, 0.888889, 0.571429, 0.0625, False, 6] | Failed |
| case 5 | [0.0, 0.0, 0.0, 0.125, True, 3] | [0.0, 0.0, 0.0, 0.125, True, 2] | Failed |
| case 6 | [0.0, 0.0, 0.0, 0.046875, True, 5] | [0.0, 0.0, 0.0, 0.046875, True, 5] | Passed |
| case 7 | [-5.900121, -5.032456, 0.634812, 0.0, False, -1] | [-5.900121, -5.032456, 0.634812, 0.0, False, -1] | Passed |
SHA-256 / 5680af903536fd3a2c1fa5e4133069d0192ada7147059c6d1d778b9698a17149
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 + 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 = [[[[[0.05, 0.07], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 3]], [[[-0.01, -0.01], 1.26, 0.5, 40.0, 0.015625, 3.0, 0.5, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 8, 2]]], [0.363645, 2.977879, 1.230769, 0.0, False, 0]], [[[-0.12, -5.54], -0.33, 0.5, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.03125, [[1, 8, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.853029, 2.384603, 1.618816, 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, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5]]], [-0.065791, 0.084588, -1.387079, 0.0, False, -1]], [[[4.02, 0.82], -0.26, 2.0, 40.0, 0.0625, 3.0, 2.0, 1.0, 0.1875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 2]]], [0.0, 0.888889, 0.571429, 0.0625, False, 6]], [[[-2.26, -0.28], 0.89, 2.0, 40.0, 0.0625, 3.0, 2.0, 0.3, 0.125, [[0, 0, 0.5], [0, 0, 0], [1, 0, -1], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.125, True, 2]], [[[0.0, -0.02], -0.16, 20.0, 40.0, 0.015625, 8.0, 2.0, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0.5], [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.046875, True, 5]], [[[-4.46, -2.51], 0.66, 0.5, 0.5, 0.015625, 8.0, 2.0, 1.0, 0.03125, [[-2, -3, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-5.900121, -5.032456, 0.634812, 0.0, False, -1]]], [[[[2.02, -3.34], -1.78, 20.0, 0.5, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, -3, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.229381, -0.966121, -1.672561, 0.0, False, -1]], [[[3.02, -0.11], 0.43, 0.5, 5.0, 0.0625, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0.5], [1, 0, 2], [-2, -3, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [5.304661, -2.733316, 1.32246, 0.0, False, -1]], [[[-5.17, 4.65], 0.37, 20.0, 40.0, 0.0625, 8.0, 0.5, 1.0, 0.125, [[0, 0, 0], [1, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.125, True, 3]], [[[-2.24, -3.75], -1.0, 20.0, 0.5, 0.015625, 3.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 0, 2], [1, 1, 0.5]]], [-0.57379, 0.469444, 1.532879, 0.0, False, -1]], [[[0.0, 0.02], 1.7, 2.0, 5.0, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 0, 0.5], [0, 0, 0], [0, 0, 0]]], [-1.823636, 0.015162, 1.262818, 0.0, False, -1]], [[[0.04, 0.05], -1.81, 20.0, 40.0, 0.0625, 3.0, 2.0, 1.0, 0.1875, [[5, 0, 0.5], [0, 0, 0], [1, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 1, 0], [0, 8, 0]]], [0.157676, 2.995853, 0.0, 0.0, False, 3]], [[[-0.05, -0.0], 0.0, 0.5, 5.0, 0.015625, 8.0, 0.5, 0.3, 0.03125, [[0, 0, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5], [0, 0, -1.5]]], [-0.048092, 0.0, -2.327574, 0.0, False, -1]], [[[0.68, 3.27], 1.49, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [1, -3, 0], [0, 0, 0], [0, 0, 0]]], [1.513065, 0.155838, 1.317439, 0.0, False, -1]]], [[[[3.86, -4.4], 0.73, 80.0, 0.5, 0.0625, 3.0, 2.0, 1.0, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, -1], [5, 0, -1], [0, 0, 0], [0, 0, 0]]], [0.027006, 0.0, -1.796005, 0.0, False, 1]], [[[0.04, -0.02], 1.78, 80.0, 40.0, 0.03125, 3.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [5, 0, 2], [5, 0, -1], [0, 0, 0], [0, -3, 0], [0, 0, 0], [5, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 7]], [[[0.09, -0.1], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.082005, -0.091117, 1.388111, 0.0, False, -1]], [[[-0.1, -0.05], 0.0, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0], [0, 0, 3.0], [0, 0, 0], [0, 0, 0]]], [-0.088419, -0.044209, 2.393944, 0.0, False, -1]], [[[0.09, 0.08], 0.0, 2.0, 5.0, 0.03125, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0.5], [0, 0, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, -0.5], [0, 0, 0], [0, 0, 0.5], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.323456, 0.0, False, 5]], [[[1.9, 0.51], -1.66, 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], [5, 0, -1], [0, 0, 0]]], [6.708099, 0.479217, -1.769724, 0.0, False, -1]], [[[-0.02, 0.02], -1.06, 0.5, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, -3, 2], [0, 1, -1], [0, 0, 2], [0, 0, 0]]], [-0.01894, -1.912189, 1.927089, 0.0, False, -1]], [[[0.04, -0.02], 1.1, 80.0, 40.0, 0.03125, 3.0, 0.5, 0.3, 0.0625, [[0, -3, 0], [0, 0, 0], [0, 0, 0], [5, 0, -1], [0, 0, 0], [0, 0, 0], [0, 1, -1], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 8]]], [[[[-0.05, 0.04], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, -3.0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 3.0], [0, 0, -3.0], [0, 0, -3.0]]], [-0.046618, 0.037294, -5.840587, 0.0, False, -1]], [[[-0.03, 0.05], -1.01, 80.0, 0.5, 0.03125, 8.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0.5], [0, 0, 0], [0, 0, 0], [5, 0, 2], [0, 0, 0], [0, 0, 0]]], [0.116618, 0.0, 1.909105, 0.0, False, 3]], [[[0.02, 0.03], -1.95, 2.0, 5.0, 0.015625, 3.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 4]], [[[-0.05, -0.02], 1.89, 0.5, 40.0, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 0, 0], [5, 0, -1], [1, 1, -1], [0, 0, 0], [1, 0, 2]]], [2.951277, 0.538484, 0.54504, 0.0, False, -1]], [[[-0.05, -0.03], 1.51, 0.5, 0.5, 0.03125, 3.0, 2.0, 0.3, 0.03125, [[0, 0, 0], [0, 0, 0], [5, 1, 0], [0, 1, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [2.524203, 1.35238, 1.824634, 0.0, False, -1]], [[[-0.01, 0.0], 0.0, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.125, [[0, 0, 1.5], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, 0]]], [-0.008062, 0.0, 1.370126, 0.0, False, -1]], [[[-0.01, -0.03], 0.0, 0.5, 0.5, 0.0625, 8.0, 2.0, 0.3, 0.125, [[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.125, True, 1]], [[[-0.03, 0.08], 0.0, 2.0, 5.0, 0.03125, 8.0, 0.5, 0.3, 0.09375, [[0, 0, 0], [0, 0, 1.5], [0, 0, 0], [0, 0, 0]]], [-0.02354, 0.062773, 0.970367, 0.0, False, -1]]], [[[[-0.05, -0.05], -0.5, 0.5, 0.5, 0.03125, 3.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [1.513799, 2.430833, 0.021357, 0.0, False, -1]], [[[0.08, -0.08], 0.0, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.125, [[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.125, True, 5]], [[[4.96, -1.21], -1.7, 80.0, 0.5, 0.0625, 8.0, 2.0, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.003827, -0.000934, -1.503118, 0.0, False, -1]], [[[-4.04, -5.1], 0.88, 80.0, 40.0, 0.0625, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 1]], [[[5.74, -4.33], -1.41, 80.0, 0.5, 0.0625, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [-2, 8, 0.5], [0, 0, -1], [0, 0, 0], [5, 0, 0.5]]], [0.831913, 0.00608, -1.157167, 0.0, False, -1]], [[[0.03, -0.04], -1.19, 2.0, 5.0, 0.0625, 3.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, -3, 2]]], [2.572479, -1.543487, 1.52381, 0.0, False, 0]], [[[0.04, 0.03], 0.6, 2.0, 0.5, 0.015625, 3.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 1, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.030324, 0.82896, -0.387568, 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]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| case 0 | [0.046993, 0.065791, -0.37037, 0.0, False, -1] | [0.0, 0.0, 0.0, 0.0625, True, 3] | Failed |
| case 1 | [0.363645, 2.977879, 0.04878, 0.0, False, 0] | [0.363645, 2.977879, 1.230769, 0.0, False, 0] | Failed |
| case 2 | [0.853029, 2.384603, 0.329877, 0.0, False, -1] | [0.853029, 2.384603, 1.618816, 0.0, False, -1] | Failed |
| case 3 | [-0.065791, 0.084588, 0.037037, 0.03125, False, -1] | [-0.065791, 0.084588, -1.387079, 0.0, False, -1] | Failed |
| case 4 | [0.0, 0.888889, 0.04878, 0.0625, False, 6] | [0.0, 0.888889, 0.571429, 0.0625, False, 6] | Failed |
| case 5 | [0.0, 0.0, 0.0, 0.125, True, 2] | [0.0, 0.0, 0.0, 0.125, True, 2] | Passed |
| case 6 | [0.0, 0.0, 0.0, 0.046875, True, 5] | [0.0, 0.0, 0.0, 0.046875, True, 5] | Passed |
| case 7 | [-5.900121, -5.032456, 0.086914, 0.0, False, -1] | [-5.900121, -5.032456, 0.634812, 0.0, False, -1] | Failed |
SHA-256 / 38bfeff4189f5e76b39f0aba4c284ce32adc30fd55ccf0d78fd145a930d78af5
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 = [[[[[0.05, 0.07], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 3]], [[[-0.01, -0.01], 1.26, 0.5, 40.0, 0.015625, 3.0, 0.5, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 8, 2]]], [0.363645, 2.977879, 1.230769, 0.0, False, 0]], [[[-0.12, -5.54], -0.33, 0.5, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.03125, [[1, 8, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.853029, 2.384603, 1.618816, 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, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5]]], [-0.065791, 0.084588, -1.387079, 0.0, False, -1]], [[[4.02, 0.82], -0.26, 2.0, 40.0, 0.0625, 3.0, 2.0, 1.0, 0.1875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 2]]], [0.0, 0.888889, 0.571429, 0.0625, False, 6]], [[[-2.26, -0.28], 0.89, 2.0, 40.0, 0.0625, 3.0, 2.0, 0.3, 0.125, [[0, 0, 0.5], [0, 0, 0], [1, 0, -1], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.125, True, 2]], [[[0.0, -0.02], -0.16, 20.0, 40.0, 0.015625, 8.0, 2.0, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0.5], [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.046875, True, 5]], [[[-4.46, -2.51], 0.66, 0.5, 0.5, 0.015625, 8.0, 2.0, 1.0, 0.03125, [[-2, -3, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-5.900121, -5.032456, 0.634812, 0.0, False, -1]]], [[[[2.02, -3.34], -1.78, 20.0, 0.5, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, -3, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.229381, -0.966121, -1.672561, 0.0, False, -1]], [[[3.02, -0.11], 0.43, 0.5, 5.0, 0.0625, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0.5], [1, 0, 2], [-2, -3, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [5.304661, -2.733316, 1.32246, 0.0, False, -1]], [[[-5.17, 4.65], 0.37, 20.0, 40.0, 0.0625, 8.0, 0.5, 1.0, 0.125, [[0, 0, 0], [1, 0, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.125, True, 3]], [[[-2.24, -3.75], -1.0, 20.0, 0.5, 0.015625, 3.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 0, 2], [1, 1, 0.5]]], [-0.57379, 0.469444, 1.532879, 0.0, False, -1]], [[[0.0, 0.02], 1.7, 2.0, 5.0, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 0, 0.5], [0, 0, 0], [0, 0, 0]]], [-1.823636, 0.015162, 1.262818, 0.0, False, -1]], [[[0.04, 0.05], -1.81, 20.0, 40.0, 0.0625, 3.0, 2.0, 1.0, 0.1875, [[5, 0, 0.5], [0, 0, 0], [1, -3, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 1, 0], [0, 8, 0]]], [0.157676, 2.995853, 0.0, 0.0, False, 3]], [[[-0.05, -0.0], 0.0, 0.5, 5.0, 0.015625, 8.0, 0.5, 0.3, 0.03125, [[0, 0, -1.5], [0, 0, 0], [0, 0, -1.5], [0, 0, 1.5], [0, 0, -1.5]]], [-0.048092, 0.0, -2.327574, 0.0, False, -1]], [[[0.68, 3.27], 1.49, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [1, -3, 0], [0, 0, 0], [0, 0, 0]]], [1.513065, 0.155838, 1.317439, 0.0, False, -1]]], [[[[3.86, -4.4], 0.73, 80.0, 0.5, 0.0625, 3.0, 2.0, 1.0, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, -1], [5, 0, -1], [0, 0, 0], [0, 0, 0]]], [0.027006, 0.0, -1.796005, 0.0, False, 1]], [[[0.04, -0.02], 1.78, 80.0, 40.0, 0.03125, 3.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [5, 0, 2], [5, 0, -1], [0, 0, 0], [0, -3, 0], [0, 0, 0], [5, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 7]], [[[0.09, -0.1], 0.0, 0.5, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 1.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.082005, -0.091117, 1.388111, 0.0, False, -1]], [[[-0.1, -0.05], 0.0, 2.0, 5.0, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 0], [0, 0, 3.0], [0, 0, 0], [0, 0, 0]]], [-0.088419, -0.044209, 2.393944, 0.0, False, -1]], [[[0.09, 0.08], 0.0, 2.0, 5.0, 0.03125, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0.5], [0, 0, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, -0.5], [0, 0, 0], [0, 0, 0.5], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.323456, 0.0, False, 5]], [[[1.9, 0.51], -1.66, 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], [5, 0, -1], [0, 0, 0]]], [6.708099, 0.479217, -1.769724, 0.0, False, -1]], [[[-0.02, 0.02], -1.06, 0.5, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, -3, 2], [0, 1, -1], [0, 0, 2], [0, 0, 0]]], [-0.01894, -1.912189, 1.927089, 0.0, False, -1]], [[[0.04, -0.02], 1.1, 80.0, 40.0, 0.03125, 3.0, 0.5, 0.3, 0.0625, [[0, -3, 0], [0, 0, 0], [0, 0, 0], [5, 0, -1], [0, 0, 0], [0, 0, 0], [0, 1, -1], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 8]]], [[[[-0.05, 0.04], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, -3.0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 3.0], [0, 0, -3.0], [0, 0, -3.0]]], [-0.046618, 0.037294, -5.840587, 0.0, False, -1]], [[[-0.03, 0.05], -1.01, 80.0, 0.5, 0.03125, 8.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0.5], [0, 0, 0], [0, 0, 0], [5, 0, 2], [0, 0, 0], [0, 0, 0]]], [0.116618, 0.0, 1.909105, 0.0, False, 3]], [[[0.02, 0.03], -1.95, 2.0, 5.0, 0.015625, 3.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.03125, True, 4]], [[[-0.05, -0.02], 1.89, 0.5, 40.0, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 0, 0], [5, 0, -1], [1, 1, -1], [0, 0, 0], [1, 0, 2]]], [2.951277, 0.538484, 0.54504, 0.0, False, -1]], [[[-0.05, -0.03], 1.51, 0.5, 0.5, 0.03125, 3.0, 2.0, 0.3, 0.03125, [[0, 0, 0], [0, 0, 0], [5, 1, 0], [0, 1, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [2.524203, 1.35238, 1.824634, 0.0, False, -1]], [[[-0.01, 0.0], 0.0, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.125, [[0, 0, 1.5], [0, 0, -1.5], [0, 0, -1.5], [0, 0, 1.5], [0, 0, 1.5], [0, 0, 0], [0, 0, 0]]], [-0.008062, 0.0, 1.370126, 0.0, False, -1]], [[[-0.01, -0.03], 0.0, 0.5, 0.5, 0.0625, 8.0, 2.0, 0.3, 0.125, [[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.125, True, 1]], [[[-0.03, 0.08], 0.0, 2.0, 5.0, 0.03125, 8.0, 0.5, 0.3, 0.09375, [[0, 0, 0], [0, 0, 1.5], [0, 0, 0], [0, 0, 0]]], [-0.02354, 0.062773, 0.970367, 0.0, False, -1]]], [[[[-0.05, -0.05], -0.5, 0.5, 0.5, 0.03125, 3.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [1.513799, 2.430833, 0.021357, 0.0, False, -1]], [[[0.08, -0.08], 0.0, 0.5, 0.5, 0.0625, 8.0, 0.5, 1.0, 0.125, [[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.125, True, 5]], [[[4.96, -1.21], -1.7, 80.0, 0.5, 0.0625, 8.0, 2.0, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.003827, -0.000934, -1.503118, 0.0, False, -1]], [[[-4.04, -5.1], 0.88, 80.0, 40.0, 0.0625, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 1]], [[[5.74, -4.33], -1.41, 80.0, 0.5, 0.0625, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [-2, 8, 0.5], [0, 0, -1], [0, 0, 0], [5, 0, 0.5]]], [0.831913, 0.00608, -1.157167, 0.0, False, -1]], [[[0.03, -0.04], -1.19, 2.0, 5.0, 0.0625, 3.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, -3, 2]]], [2.572479, -1.543487, 1.52381, 0.0, False, 0]], [[[0.04, 0.03], 0.6, 2.0, 0.5, 0.015625, 3.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 1, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.030324, 0.82896, -0.387568, 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]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| case 0 | [0.0, 0.0, 0.0, 0.0625, True, 3] | [0.0, 0.0, 0.0, 0.0625, True, 3] | Passed |
| case 1 | [0.363645, 2.977879, 1.230769, 0.0, False, 0] | [0.363645, 2.977879, 1.230769, 0.0, False, 0] | Passed |
| case 2 | [0.853029, 2.384603, 1.618816, 0.0, False, -1] | [0.853029, 2.384603, 1.618816, 0.0, False, -1] | Passed |
| case 3 | [-0.065791, 0.084588, -1.387079, 0.0, False, -1] | [-0.065791, 0.084588, -1.387079, 0.0, False, -1] | Passed |
| case 4 | [0.0, 0.888889, 0.571429, 0.0625, False, 6] | [0.0, 0.888889, 0.571429, 0.0625, False, 6] | Passed |
| case 5 | [0.0, 0.0, 0.0, 0.125, True, 2] | [0.0, 0.0, 0.0, 0.125, True, 2] | Passed |
| case 6 | [0.0, 0.0, 0.0, 0.046875, True, 5] | [0.0, 0.0, 0.0, 0.046875, True, 5] | Passed |
| case 7 | [-5.900121, -5.032456, 0.634812, 0.0, False, -1] | [-5.900121, -5.032456, 0.634812, 0.0, False, -1] | Passed |
SHA-256 / d07e2297c1451c64244c3b9dcaa289078ce45e475413e987011f26b34d4cee86
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.213748+00:00.
Case digest / 49879f1c193b3ca2ec483f9484ddd3f5f945c962e6cf0d47ed997993132ed233