FA-87286 / Physics integrator stability / Open access
Crossing time interpolates from the wrong endpoint · case 01
Crossing times jitter by up to one sample and the period estimate is noisy.
ROOT CAUSE
frac uses b/(b-a) instead of -a/(b-a).
VERIFIED REPAIR
The zero lies at fraction -a/(b-a) from the earlier sample.
Unsuccessful approach: Always using the midpoint discards the interpolation.
Case contract
solve(xs, dt, omega): integrator frequency diagnostic. Upward crossings are samples with x[i-1]<0<=x[i], timed by linear interpolation. Period is the mean interval (last-first)/(count-1); relative error vs 2*pi/omega. Fewer than two crossings gives [None, count, None]. Return [period, count, error] rounded to 6.
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(xs, dt, omega):
ts = []
for i in range(1, len(xs)):
a, b = xs[i - 1], xs[i]
if a < 0 <= b:
frac = b / (b - a)
ts.append((i - 1 + frac) * dt)
if len(ts) < 2:
return [None, len(ts), None]
period = (ts[-1] - ts[0]) / (len(ts) - 1)
ref = 2 * math.pi / omega
return [round(period, 6), len(ts), round((period - ref) / ref, 6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[0.991, 0.747, -0.008, -0.76, -0.974, -0.491, 0.39, 0.919, 0.839, 0.259, -0.593, -0.991, -0.532, 0.146, 0.862, 0.95, 0.467, -0.405, -0.979, -0.77, -0.114, 0.58, 0.959], 0.25, 3.422], [1.825868, 3, -0.005581]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.947, 0.763, 0.488, 0.143, -0.251, -0.593, -0.845, -0.973, -0.992, -0.844, -0.617, -0.277, 0.09, 0.436, 0.738, 0.94, 0.994, 0.946, 0.691, 0.468, 0.118, -0.233, -0.656, -0.777, -0.969, -0.964, -0.869, -0.687, -0.238, 0.001, 0.284, 0.644, 0.935, 0.997, 0.905, 0.731, 0.617], 0.125, 2.921], [2.155131, 2, 0.001902]], [[[0.998, 0.325, -0.659, -0.774, -0.014, 0.738, 0.491, -0.305, -0.666, -0.273, 0.426, 0.518, 0.137, -0.453, 0.0, 0.02, 0.439, 0.135, -0.242, -0.368, 0.032, 0.282, 0.295], 0.25, 4.593], [1.325115, 4, -0.031343]], [[[0.24, -0.167, -0.533, 0.0, -0.963, -0.942, -0.767, -0.48, -0.111, 0.29], 0.125, 3.21], [0.659601, 2, -0.663018]], [[[0.939, 0.955, 0.969, 0.977, 0.984, 0.986, 0.985, 0.981, 0.973, 0.961, 0.948, 0.932, 0.912, 0.882, 0.862, 0.828, 0.802, 0.765, 0.721, 0.674, 0.652, 0.607, 0.551, 0.488, 0.448, 0.4, 0.352, 0.312, 0.234, 0.177, 0.113, 0.057, 0.006], 0.05, 1.166], [None, 0, None]], [[[0.882, 0.859, 0.044, -0.82, -0.884, -0.153, 0.751, 0.87, 0.294, -0.687, -0.881, -0.237, 0.571, 0.847, 0.215], 0.25, 3.99], [1.531017, 2, -0.027761]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.333, 0.928, -0.086, 0.0, -0.164, 0.766, 0.336, -0.578, -0.438, 0.396, 0.387, -0.385, -0.494, 0.117], 0.25, 5.715], [0.817376, 4, -0.256539]], [[[0.833, 0.587, 0.253, -0.107, -0.435, -0.725, -0.918, -1.0, -0.941, -0.758, -0.506, -0.16, 0.185, 0.493, 0.808, 0.969, 0.996, 0.917, 0.721, 0.334, 0.017, -0.252, -0.634, -0.831, -0.956, -0.988, -0.915, -0.721, -0.352, -0.084, 0.469, 0.0, 0.922], 0.25, 1.417], [4.422033, 2, -0.002732]], [[[-0.447, -0.874, -0.985, -0.736, -0.283, 0.363, 0.778, 0.966, 0.775], 0.1, 5.946], [None, 1, None]], [[[0.556, -0.046, -0.612, -0.939, -0.915, -0.494, 0.071, 0.565, 0.922, 0.871, 0.448, -0.021, -0.606, -0.864, -0.867, -0.45, 0.027], 0.125, 4.972], [1.258632, 2, -0.004021]], [[[0.221, 0.117, 0.014, -0.083, -0.18, -0.269, -0.351, -0.412, -0.477, -0.546, -0.588, -0.634, -0.663, -0.691, -0.713, -0.719, -0.719, -0.712, -0.695, -0.675, -0.648, -0.606, -0.565, -0.525, -0.465, -0.424, -0.382, -0.319, 0.0, -0.186, -0.134, -0.057, -0.026, 0.046, 0.083, 0.103], 0.1, 1.021], [0.436111, 2, -0.929133]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.412, 0.92, -0.07, -0.858, -0.198, 0.741, 0.417, -0.491, -0.514, 0.429, 0.527, -0.132, -0.545, -0.09], 0.25, 5.568], [1.083552, 2, -0.039784]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.395, 0.872, 0.925, 0.582, -0.055, -0.574, -0.849, -0.705, -0.29, 0.316, 0.674, 0.756, 0.481, -0.092, -0.43, -0.681, -0.565, -0.266, 0.299, 0.476, 0.606, 0.406, 0.034], 0.125, 5.467], [1.124031, 2, -0.02198]], [[[-0.978, -0.935, -0.647, -0.219, 0.273, 0.627, 0.851, 0.845, 0.578, 0.199, -0.218, -0.558, -0.758, -0.757, -0.557, -0.271, 0.131, 0.394, 0.678, 0.682, 0.573, 0.19, -0.153, -0.339, -0.535, -0.606, -0.51, -0.307, -0.007, 0.376, 0.515], 0.1, 5.083], [1.228658, 3, -0.006035]], [[[-0.587, -0.689, -0.77, -0.827, -0.858, -0.872, -0.861, -0.828, -0.78, -0.719], 0.125, 1.237], [None, 0, None]], [[[-0.115, 0.556, 0.928, 0.805, 0.28, -0.292, -0.751, -0.806, -0.452, 0.045, 0.544, 0.759, 0.561, -0.002, -0.48, -0.638, -0.615, -0.157, 0.139, 0.55, 0.573, 0.396], 0.125, 5.717], [1.084939, 3, -0.012826]], [[[-1.0, -0.927, -0.721, -0.406, -0.06, 0.305, 0.65, 0.845, 0.954, 0.928, 0.753, 0.457, 0.066, -0.172, -0.576, -0.762, -0.9, -0.902, -0.794], 0.1, 3.771], [None, 1, None]], [[[0.912, 0.995, 0.892, 0.616, 0.241, -0.192, -0.525, -0.837, -0.958, -0.893, -0.667, -0.387, -0.005, 0.43, 0.763, 0.899, 0.903, 0.757, 0.333, 0.06, -0.328, -0.681, -0.854, -0.89, -0.78, -0.398, -0.043, 0.299, 0.625, 0.818, 0.858, 0.78], 0.1, 4.27], [1.411424, 2, -0.040808]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.976, 0.605, -0.025, -0.596, -0.886, -0.785, -0.372, 0.266, 0.693, 0.798, 0.602, 0.064, -0.309, -0.661, -0.683, -0.343, 0.122, 0.493, 0.637, 0.546, 0.136, -0.304, -0.527], 0.125, 5.356], [1.14432, 2, -0.024543]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-0.999, -0.097, 0.877, 0.336, -0.648, -0.551, 0.374, 0.634], 0.25, 5.524], [1.124022, 2, -0.011792]], [[[-0.7, -0.579, -0.447, -0.299, -0.148, 0.0, 0.129, 0.281, 0.391, 0.518, 0.612, 0.708, 0.784, 0.827, 0.847, 0.86], 0.05, 3.021], [None, 1, None]], [[[0.446, -0.255, -0.799, -0.921, -0.57, -0.003, 0.55, 0.838, 0.0, 0.178, -0.29, -0.676, -0.721, -0.282, 0.142, 0.554, 0.66, 0.386, 0.005, -0.48, -0.578], 0.125, 5.696], [1.082459, 2, -0.018701]], [[[-0.231, -0.55, -0.794, -0.948, -0.973, -0.882, -0.679, -0.37, -0.087, 0.286, 0.592, 0.772, 0.894, 0.92, 0.817, 0.649, 0.285, -0.034, -0.335, -0.62, -0.766, -0.843, -0.849, -0.777, -0.49, -0.258, 0.075, 0.258, 0.472], 0.125, 2.796], [2.192691, 2, -0.024258]], [[[-0.521, 0.648, 0.908, -0.081, -0.924, -0.438, 0.631, 0.856, -0.06, -0.87, -0.339, 0.448, 0.763, -0.265, -0.826, -0.318, 0.437, 0.614, -0.009, -0.765, -0.178, 0.555, 0.683, -0.27, -0.74, -0.565, 0.424, 0.558, -0.347, -0.684, -0.493, 0.0, 0.67, -0.184, -0.635, -0.564, 0.286, 0.486], 0.25, 4.956], [1.25778, 8, -0.007898]]], [[[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-0.756, -0.988, -0.915, -0.562, 0.023, 0.53, 0.911, 0.994, 0.781, 0.245, -0.204, -0.763, -0.984, -0.956, -0.557, 0.012, 0.516, 0.909, 0.999, 0.685, 0.0, -0.061, -0.761, -0.995, -0.915, -0.627, -0.057, 0.515, 0.84, 1.0, 0.691, 0.112, -0.375, -0.682, -0.925], 0.25, 2.241], [2.767371, 3, -0.012972]], [[[0.998, 0.916, 0.758, 0.537, 0.296, 0.003, -0.245, -0.465, -0.646, -0.77, -0.81, -0.782, -0.683, -0.535, -0.384, -0.147, 0.066, 0.239, 0.444, 0.557, 0.65, 0.652, 0.626, 0.48, 0.364, 0.221, 0.017, 0.0, -0.301, -0.407, -0.517, -0.538, -0.526, -0.441, -0.396, -0.227], 0.1, 2.934], [None, 1, None]], [[[0.944, 0.968, 0.984, 0.991, 0.989, 0.979, 0.961, 0.933, 0.898, 0.865, 0.813, 0.763, 0.704, 0.618, 0.553, 0.484, 0.401, 0.327, 0.227, 0.135, 0.051, -0.013, -0.13, -0.226, -0.307, -0.392, -0.453, -0.546, -0.594, -0.654, -0.723, -0.767, -0.794, -0.846], 0.05, 1.823], [None, 0, None]], [[[0.982, 0.4, -0.784, -0.716, 0.402, 0.908, -0.054, -0.873, -0.397, 0.762, 0.596, -0.454, -0.79, -0.186, 0.779, 0.266, -0.758, -0.524, 0.328, 0.754, 0.181, -0.763, -0.206, 0.424, 0.646, -0.347, -0.718, -0.358, 0.559, 0.417, -0.22, -0.52], 0.25, 5.298], [1.187499, 6, 0.001302]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.197, 0.629, 0.894, 0.931, 0.721, 0.337, -0.04, -0.487, -0.769, -0.835, -0.693, -0.395, -0.033, 0.344, 0.623, 0.735, 0.667, 0.416, 0.155, -0.22, -0.462, -0.655, -0.581, -0.44, -0.248, 0.086, 0.346, 0.559, 0.525, 0.413, 0.174, -0.108], 0.1, 4.976], [1.265498, 2, 0.002218]], [[[0.087, -0.455, -0.851, -1.0, -0.844, -0.457, 0.065, 0.639, 0.943, 0.987, 0.729, 0.237, -0.201, -0.715, -0.967, -0.952, -0.534, -0.168, 0.416, 0.856, 0.992, 0.853, 0.507, -0.102, -0.477, -0.977, -0.926, -0.677, -0.241, 0.111, 0.644, 0.927, 0.958, 0.481], 0.25, 2.185], [2.851148, 3, -0.008503]]]]
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 | [1.924132, 3, 0.047937] | [1.825868, 3, -0.005581] | Failed |
| case 1 | [1.0, 2, -0.5] | [1.0, 2, -0.5] | Passed |
| case 2 | [2.094869, 2, -0.026113] | [2.155131, 2, 0.001902] | Failed |
| case 3 | [1.174885, 4, -0.141161] | [1.325115, 4, -0.031343] | Failed |
| case 4 | [0.840399, 2, -0.570651] | [0.659601, 2, -0.663018] | Failed |
| case 5 | [None, 0, None] | [None, 0, None] | Passed |
| case 6 | [1.468983, 2, -0.067155] | [1.531017, 2, -0.027761] | Failed |
| case 7 | [1.0, 2, -0.5] | [1.0, 2, -0.5] | Passed |
SHA-256 / 34641eb7acfeda0fa0f2df86b7b5ff0ab84bb005fd766d3e2b596d71015be3cb
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(xs, dt, omega):
ts = []
for i in range(1, len(xs)):
a, b = xs[i - 1], xs[i]
if a < 0 <= b:
frac = 0.5
ts.append((i - 1 + frac) * dt)
if len(ts) < 2:
return [None, len(ts), None]
period = (ts[-1] - ts[0]) / (len(ts) - 1)
ref = 2 * math.pi / omega
return [round(period, 6), len(ts), round((period - ref) / ref, 6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[0.991, 0.747, -0.008, -0.76, -0.974, -0.491, 0.39, 0.919, 0.839, 0.259, -0.593, -0.991, -0.532, 0.146, 0.862, 0.95, 0.467, -0.405, -0.979, -0.77, -0.114, 0.58, 0.959], 0.25, 3.422], [1.825868, 3, -0.005581]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.947, 0.763, 0.488, 0.143, -0.251, -0.593, -0.845, -0.973, -0.992, -0.844, -0.617, -0.277, 0.09, 0.436, 0.738, 0.94, 0.994, 0.946, 0.691, 0.468, 0.118, -0.233, -0.656, -0.777, -0.969, -0.964, -0.869, -0.687, -0.238, 0.001, 0.284, 0.644, 0.935, 0.997, 0.905, 0.731, 0.617], 0.125, 2.921], [2.155131, 2, 0.001902]], [[[0.998, 0.325, -0.659, -0.774, -0.014, 0.738, 0.491, -0.305, -0.666, -0.273, 0.426, 0.518, 0.137, -0.453, 0.0, 0.02, 0.439, 0.135, -0.242, -0.368, 0.032, 0.282, 0.295], 0.25, 4.593], [1.325115, 4, -0.031343]], [[[0.24, -0.167, -0.533, 0.0, -0.963, -0.942, -0.767, -0.48, -0.111, 0.29], 0.125, 3.21], [0.659601, 2, -0.663018]], [[[0.939, 0.955, 0.969, 0.977, 0.984, 0.986, 0.985, 0.981, 0.973, 0.961, 0.948, 0.932, 0.912, 0.882, 0.862, 0.828, 0.802, 0.765, 0.721, 0.674, 0.652, 0.607, 0.551, 0.488, 0.448, 0.4, 0.352, 0.312, 0.234, 0.177, 0.113, 0.057, 0.006], 0.05, 1.166], [None, 0, None]], [[[0.882, 0.859, 0.044, -0.82, -0.884, -0.153, 0.751, 0.87, 0.294, -0.687, -0.881, -0.237, 0.571, 0.847, 0.215], 0.25, 3.99], [1.531017, 2, -0.027761]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.333, 0.928, -0.086, 0.0, -0.164, 0.766, 0.336, -0.578, -0.438, 0.396, 0.387, -0.385, -0.494, 0.117], 0.25, 5.715], [0.817376, 4, -0.256539]], [[[0.833, 0.587, 0.253, -0.107, -0.435, -0.725, -0.918, -1.0, -0.941, -0.758, -0.506, -0.16, 0.185, 0.493, 0.808, 0.969, 0.996, 0.917, 0.721, 0.334, 0.017, -0.252, -0.634, -0.831, -0.956, -0.988, -0.915, -0.721, -0.352, -0.084, 0.469, 0.0, 0.922], 0.25, 1.417], [4.422033, 2, -0.002732]], [[[-0.447, -0.874, -0.985, -0.736, -0.283, 0.363, 0.778, 0.966, 0.775], 0.1, 5.946], [None, 1, None]], [[[0.556, -0.046, -0.612, -0.939, -0.915, -0.494, 0.071, 0.565, 0.922, 0.871, 0.448, -0.021, -0.606, -0.864, -0.867, -0.45, 0.027], 0.125, 4.972], [1.258632, 2, -0.004021]], [[[0.221, 0.117, 0.014, -0.083, -0.18, -0.269, -0.351, -0.412, -0.477, -0.546, -0.588, -0.634, -0.663, -0.691, -0.713, -0.719, -0.719, -0.712, -0.695, -0.675, -0.648, -0.606, -0.565, -0.525, -0.465, -0.424, -0.382, -0.319, 0.0, -0.186, -0.134, -0.057, -0.026, 0.046, 0.083, 0.103], 0.1, 1.021], [0.436111, 2, -0.929133]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.412, 0.92, -0.07, -0.858, -0.198, 0.741, 0.417, -0.491, -0.514, 0.429, 0.527, -0.132, -0.545, -0.09], 0.25, 5.568], [1.083552, 2, -0.039784]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.395, 0.872, 0.925, 0.582, -0.055, -0.574, -0.849, -0.705, -0.29, 0.316, 0.674, 0.756, 0.481, -0.092, -0.43, -0.681, -0.565, -0.266, 0.299, 0.476, 0.606, 0.406, 0.034], 0.125, 5.467], [1.124031, 2, -0.02198]], [[[-0.978, -0.935, -0.647, -0.219, 0.273, 0.627, 0.851, 0.845, 0.578, 0.199, -0.218, -0.558, -0.758, -0.757, -0.557, -0.271, 0.131, 0.394, 0.678, 0.682, 0.573, 0.19, -0.153, -0.339, -0.535, -0.606, -0.51, -0.307, -0.007, 0.376, 0.515], 0.1, 5.083], [1.228658, 3, -0.006035]], [[[-0.587, -0.689, -0.77, -0.827, -0.858, -0.872, -0.861, -0.828, -0.78, -0.719], 0.125, 1.237], [None, 0, None]], [[[-0.115, 0.556, 0.928, 0.805, 0.28, -0.292, -0.751, -0.806, -0.452, 0.045, 0.544, 0.759, 0.561, -0.002, -0.48, -0.638, -0.615, -0.157, 0.139, 0.55, 0.573, 0.396], 0.125, 5.717], [1.084939, 3, -0.012826]], [[[-1.0, -0.927, -0.721, -0.406, -0.06, 0.305, 0.65, 0.845, 0.954, 0.928, 0.753, 0.457, 0.066, -0.172, -0.576, -0.762, -0.9, -0.902, -0.794], 0.1, 3.771], [None, 1, None]], [[[0.912, 0.995, 0.892, 0.616, 0.241, -0.192, -0.525, -0.837, -0.958, -0.893, -0.667, -0.387, -0.005, 0.43, 0.763, 0.899, 0.903, 0.757, 0.333, 0.06, -0.328, -0.681, -0.854, -0.89, -0.78, -0.398, -0.043, 0.299, 0.625, 0.818, 0.858, 0.78], 0.1, 4.27], [1.411424, 2, -0.040808]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.976, 0.605, -0.025, -0.596, -0.886, -0.785, -0.372, 0.266, 0.693, 0.798, 0.602, 0.064, -0.309, -0.661, -0.683, -0.343, 0.122, 0.493, 0.637, 0.546, 0.136, -0.304, -0.527], 0.125, 5.356], [1.14432, 2, -0.024543]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-0.999, -0.097, 0.877, 0.336, -0.648, -0.551, 0.374, 0.634], 0.25, 5.524], [1.124022, 2, -0.011792]], [[[-0.7, -0.579, -0.447, -0.299, -0.148, 0.0, 0.129, 0.281, 0.391, 0.518, 0.612, 0.708, 0.784, 0.827, 0.847, 0.86], 0.05, 3.021], [None, 1, None]], [[[0.446, -0.255, -0.799, -0.921, -0.57, -0.003, 0.55, 0.838, 0.0, 0.178, -0.29, -0.676, -0.721, -0.282, 0.142, 0.554, 0.66, 0.386, 0.005, -0.48, -0.578], 0.125, 5.696], [1.082459, 2, -0.018701]], [[[-0.231, -0.55, -0.794, -0.948, -0.973, -0.882, -0.679, -0.37, -0.087, 0.286, 0.592, 0.772, 0.894, 0.92, 0.817, 0.649, 0.285, -0.034, -0.335, -0.62, -0.766, -0.843, -0.849, -0.777, -0.49, -0.258, 0.075, 0.258, 0.472], 0.125, 2.796], [2.192691, 2, -0.024258]], [[[-0.521, 0.648, 0.908, -0.081, -0.924, -0.438, 0.631, 0.856, -0.06, -0.87, -0.339, 0.448, 0.763, -0.265, -0.826, -0.318, 0.437, 0.614, -0.009, -0.765, -0.178, 0.555, 0.683, -0.27, -0.74, -0.565, 0.424, 0.558, -0.347, -0.684, -0.493, 0.0, 0.67, -0.184, -0.635, -0.564, 0.286, 0.486], 0.25, 4.956], [1.25778, 8, -0.007898]]], [[[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-0.756, -0.988, -0.915, -0.562, 0.023, 0.53, 0.911, 0.994, 0.781, 0.245, -0.204, -0.763, -0.984, -0.956, -0.557, 0.012, 0.516, 0.909, 0.999, 0.685, 0.0, -0.061, -0.761, -0.995, -0.915, -0.627, -0.057, 0.515, 0.84, 1.0, 0.691, 0.112, -0.375, -0.682, -0.925], 0.25, 2.241], [2.767371, 3, -0.012972]], [[[0.998, 0.916, 0.758, 0.537, 0.296, 0.003, -0.245, -0.465, -0.646, -0.77, -0.81, -0.782, -0.683, -0.535, -0.384, -0.147, 0.066, 0.239, 0.444, 0.557, 0.65, 0.652, 0.626, 0.48, 0.364, 0.221, 0.017, 0.0, -0.301, -0.407, -0.517, -0.538, -0.526, -0.441, -0.396, -0.227], 0.1, 2.934], [None, 1, None]], [[[0.944, 0.968, 0.984, 0.991, 0.989, 0.979, 0.961, 0.933, 0.898, 0.865, 0.813, 0.763, 0.704, 0.618, 0.553, 0.484, 0.401, 0.327, 0.227, 0.135, 0.051, -0.013, -0.13, -0.226, -0.307, -0.392, -0.453, -0.546, -0.594, -0.654, -0.723, -0.767, -0.794, -0.846], 0.05, 1.823], [None, 0, None]], [[[0.982, 0.4, -0.784, -0.716, 0.402, 0.908, -0.054, -0.873, -0.397, 0.762, 0.596, -0.454, -0.79, -0.186, 0.779, 0.266, -0.758, -0.524, 0.328, 0.754, 0.181, -0.763, -0.206, 0.424, 0.646, -0.347, -0.718, -0.358, 0.559, 0.417, -0.22, -0.52], 0.25, 5.298], [1.187499, 6, 0.001302]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.197, 0.629, 0.894, 0.931, 0.721, 0.337, -0.04, -0.487, -0.769, -0.835, -0.693, -0.395, -0.033, 0.344, 0.623, 0.735, 0.667, 0.416, 0.155, -0.22, -0.462, -0.655, -0.581, -0.44, -0.248, 0.086, 0.346, 0.559, 0.525, 0.413, 0.174, -0.108], 0.1, 4.976], [1.265498, 2, 0.002218]], [[[0.087, -0.455, -0.851, -1.0, -0.844, -0.457, 0.065, 0.639, 0.943, 0.987, 0.729, 0.237, -0.201, -0.715, -0.967, -0.952, -0.534, -0.168, 0.416, 0.856, 0.992, 0.853, 0.507, -0.102, -0.477, -0.977, -0.926, -0.677, -0.241, 0.111, 0.644, 0.927, 0.958, 0.481], 0.25, 2.185], [2.851148, 3, -0.008503]]]]
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 | [1.875, 3, 0.021178] | [1.825868, 3, -0.005581] | Failed |
| case 1 | [1.0, 2, -0.5] | [1.0, 2, -0.5] | Passed |
| case 2 | [2.125, 2, -0.012105] | [2.155131, 2, 0.001902] | Failed |
| case 3 | [1.25, 4, -0.086252] | [1.325115, 4, -0.031343] | Failed |
| case 4 | [0.75, 2, -0.616834] | [0.659601, 2, -0.663018] | Failed |
| case 5 | [None, 0, None] | [None, 0, None] | Passed |
| case 6 | [1.5, 2, -0.047458] | [1.531017, 2, -0.027761] | Failed |
| case 7 | [1.0, 2, -0.5] | [1.0, 2, -0.5] | Passed |
SHA-256 / 31251e4b1a2d8071c99660f751d114c8b82cd1eb0856acc687a5bbdd84806407
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(xs, dt, omega):
ts = []
for i in range(1, len(xs)):
a, b = xs[i - 1], xs[i]
if a < 0 <= b:
frac = -a / (b - a)
ts.append((i - 1 + frac) * dt)
if len(ts) < 2:
return [None, len(ts), None]
period = (ts[-1] - ts[0]) / (len(ts) - 1)
ref = 2 * math.pi / omega
return [round(period, 6), len(ts), round((period - ref) / ref, 6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[0.991, 0.747, -0.008, -0.76, -0.974, -0.491, 0.39, 0.919, 0.839, 0.259, -0.593, -0.991, -0.532, 0.146, 0.862, 0.95, 0.467, -0.405, -0.979, -0.77, -0.114, 0.58, 0.959], 0.25, 3.422], [1.825868, 3, -0.005581]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.947, 0.763, 0.488, 0.143, -0.251, -0.593, -0.845, -0.973, -0.992, -0.844, -0.617, -0.277, 0.09, 0.436, 0.738, 0.94, 0.994, 0.946, 0.691, 0.468, 0.118, -0.233, -0.656, -0.777, -0.969, -0.964, -0.869, -0.687, -0.238, 0.001, 0.284, 0.644, 0.935, 0.997, 0.905, 0.731, 0.617], 0.125, 2.921], [2.155131, 2, 0.001902]], [[[0.998, 0.325, -0.659, -0.774, -0.014, 0.738, 0.491, -0.305, -0.666, -0.273, 0.426, 0.518, 0.137, -0.453, 0.0, 0.02, 0.439, 0.135, -0.242, -0.368, 0.032, 0.282, 0.295], 0.25, 4.593], [1.325115, 4, -0.031343]], [[[0.24, -0.167, -0.533, 0.0, -0.963, -0.942, -0.767, -0.48, -0.111, 0.29], 0.125, 3.21], [0.659601, 2, -0.663018]], [[[0.939, 0.955, 0.969, 0.977, 0.984, 0.986, 0.985, 0.981, 0.973, 0.961, 0.948, 0.932, 0.912, 0.882, 0.862, 0.828, 0.802, 0.765, 0.721, 0.674, 0.652, 0.607, 0.551, 0.488, 0.448, 0.4, 0.352, 0.312, 0.234, 0.177, 0.113, 0.057, 0.006], 0.05, 1.166], [None, 0, None]], [[[0.882, 0.859, 0.044, -0.82, -0.884, -0.153, 0.751, 0.87, 0.294, -0.687, -0.881, -0.237, 0.571, 0.847, 0.215], 0.25, 3.99], [1.531017, 2, -0.027761]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.333, 0.928, -0.086, 0.0, -0.164, 0.766, 0.336, -0.578, -0.438, 0.396, 0.387, -0.385, -0.494, 0.117], 0.25, 5.715], [0.817376, 4, -0.256539]], [[[0.833, 0.587, 0.253, -0.107, -0.435, -0.725, -0.918, -1.0, -0.941, -0.758, -0.506, -0.16, 0.185, 0.493, 0.808, 0.969, 0.996, 0.917, 0.721, 0.334, 0.017, -0.252, -0.634, -0.831, -0.956, -0.988, -0.915, -0.721, -0.352, -0.084, 0.469, 0.0, 0.922], 0.25, 1.417], [4.422033, 2, -0.002732]], [[[-0.447, -0.874, -0.985, -0.736, -0.283, 0.363, 0.778, 0.966, 0.775], 0.1, 5.946], [None, 1, None]], [[[0.556, -0.046, -0.612, -0.939, -0.915, -0.494, 0.071, 0.565, 0.922, 0.871, 0.448, -0.021, -0.606, -0.864, -0.867, -0.45, 0.027], 0.125, 4.972], [1.258632, 2, -0.004021]], [[[0.221, 0.117, 0.014, -0.083, -0.18, -0.269, -0.351, -0.412, -0.477, -0.546, -0.588, -0.634, -0.663, -0.691, -0.713, -0.719, -0.719, -0.712, -0.695, -0.675, -0.648, -0.606, -0.565, -0.525, -0.465, -0.424, -0.382, -0.319, 0.0, -0.186, -0.134, -0.057, -0.026, 0.046, 0.083, 0.103], 0.1, 1.021], [0.436111, 2, -0.929133]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.412, 0.92, -0.07, -0.858, -0.198, 0.741, 0.417, -0.491, -0.514, 0.429, 0.527, -0.132, -0.545, -0.09], 0.25, 5.568], [1.083552, 2, -0.039784]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.395, 0.872, 0.925, 0.582, -0.055, -0.574, -0.849, -0.705, -0.29, 0.316, 0.674, 0.756, 0.481, -0.092, -0.43, -0.681, -0.565, -0.266, 0.299, 0.476, 0.606, 0.406, 0.034], 0.125, 5.467], [1.124031, 2, -0.02198]], [[[-0.978, -0.935, -0.647, -0.219, 0.273, 0.627, 0.851, 0.845, 0.578, 0.199, -0.218, -0.558, -0.758, -0.757, -0.557, -0.271, 0.131, 0.394, 0.678, 0.682, 0.573, 0.19, -0.153, -0.339, -0.535, -0.606, -0.51, -0.307, -0.007, 0.376, 0.515], 0.1, 5.083], [1.228658, 3, -0.006035]], [[[-0.587, -0.689, -0.77, -0.827, -0.858, -0.872, -0.861, -0.828, -0.78, -0.719], 0.125, 1.237], [None, 0, None]], [[[-0.115, 0.556, 0.928, 0.805, 0.28, -0.292, -0.751, -0.806, -0.452, 0.045, 0.544, 0.759, 0.561, -0.002, -0.48, -0.638, -0.615, -0.157, 0.139, 0.55, 0.573, 0.396], 0.125, 5.717], [1.084939, 3, -0.012826]], [[[-1.0, -0.927, -0.721, -0.406, -0.06, 0.305, 0.65, 0.845, 0.954, 0.928, 0.753, 0.457, 0.066, -0.172, -0.576, -0.762, -0.9, -0.902, -0.794], 0.1, 3.771], [None, 1, None]], [[[0.912, 0.995, 0.892, 0.616, 0.241, -0.192, -0.525, -0.837, -0.958, -0.893, -0.667, -0.387, -0.005, 0.43, 0.763, 0.899, 0.903, 0.757, 0.333, 0.06, -0.328, -0.681, -0.854, -0.89, -0.78, -0.398, -0.043, 0.299, 0.625, 0.818, 0.858, 0.78], 0.1, 4.27], [1.411424, 2, -0.040808]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.976, 0.605, -0.025, -0.596, -0.886, -0.785, -0.372, 0.266, 0.693, 0.798, 0.602, 0.064, -0.309, -0.661, -0.683, -0.343, 0.122, 0.493, 0.637, 0.546, 0.136, -0.304, -0.527], 0.125, 5.356], [1.14432, 2, -0.024543]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-0.999, -0.097, 0.877, 0.336, -0.648, -0.551, 0.374, 0.634], 0.25, 5.524], [1.124022, 2, -0.011792]], [[[-0.7, -0.579, -0.447, -0.299, -0.148, 0.0, 0.129, 0.281, 0.391, 0.518, 0.612, 0.708, 0.784, 0.827, 0.847, 0.86], 0.05, 3.021], [None, 1, None]], [[[0.446, -0.255, -0.799, -0.921, -0.57, -0.003, 0.55, 0.838, 0.0, 0.178, -0.29, -0.676, -0.721, -0.282, 0.142, 0.554, 0.66, 0.386, 0.005, -0.48, -0.578], 0.125, 5.696], [1.082459, 2, -0.018701]], [[[-0.231, -0.55, -0.794, -0.948, -0.973, -0.882, -0.679, -0.37, -0.087, 0.286, 0.592, 0.772, 0.894, 0.92, 0.817, 0.649, 0.285, -0.034, -0.335, -0.62, -0.766, -0.843, -0.849, -0.777, -0.49, -0.258, 0.075, 0.258, 0.472], 0.125, 2.796], [2.192691, 2, -0.024258]], [[[-0.521, 0.648, 0.908, -0.081, -0.924, -0.438, 0.631, 0.856, -0.06, -0.87, -0.339, 0.448, 0.763, -0.265, -0.826, -0.318, 0.437, 0.614, -0.009, -0.765, -0.178, 0.555, 0.683, -0.27, -0.74, -0.565, 0.424, 0.558, -0.347, -0.684, -0.493, 0.0, 0.67, -0.184, -0.635, -0.564, 0.286, 0.486], 0.25, 4.956], [1.25778, 8, -0.007898]]], [[[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[-0.756, -0.988, -0.915, -0.562, 0.023, 0.53, 0.911, 0.994, 0.781, 0.245, -0.204, -0.763, -0.984, -0.956, -0.557, 0.012, 0.516, 0.909, 0.999, 0.685, 0.0, -0.061, -0.761, -0.995, -0.915, -0.627, -0.057, 0.515, 0.84, 1.0, 0.691, 0.112, -0.375, -0.682, -0.925], 0.25, 2.241], [2.767371, 3, -0.012972]], [[[0.998, 0.916, 0.758, 0.537, 0.296, 0.003, -0.245, -0.465, -0.646, -0.77, -0.81, -0.782, -0.683, -0.535, -0.384, -0.147, 0.066, 0.239, 0.444, 0.557, 0.65, 0.652, 0.626, 0.48, 0.364, 0.221, 0.017, 0.0, -0.301, -0.407, -0.517, -0.538, -0.526, -0.441, -0.396, -0.227], 0.1, 2.934], [None, 1, None]], [[[0.944, 0.968, 0.984, 0.991, 0.989, 0.979, 0.961, 0.933, 0.898, 0.865, 0.813, 0.763, 0.704, 0.618, 0.553, 0.484, 0.401, 0.327, 0.227, 0.135, 0.051, -0.013, -0.13, -0.226, -0.307, -0.392, -0.453, -0.546, -0.594, -0.654, -0.723, -0.767, -0.794, -0.846], 0.05, 1.823], [None, 0, None]], [[[0.982, 0.4, -0.784, -0.716, 0.402, 0.908, -0.054, -0.873, -0.397, 0.762, 0.596, -0.454, -0.79, -0.186, 0.779, 0.266, -0.758, -0.524, 0.328, 0.754, 0.181, -0.763, -0.206, 0.424, 0.646, -0.347, -0.718, -0.358, 0.559, 0.417, -0.22, -0.52], 0.25, 5.298], [1.187499, 6, 0.001302]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.197, 0.629, 0.894, 0.931, 0.721, 0.337, -0.04, -0.487, -0.769, -0.835, -0.693, -0.395, -0.033, 0.344, 0.623, 0.735, 0.667, 0.416, 0.155, -0.22, -0.462, -0.655, -0.581, -0.44, -0.248, 0.086, 0.346, 0.559, 0.525, 0.413, 0.174, -0.108], 0.1, 4.976], [1.265498, 2, 0.002218]], [[[0.087, -0.455, -0.851, -1.0, -0.844, -0.457, 0.065, 0.639, 0.943, 0.987, 0.729, 0.237, -0.201, -0.715, -0.967, -0.952, -0.534, -0.168, 0.416, 0.856, 0.992, 0.853, 0.507, -0.102, -0.477, -0.977, -0.926, -0.677, -0.241, 0.111, 0.644, 0.927, 0.958, 0.481], 0.25, 2.185], [2.851148, 3, -0.008503]]]]
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 | [1.825868, 3, -0.005581] | [1.825868, 3, -0.005581] | Passed |
| case 1 | [1.0, 2, -0.5] | [1.0, 2, -0.5] | Passed |
| case 2 | [2.155131, 2, 0.001902] | [2.155131, 2, 0.001902] | Passed |
| case 3 | [1.325115, 4, -0.031343] | [1.325115, 4, -0.031343] | Passed |
| case 4 | [0.659601, 2, -0.663018] | [0.659601, 2, -0.663018] | Passed |
| case 5 | [None, 0, None] | [None, 0, None] | Passed |
| case 6 | [1.531017, 2, -0.027761] | [1.531017, 2, -0.027761] | Passed |
| case 7 | [1.0, 2, -0.5] | [1.0, 2, -0.5] | Passed |
SHA-256 / a101353f4109c73aaf0ee40e80b4fdfdc01d7761e7087aaefac985181bd36c0b
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.302716+00:00.
Case digest / f7cec18dfa07d6add9a678c77bf02512e300a67c61e9c21328757469caff44d3