Skip to content

Releases: JuliaMeshless/RadialBasisFunctions.jl

v0.4.1

16 Mar 23:41

Choose a tag to compare

RadialBasisFunctions v0.4.1

Diff since v0.4.0

Bug Fixes

  • Fixed missing compat entry for RadialBasisFunctions 0.4 in docs/Project.toml, which caused docs CI to fail

v0.4.0

16 Mar 22:35

Choose a tag to compare

RadialBasisFunctions v0.4.0

Diff since v0.3.0

Breaking changes

  • The operator type hierarchy now uses AbstractOperator{N} where N indicates the rank of the operator output. This replaces the previous flat hierarchy.
  • Custom operator now requires an explicit rank parameter: Custom{N}. Use Custom{0} for rank-preserving operators and Custom{1} for rank-increasing operators.

Features

  • Added RBFLayer as a LuxCore package extension for integrating RBF interpolation into Lux.jl neural networks

Bug Fixes

  • Reject ε=0 in Gaussian and IMQ constructors with a clear error
  • Fixed Lux guide and examples to use DifferentiationInterface with Mooncake backend for Julia 1.12 compatibility

Refactoring

  • Replaced OperatorArity trait with direct Tuple dispatch for cleaner operator weight handling
  • Constrained operator method signatures to AbstractOperator for type safety

Documentation

  • Added docstring for AbstractOperator{N}
  • Updated references after operator type hierarchy refactor
  • Added Julia best practices section to CLAUDE.md

CI & Maintenance

  • Fixed downgrade CI failures across Julia 1.10–1.12
  • Updated dependency compat bounds for docs and benchmarks

Merged pull requests:

  • chore(deps): bump actions/upload-artifact from 6 to 7 (#98) (@dependabot[bot])
  • chore(deps): bump the all-julia-packages group across 1 directory with 9 updates (#108) (@dependabot[bot])
  • feat: RBFLayer for Lux.jl, fix Gaussian/IMQ ε validation (#109) (@kylebeggs)

Closed issues:

  • Radial basis function networks? (#45)
  • fix dev documentation build (#67)

v0.3.0

20 Feb 22:27

Choose a tag to compare

RadialBasisFunctions v0.3.0

Diff since v0.2.7

Breaking Changes

  • Gradient type removedgradient(...) is now a convenience alias for jacobian(...). Code that used Gradient as a type directly will break.
  • Basis operator closures replaced with functor structs, , ∂², ∇², D, are now callable structs instead of closure-returning functions. The public API (∂(basis, dim), etc.) is unchanged, but code dispatching on closure types will need updating.
  • RadialBasisOperator gained a device type parameter — struct now has 7 type parameters (was 6). Code pattern-matching on the full parametric type may need updating.

New Features

Automatic Differentiation Support (Enzyme.jl & Mooncake.jl)

  • Native reverse-mode AD via package extensions (auto-activated when Enzyme or Mooncake is loaded)
  • Enzyme extensionEnzymeRules (augmented_primal + reverse) for operator application, _build_weights, and basis evaluation
  • Mooncake extensionrrule!! with @is_primitive for operator application, _build_weights, Interpolator construction, and basis evaluation
  • Shared backward pass (src/solve/backward.jl) using the implicit function theorem to differentiate through the stencil linear solve
  • Differentiable w.r.t. data point locations and basis shape parameter ε
  • Analytic second derivatives for all PHS orders, Gaussian, and IMQ (needed for chain rule through RHS assembly)
  • Shape parameter derivatives (∂φ/∂ε, ∂∇²φ/∂ε, ∂∂φ/∂ε) for Gaussian and IMQ bases
  • BLAS-optimized backward pass using mul! rank-1 updates
  • Compatible with DifferentiationInterface.jl for a unified AD interface

Jacobian Operator

  • New Jacobian operator replaces the old Gradient type
  • Generalizes beyond scalar fields: scalar input → (N_eval × D) gradient; vector input → (N_eval × D × D) Jacobian; higher-rank tensor support
  • gradient(...) is preserved as a convenience alias

Hessian Basis Functor

  • New H (Hessian) functor for all basis types (PHS 1/3/5/7, Gaussian, IMQ)
  • Returns SMatrix{N,N,T} for second-derivative matrix of basis functions
  • Used internally by Hermite dispatch for optimized second-derivative computation

GPU Improvements

  • device keyword on all operator constructors — auto-detects backend via KernelAbstractions.get_backend(data) or explicit override (e.g., device=CUDABackend())
  • Adapt.jl support — Adapt.adapt_structure for RadialBasisOperator and Interpolator, enabling adapt(CUDABackend(), op)
  • GPU array types preserved in operator algebra (+/-)
  • VectorValuedOperator evaluation uses mul! with views to eliminate temporaries
  • Interpolator batch evaluation accepts AbstractVector{<:AbstractVector} (not just Vector)
  • show methods use eltype() instead of typeof(first()) for GPU compatibility

Unified Keyword-Based Constructor API

  • Primary RadialBasisOperator constructor rewritten with keyword arguments:
    RadialBasisOperator(ℒ, data;
        eval_points=data, basis=PHS(3; poly_deg=2),
        k=autoselect_k(data, basis), adjl=...,
        hermite=nothing, device=get_backend(data))
  • hermite keyword accepts a NamedTuple (is_boundary=..., bc=..., normals=...) replacing old positional arguments
  • All operator constructors (laplacian, partial, gradient, jacobian, directional, custom, regrid) forward kw... to unified constructor

Refactoring

Basis Functions: Closures to Functors

  • All differential operator factories replaced with typed callable structs (∂{B}, ∇{B}, ∂²{B}, ∇²{B}, D{B,V}, D²{B,V1,V2}, H{B})
  • Enables multiple dispatch in AD rules and across the codebase
  • PHS normal dispatch refactored to use 3-argument call instead of Union{AbstractVector,Nothing}

Solve System Reorganization

  • stencil_math.jlassembly.jl (pure math: collocation matrix, RHS, stencil assembly)
  • kernel_exec.jlexecution.jl (memory allocation, kernel launching, batch processing)
  • New BasisOperators struct packages basis + gradient + Hessian functors, computed once per stencil
  • 6 new files for AD support (ad_shared.jl, backward.jl, backward_cache.jl, forward_cache.jl, operator_second_derivatives.jl, shape_parameter_derivatives.jl)

Performance

  • Pre-allocated λ buffer reused across stencils in solve loop (fewer allocations)
  • view(data, neighbors) instead of [data[i] for i in neighbors] per stencil
  • dot() instead of intermediate allocations in polynomial evaluation
  • mul! with views in VectorValuedOperator evaluation (zero-allocation GPU-friendly)

Testing

  • Comprehensive AD test suite (test/extensions/autodiff_di.jl) testing Laplacian, Gradient, Partial, Interpolator (construction + evaluation), basis functions, shape parameter differentiation, and 3D operators against finite differences
  • All rand/randn calls seeded with MersenneTwister for deterministic CI
  • New test files for Jacobian operator, device keyword, and individual extension tests
  • Enzyme tests skipped on Julia 1.12+ (VERSION < v"1.12")

Documentation

  • Switched to DocumenterVitepress.jl frontend
  • New autodiff guide (docs/src/guides/autodiff.md) with runnable examples using DI.AutoMooncake
  • New quick reference page (docs/src/guides/quickref.md)
  • Restructured navigation with Guides and Reference sections
  • Refreshed landing page and README

Infrastructure

  • Formatter switched from JuliaFormatter.jl to Runic.jl
  • New dependencies: Adapt.jl, StaticArrays.jl (direct); Enzyme.jl, EnzymeCore.jl, Mooncake.jl (weak deps)
  • CI action bumps (checkout v6, upload-artifact v6, etc.)
  • ChainRulesCore dependency removed

Merged pull requests:

Closed issues:

  • improve the code for boundary conditions (#47)
  • improve handling of polynomial terms (#48)
  • Refactor RBF operators to use functor pattern for proper multiple dispatch (#62)
  • Removal of repeated code in src/operators (#63)
  • EnzymeRules? (#71)
  • perf: optimize memory allocations in solve system hot paths (#73)
  • feat(enzyme): add _build_weights support for IMQ and Gaussian basis functions (#74)

v0.2.6

18 Nov 02:01

Choose a tag to compare

RadialBasisFunctions v0.2.6

Diff since v0.2.5

✨ New Features

Hermite Interpolation with Boundary Conditions

Added comprehensive support for Hermite interpolation, enabling derivative boundary conditions alongside
function values for PDE solving:

  • Dirichlet Boundary Conditions: Specify function values at boundaries
  • Neumann Boundary Conditions: Specify derivative values at boundaries
  • Robin Boundary Conditions: Specify linear combinations of function and derivative values
  • Mixed Boundary Conditions: Combine different boundary condition types in the same problem
  • Works seamlessly with all RBF operators (Gradient, Laplacian, Partial, Directional, Custom)

GPU/CPU Parallelization with KernelAbstractions.jl

Migrated to KernelAbstractions.jl for improved parallel execution:

  • Unified GPU and CPU computation backends
  • Improved performance for weight computation
  • Better memory management with stencil weight preallocation

🐛 Bug Fixes

  • Fixed bug in Hermite weight computation (solve_hermite.jl)
  • Fixed polyharmonic spline derivative calculation bug
  • Fixed interpolation weights to correctly include last data point in linear system solve
  • Corrected polyharmonic spline keyword constructors

Merged pull requests:

Closed issues:

  • Add theory/literature links about Hermite to the docs (#55)
  • Add single and multi-thread to CI (#57)

v0.2.5

29 Jan 04:12
7d165cb

Choose a tag to compare

RadialBasisFunctions v0.2.5

Diff since v0.2.4

Merged pull requests:

v0.2.4

17 Dec 01:16
3f12e44

Choose a tag to compare

RadialBasisFunctions v0.2.4

Diff since v0.2.3

Merged pull requests:

v0.2.3

31 Jul 01:32
e8afb69

Choose a tag to compare

RadialBasisFunctions v0.2.3

Diff since v0.2.2

Merged pull requests:

v0.2.2

17 Jul 02:17
5ca0c01

Choose a tag to compare

RadialBasisFunctions v0.2.2

Diff since v0.2.1

Merged pull requests:

v0.2.1

27 Mar 02:27
9f338d4

Choose a tag to compare

RadialBasisFunctions v0.2.1

Diff since v0.2.0

Merged pull requests:

v0.2.0

06 Mar 03:08
e546656

Choose a tag to compare

RadialBasisFunctions v0.2.0

Diff since v0.1.5

Merged pull requests:

  • Add Regrid (#22) (@kylebeggs)
  • Rename RadialBasisInterp to Interpolator