FA-87281 / Physics integrator stability / Open access
Period detector counts downward crossings as well · case 01
The measured period is half the true oscillation period.
ROOT CAUSE
Any sign change counts as a crossing.
VERIFIED REPAIR
Count only upward crossings from negative to non-negative.
Unsuccessful approach: Allowing a zero start sample double counts a crossing that lands exactly on zero.
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 < 0):
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.167, -0.07, 0.027, 0.122, 0.22, 0.316, 0.396, 0.483, 0.556, 0.633, 0.0, 0.772, 0.826, 0.854, 0.904, 0.925, 0.948, 0.953, 0.956, 0.948, 0.934, 0.911, 0.86, 0.826, 0.794, 0.722, 0.648, 0.575, 0.524, 0.452, 0.363, 0.266, 0.183, 0.062, 0.001, -0.099, -0.14, -0.254], 0.05, 1.921], [None, 1, None]], [[[-0.148, -0.034, 0.073, 0.174, 0.271, 0.365, 0.444, 0.518, 0.577, 0.645, 0.688], 0.1, 1.115], [None, 1, None]], [[[-0.12, -0.271, -0.414, -0.552, -0.674, -0.767, -0.856, -0.922, -0.959, -0.976, -0.97, -0.944, -0.885, -0.832, -0.74, -0.632, -0.511, -0.37, -0.211, -0.101, 0.117, 0.234], 0.05, 3.054], [None, 1, 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.652, -0.792, -0.892, -0.951, -0.961, -0.924, -0.849, -0.74, -0.573, -0.417, -0.229], 0.05, 4.296], [None, 0, None]], [[[-0.981, -0.904, -0.463, 0.134, 0.714, 0.994, 0.852, 0.37, -0.184, -0.786, -0.999, -0.817, -0.396, 0.217, 0.816, 0.997, 0.831, 0.172, -0.235, -0.913, -0.987, -0.687, -0.191, 0.507, 0.853, 0.935, 0.831, 0.108, -0.661, -0.982, -0.967, -0.674, -0.003, 0.527, 0.989, 0.998], 0.125, 5.059], [1.217921, 4, -0.019372]], [[[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.39, 0.0, 0.374, 0.65, 0.847, 0.882, 0.777, 0.597, 0.279, 0.008, -0.359, -0.539, -0.7, -0.723, -0.629, -0.458], 0.125, 3.136], [None, 1, None]]], [[[[-0.56, -0.659, -0.747, -0.825, -0.887, -0.942, -0.974, -0.996, -1.0], 0.1, 1.237], [None, 0, None]], [[[-0.874, -0.975, -0.615, 0.046, 0.678, 0.965, 0.812, 0.27, -0.343, -0.878, -0.915, -0.538, 0.245, 0.739, 0.906, 0.637, -0.007, -0.408, -0.795, -0.789, -0.397, 0.182, 0.725, 0.853, 0.578, -0.108, -0.494, -0.757, -0.746, -0.405, 0.41, 0.638, 0.811, 0.6, -0.247, -0.675, -0.782], 0.125, 5.588], [1.106939, 4, -0.015536]], [[[0.462, 0.666, 0.0, 0.896, 0.905, 0.846, 0.73, 0.571, 0.379, 0.171, -0.042, -0.247, -0.442, -0.558, -0.644, -0.685, -0.667, -0.583, -0.456, -0.307, -0.175, -0.072, 0.157, 0.246, 0.419, 0.473, 0.513, 0.506, 0.475, 0.388, 0.349], 0.125, 2.162], [None, 1, None]], [[[-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.238, -0.74, -0.818, 0.004, 0.739, 0.537, -0.147, -0.704, -0.37, 0.372, 0.595, 0.078, -0.418, -0.506, -0.098, 0.391, 0.314, -0.166, -0.393, -0.205, 0.203, 0.335, 0.191, -0.236], 0.25, 4.477], [1.37561, 4, -0.019828]], [[[-0.079, -0.022, 0.039, 0.094, 0.154, 0.208, 0.261, 0.321, 0.366, 0.427, 0.475, 0.513, 0.572, 0.617, 0.65, 0.689, 0.723, 0.754, 0.791, 0.817, 0.843, 0.861, 0.878, 0.897, 0.915, 0.921, 0.931, 0.933], 0.05, 1.153], [None, 1, None]], [[[-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.864, -0.986, -0.957, -0.792, -0.502, -0.129, 0.0, 0.585], 0.1, 3.838], [None, 1, None]]], [[[[-0.065, -0.493, -0.815, -0.975, -0.939, -0.72, -0.314, 0.043, 0.487, 0.781, 0.942, 0.892], 0.1, 4.457], [None, 1, None]], [[[-0.958, -0.915, -0.449, 0.251, 0.801, 0.969, 0.683, 0.131, -0.526, -0.913, -0.847, -0.422, 0.209, 0.666, 0.904, 0.594, 0.028, -0.59, -0.799, -0.804, -0.222, 0.054, 0.675, 0.839, 0.576, 0.287, -0.577, -0.769, -0.769, -0.464, 0.137, 0.597, 0.789, 0.47, 0.186, -0.526], 0.125, 5.507], [1.130442, 4, -0.009205]], [[[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.97, -0.103, -0.905, -0.087, 0.795, 0.386, -0.578, -0.399, 0.378, 0.574, -0.244, -0.574, -0.009, 0.511, 0.027, -0.467, -0.018, 0.328, 0.219, -0.331, -0.325, 0.102, 0.256, -0.109, -0.301, -0.062, 0.219, 0.125, -0.243], 0.25, 5.661], [1.1061, 6, -0.00343]], [[[-0.745, -0.947, -0.997, -0.894, -0.633, -0.308, 0.087, 0.49, 0.766, 0.95, 0.0, 0.895, 0.599, 0.314], 0.125, 3.14], [None, 1, None]], [[[-0.98, -0.923, -0.835, -0.711, -0.56, -0.389, -0.206, -0.0, 0.159, 0.0, 0.517, 0.665, 0.817, 0.914, 0.965], 0.05, 3.809], [None, 1, None]], [[[0.814, 0.664, 0.499, 0.313, 0.121, -0.07, -0.231, -0.415, -0.535, -0.658, -0.724, -0.78, -0.786, -0.763, -0.71, -0.645, -0.531, -0.398, -0.243, -0.102, -0.011, 0.176, 0.261, 0.371, 0.0, 0.524, 0.565, 0.581, 0.568, 0.53, 0.473, 0.426, 0.298, 0.197, 0.161, 0.063], 0.1, 2.021], [None, 1, None]], [[[-0.912, -0.965, -0.959, -0.899, -0.784, -0.616, -0.427, -0.252, -0.039, 0.167, 0.355, 0.503, 0.627, 0.727, 0.751], 0.1, 2.415], [None, 1, None]]], [[[[0.989, 0.0, 0.877, 0.782, 0.653, 0.501, 0.362, 0.177, -0.001, -0.187], 0.05, 3.504], [None, 0, None]], [[[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.893, -0.968, -0.973, -0.908, -0.78, -0.585, -0.396, -0.122, 0.081, 0.328, 0.533, 0.696, 0.787, 0.842, 0.834, 0.733, 0.628, 0.429, 0.228, 0.084, -0.19, -0.358, -0.542, -0.639, -0.689, -0.732, -0.706, -0.649, -0.485, -0.369, -0.209, -0.001, 0.224, 0.317, 0.517], 0.25, 1.062], [5.850865, 2, -0.011072]], [[[0.968, 0.677, -0.31, -0.942, -0.647, 0.378, 0.922, 0.608, -0.289, -0.89, -0.464, 0.0, 0.858], 0.25, 4.184], [1.592195, 2, 0.06025]], [[[-0.944, -0.98, -0.979, -0.941, -0.866, -0.768, -0.648, -0.48, -0.314, -0.148, 0.011, 0.186, 0.384, 0.496], 0.05, 3.819], [None, 1, None]], [[[0.43, 0.538, 0.638, 0.729, 0.811, 0.878, 0.925, 0.964, 0.992, 1.0, 0.993, 0.974, 0.938, 0.894, 0.821, 0.74, 0.642, 0.538, 0.464, 0.34, 0.19, 0.094, -0.032, -0.149, -0.32], 0.05, 2.446], [None, 0, None]], [[[-0.541, -0.679, -0.793, -0.881, -0.937, -0.97, -0.969, -0.941, -0.881, -0.796, -0.693, -0.565, -0.421, -0.231, -0.076], 0.1, 1.749], [None, 0, None]], [[[-0.946, -0.97, -0.978, -0.968, -0.944, -0.906, -0.852, -0.782, -0.708, -0.604, -0.517, -0.403, -0.312, -0.212, -0.072, 0.057, 0.128, 0.224, 0.0, 0.449, 0.526], 0.05, 2.548], [None, 1, None]]], [[[[-0.867, -0.95, -0.986, -0.977, -0.926, -0.821, -0.688, -0.536, -0.349, -0.162, 0.067, 0.283, 0.442, 0.628, 0.727, 0.84, 0.912, 0.917, 0.897, 0.826, 0.682, 0.569, 0.442, 0.19, 0.095], 0.1, 2.13], [None, 1, None]], [[[0.989, 0.971, 0.899, 0.0, 0.619, 0.442, 0.251, 0.036], 0.125, 1.892], [None, 0, None]], [[[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.537, -0.389, -0.227, -0.058, 0.106, 0.281, 0.427, 0.588, 0.701, 0.809, 0.908, 0.957, 0.992, 0.998, 0.978, 0.924, 0.833, 0.744, 0.642, 0.449, 0.318, 0.127, 0.039], 0.05, 3.317], [None, 1, None]], [[[-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.997, 0.978, 0.887, 0.747, 0.542, 0.31, 0.034, -0.217, -0.447, -0.639, -0.792, -0.907, -0.942, -0.917, -0.818, -0.648, 0.0, -0.248, -0.049, 0.262, 0.424, 0.622, 0.789], 0.1, 2.613], [0.215756, 2, -0.910273]], [[[-0.75, -0.926, -0.998, -0.961, -0.821, -0.6, -0.282, 0.054, 0.36, 0.657, 0.863], 0.1, 3.277], [None, 1, None]]]]
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.614418, 2, -0.506413] | [None, 1, None] | Failed |
| case 1 | [None, 1, None] | [None, 1, None] | Passed |
| case 2 | [None, 1, None] | [None, 1, None] | Passed |
| case 3 | [0.035762, 3, -0.981257] | [0.071523, 2, -0.962515] | Failed |
| case 4 | [None, 0, None] | [None, 0, None] | Passed |
| case 5 | [0.608961, 7, -0.509686] | [1.217921, 4, -0.019372] | Failed |
| case 6 | [0.736719, 7, -0.504374] | [1.446397, 3, -0.026939] | Failed |
| case 7 | [1.002725, 2, -0.49953] | [None, 1, None] | Failed |
SHA-256 / a2079d367c9e292e7bdad458f119ef60343129ede9024fa5e7ed178760ef5b67
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 and a != 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.167, -0.07, 0.027, 0.122, 0.22, 0.316, 0.396, 0.483, 0.556, 0.633, 0.0, 0.772, 0.826, 0.854, 0.904, 0.925, 0.948, 0.953, 0.956, 0.948, 0.934, 0.911, 0.86, 0.826, 0.794, 0.722, 0.648, 0.575, 0.524, 0.452, 0.363, 0.266, 0.183, 0.062, 0.001, -0.099, -0.14, -0.254], 0.05, 1.921], [None, 1, None]], [[[-0.148, -0.034, 0.073, 0.174, 0.271, 0.365, 0.444, 0.518, 0.577, 0.645, 0.688], 0.1, 1.115], [None, 1, None]], [[[-0.12, -0.271, -0.414, -0.552, -0.674, -0.767, -0.856, -0.922, -0.959, -0.976, -0.97, -0.944, -0.885, -0.832, -0.74, -0.632, -0.511, -0.37, -0.211, -0.101, 0.117, 0.234], 0.05, 3.054], [None, 1, 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.652, -0.792, -0.892, -0.951, -0.961, -0.924, -0.849, -0.74, -0.573, -0.417, -0.229], 0.05, 4.296], [None, 0, None]], [[[-0.981, -0.904, -0.463, 0.134, 0.714, 0.994, 0.852, 0.37, -0.184, -0.786, -0.999, -0.817, -0.396, 0.217, 0.816, 0.997, 0.831, 0.172, -0.235, -0.913, -0.987, -0.687, -0.191, 0.507, 0.853, 0.935, 0.831, 0.108, -0.661, -0.982, -0.967, -0.674, -0.003, 0.527, 0.989, 0.998], 0.125, 5.059], [1.217921, 4, -0.019372]], [[[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.39, 0.0, 0.374, 0.65, 0.847, 0.882, 0.777, 0.597, 0.279, 0.008, -0.359, -0.539, -0.7, -0.723, -0.629, -0.458], 0.125, 3.136], [None, 1, None]]], [[[[-0.56, -0.659, -0.747, -0.825, -0.887, -0.942, -0.974, -0.996, -1.0], 0.1, 1.237], [None, 0, None]], [[[-0.874, -0.975, -0.615, 0.046, 0.678, 0.965, 0.812, 0.27, -0.343, -0.878, -0.915, -0.538, 0.245, 0.739, 0.906, 0.637, -0.007, -0.408, -0.795, -0.789, -0.397, 0.182, 0.725, 0.853, 0.578, -0.108, -0.494, -0.757, -0.746, -0.405, 0.41, 0.638, 0.811, 0.6, -0.247, -0.675, -0.782], 0.125, 5.588], [1.106939, 4, -0.015536]], [[[0.462, 0.666, 0.0, 0.896, 0.905, 0.846, 0.73, 0.571, 0.379, 0.171, -0.042, -0.247, -0.442, -0.558, -0.644, -0.685, -0.667, -0.583, -0.456, -0.307, -0.175, -0.072, 0.157, 0.246, 0.419, 0.473, 0.513, 0.506, 0.475, 0.388, 0.349], 0.125, 2.162], [None, 1, None]], [[[-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.238, -0.74, -0.818, 0.004, 0.739, 0.537, -0.147, -0.704, -0.37, 0.372, 0.595, 0.078, -0.418, -0.506, -0.098, 0.391, 0.314, -0.166, -0.393, -0.205, 0.203, 0.335, 0.191, -0.236], 0.25, 4.477], [1.37561, 4, -0.019828]], [[[-0.079, -0.022, 0.039, 0.094, 0.154, 0.208, 0.261, 0.321, 0.366, 0.427, 0.475, 0.513, 0.572, 0.617, 0.65, 0.689, 0.723, 0.754, 0.791, 0.817, 0.843, 0.861, 0.878, 0.897, 0.915, 0.921, 0.931, 0.933], 0.05, 1.153], [None, 1, None]], [[[-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.864, -0.986, -0.957, -0.792, -0.502, -0.129, 0.0, 0.585], 0.1, 3.838], [None, 1, None]]], [[[[-0.065, -0.493, -0.815, -0.975, -0.939, -0.72, -0.314, 0.043, 0.487, 0.781, 0.942, 0.892], 0.1, 4.457], [None, 1, None]], [[[-0.958, -0.915, -0.449, 0.251, 0.801, 0.969, 0.683, 0.131, -0.526, -0.913, -0.847, -0.422, 0.209, 0.666, 0.904, 0.594, 0.028, -0.59, -0.799, -0.804, -0.222, 0.054, 0.675, 0.839, 0.576, 0.287, -0.577, -0.769, -0.769, -0.464, 0.137, 0.597, 0.789, 0.47, 0.186, -0.526], 0.125, 5.507], [1.130442, 4, -0.009205]], [[[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.97, -0.103, -0.905, -0.087, 0.795, 0.386, -0.578, -0.399, 0.378, 0.574, -0.244, -0.574, -0.009, 0.511, 0.027, -0.467, -0.018, 0.328, 0.219, -0.331, -0.325, 0.102, 0.256, -0.109, -0.301, -0.062, 0.219, 0.125, -0.243], 0.25, 5.661], [1.1061, 6, -0.00343]], [[[-0.745, -0.947, -0.997, -0.894, -0.633, -0.308, 0.087, 0.49, 0.766, 0.95, 0.0, 0.895, 0.599, 0.314], 0.125, 3.14], [None, 1, None]], [[[-0.98, -0.923, -0.835, -0.711, -0.56, -0.389, -0.206, -0.0, 0.159, 0.0, 0.517, 0.665, 0.817, 0.914, 0.965], 0.05, 3.809], [None, 1, None]], [[[0.814, 0.664, 0.499, 0.313, 0.121, -0.07, -0.231, -0.415, -0.535, -0.658, -0.724, -0.78, -0.786, -0.763, -0.71, -0.645, -0.531, -0.398, -0.243, -0.102, -0.011, 0.176, 0.261, 0.371, 0.0, 0.524, 0.565, 0.581, 0.568, 0.53, 0.473, 0.426, 0.298, 0.197, 0.161, 0.063], 0.1, 2.021], [None, 1, None]], [[[-0.912, -0.965, -0.959, -0.899, -0.784, -0.616, -0.427, -0.252, -0.039, 0.167, 0.355, 0.503, 0.627, 0.727, 0.751], 0.1, 2.415], [None, 1, None]]], [[[[0.989, 0.0, 0.877, 0.782, 0.653, 0.501, 0.362, 0.177, -0.001, -0.187], 0.05, 3.504], [None, 0, None]], [[[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.893, -0.968, -0.973, -0.908, -0.78, -0.585, -0.396, -0.122, 0.081, 0.328, 0.533, 0.696, 0.787, 0.842, 0.834, 0.733, 0.628, 0.429, 0.228, 0.084, -0.19, -0.358, -0.542, -0.639, -0.689, -0.732, -0.706, -0.649, -0.485, -0.369, -0.209, -0.001, 0.224, 0.317, 0.517], 0.25, 1.062], [5.850865, 2, -0.011072]], [[[0.968, 0.677, -0.31, -0.942, -0.647, 0.378, 0.922, 0.608, -0.289, -0.89, -0.464, 0.0, 0.858], 0.25, 4.184], [1.592195, 2, 0.06025]], [[[-0.944, -0.98, -0.979, -0.941, -0.866, -0.768, -0.648, -0.48, -0.314, -0.148, 0.011, 0.186, 0.384, 0.496], 0.05, 3.819], [None, 1, None]], [[[0.43, 0.538, 0.638, 0.729, 0.811, 0.878, 0.925, 0.964, 0.992, 1.0, 0.993, 0.974, 0.938, 0.894, 0.821, 0.74, 0.642, 0.538, 0.464, 0.34, 0.19, 0.094, -0.032, -0.149, -0.32], 0.05, 2.446], [None, 0, None]], [[[-0.541, -0.679, -0.793, -0.881, -0.937, -0.97, -0.969, -0.941, -0.881, -0.796, -0.693, -0.565, -0.421, -0.231, -0.076], 0.1, 1.749], [None, 0, None]], [[[-0.946, -0.97, -0.978, -0.968, -0.944, -0.906, -0.852, -0.782, -0.708, -0.604, -0.517, -0.403, -0.312, -0.212, -0.072, 0.057, 0.128, 0.224, 0.0, 0.449, 0.526], 0.05, 2.548], [None, 1, None]]], [[[[-0.867, -0.95, -0.986, -0.977, -0.926, -0.821, -0.688, -0.536, -0.349, -0.162, 0.067, 0.283, 0.442, 0.628, 0.727, 0.84, 0.912, 0.917, 0.897, 0.826, 0.682, 0.569, 0.442, 0.19, 0.095], 0.1, 2.13], [None, 1, None]], [[[0.989, 0.971, 0.899, 0.0, 0.619, 0.442, 0.251, 0.036], 0.125, 1.892], [None, 0, None]], [[[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.537, -0.389, -0.227, -0.058, 0.106, 0.281, 0.427, 0.588, 0.701, 0.809, 0.908, 0.957, 0.992, 0.998, 0.978, 0.924, 0.833, 0.744, 0.642, 0.449, 0.318, 0.127, 0.039], 0.05, 3.317], [None, 1, None]], [[[-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.997, 0.978, 0.887, 0.747, 0.542, 0.31, 0.034, -0.217, -0.447, -0.639, -0.792, -0.907, -0.942, -0.917, -0.818, -0.648, 0.0, -0.248, -0.049, 0.262, 0.424, 0.622, 0.789], 0.1, 2.613], [0.215756, 2, -0.910273]], [[[-0.75, -0.926, -0.998, -0.961, -0.821, -0.6, -0.282, 0.054, 0.36, 0.657, 0.863], 0.1, 3.277], [None, 1, None]]]]
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.413918, 2, -0.87345] | [None, 1, None] | Failed |
| case 1 | [None, 1, None] | [None, 1, None] | Passed |
| case 2 | [None, 1, None] | [None, 1, None] | Passed |
| case 3 | [0.071523, 2, -0.962515] | [0.071523, 2, -0.962515] | Passed |
| case 4 | [None, 0, None] | [None, 0, None] | Passed |
| case 5 | [1.217921, 4, -0.019372] | [1.217921, 4, -0.019372] | Passed |
| case 6 | [1.446397, 3, -0.026939] | [1.446397, 3, -0.026939] | Passed |
| case 7 | [0.0, 2, -1.0] | [None, 1, None] | Failed |
SHA-256 / 7b2e5c5577081282c3f413286067d16de1ae568cbd27216e830f364b7e37a2f3
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.167, -0.07, 0.027, 0.122, 0.22, 0.316, 0.396, 0.483, 0.556, 0.633, 0.0, 0.772, 0.826, 0.854, 0.904, 0.925, 0.948, 0.953, 0.956, 0.948, 0.934, 0.911, 0.86, 0.826, 0.794, 0.722, 0.648, 0.575, 0.524, 0.452, 0.363, 0.266, 0.183, 0.062, 0.001, -0.099, -0.14, -0.254], 0.05, 1.921], [None, 1, None]], [[[-0.148, -0.034, 0.073, 0.174, 0.271, 0.365, 0.444, 0.518, 0.577, 0.645, 0.688], 0.1, 1.115], [None, 1, None]], [[[-0.12, -0.271, -0.414, -0.552, -0.674, -0.767, -0.856, -0.922, -0.959, -0.976, -0.97, -0.944, -0.885, -0.832, -0.74, -0.632, -0.511, -0.37, -0.211, -0.101, 0.117, 0.234], 0.05, 3.054], [None, 1, 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.652, -0.792, -0.892, -0.951, -0.961, -0.924, -0.849, -0.74, -0.573, -0.417, -0.229], 0.05, 4.296], [None, 0, None]], [[[-0.981, -0.904, -0.463, 0.134, 0.714, 0.994, 0.852, 0.37, -0.184, -0.786, -0.999, -0.817, -0.396, 0.217, 0.816, 0.997, 0.831, 0.172, -0.235, -0.913, -0.987, -0.687, -0.191, 0.507, 0.853, 0.935, 0.831, 0.108, -0.661, -0.982, -0.967, -0.674, -0.003, 0.527, 0.989, 0.998], 0.125, 5.059], [1.217921, 4, -0.019372]], [[[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.39, 0.0, 0.374, 0.65, 0.847, 0.882, 0.777, 0.597, 0.279, 0.008, -0.359, -0.539, -0.7, -0.723, -0.629, -0.458], 0.125, 3.136], [None, 1, None]]], [[[[-0.56, -0.659, -0.747, -0.825, -0.887, -0.942, -0.974, -0.996, -1.0], 0.1, 1.237], [None, 0, None]], [[[-0.874, -0.975, -0.615, 0.046, 0.678, 0.965, 0.812, 0.27, -0.343, -0.878, -0.915, -0.538, 0.245, 0.739, 0.906, 0.637, -0.007, -0.408, -0.795, -0.789, -0.397, 0.182, 0.725, 0.853, 0.578, -0.108, -0.494, -0.757, -0.746, -0.405, 0.41, 0.638, 0.811, 0.6, -0.247, -0.675, -0.782], 0.125, 5.588], [1.106939, 4, -0.015536]], [[[0.462, 0.666, 0.0, 0.896, 0.905, 0.846, 0.73, 0.571, 0.379, 0.171, -0.042, -0.247, -0.442, -0.558, -0.644, -0.685, -0.667, -0.583, -0.456, -0.307, -0.175, -0.072, 0.157, 0.246, 0.419, 0.473, 0.513, 0.506, 0.475, 0.388, 0.349], 0.125, 2.162], [None, 1, None]], [[[-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.238, -0.74, -0.818, 0.004, 0.739, 0.537, -0.147, -0.704, -0.37, 0.372, 0.595, 0.078, -0.418, -0.506, -0.098, 0.391, 0.314, -0.166, -0.393, -0.205, 0.203, 0.335, 0.191, -0.236], 0.25, 4.477], [1.37561, 4, -0.019828]], [[[-0.079, -0.022, 0.039, 0.094, 0.154, 0.208, 0.261, 0.321, 0.366, 0.427, 0.475, 0.513, 0.572, 0.617, 0.65, 0.689, 0.723, 0.754, 0.791, 0.817, 0.843, 0.861, 0.878, 0.897, 0.915, 0.921, 0.931, 0.933], 0.05, 1.153], [None, 1, None]], [[[-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.864, -0.986, -0.957, -0.792, -0.502, -0.129, 0.0, 0.585], 0.1, 3.838], [None, 1, None]]], [[[[-0.065, -0.493, -0.815, -0.975, -0.939, -0.72, -0.314, 0.043, 0.487, 0.781, 0.942, 0.892], 0.1, 4.457], [None, 1, None]], [[[-0.958, -0.915, -0.449, 0.251, 0.801, 0.969, 0.683, 0.131, -0.526, -0.913, -0.847, -0.422, 0.209, 0.666, 0.904, 0.594, 0.028, -0.59, -0.799, -0.804, -0.222, 0.054, 0.675, 0.839, 0.576, 0.287, -0.577, -0.769, -0.769, -0.464, 0.137, 0.597, 0.789, 0.47, 0.186, -0.526], 0.125, 5.507], [1.130442, 4, -0.009205]], [[[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.97, -0.103, -0.905, -0.087, 0.795, 0.386, -0.578, -0.399, 0.378, 0.574, -0.244, -0.574, -0.009, 0.511, 0.027, -0.467, -0.018, 0.328, 0.219, -0.331, -0.325, 0.102, 0.256, -0.109, -0.301, -0.062, 0.219, 0.125, -0.243], 0.25, 5.661], [1.1061, 6, -0.00343]], [[[-0.745, -0.947, -0.997, -0.894, -0.633, -0.308, 0.087, 0.49, 0.766, 0.95, 0.0, 0.895, 0.599, 0.314], 0.125, 3.14], [None, 1, None]], [[[-0.98, -0.923, -0.835, -0.711, -0.56, -0.389, -0.206, -0.0, 0.159, 0.0, 0.517, 0.665, 0.817, 0.914, 0.965], 0.05, 3.809], [None, 1, None]], [[[0.814, 0.664, 0.499, 0.313, 0.121, -0.07, -0.231, -0.415, -0.535, -0.658, -0.724, -0.78, -0.786, -0.763, -0.71, -0.645, -0.531, -0.398, -0.243, -0.102, -0.011, 0.176, 0.261, 0.371, 0.0, 0.524, 0.565, 0.581, 0.568, 0.53, 0.473, 0.426, 0.298, 0.197, 0.161, 0.063], 0.1, 2.021], [None, 1, None]], [[[-0.912, -0.965, -0.959, -0.899, -0.784, -0.616, -0.427, -0.252, -0.039, 0.167, 0.355, 0.503, 0.627, 0.727, 0.751], 0.1, 2.415], [None, 1, None]]], [[[[0.989, 0.0, 0.877, 0.782, 0.653, 0.501, 0.362, 0.177, -0.001, -0.187], 0.05, 3.504], [None, 0, None]], [[[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.893, -0.968, -0.973, -0.908, -0.78, -0.585, -0.396, -0.122, 0.081, 0.328, 0.533, 0.696, 0.787, 0.842, 0.834, 0.733, 0.628, 0.429, 0.228, 0.084, -0.19, -0.358, -0.542, -0.639, -0.689, -0.732, -0.706, -0.649, -0.485, -0.369, -0.209, -0.001, 0.224, 0.317, 0.517], 0.25, 1.062], [5.850865, 2, -0.011072]], [[[0.968, 0.677, -0.31, -0.942, -0.647, 0.378, 0.922, 0.608, -0.289, -0.89, -0.464, 0.0, 0.858], 0.25, 4.184], [1.592195, 2, 0.06025]], [[[-0.944, -0.98, -0.979, -0.941, -0.866, -0.768, -0.648, -0.48, -0.314, -0.148, 0.011, 0.186, 0.384, 0.496], 0.05, 3.819], [None, 1, None]], [[[0.43, 0.538, 0.638, 0.729, 0.811, 0.878, 0.925, 0.964, 0.992, 1.0, 0.993, 0.974, 0.938, 0.894, 0.821, 0.74, 0.642, 0.538, 0.464, 0.34, 0.19, 0.094, -0.032, -0.149, -0.32], 0.05, 2.446], [None, 0, None]], [[[-0.541, -0.679, -0.793, -0.881, -0.937, -0.97, -0.969, -0.941, -0.881, -0.796, -0.693, -0.565, -0.421, -0.231, -0.076], 0.1, 1.749], [None, 0, None]], [[[-0.946, -0.97, -0.978, -0.968, -0.944, -0.906, -0.852, -0.782, -0.708, -0.604, -0.517, -0.403, -0.312, -0.212, -0.072, 0.057, 0.128, 0.224, 0.0, 0.449, 0.526], 0.05, 2.548], [None, 1, None]]], [[[[-0.867, -0.95, -0.986, -0.977, -0.926, -0.821, -0.688, -0.536, -0.349, -0.162, 0.067, 0.283, 0.442, 0.628, 0.727, 0.84, 0.912, 0.917, 0.897, 0.826, 0.682, 0.569, 0.442, 0.19, 0.095], 0.1, 2.13], [None, 1, None]], [[[0.989, 0.971, 0.899, 0.0, 0.619, 0.442, 0.251, 0.036], 0.125, 1.892], [None, 0, None]], [[[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.537, -0.389, -0.227, -0.058, 0.106, 0.281, 0.427, 0.588, 0.701, 0.809, 0.908, 0.957, 0.992, 0.998, 0.978, 0.924, 0.833, 0.744, 0.642, 0.449, 0.318, 0.127, 0.039], 0.05, 3.317], [None, 1, None]], [[[-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.997, 0.978, 0.887, 0.747, 0.542, 0.31, 0.034, -0.217, -0.447, -0.639, -0.792, -0.907, -0.942, -0.917, -0.818, -0.648, 0.0, -0.248, -0.049, 0.262, 0.424, 0.622, 0.789], 0.1, 2.613], [0.215756, 2, -0.910273]], [[[-0.75, -0.926, -0.998, -0.961, -0.821, -0.6, -0.282, 0.054, 0.36, 0.657, 0.863], 0.1, 3.277], [None, 1, None]]]]
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 | [None, 1, None] | [None, 1, None] | Passed |
| case 1 | [None, 1, None] | [None, 1, None] | Passed |
| case 2 | [None, 1, None] | [None, 1, None] | Passed |
| case 3 | [0.071523, 2, -0.962515] | [0.071523, 2, -0.962515] | Passed |
| case 4 | [None, 0, None] | [None, 0, None] | Passed |
| case 5 | [1.217921, 4, -0.019372] | [1.217921, 4, -0.019372] | Passed |
| case 6 | [1.446397, 3, -0.026939] | [1.446397, 3, -0.026939] | Passed |
| case 7 | [None, 1, None] | [None, 1, None] | Passed |
SHA-256 / 0074b00f60a045ee5a6c8d99a08ded509664d19f963fc3f484d47b295ce71a31
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.310393+00:00.
Case digest / c027622d624850806c4a37bdc1d4b5ed0dbae526e61db19704ffa72eccd93e8b