Source code for tfga.cayley
"""Operations for constructing the cayley 3-tensor needed
for the geometric product. Used internally.
"""
from itertools import combinations
import numpy as np
from tfga.blades import get_normal_ordered
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
def _reduce_bases(a, b, metric):
if a == "":
return 1, b
elif b == "":
return 1, a
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, "".join(combined)
[docs]def blades_from_bases(vector_bases):
all_combinations = [""]
degrees = [0]
for i in range(1, len(vector_bases) + 1):
combs = combinations(vector_bases, i)
combs = ["".join(c) for c in combs]
all_combinations += combs
degrees += [i] * len(combs)
return all_combinations, degrees
[docs]def get_cayley_tensor(metric, bases, blades):
num_blades = len(blades)
t_geom = np.zeros((num_blades, num_blades, num_blades), dtype=np.int32)
t_inner = np.zeros((num_blades, num_blades, num_blades), dtype=np.int32)
t_outer = np.zeros((num_blades, num_blades, num_blades), dtype=np.int32)
metric_dict = {v: metric[i] for i, v in enumerate(bases)}
for a in blades:
for b in blades:
sign, result = _reduce_bases(a, b, metric_dict)
a_index = blades.index(a)
b_index = blades.index(b)
out_index = blades.index(result)
t_geom[a_index, b_index, out_index] = sign
# Degree went down -> part of inner
if len(result) == abs(len(a) - len(b)):
t_inner[a_index, b_index, out_index] = sign
# Degree went up -> part of outer
if len(result) == len(a) + len(b):
t_outer[a_index, b_index, out_index] = sign
return t_geom, t_inner, t_outer