From 18762298c1c4f51abfde4ada1e98374694ba7ae7 Mon Sep 17 00:00:00 2001 From: Emily Boudreaux Date: Fri, 18 Sep 2026 11:40:36 -0400 Subject: [PATCH] Record independent campaign clocks and matched Newton follow-up cases --- .../damped_coupled_newton_2026-09-18.json | 62 ++++++++ .../damped_coupled_repeat_2026-09-18.json | 143 ++++++++++++++++++ experiments/run_plateau_campaign.py | 12 ++ 3 files changed, 217 insertions(+) create mode 100644 experiments/damped_coupled_newton_2026-09-18.json create mode 100644 experiments/damped_coupled_repeat_2026-09-18.json diff --git a/experiments/damped_coupled_newton_2026-09-18.json b/experiments/damped_coupled_newton_2026-09-18.json new file mode 100644 index 0000000..06aa755 --- /dev/null +++ b/experiments/damped_coupled_newton_2026-09-18.json @@ -0,0 +1,62 @@ +[ + { + "id": "n1p5_J0_control", + "arguments": [ + "--index", + "1.5", + "--angular-momentum", + "0", + "--strategy", + "curvature", + "--no-central", + "--max-newton", + "6", + "--restart", + "160", + "--max-linear", + "200", + "--linear-tol", + "0.03", + "--rtol", + "1e-8", + "--atol", + "0", + "--preconditioner-variant", + "gravity-schur", + "--schur-sweeps", + "1", + "--schur-relaxation", + "0.5" + ] + }, + { + "id": "n1p5_J0_near", + "arguments": [ + "--index", + "1.5", + "--angular-momentum", + "0", + "--strategy", + "curvature-backtracked-coupled", + "--no-central", + "--max-newton", + "6", + "--restart", + "160", + "--max-linear", + "200", + "--linear-tol", + "0.03", + "--rtol", + "1e-8", + "--atol", + "0", + "--preconditioner-variant", + "gravity-schur", + "--schur-sweeps", + "1", + "--schur-relaxation", + "0.5" + ] + } +] diff --git a/experiments/damped_coupled_repeat_2026-09-18.json b/experiments/damped_coupled_repeat_2026-09-18.json new file mode 100644 index 0000000..3149763 --- /dev/null +++ b/experiments/damped_coupled_repeat_2026-09-18.json @@ -0,0 +1,143 @@ +[ + { + "id": "late_curvature_full", + "arguments": [ + "--index", + "1.5", + "--angular-momentum", + "0", + "--no-central", + "--max-newton", + "0", + "--damped-coupled-probe", + "--strategy", + "curvature-coupled", + "--probe-state", + "/Users/tboudreaux/.codex/.chatgpt-projects/g-p-6a6b3f2194ec8191bebcd59075897f1d/diagnostics/nonlinear_step_2026-09-18/late_v1/n1p5_late_eta003/nonlinear_step_physical_base.txt", + "--probe-direction", + "/Users/tboudreaux/.codex/.chatgpt-projects/g-p-6a6b3f2194ec8191bebcd59075897f1d/diagnostics/nonlinear_step_2026-09-18/late_v1/n1p5_late_eta003/nonlinear_step_direction_full.txt", + "--linear-tol", + "0.03", + "--restart", + "160", + "--preconditioner-variant", + "gravity-schur", + "--schur-sweeps", + "1", + "--schur-relaxation", + "0.5", + "--gravity-tol", + "1e-10", + "--gravity-iterations", + "300", + "--gravity-restart", + "80", + "--coupled-tol", + "0.03", + "--coupled-iterations", + "160", + "--coupled-restart", + "160", + "--coupled-max-ratio", + "1", + "--coupled-attempts", + "1", + "--coupled-search", + "full" + ] + }, + { + "id": "late_raw_none", + "arguments": [ + "--index", + "1.5", + "--angular-momentum", + "0", + "--no-central", + "--max-newton", + "0", + "--damped-coupled-probe", + "--strategy", + "coupled", + "--probe-state", + "/Users/tboudreaux/.codex/.chatgpt-projects/g-p-6a6b3f2194ec8191bebcd59075897f1d/diagnostics/nonlinear_step_2026-09-18/late_v1/n1p5_late_eta003/nonlinear_step_physical_base.txt", + "--probe-direction", + "/Users/tboudreaux/.codex/.chatgpt-projects/g-p-6a6b3f2194ec8191bebcd59075897f1d/diagnostics/nonlinear_step_2026-09-18/late_v1/n1p5_late_eta003/nonlinear_step_direction_full.txt", + "--linear-tol", + "0.03", + "--restart", + "160", + "--preconditioner-variant", + "gravity-schur", + "--schur-sweeps", + "1", + "--schur-relaxation", + "0.5", + "--gravity-tol", + "1e-10", + "--gravity-iterations", + "300", + "--gravity-restart", + "80", + "--coupled-tol", + "0.03", + "--coupled-iterations", + "160", + "--coupled-restart", + "160", + "--coupled-max-ratio", + "1", + "--coupled-attempts", + "1", + "--coupled-search", + "none" + ] + }, + { + "id": "late_raw_near", + "arguments": [ + "--index", + "1.5", + "--angular-momentum", + "0", + "--no-central", + "--max-newton", + "0", + "--damped-coupled-probe", + "--strategy", + "coupled", + "--probe-state", + "/Users/tboudreaux/.codex/.chatgpt-projects/g-p-6a6b3f2194ec8191bebcd59075897f1d/diagnostics/nonlinear_step_2026-09-18/late_v1/n1p5_late_eta003/nonlinear_step_physical_base.txt", + "--probe-direction", + "/Users/tboudreaux/.codex/.chatgpt-projects/g-p-6a6b3f2194ec8191bebcd59075897f1d/diagnostics/nonlinear_step_2026-09-18/late_v1/n1p5_late_eta003/nonlinear_step_direction_full.txt", + "--linear-tol", + "0.03", + "--restart", + "160", + "--preconditioner-variant", + "gravity-schur", + "--schur-sweeps", + "1", + "--schur-relaxation", + "0.5", + "--gravity-tol", + "1e-10", + "--gravity-iterations", + "300", + "--gravity-restart", + "80", + "--coupled-tol", + "0.03", + "--coupled-iterations", + "160", + "--coupled-restart", + "160", + "--coupled-max-ratio", + "1", + "--coupled-attempts", + "1", + "--coupled-search", + "near" + ] + } +] diff --git a/experiments/run_plateau_campaign.py b/experiments/run_plateau_campaign.py index 32a48f7..9152926 100644 --- a/experiments/run_plateau_campaign.py +++ b/experiments/run_plateau_campaign.py @@ -9,6 +9,7 @@ import math import os from pathlib import Path import platform +import resource import shutil import subprocess import time @@ -133,6 +134,7 @@ def main(): state_files[str(path)] = digest(path) print('START', name, flush=True) start = time.monotonic() + cpu_start = resource.getrusage(resource.RUSAGE_CHILDREN) record = {'id': name, 'command': command, 'started_utc': utc(), 'input_state_hashes': state_files} write_json(output / (name + '_run.json'), record) with (output / (name + '.log')).open('w') as stream: @@ -144,6 +146,16 @@ def main(): record['timed_out'] = True record['exit_code'] = None record.update(seconds=time.monotonic() - start, finished_utc=utc()) + cpu_end = resource.getrusage(resource.RUSAGE_CHILDREN) + # Keep independent clocks: suspend can affect elapsed clocks differently, + # and rescaling solver phase timings would hide that uncertainty. + record['utc_elapsed_seconds'] = ( + datetime.datetime.fromisoformat(record['finished_utc']) - + datetime.datetime.fromisoformat(record['started_utc'])).total_seconds() + record['utc_minus_monotonic_seconds'] = record['utc_elapsed_seconds'] - record['seconds'] + record['child_user_cpu_seconds'] = cpu_end.ru_utime - cpu_start.ru_utime + record['child_system_cpu_seconds'] = cpu_end.ru_stime - cpu_start.ru_stime + record['child_cpu_seconds'] = record['child_user_cpu_seconds'] + record['child_system_cpu_seconds'] record['output_hashes'] = { str(path.relative_to(folder)): digest(path) for path in sorted(folder.rglob('*'))