Skip to content

Commit f3860f5

Browse files
committed
freq march/mask edits based on msp1/streptav testing
1 parent a053ee0 commit f3860f5

8 files changed

Lines changed: 264 additions & 47 deletions

File tree

doc/implementation_notes/pcg_priors.md

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2437,6 +2437,178 @@ the acceptable-looking outputs do not validate the prior.
24372437
setpoint to ratchet toward its known-good ~60% while shipped
24382438
pairs improve, with no regression vs the fixed-60% runs.
24392439

2440+
**AUTO-TARGET COLD START FALSIFIED -- msp1 abinitio3D REGRESSION
2441+
(2026-09-06).** Ten repeated msp1 abinitio3D runs at dc2eb9a7
2442+
(rec_backend=pcg, no prior flags): `_lp` stage snapshots normal
2443+
through stage 6, overfitted from stage 7, final postprocessed maps
2444+
wrecked. Mechanism, established from the controller law and the
2445+
recorded dataset operating points (no new instrumentation needed):
2446+
- msp1 sits at ~60% suppression AT THE DEFAULT lambda_rel=0.1 (the
2447+
2026-08-28/29 zero-flag verification runs at pinned 0.1 were
2448+
healthy, 3.86 A Nyquist-limited; the fixed-60% controller held
2449+
there too). The AIMD outer loop cold-starts the setpoint at 15%,
2450+
so the very first inner-loop step sees supp ~60% vs target 15%
2451+
and steps lambda DOWN at the x5 clamp: 0.1 -> 0.02 -> 0.01
2452+
(floor) within three iterations of stage 6. Under R10 Q_NU is the
2453+
only replay precision, so lambda at the floor is an effectively
2454+
UNREGULARIZED ML solve (`PRIOR INERT` banner): the merged matching
2455+
reference carries un-shrunk in-band noise.
2456+
- The outer loop cannot recover: it ratchets +5 points only while
2457+
the shipped-pair FSC=0.143 crossing improves by >= 2 shells, and
2458+
lp-limited ab initio stages stall (hold) almost immediately, so
2459+
the setpoint stays near 15% for the rest of the run. Worse, the
2460+
signal is the FSC of NON-independent halves (merged-reference
2461+
matching): overfitting inflates it (read as "improved"), and
2462+
regularization that removes correlated noise deflates it (read as
2463+
"degraded" -> x0.6 back-off). The loop therefore settles on the
2464+
weakest prior consistent with the highest correlated-noise FSC.
2465+
- Compounding factor: with nu_refine=no the matching-band handoff is
2466+
the RAW finest selected label (min_pct=0, "numerically unchanged
2467+
vs gridding"), i.e. the static bank's 3.98 A floor whenever a
2468+
single voxel selects it. On the gridding path that was harmless
2469+
(the references are NU-filtered); against soft Q_NU references it
2470+
matches noise. b46f5c257 caps the handoff at the stage ladder
2471+
(`lpstop` ceiling), which restores the pre-NU matching band.
2472+
- Stage 6 survives because its first iterations still run at the
2473+
default strength and the schedule lp; stage 7 (nspace 5000,
2474+
greedy frac_best 0.85, finer crop, 12 iterations) starts with the
2475+
prior already at the floor and the project lp already promoted.
2476+
The final bootstrap_rec3D resumes the floored lambda (its
2477+
calibration keeps the ~15% target), then auto-B sharpens an
2478+
unregularized native-grid map.
2479+
Log evidence (ABINITIO3D_OUTPUT_RESTART1, one of the ten runs),
2480+
read 2026-09-06, confirming the mechanism with two additions:
2481+
- stage 6 (LP 7.5): iteration 1 at the default gives supp 42.4%;
2482+
the inner loop steps 0.1 -> 0.024 at once; the outer loop then
2483+
reads a one-shell shipped-pair change (4.41 -> 4.54 A) as
2484+
DEGRADED and backs the setpoint off 15 -> 9; lambda holds at
2485+
0.024 while the readout decays 11.5 -> 3.8% over ten iterations
2486+
AT FIXED LAMBDA (the readout is not a steady-state response, see
2487+
below); one late step to 0.060.
2488+
- stage 7 (LP 6.7): the crop change re-scales the plant (22.6% at
2489+
0.060), the outer loop backs off again to 5.4 and the inner loop
2490+
steps to 0.012. From then on the readout is NEGATIVE (-3 .. -2%,
2491+
floored to 0.1%) and, because the absolute +/-5 deadband contains
2492+
the 5% setpoint floor, every iteration logs ON TARGET and holds
2493+
0.012 for the whole stage: a deadband deadlock at an inert prior.
2494+
Shipped-pair crossing walks 4.5 -> 6.3 A across the stage.
2495+
- stage 8 (LP 4.5): two IMPROVED steps raise the setpoint to 15 and
2496+
the inner loop ramps lambda 0.012 -> 0.06 -> 0.30 -> 1.4 -> 2.3
2497+
-> 3.7 -> 7.5 -> 12.1 -> 20.0 while the readout never exceeds
2498+
14%: the plant gain has collapsed, the prior is stiff where it
2499+
acts and absent elsewhere.
2500+
- final bootstrap_rec3D: calibration at 0.1 reads 39% on the native
2501+
grid, adapts to 0.027 for the pinned 15% target, ships at 17.9%.
2502+
- matching handoff: constant per stage at the finest bank label
2503+
(4.415 / 4.120 / 4.013 A), i.e. the crop's static-bank floor every
2504+
iteration of every NU stage, unbounded at this commit.
2505+
- Readout validity: the ML replay warm-starts from the PREVIOUS
2506+
iteration's shipped ML half and runs maxits_pcg=2 iterations, so
2507+
the measured suppression is a lagged property of the iterate
2508+
(previous orientations, previous lambda), not the response to the
2509+
current lambda. The one-pole identification is therefore built
2510+
on a quantity that decays at fixed lambda (stage 6) and cannot
2511+
follow a 200x lambda ramp (stage 8). Negative readouts are the
2512+
signature: the warm-started replay carries more evidenced energy
2513+
than the fresh base.
2514+
USER VERDICT (2026-09-06): the fine NU handoff must not set the
2515+
abinitio3D matching band at all; the conservative `lpstages` ladder
2516+
value is the matching low-pass in the NU stages. b46f5c257 enforces
2517+
it (the ladder rides as the `lpstop` ceiling on every staged child
2518+
and the project handoff is clipped to it at every promotion).
2519+
2520+
LOG EVIDENCE AGAINST THE CEILING ON THE PCG PATH (2026-09-06, full
2521+
log sets: msp1 10 runs at dc2eb9a7 vs 10 runs at b46f5c25 (ceiling);
2522+
streptavidin 10 runs at 9201e797 vs 2 complete runs at a053ee07
2523+
(ceiling + legacy sigma)). Streptavidin is the clean comparison
2524+
(identical workflow, full sampling, crop box 88 throughout, sigma
2525+
init path identical at every stage):
2526+
- through stage 5 the ceiling runs sit inside the healthy envelope
2527+
(stage-5 FSC=0.5/0.143 4.29/3.71 in run 2 = the healthy median);
2528+
- every healthy run improves at stage 6 from 4.29/3.7-3.8 to
2529+
3.6-3.9/3.2-3.6 A while matching at the bank's finest label 4.04 A
2530+
(the raw handoff, every iteration of stages 6-8);
2531+
- both ceiling runs match at the ladder 6.24 A in stages 6 and 7 and
2532+
do NOT improve at all (run 2: 4.29/3.52 -> 4.29/3.61; run 1:
2533+
4.57/3.92 -> 4.57/4.04), then stage 8 (ladder 4.5 A) recovers
2534+
part of the gap (3.92/3.27 vs healthy 3.7-3.8/3.1-3.2) after its
2535+
full 25 iterations -- the observed "rescued in stage 8" and the
2536+
~500 s longer wall time.
2537+
msp1 shows the same shape with a confound: the healthy set ran the
2538+
cavg_ini route (nested cavgs stages, per-particle sigma init every
2539+
stage), the ceiling set a checkpoint start at stage 4 with the
2540+
group-only sigma init ("reusing existing grouped sigmas") at every
2541+
stage. Even so: healthy stage 6 matches at 4.98 A and FSC=0.5 goes
2542+
6.7 -> 4.9 A within the stage; ceiling stage 6 matches at 7.54 A and
2543+
FSC=0.5 stays at 7.0-7.2 A; ceiling stage 7 (6.72 A, nspace 5000,
2544+
frac_best 0.85) randomizes the search in all 10 runs (projection
2545+
distance 34 deg, in-plane 84 deg, shift 4.2 px, SCORE sdev 0.002 vs
2546+
0.007-0.013 healthy) and ends at FSC 6.575/6.575 A, one shell inside
2547+
the band; stage 8 recovers to 4.35-4.48 A with the auto-lambda driven
2548+
to 15-29. All ten healthy runs end at 3.86-3.96 A.
2549+
Conclusion from the logs: on the pcg + Q_NU path the raw finest-label
2550+
handoff was the mechanism that carried the NU stages past the ladder;
2551+
the ladder ceiling removes it and the NU stages stall at the band.
2552+
The earlier "*LP* overfitted from stage 7" judgement on the dc2eb9a7
2553+
msp1 set is not supported by its FSC trajectories (ten consistent
2554+
runs, 3.9 A finals, FSC=0.5 4.0 A); the finest-label matching ran
2555+
between FSC=0.5 and FSC=0.143 of the current map, not beyond it.
2556+
Recommendation (not applied, user decision): revert the lpstop
2557+
ceiling for the pcg path, or replace it with a data-driven cap (e.g.
2558+
the base-pair FSC=0.5 crossing plus a shell or two) instead of the
2559+
class-FRC ladder, which is not informative about the particle map
2560+
once the NU stages begin.
2561+
2562+
SOLVE-SUPPORT POLICY CORRECTION (2026-09-06, user-directed). Dev item 5
2563+
(ca450fe54, 2026-09-01) and the 2026-09-02 review item made the
2564+
conservative density envelope the replay solve support unconditionally
2565+
in ML mode, independent of automsk; every msp1 and streptavidin run
2566+
since 2026-09-01 (including the ten healthy streptavidin runs at
2567+
9201e797) solved the shipped pair on that envelope while the base pair
2568+
stayed spherical, so their two FSCs were never comparable. The healthy
2569+
msp1 set (dc2eb9a7, 2026-08-31) predates it. Rule now: no envelope
2570+
masking anywhere unless automsk=yes; only then may envfsc=yes extend
2571+
the envelope to the base solve. Implemented as
2572+
pcg_density_support_enabled(params) gating build_pcg_state_support and
2573+
both current-base-pair fallbacks (shared + distributed). The envfsc FSC
2574+
evaluation itself (phase-randomized masked FSC) is unchanged and still
2575+
envfsc-only.
2576+
2577+
The controller observations above stand as a record; the guard rails
2578+
below were drafted and then WITHDRAWN (not applied), so the validated
2579+
adaptive configuration (embb, exp_gate, PfCRT) is unchanged.
2580+
Withdrawn guard rails (not applied):
2581+
- Deadband half-width capped at half the setpoint
2582+
(`min(5, 0.5*target)`), so a readout below half the target always
2583+
steps the strength up; the 5%-floor deadlock cannot recur.
2584+
- `NU_AUTOLAMBDA_LAMBDA_MIN` 0.01 -> 0.1 (= the dynamic default).
2585+
The controller may only STRENGTHEN the prior relative to the
2586+
validated default; no recorded dataset (PfCRT, 1WCM, bgal,
2587+
streptavidin, msp1, embb) has a good operating point below it.
2588+
- Setpoint seeding: at the first controller step the AIMD setpoint
2589+
is seeded from the suppression the strength in use actually
2590+
delivers, `max(15%, measured)` (stats-file key
2591+
PCG_NU_AUTOTARGET_SEEDED, cleared with the stats file). PfCRT-class
2592+
datasets (3% at the default) still ramp from 15%; msp1-class ones
2593+
hold at their default operating point and ratchet from there.
2594+
`NU_AUTOTARGET_COLD_START` replaces the literal 15 in the
2595+
controller; the parameters default block keeps 15 as provisional.
2596+
- Open: whether staged abinitio3D should run the controllers at all. The 2026-08-28/29 healthy msp1
2597+
runs were pinned at 0.1; the readout is warm-start-lagged at
2598+
maxits_pcg=2 and the reward signal is a merged-reference FSC, so
2599+
the recommended interim policy is to pin lambda_rel at the default
2600+
for the staged workflow (or freeze both loops after seeding) and
2601+
let the controllers act only in gold-standard refine3D_auto.
2602+
- Open (not changed here): the AIMD reward signal. A shipped-pair
2603+
FSC from merged-reference (non-gold-standard) matching is not a
2604+
valid over-regularization diagnostic in abinitio3D; consider
2605+
freezing the setpoint at the seeded value in staged abinitio3D
2606+
(adapt only in gold-standard refine3D_auto), or gating the ratchet
2607+
on the base-pair FSC at the stage ladder limit. Also open: the
2608+
nu_refine=no raw-finest handoff should use the same 5%-supported
2609+
percentile as nu_refine=yes on the pcg path, now that the
2610+
reference is not NU-filtered.
2611+
24402612
**FINAL-RECONSTRUCTION Q_NU POLICY (2026-08-31, user-directed).**
24412613
The original-sampling final reconstructions of abinitio3D and
24422614
refine3D_auto previously dropped the PCG backend and its prior

doc/policies/abinitio3D_policy.md

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,17 +129,22 @@ Stage 1 of `abinitio3D` never runs with a low-pass limit finer than 20 A.
129129
low-pass and crop ladder, preserving gradual frequency marching. Explicit
130130
external-volume schedules use `lpstages_setlims` and are unchanged.
131131

132-
The controller passes the current `lpinfo(istage)%lp` to each staged
133-
`refine3D` child as the stage `lpstop` ceiling alongside the effective planned
134-
matching limit. NU evidence may keep the working matching limit coarser, but it
135-
cannot promote matching to a resolution finer than the printed stage limit.
136-
This bound applies throughout every iteration in the stage, including the NU
137-
stages, rather than only when the stage command is first constructed.
132+
The controller passes an `lpstop` ceiling to each staged `refine3D` child
133+
alongside the effective planned matching limit. In the non-NU stages the
134+
ceiling is the current `lpinfo(istage)%lp`, so matching never exceeds the
135+
printed stage limit. In the NU stages the ceiling is the ladder's final limit
136+
(`lpfinal`, bounded by `LPSTOP_BOUNDS`, 4.5 A at the fine end): the NU
137+
evidence handoff may promote matching beyond the per-stage plan, because the
138+
class-FRC ladder is not informative about the particle map once NU filtering
139+
is active, but `abinitio3D` runs without gold-standard halves, so the promotion
140+
is never left open. The bound applies throughout every iteration in the stage.
138141
An explicitly supplied, coarser command-line `lpstop` is folded into the
139142
ladder and is also retained as an independent ceiling when the staged child
140143
command is rebuilt; the effective ceiling is the coarser of the two limits.
141144
The workflow logs the acknowledged command-line ceiling before entering the
142-
stage loop.
145+
stage loop. (Record 2026-09-06: capping the NU stages at the per-stage value
146+
stalled every NU stage on streptavidin and msp1 on the pcg path; see
147+
`doc/implementation_notes/pcg_priors.md`, dev item 2.)
143148

144149
Saved `_stageNN_lp.mrc` diagnostic volumes are filtered to the current state
145150
FSC resolution when an FSC exists. The planned stage LP is only a fallback.

doc/policies/automasking_policy.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ assembly pass.
8989
On the PCG backend, the reconstruction strategy builds the NU-evidence
9090
envelope while the replay unaries are live and installs it as a fixed
9191
coarsest-label boundary condition before constructing `Q_NU`. It independently
92-
builds the conservative density mask used as solve support.
92+
builds the conservative density mask used as solve support, but only under
93+
`automsk=yes`; with `automsk=no` no density mask is built and every PCG solve
94+
runs on the spherical support (policy 2026-09-06).
9395

9496
### FSC consumers
9597

doc/policies/nonuniform_filtering_policy.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -482,13 +482,14 @@ In multi-state runs, the populated state with the finest valid NU-selected
482482
limit determines the single project-level matching bandwidth, matching the
483483
classical global-bandwidth policy.
484484

485-
Staged `abinitio3D` additionally passes its current planned `lpstages` value as
486-
`lpstop`. Consequently, an NU-selected project limit may keep matching coarser
487-
than the plan but cannot promote matching beyond the current ab-initio stage
488-
boundary. This workflow constraint does not change the evidence-driven update
489-
policy used by `refine3D_auto`. When the user explicitly supplies a coarser
490-
`lpstop`, the staged workflow uses the coarser of that value and the planned
491-
stage boundary.
485+
Staged `abinitio3D` additionally passes an `lpstop` ceiling: the per-stage
486+
`lpstages` value in the non-NU stages, and the ladder's final limit (`lpfinal`,
487+
4.5 A at the fine end) in the NU stages. Consequently, an NU-selected project
488+
limit may promote matching beyond the current stage plan but never beyond the
489+
ladder's final limit. This workflow constraint does not change the
490+
evidence-driven update policy used by `refine3D_auto`. When the user explicitly
491+
supplies a coarser `lpstop`, the staged workflow uses the coarser of that value
492+
and the ceiling.
492493

493494
That project `lp` is consumed as follows:
494495

doc/policies/reconstruct3D_pcg_policy.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,10 @@ when their soft evidence is accumulated. Discovery stops two shells beyond
201201
the evidence-pair FSC=0.143 crossing. The matching handoff requires 5% assigned
202202
support and retains the same two-shell FSC headroom.
203203

204-
Solve support is phase-specific and independent of `automsk`:
204+
Solve support is an `automsk` feature (policy 2026-09-06). With `automsk=no`,
205+
the default in `abinitio3D`, every PCG solve, base and regularized replay, runs
206+
on the spherical `mskdiam` support and no density envelope is built. With
207+
`automsk=yes` the support is phase-specific:
205208

206209
| `envfsc` | Base solve | Regularized replay |
207210
| --- | --- | --- |
@@ -212,7 +215,9 @@ Before any reconstruction-derived density source exists, the base necessarily
212215
bootstraps on the sphere for either `envfsc` value and its completed pair
213216
supplies the conservative replay support. Once a prior reconstruction exists,
214217
the table applies without exception. No PCG map is multiplied by either mask
215-
after reconstruction.
218+
after reconstruction. `envfsc=yes` with `automsk=no` affects only the
219+
phase-randomized FSC evaluation, never a solve. An explicit `pcg_mskfile`
220+
remains the development override.
216221

217222
The original-sampling final reconstructions launched by `abinitio3D` and
218223
`refine3D_auto` are cold solves. They use a PCG iteration budget of at least

doc/policies/refine3D_policy.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -453,11 +453,13 @@ records only the refine3D-side integration contract:
453453
FSC/SSNR precision; PCG+NU instead freezes the Potts local-resolution field
454454
from that pair and replays with `Q_NU`.
455455
- **Solve support.** Only the conservative density envelope may constrain a
456-
PCG solve. With `envfsc=yes` it constrains base and replay; with `envfsc=no`
457-
the base is spherical and the replay is density-constrained. The
458-
NU-evidence envelope never becomes solve support. Before any reconstruction
459-
exists, the base necessarily bootstraps on the sphere and its current pair
460-
provides the replay density support.
456+
PCG solve, and only under `automsk=yes` (policy 2026-09-06). With
457+
`automsk=no` base and replay run on the sphere. With `automsk=yes` and
458+
`envfsc=yes` the envelope constrains base and replay; with `envfsc=no` the
459+
base is spherical and the replay is density-constrained. The NU-evidence
460+
envelope never becomes solve support. Before any reconstruction exists, the
461+
base necessarily bootstraps on the sphere and its current pair provides the
462+
replay density support.
461463
- **Current exclusions** (hard-errored, not approximated): `projrec=yes`,
462464
`conical_fsc=yes`, and matrix-free workflow execution. Fractional/trailing
463465
reconstruction is implemented in the distributed master path.

0 commit comments

Comments
 (0)