Skip to content

Commit 786af26

Browse files
eric-wieserutensil
authored andcommitted
Merge duplicate grade selection code (#135)
Merges the duplicate grade lookup rules between `dot_product_basis_blades` and `non_orthogonal_dot_product_basis_blades`. This also fixes some return values to be zero instead of 0, not that that matters too much.
1 parent e1f77bd commit 786af26

File tree

1 file changed

+29
-33
lines changed

1 file changed

+29
-33
lines changed

galgebra/ga.py

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,26 +1066,38 @@ def wedge_product_basis_blades(self, blade12): # blade12 = blade1*blade2
10661066

10671067
#****** Dot (|) product, reft (<) and right (>) contractions ******#
10681068

1069+
def _dot_product_grade(self, grade1, grade2, mode):
1070+
"""
1071+
Get the grade to select from the geometric product, for a given
1072+
dot product
1073+
"""
1074+
if mode == '|':
1075+
return abs(grade1 - grade2)
1076+
elif mode == '<':
1077+
grade = grade2 - grade1
1078+
if grade < 0:
1079+
return None
1080+
return grade
1081+
elif mode == '>':
1082+
grade = grade1 - grade2
1083+
if grade < 0:
1084+
return None
1085+
return grade
1086+
else:
1087+
raise ValueError('mode={!r} not allowed'.format(mode))
1088+
10691089
def dot_product_basis_blades(self, blade12, mode):
10701090
# dot (|), left (<), and right (>) products
10711091
# dot product for orthogonal basis
10721092
(blade1, blade2) = blade12
10731093
index1 = self.blades_to_indexes_dict[blade1]
10741094
index2 = self.blades_to_indexes_dict[blade2]
10751095
index = list(index1 + index2)
1076-
grade1 = len(index1)
1077-
grade2 = len(index2)
10781096

1079-
if mode == '|':
1080-
grade = abs(grade1 - grade2)
1081-
elif mode == '<':
1082-
grade = grade2 - grade1
1083-
if grade < 0:
1084-
return 0
1085-
elif mode == '>':
1086-
grade = grade1 - grade2
1087-
if grade < 0:
1088-
return 0
1097+
grade = self._dot_product_grade(len(index1), len(index2), mode=mode)
1098+
if grade is None:
1099+
return zero
1100+
10891101
n = len(index)
10901102
sgn = 1
10911103
result = 1
@@ -1138,27 +1150,11 @@ def non_orthogonal_dot_product_basis_blades(self, blade12, mode): # blade12 = (
11381150
# grades of input blades
11391151
grade1 = self.blades_to_grades_dict[blade1]
11401152
grade2 = self.blades_to_grades_dict[blade2]
1141-
if mode == '|':
1142-
grade_dot = abs(grade2 - grade1)
1143-
if grade_dot in grade_dict:
1144-
return grade_dict[grade_dot]
1145-
else:
1146-
return zero
1147-
elif mode == '<':
1148-
grade_contract = grade2 - grade1
1149-
if grade_contract in grade_dict:
1150-
return grade_dict[grade_contract]
1151-
else:
1152-
return zero
1153-
elif mode == '>':
1154-
grade_contract = grade1 - grade2
1155-
if grade_contract in grade_dict:
1156-
return grade_dict[grade_contract]
1157-
else:
1158-
return zero
1159-
else:
1160-
raise ValueError('"' + str(mode) + '" not allowed '
1161-
'dot mode in non_orthogonal_dot_basis')
1153+
1154+
grade = self._dot_product_grade(grade1, grade2, mode=mode)
1155+
if grade is None:
1156+
return zero
1157+
return grade_dict.get(grade, zero)
11621158

11631159
############# Non-Orthogonal Tables and Dictionaries ###############
11641160

0 commit comments

Comments
 (0)