diff --git a/experiments/check_preconditioner_benchmark.py b/experiments/check_preconditioner_benchmark.py index 75d6c7c..08b5cc0 100644 --- a/experiments/check_preconditioner_benchmark.py +++ b/experiments/check_preconditioner_benchmark.py @@ -120,7 +120,9 @@ def inspect_case_artifacts(folder): check('action_checks_present', len(action_rows) == 2 and {row['role'] for row in action_rows} == {'baseline', 'candidate'}) for row in action_rows: - expected = by_role[row['role']]['variant'] == 'independent' + measured = by_role[row['role']] + expected = measured['variant'] == 'independent' or ( + measured['variant'] == 'gravity-schur' and int(measured['schur_correction_sweeps']) == 0) check(row['role'] + '_action_variant_matches', row['variant'] == by_role[row['role']]['variant']) check(row['role'] + '_equivalence_requirement_recorded', row['context_equivalence_required'] == ('1' if expected else '0')) diff --git a/experiments/test_preconditioner_benchmark_checker.py b/experiments/test_preconditioner_benchmark_checker.py index 25ad4e1..f3820a4 100644 --- a/experiments/test_preconditioner_benchmark_checker.py +++ b/experiments/test_preconditioner_benchmark_checker.py @@ -206,6 +206,25 @@ class BenchmarkCheckerTests(unittest.TestCase): lambda data: data[0].update(context_equivalence_required=0)) self.assert_no_claim(checker.inspect_case(self.folder)) + def test_zero_sweep_gravity_control_requires_default_equivalence(self): + for variant, sweeps, equivalent in (('gravity-schur', 0, True), + ('gravity-schur', 1, False), + ('stellar-ldu-gravity-schur', 0, False)): + with self.subTest(variant=variant, sweeps=sweeps): + self.make_case() + def summary(data): + data[0]['schur_correction_sweeps'] = 0 + data[1].update(variant=variant, schur_correction_sweeps=sweeps) + self.alter_rows('preconditioner_summary.csv', summary) + self.alter_rows('preconditioner_actions.csv', lambda data: + data[1].update(variant=variant, context_equivalence_required=int(equivalent))) + result = checker.inspect_case(self.folder) + self.assertTrue(result['passed'], result) + if equivalent: + self.alter_rows('preconditioner_actions.csv', lambda data: + data[1].update(context_equivalence_required=0)) + self.assert_no_claim(checker.inspect_case(self.folder)) + def test_omitted_input_or_output_hash_cannot_support_speedup(self): for key, remove in [('input_state_hashes', str(self.snapshot)), ('output_hashes', 'candidate_normalized_linear_defect.txt')]: