Commit 1c807750 authored by Andrey Filippov's avatar Andrey Filippov

CLAUDE: Phase B lean measurement engine (curt_pose_lean) - existing kernels + Java only

TD-average the 16 sensors BEFORE correlation (multiply averages, not average
products), single conj-multiply vs the persistent virtual-center TD. Zero new
CUDA - assembled from proven pieces:
- CuasPoseRT.leanMeasure(): interCorrTD(sensor_mask=0) = tasks(pose)+offsets+
  convert_direct only -> getCltData/CuasTD.consolidateSensorsTD/setCltData
  (the validated CPU bridge, future clt_average_sensors kernel) ->
  setSensorMaskInter(1)+execCorr2D_inter_TD (single conj-multiply) ->
  TDCorrTile.getFromGpu + convertTDtoPD (JNA-validated CuasMotion path,
  FZ-normalize + PD) -> Correlation2d.getMaxXYCmEig (peak+eigen, the GPU
  argmax kernel oracle). Correlation stages are geometry-blind - projection/
  distortion is baked into the average-camera tasks (per Andrey).
- CuasPoseRT.leanFitScene(): same IntersceneLma solver + exit rules as the
  oracle engine; fills lma_rms/coord_motion_rslt so CSV/-POSE-RT-HYPER are
  unchanged (A2-03 = direct oracle).
- curt_pose_lean checkbox 'Pose test lean correlation (B)'.
v1 differences from oracle (documented): NO motion-blur compensation (compare
vs NOMB baseline: 0.287/0.282/0.106 mrad), no FPN peak masking (input is
FPN-subtracted by A2 conditioning), no moving-object filter, min_confidence=0.

mvn compile clean.
Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
parent f40ebaa0
...@@ -1133,6 +1133,7 @@ min_str_neib_fpn 0.35 ...@@ -1133,6 +1133,7 @@ min_str_neib_fpn 0.35
public int curt_pose_num_tiles = 150; // tile-selection compute budget: after the gate, keep this many BEST (smallest max-residual) tiles; threshold-free rank - always yields the best available population. <=0 - no cap. // By Claude on 07/04/2026 public int curt_pose_num_tiles = 150; // tile-selection compute budget: after the gate, keep this many BEST (smallest max-residual) tiles; threshold-free rank - always yields the best available population. <=0 - no cap. // By Claude on 07/04/2026
public boolean curt_pose_recalc = false; // force a FULL-selection pose run that regenerates the -POSE-RT-TILE-CALIB calibration even if it exists. Default (false): automatic FPN-style reuse - if -POSE-RT-TILE-CALIB exists, derive the selection from it (NMAD gate + rank-N) and use it; if not, run full and generate it. // By Claude on 07/04/2026 public boolean curt_pose_recalc = false; // force a FULL-selection pose run that regenerates the -POSE-RT-TILE-CALIB calibration even if it exists. Default (false): automatic FPN-style reuse - if -POSE-RT-TILE-CALIB exists, derive the selection from it (NMAD gate + rank-N) and use it; if not, run full and generate it. // By Claude on 07/04/2026
public boolean curt_pose_raw = false; // phase A2 ingest: per scene read RAW /jp4/, condition with the current calibration (CuasConditioning: rowcol + photometric + FPN) and FORCE-upload straight to the GPU, bypassing the QuadCLT prepared image_data (which carries the old broken Photogrammetric Calibration). Judge by own dstored quality, not agreement with phase A. // By Claude on 07/05/2026 public boolean curt_pose_raw = false; // phase A2 ingest: per scene read RAW /jp4/, condition with the current calibration (CuasConditioning: rowcol + photometric + FPN) and FORCE-upload straight to the GPU, bypassing the QuadCLT prepared image_data (which carries the old broken Photogrammetric Calibration). Judge by own dstored quality, not agreement with phase A. // By Claude on 07/05/2026
public boolean curt_pose_lean = false; // phase B measurement engine: TD-average the 16 sensors (CuasTD, CPU bridge) then ONE conj-multiply vs the virtual-center TD -> FZ-normalize -> PD -> argmax+eigen (getMaxXYCmEig) -> 3-angle LMA. All existing GPU kernels. v1: NO motion-blur compensation - compare vs the NOMB baseline. // By Claude on 07/05/2026
//=== LoG prefilter === //=== LoG prefilter ===
public double curt_psf_radius = 1.0; // sensor PSF radius for LoG pre-filter public double curt_psf_radius = 1.0; // sensor PSF radius for LoG pre-filter
public double curt_n_sigma = 4.0; // cutoff LoG kernel array, number of sigmas public double curt_n_sigma = 4.0; // cutoff LoG kernel array, number of sigmas
...@@ -3434,6 +3435,8 @@ min_str_neib_fpn 0.35 ...@@ -3434,6 +3435,8 @@ min_str_neib_fpn 0.35
"Force a FULL pose run that regenerates -POSE-RT-TILE-CALIB even if it exists. Default OFF = automatic reuse: use the calibration if present (filtered run), else run full and generate it."); "Force a FULL pose run that regenerates -POSE-RT-TILE-CALIB even if it exists. Default OFF = automatic reuse: use the calibration if present (filtered run), else run full and generate it.");
gd.addCheckbox ("Pose test raw-jp4 ingest (A2)", this.curt_pose_raw, // By Claude on 07/05/2026 gd.addCheckbox ("Pose test raw-jp4 ingest (A2)", this.curt_pose_raw, // By Claude on 07/05/2026
"Per scene: read RAW /jp4/, condition with the CURRENT calibration (rowcol+photometric+FPN, CuasConditioning) and force-upload straight to the GPU, bypassing the prepared image_data (old broken Photogrammetric Calibration)."); "Per scene: read RAW /jp4/, condition with the CURRENT calibration (rowcol+photometric+FPN, CuasConditioning) and force-upload straight to the GPU, bypassing the prepared image_data (old broken Photogrammetric Calibration).");
gd.addCheckbox ("Pose test lean correlation (B)", this.curt_pose_lean, // By Claude on 07/05/2026
"Phase B measurement: TD-average the 16 sensors, then ONE conj-multiply vs the virtual-center TD -> FZ-normalize -> PD -> argmax+eigen -> 3-angle LMA. v1 has NO motion-blur compensation (compare vs the NOMB baseline).");
gd.addMessage("=== LoG prefilter ==="); gd.addMessage("=== LoG prefilter ===");
gd.addNumericField("Optical PSF radius", this.curt_psf_radius, 6,8,"pix", gd.addNumericField("Optical PSF radius", this.curt_psf_radius, 6,8,"pix",
...@@ -5032,6 +5035,7 @@ min_str_neib_fpn 0.35 ...@@ -5032,6 +5035,7 @@ min_str_neib_fpn 0.35
this.curt_pose_num_tiles =(int) gd.getNextNumber(); // By Claude on 07/04/2026 this.curt_pose_num_tiles =(int) gd.getNextNumber(); // By Claude on 07/04/2026
this.curt_pose_recalc = gd.getNextBoolean(); // By Claude on 07/04/2026 this.curt_pose_recalc = gd.getNextBoolean(); // By Claude on 07/04/2026
this.curt_pose_raw = gd.getNextBoolean(); // By Claude on 07/05/2026 this.curt_pose_raw = gd.getNextBoolean(); // By Claude on 07/05/2026
this.curt_pose_lean = gd.getNextBoolean(); // By Claude on 07/05/2026
this.curt_psf_radius = gd.getNextNumber(); this.curt_psf_radius = gd.getNextNumber();
this.curt_n_sigma = gd.getNextNumber(); this.curt_n_sigma = gd.getNextNumber();
...@@ -6404,6 +6408,7 @@ min_str_neib_fpn 0.35 ...@@ -6404,6 +6408,7 @@ min_str_neib_fpn 0.35
properties.setProperty(prefix+"curt_pose_num_tiles", this.curt_pose_num_tiles+""); // int // By Claude on 07/04/2026 properties.setProperty(prefix+"curt_pose_num_tiles", this.curt_pose_num_tiles+""); // int // By Claude on 07/04/2026
properties.setProperty(prefix+"curt_pose_recalc", this.curt_pose_recalc+""); // boolean // By Claude on 07/04/2026 properties.setProperty(prefix+"curt_pose_recalc", this.curt_pose_recalc+""); // boolean // By Claude on 07/04/2026
properties.setProperty(prefix+"curt_pose_raw", this.curt_pose_raw+""); // boolean // By Claude on 07/05/2026 properties.setProperty(prefix+"curt_pose_raw", this.curt_pose_raw+""); // boolean // By Claude on 07/05/2026
properties.setProperty(prefix+"curt_pose_lean", this.curt_pose_lean+""); // boolean // By Claude on 07/05/2026
properties.setProperty(prefix+"curt_psf_radius", this.curt_psf_radius+""); // double properties.setProperty(prefix+"curt_psf_radius", this.curt_psf_radius+""); // double
properties.setProperty(prefix+"curt_n_sigma", this.curt_n_sigma+""); // double properties.setProperty(prefix+"curt_n_sigma", this.curt_n_sigma+""); // double
...@@ -6810,6 +6815,7 @@ min_str_neib_fpn 0.35 ...@@ -6810,6 +6815,7 @@ min_str_neib_fpn 0.35
if (properties.getProperty(prefix+"curt_pose_num_tiles")!=null) this.curt_pose_num_tiles=Integer.parseInt(properties.getProperty(prefix+"curt_pose_num_tiles")); // By Claude on 07/04/2026 if (properties.getProperty(prefix+"curt_pose_num_tiles")!=null) this.curt_pose_num_tiles=Integer.parseInt(properties.getProperty(prefix+"curt_pose_num_tiles")); // By Claude on 07/04/2026
if (properties.getProperty(prefix+"curt_pose_recalc")!=null) this.curt_pose_recalc=Boolean.parseBoolean(properties.getProperty(prefix+"curt_pose_recalc")); // By Claude on 07/04/2026 if (properties.getProperty(prefix+"curt_pose_recalc")!=null) this.curt_pose_recalc=Boolean.parseBoolean(properties.getProperty(prefix+"curt_pose_recalc")); // By Claude on 07/04/2026
if (properties.getProperty(prefix+"curt_pose_raw")!=null) this.curt_pose_raw=Boolean.parseBoolean(properties.getProperty(prefix+"curt_pose_raw")); // By Claude on 07/05/2026 if (properties.getProperty(prefix+"curt_pose_raw")!=null) this.curt_pose_raw=Boolean.parseBoolean(properties.getProperty(prefix+"curt_pose_raw")); // By Claude on 07/05/2026
if (properties.getProperty(prefix+"curt_pose_lean")!=null) this.curt_pose_lean=Boolean.parseBoolean(properties.getProperty(prefix+"curt_pose_lean")); // By Claude on 07/05/2026
if (properties.getProperty(prefix+"curt_psf_radius")!=null) this.curt_psf_radius=Double.parseDouble(properties.getProperty(prefix+"curt_psf_radius")); if (properties.getProperty(prefix+"curt_psf_radius")!=null) this.curt_psf_radius=Double.parseDouble(properties.getProperty(prefix+"curt_psf_radius"));
if (properties.getProperty(prefix+"curt_n_sigma")!=null) this.curt_n_sigma=Double.parseDouble(properties.getProperty(prefix+"curt_n_sigma")); if (properties.getProperty(prefix+"curt_n_sigma")!=null) this.curt_n_sigma=Double.parseDouble(properties.getProperty(prefix+"curt_n_sigma"));
...@@ -9101,6 +9107,7 @@ min_str_neib_fpn 0.35 ...@@ -9101,6 +9107,7 @@ min_str_neib_fpn 0.35
imp.curt_pose_num_tiles = this.curt_pose_num_tiles; // By Claude on 07/04/2026 imp.curt_pose_num_tiles = this.curt_pose_num_tiles; // By Claude on 07/04/2026
imp.curt_pose_recalc = this.curt_pose_recalc; // By Claude on 07/04/2026 imp.curt_pose_recalc = this.curt_pose_recalc; // By Claude on 07/04/2026
imp.curt_pose_raw = this.curt_pose_raw; // By Claude on 07/05/2026 imp.curt_pose_raw = this.curt_pose_raw; // By Claude on 07/05/2026
imp.curt_pose_lean = this.curt_pose_lean; // By Claude on 07/05/2026
imp.curt_psf_radius = this.curt_psf_radius; imp.curt_psf_radius = this.curt_psf_radius;
imp.curt_n_sigma = this.curt_n_sigma; imp.curt_n_sigma = this.curt_n_sigma;
// rleak0 imp.X copy removed 2026-06-20 (LReLU now LINEAR); predecessor code at git tag cuas-layer1. // By Claude on 06/20/2026 // rleak0 imp.X copy removed 2026-06-20 (LReLU now LINEAR); predecessor code at git tag cuas-layer1. // By Claude on 06/20/2026
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment