Algebraic: Multi-Backend Semiring Algebra
A Python package providing semiring algebra implementations with support for NumPy, JAX, and PyTorch backends.
Overview
This package provides abstract semiring interfaces and concrete implementations for:
- Tropical semirings (MinPlus, MaxPlus) with smooth variants for differentiability
- Max-Min algebras for robustness semantics
- Boolean algebras with De Morgan and Heyting algebra variants
- Counting semirings
- Custom semirings via the extensible interface
Features
- AlgebraicArray : Arrays with semiring semantics: override
+,*,@to use custom algebras - Multi-Backend : Supports NumPy, JAX, and PyTorch backends with a unified API
- Differentiable Kernels : Smooth approximations of boolean and tropical operations for neural networks
- Rich Semiring Library : Tropical, Boolean, Max-Min, Counting, and custom semirings
- Polynomial Algebras : Sparse and dense multilinear polynomials over semirings
Quick Start
Recommended Import
import algebraic
The top-level algebraic module re-exports all array operations, semiring
specifications, and polynomial types.
Basic Semiring Operations
from algebraic.semirings import tropical_semiring, max_min_algebra, boolean_algebra
# Tropical semiring (MaxPlus: max is addition, + is multiplication)
maxplus = tropical_semiring(minplus=False)
a = maxplus.add(2.0, 3.0) # max(2, 3) = 3
b = maxplus.mul(2.0, 3.0) # 2 + 3 = 5
# Tropical semiring (MinPlus: min is addition, + is multiplication)
minplus = tropical_semiring(minplus=True) # or just tropical_semiring()
c = minplus.add(2.0, 3.0) # min(2, 3) = 2
d = minplus.mul(2.0, 3.0) # 2 + 3 = 5
# Max-Min algebra (for robustness/STL semantics)
maxmin = max_min_algebra()
e = maxmin.add(-0.5, 0.2) # max(-0.5, 0.2) = 0.2
f = maxmin.mul(-0.5, 0.2) # min(-0.5, 0.2) = -0.5
# Boolean algebra
bool_alg = boolean_algebra(mode="logic")
true = bool_alg.one
false = bool_alg.zero
result = bool_alg.add(true, false) # True OR False = True
AlgebraicArray: Arrays with Semiring Semantics
The AlgebraicArray class wraps backend arrays and overrides arithmetic operations to
use semiring semantics.
import algebraic
from algebraic.semirings import tropical_semiring
# Create algebraic arrays with tropical semiring
tropical = tropical_semiring(minplus=True)
a = algebraic.array([1.0, 2.0, 3.0], semiring=tropical, backend="numpy")
b = algebraic.array([4.0, 5.0, 6.0], semiring=tropical, backend="numpy")
# Element-wise operations use semiring semantics
c = a + b # Tropical addition: [min(1,4), min(2,5), min(3,6)] = [1, 2, 3]
d = a * b # Tropical multiplication: [1+4, 2+5, 3+6] = [5, 7, 9]
# Reductions use semiring operations
total = algebraic.sum(a) # min(1, 2, 3) = 1
product = algebraic.prod(a) # 1 + 2 + 3 = 6
# Matrix multiplication with @ operator
A = algebraic.array([[1.0, 2.0], [3.0, 4.0]], semiring=tropical, backend="numpy")
B = algebraic.array([[5.0, 6.0], [7.0, 8.0]], semiring=tropical, backend="numpy")
C = A @ B # Tropical matmul: C[i,j] = min_k(A[i,k] + B[k,j])
# Result: [[6, 7], [8, 9]]
Boolean Algebra for Graph and Logic Operations
import algebraic
from algebraic.semirings import boolean_algebra
# Boolean algebra for reachability
bool_alg = boolean_algebra(mode="logic")
# Adjacency matrix: edge from i to j
adj = algebraic.array([[False, True, False], [False, False, True], [True, False, False]], semiring=bool_alg, backend="numpy")
# Matrix multiplication computes 2-step reachability
reach_2 = adj @ adj
# reach_2[i,j] = True if there's a path of length 2 from i to j
# Transitive closure: adj + adj^2 + adj^3 + ...
reach = adj
for _ in range(3):
reach = reach + (reach @ adj)
# reach[i,j] = True if there's any path from i to j
Smooth Boolean Operations for Learning
import algebraic
from algebraic.semirings import boolean_algebra
# Differentiable boolean operations for neural networks
smooth_bool = boolean_algebra(mode="smooth", temperature=10.0)
soft_bool = boolean_algebra(mode="soft")
# Example: Soft logical operations on continuous values
x = algebraic.array([0.9, 0.8, 0.1], semiring=soft_bool, backend="numpy")
y = algebraic.array([0.7, 0.3, 0.2], semiring=soft_bool, backend="numpy")
# Soft AND: element-wise multiplication
z_and = x * y # [0.63, 0.24, 0.02]
# Soft OR: probabilistic OR formula
z_or = x + y # [0.97, 0.86, 0.28]
JAX-Specific Transformations
AlgebraicArray is registered as a JAX PyTree (via algebraic.utils.jax), so
standard JAX transforms work out of the box:
import jax
import algebraic
import algebraic.utils.jax # registers AlgebraicArray as a JAX PyTree
from algebraic.semirings import tropical_semiring
tropical = tropical_semiring(minplus=True)
@jax.jit
def shortest_paths(dist_matrix):
"""Compute all-pairs shortest paths using tropical matrix multiplication."""
n = dist_matrix.shape[0]
result = dist_matrix
for _ in range(n - 1):
result = result @ dist_matrix
return result
For batching, use algebraic.vmap which delegates to jax.vmap or
torch.vmap depending on the backend:
from algebraic import vmap
batched_fn = vmap(my_fn, backend="jax")
Advanced Features
Functional Index Updates
AlgebraicArray supports functional index updates with semiring operations:
import algebraic
from algebraic.semirings import tropical_semiring
tropical = tropical_semiring(minplus=True)
arr = algebraic.array([1.0, 2.0, 3.0, 4.0], semiring=tropical, backend="numpy")
# Functional updates (returns new array)
new_arr = arr.at[1].set(0.5) # Set index 1 to 0.5
# Add using semiring addition (min for tropical)
updated = arr.at[1].add(1.5) # arr[1] = min(2.0, 1.5) = 1.5
# Multiply using semiring multiplication (+ for tropical)
scaled = arr.at[2].multiply(2.0) # arr[2] = 3.0 + 2.0 = 5.0
Multilinear Polynomials
Work with sparse and dense polynomial representations over semirings:
from algebraic.polynomials import PolyDict, MonomialBasis
from algebraic.semirings import boolean_algebra
bool_alg = boolean_algebra(mode="logic")
# Sparse representation (efficient for few terms)
x0 = PolyDict.variable(0, num_vars=3, algebra=bool_alg, backend="numpy")
x1 = PolyDict.variable(1, num_vars=3, algebra=bool_alg, backend="numpy")
p = x0 * x1 + x1 # Polynomial: (x0 AND x1) OR x1
# Evaluate at a point
result = p.evaluate({0: True, 1: False, 2: True})
# Dense monomial basis (efficient for many terms)
mb0 = MonomialBasis.variable(0, num_vars=2, bool_alg, backend="numpy")
mb1 = MonomialBasis.variable(1, num_vars=2, bool_alg, backend="numpy")
q = mb0 * mb1 # Represented as dense tensor
Core Concepts
Semirings
A semiring :math: (S, \oplus, \otimes, \mathbf{0}, \mathbf{1}) consists of:
- Addition (:math:
\oplus): Combines alternative paths/outcomes - Multiplication (:math:
\otimes): Combines sequential compositions - Additive identity (:math:
\mathbf{0}): Identity for :math:\oplus - Multiplicative identity (:math:
\mathbf{1}): Identity for :math:\otimes
Lattices
Bounded distributive lattices specialize semirings where:
- Join (:math:
\lor) = Addition (:math:\oplus) - Meet (:math:
\land) = Multiplication (:math:\otimes) - Top = Multiplicative identity (:math:
\mathbf{1}) - Bottom = Additive identity (:math:
\mathbf{0})
Available Semirings
| Name | Addition | Multiplication | Use Case |
|---|---|---|---|
| Boolean | Logical OR | Logical AND | Logic, SAT |
| Tropical (MaxPlus) | max | + | Optimization, path problems |
| Tropical (MinPlus) | min | + | Shortest paths, distances |
| Max-Min | max | min | Robustness degrees, STL |
| Counting | + | $\times$ | Counting paths |
Use Cases
Graph Algorithms
- Shortest paths : Use tropical semirings for Floyd-Warshall algorithm
- Reachability : Boolean algebra for transitive closure
- Path counting : Counting semiring for enumeration
Formal Verification
- Temporal logic : Signal Temporal Logic (STL) with max-min algebra
- Automata theory : Weighted automata with tropical semirings
- Model checking : Boolean polynomials for state space exploration
Machine Learning
- Differentiable logic : Soft/smooth boolean operations for neural networks
- Attention mechanisms : Tropical attention for robust aggregation
- Graph neural networks : Semiring-based message passing
Optimization
- Dynamic programming : Tropical semirings for Bellman equations
- Constraint satisfaction : Boolean algebra for SAT solving
- Resource allocation : Max-min algebra for bottleneck optimization
Metadata
Release files for algebraic-arrays 1.3.10
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| algebraic_arrays-1.3.10.tar.gz | 1.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| algebraic_arrays-1.3.10-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.3 MB
Release files / algebraic_arrays-1.3.10.tar.gz
| Download URL | algebraic_arrays-1.3.10.tar.gz |
|---|---|
| Size | 1.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
85be3c3a7098c824d3223afb7bd0d984d4086ce7abc24cd6dc43c1ab1ff2d1c9
|
|
BLAKE2b-256 checksum How to use checksums |
5e595c6b963ed7c2113560ddf77be69522c6282a1b261477e1195e0400dc1a98
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / algebraic_arrays-1.3.10-py3-none-any.whl
| Download URL | algebraic_arrays-1.3.10-py3-none-any.whl |
|---|---|
| Size | 80.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
89293b42b8b896baf7baf3e34620b4dcf8ddbaa25353cdb7fad46670cf46baec
|
|
BLAKE2b-256 checksum How to use checksums |
357de7ff583bf9bd5c415290ee4012f4c94525d7c274a0c713a7dbf146ceca99
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|