Julia interface to GAlgebra, a symbolic Geometric Algebra/Calculus package for SymPy.
Very early. But it already works and has many tests.
GAlgebra.jl itself doesn't depend on SymPy.jl, but is designed to work with it.
After installing SymPy.jl and GAlgebra.jl (see below for instructions), you may experiment with GAlgebra.jl just like in the Python version of GAlgebra (though there're some syntax differences between Python and Julia like
For example, you may start with:
import SymPy: symbols, sympy, Sym using GAlgebra # In console, uncomment to enable colored printing with ANSI escape sequences # galgebra.printer.Eprint() # In Jupyter, uncomment to enable LaTeX printing with MathJax # galgebra.printer.Format() (x, y, z) = xyz = symbols("x,y,z",real=true) o3d = galgebra.ga.Ga("e", g=[1, 1, 1], coords=xyz) u = o3d.mv("u", "vector") v = o3d.mv("v", "vector") A = o3d.mv("A", "mv") R = o3d.mv("R", "spinor") # Volume element I = o3d.I() # Wedge product: ∧ \wedge v ∧ A # Hestenes' inner product: ⋅ \cdot v ⋅ A # Left contraction: ⨼ \intprod v ⨼ A # Right contraction: ⨽ \intprodr v ⨽ A # Scalar product: ⊛ \circledast # A ⊛ B = <A B†> v ⊛ A # Commutator product: ⊠ \boxtimes # A⊠B = (AB-BA)/2 v ⊠ A # Anti-commutator product: ⊙ \odot # A⊙B = (AB+BA)/2 v ⊙ A # Norm: norm(A) = A.norm() := ||A|| norm(v) # Inverse: postfix ⁻¹ \^-\^1 # (A)⁻¹ = A^-1 = inv(A) = A.inv() (R)⁻¹ R^-1 inv(R) # Reversion: ~A = rev(A) = A.rev() # A^† is usually used in literature ~A rev(A) # Dual: postfix ' # orthogonal complement, Λ^p -> Λ^(n-p) # note: Ga.dual_mode_value is default to "I+", so A' = A * I # change Ga.dual_mode_value to get a different definition A' dual(A) # Grade involution: postfix ˣ \^x # (A)ˣ = A[:*] = involute(A) := A+ - A- = A.even() - A.odd() # A^* is usually used in literature (A)ˣ involute(A) # Clifford conjugate: postfix ǂ \doublepipe # (A)ǂ = conj(A) := ((A)^*)^† (A)ǂ conj(A) # Projection: proj(B, A) = A.project_in_blade(B) proj(u, v) # Reflection: refl(B, A) = A.reflect_in_blade(B) refl(u, v) # Rotation: rot(itheta, A) = A.rotate_multivector(itheta) # rotate the multivector A by the 2-blade itheta rot(u ∧ v, A) # Natural base exponential of x: e^x exp(u ∧ v) # Grade-i part: A[i] = A.grade(i) := <A>_i A # Scalar (grade-0) part: scalar(A) = A.scalar() := <A> = <A>_0 # note: it returns a SymPy expression unlike A which returns a Mv object scalar(A) # Even-grade part: A[:+] = (A)₊ = even(A) = A.even() := A+ A[:+] even(A) # Odd-grade part: A[:-] = (A)₋ = odd(A) = A.odd() := A- A[:-] odd(A)
Note: enter unicode symbols like
∧ with corresponding LaTeX commands like
\wedge by Tab completion which are provided in the comments.
So far only
galgebra.mv.Mv have been verified to work in Julia, see tests. The tests verified many identities in Linear Algebra and Geometric Algebra.
See examples of GAlgebra for more examples in Python. With some small changes, they can be ported to Julia.
The package can be installed with the Julia package manager. From the Julia REPL, type
] to enter the Pkg REPL mode (you'll see a prompt like
(v1.1) pkg>) and run:
The installation process will take a while, because it will install PyCall.jl and its dependencies and it will also use
pip to install GAlgebra if you haven't. If you wish to use a version other than the latest released version of GAlgebra that will be installed by deps/build.jl, you can install that via pip before/after the installation of
pip install -e <your local path to GAlgebra> or
pip install https://github.com/pygae/galgebra/archive/master.zip.
Now you may run GAlgebra.jl tests in Julia Pkg REPL mode:
At the first time it will take a while, because SymPy.jl is specified as a test dependency so it'll be installed.
Then you'll see something like:
Testing GAlgebra Resolving package versions... Test Summary: | Pass Broken Total GAlgebra.jl | 1289 1 1290 Testing GAlgebra tests passed
Hint: To get back to the Julia REPL please press backspace, see Pkg doc to learn more.