Fix Jacobi eigensolver convergence and improve ArrayFire bindings#71
Open
dmjio wants to merge 10 commits into
Open
Fix Jacobi eigensolver convergence and improve ArrayFire bindings#71dmjio wants to merge 10 commits into
dmjio wants to merge 10 commits into
Conversation
dmjio
commented
Jun 12, 2026
Member
- Replace sweep-based iteration with bounded rotation count and scale-invariant convergence detection (tol = 1e-14 * max|A|)
- Return error code 2 on non-convergence instead of silent inaccurate results
- Add input validation in af_eigsh: reject non-square or non-2D inputs
- Fix type signatures: add Fractional constraints to trigonometric functions, correct matcher return types to (Array Word32, Array a)
- Fix constant array creation for b8 and non-fp64 OpenCL devices
- Fix memory leaks in getInfoString and arrayToString (free af_alloc_host strings)
- Fix momentsAll to return variable-length list based on moment bitmask
- Guard createSparseArrayFromDense against all-zero matrices (prevents segfault)
- Add vision test skips for broken OpenCL backend on AF 3.8.2
- Replace sweep-based iteration with bounded rotation count and scale-invariant convergence detection (tol = 1e-14 * max|A|) - Return error code 2 on non-convergence instead of silent inaccurate results - Add input validation in af_eigsh: reject non-square or non-2D inputs - Fix type signatures: add Fractional constraints to trigonometric functions, correct matcher return types to (Array Word32, Array a) - Fix constant array creation for b8 and non-fp64 OpenCL devices - Fix memory leaks in getInfoString and arrayToString (free af_alloc_host strings) - Fix momentsAll to return variable-length list based on moment bitmask - Guard createSparseArrayFromDense against all-zero matrices (prevents segfault) - Add vision test skips for broken OpenCL backend on AF 3.8.2
AF's af_abs promotes through f64 internally, which makes the `abs x * signum x == x` law fail for signed-type minBound (overflow) and for 64-bit integers with |x| > 2^53 (precision loss). The ring structure is fully covered by semiringLaws + ringLaws, so numLaws is skipped for all integral element types. Also re-enables the hspec suite (586 examples, 0 failures, 17 platform- specific pendings) that was previously commented out. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
af_orb crashes the process at the C level on both the OpenCL and CPU backends in AF 3.8.2 on macOS. The previous guard only skipped on OpenCL, so running via the CPU backend (e.g. nix flake build) would kill the test runner before the suite could report results. Introduce skipOrb (unconditional pending) for the two ORB tests and keep skipOnBrokenBackend for FAST/Harris/SUSAN which work correctly on the CPU backend. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
af_abs promotes all integer inputs to f32 internally (complex.cpp uses
implicit(in_type, f32) which returns f32 for every integer dtype), so
any value with |x| > 2^24 gets rounded. For example abs(16777217)
returned 16777216.
Fix: dispatch abs in the Num (Array a) instance on the element dtype:
- signed integers (s16/s32/s64): select (x < 0) (0 - x) x
- unsigned / boolean (u8/u16/u32/u64/b8): identity (already >= 0)
- float / complex (f32/f64/c32/c64): delegate to A.abs as before
Also restrict Arbitrary CBool to {0, 1} — AF's b8 type normalises
non-zero floats to 1 on cast-back, so CBool 2 produced abs(2) = 1.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace `head` with `listToMaybe` + explicit failure message (matching the existing pattern for `meanWeighted`), and `tail` with `drop 1`. Also removes unused Foreign.Marshal/Foreign.Storable imports from Graphics.hs to silence -Wunused-imports. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
af_orb was not fundamentally broken — the crash was caused by passing a 32×32 image to the CPU backend. When min(h,w)/scl_fctr < REF_PAT_SIZE (31), the pyramid-sizing loop exits with max_levels=0, then lvl_best[max_levels-1] = lvl_best[UINT_MAX] writes out of bounds → process abort. Fix: introduce orbImg (128×128 quadrant, well above the 47px minimum for scl_fctr=1.5) and guard with skipOnBrokenBackend instead of the blanket skipOrb, so ORB runs on the CPU backend. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
af_orb returns descriptors shaped [8, n_features] (8 uint32 words per 256-bit descriptor, column-major). dim0 is always 8; dim1 is the feature count. The test was checking d0 which always equals 8, not n. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.