Commit 0937dbcc authored by Andrey Filippov's avatar Andrey Filippov

CLAUDE: JNA hookup of the GPU TD consolidation + curt OOB margin params

Use the frozen v1 kernel chain in the program instead of the Java CPU code
(roadmap step 4, JNA-only per Andrey's 07/12/2026 ruling):
- GpuQuad.execConsolidateSensorsTD: base hook, returns false (JCuda backend
  keeps the CPU bridge - no JCuda launch code for new kernels).
- GpuQuadJna override -> TpJna.tp_proc_exec_consolidate: on-device chain,
  TD never leaves the GPU (zero-copy; only flattened TpTask streams cross);
  validated bit-exact vs the real-scene avg_td_oob oracle case
  (tile_processor_gpu jna/test_proc_consolidate, max|diff|=0).
- CuasTD.consolidateToSlot0: shared bridge - GPU-first, CPU fallback now
  OOB-mask-capable (oobSensorMasks + masked consolidateSensorsTD), so both
  backends produce the v1-filtered average.
- CuasPoseRT.leanMeasure + CuasRender.renderSceneVirtual: task sets hoisted
  out of the MB/no-MB branches and passed to the bridge (replaces the
  getCltData -> consolidateSensorsTD -> setCltData(0) round-trip).
- CuasRtParameters: new curt.oob_soft / curt.oob_hard (defaults =
  CuasTD.OOB_SOFT/HARD_DEFAULT 12/8, frozen spec; 0/0 = v0 unfiltered A/B
  knob), new dialog group under CUAS RT; corr-xml keys _curt_oob_*;
  consumed by the bridge at both call sites and by the avg_td_oob export
  (replaces hardcoded defaults in CuasRT.kernelTest).
Verified: mvn package; CuasTD headless self-test ALL PASSED (exit 0).
Co-authored-by: 's avatarClaude Fable 5 <noreply@anthropic.com>
parent eab1660e
......@@ -239,13 +239,14 @@ public class CuasPoseRT {
* Average the 16 sensors in TD BEFORE correlation ("multiply averages, not average
* products"), then a single conj-multiply against the persistent center TD:
* interCorrTD(sensor_mask=0) - tasks(pose) + offsets + convert_direct ONLY
* getCltData -> CuasTD.consolidateSensorsTD -> setCltData(slot 0) - the CPU bridge
* CuasTD.consolidateToSlot0 - the consolidation bridge: GPU v1 chain on the JNA
* backend (on-device, OOB soft/hard filtered), CPU bridge (getCltData ->
* consolidateSensorsTD -> setCltData(0)) on JCuda // By Claude on 07/12/2026
* setSensorMaskInter(1) + execCorr2D_inter_TD - the single conj-multiply
* TDCorrTile.getFromGpu -> TDCorrTile.convertTDtoPD - FZ-normalize + PD (existing)
* Correlation2d.getMaxXYCmEig - peak + eigen (the GPU argmax kernel's oracle)
* All GPU stages are existing kernels (the correlate/normalize/PD trio is the
* JNA-validated CuasMotion.correlatePairs path); only the bridge is CPU, to be
* replaced by the clt_average_sensors kernel later. Correlation stages are geometry-
* JNA-validated CuasMotion.correlatePairs path). Correlation stages are geometry-
* blind: all projection/distortion is baked into the tasks (average-camera grid), so
* the measured (dx,dy) is displacement on the same grid the pose Jacobian uses.
* Differences from the oracle engine (adjustPairsLMAInterscene) in this v1: no FPN
......@@ -288,6 +289,7 @@ public class CuasPoseRT {
final double [][] scene_pXpYD = OpticalFlow.transformToScenePxPyD(
null, center_disparity, scene_xyz, scene_atr, scene, center_CLT);
final double disparity_corr = clt_parameters.imp.disparity_corr + center_CLT.getDispInfinityRef();
final TpTask [][] cons_tasks; // the convert task sets, hoisted for the consolidation OOB filter // By Claude on 07/12/2026
if (mb_vectors != null) {
// Motion-blur compensation (lean v2, the certified CuasRender chain): two task
// sets, double convert (positive SET + negative shifted SUBTRACT), erase-first
......@@ -311,6 +313,7 @@ public class CuasPoseRT {
System.out.println("leanMeasure(): no MB tasks for scene "+scene.getImageName());
return null;
}
cons_tasks = tp_tasks2; // By Claude on 07/12/2026
image_dtt.interCorrTDMotionBlur(
clt_parameters.img_dtt,
1, // erase_clt_first: NaN outside the task set
......@@ -344,6 +347,7 @@ public class CuasPoseRT {
System.out.println("leanMeasure(): no tasks for scene "+scene.getImageName());
return null;
}
cons_tasks = new TpTask [][] {tp_tasks, null}; // no-MB: single set, [1] = null // By Claude on 07/12/2026
// 2. convert only: LPFs + tasks + offsets + convert_direct, NO correlation (mask=0)
image_dtt.interCorrTD(
clt_parameters.img_dtt,
......@@ -369,7 +373,9 @@ public class CuasPoseRT {
gpuQuad.execConvertDirect(false, null, 1);
}
}
// 3. the CPU consolidation bridge (future clt_average_sensors kernel).
// 3. the consolidation bridge: GPU v1 chain (JNA backend, on-device, OOB-filtered)
// with the CPU bridge as the JCuda-backend fallback - see CuasTD.consolidateToSlot0.
// By Claude on 07/12/2026 (was the unconditional CPU bridge).
// The TRUE weighted average is fed to the correlator (NOT scaled to the oracle's
// 16-pair sum): the sum-scaling experiment (LEAN-07) made peaks WIDER (sqrt_l0
// 3.22 -> 5.58, corr RMS 0.82 -> 1.005) - at 16x signal-to-fat-zero the normalize
......@@ -377,9 +383,8 @@ public class CuasPoseRT {
// dominated, not fz-dominated (NOMB oracle 3.58 ~ lean 3.22 at 16x different
// amplitude); the fat zero regularizes usefully at the average's operating point.
// By Claude on 07/04/2026, falsified-and-reverted per LEAN-07.
final float [][] fclt16 = gpuQuad.getCltData(false);
final float [] avg_td = CuasTD.consolidateSensorsTD(fclt16, null);
gpuQuad.setCltData(0, avg_td, false);
CuasTD.consolidateToSlot0(gpuQuad, cons_tasks, // By Claude on 07/12/2026
clt_parameters.curt.oob_soft, clt_parameters.curt.oob_hard);
// DEBUG (img_out): render the composite the correlator sees (the weighted average)
if (img_out != null) {
img_out[0] = com.elphel.imagej.cuas.CuasMotion.perSensorImagesFromTD(gpuQuad, false)[0];
......
......@@ -471,7 +471,7 @@ public class CuasRT {
return;
}
AvgTdExport.exportOob(gpuQuad, false, new TpTask [][] {tasks_out[0], null},
CuasTD.OOB_SOFT_DEFAULT, CuasTD.OOB_HARD_DEFAULT,
clt_parameters.curt.oob_soft, clt_parameters.curt.oob_hard, // dialog params (defaults = frozen 12/8) // By Claude on 07/12/2026
dir_path, phys.getImageName(), debugLevel);
break;
}
......
......@@ -213,6 +213,7 @@ public class CuasRender {
null, center_disparity, scene_xyz, scene_atr, scene, center_CLT);
final double disparity_corr = clt_parameters.imp.disparity_corr + center_CLT.getDispInfinityRef();
final int img_width = scene.getGeometryCorrection().getSensorWH()[0];
final TpTask [][] cons_tasks; // the convert task sets, hoisted for the consolidation OOB filter // By Claude on 07/12/2026
if (mb_vectors != null) {
// Motion-blur compensation: TWO task sets (original positive scale + shifted
// negative scale), double convert_direct - the oracle machinery
......@@ -237,6 +238,7 @@ public class CuasRender {
System.out.println("renderSceneVirtual(): no MB tasks for scene "+scene.getImageName());
return null;
}
cons_tasks = tp_tasks2; // By Claude on 07/12/2026
image_dtt.interCorrTDMotionBlur(
clt_parameters.img_dtt,
1, // erase_clt_first: NaN outside the task set // By Claude on 07/05/2026
......@@ -270,6 +272,7 @@ public class CuasRender {
System.out.println("renderSceneVirtual(): no tasks for scene "+scene.getImageName());
return null;
}
cons_tasks = new TpTask [][] {tp_tasks, null}; // no-MB: single set, [1] = null // By Claude on 07/12/2026
// 2. LPFs + tasks + offsets + convert (mask=0: no correlation)
image_dtt.interCorrTD(
clt_parameters.img_dtt,
......@@ -294,9 +297,9 @@ public class CuasRender {
// 3. per-sensor renders (virtual grid)
final float [][] per_sensor = CuasMotion.perSensorImagesFromTD(gpuQuad, false);
// 4. merged = the NaN-aware weighted average consolidated in TD, rendered via slot 0
final float [][] fclt16 = gpuQuad.getCltData(false);
final float [] avg_td = CuasTD.consolidateSensorsTD(fclt16, null);
gpuQuad.setCltData(0, avg_td, false);
// (GPU v1 chain on JNA / CPU bridge on JCuda, OOB soft/hard filtered) // By Claude on 07/12/2026
CuasTD.consolidateToSlot0(gpuQuad, cons_tasks,
clt_parameters.curt.oob_soft, clt_parameters.curt.oob_hard);
final float [] merged = CuasMotion.perSensorImagesFromTD(gpuQuad, false)[0];
final float [][] rslt = new float [per_sensor.length + 1][];
System.arraycopy(per_sensor, 0, rslt, 0, per_sensor.length);
......
......@@ -234,6 +234,52 @@ public class CuasTD {
return avg;
}
private static boolean gpu_bridge_reported = false; // one-line console note on the first GPU-chain run // By Claude on 07/12/2026
/**
* The consolidation bridge shared by the RT call sites (lean pose measurement,
* virtual render "merged"): consolidate the 16-sensor TD into the cam-0 CLT slot.
* GPU-first: {@link GpuQuad#execConsolidateSensorsTD} runs the on-device v1 chain
* (index_consolidate -> consolidate_oob -> clt_average_sensors_list, JNA backend
* only - the per-sensor TD never leaves the device). CPU fallback (the pre-07/12
* bridge, now OOB-mask-capable): getCltData D2H -> oobSensorMasks + masked
* consolidateSensorsTD -> setCltData(0) H2D - used on the JCuda backend (Andrey's
* 07/12/2026 ruling: no JCuda launch code for new kernels) or if the native call
* fails. Margins 0/0 = v0 unfiltered (also when tp_tasks == null).
* By Claude on 07/12/2026.
*
* @param gpuQuad GPU with a current per-sensor TD (after convert_direct)
* @param tp_tasks [2][]: task set 0 + MB pair set ([1] may be null = no-MB),
* the sets used for the convert; null = no geometry filtering
* @param soft_margin OOB soft margin, px (curt.oob_soft; 0 = tier disabled)
* @param hard_margin OOB hard margin, px (curt.oob_hard; 0 = tier disabled)
*/
public static void consolidateToSlot0(
final GpuQuad gpuQuad,
final TpTask [][] tp_tasks,
final double soft_margin,
final double hard_margin) {
if (gpuQuad.execConsolidateSensorsTD(tp_tasks, soft_margin, hard_margin)) {
if (!gpu_bridge_reported) {
gpu_bridge_reported = true;
System.out.println("CuasTD.consolidateToSlot0(): GPU consolidation chain active (soft/hard = "+
soft_margin+"/"+hard_margin+" px, no D2H/H2D)");
}
return;
}
final float [][] fclt16 = gpuQuad.getCltData(false);
int [] masks = null;
if ((tp_tasks != null) && ((soft_margin > 0) || (hard_margin > 0))) {
final int [] wh = gpuQuad.getWH(false);
final int tilesX = wh[0] / GPUTileProcessor.DTT_SIZE;
final int tilesY = wh[1] / GPUTileProcessor.DTT_SIZE;
masks = oobSensorMasks(tp_tasks, gpuQuad.num_cams, tilesX, tilesY,
wh[0], wh[1], soft_margin, hard_margin);
}
final float [] avg_td = consolidateSensorsTD(fclt16, null, masks, gpuQuad.num_colors);
gpuQuad.setCltData(0, avg_td, false);
}
/**
* Validate the consolidation against the linearity oracle: imclt is linear, so
* imclt(TD-average of sensors) must equal the pixel-domain average of the
......
......@@ -1361,6 +1361,31 @@ public class GpuQuad{ // quad camera description
}
/**
* On-device 16-sensor TD consolidation (roadmap 2c v1 chain: index_consolidate ->
* consolidate_oob -> clt_average_sensors_list in tp_consolidate.cu): average the
* per-sensor CLT into the cam-0 slot WITHOUT the D2H/H2D round-trip of the CPU
* bridge (getCltData -> CuasTD.consolidateSensorsTD -> setCltData(0)). Supported
* only by the JNA backend (GpuQuadJna) per Andrey's 07/12/2026 ruling - no JCuda
* launch code for new kernels; this base returns false so callers fall back to
* the (OOB-mask-capable) CPU bridge, see CuasTD.consolidateToSlot0().
* By Claude on 07/12/2026.
*
* @param tp_tasks [2][]: task set 0 + MB pair set (or [1]==null = no-MB), the
* sets used for the convert (GpuQuad.setInterTasksMotionBlur
* convention)
* @param soft_margin OOB soft margin, px (~12.0; 0 = tier disabled)
* @param hard_margin OOB hard margin, px (~8.0; 0 = tier disabled; 0/0 = v0)
* @return true if the GPU chain ran (cam-0 slot holds the average), false =
* unsupported/failed - caller must run the CPU bridge instead
*/
public boolean execConsolidateSensorsTD( // By Claude on 07/12/2026
TpTask [][] tp_tasks,
double soft_margin,
double hard_margin) {
return false; // JCuda backend: not implemented (CPU bridge fallback)
}
public void setCltData( // for testing only
float [][] fclt, //
boolean use_ref){
......
......@@ -120,6 +120,42 @@ public class GpuQuadJna extends GpuQuad {
return fclt;
}
// On-device 16-sensor TD consolidation (tp_consolidate.cu v1 chain) - replaces the CPU
// bridge (getCltData -> CuasTD.consolidateSensorsTD -> setCltData(0)): the per-sensor TD
// stays on the device, only the small flattened task streams cross the JNA boundary. The
// average lands in the cam-0 CLT slot (what the single conj-multiply correlates). Oracle:
// CuasTD.oobSensorMasks + masked consolidateSensorsTD, validated bit-exact (tol 0) on the
// real-scene avg_td_oob case through this very export. By Claude on 07/12/2026.
@Override public boolean execConsolidateSensorsTD(TpTask [][] tp_tasks, double soft_margin, double hard_margin) {
if ((tp_tasks == null) || (tp_tasks.length < 1) || (tp_tasks[0] == null) || (tp_tasks[0].length == 0)) {
return false; // nothing to consolidate - let the caller decide
}
final int task_size = tp_tasks[0][0].getSize();
final float [][] ftasks = new float [2][];
for (int nset = 0; nset < 2; nset++) {
if ((nset >= tp_tasks.length) || (tp_tasks[nset] == null)) continue;
final TpTask [] tasks = tp_tasks[nset];
ftasks[nset] = new float [tasks.length * task_size];
for (int i = 0; i < tasks.length; i++) {
tasks[i].asFloatArray(ftasks[nset], i, false); // exact GPU struct layout
}
}
final int [] stats = new int [3]; // {MB pairs, surviving tiles, misaligned}
int rc = lib.tp_proc_exec_consolidate(proc, ftasks[0], ftasks[1],
tp_tasks[0].length, task_size, (float) soft_margin, (float) hard_margin, stats);
if (rc != 0) {
System.out.println("GpuQuadJna.execConsolidateSensorsTD(): native rc=" + rc +
" (" + lib.tp_last_error() + ") - falling back to the CPU bridge");
return false;
}
if (stats[2] != 0) {
System.out.println("GpuQuadJna.execConsolidateSensorsTD(): WARNING - " + stats[2] +
" misaligned MB pairs (task sets not index-aligned), " +
stats[0] + " pairs -> " + stats[1] + " tiles");
}
return true;
}
/** Native handles for the override implementations (added incrementally). */
protected TpJna lib() { return lib; }
protected Pointer module() { return module; }
......
......@@ -12,7 +12,8 @@ public interface TpJna extends Library {
/** NVRTC-compile the kernels in srcdir (+ getTpDefines), cuLink(libcudadevrt), load the module.
* Returns an opaque module handle, or null on failure (see tp_last_error()). */
Pointer tp_create_module(String srcdir, String libcudadevrt);
/** Number of kernel functions resolved in the module (19 expected), or -1 if handle is null. */
/** Number of kernel functions resolved in the module (23 expected: 19 + the 4 tp_consolidate
* kernels added 07/12/2026), or -1 if handle is null. */
int tp_module_num_functions(Pointer module);
/** Last error message (NVRTC/CUDA log), empty if none. */
String tp_last_error();
......@@ -80,6 +81,16 @@ public interface TpJna extends Library {
int tp_proc_exec_convert_direct(Pointer proc, int refScene, int eraseClt, int noKernels);
int tp_proc_get_clt(Pointer proc, int cam, int refScene, float[] out);
int tp_proc_set_clt(Pointer proc, int cam, float[] data, int refScene);
/** On-device 16-sensor TD consolidation (tp_consolidate.cu v1 chain, roadmap 2c):
* index_consolidate -> consolidate_oob (soft/hard margins, px; 0/0 = v0 no filtering) ->
* clt_average_sensors_list; the average lands in the cam-0 CLT slice (the per-sensor TD
* never leaves the device — replaces the getCltData/consolidateSensorsTD/setCltData CPU
* bridge). ftasks0/1 = flattened TpTask streams (TpTask.asFloatArray), ftasks1 null = no-MB.
* stats (int[3], may be null) = {MB pairs kept, surviving tiles, misaligned pairs}.
* 0 on success. By Claude on 07/12/2026. */
int tp_proc_exec_consolidate(Pointer proc, float[] ftasks0, float[] ftasks1,
int numEntries, int taskSize,
float softMargin, float hardMargin, int[] stats);
/** Allocate imclt(RBG) + correlation buffers and store corr config. */
int tp_proc_setup_rbg_corr(Pointer proc, int numPairs, int s0,int s1,int s2,int s3,
float cw0,float cw1,float cw2, int corrOutRad);
......
......@@ -12,6 +12,7 @@ import java.awt.Rectangle;
import java.util.Properties;
import com.elphel.imagej.common.GenericJTabbedDialogMcp;
import com.elphel.imagej.cuas.rt.CuasTD; // OOB margin defaults (single source, frozen spec) // By Claude on 07/12/2026
public class CuasRtParameters {
public boolean en = true; // enable cuas rt calculation (not needed with a separate button)
......@@ -37,6 +38,8 @@ public class CuasRtParameters {
public double fz_inter = 10000.0; // RT fat zero, INTER (pose/motion: scene x virtual-center correlation). DECOUPLED from the legacy gpu_fatz*/AUX switches (which stay untouched for non-RT/FOPEN). Value is for a single physical-pair amplitude; FZ ~ amplitude^2 in the GPU normalize - scale down x4..x16 for consolidated-average applications as needed. 10000 = the proven oracle INTER operating point (the lean code erroneously used the INTRA value before). // By Claude on 07/05/2026
public double fz_intra = 2000.0; // RT fat zero, INTRA (ranging/disparity: sensor-pair correlations within one scene). Reserved for the RT ranging path; same decoupling/scaling notes as fz_inter. // By Claude on 07/05/2026
public double dc_center = 0.0; // DC level of the BORROWED center (CLT-RESTORED/average): subtracted from the center CLT at appropriation (CuasRT initialization) so it matches the zero-sky conditioned scenes (MCLT has no clean DC/AC split - a DC constant costs float32 accuracy). 0 = AUTO: reuse the PER-SEQUENCE value from <center>-RT-STATE.json; when absent, derive as the median of the top (sky) half of the reference buffer render and store it there (erase the file/field to re-derive - the missing-file rule). Nonzero = manual override; this config value is never mutated. Slow targets do not influence this shift. // By Claude on 07/05/2026
public double oob_soft = CuasTD.OOB_SOFT_DEFAULT; // 16-sensor TD consolidation, OOB source-margin priority (roadmap 2c, frozen spec Andrey 07/12/2026): SOFT margin, px - a sensor whose tile center is closer than this to its source-frame edge (in EITHER MB pass) is deprioritized (24x24 MCLT support overhangs the frame - defined-but-synthetic replicated rows): used only when NO sensor has the tile deeper. ~12. 0 = tier disabled. Consumed by the GPU consolidate_oob kernel (JNA backend) and the CPU oracle CuasTD.oobSensorMasks identically. // By Claude on 07/12/2026
public double oob_hard = CuasTD.OOB_HARD_DEFAULT; // OOB HARD margin, px - closer than this the 16x16 tile core itself overhangs the frame: the sensor is always skipped. All 16 below hard -> tile poisoned (NaN, v0 semantics - never a synthetic average). ~8. 0 = tier disabled; both margins 0 = v0-compatible unfiltered average (the A/B knob for judging whether coordinate-based filtering suffices). // By Claude on 07/12/2026
public boolean rowcol_en = true; // RT conditioning: subtract per-row/per-column line noise from each raw scene (CuasConditioning). OPTIONAL/bypassable: turn OFF when the FLIR internal row/col correction is verified sufficient (indoor camera test planned) - roadmap RT step 2a (Andrey 07/07/2026). // By Claude on 07/07/2026
public boolean rowcol_hpf = true; // RT conditioning: high-pass the 1-D row/col average profiles before subtracting (preserve low frequencies for the downstream LoG). // By Claude on 07/07/2026
public double rowcol_hpf_sigma = 8.0; // RT conditioning: Gaussian sigma (px) of the profile high-pass, ~ the LoG scale (the noise band the LoG would pass). // By Claude on 07/07/2026
......@@ -150,6 +153,12 @@ public class CuasRtParameters {
gd.addNumericField("Center DC level (0 - auto)", this.dc_center, 3,9,"counts", // By Claude on 07/05/2026
"DC level subtracted from the borrowed center at appropriation (match the zero-sky scenes). 0 = AUTO: reuse the per-sequence value from <center>-RT-STATE.json, derive (sky-half median of the reference render) and store there when absent; erase the file/field to re-derive. Nonzero = manual override; this configuration value is never mutated.");
gd.addMessage("=== 16-sensor TD consolidation: OOB source-margin priority ==="); // By Claude on 07/12/2026
gd.addNumericField("OOB soft margin (support overhang)", this.oob_soft, 1,7,"pix", // By Claude on 07/12/2026
"Deprioritize a sensor whose tile center is closer than this to its SOURCE-frame edge (24x24 MCLT support overhangs - replicated synthetic rows): used only when no sensor has the tile deeper inside. ~12. 0 = tier disabled. Same value drives the GPU consolidate_oob kernel (JNA backend), the CPU fallback oracle and the avg_td_oob test export.");
gd.addNumericField("OOB hard margin (core overhang)", this.oob_hard, 1,7,"pix", // By Claude on 07/12/2026
"Always skip a sensor whose tile center is closer than this to its source-frame edge (the 16x16 tile core itself overhangs). All 16 below -> tile poisoned (NaN), never a synthetic average. ~8. 0 = tier disabled; both margins 0 = v0 unfiltered (A/B knob).");
gd.addMessage("=== RT conditioning: Row/Col line noise ==="); // By Claude on 07/07/2026
gd.addCheckbox ("Subtract row/col noise (RT conditioning)", this.rowcol_en, // By Claude on 07/07/2026
"Subtract per-row/per-column line noise from each raw scene during RT conditioning (CuasConditioning). Turn OFF to bypass when the FLIR internal row/column correction is verified sufficient.");
......@@ -310,6 +319,8 @@ public class CuasRtParameters {
this.fz_inter = gd.getNextNumber(); // By Claude on 07/05/2026
this.fz_intra = gd.getNextNumber(); // By Claude on 07/05/2026
this.dc_center = gd.getNextNumber(); // By Claude on 07/05/2026
this.oob_soft = gd.getNextNumber(); // By Claude on 07/12/2026
this.oob_hard = gd.getNextNumber(); // By Claude on 07/12/2026
this.rowcol_en = gd.getNextBoolean(); // By Claude on 07/07/2026
this.rowcol_hpf = gd.getNextBoolean(); // By Claude on 07/07/2026
......@@ -406,6 +417,8 @@ public class CuasRtParameters {
properties.setProperty(prefix+"fz_inter", this.fz_inter+""); // double // By Claude on 07/05/2026
properties.setProperty(prefix+"fz_intra", this.fz_intra+""); // double // By Claude on 07/05/2026
properties.setProperty(prefix+"dc_center", this.dc_center+""); // double // By Claude on 07/05/2026
properties.setProperty(prefix+"oob_soft", this.oob_soft+""); // double // By Claude on 07/12/2026
properties.setProperty(prefix+"oob_hard", this.oob_hard+""); // double // By Claude on 07/12/2026
properties.setProperty(prefix+"rowcol_en", this.rowcol_en+""); // boolean // By Claude on 07/07/2026
properties.setProperty(prefix+"rowcol_hpf", this.rowcol_hpf+""); // boolean // By Claude on 07/07/2026
......@@ -502,6 +515,8 @@ public class CuasRtParameters {
if (properties.getProperty(prefix+"fz_inter")!=null) this.fz_inter=Double.parseDouble(properties.getProperty(prefix+"fz_inter")); // By Claude on 07/05/2026
if (properties.getProperty(prefix+"fz_intra")!=null) this.fz_intra=Double.parseDouble(properties.getProperty(prefix+"fz_intra")); // By Claude on 07/05/2026
if (properties.getProperty(prefix+"dc_center")!=null) this.dc_center=Double.parseDouble(properties.getProperty(prefix+"dc_center")); // By Claude on 07/05/2026
if (properties.getProperty(prefix+"oob_soft")!=null) this.oob_soft=Double.parseDouble(properties.getProperty(prefix+"oob_soft")); // By Claude on 07/12/2026
if (properties.getProperty(prefix+"oob_hard")!=null) this.oob_hard=Double.parseDouble(properties.getProperty(prefix+"oob_hard")); // By Claude on 07/12/2026
if (properties.getProperty(prefix+"rowcol_en")!=null) this.rowcol_en=Boolean.parseBoolean(properties.getProperty(prefix+"rowcol_en")); // By Claude on 07/07/2026
if (properties.getProperty(prefix+"rowcol_hpf")!=null) this.rowcol_hpf=Boolean.parseBoolean(properties.getProperty(prefix+"rowcol_hpf")); // By Claude on 07/07/2026
......@@ -601,6 +616,8 @@ public class CuasRtParameters {
cp.fz_inter = this.fz_inter; // By Claude on 07/05/2026
cp.fz_intra = this.fz_intra; // By Claude on 07/05/2026
cp.dc_center = this.dc_center; // By Claude on 07/05/2026
cp.oob_soft = this.oob_soft; // By Claude on 07/12/2026
cp.oob_hard = this.oob_hard; // By Claude on 07/12/2026
cp.rowcol_en = this.rowcol_en; // By Claude on 07/07/2026
cp.rowcol_hpf = this.rowcol_hpf; // By Claude on 07/07/2026
cp.rowcol_hpf_sigma = this.rowcol_hpf_sigma; // By Claude on 07/07/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