Source code for jaxga.jaxga
from functools import cache
from .signatures import positive_signature
[docs]def blade_name(blade_indices):
return "e_{%s}" % ", ".join(str(ind) for ind in blade_indices)
[docs]def mv_repr(indices, values):
return "Multivector(%s)" % " + ".join(
"%s %s" % (val, blade_name(ind))
for (ind, val) in zip(indices, values)
)
def _normal_swap(x):
for i in range(len(x) - 1):
a, b = x[i], x[i + 1]
if a > b:
x[i], x[i+1] = b, a
return False, x
return True, x
[docs]def get_normal_ordered(blade_name):
blade_name = list(blade_name)
sign = -1
done = False
while not done:
sign *= -1
done, blade_name = _normal_swap(blade_name)
return sign, tuple(blade_name)
def _collapse_same(x):
for i in range(len(x) - 1):
a, b = x[i], x[i + 1]
if a == b:
return False, x[:i] + x[i+2:], a
return True, x, None
[docs]@cache
def reduce_bases(a, b, metric):
combined = list(a + b)
# Bring into normal order:
sign, combined = get_normal_ordered(combined)
done = False
while not done:
done, combined, combined_elem = _collapse_same(combined)
if not done:
sign *= metric(combined_elem)
return sign, tuple(combined)
[docs]def is_scalar_index(b):
return b == ()
[docs]def pseudoscalar_index(dims):
return tuple(range(dims))
[docs]def dual_blade_index(blade_index, dims):
pss = pseudoscalar_index(dims)
blade_index_reverse = tuple(reversed(blade_index))
return reduce_bases(blade_index_reverse, pss, positive_signature)
[docs]def reverse_indices(blade_indices):
return tuple(tuple(reversed(blade_index)) for blade_index in blade_indices)