@@ -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