Files
MeanField/experiments/DAMPED_COUPLED_TRIAL_2026-09-18.md

360 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Damped fully coupled trial correction
This investigation branches from `46249d0` onto
`research/damped-coupled-trial-20260918`. It tests two separate mechanisms:
bounded damping of one fully coupled correction, and reserving that correction
solve for a trial whose merit is reasonably close to its affine prediction.
The previous full-step policy remains available and the default solver is unchanged.
The combined opt-in policy gives useful measured progress, but does not yet
establish convergence. On the matched six-update n=1.5,J=0 trajectory it reaches
F=1.24583e-5 versus 1.49720e-5 for gravity correction alone: 16.79% lower residual
for 22.08% more Newton iteration time. After their identical first update, the
residual reductions are 22.85% versus 7.29%, giving 2.53 times greater decrease
per iteration-second over that bounded interval. Both runs hit the six-update
cap. Endpoint enthalpy-based virials remain below 1e-5, while negative density
and local EOS defects remain unresolved. The default solver remains unchanged.
## Algorithm and architecture
At accepted state x, capture F0=F(x), the actual Newton direction p and J0 p.
For outer step alpha and prepared candidate y (raw or gravity-corrected), set
L=F0+alpha J0 p and solve J(y)c=L-F(y). The unscaled c must satisfy both the
existing independent full-J defect check and the existing norm cap.
The optional search prepares y+beta c with beta=1,1/2,1/4,1/8, always starting
from y. One auxiliary solve supplies all four candidates. The first improving
candidate passing ordinary outer acceptance ends the search. Otherwise the
lowest-merit admissible improvement is retained; an earlier selected candidate
is freshly prepared, and complete failure restores y with its current inverse.
No accepted-state buffer is written by this transaction.
For the optional attempt selector, D=M(F0)-M(L) must be finite and positive.
The solve is eligible when (M(F(y))-M(F0))/D <= k, with default k=1. A deferral
spends no auxiliary budget. This is a bounded-work heuristic, not a convergence
guarantee. It requires a deterministic metric of the supplied residual with
fixed parameters; the default normalized residual metric satisfies this contract.
Algorithms are selected by types: `FullCoupledStep`/`BacktrackedCoupledStep`
and `EveryRejectedCoupledAttempt`/`NearAcceptanceCoupledAttempt`. Runtime
iteration counts, reduction factors and tolerances are validated collectively.
`BacktrackedCoupledCurvatureCorrection` composes damping and near-acceptance
selection in the existing typed `NewtonNumerics` recipe. The original
`CoupledCurvatureCorrection` remains the full-step/every-rejected control.
Neither changes the physics-facing model specification or central-density policy.
An auxiliary report describes c, not beta c. For a damped candidate the exact
remainder identity is
F(y+beta c)-L = (1-beta)(F(y)-L) + beta (J(y)c-(L-F(y))) + E_beta,
E_beta = F(y+beta c)-F(y)-beta J(y)c.
Scaling c therefore does not imply solving the original auxiliary RHS to its
original tolerance. The actual freshly prepared residual decides acceptance.
## Reproduction and evidence
The versioned `damped_coupled_screen_2026-09-18.json` compares none/full/damped/near
for the late n=1.5,J=0 snapshot on raw and gravity-corrected paths, plus a seed
control. No central constraint is imposed. Each sequence captures once, shares
one auxiliary-solve budget, tests every halving from alpha=1 through 1/4096 and
stops at its first accepted candidate. The prior independent-alpha screen did
not represent this shared budget and omitted some intermediate step lengths.
The campaign runner builds a clean committed revision, copies an immutable
executable and hashes mesh, inputs and outputs. The experiment calls the same
production transaction and production gravity correction as Newton. It records
every candidate evaluation, fresh selected-state replay and unchanged accepted
buffers/normalization. Only the accepted trial is replayed for quadrature-14 and
quadrature-18 physical observations, outside the timed selection phase.
Operation timings include raw preparation, gravity correction and the coupled transaction.
They exclude setup, ordinary initial/final metric calls, final restoration, accepted
commit refresh, artifact output and physical replay; search wall time
also includes artifact output. Callback vector copies remain in the measured
transaction. The no-correction control captures the same tangent for a comparable
screen, so capture cost is reported separately and is not ordinary Newton work
for that control. Builds, timed numerical cases and artifact audits do not overlap; numerical
cases run one at a time.
## Frozen sequential trial results
The independent artifact audit passed all nine cases in `screen_v1` (see
`screen_v1_audit.json` in the evidence directory below). This audits the recorded transaction algebra and true-defect certificates
from saved vectors, provenance, and recorded restoration evidence; it does not
certify a converged or physically admissible stellar model.
### What improved
The late-state screen uses the same saved state and Newton direction, a halving
line search beginning at alpha=1, one shared correction-solve budget, and the
first accepted trial. The initial full residual norm is 1.3966991044e-5.
| Path | Policy | Accepted alpha | Residual decrease | Search operation time |
| --- | --- | ---: | ---: | ---: |
| Raw | No coupled correction | 1/512 | 0.116541% | 49.04 s |
| Raw | Full correction, every rejection eligible | 1/512 | 0.116541% | 69.00 s |
| Raw | Damped correction, every rejection eligible | 1/512 | 0.116541% | 95.33 s |
| Raw | Damped correction, near-acceptance eligibility | 1/256 | 0.253536% | 80.11 s |
| Gravity-prepared | No coupled correction | 1/512 | 0.047127% | 116.06 s |
| Gravity-prepared | Full correction, every rejection eligible | 1/512 | 0.047127% | Excluded: clock anomaly |
| Gravity-prepared | Damped correction, every rejection eligible | 1/512 | 0.047127% | 168.80 s |
| Gravity-prepared | Damped correction, near-acceptance eligibility | 1/256 | 0.189199% | 128.75 s |
These are original-screen operation timings, excluding artifact writes,
initialization, physical replay, and the separately measured base capture.
The three timing repeats below use the identical diagnostic binary. The excluded
original gravity/full timing is retained as evidence, without rescaling.
The demonstrated accepted-step gain comes from **eligibility timing**. The near
gate defers the prepared rejections at 1/32, 1/64, and 1/128, preserving the sole
solve for 1/256. Both accepted corrections use beta=1 and stop after one
candidate. Damping is therefore not responsible for their accepted improvement.
Without this gate, the correction budget is spent at 1/32, and the eventual
accepted state equals the corresponding baseline. Gravity damping does improve
the rejected 1/32 candidate at beta=1/2, but it remains unacceptable.
The nominal accepted alpha improves **twofold, not fourfold**. The earlier
independent-alpha screen omitted 1/512 and did not reproduce a shared-budget
search. The present residual decreases and costs describe one frozen search;
they establish neither sustained convergence nor a nonlinear speedup. They also
do not establish that the chosen eligibility threshold is effective at other
states, polytropic indices, or rotation rates.
### Seed control
The seed's independently verified outer defect is 0.0281993. Its first trial,
alpha=1, already passes after existing gravity preparation: the residual falls
from 2.736592176e-4 to 1.614841549e-5, a 94.0991% decrease. The new policy performs
zero coupled solves, beta evaluations, or deferrals. This confirms nonintervention
at this sampled seed; it is not a complete trajectory or performance control.
### Physical interpretation
All selected snapshots replay exactly, with accepted buffers, direction,
normalization factors, residual, and Jacobian action restored. The q18
enthalpy-pressure energy virial errors are 4.059–4.068e-6 for the late candidates
and 4.3646e-6 for the seed candidate. Force virial errors are 2.565–2.572e-6 and
2.8455e-6, respectively. Raising quadrature from q14 to q18 changes either
enthalpy-based virial diagnostic by only 1.828–1.834e-9. Mass errors are
3.13–3.71e-6, Jz is zero, and sampled mapping determinants remain above 0.9858.
However, every selected snapshot retains negative density: q18 minima range
from -8.25e-4 to -8.64e-4. Density-derived pressure is not defined everywhere,
and its reported virial diagnostics are NaN. The q18 negative-density mass
fraction is about 2.90e-5, **29–30% larger** than its q14 estimate. The sampled
density-minimum magnitude increases 15–17%, and the maximum scaled EOS mismatch
increases about 17%; the RMS scaled EOS mismatch changes about 0.21%.
Thus the enthalpy-based global virial diagnostic meets 1e-5 and is stable under
this quadrature comparison, while local density/EOS defects remain unresolved.
This comparison is neither a mesh-convergence study nor a pointwise positivity
certificate. Frozen Armijo acceptance must not be presented as model convergence
or complete physical validation.
## Timing repeats
The first gravity/full case had inconsistent elapsed clocks: 531.747 s UTC
versus 236.576 s Python monotonic, with a 325.024 s C++ auxiliary solve. It is
excluded from performance comparisons. The runner now records child user/system
CPU time, UTC elapsed time and monotonic elapsed time independently. A temporary
idle-sleep guard covers each subsequent campaign; no phase time is rescaled.
| Repeat | Search operation time | Total elapsed / child CPU | Result |
| --- | ---: | ---: | --- |
| Gravity/full | 149.17 s | 227.30 / 226.58 s | Same baseline endpoint; 53 auxiliary iterations |
| Raw/none | 45.76 s | 123.67 / 123.57 s | Same alpha=1/512 endpoint |
| Raw/near | 74.90 s | 153.11 / 153.05 s | Same alpha=1/256, beta=1 endpoint |
UTC and monotonic times differ by at most 0.0053 s in these repeats. Every saved
vector file has the same hash as its original run (68, 55 and 54 files,
respectively), and the independent vector audit passes all three. The raw
progress per operation-second ratio is 1.332 initially and 1.329 in the paired
repeat. These support about 33% greater fractional residual decrease per measured
operation-second at this frozen state, despite an approximately 7% timing shift
between campaigns. The gravity near/none ratio is 3.619 in the
one original pair; it has not received an additional paired timing repeat.
These ratios use fractional residual decrease, not merit decrease. They compare
one fixed state/direction and exclude ordinary outer linear solve, commit
refresh, initialization and physical replay. They are not Newton speedup factors.
The correction also changes the actual displacement, so a factor-two nominal
alpha is not a factor-two displacement claim.
## Matched live Newton follow-up
The paired six-update runs use the same seed, mesh, n=1.5,J=0 specification,
no central constraint, gravity-Schur preconditioner, restart 160 and outer true
defect tolerance 0.03. Only the trial policy changes: `curvature` versus
`curvature-backtracked-coupled`. Initial physical observations and layout hashes
match exactly, as do the first accepted residual, alpha, linear diagnostics and
block residuals. First-step state vectors were not saved, so these are recorded
diagnostic matches rather than a separate bitwise state comparison.
| Accepted update | Control alpha | Control F | New alpha | New F | Cumulative Newton seconds, control / new |
| ---: | ---: | ---: | ---: | ---: | ---: |
| 1 | 1 | 1.614842e-5 | 1 | 1.614842e-5 | 39.25 / 39.11 |
| 2 | 1/16 | 1.579569e-5 | 1/8 | 1.614552e-5 | 173.68 / 194.99 |
| 3 | 1/16 | 1.553144e-5 | 1/4 | 1.595479e-5 | 248.91 / 249.76 |
| 4 | 1/16 | 1.514564e-5 | 1/2 | 1.574591e-5 | 324.13 / 305.06 |
| 5 | 1/32 | 1.499075e-5 | 1/2 | 1.273240e-5 | 419.19 / 431.45 |
| 6 | 1/32 | 1.497197e-5 | 1/8 | 1.245830e-5 | 502.21 / 613.09 |
Both runs complete six accepted updates and report nonconvergence at the
iteration limit (exit 3). The original strict residual tolerance is unchanged.
The combined policy produces 16.79% lower final residual, at 22.08% more
iteration time. Excluding the identical first update, residual decreases from
that common value are 7.285% in 462.95 s (control) and 22.851% in 573.98 s (new),
a 2.530 ratio of residual decrease per second over this fixed interval. This is
a bounded progress-rate comparison, not a speedup to a converged model.
The new method initially lags. First recorded crossings of fixed residual
thresholds illustrate the tradeoff without interpolating between states:
| F threshold | Control Newton seconds | New Newton seconds |
| ---: | ---: | ---: |
| 1.60e-5 | 173.68 | 249.76 |
| 1.55e-5 | 324.13 | 431.45 |
| 1.50e-5 | 419.19 | 431.45 |
| 1.40e-5 | Not reached within six updates | 431.45 |
Total process elapsed/child CPU times are 561.92/561.22 s (control) and
671.98/671.86 s (new). UTC and monotonic elapsed times differ by 0.0014 s and
-0.0318 s, respectively. The total process includes initialization, endpoint
physical diagnostics and artifact output; the iteration totals exclude these.
There is one live timing pair, not a statistical performance distribution.
### What the live corrections actually did
The control uses 354 outer Krylov iterations; the new run uses 341 outer plus
163 auxiliary iterations across three correction solves. The new gate defers
five trials, and auxiliary preparation adds 11 preparations, including one
best-candidate replay. Auxiliary solve/preparation/verification/refresh counters
are 84.35/64.03/0.67/4.77 s; these are nested work already included in iteration
time and must not be added to it. Ten beta candidates are evaluated.
At update 2 (zero-based iteration 1), alpha=1/8 has an eligible excess ratio
0.35155. The unscaled solve passes its true defect gate (relative 0.02570) and
cap (correction/cap=0.63369). Beta=1 worsens the merit; beta=1/2 passes ordinary
acceptance. It reduces residual by only 0.01795%, versus 2.18426% from the
control's next ordinary backtrack at alpha=1/16. Thus an accepted rescue need
not have the best immediate progress. It realizes only 0.1533% of the nominal
affine predicted merit decrease, despite satisfying Armijo by a factor 28.7.
Unlike the successful frozen rescues, this accepted live correction genuinely
uses damping. It changes the following trajectory: updates 3 and 4 accept
ordinary alpha=1/4 and 1/2 trials, and update 5 achieves a large residual drop.
At updates 5 and 6 the auxiliary searches keep their best improvements at
beta=1/8 and 1/4, respectively, but both still fail outer acceptance. The next
ordinary trial is accepted instead. Therefore three `kept` diagnostic events
mean only **one committed coupled rescue**. No later rejected correction is
carried into the accepted state.
A minimum realized-versus-predicted decrease guard is a plausible separate
investigation, not an established improvement: it would reject the initially
weak rescue that precedes this better final trajectory. A beta-aware prediction
F(y)+beta J(y)c would distinguish a damped candidate from the full target L
without another FEM action. Any guard must control final candidate admission
and fallback, not just beta-loop stopping. Comparing with one ordinary further
backtrack is another useful control, at one extra preparation cost. Neither
change is implemented or claimed beneficial here.
### Live endpoint physics
| q18 observation | Control | New |
| --- | ---: | ---: |
| Enthalpy-pressure energy virial error | 4.22590e-6 | 3.78554e-6 |
| Enthalpy-pressure force virial error | 2.71367e-6 | 2.31894e-6 |
| Absolute mass error | 3.41685e-6 | 2.53899e-6 |
| Absolute J error | 0 | 0 |
| Minimum sampled mapping determinant | 0.989275 | 0.989068 |
| Minimum density | -7.73185e-4 | -7.85522e-4 |
| Negative-density mass fraction | 2.89683e-5 | 2.88557e-5 |
| Scaled RMS EOS density mismatch | 1.27948e-4 | 1.27721e-4 |
| Scaled maximum EOS density mismatch | 9.63952e-4 | 9.73858e-4 |
Both endpoints meet the primary enthalpy-based virial milestone at q14 and q18;
the quadrature change is about 1.83–1.84e-9. Density-derived pressure and its
virials remain undefined because of negative samples. The new endpoint improves
the global measures while its sampled density minimum and maximum EOS defect
are slightly worse. No positivity, mesh convergence, or complete local-physics
claim follows from the virial result. The separate conservative solver/defined-
virial checker returns its expected nonpassing result for both endpoints.
### Implication and next experiment
Keep the new policy opt-in. The implementation and its cost bounds are tested;
the combined policy now has evidence of beneficial nonlinear trajectory changes
as well as frozen-step improvement. It has not yet demonstrated sustained
convergence or any higher-n/rotating result. The next useful test is a longer
matched n=1.5 trajectory from the same seed, preserving the physical diagnostics
and work accounting, before expanding to higher n and J. Do not promote the
policy or tune a new quality threshold solely from the early marginal rescue.
## Validation
Production and experiment targets build successfully with the configured release
Clang/C++23 module build. Existing duplicate-library linker warnings remain.
- Core correction tests: 23 serial cases / 1,129 assertions; the same 23 cases
on two MPI ranks pass 1,134 assertions per rank.
- Broader Newton, numerical-strategy, gravity and FGMRES regression tests:
35 cases / 357,016 assertions. Together the serial groups cover 58 cases.
- Python artifact-checker tests: 25 frozen-search cases, 27 prior cases and
4 live-checker regressions, all 56 passing.
- Actual frozen campaigns: nine original cases and three repeats, all passing
the independent recorded-vector/provenance audit.
- Matched live pair: 1,083 scalar-decision/provenance checks pass. These check
recorded true-defect observations rather than independently reapplying FEM.
Coverage includes smaller-beta acceptance after full-step rejection, preparation
failure followed by success, first-accepted stopping, best-candidate replay,
complete rejection, later-candidate/replay exceptions, restoration, near-gate
budget preservation, zero predicted decrease, already accepted originals, invalid
and rank-mismatched options, rank-local rejection, and typed recipe composition.
Real-FEM production tests cover the original and new policies on raw and gravity
paths, preservation of the outer linear report, and checkpoint restoration.
The checker reconstructs the affine prediction, auxiliary RHS, unscaled full-J
defect and cap, beta state updates and remainder identity from saved vectors.
It verifies shared budget use and first-accept stopping, checks recorded fresh
selected-state replay and restoration evidence, and checks accepted-state and
normalization invariants and input/output hashes. It does
not independently rerun FEM or physical quadrature.
## Evidence and reproduction
Evidence root (outside the source tree):
`/Users/tboudreaux/.codex/.chatgpt-projects/g-p-6a6b3f2194ec8191bebcd59075897f1d/diagnostics/damped_coupled_2026-09-18`
The original frozen screen binds to source `25816d4`; the repeats and matched
Newton cases bind to `1876229`. Their diagnostic binary hashes are recorded in
each campaign's `provenance.json`. The repeats use the same binary hash as the
screen. Test provenance and logs are in the evidence root. Tests were compiled
at `422c46b`; the subsequent source change `25816d4` only hardened the frozen
experiment's finite-metric guards.
Versioned cases:
- `damped_coupled_screen_2026-09-18.json`
- `damped_coupled_repeat_2026-09-18.json`
- `damped_coupled_newton_2026-09-18.json`
Use `run_plateau_campaign.py` with a clean committed source, its configured build,
`--mesh`, `--cases`, and a fresh `--output`. The build copies an immutable
executable before any case runs. Case manifests currently name the retained
absolute snapshot paths; relocate those explicitly when reproducing elsewhere.
After timed cases finish, run:
```sh
python3 experiments/check_damped_coupled_trial.py EVIDENCE/screen_v1 --output EVIDENCE/screen_v1_audit.json
python3 experiments/check_damped_coupled_trial.py EVIDENCE/repeat_v1 --output EVIDENCE/repeat_v1_audit.json
python3 experiments/check_damped_coupled_newton.py EVIDENCE/newton_v1 --output EVIDENCE/newton_v1_review.json
```
`TIMING_NOTE.md`, `repeat_comparison.json`, the per-case run records and all raw
CSVs/vectors preserve the timing exclusion and reproducibility evidence.