Skip to main content

Pythonic Geometric Algebra Package

Project description

Kingdon

https://img.shields.io/pypi/v/kingdon.svg https://img.shields.io/travis/tbuli/kingdon.svg Documentation Status https://coveralls.io/repos/github/tBuLi/kingdon/badge.svg?branch=master

Pythonic Geometric Algebra Package

Features

Kingdon is a Geometric Algebra (GA) library which combines a Pythonic API with symbolic simplification and just-in-time compilation to achieve high-performance in a single package. It support both symbolic and numerical GA computations. Moreover, kingdon uses ganja.js for visualization in notebooks, making it an extremely well rounded GA package.

In bullet points:

  • Symbolically optimized.

  • Leverage sparseness of input.

  • numba enabled for numerical computations.

  • sympy support for symbolic computations.

  • ganja.js enabled graphics in jupyter notebooks.

  • Automatic broadcasting, such that transformations can be applied to e.g. point-clouds.

Code Example

In order to demonstrate the power of Kingdon, let us first consider the common use-case of the commutator product between a bivector and vector.

In order to create an algebra, use Algebra. When calling Algebra we must provide the signature of the algebra, in this case we shall go for 3DPGA, which is the algebra \(\mathbb{R}_{3,0,1}\). There are a number of ways to make elements of the algebra. It can be convenient to work with the basis blades directly. We can add them to the local namespace by calling locals().update(alg.blades):

>>> from kingdon import Algebra
>>> alg = Algebra(3, 0, 1)
>>> locals().update(alg.blades)
>>> b = 2 * e12
>>> v = 3 * e1
>>> b.cp(v)
(-6) * e2

This example shows that only the e2 coefficient is calculated, despite the fact that there are 6 bivector and 4 vector coefficients in 3DPGA. But by exploiting the sparseness of the input and by performing symbolic optimization, kingdon knows that in this case only e2 can be non-zero.

Symbolic usage

If only a name is provided for a multivector, kingdon will automatically populate all relevant fields with symbols. This allows us to easily perform symbolic computations.

>>> from kingdon import Algebra
>>> alg = Algebra(3, 0, 1)
>>> b = alg.bivector(name='b')
>>> b
(b12) * e12 + (b13) * e13 + (b23) * e23 + (b14) * e14 + (b24) * e24 + (b34) * e34
>>> v = alg.vector(name='v')
>>> v
(v1) * e1 + (v2) * e2 + (v3) * e3 + (v4) * e4
>>> b.cp(v)
(-b12*v1 + b23*v3) * e2 + (b12*v2 + b13*v3) * e1 + (-b13*v1 - b23*v2) * e3 + (-b14*v1 - b24*v2 - b34*v3) * e4

It is also possible to define some coefficients to be symbolic by inputting a string, while others can be numeric:

>>> from kingdon import Algebra, symbols
>>> alg = Algebra(3, 0, 1)
>>> b = alg.bivector(e12='b12', e34=3)
>>> b
(b12) * e12 + (3) * e34
>>> v = alg.vector(e1=1, e3=1)
>>> v
(1) * e1 + (1) * e3
>>> w = b.cp(v)
>>> w
(-b12) * e2 + (-3) * e4

A kingdon MultiVector with symbols is callable. So in order to evaluate w from the previous example, for a specific value of b12, simply call w:

>>> w(b12=10)
(-10) * e2 + (-3) * e4

Overview of Operators

Operators

Operation

Expression

Infix

Inline

Geometric product

$ab$

a*b

a.gp(b)

Inner

$a \cdot b$

a|b

a.ip(b)

Scalar product

$\langle a \cdot b \rangle_0$

a.sp(b)

Left-contraction

$a \rfloor b$

a.lc(b)

Right-contraction

$a \lfloor b$

a.rc(b)

Outer (Exterior)

$a \wedge b$

a ^ b

a.op(b)

Regressive

$a \vee b$

a & b

a.rp(b)

Conjugate b by a

$a b \widetilde{a}$

a >> b

a.sw(b)

Project a onto b

$(a \cdot b) \widetilde{b}$

a @ b

a.proj(b)

Commutator of a and b

$a \times b = \tfrac{1}{2} [a, b]$

a.cp(b)

Anti-commutator of a and b

$\tfrac{1}{2} \{a, b\}$

a.acp(b)

Sum of a and b

\(a + b\)

a + b

a.add(b)

Difference of a and b

\(a - b\)

a - b

a.sub(b)

Reverse of a

\(\\widetilde{a}\)

~a

a.reverse()

Squared norm of a

\(a \\widetilde{a}\)

a.normsq()

Norm of a

\(\\sqrt{a \\widetilde{a}}\)

a.norm()

Normalize a

\(a / \\sqrt{a \\widetilde{a}}\)

a.normalized()

Square root of a

\(\\sqrt{a}\)

a.sqrt()

Credits

This package was inspired by GAmphetamine.js.

History

0.1.0 (2023-08-12)

  • First release on PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kingdon-0.1.0.tar.gz (120.1 kB view hashes)

Uploaded Source

Built Distribution

kingdon-0.1.0-py2.py3-none-any.whl (30.4 kB view hashes)

Uploaded Python 2 Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page