FAILURE MAP
← Case archive

FA-87301 / Physics integrator stability / Open access

Relative period error has the reversed sign · case 01

A lagging integrator is reported as leading.

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

ROOT CAUSE

Error is (ref-period)/ref.

VERIFIED REPAIR

Error is (measured-ref)/ref.

Unsuccessful approach: Normalizing by the measured period changes the magnitude.

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 = -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((ref - period) / ref, 6)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[0.136, 0.52, 0.79, 0.93, 0.897, 0.716, 0.426, 0.049, -0.269, -0.575, -0.751, -0.802, -0.698, -0.469, -0.147, 0.173, 0.39, 0.606, 0.685, 0.65, 0.567, 0.342, 0.033, -0.176, -0.464, -0.537, -0.582, -0.474, -0.336, -0.087, 0.071, 0.234, 0.437, 0.516, 0.472, 0.438], 0.1, 4.136], [1.509126, 2, -0.006596]], [[[0.125, -0.838, -0.672, 0.261, 0.814, 0.254, -0.478, -0.623, 0.095, 0.626, 0.457, -0.288, -0.549, -0.151, 0.413, 0.363, -0.168, -0.426, -0.191, 0.151, 0.368, 0.078, -0.244, -0.258, 0.118, 0.267, 0.18, -0.195, -0.213, 0.033], 0.25, 4.723], [1.30728, 6, -0.017332]], [[[0.014, -0.488, -0.823, -0.928, -0.752, -0.382, 0.014, 0.485, 0.758, 0.797, 0.609, 0.243, -0.085, -0.47, -0.635, -0.672, -0.536, -0.267, 0.094, 0.396, 0.572, 0.57, 0.411, 0.193, -0.146, -0.39, -0.492, -0.459, -0.307, -0.026, 0.217, 0.381, 0.449, 0.431, 0.259, 0.13, -0.203, -0.364, -0.385], 0.125, 4.227], [1.446397, 3, -0.026939]], [[[0.279, -0.082, -0.432, -0.707, -0.908, -0.968, -0.913, -0.743, -0.47, -0.088, 0.234, 0.505, 0.772, 0.904, 0.912, 0.828, 0.618, 0.279, -0.082, -0.323, -0.589, -0.736, -0.864, -0.82, -0.691], 0.125, 2.877], [None, 1, None]], [[[-0.155, -0.709, -0.969, -0.826, -0.384, 0.203, 0.745, 0.916, 0.693, 0.23, -0.36, -0.715, -0.86, -0.596, -0.199, 0.41, 0.726, 0.806, 0.575, 0.185, -0.441, -0.755, -0.755, -0.378, 0.111, 0.488, 0.684], 0.25, 2.559], [2.389854, 3, -0.026666]], [[[0.972, 0.999, 0.99, 0.946, 0.871, 0.766, 0.623, 0.483, 0.272, 0.13, -0.109, -0.244, -0.448, -0.626, -0.74, -0.862, -0.949, -0.989, -1.0, -0.971, -0.926, -0.802, -0.716, -0.526], 0.05, 3.727], [None, 0, None]], [[[-0.049, -0.213, -0.37, -0.515, -0.656, -0.761, -0.857, -0.921, -0.963, -0.978, -0.961, -0.921, -0.857, -0.784, -0.654, -0.558, -0.419, 0.0, -0.065, 0.086, 0.205, 0.352, 0.542, 0.67, 0.725, 0.849, 0.869, 0.92, 0.929, 0.913, 0.863, 0.809, 0.696, 0.561, 0.533, 0.32, 0.183], 0.05, 3.293], [0.071523, 2, -0.962515]], [[[0.909, 0.658, 0.306, -0.085, -0.462, -0.751, -0.909, -0.901, -0.728, -0.482], 0.25, 1.634], [None, 0, None]]], [[[[0.345, 0.479, 0.604, 0.706, 0.79, 0.859, 0.899, 0.924, 0.923, 0.899, 0.856, 0.799, 0.712, 0.607, 0.513, 0.385, 0.289, 0.16, -0.009, -0.097], 0.05, 3.033], [None, 0, None]], [[[0.173, -0.958, -0.346, 0.89, 0.367, -0.778, -0.526, 0.784, 0.603, -0.474, -0.602, 0.405], 0.25, 5.899], [1.039735, 3, -0.02384]], [[[-0.109, 0.457, 0.858, 0.0, 0.802, 0.322, -0.211, -0.693, -0.931, -0.879, -0.505, -0.101, 0.442, 0.814, 0.884, 0.717, 0.324, -0.388, -0.622, -0.887, -0.758, -0.37, 0.005, 0.436, 0.836, 0.835, 0.679, 0.044, -0.232, -0.781, -0.814, -0.658, -0.212, 0.33], 0.125, 4.57], [1.341607, 4, -0.024198]], [[[0.164, -0.43, -0.806, -0.847, -0.549, -0.109, 0.408, 0.636, 0.647, 0.434, 0.078, -0.3, -0.511, -0.488, -0.271, 0.017], 0.25, 2.519], [2.432535, 2, -0.024769]], [[[-0.425, -0.944, -0.194, 0.722, 0.59, -0.255, -0.74, -0.107, 0.57, 0.553, -0.097, -0.577, -0.147, 0.454], 0.25, 4.911], [1.2541, 3, -0.019783]], [[[0.152, 0.436, 0.674, 0.827, 0.905, 0.895, 0.805, 0.624, 0.436, 0.168, -0.081, -0.288, -0.548, -0.638, -0.74, -0.736, -0.659, -0.521, -0.401, -0.194, 0.083, 0.174, 0.43, 0.51, 0.577, 0.606, 0.547, 0.454, 0.372, 0.2, 0.016, -0.12, -0.361], 0.1, 3.046], [None, 1, None]], [[[-0.119, -0.361, -0.572, -0.756, -0.88, -0.967, -0.985, -0.949, -0.838, -0.711, -0.514, -0.282, -0.081, 0.169, 0.432, 0.603, 0.758, 0.902, 0.952, 0.952, 0.896, 0.775, 0.63, 0.471, 0.237, -0.068, -0.172, -0.384, -0.608, -0.777, -0.882, -0.925, -0.892, -0.841, -0.793], 0.05, 4.859], [None, 1, None]], [[[0.835, 0.552, 0.178, -0.227, -0.602, -0.872, -0.99, -0.952, -0.78, -0.414, -0.092, 0.3, 0.716, 0.941, 1.0, 0.878, 0.618, 0.363, -0.046, -0.402, -0.762, -0.973, -0.982, -0.847, -0.671, -0.26, 0.094], 0.125, 3.219], [1.937471, 2, -0.007395]]], [[[[0.172, 0.032, -0.109, -0.229, -0.347, -0.446, -0.539, 0.0, -0.678, -0.719, -0.735, -0.746], 0.125, 1.122], [None, 1, None]], [[[-0.724, -0.466, -0.168, 0.156, 0.463, 0.717, 0.904, 0.99, 0.982, 0.868, 0.671, 0.394, 0.102, -0.27, -0.488, -0.79, -0.941, -1.0, -0.966, -0.787, -0.624, -0.386, 0.003, 0.335, 0.652, 0.85, 0.961, 0.999, 0.949, 0.756, 0.623, 0.117, -0.018, -0.351], 0.125, 2.537], [2.434221, 2, -0.01712]], [[[0.005, 0.786, 0.854, 0.241, -0.544, -0.777, -0.343, 0.319, 0.665, 0.489, -0.117, -0.526, -0.501], 0.25, 3.791], [None, 1, None]], [[[0.933, 0.714, -0.336, -1.0, -0.474, 0.686, 0.977, 0.163, -0.857, -0.786, 0.203, 0.999, 0.61, -0.354], 0.25, 4.554], [1.34653, 2, -0.024046]], [[[0.526, 0.687, 0.816, 0.913, 0.977, 1.0, 0.986, 0.927, 0.821, 0.705, 0.558, 0.365, 0.149, -0.001, -0.197, -0.398, -0.573, -0.737, -0.857, -0.934, -0.987, -1.0, -0.981, -0.895, -0.818, -0.684, -0.487, -0.241, -0.105, 0.127, 0.326, 0.437, 0.687], 0.125, 1.578], [None, 1, None]], [[[-0.037, -0.538, -0.876, -0.984, -0.815, -0.413, 0.088, 0.533, 0.86, 0.948, 0.732, 0.43, -0.036, -0.607, -0.825, -0.928, -0.76, -0.403, 0.088, 0.625, 0.8, 0.889, 0.708, 0.241, -0.235, -0.499, -0.768, -0.874, -0.734, -0.258, 0.171, 0.658], 0.1, 5.215], [1.188852, 3, -0.013261]], [[[-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.782, 0.803, -0.322, -0.961, -0.145, 0.88, 0.545, -0.505, -0.847, 0.072, 0.838, 0.362, -0.691, -0.784, 0.139, 0.828, 0.292, -0.698, -0.556, 0.501, 0.616, 0.209, -0.752, -0.433, 0.497, 0.68, -0.345, -0.619, -0.392, 0.649, 0.317], 0.25, 5.143], [1.211755, 6, -0.008138]]], [[[[-0.043, -0.601, -0.945, -0.951, -0.606, -0.076, 0.462, 0.853, 0.952, 0.651, 0.202, -0.419, -0.834, -0.936, -0.67, -0.202, 0.26, 0.647, 0.909, 0.729, 0.346, -0.3, -0.561, -0.88, -0.796], 0.1, 5.963], [1.029597, 2, -0.022871]], [[[0.254, 0.123, -0.003, -0.132, -0.245, -0.349, -0.458, -0.531, 0.0, -0.671, -0.709, -0.744, -0.761, -0.765, -0.756, -0.733, -0.694, -0.659, -0.584, -0.533], 0.1, 1.299], [None, 1, None]], [[[-0.681, -0.916, -0.987, -0.888, -0.632, 0.0, 0.112, 0.529, 0.792, 0.938, 0.918, 0.689, 0.382, -0.009, -0.373, -0.698, -0.832], 0.125, 3.337], [None, 1, None]], [[[0.558, 0.305, 0.028, -0.24, -0.519, -0.722, -0.878, -0.948, -0.956, -0.885, -0.758, -0.575, -0.325, -0.016, 0.259, 0.508, 0.699, 0.82, 0.891], 0.1, 2.792], [None, 1, None]], [[[-0.036, 0.428, 0.793, 0.988, 0.953, 0.699, 0.286, -0.155, -0.583, -0.893, -1.0, -0.89, -0.471, -0.023, 0.361, 0.814, 0.985, 0.989, 0.74, 0.277, -0.147, -0.512, -0.865, -0.997, -0.831, -0.582, -0.192, 0.375, 0.713, 0.912, 0.977], 0.1, 4.729], [1.313052, 3, -0.01174]], [[[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.921, -0.229, -1.0, -0.114, 0.97, 0.459, -0.781, -0.786, 0.384, 0.951, -0.307, -0.998, -0.087, 0.96, 0.696, -0.729, -0.785, 0.215, 1.0, 0.163, -0.996, -0.23, 0.998, 0.166, -0.96, -0.868, 0.822, 0.836, -0.569, -0.918], 0.25, 5.49], [1.120422, 6, -0.021019]], [[[-0.884, -0.978, -0.774, -0.365, 0.18, 0.586, 0.86, 0.832, 0.556, 0.178, -0.357, -0.626, -0.783, -0.661, -0.337, 0.061, 0.365, 0.638, 0.665, 0.465, 0.104, -0.097, -0.529, -0.614, -0.515, -0.336, 0.054, 0.357, 0.451, 0.555, 0.375, 0.311, -0.186, -0.412, -0.501, -0.494, -0.369, 0.046], 0.1, 5.519], [1.107314, 4, -0.027361]]], [[[[0.007, 0.246, 0.471, 0.664, 0.831, 0.933, 0.996, 0.992, 0.928, 0.816, 0.652, 0.452, 0.204, -0.009, -0.284, -0.466, -0.704, -0.83, -0.943, -0.995, -0.995, -0.934, -0.814, -0.624, -0.499, -0.137, 0.078, 0.213, 0.427, 0.742, 0.813, 0.915, 0.984, 0.988, 0.902, 0.766, 0.715, 0.381, 0.273, -0.061], 0.05, 4.784], [None, 1, None]], [[[-0.715, -0.378, 0.018, 0.393, 0.716, 0.92, 0.959, 0.85, 0.639, 0.245, -0.058, -0.513, -0.716, -0.889, -0.896, -0.724, -0.548, -0.157, 0.144, 0.436, 0.776, 0.873, 0.0, 0.722, 0.493, 0.018, -0.335, -0.564, -0.788, -0.832, -0.799, -0.613], 0.125, 3.192], [1.945881, 2, -0.011448]], [[[-0.116, -0.024, 0.067, 0.157, 0.247, 0.339, 0.416, 0.51, 0.582, 0.66, 0.729, 0.788, 0.843, 0.875, 0.927, 0.955, 0.974, 0.993, 1.0, 0.998, 0.986, 0.964, 0.937, 0.914, 0.865, 0.836, 0.756, 0.714, 0.648, 0.534, 0.457, 0.37], 0.05, 1.813], [None, 1, None]], [[[0.996, 0.809, 0.426, -0.058, -0.471, -0.802, -0.887, -0.736, -0.425, -0.086, 0.322, 0.651, 0.786, 0.7], 0.1, 5.023], [None, 1, None]], [[[-0.055, -0.888, -0.797, 0.135, 0.894, 0.691, -0.143, -0.875, -0.622, 0.233, 0.834, 0.499, -0.423, -0.844, -0.441, 0.181, 0.789, 0.579, -0.249, -0.783, -0.48, 0.502, 0.748, 0.38, -0.392, -0.623, -0.127, 0.631], 0.25, 4.231], [1.457025, 5, -0.018862]], [[[-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.956, 1.0, 0.942, 0.783, 0.546, 0.251, -0.055, -0.38, -0.686, -0.877, -0.981, -0.998], 0.1, 3.186], [None, 0, None]], [[[-0.401, 0.525, 0.905, 0.442, -0.373, -0.776, -0.497, 0.202, 0.657, 0.424, -0.109, -0.559, -0.42, -0.039, 0.436, 0.44, -0.081, -0.375, -0.333, -0.118], 0.25, 3.964], [1.581132, 3, -0.002479]]]]
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[1.509126, 2, 0.006596][1.509126, 2, -0.006596]Failed
case 1[1.30728, 6, 0.017332][1.30728, 6, -0.017332]Failed
case 2[1.446397, 3, 0.026939][1.446397, 3, -0.026939]Failed
case 3[None, 1, None][None, 1, None]Passed
case 4[2.389854, 3, 0.026666][2.389854, 3, -0.026666]Failed
case 5[None, 0, None][None, 0, None]Passed
case 6[0.071523, 2, 0.962515][0.071523, 2, -0.962515]Failed
case 7[None, 0, None][None, 0, None]Passed

SHA-256 / 4cff47e9dc62dc297f82bc0b918dcbad3af26bbf65771605efa3c18b4b4be18e

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 = -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) / period, 6)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[0.136, 0.52, 0.79, 0.93, 0.897, 0.716, 0.426, 0.049, -0.269, -0.575, -0.751, -0.802, -0.698, -0.469, -0.147, 0.173, 0.39, 0.606, 0.685, 0.65, 0.567, 0.342, 0.033, -0.176, -0.464, -0.537, -0.582, -0.474, -0.336, -0.087, 0.071, 0.234, 0.437, 0.516, 0.472, 0.438], 0.1, 4.136], [1.509126, 2, -0.006596]], [[[0.125, -0.838, -0.672, 0.261, 0.814, 0.254, -0.478, -0.623, 0.095, 0.626, 0.457, -0.288, -0.549, -0.151, 0.413, 0.363, -0.168, -0.426, -0.191, 0.151, 0.368, 0.078, -0.244, -0.258, 0.118, 0.267, 0.18, -0.195, -0.213, 0.033], 0.25, 4.723], [1.30728, 6, -0.017332]], [[[0.014, -0.488, -0.823, -0.928, -0.752, -0.382, 0.014, 0.485, 0.758, 0.797, 0.609, 0.243, -0.085, -0.47, -0.635, -0.672, -0.536, -0.267, 0.094, 0.396, 0.572, 0.57, 0.411, 0.193, -0.146, -0.39, -0.492, -0.459, -0.307, -0.026, 0.217, 0.381, 0.449, 0.431, 0.259, 0.13, -0.203, -0.364, -0.385], 0.125, 4.227], [1.446397, 3, -0.026939]], [[[0.279, -0.082, -0.432, -0.707, -0.908, -0.968, -0.913, -0.743, -0.47, -0.088, 0.234, 0.505, 0.772, 0.904, 0.912, 0.828, 0.618, 0.279, -0.082, -0.323, -0.589, -0.736, -0.864, -0.82, -0.691], 0.125, 2.877], [None, 1, None]], [[[-0.155, -0.709, -0.969, -0.826, -0.384, 0.203, 0.745, 0.916, 0.693, 0.23, -0.36, -0.715, -0.86, -0.596, -0.199, 0.41, 0.726, 0.806, 0.575, 0.185, -0.441, -0.755, -0.755, -0.378, 0.111, 0.488, 0.684], 0.25, 2.559], [2.389854, 3, -0.026666]], [[[0.972, 0.999, 0.99, 0.946, 0.871, 0.766, 0.623, 0.483, 0.272, 0.13, -0.109, -0.244, -0.448, -0.626, -0.74, -0.862, -0.949, -0.989, -1.0, -0.971, -0.926, -0.802, -0.716, -0.526], 0.05, 3.727], [None, 0, None]], [[[-0.049, -0.213, -0.37, -0.515, -0.656, -0.761, -0.857, -0.921, -0.963, -0.978, -0.961, -0.921, -0.857, -0.784, -0.654, -0.558, -0.419, 0.0, -0.065, 0.086, 0.205, 0.352, 0.542, 0.67, 0.725, 0.849, 0.869, 0.92, 0.929, 0.913, 0.863, 0.809, 0.696, 0.561, 0.533, 0.32, 0.183], 0.05, 3.293], [0.071523, 2, -0.962515]], [[[0.909, 0.658, 0.306, -0.085, -0.462, -0.751, -0.909, -0.901, -0.728, -0.482], 0.25, 1.634], [None, 0, None]]], [[[[0.345, 0.479, 0.604, 0.706, 0.79, 0.859, 0.899, 0.924, 0.923, 0.899, 0.856, 0.799, 0.712, 0.607, 0.513, 0.385, 0.289, 0.16, -0.009, -0.097], 0.05, 3.033], [None, 0, None]], [[[0.173, -0.958, -0.346, 0.89, 0.367, -0.778, -0.526, 0.784, 0.603, -0.474, -0.602, 0.405], 0.25, 5.899], [1.039735, 3, -0.02384]], [[[-0.109, 0.457, 0.858, 0.0, 0.802, 0.322, -0.211, -0.693, -0.931, -0.879, -0.505, -0.101, 0.442, 0.814, 0.884, 0.717, 0.324, -0.388, -0.622, -0.887, -0.758, -0.37, 0.005, 0.436, 0.836, 0.835, 0.679, 0.044, -0.232, -0.781, -0.814, -0.658, -0.212, 0.33], 0.125, 4.57], [1.341607, 4, -0.024198]], [[[0.164, -0.43, -0.806, -0.847, -0.549, -0.109, 0.408, 0.636, 0.647, 0.434, 0.078, -0.3, -0.511, -0.488, -0.271, 0.017], 0.25, 2.519], [2.432535, 2, -0.024769]], [[[-0.425, -0.944, -0.194, 0.722, 0.59, -0.255, -0.74, -0.107, 0.57, 0.553, -0.097, -0.577, -0.147, 0.454], 0.25, 4.911], [1.2541, 3, -0.019783]], [[[0.152, 0.436, 0.674, 0.827, 0.905, 0.895, 0.805, 0.624, 0.436, 0.168, -0.081, -0.288, -0.548, -0.638, -0.74, -0.736, -0.659, -0.521, -0.401, -0.194, 0.083, 0.174, 0.43, 0.51, 0.577, 0.606, 0.547, 0.454, 0.372, 0.2, 0.016, -0.12, -0.361], 0.1, 3.046], [None, 1, None]], [[[-0.119, -0.361, -0.572, -0.756, -0.88, -0.967, -0.985, -0.949, -0.838, -0.711, -0.514, -0.282, -0.081, 0.169, 0.432, 0.603, 0.758, 0.902, 0.952, 0.952, 0.896, 0.775, 0.63, 0.471, 0.237, -0.068, -0.172, -0.384, -0.608, -0.777, -0.882, -0.925, -0.892, -0.841, -0.793], 0.05, 4.859], [None, 1, None]], [[[0.835, 0.552, 0.178, -0.227, -0.602, -0.872, -0.99, -0.952, -0.78, -0.414, -0.092, 0.3, 0.716, 0.941, 1.0, 0.878, 0.618, 0.363, -0.046, -0.402, -0.762, -0.973, -0.982, -0.847, -0.671, -0.26, 0.094], 0.125, 3.219], [1.937471, 2, -0.007395]]], [[[[0.172, 0.032, -0.109, -0.229, -0.347, -0.446, -0.539, 0.0, -0.678, -0.719, -0.735, -0.746], 0.125, 1.122], [None, 1, None]], [[[-0.724, -0.466, -0.168, 0.156, 0.463, 0.717, 0.904, 0.99, 0.982, 0.868, 0.671, 0.394, 0.102, -0.27, -0.488, -0.79, -0.941, -1.0, -0.966, -0.787, -0.624, -0.386, 0.003, 0.335, 0.652, 0.85, 0.961, 0.999, 0.949, 0.756, 0.623, 0.117, -0.018, -0.351], 0.125, 2.537], [2.434221, 2, -0.01712]], [[[0.005, 0.786, 0.854, 0.241, -0.544, -0.777, -0.343, 0.319, 0.665, 0.489, -0.117, -0.526, -0.501], 0.25, 3.791], [None, 1, None]], [[[0.933, 0.714, -0.336, -1.0, -0.474, 0.686, 0.977, 0.163, -0.857, -0.786, 0.203, 0.999, 0.61, -0.354], 0.25, 4.554], [1.34653, 2, -0.024046]], [[[0.526, 0.687, 0.816, 0.913, 0.977, 1.0, 0.986, 0.927, 0.821, 0.705, 0.558, 0.365, 0.149, -0.001, -0.197, -0.398, -0.573, -0.737, -0.857, -0.934, -0.987, -1.0, -0.981, -0.895, -0.818, -0.684, -0.487, -0.241, -0.105, 0.127, 0.326, 0.437, 0.687], 0.125, 1.578], [None, 1, None]], [[[-0.037, -0.538, -0.876, -0.984, -0.815, -0.413, 0.088, 0.533, 0.86, 0.948, 0.732, 0.43, -0.036, -0.607, -0.825, -0.928, -0.76, -0.403, 0.088, 0.625, 0.8, 0.889, 0.708, 0.241, -0.235, -0.499, -0.768, -0.874, -0.734, -0.258, 0.171, 0.658], 0.1, 5.215], [1.188852, 3, -0.013261]], [[[-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.782, 0.803, -0.322, -0.961, -0.145, 0.88, 0.545, -0.505, -0.847, 0.072, 0.838, 0.362, -0.691, -0.784, 0.139, 0.828, 0.292, -0.698, -0.556, 0.501, 0.616, 0.209, -0.752, -0.433, 0.497, 0.68, -0.345, -0.619, -0.392, 0.649, 0.317], 0.25, 5.143], [1.211755, 6, -0.008138]]], [[[[-0.043, -0.601, -0.945, -0.951, -0.606, -0.076, 0.462, 0.853, 0.952, 0.651, 0.202, -0.419, -0.834, -0.936, -0.67, -0.202, 0.26, 0.647, 0.909, 0.729, 0.346, -0.3, -0.561, -0.88, -0.796], 0.1, 5.963], [1.029597, 2, -0.022871]], [[[0.254, 0.123, -0.003, -0.132, -0.245, -0.349, -0.458, -0.531, 0.0, -0.671, -0.709, -0.744, -0.761, -0.765, -0.756, -0.733, -0.694, -0.659, -0.584, -0.533], 0.1, 1.299], [None, 1, None]], [[[-0.681, -0.916, -0.987, -0.888, -0.632, 0.0, 0.112, 0.529, 0.792, 0.938, 0.918, 0.689, 0.382, -0.009, -0.373, -0.698, -0.832], 0.125, 3.337], [None, 1, None]], [[[0.558, 0.305, 0.028, -0.24, -0.519, -0.722, -0.878, -0.948, -0.956, -0.885, -0.758, -0.575, -0.325, -0.016, 0.259, 0.508, 0.699, 0.82, 0.891], 0.1, 2.792], [None, 1, None]], [[[-0.036, 0.428, 0.793, 0.988, 0.953, 0.699, 0.286, -0.155, -0.583, -0.893, -1.0, -0.89, -0.471, -0.023, 0.361, 0.814, 0.985, 0.989, 0.74, 0.277, -0.147, -0.512, -0.865, -0.997, -0.831, -0.582, -0.192, 0.375, 0.713, 0.912, 0.977], 0.1, 4.729], [1.313052, 3, -0.01174]], [[[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.921, -0.229, -1.0, -0.114, 0.97, 0.459, -0.781, -0.786, 0.384, 0.951, -0.307, -0.998, -0.087, 0.96, 0.696, -0.729, -0.785, 0.215, 1.0, 0.163, -0.996, -0.23, 0.998, 0.166, -0.96, -0.868, 0.822, 0.836, -0.569, -0.918], 0.25, 5.49], [1.120422, 6, -0.021019]], [[[-0.884, -0.978, -0.774, -0.365, 0.18, 0.586, 0.86, 0.832, 0.556, 0.178, -0.357, -0.626, -0.783, -0.661, -0.337, 0.061, 0.365, 0.638, 0.665, 0.465, 0.104, -0.097, -0.529, -0.614, -0.515, -0.336, 0.054, 0.357, 0.451, 0.555, 0.375, 0.311, -0.186, -0.412, -0.501, -0.494, -0.369, 0.046], 0.1, 5.519], [1.107314, 4, -0.027361]]], [[[[0.007, 0.246, 0.471, 0.664, 0.831, 0.933, 0.996, 0.992, 0.928, 0.816, 0.652, 0.452, 0.204, -0.009, -0.284, -0.466, -0.704, -0.83, -0.943, -0.995, -0.995, -0.934, -0.814, -0.624, -0.499, -0.137, 0.078, 0.213, 0.427, 0.742, 0.813, 0.915, 0.984, 0.988, 0.902, 0.766, 0.715, 0.381, 0.273, -0.061], 0.05, 4.784], [None, 1, None]], [[[-0.715, -0.378, 0.018, 0.393, 0.716, 0.92, 0.959, 0.85, 0.639, 0.245, -0.058, -0.513, -0.716, -0.889, -0.896, -0.724, -0.548, -0.157, 0.144, 0.436, 0.776, 0.873, 0.0, 0.722, 0.493, 0.018, -0.335, -0.564, -0.788, -0.832, -0.799, -0.613], 0.125, 3.192], [1.945881, 2, -0.011448]], [[[-0.116, -0.024, 0.067, 0.157, 0.247, 0.339, 0.416, 0.51, 0.582, 0.66, 0.729, 0.788, 0.843, 0.875, 0.927, 0.955, 0.974, 0.993, 1.0, 0.998, 0.986, 0.964, 0.937, 0.914, 0.865, 0.836, 0.756, 0.714, 0.648, 0.534, 0.457, 0.37], 0.05, 1.813], [None, 1, None]], [[[0.996, 0.809, 0.426, -0.058, -0.471, -0.802, -0.887, -0.736, -0.425, -0.086, 0.322, 0.651, 0.786, 0.7], 0.1, 5.023], [None, 1, None]], [[[-0.055, -0.888, -0.797, 0.135, 0.894, 0.691, -0.143, -0.875, -0.622, 0.233, 0.834, 0.499, -0.423, -0.844, -0.441, 0.181, 0.789, 0.579, -0.249, -0.783, -0.48, 0.502, 0.748, 0.38, -0.392, -0.623, -0.127, 0.631], 0.25, 4.231], [1.457025, 5, -0.018862]], [[[-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.956, 1.0, 0.942, 0.783, 0.546, 0.251, -0.055, -0.38, -0.686, -0.877, -0.981, -0.998], 0.1, 3.186], [None, 0, None]], [[[-0.401, 0.525, 0.905, 0.442, -0.373, -0.776, -0.497, 0.202, 0.657, 0.424, -0.109, -0.559, -0.42, -0.039, 0.436, 0.44, -0.081, -0.375, -0.333, -0.118], 0.25, 3.964], [1.581132, 3, -0.002479]]]]
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[1.509126, 2, -0.006639][1.509126, 2, -0.006596]Failed
case 1[1.30728, 6, -0.017638][1.30728, 6, -0.017332]Failed
case 2[1.446397, 3, -0.027685][1.446397, 3, -0.026939]Failed
case 3[None, 1, None][None, 1, None]Passed
case 4[2.389854, 3, -0.027397][2.389854, 3, -0.026666]Failed
case 5[None, 0, None][None, 0, None]Passed
case 6[0.071523, 2, -25.677267][0.071523, 2, -0.962515]Failed
case 7[None, 0, None][None, 0, None]Passed

SHA-256 / 1d024858dac7ba476e42edc33b636e11cad2ad04ded469d2c2e6003fe6a727ed

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.136, 0.52, 0.79, 0.93, 0.897, 0.716, 0.426, 0.049, -0.269, -0.575, -0.751, -0.802, -0.698, -0.469, -0.147, 0.173, 0.39, 0.606, 0.685, 0.65, 0.567, 0.342, 0.033, -0.176, -0.464, -0.537, -0.582, -0.474, -0.336, -0.087, 0.071, 0.234, 0.437, 0.516, 0.472, 0.438], 0.1, 4.136], [1.509126, 2, -0.006596]], [[[0.125, -0.838, -0.672, 0.261, 0.814, 0.254, -0.478, -0.623, 0.095, 0.626, 0.457, -0.288, -0.549, -0.151, 0.413, 0.363, -0.168, -0.426, -0.191, 0.151, 0.368, 0.078, -0.244, -0.258, 0.118, 0.267, 0.18, -0.195, -0.213, 0.033], 0.25, 4.723], [1.30728, 6, -0.017332]], [[[0.014, -0.488, -0.823, -0.928, -0.752, -0.382, 0.014, 0.485, 0.758, 0.797, 0.609, 0.243, -0.085, -0.47, -0.635, -0.672, -0.536, -0.267, 0.094, 0.396, 0.572, 0.57, 0.411, 0.193, -0.146, -0.39, -0.492, -0.459, -0.307, -0.026, 0.217, 0.381, 0.449, 0.431, 0.259, 0.13, -0.203, -0.364, -0.385], 0.125, 4.227], [1.446397, 3, -0.026939]], [[[0.279, -0.082, -0.432, -0.707, -0.908, -0.968, -0.913, -0.743, -0.47, -0.088, 0.234, 0.505, 0.772, 0.904, 0.912, 0.828, 0.618, 0.279, -0.082, -0.323, -0.589, -0.736, -0.864, -0.82, -0.691], 0.125, 2.877], [None, 1, None]], [[[-0.155, -0.709, -0.969, -0.826, -0.384, 0.203, 0.745, 0.916, 0.693, 0.23, -0.36, -0.715, -0.86, -0.596, -0.199, 0.41, 0.726, 0.806, 0.575, 0.185, -0.441, -0.755, -0.755, -0.378, 0.111, 0.488, 0.684], 0.25, 2.559], [2.389854, 3, -0.026666]], [[[0.972, 0.999, 0.99, 0.946, 0.871, 0.766, 0.623, 0.483, 0.272, 0.13, -0.109, -0.244, -0.448, -0.626, -0.74, -0.862, -0.949, -0.989, -1.0, -0.971, -0.926, -0.802, -0.716, -0.526], 0.05, 3.727], [None, 0, None]], [[[-0.049, -0.213, -0.37, -0.515, -0.656, -0.761, -0.857, -0.921, -0.963, -0.978, -0.961, -0.921, -0.857, -0.784, -0.654, -0.558, -0.419, 0.0, -0.065, 0.086, 0.205, 0.352, 0.542, 0.67, 0.725, 0.849, 0.869, 0.92, 0.929, 0.913, 0.863, 0.809, 0.696, 0.561, 0.533, 0.32, 0.183], 0.05, 3.293], [0.071523, 2, -0.962515]], [[[0.909, 0.658, 0.306, -0.085, -0.462, -0.751, -0.909, -0.901, -0.728, -0.482], 0.25, 1.634], [None, 0, None]]], [[[[0.345, 0.479, 0.604, 0.706, 0.79, 0.859, 0.899, 0.924, 0.923, 0.899, 0.856, 0.799, 0.712, 0.607, 0.513, 0.385, 0.289, 0.16, -0.009, -0.097], 0.05, 3.033], [None, 0, None]], [[[0.173, -0.958, -0.346, 0.89, 0.367, -0.778, -0.526, 0.784, 0.603, -0.474, -0.602, 0.405], 0.25, 5.899], [1.039735, 3, -0.02384]], [[[-0.109, 0.457, 0.858, 0.0, 0.802, 0.322, -0.211, -0.693, -0.931, -0.879, -0.505, -0.101, 0.442, 0.814, 0.884, 0.717, 0.324, -0.388, -0.622, -0.887, -0.758, -0.37, 0.005, 0.436, 0.836, 0.835, 0.679, 0.044, -0.232, -0.781, -0.814, -0.658, -0.212, 0.33], 0.125, 4.57], [1.341607, 4, -0.024198]], [[[0.164, -0.43, -0.806, -0.847, -0.549, -0.109, 0.408, 0.636, 0.647, 0.434, 0.078, -0.3, -0.511, -0.488, -0.271, 0.017], 0.25, 2.519], [2.432535, 2, -0.024769]], [[[-0.425, -0.944, -0.194, 0.722, 0.59, -0.255, -0.74, -0.107, 0.57, 0.553, -0.097, -0.577, -0.147, 0.454], 0.25, 4.911], [1.2541, 3, -0.019783]], [[[0.152, 0.436, 0.674, 0.827, 0.905, 0.895, 0.805, 0.624, 0.436, 0.168, -0.081, -0.288, -0.548, -0.638, -0.74, -0.736, -0.659, -0.521, -0.401, -0.194, 0.083, 0.174, 0.43, 0.51, 0.577, 0.606, 0.547, 0.454, 0.372, 0.2, 0.016, -0.12, -0.361], 0.1, 3.046], [None, 1, None]], [[[-0.119, -0.361, -0.572, -0.756, -0.88, -0.967, -0.985, -0.949, -0.838, -0.711, -0.514, -0.282, -0.081, 0.169, 0.432, 0.603, 0.758, 0.902, 0.952, 0.952, 0.896, 0.775, 0.63, 0.471, 0.237, -0.068, -0.172, -0.384, -0.608, -0.777, -0.882, -0.925, -0.892, -0.841, -0.793], 0.05, 4.859], [None, 1, None]], [[[0.835, 0.552, 0.178, -0.227, -0.602, -0.872, -0.99, -0.952, -0.78, -0.414, -0.092, 0.3, 0.716, 0.941, 1.0, 0.878, 0.618, 0.363, -0.046, -0.402, -0.762, -0.973, -0.982, -0.847, -0.671, -0.26, 0.094], 0.125, 3.219], [1.937471, 2, -0.007395]]], [[[[0.172, 0.032, -0.109, -0.229, -0.347, -0.446, -0.539, 0.0, -0.678, -0.719, -0.735, -0.746], 0.125, 1.122], [None, 1, None]], [[[-0.724, -0.466, -0.168, 0.156, 0.463, 0.717, 0.904, 0.99, 0.982, 0.868, 0.671, 0.394, 0.102, -0.27, -0.488, -0.79, -0.941, -1.0, -0.966, -0.787, -0.624, -0.386, 0.003, 0.335, 0.652, 0.85, 0.961, 0.999, 0.949, 0.756, 0.623, 0.117, -0.018, -0.351], 0.125, 2.537], [2.434221, 2, -0.01712]], [[[0.005, 0.786, 0.854, 0.241, -0.544, -0.777, -0.343, 0.319, 0.665, 0.489, -0.117, -0.526, -0.501], 0.25, 3.791], [None, 1, None]], [[[0.933, 0.714, -0.336, -1.0, -0.474, 0.686, 0.977, 0.163, -0.857, -0.786, 0.203, 0.999, 0.61, -0.354], 0.25, 4.554], [1.34653, 2, -0.024046]], [[[0.526, 0.687, 0.816, 0.913, 0.977, 1.0, 0.986, 0.927, 0.821, 0.705, 0.558, 0.365, 0.149, -0.001, -0.197, -0.398, -0.573, -0.737, -0.857, -0.934, -0.987, -1.0, -0.981, -0.895, -0.818, -0.684, -0.487, -0.241, -0.105, 0.127, 0.326, 0.437, 0.687], 0.125, 1.578], [None, 1, None]], [[[-0.037, -0.538, -0.876, -0.984, -0.815, -0.413, 0.088, 0.533, 0.86, 0.948, 0.732, 0.43, -0.036, -0.607, -0.825, -0.928, -0.76, -0.403, 0.088, 0.625, 0.8, 0.889, 0.708, 0.241, -0.235, -0.499, -0.768, -0.874, -0.734, -0.258, 0.171, 0.658], 0.1, 5.215], [1.188852, 3, -0.013261]], [[[-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.782, 0.803, -0.322, -0.961, -0.145, 0.88, 0.545, -0.505, -0.847, 0.072, 0.838, 0.362, -0.691, -0.784, 0.139, 0.828, 0.292, -0.698, -0.556, 0.501, 0.616, 0.209, -0.752, -0.433, 0.497, 0.68, -0.345, -0.619, -0.392, 0.649, 0.317], 0.25, 5.143], [1.211755, 6, -0.008138]]], [[[[-0.043, -0.601, -0.945, -0.951, -0.606, -0.076, 0.462, 0.853, 0.952, 0.651, 0.202, -0.419, -0.834, -0.936, -0.67, -0.202, 0.26, 0.647, 0.909, 0.729, 0.346, -0.3, -0.561, -0.88, -0.796], 0.1, 5.963], [1.029597, 2, -0.022871]], [[[0.254, 0.123, -0.003, -0.132, -0.245, -0.349, -0.458, -0.531, 0.0, -0.671, -0.709, -0.744, -0.761, -0.765, -0.756, -0.733, -0.694, -0.659, -0.584, -0.533], 0.1, 1.299], [None, 1, None]], [[[-0.681, -0.916, -0.987, -0.888, -0.632, 0.0, 0.112, 0.529, 0.792, 0.938, 0.918, 0.689, 0.382, -0.009, -0.373, -0.698, -0.832], 0.125, 3.337], [None, 1, None]], [[[0.558, 0.305, 0.028, -0.24, -0.519, -0.722, -0.878, -0.948, -0.956, -0.885, -0.758, -0.575, -0.325, -0.016, 0.259, 0.508, 0.699, 0.82, 0.891], 0.1, 2.792], [None, 1, None]], [[[-0.036, 0.428, 0.793, 0.988, 0.953, 0.699, 0.286, -0.155, -0.583, -0.893, -1.0, -0.89, -0.471, -0.023, 0.361, 0.814, 0.985, 0.989, 0.74, 0.277, -0.147, -0.512, -0.865, -0.997, -0.831, -0.582, -0.192, 0.375, 0.713, 0.912, 0.977], 0.1, 4.729], [1.313052, 3, -0.01174]], [[[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.921, -0.229, -1.0, -0.114, 0.97, 0.459, -0.781, -0.786, 0.384, 0.951, -0.307, -0.998, -0.087, 0.96, 0.696, -0.729, -0.785, 0.215, 1.0, 0.163, -0.996, -0.23, 0.998, 0.166, -0.96, -0.868, 0.822, 0.836, -0.569, -0.918], 0.25, 5.49], [1.120422, 6, -0.021019]], [[[-0.884, -0.978, -0.774, -0.365, 0.18, 0.586, 0.86, 0.832, 0.556, 0.178, -0.357, -0.626, -0.783, -0.661, -0.337, 0.061, 0.365, 0.638, 0.665, 0.465, 0.104, -0.097, -0.529, -0.614, -0.515, -0.336, 0.054, 0.357, 0.451, 0.555, 0.375, 0.311, -0.186, -0.412, -0.501, -0.494, -0.369, 0.046], 0.1, 5.519], [1.107314, 4, -0.027361]]], [[[[0.007, 0.246, 0.471, 0.664, 0.831, 0.933, 0.996, 0.992, 0.928, 0.816, 0.652, 0.452, 0.204, -0.009, -0.284, -0.466, -0.704, -0.83, -0.943, -0.995, -0.995, -0.934, -0.814, -0.624, -0.499, -0.137, 0.078, 0.213, 0.427, 0.742, 0.813, 0.915, 0.984, 0.988, 0.902, 0.766, 0.715, 0.381, 0.273, -0.061], 0.05, 4.784], [None, 1, None]], [[[-0.715, -0.378, 0.018, 0.393, 0.716, 0.92, 0.959, 0.85, 0.639, 0.245, -0.058, -0.513, -0.716, -0.889, -0.896, -0.724, -0.548, -0.157, 0.144, 0.436, 0.776, 0.873, 0.0, 0.722, 0.493, 0.018, -0.335, -0.564, -0.788, -0.832, -0.799, -0.613], 0.125, 3.192], [1.945881, 2, -0.011448]], [[[-0.116, -0.024, 0.067, 0.157, 0.247, 0.339, 0.416, 0.51, 0.582, 0.66, 0.729, 0.788, 0.843, 0.875, 0.927, 0.955, 0.974, 0.993, 1.0, 0.998, 0.986, 0.964, 0.937, 0.914, 0.865, 0.836, 0.756, 0.714, 0.648, 0.534, 0.457, 0.37], 0.05, 1.813], [None, 1, None]], [[[0.996, 0.809, 0.426, -0.058, -0.471, -0.802, -0.887, -0.736, -0.425, -0.086, 0.322, 0.651, 0.786, 0.7], 0.1, 5.023], [None, 1, None]], [[[-0.055, -0.888, -0.797, 0.135, 0.894, 0.691, -0.143, -0.875, -0.622, 0.233, 0.834, 0.499, -0.423, -0.844, -0.441, 0.181, 0.789, 0.579, -0.249, -0.783, -0.48, 0.502, 0.748, 0.38, -0.392, -0.623, -0.127, 0.631], 0.25, 4.231], [1.457025, 5, -0.018862]], [[[-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.956, 1.0, 0.942, 0.783, 0.546, 0.251, -0.055, -0.38, -0.686, -0.877, -0.981, -0.998], 0.1, 3.186], [None, 0, None]], [[[-0.401, 0.525, 0.905, 0.442, -0.373, -0.776, -0.497, 0.202, 0.657, 0.424, -0.109, -0.559, -0.42, -0.039, 0.436, 0.44, -0.081, -0.375, -0.333, -0.118], 0.25, 3.964], [1.581132, 3, -0.002479]]]]
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[1.509126, 2, -0.006596][1.509126, 2, -0.006596]Passed
case 1[1.30728, 6, -0.017332][1.30728, 6, -0.017332]Passed
case 2[1.446397, 3, -0.026939][1.446397, 3, -0.026939]Passed
case 3[None, 1, None][None, 1, None]Passed
case 4[2.389854, 3, -0.026666][2.389854, 3, -0.026666]Passed
case 5[None, 0, None][None, 0, None]Passed
case 6[0.071523, 2, -0.962515][0.071523, 2, -0.962515]Passed
case 7[None, 0, None][None, 0, None]Passed

SHA-256 / 8e7dbf4d286095fecbf01fc41ee6dfb22aa8f8fd279091acc42106fc0a10197f

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.572330+00:00.

Case digest / 9afa79031791033f89f926231bf620a5108789308807257c35086f6166923567