33 from PyClical cimport *
35 __version__ = str(glucat_package_version,
'utf-8')
40 cdef inline IndexSet toIndexSet(obj):
42 Return the C++ IndexSet instance wrapped by index_set(obj). 48 Python class index_set wraps C++ class IndexSet. 50 cdef IndexSet *instance
52 cdef inline wrap(index_set self, IndexSet other):
54 Wrap an instance of the C++ class IndexSet. 59 cdef inline IndexSet unwrap(index_set self):
61 Return the wrapped C++ IndexSet instance. 65 cpdef copy(index_set self):
67 Copy this index_set object. 69 >>> s=index_set(1); t=s.copy(); print(t) 76 Construct an object of type index_set. 78 >>> print(index_set(1)) 80 >>> print(index_set({1,2})) 82 >>> print(index_set(index_set({1,2}))) 84 >>> print(index_set({1,2})) 86 >>> print(index_set({1,2,1})) 88 >>> print(index_set("{1,2,1}")) 90 >>> print(index_set("")) 93 error_msg_prefix =
"Cannot initialize index_set object from" 94 if isinstance(other, index_set):
95 self.
instance = new IndexSet((<index_set>other).unwrap())
96 elif isinstance(other, numbers.Integral):
97 self.
instance = new IndexSet(<int>other)
98 elif isinstance(other, (set, frozenset)):
104 raise IndexError(error_msg_prefix +
" invalid " + repr(other) +
".")
105 except (RuntimeError, TypeError):
106 raise ValueError(error_msg_prefix +
" invalid " + repr(other) +
".")
107 elif isinstance(other, str):
109 bother = other.encode(
"UTF-8")
110 self.
instance = new IndexSet(<char *>bother)
112 raise ValueError(error_msg_prefix +
" invalid string " + repr(other) +
".")
114 raise TypeError(error_msg_prefix +
" " + str(type(other)) +
".")
118 Clean up by deallocating the instance of C++ class IndexSet. 124 Compare two objects of class index_set. 126 >>> index_set(1) == index_set({1}) 128 >>> index_set({1}) != index_set({1}) 130 >>> index_set({1}) != index_set({2}) 132 >>> index_set({1}) == index_set({2}) 134 >>> index_set({1}) < index_set({2}) 136 >>> index_set({1}) <= index_set({2}) 138 >>> index_set({1}) > index_set({2}) 140 >>> index_set({1}) >= index_set({2}) 143 if (lhs
is None)
or (rhs
is None):
144 eq = bool(lhs
is rhs)
159 return NotImplemented
161 eq = bool( toIndexSet(lhs) == toIndexSet(rhs) )
167 lt = bool( toIndexSet(lhs) < toIndexSet(rhs) )
173 return not (lt
or eq)
177 return NotImplemented
181 Set the value of an index_set object at index idx to value val. 183 >>> s=index_set({1}); s[2] = True; print(s) 185 >>> s=index_set({1,2}); s[1] = False; print(s) 193 Get the value of an index_set object at an index. 195 >>> index_set({1})[1] 197 >>> index_set({1})[2] 199 >>> index_set({2})[-1] 201 >>> index_set({2})[1] 203 >>> index_set({2})[2] 205 >>> index_set({2})[33] 212 Check that an index_set object contains the index idx: idx in self. 214 >>> 1 in index_set({1}) 216 >>> 2 in index_set({1}) 218 >>> -1 in index_set({2}) 220 >>> 1 in index_set({2}) 222 >>> 2 in index_set({2}) 224 >>> 33 in index_set({2}) 231 Iterate over the indices of an index_set. 233 >>> for i in index_set({-3,4,7}):print(i, end=",") 236 for idx
in range(self.
min(), self.
max()+1):
244 >>> print(~index_set({-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16})) 245 {-32,-31,-30,-29,-28,-27,-26,-25,-24,-23,-22,-21,-20,-19,-18,-17,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32} 251 Symmetric set difference: exclusive or. 253 >>> print(index_set({1}) ^ index_set({2})) 255 >>> print(index_set({1,2}) ^ index_set({2})) 258 return index_set().wrap( toIndexSet(lhs) ^ toIndexSet(rhs) )
262 Symmetric set difference: exclusive or. 264 >>> x = index_set({1}); x ^= index_set({2}); print(x) 266 >>> x = index_set({1,2}); x ^= index_set({2}); print(x) 269 return self.wrap( self.unwrap() ^ toIndexSet(rhs) )
273 Set intersection: and. 275 >>> print(index_set({1}) & index_set({2})) 277 >>> print(index_set({1,2}) & index_set({2})) 280 return index_set().wrap( toIndexSet(lhs) & toIndexSet(rhs) )
284 Set intersection: and. 286 >>> x = index_set({1}); x &= index_set({2}); print(x) 288 >>> x = index_set({1,2}); x &= index_set({2}); print(x) 291 return self.wrap( self.unwrap() & toIndexSet(rhs) )
297 >>> print(index_set({1}) | index_set({2})) 299 >>> print(index_set({1,2}) | index_set({2})) 302 return index_set().wrap( toIndexSet(lhs) | toIndexSet(rhs) )
308 >>> x = index_set({1}); x |= index_set({2}); print(x) 310 >>> x = index_set({1,2}); x |= index_set({2}); print(x) 313 return self.wrap( self.unwrap() | toIndexSet(rhs) )
317 Cardinality: Number of indices included in set. 319 >>> index_set({-1,1,2}).count() 326 Number of negative indices included in set. 328 >>> index_set({-1,1,2}).count_neg() 335 Number of positive indices included in set. 337 >>> index_set({-1,1,2}).count_pos() 346 >>> index_set({-1,1,2}).min() 355 >>> index_set({-1,1,2}).max() 368 Sign of geometric product of two Clifford basis elements. 370 >>> s = index_set({1,2}); t=index_set({-1}); s.sign_of_mult(t) 377 Sign of geometric square of a Clifford basis element. 379 >>> s = index_set({1,2}); s.sign_of_square() 386 The “official” string representation of self. 388 >>> index_set({1,2}).__repr__() 390 >>> repr(index_set({1,2})) 397 The “informal” string representation of self. 399 >>> index_set({1,2}).__str__() 401 >>> str(index_set({1,2})) 408 Tests for functions that Doctest cannot see. 410 For index_set.__cinit__: Construct index_set. 412 >>> print(index_set(1)) 414 >>> print(index_set({1,2})) 416 >>> print(index_set(index_set({1,2}))) 418 >>> print(index_set({1,2})) 420 >>> print(index_set({1,2,1})) 422 >>> print(index_set({1,2,1})) 424 >>> print(index_set("")) 426 >>> print(index_set("{")) 427 Traceback (most recent call last): 429 ValueError: Cannot initialize index_set object from invalid string '{'. 430 >>> print(index_set("{1")) 431 Traceback (most recent call last): 433 ValueError: Cannot initialize index_set object from invalid string '{1'. 434 >>> print(index_set("{1,2,100}")) 435 Traceback (most recent call last): 437 ValueError: Cannot initialize index_set object from invalid string '{1,2,100}'. 438 >>> print(index_set({1,2,100})) 439 Traceback (most recent call last): 441 IndexError: Cannot initialize index_set object from invalid {1, 2, 100}. 442 >>> print(index_set([1,2])) 443 Traceback (most recent call last): 445 TypeError: Cannot initialize index_set object from <class 'list'>. 447 For index_set.__richcmp__: Compare two objects of class index_set. 449 >>> index_set(1) == index_set({1}) 451 >>> index_set({1}) != index_set({1}) 453 >>> index_set({1}) != index_set({2}) 455 >>> index_set({1}) == index_set({2}) 457 >>> index_set({1}) < index_set({2}) 459 >>> index_set({1}) <= index_set({2}) 461 >>> index_set({1}) > index_set({2}) 463 >>> index_set({1}) >= index_set({2}) 465 >>> None == index_set({1,2}) 467 >>> None != index_set({1,2}) 469 >>> None < index_set({1,2}) 471 >>> None <= index_set({1,2}) 473 >>> None > index_set({1,2}) 475 >>> None >= index_set({1,2}) 477 >>> index_set({1,2}) == None 479 >>> index_set({1,2}) != None 481 >>> index_set({1,2}) < None 483 >>> index_set({1,2}) <= None 485 >>> index_set({1,2}) > None 487 >>> index_set({1,2}) >= None 494 "lexicographic compare" eg. {3,4,5} is less than {3,7,8}; 495 -1 if a<b, +1 if a>b, 0 if a==b. 497 >>> compare(index_set({1,2}),index_set({-1,3})) 499 >>> compare(index_set({-1,4}),index_set({-1,3})) 506 Minimum negative index, or 0 if none. 508 >>> min_neg(index_set({1,2})) 515 Maximum positive index, or 0 if none. 517 >>> max_pos(index_set({1,2})) 522 cdef inline vector[scalar_t] list_to_vector(lst):
524 Create a C++ std:vector[scalar_t] from an iterable Python object. 526 cdef vector[scalar_t] v
528 v.push_back(<scalar_t>s)
534 cdef inline Clifford toClifford(obj):
539 Python class clifford wraps C++ class Clifford. 541 cdef Clifford *instance
543 cdef inline wrap(clifford self, Clifford other):
545 Wrap an instance of the C++ class Clifford. 550 cdef inline Clifford unwrap(clifford self):
552 Return the wrapped C++ Clifford instance. 556 cpdef copy(clifford self):
558 Copy this clifford object. 560 >>> x=clifford("1{2}"); y=x.copy(); print(y) 567 Construct an object of type clifford. 569 >>> print(clifford(2)) 571 >>> print(clifford(2.0)) 573 >>> print(clifford(1.0e-1)) 575 >>> print(clifford("2")) 577 >>> print(clifford("2{1,2,3}")) 579 >>> print(clifford(clifford("2{1,2,3}"))) 581 >>> print(clifford("-{1}")) 583 >>> print(clifford(2,index_set({1,2}))) 585 >>> print(clifford([2,3],index_set({1,2}))) 588 error_msg_prefix =
"Cannot initialize clifford object from" 591 if isinstance(other, clifford):
592 self.
instance = new Clifford((<clifford>other).unwrap())
593 elif isinstance(other, index_set):
594 self.
instance = new Clifford((<index_set>other).unwrap(), <scalar_t>1.0)
595 elif isinstance(other, numbers.Real):
596 self.
instance = new Clifford(<scalar_t>other)
597 elif isinstance(other, str):
599 bother = other.encode(
"UTF-8")
600 self.
instance = new Clifford(<char *>bother)
602 raise ValueError(error_msg_prefix +
" invalid string " + repr(other) +
".")
604 raise TypeError(error_msg_prefix +
" " + str(type(other)) +
".")
605 except RuntimeError
as err:
606 raise ValueError(error_msg_prefix +
" " + str(type(other))
607 +
" value " + repr(other) +
":" 609 elif isinstance(ixt, index_set):
610 if isinstance(other, numbers.Real):
611 self.
instance = new Clifford((<index_set>ixt).unwrap(), <scalar_t>other)
612 elif isinstance(other, collections.abc.Sequence):
613 self.
instance = new Clifford(list_to_vector(other), (<index_set>ixt).unwrap())
615 raise TypeError(error_msg_prefix +
" (" + str(type(other))
616 +
", " + repr(ixt) +
").")
618 raise TypeError(error_msg_prefix +
" (" + str(type(other))
619 +
", " + str(type(ixt)) +
").")
623 Clean up by deallocating the instance of C++ class Clifford. 631 >>> x=clifford(index_set({-3,4,7})); -3 in x 632 Traceback (most recent call last): 634 TypeError: Not applicable. 636 raise TypeError(
"Not applicable.")
642 >>> for a in clifford(index_set({-3,4,7})):print(a, end=",") 643 Traceback (most recent call last): 645 TypeError: Not applicable. 647 raise TypeError(
"Not applicable.")
651 Put self into a larger frame, containing the union of self.frame() and index set ixt. 652 This can be used to make multiplication faster, by multiplying within a common frame. 654 >>> clifford("2+3{1}").reframe(index_set({1,2,3})) 656 >>> s=index_set({1,2,3});t=index_set({-3,-2,-1});x=random_clifford(s); x.reframe(t).frame() == (s|t); 659 error_msg_prefix =
"Cannot reframe" 660 if isinstance(ixt, index_set):
663 result.instance = new Clifford(self.unwrap(), (<index_set>ixt).unwrap())
664 except RuntimeError
as err:
665 raise ValueError(error_msg_prefix +
" from " + str(self) +
" to frame " 669 raise TypeError(error_msg_prefix +
" using (" + str(type(ixt)) +
").")
674 Compare objects of type clifford. 676 >>> clifford("{1}") == clifford("1{1}") 678 >>> clifford("{1}") != clifford("1.0{1}") 680 >>> clifford("{1}") != clifford("1.0") 682 >>> clifford("{1,2}") == None 684 >>> clifford("{1,2}") != None 686 >>> None == clifford("{1,2}") 688 >>> None != clifford("{1,2}") 692 if (lhs
is None)
or (rhs
is None):
693 return bool(lhs
is rhs)
695 return bool( toClifford(lhs) == toClifford(rhs) )
697 if (lhs
is None)
or (rhs
is None):
698 return not bool(lhs
is rhs)
700 return bool( toClifford(lhs) != toClifford(rhs) )
701 elif isinstance(lhs, clifford)
or isinstance(rhs, clifford):
702 raise TypeError(
"This comparison operator is not implemented for " 703 + str(type(lhs)) +
", " + str(type(rhs)) +
".")
705 return NotImplemented
709 Subscripting: map from index set to scalar coordinate. 711 >>> clifford("{1}")[index_set(1)] 713 >>> clifford("{1}")[index_set({1})] 715 >>> clifford("{1}")[index_set({1,2})] 717 >>> clifford("2{1,2}")[index_set({1,2})] 720 return self.
instance.getitem(toIndexSet(ixt))
726 >>> print(-clifford("{1}")) 735 >>> print(+clifford("{1}")) 744 >>> print(clifford(1) + clifford("{2}")) 746 >>> print(clifford("{1}") + clifford("{2}")) 749 return clifford().wrap( toClifford(lhs) + toClifford(rhs) )
755 >>> print(1 + clifford("{2}")) 758 return clifford().wrap( toClifford(lhs) + toClifford(rhs) )
764 >>> x = clifford(1); x += clifford("{2}"); print(x) 767 return self.wrap( self.unwrap() + toClifford(rhs) )
771 Geometric difference. 773 >>> print(clifford(1) - clifford("{2}")) 775 >>> print(clifford("{1}") - clifford("{2}")) 778 return clifford().wrap( toClifford(lhs) - toClifford(rhs) )
782 Geometric difference. 784 >>> print(1 - clifford("{2}")) 787 return clifford().wrap( toClifford(lhs) - toClifford(rhs) )
791 Geometric difference. 793 >>> x = clifford(1); x -= clifford("{2}"); print(x) 796 return self.wrap( self.unwrap() - toClifford(rhs) )
802 >>> print(clifford("{1}") * clifford("{2}")) 804 >>> print(clifford(2) * clifford("{2}")) 806 >>> print(clifford("{1}") * clifford("{1,2}")) 809 return clifford().wrap( toClifford(lhs) * toClifford(rhs) )
815 >>> print(2 * clifford("{2}")) 818 return clifford().wrap( toClifford(lhs) * toClifford(rhs) )
824 >>> x = clifford(2); x *= clifford("{2}"); print(x) 826 >>> x = clifford("{1}"); x *= clifford("{2}"); print(x) 828 >>> x = clifford("{1}"); x *= clifford("{1,2}"); print(x) 831 return self.wrap( self.unwrap() * toClifford(rhs) )
837 >>> print(clifford("{1}") % clifford("{2}")) 839 >>> print(clifford(2) % clifford("{2}")) 841 >>> print(clifford("{1}") % clifford("{1}")) 843 >>> print(clifford("{1}") % clifford("{1,2}")) 846 return clifford().wrap( toClifford(lhs) % toClifford(rhs) )
852 >>> print(2 % clifford("{2}")) 855 return clifford().wrap( toClifford(lhs) % toClifford(rhs) )
861 >>> x = clifford("{1}"); x %= clifford("{2}"); print(x) 863 >>> x = clifford(2); x %= clifford("{2}"); print(x) 865 >>> x = clifford("{1}"); x %= clifford("{1}"); print(x) 867 >>> x = clifford("{1}"); x %= clifford("{1,2}"); print(x) 870 return self.wrap( self.unwrap() % toClifford(rhs) )
876 >>> print(clifford("{1}") & clifford("{2}")) 878 >>> print(clifford(2) & clifford("{2}")) 880 >>> print(clifford("{1}") & clifford("{1}")) 882 >>> print(clifford("{1}") & clifford("{1,2}")) 885 return clifford().wrap( toClifford(lhs) & toClifford(rhs) )
891 >>> print(2 & clifford("{2}")) 894 return clifford().wrap( toClifford(lhs) & toClifford(rhs) )
900 >>> x = clifford("{1}"); x &= clifford("{2}"); print(x) 902 >>> x = clifford(2); x &= clifford("{2}"); print(x) 904 >>> x = clifford("{1}"); x &= clifford("{1}"); print(x) 906 >>> x = clifford("{1}"); x &= clifford("{1,2}"); print(x) 909 return self.wrap( self.unwrap() & toClifford(rhs) )
915 >>> print(clifford("{1}") ^ clifford("{2}")) 917 >>> print(clifford(2) ^ clifford("{2}")) 919 >>> print(clifford("{1}") ^ clifford("{1}")) 921 >>> print(clifford("{1}") ^ clifford("{1,2}")) 924 return clifford().wrap( toClifford(lhs) ^ toClifford(rhs) )
930 >>> print(2 ^ clifford("{2}")) 933 return clifford().wrap( toClifford(lhs) ^ toClifford(rhs) )
939 >>> x = clifford("{1}"); x ^= clifford("{2}"); print(x) 941 >>> x = clifford(2); x ^= clifford("{2}"); print(x) 943 >>> x = clifford("{1}"); x ^= clifford("{1}"); print(x) 945 >>> x = clifford("{1}"); x ^= clifford("{1,2}"); print(x) 948 return self.wrap( self.unwrap() ^ toClifford(rhs) )
954 >>> print(clifford("{1}") / clifford("{2}")) 956 >>> print(clifford(2) / clifford("{2}")) 958 >>> print(clifford("{1}") / clifford("{1}")) 960 >>> print(clifford("{1}") / clifford("{1,2}")) 963 return clifford().wrap( toClifford(lhs) / toClifford(rhs) )
969 >>> print(2 / clifford("{2}")) 972 return clifford().wrap( toClifford(lhs) / toClifford(rhs) )
978 >>> x = clifford("{1}"); x /= clifford("{2}"); print(x) 980 >>> x = clifford(2); x /= clifford("{2}"); print(x) 982 >>> x = clifford("{1}"); x /= clifford("{1}"); print(x) 984 >>> x = clifford("{1}"); x /= clifford("{1,2}"); print(x) 987 return self.wrap( self.unwrap() / toClifford(rhs) )
991 Geometric multiplicative inverse. 993 >>> x = clifford("{1}"); print(x.inv()) 995 >>> x = clifford(2); print(x.inv()) 997 >>> x = clifford("{1,2}"); print(x.inv()) 1004 Transform left hand side, using right hand side as a transformation. 1006 >>> x=clifford("{1,2}") * pi/2; y=clifford("{1}"); print(y|x) 1008 >>> x=clifford("{1,2}") * pi/2; y=clifford("{1}"); print(y|exp(x)) 1011 return clifford().wrap( toClifford(lhs) | toClifford(rhs) )
1015 Transform left hand side, using right hand side as a transformation. 1017 >>> x=clifford("{1,2}") * pi/2; y=clifford("{1}"); y|=x; print(y) 1019 >>> x=clifford("{1,2}") * pi/2; y=clifford("{1}"); y|=exp(x); print(y) 1022 return self.wrap( self.unwrap() | toClifford(rhs) )
1026 Power: self to the m. 1028 >>> x=clifford("{1}"); print(x ** 2) 1030 >>> x=clifford("2"); print(x ** 2) 1032 >>> x=clifford("2+{1}"); print(x ** 0) 1034 >>> x=clifford("2+{1}"); print(x ** 1) 1036 >>> x=clifford("2+{1}"); print(x ** 2) 1038 >>> i=clifford("{1,2}"); print(exp(pi/2) * (i ** i)) 1045 Power: self to the m. 1047 >>> x=clifford("{1}"); print(x.pow(2)) 1049 >>> x=clifford("2"); print(x.pow(2)) 1051 >>> x=clifford("2+{1}"); print(x.pow(0)) 1053 >>> x=clifford("2+{1}"); print(x.pow(1)) 1055 >>> x=clifford("2+{1}"); print(x.pow(2)) 1057 >>> print(clifford("1+{1}+{1,2}").pow(3)) 1059 >>> i=clifford("{1,2}"); print(exp(pi/2) * i.pow(i)) 1062 if isinstance(m, numbers.Integral):
1065 return exp(m *
log(self))
1069 Outer product power. 1071 >>> x=clifford("2+{1}"); print(x.outer_pow(0)) 1073 >>> x=clifford("2+{1}"); print(x.outer_pow(1)) 1075 >>> x=clifford("2+{1}"); print(x.outer_pow(2)) 1077 >>> print(clifford("1+{1}+{1,2}").outer_pow(3)) 1085 Pure grade-vector part. 1087 >>> print(clifford("{1}")(1)) 1089 >>> print(clifford("{1}")(0)) 1091 >>> print(clifford("1+{1}+{1,2}")(0)) 1093 >>> print(clifford("1+{1}+{1,2}")(1)) 1095 >>> print(clifford("1+{1}+{1,2}")(2)) 1097 >>> print(clifford("1+{1}+{1,2}")(3)) 1106 >>> clifford("1+{1}+{1,2}").scalar() 1108 >>> clifford("{1,2}").scalar() 1117 >>> print(clifford("1+{1}+{1,2}").pure()) 1119 >>> print(clifford("{1,2}").pure()) 1126 Even part of multivector, sum of even grade terms. 1128 >>> print(clifford("1+{1}+{1,2}").even()) 1135 Odd part of multivector, sum of odd grade terms. 1137 >>> print(clifford("1+{1}+{1,2}").odd()) 1144 Vector part of multivector, as a Python list, with respect to frm. 1146 >>> print(clifford("1+2{1}+3{2}+4{1,2}").vector_part()) 1148 >>> print(clifford("1+2{1}+3{2}+4{1,2}").vector_part(index_set({-1,1,2}))) 1151 error_msg_prefix =
"Cannot take vector part of " 1152 cdef vector[scalar_t] vec
1165 except RuntimeError
as err:
1166 raise ValueError(error_msg_prefix + str(self) +
" using invalid " 1167 + repr(frm) +
" as frame:\n\t" 1172 Main involution, each {i} is replaced by -{i} in each term, 1173 eg. clifford("{1}") -> -clifford("{1}"). 1175 >>> print(clifford("{1}").involute()) 1177 >>> print((clifford("{2}") * clifford("{1}")).involute()) 1179 >>> print((clifford("{1}") * clifford("{2}")).involute()) 1181 >>> print(clifford("1+{1}+{1,2}").involute()) 1188 Reversion, eg. clifford("{1}")*clifford("{2}") -> clifford("{2}")*clifford("{1}"). 1190 >>> print(clifford("{1}").reverse()) 1192 >>> print((clifford("{2}") * clifford("{1}")).reverse()) 1194 >>> print((clifford("{1}") * clifford("{2}")).reverse()) 1196 >>> print(clifford("1+{1}+{1,2}").reverse()) 1203 Conjugation, reverse o involute == involute o reverse. 1205 >>> print((clifford("{1}")).conj()) 1207 >>> print((clifford("{2}") * clifford("{1}")).conj()) 1209 >>> print((clifford("{1}") * clifford("{2}")).conj()) 1211 >>> print(clifford("1+{1}+{1,2}").conj()) 1218 Quadratic form == (rev(x)*x)(0). 1220 >>> print(clifford("1+{1}+{1,2}").quad()) 1222 >>> print(clifford("1+{-1}+{1,2}+{1,2,3}").quad()) 1229 Norm == sum of squares of coordinates. 1231 >>> clifford("1+{1}+{1,2}").norm() 1233 >>> clifford("1+{-1}+{1,2}+{1,2,3}").norm() 1240 Absolute value: square root of norm. 1242 >>> clifford("1+{-1}+{1,2}+{1,2,3}").abs() 1249 Maximum of absolute values of components of multivector: multivector infinity norm. 1251 >>> clifford("1+{-1}+{1,2}+{1,2,3}").max_abs() 1253 >>> clifford("3+2{1}+{1,2}").max_abs() 1260 Remove all terms of self with relative size smaller than limit. 1262 >>> clifford("1e8+{1}+1e-8{1,2}").truncated(1.0e-6) 1263 clifford("100000000") 1264 >>> clifford("1e4+{1}+1e-4{1,2}").truncated(1.0e-6) 1265 clifford("10000+{1}") 1271 Check if a multivector contains any infinite values. 1273 >>> clifford().isinf() 1280 Check if a multivector contains any IEEE NaN values. 1282 >>> clifford().isnan() 1289 Subalgebra generated by all generators of terms of given multivector. 1291 >>> print(clifford("1+3{-1}+2{1,2}+4{-2,7}").frame()) 1293 >>> s=clifford("1+3{-1}+2{1,2}+4{-2,7}").frame(); type(s) 1294 <class 'PyClical.index_set'> 1300 The “official” string representation of self. 1302 >>> clifford("1+3{-1}+2{1,2}+4{-2,7}").__repr__() 1303 'clifford("1+3{-1}+2{1,2}+4{-2,7}")' 1309 The “informal” string representation of self. 1311 >>> clifford("1+3{-1}+2{1,2}+4{-2,7}").__str__() 1312 '1+3{-1}+2{1,2}+4{-2,7}' 1318 Tests for functions that Doctest cannot see. 1320 For clifford.__cinit__: Construct an object of type clifford. 1322 >>> print(clifford(2)) 1324 >>> print(clifford(2.0)) 1326 >>> print(clifford(1.0e-1)) 1328 >>> print(clifford("2")) 1330 >>> print(clifford("2{1,2,3}")) 1332 >>> print(clifford(clifford("2{1,2,3}"))) 1334 >>> print(clifford("-{1}")) 1336 >>> print(clifford(2,index_set({1,2}))) 1338 >>> print(clifford([2,3],index_set({1,2}))) 1340 >>> print(clifford([1,2])) 1341 Traceback (most recent call last): 1343 TypeError: Cannot initialize clifford object from <class 'list'>. 1344 >>> print(clifford(None)) 1345 Traceback (most recent call last): 1347 TypeError: Cannot initialize clifford object from <class 'NoneType'>. 1348 >>> print(clifford(None,[1,2])) 1349 Traceback (most recent call last): 1351 TypeError: Cannot initialize clifford object from (<class 'NoneType'>, <class 'list'>). 1352 >>> print(clifford([1,2],[1,2])) 1353 Traceback (most recent call last): 1355 TypeError: Cannot initialize clifford object from (<class 'list'>, <class 'list'>). 1356 >>> print(clifford("")) 1357 Traceback (most recent call last): 1359 ValueError: Cannot initialize clifford object from invalid string ''. 1360 >>> print(clifford("{")) 1361 Traceback (most recent call last): 1363 ValueError: Cannot initialize clifford object from invalid string '{'. 1364 >>> print(clifford("{1")) 1365 Traceback (most recent call last): 1367 ValueError: Cannot initialize clifford object from invalid string '{1'. 1368 >>> print(clifford("+")) 1369 Traceback (most recent call last): 1371 ValueError: Cannot initialize clifford object from invalid string '+'. 1372 >>> print(clifford("-")) 1373 Traceback (most recent call last): 1375 ValueError: Cannot initialize clifford object from invalid string '-'. 1376 >>> print(clifford("{1}+")) 1377 Traceback (most recent call last): 1379 ValueError: Cannot initialize clifford object from invalid string '{1}+'. 1381 For clifford.__richcmp__: Compare objects of type clifford. 1383 >>> clifford("{1}") == clifford("1{1}") 1385 >>> clifford("{1}") != clifford("1.0{1}") 1387 >>> clifford("{1}") != clifford("1.0") 1389 >>> clifford("{1,2}") == None 1391 >>> clifford("{1,2}") != None 1393 >>> None == clifford("{1,2}") 1395 >>> None != clifford("{1,2}") 1402 Quadratic norm error tolerance relative to a specific multivector. 1404 >>> print(error_squared_tol(clifford("{1}")) * 3.0 - error_squared_tol(clifford("1{1}-2{2}+3{3}"))) 1411 Relative or absolute error using the quadratic norm. 1413 >>> err2=scalar_epsilon*scalar_epsilon 1415 >>> print(error_squared(clifford("{1}"), clifford("1{1}"), err2)) 1417 >>> print(error_squared(clifford("1{1}-3{2}+4{3}"), clifford("{1}"), err2)) 1424 Test for approximate equality of multivectors. 1426 >>> err2=scalar_epsilon*scalar_epsilon 1428 >>> print(approx_equal(clifford("{1}"), clifford("1{1}"))) 1430 >>> print(approx_equal(clifford("1{1}-3{2}+4{3}"), clifford("{1}"))) 1432 >>> print(approx_equal(clifford("1{1}-3{2}+4{3}+0.001"), clifford("1{1}-3{2}+4{3}"), err2, err2)) 1434 >>> print(approx_equal(clifford("1{1}-3{2}+4{3}+1.0e-30"), clifford("1{1}-3{2}+4{3}"), err2, err2)) 1439 return glucat.approx_equal(toClifford(lhs), toClifford(rhs), <scalar_t>threshold, <scalar_t>tol)
1441 cpdef inline
inv(obj):
1443 Geometric multiplicative inverse. 1445 >>> print(inv(clifford("{1}"))) 1447 >>> print(inv(clifford("{-1}"))) 1449 >>> print(inv(clifford("{-2,-1}"))) 1451 >>> print(inv(clifford("{-1}+{1}"))) 1456 cpdef inline
scalar(obj):
1460 >>> scalar(clifford("1+{1}+{1,2}")) 1462 >>> scalar(clifford("{1,2}")) 1467 cpdef inline
real(obj):
1469 Real part: synonym for scalar part. 1471 >>> real(clifford("1+{1}+{1,2}")) 1473 >>> real(clifford("{1,2}")) 1478 cpdef inline
imag(obj):
1480 Imaginary part: deprecated (always 0). 1482 >>> imag(clifford("1+{1}+{1,2}")) 1484 >>> imag(clifford("{1,2}")) 1489 cpdef inline
pure(obj):
1493 >>> print(pure(clifford("1+{1}+{1,2}"))) 1495 >>> print(pure(clifford("{1,2}"))) 1500 cpdef inline
even(obj):
1502 Even part of multivector, sum of even grade terms. 1504 >>> print(even(clifford("1+{1}+{1,2}"))) 1509 cpdef inline
odd(obj):
1511 Odd part of multivector, sum of odd grade terms. 1513 >>> print(odd(clifford("1+{1}+{1,2}"))) 1520 Main involution, each {i} is replaced by -{i} in each term, eg. {1}*{2} -> (-{2})*(-{1}) 1522 >>> print(involute(clifford("{1}"))) 1524 >>> print(involute(clifford("{2}") * clifford("{1}"))) 1526 >>> print(involute(clifford("{1}") * clifford("{2}"))) 1528 >>> print(involute(clifford("1+{1}+{1,2}"))) 1535 Reversion, eg. {1}*{2} -> {2}*{1} 1537 >>> print(reverse(clifford("{1}"))) 1539 >>> print(reverse(clifford("{2}") * clifford("{1}"))) 1541 >>> print(reverse(clifford("{1}") * clifford("{2}"))) 1543 >>> print(reverse(clifford("1+{1}+{1,2}"))) 1548 cpdef inline
conj(obj):
1550 Conjugation, reverse o involute == involute o reverse. 1552 >>> print(conj(clifford("{1}"))) 1554 >>> print(conj(clifford("{2}") * clifford("{1}"))) 1556 >>> print(conj(clifford("{1}") * clifford("{2}"))) 1558 >>> print(conj(clifford("1+{1}+{1,2}"))) 1563 cpdef inline
quad(obj):
1565 Quadratic form == (rev(x)*x)(0). 1567 >>> print(quad(clifford("1+{1}+{1,2}"))) 1569 >>> print(quad(clifford("1+{-1}+{1,2}+{1,2,3}"))) 1574 cpdef inline
norm(obj):
1576 norm == sum of squares of coordinates. 1578 >>> norm(clifford("1+{1}+{1,2}")) 1580 >>> norm(clifford("1+{-1}+{1,2}+{1,2,3}")) 1585 cpdef inline
abs(obj):
1587 Absolute value of multivector: multivector 2-norm. 1589 >>> abs(clifford("1+{-1}+{1,2}+{1,2,3}")) 1596 Maximum absolute value of coordinates multivector: multivector infinity-norm. 1598 >>> max_abs(clifford("1+{-1}+{1,2}+{1,2,3}")) 1600 >>> max_abs(clifford("3+2{1}+{1,2}")) 1606 cpdef inline
pow(obj, m):
1608 Integer power of multivector: obj to the m. 1610 >>> x=clifford("{1}"); print(pow(x,2)) 1612 >>> x=clifford("2"); print(pow(x,2)) 1614 >>> x=clifford("2+{1}"); print(pow(x,0)) 1616 >>> x=clifford("2+{1}"); print(pow(x,1)) 1618 >>> x=clifford("2+{1}"); print(pow(x,2)) 1620 >>> print(pow(clifford("1+{1}+{1,2}"),3)) 1622 >>> i=clifford("{1,2}"); print(exp(pi/2) * pow(i, i)) 1632 Outer product power of multivector. 1634 >>> print(outer_pow(clifford("1+{1}+{1,2}"),3)) 1641 Square root of -1 which commutes with all members of the frame of the given multivector. 1643 >>> print(complexifier(clifford(index_set({1})))) 1645 >>> print(complexifier(clifford(index_set({-1})))) 1647 >>> print(complexifier(index_set({1}))) 1649 >>> print(complexifier(index_set({-1}))) 1656 Square root of multivector with optional complexifier. 1660 >>> print(sqrt(clifford("2{-1}"))) 1662 >>> j=sqrt(-1,complexifier(index_set({1}))); print(j); print(j*j) 1665 >>> j=sqrt(-1,"{1,2,3}"); print(j); print(j*j) 1673 return math.sqrt(obj)
1677 cpdef inline
exp(obj):
1679 Exponential of multivector. 1681 >>> x=clifford("{1,2}") * pi/4; print(exp(x)) 1683 >>> x=clifford("{1,2}") * pi/2; print(exp(x)) 1687 return math.exp(obj)
1691 cpdef inline
log(obj,i =
None):
1693 Natural logarithm of multivector with optional complexifier. 1695 >>> x=clifford("{-1}"); print((log(x,"{-1}") * 2/pi)) 1697 >>> x=clifford("{1,2}"); print((log(x,"{1,2,3}") * 2/pi)) 1699 >>> x=clifford("{1,2}"); print((log(x) * 2/pi)) 1701 >>> x=clifford("{1,2}"); print((log(x,"{1,2}") * 2/pi)) 1702 Traceback (most recent call last): 1704 RuntimeError: check_complex(val, i): i is not a valid complexifier for val 1710 return math.log(obj)
1714 cpdef inline
cos(obj,i =
None):
1716 Cosine of multivector with optional complexifier. 1718 >>> x=clifford("{1,2}"); print(cos(acos(x),"{1,2,3}")) 1720 >>> x=clifford("{1,2}"); print(cos(acos(x))) 1727 return math.cos(obj)
1731 cpdef inline
acos(obj,i =
None):
1733 Inverse cosine of multivector with optional complexifier. 1735 >>> x=clifford("{1,2}"); print(cos(acos(x),"{1,2,3}")) 1737 >>> x=clifford("{1,2}"); print(cos(acos(x),"{-1,1,2,3,4}")) 1739 >>> print(acos(0) / pi) 1741 >>> x=clifford("{1,2}"); print(cos(acos(x))) 1748 return math.acos(obj)
1752 cpdef inline
cosh(obj):
1754 Hyperbolic cosine of multivector. 1756 >>> x=clifford("{1,2}") * pi; print(cosh(x)) 1758 >>> x=clifford("{1,2,3}"); print(cosh(acosh(x))) 1760 >>> x=clifford("{1,2}"); print(cosh(acosh(x))) 1764 return math.cosh(obj)
1768 cpdef inline
acosh(obj,i =
None):
1770 Inverse hyperbolic cosine of multivector with optional complexifier. 1772 >>> print(acosh(0,"{-2,-1,1}")) 1774 >>> x=clifford("{1,2,3}"); print(cosh(acosh(x,"{-1,1,2,3,4}"))) 1778 >>> x=clifford("{1,2,3}"); print(cosh(acosh(x))) 1780 >>> x=clifford("{1,2}"); print(cosh(acosh(x))) 1787 return math.acosh(obj)
1791 cpdef inline
sin(obj,i =
None):
1793 Sine of multivector with optional complexifier. 1795 >>> s="{-1}"; x=clifford(s); print(asin(sin(x,s),s)) 1797 >>> s="{-1}"; x=clifford(s); print(asin(sin(x,s),"{-2,-1,1}")) 1799 >>> x=clifford("{1,2,3}"); print(asin(sin(x))) 1806 return math.sin(obj)
1810 cpdef inline
asin(obj,i =
None):
1812 Inverse sine of multivector with optional complexifier. 1814 >>> s="{-1}"; x=clifford(s); print(asin(sin(x,s),s)) 1816 >>> s="{-1}"; x=clifford(s); print(asin(sin(x,s),"{-2,-1,1}")) 1818 >>> print(asin(1) / pi) 1820 >>> x=clifford("{1,2,3}"); print(asin(sin(x))) 1827 return math.asin(obj)
1831 cpdef inline
sinh(obj):
1833 Hyperbolic sine of multivector. 1835 >>> x=clifford("{1,2}") * pi/2; print(sinh(x)) 1837 >>> x=clifford("{1,2}") * pi/6; print(sinh(x)) 1841 return math.sinh(obj)
1845 cpdef inline
asinh(obj,i =
None):
1847 Inverse hyperbolic sine of multivector with optional complexifier. 1849 >>> x=clifford("{1,2}"); print(asinh(x,"{1,2,3}") * 2/pi) 1851 >>> x=clifford("{1,2}"); print(asinh(x) * 2/pi) 1853 >>> x=clifford("{1,2}") / 2; print(asinh(x) * 6/pi) 1860 return math.asinh(obj)
1864 cpdef inline
tan(obj,i =
None):
1866 Tangent of multivector with optional complexifier. 1868 >>> x=clifford("{1,2}"); print(tan(x,"{1,2,3}")) 1870 >>> x=clifford("{1,2}"); print(tan(x)) 1877 return math.tan(obj)
1881 cpdef inline
atan(obj,i =
None):
1883 Inverse tangent of multivector with optional complexifier. 1885 >>> s=index_set({1,2,3}); x=clifford("{1}"); print(tan(atan(x,s),s)) 1887 >>> x=clifford("{1}"); print(tan(atan(x))) 1894 return math.atan(obj)
1898 cpdef inline
tanh(obj):
1900 Hyperbolic tangent of multivector. 1902 >>> x=clifford("{1,2}") * pi/4; print(tanh(x)) 1906 return math.tanh(obj)
1910 cpdef inline
atanh(obj,i =
None):
1912 Inverse hyperbolic tangent of multivector with optional complexifier. 1914 >>> s=index_set({1,2,3}); x=clifford("{1,2}"); print(tanh(atanh(x,s))) 1916 >>> x=clifford("{1,2}"); print(tanh(atanh(x))) 1923 return math.atanh(obj)
1927 cpdef inline random_clifford(index_set ixt, fill = 1.0):
1929 Random multivector within a frame. 1931 >>> print(random_clifford(index_set({-3,-1,2})).frame()) 1934 return clifford().wrap(
clifford().instance.random(ixt.unwrap(), <scalar_t>fill) )
1936 cpdef inline
cga3(obj):
1938 Convert Euclidean 3D multivector to Conformal Geometric Algebra using Doran and Lasenby definition. 1940 >>> x=clifford("2{1}+9{2}+{3}"); print(cga3(x)) 1941 87{-1}+4{1}+18{2}+2{3}+85{4} 1943 return clifford().wrap( glucat.cga3(toClifford(obj)) )
1947 Convert CGA3 null vector to standard conformal null vector using Doran and Lasenby definition. 1949 >>> x=clifford("2{1}+9{2}+{3}"); print(cga3std(cga3(x))) 1950 87{-1}+4{1}+18{2}+2{3}+85{4} 1951 >>> x=clifford("2{1}+9{2}+{3}"); print(cga3std(cga3(x))-cga3(x)) 1954 return clifford().wrap( glucat.cga3std(toClifford(obj)) )
1956 cpdef inline
agc3(obj):
1958 Convert CGA3 null vector to Euclidean 3D vector using Doran and Lasenby definition. 1960 >>> x=clifford("2{1}+9{2}+{3}"); print(agc3(cga3(x))) 1962 >>> x=clifford("2{1}+9{2}+{3}"); print(agc3(cga3(x))-x) 1965 return clifford().wrap( glucat.agc3(toClifford(obj)) )
1968 scalar_epsilon = epsilon
1975 Abbreviation for clifford. 1981 >>> print(cl(5.0e-1)) 1985 >>> print(cl("2{1,2,3}")) 1987 >>> print(cl(cl("2{1,2,3}"))) 1993 Abbreviation for index_set. 1995 >>> print(ist("{1,2,3}")) 2001 Abbreviation for clifford(index_set(obj)). 2014 Abbreviation for index_set({-q,...p}). 2016 >>> print(istpq(2,3)) 2026 import PyClical, doctest
2027 return doctest.testmod(PyClical)
2029 if __name__ ==
"__main__":
auto atanh(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse hyperbolic tangent of multivector with specified complexifier.
def __getitem__(self, idx)
String clifford_to_str(const Multivector_T &mv)
The "informal" string representation of Multivector_T mv.
String index_set_to_repr(const Index_Set_T &ist)
The “official” string representation of Index_Set_T ist.
auto exp(const framed_multi< Scalar_T, LO, HI, Tune_P > &val) -> const framed_multi< Scalar_T, LO, HI, Tune_P >
Exponential of multivector.
auto exp(const matrix_multi< Scalar_T, LO, HI, Tune_P > &val) -> const matrix_multi< Scalar_T, LO, HI, Tune_P >
Exponential of multivector.
auto asin(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse sine of multivector.
auto tan(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Tangent of multivector.
auto max_pos(const index_set< LO, HI > &ist) -> index_t
Maximum positive index, or 0 if none.
auto odd(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Odd part.
auto min_neg(const index_set< LO, HI > &ist) -> index_t
Minimum negative index, or 0 if none.
auto asinh(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse hyperbolic sine of multivector with specified complexifier.
auto norm(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Scalar_T norm == sum of norm of coordinates.
auto scalar(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Scalar part.
auto atanh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse hyperbolic tangent of multivector.
def __getitem__(self, ixt)
auto even(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Even part.
auto error_squared(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs, const Scalar_T threshold) -> Scalar_T
Relative or absolute error using the quadratic norm.
auto log(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Natural logarithm of multivector with specified complexifier.
def __contains__(self, idx)
auto complexifier(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Square root of -1 which commutes with all members of the frame of the given multivector.
auto sinh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Hyperbolic sine of multivector.
def __truediv__(lhs, rhs)
auto approx_equal(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs, const Scalar_T threshold, const Scalar_T tolerance) -> bool
Test for approximate equality of multivectors.
String clifford_to_repr(const Multivector_T &mv)
The “official” string representation of Multivector_T mv.
def __richcmp__(lhs, rhs, int, op)
auto asin(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse sine of multivector with specified complexifier.
auto atan(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse tangent of multivector.
auto tanh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Hyperbolic tangent of multivector.
auto error_squared_tol(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Quadratic norm error tolerance relative to a specific multivector.
auto acosh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse hyperbolic cosine of multivector.
auto outer_pow(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, int rhs) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Outer product power of multivector.
auto pure(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Pure part.
auto asinh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse hyperbolic sine of multivector.
auto abs(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Absolute value == sqrt(norm)
auto inv(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Geometric multiplicative inverse.
auto compare(const index_set< LO, HI > &a, const index_set< LO, HI > &b) -> int
"lexicographic compare" eg. {3,4,5} is less than {3,7,8}
def __richcmp__(lhs, rhs, int, op)
auto acos(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse cosine of multivector.
auto sqrt(const matrix_multi< Scalar_T, LO, HI, Tune_P > &val, const matrix_multi< Scalar_T, LO, HI, Tune_P > &i, bool prechecked) -> const matrix_multi< Scalar_T, LO, HI, Tune_P >
Square root of multivector with specified complexifier.
auto tan(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Tangent of multivector with specified complexifier.
auto acosh(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse hyperbolic cosine of multivector with specified complexifier.
def sign_of_mult(self, rhs)
def __cinit__(self, other=0)
Definitions for 3D Conformal Geometric Algebra [DL].
auto involute(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Main involution, each {i} is replaced by -{i} in each term, eg. {1}*{2} -> (-{2})*(-{1}) ...
def __rtruediv__(rhs, lhs)
auto cos(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Cosine of multivector with specified complexifier.
def __call__(self, grade)
auto atan(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse tangent of multivector with specified complexifier.
def truncated(self, limit)
auto sqrt(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Square root of multivector with specified complexifier.
auto reverse(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Reversion, eg. {1}*{2} -> {2}*{1}.
def __pow__(self, m, dummy)
auto sin(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Sine of multivector.
auto approx_equal(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs) -> bool
Test for approximate equality of multivectors.
def __setitem__(self, idx, val)
def __contains__(self, x)
auto pow(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, int rhs) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Integer power of multivector.
auto log(const matrix_multi< Scalar_T, LO, HI, Tune_P > &val, const matrix_multi< Scalar_T, LO, HI, Tune_P > &i, bool prechecked) -> const matrix_multi< Scalar_T, LO, HI, Tune_P >
Natural logarithm of multivector with specified complexifier.
String index_set_to_str(const Index_Set_T &ist)
The "informal" string representation of Index_Set_T ist.
auto real(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Real part: synonym for scalar part.
auto sin(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Sine of multivector with specified complexifier.
auto cosh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Hyperbolic cosine of multivector.
def __cinit__(self, other=0, ixt=None)
def index_set_hidden_doctests()
def clifford_hidden_doctests()
auto imag(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Imaginary part: deprecated (always 0)
auto max_abs(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Maximum of absolute values of components of multivector: multivector infinity norm.
auto conj(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Conjugation, rev o invo == invo o rev.
auto quad(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Scalar_T quadratic form == (rev(x)*x)(0)
auto acos(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse cosine of multivector with specified complexifier.
auto cos(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Cosine of multivector.
Multivector_T cga3std(const Multivector_T &X)
Convert CGA3 null vector to standard Conformal Geometric Algebra null vector [DL (10.52)].
def vector_part(self, frm=None)
Multivector_T agc3(const Multivector_T &X)
Convert CGA3 null vector to Euclidean 3D vector [DL (10.50)].