1. 16 Jul, 2026 17 commits
    • Andrey Filippov's avatar
      CLAUDE: C3/C3b close-out - conditioning freeze FALSIFIED, default = per-cycle (0) · 07606a27
      Andrey Filippov authored
      C3b gate (log 191867): azimuth RMS 0.0454 (C2 bar 0.0349, +30%), roll
      0.0415 (+54%), NOT-settled 228 (C2: 51). Better than the cycle-1 freeze
      (0.0518/0.0542/267) but still fails the pre-declared C2-level gate.
      CONCLUSION: per-cycle conditioning re-derivation carries convergence
      dynamics through ALL cycles (228 scenes not settled by cycle 4 - 'cycle 2
      ~= converged' does not hold for half the sequence); not a noise source to
      freeze away for ~0.6 ms/scene. pose_freeze_cycle default 0 = per-cycle
      (restores C2 quality); parameter + bit-exact light-path mechanism stay for
      DP-era experiments (previous-scene conditioning candidate).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      07606a27
    • Andrey Filippov's avatar
      CLAUDE: C3b - pose_freeze_cycle dialog parameter (keep high accuracy selectable) · 8449dc7d
      Andrey Filippov authored
      Andrey 07/16: better inter-scene accuracy may pay off - keep the opportunity.
      New curt.pose_freeze_cycle ('Pose freeze conditioning at cycle'): 0 = never
      freeze = per-cycle re-derivation (highest accuracy, pre-C3 behavior); 2 =
      default (freeze at the post-first-correction measurement); 1 = falsified.
      Runtime-selectable - A/B/revert experiments need no rebuild. Wired via
      IntersceneLma.setPoseFreezeCycles from leanFitScene.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      8449dc7d
    • Andrey Filippov's avatar
      CLAUDE: rung C3b - freeze conditioning at cycle 2 (C3's cycle-1 freeze FAILED its gate) · 9ae13173
      Andrey Filippov authored
      C3 gate result: freezing at cycle 1 regressed azimuth RMS 0.0349->0.0518 px
      (+48%), roll 0.0270->0.0542 (+100%), NOT-settled 51->267. Mechanism: cycle-1
      peaks are measured at the blurriest, pre-correction pose - freezing them
      locks in the WORST conditioning; per-cycle re-derivation carried convergence
      signal, not just noise. Andrey's observation: the first outer cycle absorbs
      nearly the whole prediction error (single near-GN inner step, lambda=1e-3),
      so the cycle-2 measurement is at an essentially converged pose. C3b: cycles
      1-2 run FULL prepares; the SECOND result freezes; cycles 3+ run light.
      Context (Andrey): exit_change_atr QC threshold was test-era; the application
      bar is 0.1 px - C2-level quality remains the gate target, revert to
      per-cycle stays the fallback.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      9ae13173
    • Andrey Filippov's avatar
      CLAUDE: rung C3 - freeze per-scene conditioning, light prepare cycles 2+ · 6e7b92d8
      Andrey Filippov authored
      Design 3-A4i rung C3 (native tile_processor_gpu HEAD): the cycle-1 resident
      prepare result carries the FROZEN conditioning; later cycles of the same
      scene run a light prepare (fresh measured offsets + fx/J at the moving pose;
      weights/eigen/selection/pull/reg/pure_weight untouched). Rulings (Andrey
      07/17): eigen freezes WITH the weights (same trust-in-tile nature); a
      frozen-selected tile with no fresh valid peak abstains (y=fx, zero
      residual); reg weights + pure_weight freeze from cycle 1. Semantic gain:
      every cycle optimizes the SAME objective - conditioning no longer wobbles
      with per-cycle measurement noise. Provider/GpuQuad/GpuQuadJna gain a light
      flag; the per-scene instance naturally scopes the freeze.
      Gates: mvn package+test PASS; Stage0 36/36; native suite incl. new LIGHT
      bit-exact test PASS.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      6e7b92d8
    • Andrey Filippov's avatar
      CLAUDE: rung C2 - hoist pose prepare state to per-sequence/per-scene levels · 69eaaf30
      Andrey Filippov authored
      Design 3-A4i rung C2 (native tile_processor_gpu HEAD):
      - IntersceneLma: per-SEQUENCE cache (reference Camera + flattened centers,
        keyed on the reference ErsCorrection; the virtual center is static by
        construction - zero pose, zero rates) with an explicit
        resetPoseSequenceCache() re-armed at sequence start; per-SCENE cache
        (scene Camera in the per-scene instance: ERS rates never change across
        cycles - setupERS depends only on rates/line_time, verified, and the 3
        adjusted angles travel in pose_vectors). setupERS + Camera.capture now run
        once per level instead of 4x/scene; the provider gets null for resident
        groups. Provider/GpuQuad/GpuQuadJna signatures gain explicit numTiles.
      - Dead work deleted: the threaded setEigenTransform build at the prepareLMA
        head runs only on the legacy/capture/MB fall-through (the GPU assemble
        builds the transform from resident peaks on the production path).
      - CuasPoseRT: resetPoseSequenceCache() at testPoseSequence start.
      Expected: prep setup 5.7 -> ~1.5 ms cycle-1 / ~0.3-0.7 cycles 2-4, prepare
      ~22.9 -> ~3-5 ms/scene; per-cycle PCIe ~120KB -> ~60B + result.
      Gates: mvn package+test PASS; Stage0 36/36; full native suite PASS.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      69eaaf30
    • Andrey Filippov's avatar
      CLAUDE: C1 - prepare-oracle flag static (one-shot per run, not per scene) · c5e83b04
      Andrey Filippov authored
      IntersceneLma is constructed per scene; the pre-existing one-shot flags are
      static but poseLmaPrepareOracleReported was instance-scoped, so the 13:03:32
      run executed a legacy capture cycle + PREPARE compare on EVERY scene (497
      bit-exact passes - strong accidental validation, but per-scene legacy cost:
      prepare 37.3 vs 22.9 ms/scene, capacity 6.67 vs 7.31 scenes/s). Now static.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      c5e83b04
    • Andrey Filippov's avatar
      CLAUDE: C1 gate fix - arm the one-shot PREPARE oracle via pose_lma_debug boost · b0eb1687
      Andrey Filippov authored
      prepareLMA received imp.debug_level only, so prepare_capture never armed in
      the debug1 config (pose_lma_debug=1, imp.debug_level<=0) and the C1 gate run
      went resident from cycle 0 without printing the bit-exact compare. Now the
      same boost the step oracle gets. Run was otherwise clean: 497/497, both
      markers, zero anomalies, drift <=0.0023 px, aggregate RMS/QC identical.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      b0eb1687
    • Andrey Filippov's avatar
      CLAUDE: rung C1 - resident prepareLMA wired: measured inputs never leave the GPU · 814f38e0
      Andrey Filippov authored
      Design 3-A4i rung C1 (native tile_processor_gpu 7db7cf6):
      - IntersceneLma: PoseLmaPrepareProvider + residentPrepare() (mirrors the
        getFxDerivs head: ERS pokes + setupERS + camera/centers capture; per-cycle
        H2D = camera state + pose vector + centers + 6 policy floats). Production
        lean prepare skips setSamplesWeights / both fx passes / WJtJ+reg+normalize /
        y-build entirely; weights/y stay GPU-resident; initial RMS seeds from the
        first resident step's packed[19,20] (kills the runLma first-step
        re-linearization = C0's 'LMA CPU remainder'). Invalid/unavailable falls
        back loudly to the legacy Java prepare.
      - One-shot oracle (pose_lma_debug>=1, first prepare): the capture cycle runs
        FULLY legacy, then the resident prepare captures its buffers and the new
        IntersceneLmaFloat.prepareResidentOracle (serial float clone) must match
        BIT-EXACTLY ('resident CUDA vs Java-float PREPARE: ... mismatches=0').
      - lmaStep: prepared-resident steps pass NULL weights/y/eigen (no per-step
        H2D); first-block linearization skipped when prepared.
      - CuasPoseRT: provider wiring (slot 0xff + CORR_NTILE_SHIFT = host policy),
        new marker 'resident CUDA prepareLMA active'; cycle_rms_meas moved after
        runLma reading getInitialRms() (same value on both paths).
      - Stage0 kernel count 33 -> 36 (3 new prepare kernels).
      Gates: mvn package + test PASS; Stage0 36/36; full native suite in
      tile_processor_gpu 7db7cf6 (direct prepare BIT-EXACT, sanitizer 0 errors).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      814f38e0
    • Andrey Filippov's avatar
      CLAUDE: rung C0 - prepareLMA sub-stage + fx-boundary profiling (attribute before C1) · b6a074a1
      Andrey Filippov authored
      Design 3-A4i rung C0: IntersceneLma gains a null-safe ProfileSink (pattern-
      consistent with the providers; zero overhead when unset). The production
      prepareLMA overload emits setup+samples-weights / fx-pass-1 / WJtJ+reg+
      normalize / fx-pass-2 samples (LMA path only - MB-vector calls excluded;
      y+RMS tail = derived remainder). Two cross-cutting probes: the poseFxProvider
      JNA roundtrip wall (all lean fx sites, incl. runLma's first-step
      re-linearization) and the setupERS pair. CuasPoseRT routes the sink into
      RtPoseProfile (6 new stages, printSummary extended).
      Expected from one run of the same config: split prepare's ~16 ms/call into
      JNA-roundtrip vs Java-CPU, sizing C1 honestly.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      b6a074a1
    • Andrey Filippov's avatar
      CLAUDE: rung B - resident GPU pose-LMA decision AUTHORITATIVE in lmaStep · 7665886f
      Andrey Filippov authored
      Design 3-A4i rung B (native tile_processor_gpu 5f47326): for the lean
      three-angle shape the GPU decision drives the Java state machine:
      - resident-valid production path: accept/stop from packed[23..24], RMS from
        packed[19..22] (floats widened exactly), parameters_vector from the
        resident candidate; NO Java candidate projection, NO re-decision, NO
        rejection-restore projection (GPU retained current state, device-side
        set-index commit). Decision equivalence was proven over 1,988 steps with
        zero mismatches (session-43 gate).
      - invalid resident result (singular solve / non-finite) = REJECTED-STEP
        semantics: caller raises lambda and retries/exits; no Java-double fallback
        for the lean shape (fallbacks only where free). General shapes and the
        no-resident paths are unchanged.
      - one-shot oracle preserved: at pose_lma_debug>=1 the first step falls
        through the legacy path once and prints the existing preparation/candidate/
        RMS-decision comparisons; production steps never compute the double side.
      - marker updated: 'resident CUDA float LMA decision AUTHORITATIVE'.
      Gates: mvn package PASS; mvn test PASS (no test sources); Stage0 33/33;
      full native suite in tile_processor_gpu 5f47326.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      7665886f
    • Andrey Filippov's avatar
      CLAUDE: rung A - debug-save fetches last-cycle-only + own profile stage · 27e5139b
      Andrey Filippov authored
      Design 3-A4i rung A (2026-07-16 handoff): the 00:25:48 gate profile's
      'leanMeasure other' (26.1 ms/call, 43% of post) was unprofiled debug-save
      data motion (pose_corr_save/pose_img_save). Changes:
      - leanFitScene passes corr_pd_out/img_out only on the LAST outer cycle in
        fixed-cycle mode (legacy convergence mode keeps every-cycle so an early
        exit still fills the holders).
      - New DEBUG_FETCH profile stage wraps perSensorImagesFromTD, the no-MB
        debug re-convert, and fetchNormalizedPD, so debug data motion can never
        hide in 'leanMeasure other' again (it joins measureAccounted).
      Armed pose_corr capture unaffected (fetch keyed on isArmed() unchanged).
      Expected gate: poses/records byte-exact, hyperstacks identical, capacity
      ~3.9 -> ~5.5 scenes/s in the debug config.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      27e5139b
    • Andrey Filippov's avatar
      CODEX: Validate resident pose LMA decisions · 13db0146
      Andrey Filippov authored
      Co-authored-by: 's avatarCodex <codex@elphel.com>
      13db0146
    • Andrey Filippov's avatar
      CODEX: Compare resident pose candidate RMS · f7939cc0
      Andrey Filippov authored
      Co-authored-by: 's avatarCodex <codex@elphel.com>
      f7939cc0
    • Andrey Filippov's avatar
      CODEX: Bypass duplicate double pose LMA solve · 9bdef093
      Andrey Filippov authored
      Co-authored-by: 's avatarCodex <codex@elphel.com>
      9bdef093
    • Andrey Filippov's avatar
      CODEX: Continue pose LMA from resident Jacobians · 47efa39f
      Andrey Filippov authored
      Co-authored-by: 's avatarCodex <codex@elphel.com>
      47efa39f
    • Andrey Filippov's avatar
      CODEX: Gate float CUDA pose LMA candidate · 27d944d7
      Andrey Filippov authored
      Co-authored-by: 's avatarCodex <codex@elphel.com>
      27d944d7
    • Andrey Filippov's avatar
      CODEX: Route lean pose getFxDerivs through CUDA · e824a17c
      Andrey Filippov authored
      Co-authored-by: 's avatarCodex <codex@elphel.com>
      e824a17c
  2. 15 Jul, 2026 10 commits
  3. 14 Jul, 2026 3 commits
    • Andrey Filippov's avatar
      CLAUDE: SET casesFile key in scene lists (GPU-test manifest pointer) · ded8dd7c
      Andrey Filippov authored
      New KEY_DIRS entry (index 12, same pattern as cuasSynth/cuasNoise):
      SET casesFile <path> in a scene-sequence .list names the GPU-test case
      manifest (tile_processor_gpu run_cases.sh reads the same SET). A FILE key:
      exempt from the auto-mkdirs branch; resolved vs rootDirectory and recorded
      in this.casesFile (informational for now - reserved for in-program use).
      Parses cleanly instead of the '*********** Unknown SET' console warning.
      
      Companion to tile_processor_gpu edc6c4a. mvn compile OK.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      ded8dd7c
    • Andrey Filippov's avatar
      CLAUDE: kernelTest console hint - add run_cases.sh short form (tests manifest layer) · dbbc9fcb
      Andrey Filippov authored
      Companion to tile_processor_gpu 72e2caf (cases.list + run_cases.sh).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      dbbc9fcb
    • Andrey Filippov's avatar
      CLAUDE: 3-C rung 2 - 15-arg peak contract in the lean oracle, FZ-norm in... · 0b385735
      Andrey Filippov authored
      CLAUDE: 3-C rung 2 - 15-arg peak contract in the lean oracle, FZ-norm in place, pose_corr checkpoint-2 export
      
      Andrey's ruling 07/13/2026 (frozen GPU contract = 15-arg getMaxXYCmEig
      superset; recentering runtime knob; de-bias optional, default off):
      
      - CuasRtParameters: NEW 'CUAS RT' knobs pose_recenter (recentering passes,
        0 = validated single-pass baseline) + pose_debias (window-autocorr envelope
        de-bias fraction, 0 = off); corr-xml _curt_pose_recenter/_curt_pose_debias.
      - CuasPoseRT.leanMeasure: peak measurement switched to the 15-arg
        getMaxXYCmEig (eig_fast2x2=true = the contract's closed-form eigen);
        windowAutocorrDebias() = the single source of the de-bias array (Java
        oracle, export case, JNA host).
      - TDCorrTile.convertTDtoPDInPlace: corr2D_normalize runs on the inter corr
        TD buffer where execCorr2D_inter_TD left it (NULL weights == the repack
        path's uniform 1.0 -> bit-identical PD); the TD D2H->repack->H2D round
        trip is gone from the lean chain on both backends.
      - PoseCorrExport: checkpoint 2 in the same case - expected_corr_pd
        (GPU-produced normalized PD, the tol-0 target for the in-place replay),
        expected_peaks (double Java oracle incl. weak-peak rejects as NaN rows),
        contract params + optional debias array in the manifest; compareResults
        round-trips corr_pd/peaks when the C++ test writes them.
      
      mvn -DskipTests clean package OK; C++ side: tile_processor_gpu same-day
      commit (corr2D_peak_eig + tests, synthetic gate PASS, regressions PASS).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      0b385735
  4. 13 Jul, 2026 10 commits
    • Andrey Filippov's avatar
      CLAUDE: fake previous pose for the seed scene - real finite-difference rates (MB+ERS) for scene 0 · 18be472c
      Andrey Filippov authored
      Backward step from the first two known stored poses (prev_pose/prev_ts
      pre-initialized before the loop; the in-loop rate code is untouched): the
      seed scene's rate becomes exactly (stored[next]-stored[first])/dt instead
      of the zero-rate special case that left scene 0 with mb=(0,0) and the
      uncompensated v*tau bias. Using a difference of actual poses avoids any
      hand-derived rotation rate and its sign-convention risk. In RT production
      the continuous stream always has a real previous frame; this seam also
      covers stream (re)starts, where the nominal-rotation config can feed the
      same prev_pose/prev_ts initialization. Deliberate consequence: the next
      full-sequence run is NOT digit-identical to the 07/13 baseline in scene 0
      (expected equal or better - the seed previously carried the v*tau bias).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      18be472c
    • Andrey Filippov's avatar
      CLAUDE: pose_corr console hint -> tests_bin/test_pose_corr_jna (the tol-0 verdict binary) · 88bd939a
      Andrey Filippov authored
      Measured on the first real case: an offline nvcc build cannot be bit-exact
      vs the NVRTC-JIT production module (FMA/codegen divergence) - the direct
      -G binary is the stepping companion; the NVRTC-module replay
      (jna/test_pose_corr_jna) PASSed bit-exact @tol 0, all 4 iterations.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      88bd939a
    • Andrey Filippov's avatar
      CLAUDE: 3-C rung 1 - pose_corr kernel-test export (checkpoint 1 = raw TD corr... · 98e4ee98
      Andrey Filippov authored
      CLAUDE: 3-C rung 1 - pose_corr kernel-test export (checkpoint 1 = raw TD corr after correlate2D_inter)
      
      curt.kernel_test dropdown entry pose_corr: runs the normal lean pose sequence
      with a static armed capture (PoseCorrExport) that records, for the FIRST
      fitted scene, every LMA iteration's task streams exactly as the GPU received
      them (pre-offsets, task|511) and as the consolidation flattened them
      (post-offsets, disp_dist tail zero), the conditioned 16-sensor images exactly
      as uploaded (hook in conditionSceneToGpuInner - the data never lands in
      QuadCLT), geometry/correction-vector floats, aberration-kernel flatten, the
      four LPF/HPF constant payloads, the resident center TD (gpu_clt_ref cam 0)
      and the expected packed corr indices + raw TD correlation (captured right
      after execCorr2D_inter_TD, before FZ-normalize = the rung-2 boundary).
      The sequence stops early once the case is written; the TILE-CALIB save is
      additionally gated on !captureDone() so a truncated max-over-scenes
      calibration can never be written, and kernelTest refuses to run without an
      existing -POSE-RT-TILE-CALIB (the bootstrap FULL pass must never be capture-
      truncated). Requires pose_lean+pose_raw ON, pose_stored/pose_full OFF.
      C++ side: tile_processor_gpu tests_bin/test_pose_corr --data <case> --tol 0
      (newly exercises calculate_tiles_offsets + correlate2D_inter; results/ are
      saved reordered into oracle index order for the Java round-trip compare).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      98e4ee98
    • Andrey Filippov's avatar
      CLAUDE: 3-A3 fix - pure border-ring interior gate (morphological shrink... · 2f0611e3
      Andrey Filippov authored
      CLAUDE: 3-A3 fix - pure border-ring interior gate (morphological shrink annihilated the patchy selection)
      
      First attempt (8fb0eea4) shrank the finite-calibration mask morphologically -
      but the calibration is NaN wherever a tile was not STRENGTH-selected (whole sky
      + scattered terrain holes, ~21% finite density), so a 2-tile 8-dir shrink left
      ~2 tiles per scene: num=2 fits, dstored 6-10 px, LMA failures (07/13 run,
      killed). Andrey's ruling: pure border ring - the OOB-missing band is
      geometrically confined to the frame border (margin-dropped ring 1-2 tiles +
      partial-OOB soft band 12 px = 1.5 tiles), so excluding tiles within
      curt.pose_shrink (default now 4) tiles of the array border covers
      hard+soft+slack with zero collateral on interior strength holes. No TileNeibs,
      no morphology. Dialog label now "Pose tile selection border ring (tiles)";
      key _curt_pose_shrink unchanged.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      2f0611e3
    • Andrey Filippov's avatar
      CLAUDE: 3-A3 interior tile gate (curt.pose_shrink) + deterministic lean task order · 8fb0eea4
      Andrey Filippov authored
      Tile selection (deriveSelection): new interior gate per Andrey's 07/13 ruling -
      usable = finite calibration (measured in EVERY scene) shrunk by curt.pose_shrink
      tiles (TileNeibs 8-dir, default 2; array-border ring cleared explicitly). Excludes
      the partial-OOB band (soft margin 12 px = 1.5 tiles) so every selected tile keeps
      all 16 sensors interior at every scene pose - enables the fixed per-sequence GPU
      tile list with the consolidation OOB pass bypassed by host policy.
      
      leanMeasure: sort task streams by (tileY, tileX) - setInterTasks* fill from worker
      threads, so tile order was nondeterministic run-to-run; the fixed selection + sort
      = the static task-stream contract for the pose_corr checkpoint (rung 1).
      
      New dialog knob (CUAS RT tab): "Pose tile selection shrink (tiles)"
      (curt.pose_shrink, corr-xml _curt_pose_shrink).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      8fb0eea4
    • Andrey Filippov's avatar
      CLAUDE: curt.pose_max_lma (lean inner cap, default 1) + one-line per-scene pose output · f4be977b
      Andrey Filippov authored
      - pose_max_lma: inner LMA cap for the lean pose only (0 = legacy imp.max_LMA,
        which stays ~25 for flying-camera applications). 1 validated 07/13: static
        4x1 shape, dstored RMS 0.0350/0.0377/0.0213 == unlimited-inner run.
      - Verbosity (Andrey): scene line now carries cyc=N and mb=(x, y); the separate
        'CuasPoseRT cycles:' trace and per-scene uniform-MB lines print only at
        curt.pose_lma_debug >= 1 (investigation closed; QC not-settled line stays).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      f4be977b
    • Andrey Filippov's avatar
      CLAUDE: lean pose eigen fix - pass imp.eig_sub_frac (was hardcoded 0.0) · 59f4182d
      Andrey Filippov authored
      Root cause of the eigen-ON 3x slow pose convergence (probed synthetically):
      pedestal-included covariance inflates the peak eigen lambdas; sqrt(lambda)
      reaches imp.eig_max_sqrt (6) where setEigenTransform's k=max(0,1/sqrt(l)-1/6)
      ZEROES the tile's measurement components - blur-wide tiles (sigma ~2.5-3 px,
      the lean consolidated-average x center regime) contribute nothing and the
      solve limps on the few sharp tiles. Companion zero-build retune: raise
      imp.eig_max_sqrt 6 -> ~20 (dialog) when re-enabling eigen. Solver algebra
      verified consistent (jt, both Y-Fx variants, WJtJ share the transform).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      59f4182d
    • Andrey Filippov's avatar
      CLAUDE: chain-rule diagnostic - RMS meas>solved pairs in the pose cycle trace · e8d95f75
      Andrey Filippov authored
      Per outer cycle: RE-MEASURED pure RMS (prepareLMA, after re-correlation) >
      MODEL-PREDICTED pure RMS (runLma, after the solve). Jacobian/chain-rule error
      signature (Andrey's hypothesis): solved_n low but meas_{n+1} bounces back up -
      the model overpromised and re-correlation takes it back. Healthy damping:
      meas_{n+1} ~ solved_n, both creep down. Zero extra computation - both values
      already existed inside IntersceneLma.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      e8d95f75
    • Andrey Filippov's avatar
      CLAUDE: curt.pose_lma_debug - per-inner-step solver logging for the pose LMA · 4ff201fa
      Andrey Filippov authored
      New int knob (0 = quiet): >=2 passes the level into the inner runLma so its
      existing per-step line prints (good/done flags, full/pure RMS, lambda), with a
      CuasPoseRT header attributing each block to its scene + outer cycle; 3-4 =
      the solver's deeper dumps. Shared IntersceneLma untouched.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      4ff201fa
    • Andrey Filippov's avatar
      CLAUDE: curt.pose_lambda - near-GN inner LMA start + innerLMA counts in trace · 972bcbda
      Andrey Filippov authored
      Root cause of the 6-13 outer cycles (Andrey's diagnosis, confirmed in code):
      the inner runLma restarts at ilp.ilma_lambda=0.1 EVERY outer measure<->solve
      cycle, and the 0.1%-improvement inner exit fires while steps are still
      lambda-limited -> outer loop under-relaxes (~0.8/cycle decay). New
      curt.pose_lambda (default 0.001, 0 = legacy ilma_lambda) starts the inner
      solve near-Gauss-Newton for the near-linear overdetermined 3-angle problem.
      Trace line now also logs inner runLma iterations per outer cycle + lambda0.
      
      07/12 21:56 run (legacy convergence + uniform MB): dstored RMS az/tilt/roll
      0.1416/0.0777/0.0983 vs per-tile-MB baseline 0.1355/0.0765/0.1005 = uniform
      MB VALIDATED (A1); 0 degenerates; outer cycles mean 7.4, max 13 @ lambda 0.1.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      972bcbda