Skip to main content

Clifford algebra library with primitives for robotics, engineering, and science.

Project description

AMSA

PyPI

AMSA is a Clifford algebra library for high-performance numerical computation in robotics, engineering, and science.

Beta on PyPI: uv pip install amsa-ga==0.1.0b0

Table of Contents

  1. What is AMSA?
  2. Package Layout
  3. Quick Start
  4. Documentation
  5. Notebooks
  6. License and Acknowledgments
  7. What Works Today
  8. Development
  9. Current Operations
  10. Notes

What is AMSA?

AMSA (Advanced Multivector Symbolic Architecture Engine) is a Clifford algebra library focused on high-performance numerical computation for robotics, engineering, and science.

Installation

uv pip install amsa-ga==0.1.0b0

Or with visualization extras:

uv pip install amsa-ga[viz]==0.1.0b0

Package Layout

  • src/amsa/specs.py: algebra signatures, blade naming, blade products, presets
  • src/amsa/layouts.py: dense, grade, and sparse layout descriptors
  • src/amsa/storage.py: dense and CSR storage backends plus storage helpers
  • src/amsa/mv.py: storage-backed multivector array type
  • src/amsa/plans.py: cached operator plans
  • src/amsa/reference.py: reference execution of plans
  • src/amsa/ir.py: IR definitions and backend registry
  • src/amsa/backends/: execution backend implementations
  • src/amsa/ops.py: public operator layer
  • src/amsa/algebra.py: user-facing algebra handle and constructors
  • src/amsa/viz/: visualization adapters, neutral primitives, and optional backends

Quick Start

from amsa import Algebra

alg = Algebra.vga2d()
u = alg.vector([1.0, 2.0])
v = alg.vector([3.0, -4.0])

gp = u * v
ip = u | v
op = u ^ v

print(gp.as_dense().values)  # [-5.0, 0.0, 0.0, -10.0]
print(ip.values)             # [-5.0]
print(op.values)             # [-10.0]

Sparse construction keeps support explicit:

from amsa import Algebra

alg = Algebra.vga3d()
mv = alg.multivector({"e1": 1.0, "e12": 2.0, "e123": 3.0})

print(mv.layout.blades)          # (1, 3, 7)
print(mv.grade(1, 3).values)     # [1.0, 3.0]
print((2.0 - mv).as_dense().values)

Scalar construction:

from amsa import Algebra

alg = Algebra.vga2d()
s = alg.scalar(1.0)

Use alg.scalar(1.0), not alg.multivector(1.0).

Execution Backends

AMSA supports pluggable execution backends for coefficient computation. Backends are selected by device type:

import amsa

# CPU execution (NumPy) - default
amsa.init(use="cpu")

# GPU execution (JAX) - requires amsa-ga[jax] extra
# amsa.init(use="gpu")

# Check current device
print(amsa.get_device())  # "cpu"

JAX Installation:

For CPU execution:

uv pip install amsa-ga[jax]

For GPU execution (CUDA), install JAX with CUDA support:

uv pip install "jax[cuda13]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html

Then select GPU execution:

import amsa
amsa.init(use="gpu")

See the documentation for details on execution backends.

Documentation

Full documentation is in docs/

uv run sphinx-build docs docs/_build

You can also browse the source directly:

  • docs/quickstart.rst — installation and first steps
  • docs/algebra.rstAlgebraSpec, presets, and blade products
  • docs/layouts.rstMVLayout and sparse support
  • docs/storage.rst — dense and CSR backends
  • docs/backends.rst — execution backend selection (CPU/GPU)
  • docs/operators.rst — product semantics, duality, and normalization
  • docs/viz.rst — visualization adapters, primitives, and optional matplotlib/VisPy backends
  • docs/examples.rst — index of runnable example scripts
  • docs/probes.rst — visual debugger probe (amsa_lab)

Notebooks

Introductory notebooks are in notebooks/:

  • 01_vga_rotors.ipynb — VGA vector products, rotors, and sandwich conjugation
  • 02_pga_rigid_body.ipynb — PGA2d lines, meet/join, motors, and bulk/weight splits

License and Acknowledgements

The AMSA source code is licensed under Apache 2.0.

AMSA's development has been made possible and was inspired by the following open-source projects:

  • Kingdon
  • Look-Ma-No-Matrices
  • Ganja.js

What Works Today

  • geometric product
  • outer product
  • inner product
  • scalar product
  • commutator
  • anticommutator
  • left contraction
  • right contraction
  • regressive product
  • sandwich / conjugation
  • exponential / logarithm support (for robotics-friendly motor slices)
  • bulk dual and weight dual on degenerate/projective algebras
  • addition and subtraction
  • inverse and division for the current reverse-scalar-norm cases
  • reverse-based norm_squared, norm, and normalize
  • bulk/weight norms plus bulk_normalize, unitize, and rigid_body_normalize (for PGA-style work)
  • reverse, involute, conjugate, dual, undual, poincare_dual, and poincare_undual
  • scalar arithmetic
  • grade projection and component lookup
  • lazy basis-product tables and on-demand Cayley tables via AlgebraSpec
  • dense/CSR conversion
  • dense and CSR-backed input execution in the reference backend
  • neutral visualization primitives, point adapters, and backend modules in amsa.viz

Development

For local development after cloning the repository:

uv sync --extra dev --extra viz
uv run pytest -q
uv run ruff check .
uv run mypy

Build the documentation:

uv run sphinx-build docs docs/_build

Current Operations

Category Available now
Binary arithmetic add, sub, mv + other, mv - other
Scalar arithmetic scalar * mv, mv * scalar, mv / scalar, multivector-scalar add/sub
Geometric products geometric product *, outer product ^, inner product |, scalar_product, commutator_product, anticommutator_product, left_contraction, right_contraction, regressive_product, sandwich, bulk_dual, weight_dual
Unary operations neg, reverse, involute, conjugate, dual, undual, poincare_dual, poincare_undual, inverse, exp, motor_exp, motor_log, norm_squared, norm, normalize, bulk_norm_squared, bulk_norm, weight_norm_squared, weight_norm, bulk_normalize, unitize, rigid_body_normalize, unary -mv
Projection / inspection grade(...), project_grades(...), component(...), as_dense(), to_layout(...)
Storage operations dense/CSR construction, with_storage(...), to_dense_storage(...), to_csr_storage(...)
Constructors scalar, blade, multivector, vector, bivector, trivector, even, odd, pseudoscalar, zeros
Presets vga, vga2d, vga3d, pga2d, pga3d, Algebra.from_name(...)

Notes

dual() / undual() currently use the metric pseudoscalar transform, while poincare_dual() / poincare_undual() use the metric-free basis complement. That makes the Poincare pair available on degenerate algebras such as the PGA presets.

inverse() is currently a restricted reverse-based inverse: it succeeds when reverse(mv) * mv and mv * reverse(mv) both collapse to the same nonzero scalar, and raises otherwise.

norm_squared() returns the signed reverse norm scalar <mv * reverse(mv)>_0. norm() takes sqrt(abs(norm_squared)) so it stays real on indefinite signatures, and normalize() divides by that magnitude.

commutator_product(a, b) and anticommutator_product(a, b) expose the Lie/Jordan splits of the geometric product:

  • 0.5 * (a * b - b * a)
  • 0.5 * (a * b + b * a)

exp() is currently defined for simple elements whose square collapses to a scalar. That covers the common circular, hyperbolic, and nilpotent generator cases used for rotors, boosts, and translators.

For robotics-oriented PGA3d work, AMSA also supports motor_exp() for pure bivector twist generators, and exp() now dispatches to that same closed form when given a PGA3d bivector whose square is scalar + pseudoscalar valued.

motor_log() is the inverse-side companion for the currently supported robotics cases. Today it supports:

  • PGA2d motor-like even multivectors after rigid-body normalization
  • PGA3d unit-motor style multivectors with scalar, bivector, and optional pseudoscalar terms

For the current PGA presets, AMSA also exposes explicit bulk/weight helpers:

  • bulk() and weight() split components by whether they carry the null basis factor
  • bulk_dual() / weight_dual() apply Poincare complement duality to those parts
  • bulk_norm* and weight_norm* keep the two normalization notions separate
  • bulk_normalize() and unitize() are explicit PGA-facing normalization paths
  • rigid_body_normalize() is a motor-oriented PGA helper that currently bulk-normalizes even grade-0/2 multivectors without pretending to be a universal projective normalization

Visualization note:

  • amsa.vizprovides neutral primitives, point adapters for PGA points, and optional matplotlib/VisPy backends

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

amsa_ga-0.2.0.tar.gz (219.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

amsa_ga-0.2.0-py3-none-any.whl (57.5 kB view details)

Uploaded Python 3

File details

Details for the file amsa_ga-0.2.0.tar.gz.

File metadata

  • Download URL: amsa_ga-0.2.0.tar.gz
  • Upload date:
  • Size: 219.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for amsa_ga-0.2.0.tar.gz
Algorithm Hash digest
SHA256 bac88a27eee46bb56823b77fd6bbca10160b928cbd36ddfcfd12168c05fa7972
MD5 2c3b672c316e7a07e68cab83a319e243
BLAKE2b-256 3196e03e447675376cf0b8a1bc096f432143d8fb77689a5f870f116245bb3484

See more details on using hashes here.

File details

Details for the file amsa_ga-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: amsa_ga-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 57.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for amsa_ga-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9b03a4a8123b2529fc190e1834a9ce5063d290ed97b93bcc59420bec4e850bc7
MD5 88243b71ef61fea8178408b00572ef53
BLAKE2b-256 8be6d9d37ebe79ef1cc7f6291f9d5efa0c3a1ce32b365b1b401e79e1d2c6bb07

See more details on using hashes here.

Supported by

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