SymbolicGA.jl

Geometric algebra transformations at compile-time
Author serenity4
Popularity
9 Stars
Updated Last
1 Year Ago
Started In
November 2022

SymbolicGA

tests codecov docs-stable docs-dev ColPrac: Contributor's Guide on Collaborative Practices for Community Packages repo-status

Geometric Algebra (GA) library with compile-time transformations into linear algebra operations.

This package is ready for general use, but it still in active development and bugs may be frequently encountered along with incomplete or unsupported major features. You are welcome to report potential issues or to suggest improvements. When upgrading to a new major version, make sure to consult the changelog to be aware of any major breakages.

Basic usage

using SymbolicGA

# Compute the determinant of a 4x4 matrix.
# Let A₁, A₂, A₃ and A₄ be the matrix columns.
A₁, A₂, A₃, A₄ = ntuple(_ -> rand(4), 4)
# The determinant is the four-dimensional "volume" of the subspace spanned by all four column vectors.
# This is trivially generalized to `n`-by-`n` matrices by using a signature of `n` and wedging all `n` column vectors.
Δ = @ga 4 A₁::Vector ∧ A₂::Vector ∧ A₃::Vector ∧ A₄::Vector
# We got an antiscalar out as a `KVector{4}`.
# Extract the component with `[]`.
Δ[]

For advanced usage, tutorials and references, please consult the official documentation.

Performance

This library applies rules of geometric algebra at compile-time to generate performant code for runtime execution. The resulting instructions are scalar operations, which should be fast and comparable to hand-written optimized numerical code:

using StaticArrays: @SVector, SMatrix
using LinearAlgebra: det
using BenchmarkTools: @btime
mydet(A₁, A₂, A₃, A₄) = @ga(4, A₁::Vector ∧ A₂::Vector ∧ A₃::Vector ∧ A₄::Vector)[]
A₁ = @SVector rand(4)
A₂ = @SVector rand(4)
A₃ = @SVector rand(4)
A₄ = @SVector rand(4)
A = SMatrix([A₁ A₂ A₃ A₄])
@assert mydet(A₁, A₂, A₃, A₄)  det(A)
@btime det($A)
@btime mydet($A₁, $A₂, $A₃, $A₄)
4.845 ns (0 allocations: 0 bytes) # LinearAlgebra
13.485 ns (0 allocations: 0 bytes) # SymbolicGA

It should be noted that in theory any performance gap can be addressed, as we have total control over what code is emitted.

Used By Packages

No packages found.