1. 17 Jul, 2026 7 commits
    • Andrey Filippov's avatar
      CLAUDE: DP rung D4 - Java switch: ONE pose_scene_dp entry per scene · c673a448
      Andrey Filippov authored
      Binds the D3-validated tp_proc_exec_pose_scene_dp in TpJna/GpuQuadJna
      (+ base GpuQuad stubs, non-throwing negative return = the FAIL-safe
      hook) and adds the one-entry-per-scene branch to the lean pose path:
      
      - new saved curt.pose_scene_dp (default ON, 'Pose scene as ONE GPU DP
        entry'): eligibility = frozen lean shape only (fixed cycles, 1-inner
        cap, freeze 0, 3-angle lma_use_R, uniform MB, JNA backend, no armed
        capture, no debug-save holders); everything else falls back to the
        host-driven (B3) loop automatically.
      - scene 0 (per template/sequence) always runs the host-driven loop -
        it seeds the resident per-sequence state through the production
        C1/C2 register path - then is REPLAYED through the DP entry as the
        one-shot oracle: per-cycle packed rows vs the captured resident-step
        results, the final anchor vs the fitted angles, and the last-cycle
        peak rows keyed by packed index (the B3 order-independence rule),
        all bit-compared. PASS arms DP from scene 1; FAIL (or any mid-run
        native failure) disables DP for the run and prints why.
      - DP scenes reconstruct the scene bookkeeping from the returned trace
        by the exact leanFitScene/IntersceneLma double rules (candidate =
        packed[16..18] widened, dATR in double, RMS = packed[19..22],
        rejected step == the legacy runLma -1 -> coast), fetch/unpack the
        resident last-cycle peaks exactly like leanMeasure, and print the
        same QC/cycles/Done-line fields - the real-scene gate is 497 Done
        lines byte-identical to the 07/16 22:52 saves-OFF record.
      - gpuTaskBuild steps 1-5 extracted verbatim into poseMeasureSetup()
        (shared with the DP entry); new 'scene DP entry' profile stage;
        Stage0 kernel count synced 36 -> 40 (the native-only D1-D3 sessions
        added the DP kernels but could not touch the Java constant).
      
      Gates: mvn clean package PASS; Stage0 PASS 40/40; native run_cases.sh
      ALL PASS (pose_corr @tol 0 + dp_cycles + measure_dp + scene_dp).
      Real-scene gate = Andrey's next routine run: expect the D4 oracle PASS
      line after scene 0, 'DP scene entry active' from scene 1, poses/QC
      byte-identical, post ~19.5 -> ~8-10 ms/scene.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      c673a448
    • Andrey Filippov's avatar
      CLAUDE: B3 oracle order-independent by packed index + FAIL-safe + profile attribution · 6edca7c6
      Andrey Filippov authored
      The 07/16 22:09 B3 gate run FALSE-FAILed the one-shot oracle: the naive
      POSITIONAL compare ignored that correlate2D_inter assigns corr rows via
      atomicAdd - row ORDER is legitimately nondeterministic between runs (the
      rung-1 'order-independent corr compare by packed index' rule); all 497
      poses stayed BYTE-IDENTICAL to the B4 record while the run was driven by
      batched cycles, proving the chain end-to-end. Fixes:
      - oracle compares per packed corr index (HashMap row lookup): index SETS
        must match and every index-matched 8-float peak row must be bit-exact;
      - REAL oracle FAIL now disables the batched path for the run (fail-safe:
        a divergence must never drive production);
      - B3_CHAIN profile stage attributed from the pre-gpuTaskBuild timestamp
        (was a fresh start AFTER the chain -> recorded ~0 and leaked ~2 ms/
        cycle into 'leanMeasure other') and printed in the profile summary
        (printSummary never printed the new stage).
      
      mvn PASS. Oracle PASS line expected on the next routine run.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      6edca7c6
    • Andrey Filippov's avatar
      CLAUDE: 3-B rung B3 - batched measure-chain lean path + batched-vs-granular oracle · 88468d62
      Andrey Filippov authored
      leanMeasure batched branch (JNA + pose_mb_uniform + resident build, no
      armed pose_corr capture, no debug-fetch holders): gpuTaskBuild runs
      b3CycleSetup (gc/cv + the 4 LPF/LoG consts + peak de-bias + sensor mask
      + per-scene descriptor - the same bytes the granular path re-uploaded
      every cycle) then ONE execPoseMeasureCycle call replaces the whole
      granular GPU sequence (task_update, geometry/convert x2, consolidate,
      inter-corr, normalize, peak). Per-cycle D2H stays corr indices + peaks
      (fetchCorr2DPeaks = D2H-only twin of execCorr2DPeaks). Granular path
      unchanged and remains the fallback + debug/capture path; new profile
      stage 'batched measure chain (B3)'.
      
      ONE-SHOT ORACLE (pose_lma_debug>=1, first eligible cycle): the batched
      chain runs FIRST (idempotent - every stage is a deterministic function
      of resident state + pose), captures indices+peaks, the granular chain
      re-runs the identical sequence, and the two are compared BIT-EXACT -
      EXPECT indices IDENTICAL + 0 peak mismatches. Batched production cycles
      start only after the oracle reports (or pose_lma_debug<1).
      ImageDtt.setInterCorrLpfs extracted from interCorrTDResident (shared).
      Requires tile_processor_gpu ee0d275. mvn PASS; run_cases.sh ALL PASS.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      88468d62
    • Andrey Filippov's avatar
      CLAUDE: 3-B rung B4 - staged pinned bayer upload in the JNA backend · c7bf779f
      Andrey Filippov authored
      setBayerImages (both float[][] and double[][][] variants) now funnels
      through uploadBayer: each sensor image is written into the pinned
      native staging slot (one JNI region copy) and committed with
      tp_proc_set_image_staged - the async pinned->device DMA of sensor k
      overlaps the convert/write of sensor k+1 (per-sensor copy/compute
      pipelining, design B4). Double-buffered slots flip per upload (RT
      inter-scene overlap provision). Falls back one-time to the legacy
      pageable path on missing natives or any staged failure (legacy fences
      first, so a partial staged upload is always fully rewritten).
      
      ONE-SHOT ORACLE (first staged upload): reads every uploaded sensor
      back and counts bit-mismatches vs the Java array - EXPECT 0 EXACTLY,
      plus the enqueue-side upload ms. Requires tile_processor_gpu 11ccdc2
      (libtileproc.so rebuild); older libs downgrade gracefully.
      
      mvn PASS; native run_cases.sh ALL PASS incl. new bayer_staged case.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      c7bf779f
    • Andrey Filippov's avatar
      CLAUDE: 3-B rung B2 - MB descriptor via serial one-point getMotionBlurPoint · 53ba6631
      Andrey Filippov authored
      Replace the per-scene one-point getMotionBlur call (~5-6 ms/scene, B0-attributed
      to IntersceneLma prepareLMA scaffolding + two ~THREADS_MAX thread-array spawns)
      with OpticalFlow.getMotionBlurPoint: the identical double chain (setupERS x2,
      getInterRotDeriveMatrices, getDPxSceneDParameters, same-order rate dot product)
      run serially at the representative point - bit-for-bit the same result at ~us
      cost. uniformMotionBlur broadcasts it unchanged; degenerate return still falls
      back to legacy getMotionBlur (per-tile), so non-uniform behavior is untouched.
      
      One-shot oracle at pose_lma_debug>=1 (replaces the closed B0 MB warm-repeat):
      times the fast path, evaluates legacy getMotionBlur at the SAME representative
      point, prints max|d| (expected 0 exactly). IntersceneLma.INFINITY_DISPARITY
      becomes the single source for the 0.01 infinity threshold.
      
      Gate (design doc B2): oracle max|d| = 0, real-scene poses within the B1 bounds,
      MB setup ~6 -> <0.5 ms/scene. Needs Andrey's run to close.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      53ba6631
    • Andrey Filippov's avatar
      CLAUDE: 3-B rung B1 - lean path switches to the resident GPU task build · f32c1f18
      Andrey Filippov authored
      leanMeasure (uniform-MB lean path, JNA backend): the per-cycle CPU front
      end - transformToScenePxPyD (full 5120-tile grid), setInterTasksMotionBlur
      + sort, and the two task H2D uploads - is replaced by ONE
      gpuQuad.execPoseTaskUpdate() call: pose_task_update projects the
      per-sequence template on-device from the Java-tracked measure pose and
      rewrites both resident task slots in place; geometry + convert then run
      on ACTIVATED slots with no upload (ImageDtt.interCorrTDResident). Per
      cycle the only H2D left is the 12-float pose vector. Per scene:
      setupERS + camera-block upload (rung C2 registers, shared with
      prepare_resident) + skeleton slot re-upload (~120 KB, guards against
      other pipeline stages using the task slots between scenes). The
      per-scene uniform-MB 6-float descriptor replicates the exact
      setInterTasksMotionBlur double crank math; margin/projection failures
      become task=0 holes (missing peak -> conditioning abstains, D3 design).
      Fallbacks: JCuda backend, pose_mb_uniform off, NaN/non-uniform MB
      (degenerate uniformMotionBlur fallback) -> unchanged legacy CPU build.
      
      - GpuQuad/GpuQuadJna/TpJna: execPoseTaskUpdate + activateTaskSlot
        (base returns false; JNA marshals rung-C2 nullable groups).
      - IntersceneLmaFloat.buildTasks: serial float task-build oracle (the
        Java float clone of the kernel, worldFromPixel -> pixelFromWorld +
        descriptor/margin/hole packing).
      - One-shot oracle at pose_lma_debug>=1: GPU stream vs the legacy Java
        DOUBLE build (txy-matched field compare, D3 gate <=1e-5 px print) and
        vs the float-serial clone; once-per-program path-active note.
      - pose_corr export stays the explicit diagnostic exception: armed runs
        read the GPU-built pre-offset streams back and capture task words RAW
        (new iterTasksPre or511 overload - a |511-ed hole would diverge in a
        tol-0 replay).
      
      mvn -DskipTests clean package: BUILD SUCCESS. Real-scene gate (D3,
      ratified): poses < 0.003 px drift, aggregate RMS unchanged at print
      precision, same QC count, 497/497 - Andrey's run.
      
      CUDA side: tile_processor_gpu lwir16_2 @ ef36688 (kernel + JNA API +
      two-tier tests, all regressions PASS incl. pose_corr @tol 0).
      Design: internal handoffs/2026-07-16_3b_measure_chain_residency_design.md.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      f32c1f18
    • Andrey Filippov's avatar
      CLAUDE: 3-B rung B0 - one-shot attribution micro-measurements (grid transform,... · 6c10fe38
      Andrey Filippov authored
      CLAUDE: 3-B rung B0 - one-shot attribution micro-measurements (grid transform, task build, MB setup, conditioning split)
      
      Design: attic/imagej-elphel-internal/handoffs/2026-07-16_3b_measure_chain_residency_design.md
      (all 4 rulings approved 07/16). B0 = attribute before B1 deletes the stages:
      
      - grid transform (pose_lma_debug>=1, once/program): warm re-runs of
        transformToScenePxPyD full-grid vs selection-only x multi vs single
        thread - splits thread-array churn / full-grid-for-150-tiles waste /
        irreducible per-tile ERS work.
      - task build: warm multi vs single-thread setInterTasksMotionBlur rebuild.
      - MB setup: warm repeat of uniformMotionBlur (sizes the B2 descriptor win).
      - conditioning (once/program, both direct and preloaded paths): prepare /
        cpu-condition / setBayerImages H2D / gpu-condition split - sizes B4's
        pinned+async overlap honestly (only the H2D share can hide).
      
      One-shot: extra runs land in 'leanMeasure other' for a single call, steady
      state unchanged. No behavior change; mvn -DskipTests package PASS.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      6c10fe38
  2. 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
  3. 15 Jul, 2026 10 commits
  4. 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
  5. 13 Jul, 2026 3 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