FA-87246 / Physics integrator stability / Open access
Maximum speed is enforced per axis · case 01
Diagonal motion exceeds the speed cap by up to sqrt(2) and changes direction.
ROOT CAUSE
vx and vy are clamped independently.
VERIFIED REPAIR
Scale the velocity vector uniformly by max_speed/|v|.
Unsuccessful approach: Comparing the squared speed against max_speed and scaling by it clamps the wrong magnitude.
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)
vx = max(-max_speed, min(max_speed, vx))
vy = max(-max_speed, min(max_speed, vy))
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.08, -1.72], -1.45, 20.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[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], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.09375, True, 4]], [[[0.04, -0.0], -0.97, 2.0, 0.5, 0.03125, 8.0, 2.0, 1.0, 0.09375, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 2]]], [4.705882, 0.0, 1.969231, 0.0, False, 2]], [[[0.0, -0.03], 0.45, 2.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 0.5], [0, 0, 0], [0, 0, 0], [0, -3, -1], [-2, -3, 0.5]]], [1.44462, -0.157813, -0.014456, 0.0, False, 1]], [[[-1.63, -2.88], 1.57, 2.0, 0.5, 0.0625, 3.0, 2.0, 1.0, 0.125, [[1, 0, 2], [0, 0, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 1, 2]]], [2.975484, -0.382746, 6.622321, 0.0, False, -1]], [[[-0.05, 0.05], -1.81, 20.0, 0.5, 0.03125, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, -1]]], [-0.011652, 0.011652, -2.712356, 0.0, False, -1]], [[[2.98, 0.96], 1.73, 80.0, 0.5, 0.015625, 3.0, 2.0, 0.3, 0.046875, [[1, -3, 0.5], [5, -3, 0.5], [0, 0, 0], [1, 8, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.032999, 0.112308, 1.607054, 0.0, False, -1]], [[[-0.01, -0.02], -0.81, 20.0, 0.5, 0.015625, 8.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, -3, 0.5], [0, 0, 0]]], [-1.160998, -1.741497, 0.492278, 0.0, False, 1]], [[[-3.19, -0.03], 1.71, 20.0, 0.5, 0.015625, 3.0, 0.5, 1.0, 0.015625, [[0, 8, -1], [0, 1, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-0.374853, 1.272803, 0.682904, 0.0, False, -1]]], [[[[0.01, -0.0], -0.96, 80.0, 5.0, 0.03125, 8.0, 2.0, 1.0, 0.0625, [[0, 8, 0.5], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 2]], [[[0.01, -0.01], 0.0, 0.5, 5.0, 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], [0, 0, -0.5], [0, 0, -0.5], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, -0.769069, 0.0, False, 4]], [[[0.04, -0.03], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 3.0], [0, 0, 0], [0, 0, 0], [0, 0, -3.0], [0, 0, -3.0], [0, 0, 0]]], [0.038175, -0.028631, -3.021299, 0.0, False, -1]], [[[3.34, -0.66], -0.98, 0.5, 40.0, 0.0625, 3.0, 0.5, 1.0, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 1, 2]]], [0.507526, 0.486174, 0.571276, 0.0, False, -1]], [[[1.56, 0.08], 1.64, 80.0, 0.5, 0.015625, 3.0, 2.0, 1.0, 0.03125, [[1, 1, 0], [0, 0, -1], [-2, 1, 2], [0, 0, 0], [5, -3, 0.5], [0, 8, 0.5], [0, 0, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.03453, 0.111847, 5.360948, 0.0, False, -1]], [[[-1.14, 3.18], 0.28, 0.5, 40.0, 0.015625, 3.0, 0.5, 0.3, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 8, 0.5], [0, 0, 0]]], [-0.275631, 2.963956, 0.229505, 0.0, False, -1]], [[[2.85, 5.4], -0.08, 2.0, 40.0, 0.03125, 3.0, 2.0, 1.0, 0.09375, [[0, 0, 0], [0, 0, 0], [-2, 8, 2], [0, 0, 0], [0, 0, 0.5], [0, 0, 0]]], [-0.162179, 2.495856, 0.176186, 0.0, False, -1]], [[[0.01, -0.03], -0.95, 80.0, 0.5, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 0, 0], [0, 0, 0], [-2, 0, 0], [0, 0, 0], [0, 0, 0], [0, -3, -1]]], [-0.001543, -0.500001, -1.759538, 0.0, False, -1]]], [[[[-0.04, -0.02], 0.3, 20.0, 5.0, 0.015625, 3.0, 0.5, 1.0, 0.046875, [[-2, -3, 0.5], [1, 8, 2], [0, 0, 0], [1, 1, 0.5], [0, 0, 0], [0, 0, 0], [5, 0, 2]]], [2.895539, 0.784764, 3.971203, 0.0, False, -1]], [[[3.0, -5.3], 1.47, 80.0, 5.0, 0.015625, 3.0, 0.5, 0.3, 0.015625, [[1, 1, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.156074, -0.167779, 2.568343, 0.0, False, -1]], [[[0.37, 2.2], 1.0, 0.5, 40.0, 0.015625, 3.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [1, 1, 2], [-2, -3, -1], [-2, 1, 0.5], [0, 0, 0]]], [-2.76632, 0.746665, 0.331382, 0.0, False, -1]], [[[-0.04, -0.0], -1.71, 2.0, 5.0, 0.015625, 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, 2], [0, 1, 0.5]]], [-0.031271, 0.969697, 1.247623, 0.0, False, -1]], [[[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]], [[[-5.52, 4.1], 1.73, 20.0, 0.5, 0.015625, 3.0, 2.0, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 1, -1]]], [-1.398045, 1.800308, 0.69783, 0.0, False, -1]], [[[0.04, -0.02], -1.17, 20.0, 5.0, 0.0625, 3.0, 0.5, 1.0, 0.125, [[0, 0, -1], [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, 3]], [[[-4.24, -3.71], -0.98, 0.5, 0.5, 0.015625, 3.0, 0.5, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 1, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-2.171567, -0.930771, -1.904644, 0.0, False, -1]]], [[[[3.11, -2.43], -1.43, 20.0, 5.0, 0.015625, 8.0, 2.0, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [1.048004, -0.818859, -1.058424, 0.0, False, -1]], [[[-0.05, -0.01], -0.3, 80.0, 40.0, 0.015625, 8.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [0, 0, 0], [5, 0, -1], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.015625, 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.64, 2.62], 0.2, 20.0, 40.0, 0.0625, 8.0, 0.5, 0.3, 0.1875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 8, -1], [0, 1, 2]]], [-0.40616, 2.070126, 0.490177, 0.0, False, -1]], [[[2.81, 0.72], 0.41, 0.5, 0.5, 0.015625, 8.0, 2.0, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 2], [1, 8, 0], [0, 0, 0], [0, 0, 0]]], [2.812816, 7.357073, 2.323955, 0.0, False, -1]], [[[-0.04, -0.04], 0.45, 20.0, 40.0, 0.0625, 3.0, 0.5, 0.3, 0.0625, [[0, 1, -1], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 0]], [[[-5.19, -5.87], 0.39, 2.0, 0.5, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-1.656694, -1.873756, 0.366548, 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]]], [[[[1.9, -3.3], -0.98, 2.0, 0.5, 0.015625, 3.0, 0.5, 0.3, 0.015625, [[0, 0, 0], [0, 0, 0], [1, 0, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [1.849229, -1.901692, -0.447124, 0.0, False, -1]], [[[-1.91, 5.0], 1.69, 20.0, 5.0, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 1, 0], [0, 0, 0], [0, 0, 0], [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, 0.0, 0.1875, True, 8]], [[[-0.05, 0.02], 0.0, 2.0, 5.0, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[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, -1.5], [0, 0, 1.5], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.09375, True, 7]], [[[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.0, 0.02], -1.7, 20.0, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.015625, [[-2, 8, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0.5]]], [3.135566, 2.702571, -1.151773, 0.0, False, -1]], [[[0.45, -2.24], -0.91, 0.5, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[1, -3, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0]]], [7.339549, -3.182927, 1.008391, 0.0, False, -1]], [[[-0.0, -0.01], -0.1, 0.5, 0.5, 0.0625, 3.0, 0.5, 0.3, 0.0625, [[0, -3, 0.5], [0, -3, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 1, 2]]], [0.969697, -1.448956, 2.633526, 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]]]]
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.09375, True, 4] | [0.0, 0.0, 0.0, 0.09375, True, 4] | Passed |
| case 1 | [4.705882, 0.0, 1.969231, 0.0, False, 2] | [4.705882, 0.0, 1.969231, 0.0, False, 2] | Passed |
| case 2 | [1.810188, 0.427097, -0.014456, 0.0, False, 1] | [1.44462, -0.157813, -0.014456, 0.0, False, 1] | Failed |
| case 3 | [3.0, -0.531729, 6.622321, 0.0, False, -1] | [2.975484, -0.382746, 6.622321, 0.0, False, -1] | Failed |
| case 4 | [-0.011652, 0.011652, -2.712356, 0.0, False, -1] | [-0.011652, 0.011652, -2.712356, 0.0, False, -1] | Passed |
| case 5 | [0.040464, 0.117055, 1.607054, 0.0, False, -1] | [0.032999, 0.112308, 1.607054, 0.0, False, -1] | Failed |
| case 6 | [-1.160998, -1.741497, 0.492278, 0.0, False, 1] | [-1.160998, -1.741497, 0.492278, 0.0, False, 1] | Passed |
| case 7 | [-0.819019, 1.326855, 0.682904, 0.0, False, -1] | [-0.374853, 1.272803, 0.682904, 0.0, False, -1] | Failed |
SHA-256 / 1c87bd8e21a1aab898bb93ace4c67788863887f8889f4e2c135178243e9cc4e8
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 = vx * vx + vy * 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.08, -1.72], -1.45, 20.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[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], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.09375, True, 4]], [[[0.04, -0.0], -0.97, 2.0, 0.5, 0.03125, 8.0, 2.0, 1.0, 0.09375, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 2]]], [4.705882, 0.0, 1.969231, 0.0, False, 2]], [[[0.0, -0.03], 0.45, 2.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 0.5], [0, 0, 0], [0, 0, 0], [0, -3, -1], [-2, -3, 0.5]]], [1.44462, -0.157813, -0.014456, 0.0, False, 1]], [[[-1.63, -2.88], 1.57, 2.0, 0.5, 0.0625, 3.0, 2.0, 1.0, 0.125, [[1, 0, 2], [0, 0, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 1, 2]]], [2.975484, -0.382746, 6.622321, 0.0, False, -1]], [[[-0.05, 0.05], -1.81, 20.0, 0.5, 0.03125, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, -1]]], [-0.011652, 0.011652, -2.712356, 0.0, False, -1]], [[[2.98, 0.96], 1.73, 80.0, 0.5, 0.015625, 3.0, 2.0, 0.3, 0.046875, [[1, -3, 0.5], [5, -3, 0.5], [0, 0, 0], [1, 8, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.032999, 0.112308, 1.607054, 0.0, False, -1]], [[[-0.01, -0.02], -0.81, 20.0, 0.5, 0.015625, 8.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, -3, 0.5], [0, 0, 0]]], [-1.160998, -1.741497, 0.492278, 0.0, False, 1]], [[[-3.19, -0.03], 1.71, 20.0, 0.5, 0.015625, 3.0, 0.5, 1.0, 0.015625, [[0, 8, -1], [0, 1, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-0.374853, 1.272803, 0.682904, 0.0, False, -1]]], [[[[0.01, -0.0], -0.96, 80.0, 5.0, 0.03125, 8.0, 2.0, 1.0, 0.0625, [[0, 8, 0.5], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 2]], [[[0.01, -0.01], 0.0, 0.5, 5.0, 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], [0, 0, -0.5], [0, 0, -0.5], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, -0.769069, 0.0, False, 4]], [[[0.04, -0.03], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 3.0], [0, 0, 0], [0, 0, 0], [0, 0, -3.0], [0, 0, -3.0], [0, 0, 0]]], [0.038175, -0.028631, -3.021299, 0.0, False, -1]], [[[3.34, -0.66], -0.98, 0.5, 40.0, 0.0625, 3.0, 0.5, 1.0, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 1, 2]]], [0.507526, 0.486174, 0.571276, 0.0, False, -1]], [[[1.56, 0.08], 1.64, 80.0, 0.5, 0.015625, 3.0, 2.0, 1.0, 0.03125, [[1, 1, 0], [0, 0, -1], [-2, 1, 2], [0, 0, 0], [5, -3, 0.5], [0, 8, 0.5], [0, 0, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.03453, 0.111847, 5.360948, 0.0, False, -1]], [[[-1.14, 3.18], 0.28, 0.5, 40.0, 0.015625, 3.0, 0.5, 0.3, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 8, 0.5], [0, 0, 0]]], [-0.275631, 2.963956, 0.229505, 0.0, False, -1]], [[[2.85, 5.4], -0.08, 2.0, 40.0, 0.03125, 3.0, 2.0, 1.0, 0.09375, [[0, 0, 0], [0, 0, 0], [-2, 8, 2], [0, 0, 0], [0, 0, 0.5], [0, 0, 0]]], [-0.162179, 2.495856, 0.176186, 0.0, False, -1]], [[[0.01, -0.03], -0.95, 80.0, 0.5, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 0, 0], [0, 0, 0], [-2, 0, 0], [0, 0, 0], [0, 0, 0], [0, -3, -1]]], [-0.001543, -0.500001, -1.759538, 0.0, False, -1]]], [[[[-0.04, -0.02], 0.3, 20.0, 5.0, 0.015625, 3.0, 0.5, 1.0, 0.046875, [[-2, -3, 0.5], [1, 8, 2], [0, 0, 0], [1, 1, 0.5], [0, 0, 0], [0, 0, 0], [5, 0, 2]]], [2.895539, 0.784764, 3.971203, 0.0, False, -1]], [[[3.0, -5.3], 1.47, 80.0, 5.0, 0.015625, 3.0, 0.5, 0.3, 0.015625, [[1, 1, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.156074, -0.167779, 2.568343, 0.0, False, -1]], [[[0.37, 2.2], 1.0, 0.5, 40.0, 0.015625, 3.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [1, 1, 2], [-2, -3, -1], [-2, 1, 0.5], [0, 0, 0]]], [-2.76632, 0.746665, 0.331382, 0.0, False, -1]], [[[-0.04, -0.0], -1.71, 2.0, 5.0, 0.015625, 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, 2], [0, 1, 0.5]]], [-0.031271, 0.969697, 1.247623, 0.0, False, -1]], [[[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]], [[[-5.52, 4.1], 1.73, 20.0, 0.5, 0.015625, 3.0, 2.0, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 1, -1]]], [-1.398045, 1.800308, 0.69783, 0.0, False, -1]], [[[0.04, -0.02], -1.17, 20.0, 5.0, 0.0625, 3.0, 0.5, 1.0, 0.125, [[0, 0, -1], [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, 3]], [[[-4.24, -3.71], -0.98, 0.5, 0.5, 0.015625, 3.0, 0.5, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 1, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-2.171567, -0.930771, -1.904644, 0.0, False, -1]]], [[[[3.11, -2.43], -1.43, 20.0, 5.0, 0.015625, 8.0, 2.0, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [1.048004, -0.818859, -1.058424, 0.0, False, -1]], [[[-0.05, -0.01], -0.3, 80.0, 40.0, 0.015625, 8.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [0, 0, 0], [5, 0, -1], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.015625, 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.64, 2.62], 0.2, 20.0, 40.0, 0.0625, 8.0, 0.5, 0.3, 0.1875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 8, -1], [0, 1, 2]]], [-0.40616, 2.070126, 0.490177, 0.0, False, -1]], [[[2.81, 0.72], 0.41, 0.5, 0.5, 0.015625, 8.0, 2.0, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 2], [1, 8, 0], [0, 0, 0], [0, 0, 0]]], [2.812816, 7.357073, 2.323955, 0.0, False, -1]], [[[-0.04, -0.04], 0.45, 20.0, 40.0, 0.0625, 3.0, 0.5, 0.3, 0.0625, [[0, 1, -1], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 0]], [[[-5.19, -5.87], 0.39, 2.0, 0.5, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-1.656694, -1.873756, 0.366548, 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]]], [[[[1.9, -3.3], -0.98, 2.0, 0.5, 0.015625, 3.0, 0.5, 0.3, 0.015625, [[0, 0, 0], [0, 0, 0], [1, 0, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [1.849229, -1.901692, -0.447124, 0.0, False, -1]], [[[-1.91, 5.0], 1.69, 20.0, 5.0, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 1, 0], [0, 0, 0], [0, 0, 0], [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, 0.0, 0.1875, True, 8]], [[[-0.05, 0.02], 0.0, 2.0, 5.0, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[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, -1.5], [0, 0, 1.5], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.09375, True, 7]], [[[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.0, 0.02], -1.7, 20.0, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.015625, [[-2, 8, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0.5]]], [3.135566, 2.702571, -1.151773, 0.0, False, -1]], [[[0.45, -2.24], -0.91, 0.5, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[1, -3, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0]]], [7.339549, -3.182927, 1.008391, 0.0, False, -1]], [[[-0.0, -0.01], -0.1, 0.5, 0.5, 0.0625, 3.0, 0.5, 0.3, 0.0625, [[0, -3, 0.5], [0, -3, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 1, 2]]], [0.969697, -1.448956, 2.633526, 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]]]]
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.09375, True, 4] | [0.0, 0.0, 0.0, 0.09375, True, 4] | Passed |
| case 1 | [1.7, 0.0, 1.969231, 0.0, False, 2] | [4.705882, 0.0, 1.969231, 0.0, False, 2] | Failed |
| case 2 | [-0.462088, -1.49614, -0.014456, 0.0, False, 1] | [1.44462, -0.157813, -0.014456, 0.0, False, 1] | Failed |
| case 3 | [0.693579, 0.043185, 6.622321, 0.0, False, -1] | [2.975484, -0.382746, 6.622321, 0.0, False, -1] | Failed |
| case 4 | [-0.011652, 0.011652, -2.712356, 0.0, False, -1] | [-0.011652, 0.011652, -2.712356, 0.0, False, -1] | Passed |
| case 5 | [0.005696, 0.032801, 1.607054, 0.0, False, -1] | [0.032999, 0.112308, 1.607054, 0.0, False, -1] | Failed |
| case 6 | [-1.160998, -1.741497, 0.492278, 0.0, False, 1] | [-1.160998, -1.741497, 0.492278, 0.0, False, 1] | Passed |
| case 7 | [0.0, 0.0, 0.0, 0.015625, True, 3] | [-0.374853, 1.272803, 0.682904, 0.0, False, -1] | Failed |
SHA-256 / 0e2833931e177187ad362c85b95ef3ef8dbbc0c084f5d9acf470ae63a663b7bf
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.08, -1.72], -1.45, 20.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[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], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.09375, True, 4]], [[[0.04, -0.0], -0.97, 2.0, 0.5, 0.03125, 8.0, 2.0, 1.0, 0.09375, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 2]]], [4.705882, 0.0, 1.969231, 0.0, False, 2]], [[[0.0, -0.03], 0.45, 2.0, 0.5, 0.03125, 8.0, 0.5, 1.0, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 8, 0.5], [0, 0, 0], [0, 0, 0], [0, -3, -1], [-2, -3, 0.5]]], [1.44462, -0.157813, -0.014456, 0.0, False, 1]], [[[-1.63, -2.88], 1.57, 2.0, 0.5, 0.0625, 3.0, 2.0, 1.0, 0.125, [[1, 0, 2], [0, 0, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 1, 2]]], [2.975484, -0.382746, 6.622321, 0.0, False, -1]], [[[-0.05, 0.05], -1.81, 20.0, 0.5, 0.03125, 8.0, 0.5, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, -1]]], [-0.011652, 0.011652, -2.712356, 0.0, False, -1]], [[[2.98, 0.96], 1.73, 80.0, 0.5, 0.015625, 3.0, 2.0, 0.3, 0.046875, [[1, -3, 0.5], [5, -3, 0.5], [0, 0, 0], [1, 8, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.032999, 0.112308, 1.607054, 0.0, False, -1]], [[[-0.01, -0.02], -0.81, 20.0, 0.5, 0.015625, 8.0, 2.0, 1.0, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, -3, 0.5], [0, 0, 0]]], [-1.160998, -1.741497, 0.492278, 0.0, False, 1]], [[[-3.19, -0.03], 1.71, 20.0, 0.5, 0.015625, 3.0, 0.5, 1.0, 0.015625, [[0, 8, -1], [0, 1, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-0.374853, 1.272803, 0.682904, 0.0, False, -1]]], [[[[0.01, -0.0], -0.96, 80.0, 5.0, 0.03125, 8.0, 2.0, 1.0, 0.0625, [[0, 8, 0.5], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 2]], [[[0.01, -0.01], 0.0, 0.5, 5.0, 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], [0, 0, -0.5], [0, 0, -0.5], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, -0.769069, 0.0, False, 4]], [[[0.04, -0.03], 0.0, 0.5, 0.5, 0.015625, 8.0, 0.5, 1.0, 0.03125, [[0, 0, 3.0], [0, 0, 0], [0, 0, 0], [0, 0, -3.0], [0, 0, -3.0], [0, 0, 0]]], [0.038175, -0.028631, -3.021299, 0.0, False, -1]], [[[3.34, -0.66], -0.98, 0.5, 40.0, 0.0625, 3.0, 0.5, 1.0, 0.125, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 1, 2]]], [0.507526, 0.486174, 0.571276, 0.0, False, -1]], [[[1.56, 0.08], 1.64, 80.0, 0.5, 0.015625, 3.0, 2.0, 1.0, 0.03125, [[1, 1, 0], [0, 0, -1], [-2, 1, 2], [0, 0, 0], [5, -3, 0.5], [0, 8, 0.5], [0, 0, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.03453, 0.111847, 5.360948, 0.0, False, -1]], [[[-1.14, 3.18], 0.28, 0.5, 40.0, 0.015625, 3.0, 0.5, 0.3, 0.03125, [[0, 0, 0], [0, 0, 0], [0, 8, 0.5], [0, 0, 0]]], [-0.275631, 2.963956, 0.229505, 0.0, False, -1]], [[[2.85, 5.4], -0.08, 2.0, 40.0, 0.03125, 3.0, 2.0, 1.0, 0.09375, [[0, 0, 0], [0, 0, 0], [-2, 8, 2], [0, 0, 0], [0, 0, 0.5], [0, 0, 0]]], [-0.162179, 2.495856, 0.176186, 0.0, False, -1]], [[[0.01, -0.03], -0.95, 80.0, 0.5, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 0, 0], [0, 0, 0], [-2, 0, 0], [0, 0, 0], [0, 0, 0], [0, -3, -1]]], [-0.001543, -0.500001, -1.759538, 0.0, False, -1]]], [[[[-0.04, -0.02], 0.3, 20.0, 5.0, 0.015625, 3.0, 0.5, 1.0, 0.046875, [[-2, -3, 0.5], [1, 8, 2], [0, 0, 0], [1, 1, 0.5], [0, 0, 0], [0, 0, 0], [5, 0, 2]]], [2.895539, 0.784764, 3.971203, 0.0, False, -1]], [[[3.0, -5.3], 1.47, 80.0, 5.0, 0.015625, 3.0, 0.5, 0.3, 0.015625, [[1, 1, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [0.156074, -0.167779, 2.568343, 0.0, False, -1]], [[[0.37, 2.2], 1.0, 0.5, 40.0, 0.015625, 3.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [1, 1, 2], [-2, -3, -1], [-2, 1, 0.5], [0, 0, 0]]], [-2.76632, 0.746665, 0.331382, 0.0, False, -1]], [[[-0.04, -0.0], -1.71, 2.0, 5.0, 0.015625, 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, 2], [0, 1, 0.5]]], [-0.031271, 0.969697, 1.247623, 0.0, False, -1]], [[[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]], [[[-5.52, 4.1], 1.73, 20.0, 0.5, 0.015625, 3.0, 2.0, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 1, -1]]], [-1.398045, 1.800308, 0.69783, 0.0, False, -1]], [[[0.04, -0.02], -1.17, 20.0, 5.0, 0.0625, 3.0, 0.5, 1.0, 0.125, [[0, 0, -1], [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, 3]], [[[-4.24, -3.71], -0.98, 0.5, 0.5, 0.015625, 3.0, 0.5, 0.3, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 1, -1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-2.171567, -0.930771, -1.904644, 0.0, False, -1]]], [[[[3.11, -2.43], -1.43, 20.0, 5.0, 0.015625, 8.0, 2.0, 1.0, 0.046875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [1.048004, -0.818859, -1.058424, 0.0, False, -1]], [[[-0.05, -0.01], -0.3, 80.0, 40.0, 0.015625, 8.0, 2.0, 0.3, 0.015625, [[0, 0, 0], [0, 0, 0], [5, 0, -1], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.015625, 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.64, 2.62], 0.2, 20.0, 40.0, 0.0625, 8.0, 0.5, 0.3, 0.1875, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [-2, 8, -1], [0, 1, 2]]], [-0.40616, 2.070126, 0.490177, 0.0, False, -1]], [[[2.81, 0.72], 0.41, 0.5, 0.5, 0.015625, 8.0, 2.0, 1.0, 0.015625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 1, 2], [1, 8, 0], [0, 0, 0], [0, 0, 0]]], [2.812816, 7.357073, 2.323955, 0.0, False, -1]], [[[-0.04, -0.04], 0.45, 20.0, 40.0, 0.0625, 3.0, 0.5, 0.3, 0.0625, [[0, 1, -1], [0, 0, 0], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.0625, True, 0]], [[[-5.19, -5.87], 0.39, 2.0, 0.5, 0.03125, 3.0, 2.0, 0.3, 0.0625, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [-1.656694, -1.873756, 0.366548, 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]]], [[[[1.9, -3.3], -0.98, 2.0, 0.5, 0.015625, 3.0, 0.5, 0.3, 0.015625, [[0, 0, 0], [0, 0, 0], [1, 0, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]], [1.849229, -1.901692, -0.447124, 0.0, False, -1]], [[[-1.91, 5.0], 1.69, 20.0, 5.0, 0.0625, 3.0, 2.0, 0.3, 0.1875, [[0, 1, 0], [0, 0, 0], [0, 0, 0], [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, 0.0, 0.1875, True, 8]], [[[-0.05, 0.02], 0.0, 2.0, 5.0, 0.03125, 8.0, 0.5, 1.0, 0.09375, [[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, -1.5], [0, 0, 1.5], [0, 0, 0]]], [0.0, 0.0, 0.0, 0.09375, True, 7]], [[[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.0, 0.02], -1.7, 20.0, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.015625, [[-2, 8, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0.5]]], [3.135566, 2.702571, -1.151773, 0.0, False, -1]], [[[0.45, -2.24], -0.91, 0.5, 0.5, 0.015625, 8.0, 2.0, 0.3, 0.046875, [[1, -3, 2], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0], [0, 0, 0], [0, 0, 0], [5, 0, 0]]], [7.339549, -3.182927, 1.008391, 0.0, False, -1]], [[[-0.0, -0.01], -0.1, 0.5, 0.5, 0.0625, 3.0, 0.5, 0.3, 0.0625, [[0, -3, 0.5], [0, -3, 0.5], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 1, 2]]], [0.969697, -1.448956, 2.633526, 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]]]]
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.09375, True, 4] | [0.0, 0.0, 0.0, 0.09375, True, 4] | Passed |
| case 1 | [4.705882, 0.0, 1.969231, 0.0, False, 2] | [4.705882, 0.0, 1.969231, 0.0, False, 2] | Passed |
| case 2 | [1.44462, -0.157813, -0.014456, 0.0, False, 1] | [1.44462, -0.157813, -0.014456, 0.0, False, 1] | Passed |
| case 3 | [2.975484, -0.382746, 6.622321, 0.0, False, -1] | [2.975484, -0.382746, 6.622321, 0.0, False, -1] | Passed |
| case 4 | [-0.011652, 0.011652, -2.712356, 0.0, False, -1] | [-0.011652, 0.011652, -2.712356, 0.0, False, -1] | Passed |
| case 5 | [0.032999, 0.112308, 1.607054, 0.0, False, -1] | [0.032999, 0.112308, 1.607054, 0.0, False, -1] | Passed |
| case 6 | [-1.160998, -1.741497, 0.492278, 0.0, False, 1] | [-1.160998, -1.741497, 0.492278, 0.0, False, 1] | Passed |
| case 7 | [-0.374853, 1.272803, 0.682904, 0.0, False, -1] | [-0.374853, 1.272803, 0.682904, 0.0, False, -1] | Passed |
SHA-256 / a3dee50282db3ae4b7d3803c6407d6bf34c8eb6dde8475e52f34cc7e325be74d
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.035910+00:00.
Case digest / f680d637e0b9f508fbb180e29a71dacbe1fad346de6616dd1d1d59f6b9f80916