1. 03 Jul, 2026 3 commits
    • Andrey Filippov's avatar
      CLAUDE: fix lwir recalibration persistence targets · 0594db87
      Andrey Filippov authored
      The virtual -CENTER INTERFRAME corr-xml only carries poses/velocities, so
      saving the recalculated 16+16 lwir offsets/scales there was futile. Follow
      the established photometric machinery (runPhotometric()/photoEach()) and
      the top-menu save/restore convention instead: set the new values on
      master_CLT (immediate use), quadCLTs[ref_index] (physical photometric
      owner, its <scene>-INTERFRAME.corr-xml is saved) and quadCLT_main (applied
      to next sequences and saved in the main configuration file).
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      0594db87
    • Andrey Filippov's avatar
      CLAUDE: per-sensor lwir photometric recalibration + JNA bayer-guard fix · ebef0b23
      Andrey Filippov authored
      curt_cond_test rework: both PERSENSOR stacks now converted with the test's
      own uniform sensor-domain task grid (scale 1.0) instead of leftover GPU
      state (MB secondary tasks with negative fractional scales made 'raw'
      renders = -1/6 x input; leftover virtual-view grid lost the same border
      ROI on every sensor). perSensorFromRawJp4 no longer overwrites the scene's
      conditioned image_data.
      
      GpuQuadJna.setBayerImages(force,center) restored the base-class skip-guard
      via a native-side jna_bayer_set flag (gpuTileProcessor is null in JNA shell
      instances): every execConvertDirect unconditionally re-pulled
      quadCLT.getResetImageData(), silently clobbering explicit uploads - made
      the raw baseline bit-identical to the conditioned render.
      
      CuasMotion.perSensorLinearFit(): per-sensor a+b*x photometric fit over
      safe tiles (weak strength<0.5 or far disparity<1 from -INTER-INTRA-LMA,
      inner rect, 8x8 tile->pixel map) against the cross-sensor mean, gauge
      keep_averages (mean offset 0, mean scale 1), 3-sigma outlier rejection.
      Validated on 1773135476_186641: sensor-mean spread 1353->5 counts,
      cross-sensor RMS 358->17 (inliers), b in 0.83..1.11.
      
      CuasMotion.applyLwirLinearCalibration(): folds the fit into the 16+16
      lwir offsets/scales (scale'=b*scale, offset'=offset-a/scale'), updates the
      center instance + photometric_scene provenance, saves -INTERFRAME.corr-xml.
      Applied the standard way at load they compensate the remaining per-sensor
      mismatch of the raw /jp4/ tiffs.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      ebef0b23
    • Andrey Filippov's avatar
      CLAUDE: renderSceneSequence() hyperstack mode (make_hyper) + per-sensor averages · 96b1c3d5
      Andrey Filippov authored
      Add make_hyper parameter (code-selected, not in settings): 0 - flat stack
      (old behavior, all pre-existing call sites); >0 - transpose to hyperstack
      [sensors][avgs+timestamps][pixel], z (top slider) - timestamps, t (bottom
      slider) - sensor channels; 2 - insert per-timestamp average of all used
      sensors as first channel (17th), computed from final conditioned slices.
      Per-sensor full + center-fraction averages now work in individual mode
      (pre-calculated merged-only average falls back to slice computation with
      a warning instead of AIOOBE). Number of average frames stays variable
      (0/1/2); fopen paths bit-identical by design.
      Verified on 495-scene CUAS sequence: INDIVIDUAL debug hyperstack matches
      the MERGED convention - to be used as oracle for RT conditioning.
      Co-Authored-By: 's avatarClaude Fable 5 <noreply@anthropic.com>
      96b1c3d5
  2. 02 Jul, 2026 2 commits
    • Andrey Filippov's avatar
      Improving renderSceneSequence() · eae75ef1
      Andrey Filippov authored
      eae75ef1
    • Andrey Filippov's avatar
      CLAUDE: CUAS RT per-sensor conditioning test + NaN-tolerant subtract-avg/LoG · d3c015c3
      Andrey Filippov authored
      Add a curt_cond_test path (boolean at the top of the CUAS-RT dialog) that,
      inside the curt_en branch, renders the 16 per-sensor images and saves them to
      the -CENTER instance for calibration inspection:
      - CuasMotion.perSensorAveragesFromTD: imclt the per-sensor TD, print the
        16-sensor average spread, save -CUAS-PERSENSOR (16-slice stack, per-slice
        avg labels). Saves via the -CENTER instance, not gpuQuad.getQuadCLT().
      - CuasMotion.perSensorFromRawJp4: read RAW /jp4/ per-sensor (oracle getJp4Tiff,
        one thread/sensor), force-H2D (bypass the "GPU mem already correct" verify),
        execConvertDirect from raw, save -CUAS-PERSENSOR-RAW (uncorrected baseline;
        calibration stays a separate "cheat"). RT-seed for the future SATA raw
        stream; GPU port later with Java as oracle.
      
      Fix the NaN border on the RT SUBAVG-CONV2D product:
      - CuasDetectRT subtract-average -> NaN-tolerant union (average only non-NaN
        scenes per pixel), matching the oracle -CUAS-MERGED-CUAS; the plain sum
        NaN-propagated (one missing scene poisoned the pixel in every frame ->
        thick border after LoG).
      - CuasRTUtils.convolve2DLReLU -> NaN-aware (NaN out only if the center is NaN;
        substitute the center value for NaN taps), so the LoG can't bloom a thin
        border into a thick NaN frame.
      - Add -SUBAVG-PRELOG save (post-subtract-avg, pre-LoG) for bisecting.
      
      Compiles (mvn -DskipTests clean package). WIP: the raw-path values/edge and the
      in-memory-vs-file (MERGED-CUAS) divergence are still under review; the ~28px
      edge residual is traced to the temporal subtract-average at the rotation-swept
      composite edge. See ANDREY_CONTINUE.md open items.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      d3c015c3
  3. 01 Jul, 2026 1 commit
    • Andrey Filippov's avatar
      CLAUDE: lean RT conditioning (CuasConditioning) + per-sensor-average render tool · a62a6b06
      Andrey Filippov authored
      Piece 1 of the RT conditioning migration (design: internal handoff
      2026-06-30_rt_conditioning_design.md):
      - cuas/rt/CuasConditioning: lean, self-contained per-sensor conditioning for the
        TP/RT path - Row/Col denoise (on/off, optional HPF of the 1-D avg profile) then
        photometric scales2*(raw-C0)^2 + scale*(raw-C0) - FPN (bit-matches the current
        additive path when scales2=0). Bypasses the heavy QuadCLT conditioning path.
      - CuasMotion.perSensorAveragesFromTD(GpuQuad, use_reference): memory-lean render of
        all 16 per-sensor from TD; per-sensor average + spread = calibration-quality gauge.
      
      Building blocks only; full test wiring (raw jp4 -> condition -> convert_direct ->
      renderSceneSequence per-sensor averages) + Eyesis invocation entry still pending.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      a62a6b06
  4. 27 Jun, 2026 3 commits
    • Andrey Filippov's avatar
      CLAUDE: opt-in -Plibtorch Maven profile to unpack libtorch from the mirror (piece 4B) · 5221ec2c
      Andrey Filippov authored
      Adds an OFF-by-default profile that dependency:unpacks the libtorch native runtime
      (org.pytorch:libtorch-cxx11-cu128:2.7.1:zip, cu128) from mirror.elphel.com/maven-dependencies
      into target/libtorch-dist for the native DNN backend (libtpdnn.so / CuasDnnLocal) on a
      deployment box. The default build never downloads the 3.8GB zip.
      
      Artifact published to the mirror in maven layout (server-side copy of the existing zip)
      via tile_processor_gpu/jna/publish_libtorch_mirror.sh. Verified: zip + .pom reachable at
      the computed maven URL (HTTP 200, 3.78GB), profile parses (mvn -Plibtorch validate OK).
      Full unpack deferred (redundant on this box - libtorch already extracted); exercises on
      first deployment machine via `mvn -Plibtorch generate-resources`.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      5221ec2c
    • Andrey Filippov's avatar
      CLAUDE: bundle L1+L2 TorchScript models as resources (piece 4A) · 7e296021
      Andrey Filippov authored
      Bundles the exported TorchScript models + their .meta.json sidecars under
      src/main/resources/cuas_dnn/<name>/ so CuasDnnLocal runs with no local model
      dir (deployment needs no PyTorch/dev tooling - just the .so + libtorch runtime):
        weighted9_pm_s/model.ts.pt (+.meta.json)        L1 (N=9,P=24,vr=5,out_ch=124)
        mexhat_gaps_boost40/model.l2.ts.pt (+.meta.json) L2 (ch_hidden=24,vmax=1.4)
      
      Validated: CuasDnnLocal bundled-resource path (curt_dnn_local_dir empty) extracts
      from the jar and matches the server oracle EXACTLY (offset5=0.0, roi=0.0).
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      7e296021
    • Andrey Filippov's avatar
      CLAUDE: in-process native DNN backend (CuasDnnLocal) via JNA - no server · 54d842f0
      Andrey Filippov authored
      Piece 3 of the native-JNA DNN path. Adds a local backend that runs the SAME
      L1+L2 inference as CuasDnnRemote but in-process via LibTorch (libtpdnn.so / JNA),
      so the CUAS pipeline runs without the DGX or any Python server:
        - CuasDnnBackend  : shared interface (upload/getNFrames/inferBatch->BatchResult/close)
        - TpDnnJna        : JNA Library binding libtpdnn.so's C-ABI
        - CuasDnnLocal    : wraps it; reads N/P/vr/l2_ch from each model's bundled .meta.json
                            (single source of truth), float[][]<->float[], builds BatchResult
        - CuasDnnRemote   : now implements CuasDnnBackend (signatures unchanged)
        - CuasDetectRT    : DNN path gate now fires on (curt_dnn_remote || curt_dnn_local);
                            backend = local? CuasDnnLocal : CuasDnnRemote; ensureServer skipped
                            when local; local-CPU-ORT gate also excludes curt_dnn_local (no
                            double-run). runDnnRemote loop unchanged.
        - IntersceneMatchParameters: curt_dnn_local (flag) + curt_dnn_local_dir (model dir
                            override; empty = bundled /cuas_dnn resource) + GUI labels/persist.
      
      Validated: full Java->JNA->libtpdnn vs the Python-server oracle = EXACT
      (offset5=0.0, roi=0.0, nch=6). mvn -DskipTests package OK.
      
      Runtime: -Djna.library.path=<dir with libtpdnn.so>; libtpdnn.so finds libtorch via
      its rpath. Model resolution mirrors CuasDnnRemote's bundled-vs-override scheme.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      54d842f0
  5. 26 Jun, 2026 14 commits
    • Andrey Filippov's avatar
      CLAUDE: strip TEMP migration probes + proactive side-effect-parity sweep · 9258b5d9
      Andrey Filippov authored
      Migration validated (JNA CUAS targets match JCuda). Cleanup:
      - Removed all TEMP debug probes (-Dtp.dbg.corrpair, probeClt, saveTDRender,
        the one-shot DBG/PROBE blocks in GpuQuadJna + CuasMotion). Real fixes kept
        (rectilinear port, num_pairs=3, setCorrIndicesTdData, imclt ref_scene,
        num_corr_tiles propagation f6dcc90f).
      - Proactive sweep for the f6dcc90f bug-class (JNA override drops a base
        side-effect field write): getCorrComboIndices/getCorr2DCombo propagate
        num_corr_combo_tiles, setCorrIndicesTdData propagates num_corr_tiles,
        getTextureIndices propagates num_texture_tiles; those fields made protected.
        These four are LATENT (no live consumer on the validated CUAS path) and are
        marked NOT-YET-TESTED inline.
      
      Java-only. mvn compile clean.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      9258b5d9
    • Andrey Filippov's avatar
      CLAUDE: JNA getCorrIndices propagates num_corr_tiles to base field (real fix) · f6dcc90f
      Andrey Filippov authored
      Root cause of the CORR2D-all-NaN / 0-targets: the inter-correlation actually
      works (probe showed num_corr_tiles=8850 = 4425 tiles x (1 sensor + 1 sum)), but
      the TD readback dropped it. Base GpuQuad.getCorrIndices() sets the num_corr_tiles
      field ("also sets num_corr_tiles"); GpuQuadJna.getCorrIndices() read the native
      count locally and returned the array WITHOUT setting the field. So
      TDCorrTile.getFromGpu (num_tiles = getNumCorrTiles()/num_pairs) and base
      getCorrTilesTd (uses the field directly) saw a stale 0 -> built 0 tiles ->
      empty target sequence -> null ROUND_ONE image -> saveImagePlusInModelDirectory
      NPE (the misplaced-null-guard latent bug is just the messenger).
      
      Fix: GpuQuadJna.getCorrIndices() sets num_corr_tiles = n (native count); field
      made protected so the subclass can. Java-only.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      f6dcc90f
    • Andrey Filippov's avatar
      CLAUDE: probe inter-corr sel_sensors/num_cams/count + fix saveTDRender NPE (TEMP) · c592e5ff
      Andrey Filippov authored
      Post-mortem showed both CLT buffers loaded but inter-correlation -> 0 tiles.
      index_inter_correlate selects by __popc(sel_sensors); static reading says
      sel_sensors should be 1 (single-cam rectilinear), so a runtime value differs.
      - GpuQuadJna.execCorr2D_inter_TD: one-shot print sel_sensors/popc/num_cams/
        num_colors/scales + the returned num_corr_tiles.
      - saveTDRender: makeArrays NPE'd on null titles (derefs titles[i]); pass a
        non-null titles[] so the render saves instead of crashing the run.
      TEMP — remove with the rest of the -Dtp.dbg.corrpair probe.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      c592e5ff
    • Andrey Filippov's avatar
      CLAUDE: more one-shot post-mortem diagnostics (TEMP, Java-only) · f163b14a
      Andrey Filippov authored
      Single sacrificial run -> generous logging without spam:
      - GpuQuadJna: probe BOTH first ref convert (gpu_clt_ref) AND first scene convert
        (gpu_clt) — NaN%/nonzero/range each (probeClt helper).
      - CuasMotion.correlatePair one-shot: log targets_mv / tp_ref,tp_img counts /
        erase_cltr,erase_clt / fpixels null-ness, plus TD-correlation read-back stats
        (tile count + NaN% of TD values) alongside the DBG-REF/DBG-IMG renders.
      
      All gated/one-shot; no native change (reads via existing tp_proc_get_clt).
      TEMP — remove with the rest of the -Dtp.dbg.corrpair probe.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      f163b14a
    • Andrey Filippov's avatar
      CLAUDE: JNA imclt ref_scene fix + one-shot ref/scene post-mortem renders (TEMP) · 6da17148
      Andrey Filippov authored
      (1) GpuQuadJna.execImcltRbgAll now passes ref_scene -> tp_proc_exec_imclt(use_ref)
      so renderFromTD(true) renders gpu_clt_ref, not gpu_clt (TpJna binding updated).
      
      (2) TEMP post-mortem in CuasMotion.correlatePair (gate -Dtp.dbg.corrpair=1,
      one-shot): after the inter-correlation, SAVE ref (gpu_clt_ref) + scene (gpu_clt)
      CLT renders to the model dir via saveImagePlusInModelDirectory (persist past the
      later crash; no window flood). DBG-REF blank/NaN => reference not loaded =>
      explains the all-NaN CORR2D (inter corr needs both images). REMOVE after fix.
      
      Needs the tile_processor_gpu imclt use_ref commit + libtileproc.so rebuild.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      6da17148
    • Andrey Filippov's avatar
      CLAUDE: TEMP probe — print gpu_clt_ref stats after first ref convert (JNA) · f8a7a972
      Andrey Filippov authored
      Diagnostic for the CORR2D-all-NaN numeric divergence: after the first
      ref_scene=true convert, read back gpu_clt_ref (tp_proc_get_clt use_ref=1) and
      print NaN%/nonzero/min/max once. Confirms whether the reference convert
      populates gpu_clt_ref at all (vs scene gpu_clt which is correct -> SOURCE).
      
      Prints one "PROBE gpu_clt_ref[cam0]: ..." line to System.out (captured in the
      per-scene -SYSTEM_OUT.log). TEMP — remove after the divergence is fixed.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      f8a7a972
    • Andrey Filippov's avatar
      CLAUDE: override setCorrIndicesTdData (JNA) -> tp_proc_set_corr_indices_td · ae4bf02f
      Andrey Filippov authored
      Third JNA-mode gap on the CUAS oracle path: TDCorrTile.convertTDtoPD re-uploads
      host-selected TD correlation tiles via GpuQuad.setCorrIndicesTdData, which was
      not overridden -> base JCuda cuMemcpyHtoD on a null gpu_corr_indices -> NPE.
      
      Adds the GpuQuadJna override (ensureRbgCorr() then delegate to the new native
      tp_proc_set_corr_indices_td) + the TpJna binding. Gap-finder over the full CUAS
      TD path (CuasMotion + TDCorrTile) confirms this was the LAST GPU-touching
      un-overridden method; the rest are pure config getters.
      
      Needs the matching tile_processor_gpu commit (native fn) + libtileproc.so
      rebuild. mvn compile clean.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      ae4bf02f
    • Andrey Filippov's avatar
      CLAUDE: fix rectilinear inter-scene corr buffer sizing (JNA) — num_pairs=3 · b6a986ac
      Andrey Filippov authored
      Second JNA-mode failure after the Phase-1 NPE fix: cudaErrorIllegalAddress at
      tp_utils.cu:142 (image upload), actually a DEFERRED fault from the inter-scene
      correlate2D_inter kernel writing out of bounds.
      
      Root cause: GpuQuadJna.ensureRbgCorr sized the native correlation buffers via
      Correlation2d.getNumPairs(num_cams). For the rectilinear single-camera config
      num_cams=1 -> getNumPairs(1)=0 -> tp_proc_setup_rbg_corr allocates zero-size
      gpu_corrs_td / gpu_corrs / gpu_corr_indices, so the inter-scene correlation
      wrote past them -> illegal address, surfacing (sticky) at the next CUDA call.
      
      Fix: mirror the JCuda oracle, whose rectilinear ctor hardcodes num_pairs=3
      (GpuQuad.java:732) for exactly the inter-scene case ->
        int num_pairs = rectilinear ? 3 : Correlation2d.getNumPairs(num_cams);
      
      Java-only; libtileproc.so untouched. mvn compile clean.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      b6a986ac
    • Andrey Filippov's avatar
      CLAUDE: JNA rectilinear single-array config port (Phase 1) · b65ee10d
      Andrey Filippov authored
      Fixes the whole bug-class behind the -Dtp.backend=jna NPE in GpuQuad.setLpfRbg
      (CuasRanging.detectTargets -> CuasMotion -> setRectilinearReferenceTD): the
      rectilinear single-camera GpuQuad was built via the raw JCuda ctor, bypassing
      the backend factory, so in JNA mode it got a null gpuTileProcessor.
      
      - GpuQuad.createRectilinear(): backend-aware factory parallel to create().
        JCUDA branch is byte-for-byte the legacy ctor (oracle path untouched); JNA
        branch builds a clean rectilinear GpuQuadJna. New no-alloc rectilinear ctor
        (num_cams=1, no kernels/geometry).
      - GpuQuadJna: rectilinear ctor + shared initNative(); the two overrides the
        gap-finder predicted -- reAllocateClt (no-op; native CLT pre-sized in setup)
        and singular setBayerImage (-> tp_proc_set_image). execConvertDirect already
        guarded on the rectilinear flag.
      - CuasMotion:452 routed through createRectilinear (CUAS rectilinear now
        JNA-capable).
      - ComboMatch:899 fail-loud UnsupportedOperationException in JNA mode
        (orthomosaic, wider unported surface, off the current path -- stays JCuda).
      
      Java-only; libtileproc.so untouched. mvn compile clean. JCuda legacy frozen as
      oracle; core convert_direct flag-soup cleanup deferred to Phase 2.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      b65ee10d
    • Andrey Filippov's avatar
      CLAUDE: gitignore ANDREY_CONTINUE.md (resume-now file) · 753d6900
      Andrey Filippov authored
      Root-level, Andrey-facing, single predictable "what to do right now" file the
      agent overwrites before session exit, so lost tmux scrollback never costs the
      restart plan. Local-only; gitignored alongside CLAUDE.md/AGENTS.md/MEMORY.md.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      753d6900
    • Andrey Filippov's avatar
    • Andrey Filippov's avatar
      CLAUDE: GpuQuadJna texture overrides (oracle): execTextures + readback · 747ff9d1
      Andrey Filippov authored
      Completes the oracle GPU surface. The reliable gap finder is
        comm -23 <(ImageDtt gpuQuad.* calls) <(GpuQuadJna overrides)
      not the gpuTrace dump (only ~14 methods are instrumented, so e.g.
      getFlatTextures was invisible in the trace though it is on the path).
      
      Overrides (delegating to the new tp_proc_* texture API):
      - execTextures: builds weights[3]/params[5], forwards calc_textures/calc_extra/
        linescan/dust/keep flags. Implements the production (USE_DS_DP) behavior.
      - getTextureIndices: reads kernel-built count + packed indices.
      - getExtra: reshapes diff_rgb_combo (texture_indices order) into
        [num_cams*(num_colors+1)][tilesX*tilesY] keyed by ntile -- identical to base.
      - getFlatTextures: de-pitches gpu_textures -- identical to base.
      
      TpJna.java: bindings for tp_proc_exec_textures/get_texture_indices/
      get_diff_rgb_combo/get_textures.
      
      Edits only -- not mvn-compiled (Eyesis run was live). Signatures match base
      @Override; referenced fields are public final / public static.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      747ff9d1
    • Andrey Filippov's avatar
      CLAUDE: gpuTrace dedup + GpuQuadJna oracle TD-corr readback overrides · 39b0fb90
      Andrey Filippov authored
      gpuTrace now prints each Class.method ONCE (was per-call -> spammy). Oracle JCuda trace showed it uses
      the TD-correlation readback path: getCorrIndices / getCorrTdData / getCorrComboIndices / eraseGpuCorrs
      (un-overridden -> would NPE in JNA). Override them via the new native tp_proc_get_corr_indices /
      get_corr_combo_indices / get_corr_td (DtoH) + tp_proc_erase_corrs. mvn -DskipTests compile clean.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      39b0fb90
    • Andrey Filippov's avatar
      CLAUDE: gpuTrace(-Dtp.trace=1) on uncertain GpuQuad methods — JCuda/JNA oracle comparison · 8b3dd30b
      Andrey Filippov authored
      Add GpuQuad.gpuTrace(m) printing "[GPUTRACE] "+getClass().getSimpleName()+"."+m (off unless
      -Dtp.trace=1). Instrument the un-overridden GPU methods (potential oracle gaps): getCltData,
      presentCltData, eraseGpuCorrs, execCorr2D (bundled), readbackTasks, setFullFrameImages, getCorrTdData,
      getCorrIndices, getCorrComboIndices, getExtra, getTextureIndices, getRBGA, execRBGA, execTextures.
      Since GpuQuadJna extends GpuQuad, the trace prints "GpuQuad.X" under JCuda and "GpuQuadJna.X" if a JNA
      run falls through to one (= coverage gap) -> reveals oracle's real GPU usage before any NPE.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      8b3dd30b
  6. 25 Jun, 2026 17 commits