test: preserve scalar receipts when optional shear probes fail
This commit is contained in:
1 parent
caa573f978
commit
1f64f7eb11
4 files changed
+69
-11
No files matched your search
@@ -1012,6 +1012,14 @@ class ProbeTraceTests(unittest.TestCase):
|
||||
trace["values"] = [[1.0, 0.01, -0.02] * 24 for _ in sp.STEPS]
|
||||
size = sp.validate(trace)
|
||||
self.assertLess(size, sp.TRACE_MAX_BYTES)
|
||||
final_trace = dict(trace, bytes=size)
|
||||
self.assertEqual(size, len(json.dumps(final_trace, allow_nan=False).encode()))
|
||||
self.assertEqual(sp.validate(final_trace), size)
|
||||
with patch.object(sp, "TRACE_MAX_BYTES", size):
|
||||
self.assertEqual(sp.validate(trace), size)
|
||||
with patch.object(sp, "TRACE_MAX_BYTES", size - 1):
|
||||
with self.assertRaises(ValueError):
|
||||
sp.validate(trace)
|
||||
realistic = dict(trace, values=[[1.0000012345678901, 0.012345678901234567,
|
||||
-0.023456789012345678] * 24 for _ in sp.STEPS])
|
||||
self.assertLess(sp.validate(realistic), sp.TRACE_MAX_BYTES)
|
||||
@@ -1108,6 +1116,7 @@ class ProbeTraceTests(unittest.TestCase):
|
||||
self.assertEqual(trace["steps"], list(sp.STEPS))
|
||||
self.assertEqual(len(trace["values"]), len(sp.STEPS))
|
||||
self.assertLessEqual(trace["bytes"], sp.TRACE_MAX_BYTES)
|
||||
self.assertEqual(trace["bytes"], len(json.dumps(trace, allow_nan=False).encode()))
|
||||
self.assertEqual(trace["case"], [run_case.NESTED_SHEAR, 128, 3, "projected_linear"])
|
||||
self.assertEqual(len(rec["rows"]), 5) # qualification samples preserved
|
||||
self.assertEqual(files, ["probe.json"]) # no field dumps
|
||||
@@ -1122,3 +1131,34 @@ class ProbeTraceTests(unittest.TestCase):
|
||||
self.assertTrue(all(p["level"] == 0 for p in t512["probes"]))
|
||||
res = sp.residuals(t512)
|
||||
self.assertLess(abs(res[0][0][1]), 1e-14) # exact field at t=0 at actual centers
|
||||
|
||||
def test_invalid_optional_trace_preserves_scalar_rows(self):
|
||||
sp = self.probes
|
||||
case = (128, 1, run_case.NESTED_SHEAR, "constant", [np.ones((128, 128), bool)])
|
||||
baseline, _, _ = self.run_mocked(*case)
|
||||
original = sp.sample
|
||||
for bad in ([float("nan")] * 72, [float("inf")] * 72, [1.0],
|
||||
ZeroDivisionError("zero probe density")):
|
||||
calls = []
|
||||
|
||||
def sample(arrays, probes):
|
||||
calls.append(True)
|
||||
if len(calls) == 2: # probe-only step 1, before the next scalar save
|
||||
if isinstance(bad, Exception):
|
||||
raise bad
|
||||
return bad
|
||||
return original(arrays, probes)
|
||||
|
||||
with self.subTest(bad=repr(bad)), patch.object(sp, "sample", side_effect=sample):
|
||||
rec, counts, files = self.run_mocked(*case)
|
||||
self.assertTrue(rec["completed"])
|
||||
self.assertEqual(rec["rows"], baseline["rows"])
|
||||
self.assertEqual(set(rec["probe_trace"]), {"error"})
|
||||
self.assertEqual(len(calls), 2) # no further probe sampling after rejection
|
||||
self.assertEqual(counts[-1], 2048)
|
||||
self.assertEqual(files, ["probe.json"])
|
||||
with patch.object(sp, "TRACE_MAX_BYTES", 100):
|
||||
rec, _, _ = self.run_mocked(*case)
|
||||
self.assertTrue(rec["completed"])
|
||||
self.assertEqual(rec["rows"], baseline["rows"])
|
||||
self.assertIn("exceeds", rec["probe_trace"]["error"])
|
||||
Reference in new issue
Block a user