From 54102b4f3c8d61360b963b7d7288d8b4c461b4d5 Mon Sep 17 00:00:00 2001 From: Emily Boudreaux Date: Sat, 19 Sep 2026 11:15:28 -0400 Subject: [PATCH] Retain unbordered residual and central-border diagnostics in summaries --- experiments/summarize_density_order.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/experiments/summarize_density_order.py b/experiments/summarize_density_order.py index 917c7c7..06c7e94 100644 --- a/experiments/summarize_density_order.py +++ b/experiments/summarize_density_order.py @@ -128,6 +128,11 @@ def build_rows(audits): "observer_seconds": case["observer_timings"]["observer_total"], "elapsed_seconds_including_observers": case["run"]["seconds"], "utc_minus_monotonic_seconds": case["run"]["utc_minus_monotonic_seconds"]} + physical18 = case["physical"]["18"]["metrics"] + # A bordered solve can meet its reported tolerance while the + # unbordered equations still carry the auxiliary border action. + for key in ("normalized_unbordered_residual", "central_border", "normalized_border_action"): + row["final_" + key] = finite(physical18[key], "final " + key, nonnegative=key != "central_border") for q in (14, 18): physical = case["physical"][str(q)]["metrics"] for source, label in (("enthalpy_virial_error", "h_energy_virial"), @@ -305,6 +310,7 @@ class Tests(unittest.TestCase): measure = {"summary": {"30": fine}, "surface": {}, "negative_mass_q30_minus_q22": 0., "negative_volume_q30_minus_q22": 0.} q = {"eos_squared_integral": 4e-8, "eos_defined_everywhere_sampled": True, "volume": 1., "negative_enthalpy_samples": 0} metrics = {"enthalpy_virial_error": 2e-6, "enthalpy_force_virial_error": 3e-5, + "normalized_unbordered_residual": .04, "central_border": -.125, "normalized_border_action": .03, "virial_error": None, "force_virial_error": None} case = {"artifact_passed": True, "kind": "coupled", "n": 1.5, "J": 0., "K": 1., "density_degree": 2, "state_size": 50, "block_sizes": {"value/density": 27}, @@ -327,6 +333,9 @@ class Tests(unittest.TestCase): self.assertTrue(row["h_energy_virial_q18_within_1e5"]) self.assertFalse(row["h_force_virial_q18_within_1e5"]) self.assertIsNone(row["density_energy_virial_q18_within_1e5"]) + self.assertEqual(row["final_normalized_unbordered_residual"], .04) + self.assertEqual(row["final_central_border"], -.125) + self.assertEqual(row["final_normalized_border_action"], .03) def main(): @@ -356,6 +365,7 @@ def main(): write_csv(args.output / "coupled_outcomes.csv", coupled, ["case", "n", "J", "density_degree", "source_state_dofs", "density_dofs", "converged", "failure", "accepted_steps", "krylov_iterations", "newton_iteration_seconds", "linear_solve_seconds", "initial_residual", "final_residual", "final_over_initial_residual", "h_energy_virial_q18", "h_force_virial_q18", + "final_normalized_unbordered_residual", "final_central_border", "final_normalized_border_action", "h_energy_virial_q14", "h_force_virial_q14", "negative_mass_over_abs_mass", "negative_volume_fraction", "negative_classification", "eos_l2_q30", "eos_rms_q30"]) write_csv(args.output / "relative_to_Q2.csv", relative) @@ -369,6 +379,7 @@ def main(): "Negative-mass denominator is the absolute measured density mass, not a substituted exact target mass.", "Uncertainty scales are reconstruction indicators, not rigorous bounds; zero observed negativity is not a global positivity certificate.", "Newton seconds sum reported nonlinear-iteration times, excluding observer and setup costs; total elapsed time is kept separately.", + "Final unbordered residual, signed central border and normalized border action come from q18 physical diagnostics; bordered convergence does not imply that these vanish.", "Ratios to Q2 compare recorded endpoints and do not imply equal convergence or error tolerances were attained.", "Undefined values are null/blank; zero is kept exactly. No logarithmic plot floor is inserted.", "P(h) virial milestones do not establish pointwise density validity; density-based virials are retained separately."],