From b9f5df98511c5bf14321a8e807dc2927f824f813 Mon Sep 17 00:00:00 2001 From: utensil Date: Mon, 1 Apr 2024 16:02:10 +0800 Subject: [PATCH 01/78] Add the updated GAlgebraPrimer.pdf --- README.md | 1 + doc/books/Macdonald/GAlgebraPrimer.pdf | Bin 327138 -> 501336 bytes 2 files changed, 1 insertion(+) diff --git a/README.md b/README.md index 0ed61770..c4fc0c8e 100644 --- a/README.md +++ b/README.md @@ -249,5 +249,6 @@ Note that in the [doc/books](https://github.com/pygae/galgebra/blob/master/doc/b - `BookGA.pdf` which is a collection of notes on Geometric Algebra and Calculus based of "Geometric Algebra for Physicists" by Doran and Lasenby and on some papers by Lasenby and Hestenes. - `galgebra.pdf` which is the original main doc of GAlgebra in PDF format, while the math part is still valid, the part describing the installation and usage of GAlgebra is outdated, please read with caution or visit https://galgebra.readthedocs.io/ instead. - `Macdonald` which contains bundled supplementary materials for [Linear and Geometric Algebra](http://www.faculty.luther.edu/~macdonal/laga/index.html) and [Vector and Geometric Calculus](http://www.faculty.luther.edu/~macdonal/vagc/index.html) by Alan Macdonald, see [here](https://github.com/pygae/galgebra/blob/master/doc/books/Macdonald/) and [here](https://github.com/pygae/galgebra/blob/master/examples/Macdonald/) for more information. + - Particularly, `GAlgebraPrimer.pdf` is an archived version of [GAlgebra Primer](http://www.faculty.luther.edu/~macdonal/GAlgebraPrimer.pdf) by Alan Macdonald, last updated on November 29, 2022. diff --git a/doc/books/Macdonald/GAlgebraPrimer.pdf b/doc/books/Macdonald/GAlgebraPrimer.pdf index a4feb7b5b435ee50332188b340dc93e3253381e9..22d43c27cc41ec33ebd9739cdab62a1aa8f90d58 100644 GIT binary patch delta 453936 zcmZs?Q+Fl|)MXpnuGqG1+pO5O@x-=m+jc6pZQEAA-F` zlY%gDB<(X%0eaMB;ttv2dQUapEI?z7dTjpmxa0*PaV;-LtctVOSs&rcz3ON%|ExulM#9jT>qnkFV5NIE4-njVEOR2o3b&le()XLN;2K zPtElE4v*bhJSVGykBceOWm`XkndO6(Ba*@Qg-JJc0T0$*N%P&Z`X+t0eUQF>6|>TV z)G%&AM&69C^5)ih6Hha2IgXBTvXo>g$+T-oqQ`2DW|8HQ`!kp|H--c>3j{7bO+9w* ze%6f`WEEJHD)Q6?itq5aThWXDI5*kbS%&p93X@AWr_Liq=TB=(BAimpg9FyQ<^O_q zI?jw1Da^{rPL|It6*Y^a_KM#tW(HSRzpT=JKS;!2o@1z)oOy5p9)Kng zhH%OrRPYLq=4~;7K5I}YBR7>Te$>55V|IHQ$3LTNWx=UN=L>qPDm?u0ee&C2X_RZ~ zFkfMebLF2Bnp99BkM#do8o_ZH=~2Zh3y}ug094TCaIr-uFJ}@^QYn5D>C$qiVXy1h zKO+9%GFrzX6dn^!BN*ntX}FME!{Bz6P~ZZqe^J!X61-oB&RqC@^3pLHiUm1_iPBXQ z1I1N0jX}Z8k=k=Y>ZC6#Sb7jIv4+jcby1CRRV`t-Mu$rY#J5`o0h@=3H}35&bz!CA zfOS?;SAEtWoY%!C0~>R3$Vg4ZY|4@SEYMGCu=0itjuyKBrvmH{$y@x9B98M>3SIB+ zK68{vFd5jtb@YqCo|MIzpOCEB6Q|;!1)Yi}qLEhf=FH>yPm0gX*>eMgLrO^|)=G0v zZla>*aS{^c<`%?75t$YYo9=;9|x!Xz2jvdXIq<$}3P>s^1LpyQKbY^Qf1(542Rf~%xk%1! zDK^ap4d@9CI(S><-Y>#M+t0}fVD9%bV++W@{)v+dHNeVzj%9Nkw0p3 z&M&mxcAn^-FM%P!QzxLv^n)4cF%U*hzin|wl&G6b5m!4rXU`X?iKaX0rK`iIop*zMJs0zOf(+0Vglqu(_nHxQX8nls0t7gST} zSp}o^fCvJc^i465#VDSZ0lU1%JQLueoF|W8&DQ~8lfa zj0(caoHoAzMg^GG+>Bk6MDoq6yDOqYKJ0ye;LIli3BYKWw<2>R$ZmJ6zPH_GN4lQ1 zSJN0hG+`!zpbMvHtC~EnRVkC_^6Y)T%k?bjIM^|3j~t{NN4cF;J4(?zs@aE8Z)MEx z>{PUVy#Qid@c+hn%SEshU}TIknb5~&^a(_N*4DV)g`@mvL&7B5J#ofIfO`Bz=5J3) z+LhzEp-?$CV@<1=%=yn-ImFa`V>w$p@(bbN6z!dMsV$ zcLy-oJ_sj`TSz+#D$XmqB^M5tGqb0R2YtTZo5K%6f#Su*7iw5fesaMr z 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掽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�H@XUc?;G0mY>>2?~LR0t^!+3o9)J3j-1c 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

3NEm3MRI3;; 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ⅈFfQ0Jx+pNuE2F{XHVyg)7 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 AuK)l5 delta 280365 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 z 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 XV;LkKJS)pj-Xl8ciR+6W From f1132e5ddde062fff03492ec34c30c98d7ff2309 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 09:28:06 +0800 Subject: [PATCH 02/78] Add mv.py from GSG as is These changes are just additions, causing no conflict with existing code. Markers like `GSG code starts/ends` are kept to make it easier to identify the added code and distinguish it with other changes between 0.5.0 and 0.5.1, as well as GSG's other proposed changes. Co-authored-by: Greg Grunberg --- galgebra/mv.py | 385 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 315 insertions(+), 70 deletions(-) diff --git a/galgebra/mv.py b/galgebra/mv.py index ecec5dc3..75b15875 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -246,15 +246,17 @@ def _make_mv(ga: 'Ga', __name: str, **kwargs) -> Expr: for grade in range(ga.n + 1) )) + ### GSG code starts ### @staticmethod - def _make_spinor(ga: 'Ga', __name: str, **kwargs) -> Expr: - """ Make a general even (spinor) multivector """ + def _make_even(ga: 'Ga', __name: str, **kwargs) -> Expr: + """ Make a general even multivector """ if not isinstance(__name, str): raise TypeError("Must be a string") return reduce(operator.add, ( Mv._make_grade(ga, __name, grade, **kwargs) for grade in range(0, ga.n + 1, 2) )) + ### GSG code ends ### @staticmethod def _make_odd(ga: 'Ga', __name: str, **kwargs) -> Expr: @@ -268,7 +270,7 @@ def _make_odd(ga: 'Ga', __name: str, **kwargs) -> Expr: # aliases _make_grade2 = _make_bivector - _make_even = _make_spinor + ### GSSG: removed alias `_make_even = _make_spinor_` def __init__(self, *args, ga, recp=None, coords=None, **kwargs): """ @@ -328,7 +330,7 @@ def __init__(self, *args, ga, recp=None, coords=None, **kwargs): * ``"bivector"`` / ``"grade2"`` * ``"pseudo"`` * ``"mv"`` - * ``"even"`` / ``"spinor"`` + * ``"even"`` * ``"odd"`` f : bool, tuple @@ -341,6 +343,7 @@ def __init__(self, *args, ga, recp=None, coords=None, **kwargs): It is incorrectly described internally as the coordinates to be used with multivector functions. """ + ### GSG: removed mention of "spinor" under `category : str` in above docstring kw = _KwargParser('__init__', kwargs) self.Ga = ga self.recp = recp # not used @@ -411,7 +414,7 @@ def reflect_in_blade(self, blade: 'Mv') -> 'Mv': # Reflect mv in blade if blade.is_blade(): self.characterise_Mv() blade.characterise_Mv() - blade_inv = blade.rev() / blade.norm2() + blade_inv = blade.rev() / blade.qform() #### GSG replaced .norm2() by .qform() grade_dict = self.Ga.grade_decomposition(self) blade_grade = blade.i_grade reflect = Mv(0, 'scalar', ga=self.Ga) @@ -428,7 +431,7 @@ def project_in_blade(self, blade: 'Mv') -> 'Mv': # See Mv class functions documentation if blade.is_blade(): blade.characterise_Mv() - blade_inv = blade.rev() / blade.norm2() + blade_inv = blade.rev() / blade.qform() #### GSG replaced .norm2() by .qform() return (self < blade) * blade_inv # < is left contraction else: raise ValueError(str(blade) + 'is not a blade in project_in_blade(self, blade)') @@ -948,6 +951,20 @@ def is_versor(self) -> bool: self.versor_flg = test.is_vector() return self.versor_flg + r''' + ### GSG start code ### + def is_versor(self) -> bool: + """ + Presumes `self` is an invertible multivector. + Returns True if `self` is a versor (geometric product of invertible + vectors). + This test follows results in lecture notes by Lundholm and Svensson. + """ + x = self.Ga.mv('', 1) # generic 1-vector + return (self.g_invol() * x * self.inv()).is_vector() + ### GSG end code ### + ''' + def is_zero(self) -> bool: return self.obj == 0 @@ -1037,6 +1054,15 @@ def dual(self) -> 'Mv': return sign * I * self else: return sign * self * I + + ### GSG code starts ### + def undual(self) -> 'Mv': + """ + Inverse method to multivector method `.dual()`, so both + `A.dual().undual()` and `A.undual().dual` return `A`. + """ + return self.Ga.I()**2 * self.dual() + ### GSG code ends ### def even(self) -> 'Mv': """ return even parts of multivector """ @@ -1045,12 +1071,54 @@ def even(self) -> 'Mv': def odd(self) -> 'Mv': """ return odd parts of multivector """ return Mv(self.Ga.even_odd(self.obj, False), ga=self.Ga) + + ### GSG code starts ### + def g_invol(self) -> 'Mv': + """ + - Returns grade involute of multivector `self`; negates + `self`'s odd grade part but preserves its even grade part. + - Grade involution is its own inverse operation. + """ + return self.even() - self.odd() + ### GSG code ends ### def rev(self) -> 'Mv': self = self.blade_rep() return Mv(self.Ga.reverse(self.obj), ga=self.Ga) __invert__ = rev # allow `~x` to call x.rev() + + ### GSG code starts ### + def ccon(self) -> 'Mv': + """ + - Returns Clifford conjugate of multivector `self`, i.e. + returns the reverse of self's grade involute. + - Clifford conjugation is its own inverse operation. + """ + return self.g_invol().rev() + ### GSG code ends ### + + ### GSG code starts ### + def sp(self, B, switch='') -> Expr: # scalar product + """ + - Returns scalar product of multivectors self and B. + - Object returned is a real expression, not a 0-vector. + - switch can be either '' (the empty string) or 'rev'. The + latter causes left factor self to be reversed before its + product with B is taken. + """ + if not isinstance(B, Mv): + raise ValueError \ + ("Right factor of sp must be a multivector") + if switch not in ['','rev']: + raise ValueError \ + ("switch must be '' or 'rev'.") + if switch == '': + return (self * B).scalar() + if switch == 'rev': + return (self.rev() * B).scalar() + ### GSG code ends ### + def diff(self, coord) -> 'Mv': if self.Ga.coords is None: @@ -1187,59 +1255,104 @@ def _repr_latex_(self) -> str: return printer._FmtResult(self, self.title)._repr_latex_() return super()._repr_latex_() - def norm2(self) -> Expr: - reverse = self.rev() - product = self * reverse - if product.is_scalar(): - return product.scalar() - else: - raise TypeError('"(' + str(product) + ')**2" is not a scalar in norm2.') - def norm(self, hint: str = '+') -> Expr: + ### GSG code starts ### + def qform(self) -> Expr: """ - If A is a multivector and A*A.rev() is a scalar then:: - - A.norm() == sqrt(Abs(A*A.rev())) - - The problem in simplifying the norm is that if ``A`` is symbolic - you don't know if ``A*A.rev()`` is positive or negative. The use - of the hint argument is as follows: - - ======= ======================== - hint ``A.norm()`` - ======= ======================== - ``'+'`` ``sqrt(A*A.rev())`` - ``'-'`` ``sqrt(-A*A.rev())`` - ``'0'`` ``sqrt(Abs(A*A.rev()))`` - ======= ======================== - - The default ``hint='+'`` is correct for vectors in a Euclidean vector - space. For bivectors in a Euclidean vector space use ``hint='-'``. In - a mixed signature space all bets are off for the norms of symbolic - expressions. + - Returns the quadratic form of multivector self. + - Return value is a real SymPy expression, NOT a GAlgebra 0-vector. + - Expression necessarily represents a nonnegative number + only when self's geometric algebra has a Euclidean metric. """ - reverse = self.rev() - product = self * reverse - - if product.is_scalar(): - product = product.scalar() - if product.is_number: - if product >= S.Zero: - return sqrt(product) - else: - return sqrt(-product) - else: - if hint == '+': - return metric.square_root_of_expr(product) - elif hint == '-': - return metric.square_root_of_expr(-product) - else: - return sqrt(Abs(product)) + return simplify( (self.rev()*self).scalar() ) + ### GSG code ends ### + + + ### GSG code starts ### + def norm2(self, hint:str='0') -> Expr: + """ + - Returns the normsquared of multivector self, defined as the + absolute value of the quadratic form at self. + - Return value is a real SymPy expression, NOT a GAlgebra 0-vector. + Whether numeric or symbolic, A.norm2() always represents a + nonnegative number. + - String values '+', '-', or '0' of hint respectively determine + whether the quadratic form, the absolute value of which is the + norm squared, should be regarded as nonnegative, nonpositive, + or of unknown sign, except when that quantity's sign can be + determined by other considerations, such as the metric being + Euclidean. + """ + quadform = self.qform() # the quadratic form at `self` + if quadform.is_number: # Case1: quadform is numeric + return Abs(quadform) + if self.Ga.g.is_positive_definite: # Case2: metric is positive definite + return quadform + if (quadform >= 0) == True: # Case3: quadform is nonnegative + return +quadform + if (quadform <= 0) == True: # Case4: quadform is nonpositive + return -quadform + if hint == '0': # Case5: quadform's sign is + return Abs(quadform) # unknown, so use `hint`. + elif hint == '+': + return +quadform + elif hint == '-': + return -quadform else: - raise TypeError('"(' + str(product) + ')" is not a scalar in norm.') + raise ValueError("hint must be '0', '+', or '-'.") + ### GSG code ends ### + + + ### GSG code starts ### + def norm(self, hint='0') -> Expr: + """ + - Returns the norm of multivector self, defined as the square + root of self's norm squared. + - Whether numeric or symbolic, returned value is a real SymPy + expression that necessarily represents a nonnegative number. + Returned value is NOT a GAlgebra 0-vector. + - String values '+', '-', or '0' of hint respectively determine + whether the quadratic form from which the norm ultimately derives + should be regarded as nonnegative, nonpositive, or of unknown + sign, except when the quadratic form's sign can be determined + by other considerations, such as the metric being Euclidean. + """ + return simplify( sqrt(self.norm2(hint)) ) + ### GSG code ends ### __abs__ = norm # allow `abs(x)` to call z.norm() + + ### GSG code starts ### + def mag2(self) -> Expr: + """ + - Returns the magnitude squared of multivector self, defined as + the sum of the absolute values of the norm squareds of self's + grade parts. + - Returned value is a real SymPy expression, NOT a GAlgebra 0-vector. + Expression necesssarily represents a nonnegative number. + - The magnitude squared differs from the norm squared of `self` + when the metric is non-Euclidean. + """ + total = 0 + for k in range(self.Ga.n + 1): + total += Abs(self.grade(k).norm2()) + return total + ### GSG code ends ### + + + ### GSG code starts ### + def mag(self) -> Expr: + """ + - Returns the magnitude of multivector self, defined as the square root + of the magnitude squared. + - The magnitude necessarily agrees with the norm only when the metric is + Euclidean. Otherwise the magnitude is greater than or equal to the norm. + """ + return simplify( sqrt(self.mag2()) ) + ### GSG code ends ### + + def inv(self) -> 'Mv': if self.is_scalar(): # self is a scalar return self.Ga.mv(S.One/self.obj) @@ -1252,7 +1365,7 @@ def inv(self) -> 'Mv': return (S.One/self_sq.obj)*self self_rev = self.rev() self_self_rev = self * self_rev - if self_self_rev.is_scalar(): # self*self.rev() is a scalar + if(self_self_rev.is_scalar()): # self*self.rev() is a scalar """ if self_self_rev.scalar() == S.Zero: raise ValueError('!!!!In multivector inverse A*A.rev() is zero!!!!') @@ -1274,7 +1387,6 @@ def trigsimp(self) -> 'Mv': def simplify(self, modes=simplify) -> 'Mv': """ Simplify a multivector by scalar (sympy) simplifications. - `modes` is an operation or sequence of operations to apply to the the coefficients of a multivector expansion. """ @@ -1860,6 +1972,20 @@ def dual(A: Mv) -> Mv: raise ValueError('A not a multivector in dual(A)') +### GSG code starts ### +def undual(A: Mv) -> Mv: + """ + Equivalent to :meth: `Mv.undual`. + Inverse function to multivector function `dual`, so both + `undual(dual(A))` and `dual(undual(A))` return `A`. + """ + if isinstance(A, Mv): + return A.undual() + else: + raise ValueError('A not a multivector in undual(A).') +### GSG code ends ### + + def even(A: Mv) -> Mv: """ Equivalent to :meth:`Mv.even` """ if not isinstance(A, Mv): @@ -1874,10 +2000,25 @@ def odd(A: Mv) -> Mv: return A.odd() +### GSG code starts ### +def g_invol(A: Mv) -> Mv: + """ + Equivalent to :meth: `Mv.g_invol`. + - Returns grade involute of multivector `A`; negates `A`'s odd grade + part but preserves its even grade part. + - Grade involution is its own inverse operation. + """ + if not isinstance(A, Mv): + return ValueError('A not a multivector in g_invol(A)') + return A.g_invol() +### GSG code ends ### + + def exp(A: Union[Mv, Expr], hint: str = '-') -> Union[Mv, Expr]: """ If ``A`` is a multivector then ``A.exp(hint)`` is returned. - If ``A`` is a *sympy* expression the *sympy* expression :math:`e^{A}` is returned (see :func:`sympy.exp`). + If ``A`` is a *sympy* expression the *sympy* expression :math:`e^{A}` + is returned (see :func:`sympy.exp`). """ if isinstance(A, Mv): return A.exp(hint) @@ -1900,20 +2041,92 @@ def inv(A: Mv) -> Mv: return A.inv() -def norm(A: Mv, hint: str = '+') -> Expr: - """ Equivalent to :meth:`Mv.norm` """ - if isinstance(A, Mv): - return A.norm(hint=hint) - else: - raise ValueError('A not a multivector in norm(A)') +### GSG code starts ### +def qform(A:Mv) -> Expr: + """ + - Equivalent to :meth:`Mv.qform`. + - qform(A) returns the quadratic form at multivector A. + - Returned value is a real SymPy expression, NOT a GAlgebra 0-vector. + - Expression necessarily represents a nonnegative number only + when A's geometric algebra has a Euclidean metric. + """ + if not isinstance(A, Mv): + raise TypeError('A not a multivector in qform(A)') + A.qform() +### GSG code ends ### + + +### GSG code starts ### +def norm2(A:Mv, hint:str='0') -> Expr: + """ + - Equivalent to :meth:`Mv.norm2` + - Returns the normsquared of multivector self, defined as the + absolute value of the quadratic form at self. + - norm2(A() returns a real SymPy expression, NOT a GAlgebra 0-vector. + Whether numeric or symbolic, norm2(A) always represents a + nonnegative number. + - String values '+', '-', or '0' of hint respectively determine + whether the quadratic form, the absolute value of which is the + norm squared, should be regarded as nonnegative, nonpositive, + or of unknown sign, except when that quantity's sign can be + determined by other considerations, such as the metric being + Euclidean. + """ + if not isinstance(A, Mv): + raise TypeError('A not a multivector in norm2(A)') + return A.norm2(hint) +### GSG code ends ### -def norm2(A: Mv) -> Expr: - """ Equivalent to :meth:`Mv.norm2` """ - if isinstance(A, Mv): - return A.norm2() - else: - raise ValueError('A not a multivector in norm(A)') +### GSG code starts ### +def norm(A:Mv, hint:str='0') -> Expr: + """ + - Equivalent to :meth:`Mv.norm` + - Whether numeric nor symbolic, returned value is a real SymPy + expression that necessarily represents a nonnegative number. + Returned value is NOT a GAlgebra 0-vector. + - String values '+', '-', or '0' of hint respectively + determine whether a symbolic self.norm2() expression + should be regarded as nonnegative, nonpositive, or of + unknown sign. + """ + if not isinstance(A, Mv): + raise TypeError('A not a multivector in norm(A)') + return A.norm(hint=hint) +### GSG code ends ### + + +### GSG code starts ### +def mag2(A:Mv) -> Expr: + """ + - Equivalent to :meth:`Mv.mag2` + - Returns the magnitude squared of multivector self, defined as + the sum of the absolute values of the norm squareds of self's + grade parts. + - Returned value is a real SymPy expression, NOT a GAlgebra 0-vector. + Expression necesssarily represents a nonnegative number. + - The magnitude squared differs from the normsquared of `self` + when the metric is non-Euclidean. + """ + if not isinstance(A, Mv): + raise TypeError('A not a multivector in mag2(A)') + return A.mag2() +### GSG code ends ### + + +### GSG code starts ### +def mag(A:Mv) -> Expr: + """ + - Equivalent to :meth:`Mv.mag` + - Returns the magnitude of multivector self, defined as the square root + of the magnitude squared. + - The magnitude necessarily agrees with the norm only when the metric is + Euclidean. Otherwise the magnitude is greater than or equal to the norm. + """ + if not isinstance(A, Mv): + raise TypeError('A not a multivector in mag(A)') + return A.mag() +### GSG code ends ### def proj(B: Mv, A: Mv) -> Mv: @@ -1937,10 +2150,12 @@ def rot(itheta: Mv, A: Mv, hint: str = '-') -> Mv: def refl(B: Mv, A: Mv) -> Mv: r""" - Reflect multivector :math:`A` in blade :math:`B`. - - If :math:`s` is grade of :math:`B` returns :math:`\sum_{r}(-1)^{s(r+1)}B{\left < {A} \right >}_{r}B^{-1}`. + Reflect multivector :math:`A` in blade :math:`B`. + Returns + + :math:`\sum_{r}(-1)^{s(r+1)}B{\left < {A} \right >}_{r}B^{-1}`. + if :math:`B` has grade :math:`s`. Equivalent to :meth:`Mv.reflect_in_blade` """ if isinstance(A, Mv): @@ -1955,6 +2170,20 @@ def rev(A: Mv) -> Mv: return A.rev() else: raise ValueError('A not a multivector in rev(A)') + + +### GSG code starts ### +def ccon(A: Mv) -> Mv: + """ + - Equivalent to :meth: `Mv.ccon`. + - Returns Clifford conjugate of multivector `self`, i.e. + returns the reverse of self's grade involute. + - Clifford conjugation is its own inverse operation. + """ + if not isinstance(A, Mv): + raise ValueError('A not a multivector in ccon(A)') + return A.ccon() +### GSG code ends ### def scalar(A: Mv) -> Expr: @@ -1962,3 +2191,19 @@ def scalar(A: Mv) -> Expr: if not isinstance(A, Mv): raise ValueError('A = ' + str(A) + ' not a multivector in inv(A).') return A.scalar() + + +### GSG code starts ### +def sp(A: Mv, B: Mv, switch='') -> Expr: + """ + - Equivalent to :meth: `Mv.sp`. + - Returns scalar product of multivectors A and B. + - Returns a real SymPy expression, not a GAlgebra 0-vector. + - switch can be either '' (the empty string) or 'rev'. The + latter causes left factor A to be reversed before its + product with B is taken. + """ + if not isinstance(A, Mv): + raise ValueError("Left factor of sp must be a multivector") + return A.sp(B, switch) +### GSG code ends ### \ No newline at end of file From 9b19e61ff3388fe752f48d1ef7f5c50c74d6e6b7 Mon Sep 17 00:00:00 2001 From: utensil Date: Mon, 1 Apr 2024 18:39:58 +0800 Subject: [PATCH 03/78] lint --- galgebra/mv.py | 221 ++++++++++++++++++++++++------------------------- 1 file changed, 106 insertions(+), 115 deletions(-) diff --git a/galgebra/mv.py b/galgebra/mv.py index 75b15875..6e1bb5fb 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -246,7 +246,7 @@ def _make_mv(ga: 'Ga', __name: str, **kwargs) -> Expr: for grade in range(ga.n + 1) )) - ### GSG code starts ### + # ## GSG code starts ### @staticmethod def _make_even(ga: 'Ga', __name: str, **kwargs) -> Expr: """ Make a general even multivector """ @@ -256,7 +256,7 @@ def _make_even(ga: 'Ga', __name: str, **kwargs) -> Expr: Mv._make_grade(ga, __name, grade, **kwargs) for grade in range(0, ga.n + 1, 2) )) - ### GSG code ends ### + # ## GSG code ends ### @staticmethod def _make_odd(ga: 'Ga', __name: str, **kwargs) -> Expr: @@ -414,7 +414,7 @@ def reflect_in_blade(self, blade: 'Mv') -> 'Mv': # Reflect mv in blade if blade.is_blade(): self.characterise_Mv() blade.characterise_Mv() - blade_inv = blade.rev() / blade.qform() #### GSG replaced .norm2() by .qform() + blade_inv = blade.rev() / blade.qform() # ### GSG replaced .norm2() by .qform() grade_dict = self.Ga.grade_decomposition(self) blade_grade = blade.i_grade reflect = Mv(0, 'scalar', ga=self.Ga) @@ -431,7 +431,7 @@ def project_in_blade(self, blade: 'Mv') -> 'Mv': # See Mv class functions documentation if blade.is_blade(): blade.characterise_Mv() - blade_inv = blade.rev() / blade.qform() #### GSG replaced .norm2() by .qform() + blade_inv = blade.rev() / blade.qform() # ### GSG replaced .norm2() by .qform() return (self < blade) * blade_inv # < is left contraction else: raise ValueError(str(blade) + 'is not a blade in project_in_blade(self, blade)') @@ -952,7 +952,7 @@ def is_versor(self) -> bool: return self.versor_flg r''' - ### GSG start code ### + ### GSG start code ### def is_versor(self) -> bool: """ Presumes `self` is an invertible multivector. @@ -964,7 +964,7 @@ def is_versor(self) -> bool: return (self.g_invol() * x * self.inv()).is_vector() ### GSG end code ### ''' - + def is_zero(self) -> bool: return self.obj == 0 @@ -1054,15 +1054,15 @@ def dual(self) -> 'Mv': return sign * I * self else: return sign * self * I - - ### GSG code starts ### + + # ## GSG code starts ### def undual(self) -> 'Mv': """ Inverse method to multivector method `.dual()`, so both `A.dual().undual()` and `A.undual().dual` return `A`. """ return self.Ga.I()**2 * self.dual() - ### GSG code ends ### + # ## GSG code ends ### def even(self) -> 'Mv': """ return even parts of multivector """ @@ -1071,8 +1071,8 @@ def even(self) -> 'Mv': def odd(self) -> 'Mv': """ return odd parts of multivector """ return Mv(self.Ga.even_odd(self.obj, False), ga=self.Ga) - - ### GSG code starts ### + + # ## GSG code starts ### def g_invol(self) -> 'Mv': """ - Returns grade involute of multivector `self`; negates @@ -1080,15 +1080,15 @@ def g_invol(self) -> 'Mv': - Grade involution is its own inverse operation. """ return self.even() - self.odd() - ### GSG code ends ### + # ## GSG code ends ### def rev(self) -> 'Mv': self = self.blade_rep() return Mv(self.Ga.reverse(self.obj), ga=self.Ga) __invert__ = rev # allow `~x` to call x.rev() - - ### GSG code starts ### + + # ## GSG code starts ### def ccon(self) -> 'Mv': """ - Returns Clifford conjugate of multivector `self`, i.e. @@ -1096,11 +1096,11 @@ def ccon(self) -> 'Mv': - Clifford conjugation is its own inverse operation. """ return self.g_invol().rev() - ### GSG code ends ### + # ## GSG code ends ### - ### GSG code starts ### + # ## GSG code starts ### def sp(self, B, switch='') -> Expr: # scalar product - """ + """ - Returns scalar product of multivectors self and B. - Object returned is a real expression, not a 0-vector. - switch can be either '' (the empty string) or 'rev'. The @@ -1108,17 +1108,14 @@ def sp(self, B, switch='') -> Expr: # scalar product product with B is taken. """ if not isinstance(B, Mv): - raise ValueError \ - ("Right factor of sp must be a multivector") - if switch not in ['','rev']: - raise ValueError \ - ("switch must be '' or 'rev'.") - if switch == '': + raise ValueError("Right factor of sp must be a multivector") + if switch not in ['', 'rev']: + raise ValueError("switch must be '' or 'rev'.") + if switch == '': return (self * B).scalar() - if switch == 'rev': + if switch == 'rev': return (self.rev() * B).scalar() - ### GSG code ends ### - + # ## GSG code ends ### def diff(self, coord) -> 'Mv': if self.Ga.coords is None: @@ -1255,103 +1252,97 @@ def _repr_latex_(self) -> str: return printer._FmtResult(self, self.title)._repr_latex_() return super()._repr_latex_() - - ### GSG code starts ### + # ## GSG code starts ### def qform(self) -> Expr: """ - Returns the quadratic form of multivector self. - - Return value is a real SymPy expression, NOT a GAlgebra 0-vector. - - Expression necessarily represents a nonnegative number + - Return value is a real SymPy expression, NOT a GAlgebra 0-vector. + - Expression necessarily represents a nonnegative number only when self's geometric algebra has a Euclidean metric. """ - return simplify( (self.rev()*self).scalar() ) - ### GSG code ends ### + return simplify((self.rev()*self).scalar()) + # ## GSG code ends ### - - ### GSG code starts ### - def norm2(self, hint:str='0') -> Expr: + # ## GSG code starts ### + def norm2(self, hint: str = '0') -> Expr: """ - Returns the normsquared of multivector self, defined as the absolute value of the quadratic form at self. - Return value is a real SymPy expression, NOT a GAlgebra 0-vector. - Whether numeric or symbolic, A.norm2() always represents a + Whether numeric or symbolic, A.norm2() always represents a nonnegative number. - String values '+', '-', or '0' of hint respectively determine - whether the quadratic form, the absolute value of which is the - norm squared, should be regarded as nonnegative, nonpositive, + whether the quadratic form, the absolute value of which is the + norm squared, should be regarded as nonnegative, nonpositive, or of unknown sign, except when that quantity's sign can be determined by other considerations, such as the metric being Euclidean. """ - quadform = self.qform() # the quadratic form at `self` - if quadform.is_number: # Case1: quadform is numeric + quadform = self.qform() # the quadratic form at `self` + if quadform.is_number: # Case1: quadform is numeric return Abs(quadform) - if self.Ga.g.is_positive_definite: # Case2: metric is positive definite + if self.Ga.g.is_positive_definite: # Case2: metric is positive definite return quadform - if (quadform >= 0) == True: # Case3: quadform is nonnegative + if quadform >= 0: # Case3: quadform is nonnegative return +quadform - if (quadform <= 0) == True: # Case4: quadform is nonpositive + if quadform <= 0: # Case4: quadform is nonpositive return -quadform - if hint == '0': # Case5: quadform's sign is - return Abs(quadform) # unknown, so use `hint`. + if hint == '0': # Case5: quadform's sign is + return Abs(quadform) # unknown, so use `hint`. elif hint == '+': return +quadform elif hint == '-': return -quadform else: raise ValueError("hint must be '0', '+', or '-'.") - ### GSG code ends ### - + # ## GSG code ends ### - ### GSG code starts ### + # ## GSG code starts ### def norm(self, hint='0') -> Expr: """ - Returns the norm of multivector self, defined as the square root of self's norm squared. - - Whether numeric or symbolic, returned value is a real SymPy - expression that necessarily represents a nonnegative number. + - Whether numeric or symbolic, returned value is a real SymPy + expression that necessarily represents a nonnegative number. Returned value is NOT a GAlgebra 0-vector. - String values '+', '-', or '0' of hint respectively determine whether the quadratic form from which the norm ultimately derives - should be regarded as nonnegative, nonpositive, or of unknown - sign, except when the quadratic form's sign can be determined + should be regarded as nonnegative, nonpositive, or of unknown + sign, except when the quadratic form's sign can be determined by other considerations, such as the metric being Euclidean. """ - return simplify( sqrt(self.norm2(hint)) ) - ### GSG code ends ### + return simplify(sqrt(self.norm2(hint))) + # ## GSG code ends ### __abs__ = norm # allow `abs(x)` to call z.norm() - - ### GSG code starts ### + # ## GSG code starts ### def mag2(self) -> Expr: """ - Returns the magnitude squared of multivector self, defined as - the sum of the absolute values of the norm squareds of self's + the sum of the absolute values of the norm squareds of self's grade parts. - Returned value is a real SymPy expression, NOT a GAlgebra 0-vector. Expression necesssarily represents a nonnegative number. - - The magnitude squared differs from the norm squared of `self` + - The magnitude squared differs from the norm squared of `self` when the metric is non-Euclidean. """ total = 0 for k in range(self.Ga.n + 1): - total += Abs(self.grade(k).norm2()) + total += Abs(self.grade(k).norm2()) return total - ### GSG code ends ### - + # ## GSG code ends ### - ### GSG code starts ### + # ## GSG code starts ### def mag(self) -> Expr: """ - - Returns the magnitude of multivector self, defined as the square root - of the magnitude squared. + - Returns the magnitude of multivector self, defined as the square root + of the magnitude squared. - The magnitude necessarily agrees with the norm only when the metric is Euclidean. Otherwise the magnitude is greater than or equal to the norm. """ - return simplify( sqrt(self.mag2()) ) - ### GSG code ends ### - + return simplify(sqrt(self.mag2())) + # ## GSG code ends ### def inv(self) -> 'Mv': if self.is_scalar(): # self is a scalar @@ -1365,7 +1356,7 @@ def inv(self) -> 'Mv': return (S.One/self_sq.obj)*self self_rev = self.rev() self_self_rev = self * self_rev - if(self_self_rev.is_scalar()): # self*self.rev() is a scalar + if self_self_rev.is_scalar(): # self*self.rev() is a scalar """ if self_self_rev.scalar() == S.Zero: raise ValueError('!!!!In multivector inverse A*A.rev() is zero!!!!') @@ -1972,18 +1963,18 @@ def dual(A: Mv) -> Mv: raise ValueError('A not a multivector in dual(A)') -### GSG code starts ### +# ## GSG code starts ### def undual(A: Mv) -> Mv: """ Equivalent to :meth: `Mv.undual`. - Inverse function to multivector function `dual`, so both + Inverse function to multivector function `dual`, so both `undual(dual(A))` and `dual(undual(A))` return `A`. """ if isinstance(A, Mv): return A.undual() else: raise ValueError('A not a multivector in undual(A).') -### GSG code ends ### +# ## GSG code ends ### def even(A: Mv) -> Mv: @@ -2000,7 +1991,7 @@ def odd(A: Mv) -> Mv: return A.odd() -### GSG code starts ### +# ## GSG code starts ### def g_invol(A: Mv) -> Mv: """ Equivalent to :meth: `Mv.g_invol`. @@ -2011,13 +2002,13 @@ def g_invol(A: Mv) -> Mv: if not isinstance(A, Mv): return ValueError('A not a multivector in g_invol(A)') return A.g_invol() -### GSG code ends ### +# ## GSG code ends ### def exp(A: Union[Mv, Expr], hint: str = '-') -> Union[Mv, Expr]: """ If ``A`` is a multivector then ``A.exp(hint)`` is returned. - If ``A`` is a *sympy* expression the *sympy* expression :math:`e^{A}` + If ``A`` is a *sympy* expression the *sympy* expression :math:`e^{A}` is returned (see :func:`sympy.exp`). """ if isinstance(A, Mv): @@ -2041,92 +2032,92 @@ def inv(A: Mv) -> Mv: return A.inv() -### GSG code starts ### -def qform(A:Mv) -> Expr: - """ - - Equivalent to :meth:`Mv.qform`. +# ## GSG code starts ### +def qform(A: Mv) -> Expr: + """ + - Equivalent to :meth:`Mv.qform`. - qform(A) returns the quadratic form at multivector A. - Returned value is a real SymPy expression, NOT a GAlgebra 0-vector. - - Expression necessarily represents a nonnegative number only + - Expression necessarily represents a nonnegative number only when A's geometric algebra has a Euclidean metric. """ if not isinstance(A, Mv): raise TypeError('A not a multivector in qform(A)') A.qform() -### GSG code ends ### +# ## GSG code ends ### -### GSG code starts ### -def norm2(A:Mv, hint:str='0') -> Expr: - """ - - Equivalent to :meth:`Mv.norm2` +# ## GSG code starts ### +def norm2(A: Mv, hint: str = '0') -> Expr: + """ + - Equivalent to :meth:`Mv.norm2` - Returns the normsquared of multivector self, defined as the absolute value of the quadratic form at self. - norm2(A() returns a real SymPy expression, NOT a GAlgebra 0-vector. - Whether numeric or symbolic, norm2(A) always represents a + Whether numeric or symbolic, norm2(A) always represents a nonnegative number. - String values '+', '-', or '0' of hint respectively determine - whether the quadratic form, the absolute value of which is the - norm squared, should be regarded as nonnegative, nonpositive, - or of unknown sign, except when that quantity's sign can be - determined by other considerations, such as the metric being + whether the quadratic form, the absolute value of which is the + norm squared, should be regarded as nonnegative, nonpositive, + or of unknown sign, except when that quantity's sign can be + determined by other considerations, such as the metric being Euclidean. """ if not isinstance(A, Mv): raise TypeError('A not a multivector in norm2(A)') return A.norm2(hint) -### GSG code ends ### +# ## GSG code ends ### -### GSG code starts ### -def norm(A:Mv, hint:str='0') -> Expr: +# ## GSG code starts ### +def norm(A: Mv, hint: str = '0') -> Expr: """ - Equivalent to :meth:`Mv.norm` - - Whether numeric nor symbolic, returned value is a real SymPy + - Whether numeric nor symbolic, returned value is a real SymPy expression that necessarily represents a nonnegative number. Returned value is NOT a GAlgebra 0-vector. - - String values '+', '-', or '0' of hint respectively - determine whether a symbolic self.norm2() expression - should be regarded as nonnegative, nonpositive, or of + - String values '+', '-', or '0' of hint respectively + determine whether a symbolic self.norm2() expression + should be regarded as nonnegative, nonpositive, or of unknown sign. """ if not isinstance(A, Mv): raise TypeError('A not a multivector in norm(A)') return A.norm(hint=hint) -### GSG code ends ### +# ## GSG code ends ### -### GSG code starts ### -def mag2(A:Mv) -> Expr: +# ## GSG code starts ### +def mag2(A: Mv) -> Expr: """ - Equivalent to :meth:`Mv.mag2` - Returns the magnitude squared of multivector self, defined as - the sum of the absolute values of the norm squareds of self's + the sum of the absolute values of the norm squareds of self's grade parts. - Returned value is a real SymPy expression, NOT a GAlgebra 0-vector. Expression necesssarily represents a nonnegative number. - - The magnitude squared differs from the normsquared of `self` + - The magnitude squared differs from the normsquared of `self` when the metric is non-Euclidean. """ if not isinstance(A, Mv): raise TypeError('A not a multivector in mag2(A)') return A.mag2() -### GSG code ends ### +# ## GSG code ends ### -### GSG code starts ### -def mag(A:Mv) -> Expr: +# ## GSG code starts ### +def mag(A: Mv) -> Expr: """ - Equivalent to :meth:`Mv.mag` - - Returns the magnitude of multivector self, defined as the square root - of the magnitude squared. + - Returns the magnitude of multivector self, defined as the square root + of the magnitude squared. - The magnitude necessarily agrees with the norm only when the metric is Euclidean. Otherwise the magnitude is greater than or equal to the norm. """ if not isinstance(A, Mv): raise TypeError('A not a multivector in mag(A)') return A.mag() -### GSG code ends ### +# ## GSG code ends ### def proj(B: Mv, A: Mv) -> Mv: @@ -2150,9 +2141,9 @@ def rot(itheta: Mv, A: Mv, hint: str = '-') -> Mv: def refl(B: Mv, A: Mv) -> Mv: r""" - Reflect multivector :math:`A` in blade :math:`B`. - Returns - + Reflect multivector :math:`A` in blade :math:`B`. + Returns + :math:`\sum_{r}(-1)^{s(r+1)}B{\left < {A} \right >}_{r}B^{-1}`. if :math:`B` has grade :math:`s`. @@ -2170,9 +2161,9 @@ def rev(A: Mv) -> Mv: return A.rev() else: raise ValueError('A not a multivector in rev(A)') - -### GSG code starts ### + +# ## GSG code starts ### def ccon(A: Mv) -> Mv: """ - Equivalent to :meth: `Mv.ccon`. @@ -2183,7 +2174,7 @@ def ccon(A: Mv) -> Mv: if not isinstance(A, Mv): raise ValueError('A not a multivector in ccon(A)') return A.ccon() -### GSG code ends ### +# ## GSG code ends ### def scalar(A: Mv) -> Expr: @@ -2193,7 +2184,7 @@ def scalar(A: Mv) -> Expr: return A.scalar() -### GSG code starts ### +# ## GSG code starts ### def sp(A: Mv, B: Mv, switch='') -> Expr: """ - Equivalent to :meth: `Mv.sp`. @@ -2206,4 +2197,4 @@ def sp(A: Mv, B: Mv, switch='') -> Expr: if not isinstance(A, Mv): raise ValueError("Left factor of sp must be a multivector") return A.sp(B, switch) -### GSG code ends ### \ No newline at end of file +# ## GSG code ends ### From 5c7964b4710719b091241c80c02f490f5b12642f Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 09:29:00 +0800 Subject: [PATCH 04/78] Keep spinor for compatibility with old code --- galgebra/mv.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/galgebra/mv.py b/galgebra/mv.py index 6e1bb5fb..0ae7e5ef 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -270,6 +270,7 @@ def _make_odd(ga: 'Ga', __name: str, **kwargs) -> Expr: # aliases _make_grade2 = _make_bivector + _make_spinor = _make_even # alias for compatibility with old code ### GSSG: removed alias `_make_even = _make_spinor_` def __init__(self, *args, ga, recp=None, coords=None, **kwargs): @@ -330,7 +331,7 @@ def __init__(self, *args, ga, recp=None, coords=None, **kwargs): * ``"bivector"`` / ``"grade2"`` * ``"pseudo"`` * ``"mv"`` - * ``"even"`` + * ``"even"`` / ``"spinor"`` * ``"odd"`` f : bool, tuple From d853c70706757fcd03d3c11dcf4c7c02b0b39f40 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 09:59:20 +0800 Subject: [PATCH 05/78] Try fix `norm` by using `metric.square_root_of_expr` instead of `sqrt` --- galgebra/mv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galgebra/mv.py b/galgebra/mv.py index 0ae7e5ef..97b22b44 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -1312,7 +1312,7 @@ def norm(self, hint='0') -> Expr: sign, except when the quadratic form's sign can be determined by other considerations, such as the metric being Euclidean. """ - return simplify(sqrt(self.norm2(hint))) + return simplify(metric.square_root_of_expr(self.norm2(hint))) # ## GSG code ends ### __abs__ = norm # allow `abs(x)` to call z.norm() From 57aed4675ac1e1a3c925dc5b924ac51b8f90d7a8 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 10:45:24 +0800 Subject: [PATCH 06/78] Add lt.py from GSG almost as is Removed code conflicting about `Matrix_to_dictionary` and `inspect.getfullargspec`. Co-authored-by: Greg Grunberg --- galgebra/lt.py | 524 ++++++++++++++++++++++++++++++------------------- 1 file changed, 317 insertions(+), 207 deletions(-) diff --git a/galgebra/lt.py b/galgebra/lt.py index 936b7933..a20412f3 100644 --- a/galgebra/lt.py +++ b/galgebra/lt.py @@ -11,7 +11,7 @@ from typing import Mapping from sympy import ( - expand, symbols, Matrix, Transpose, zeros, Symbol, Function, S, Add, Expr + expand, symbols, Matrix, Transpose, zeros, Symbol, Function, S, Add, Expr, simplify ) from sympy.printing.latex import LatexPrinter as _LatexPrinter from sympy.printing.str import StrPrinter as _StrPrinter @@ -32,62 +32,94 @@ }) -def Symbolic_Matrix(root, coords=None, mode='g', f=False, sub=True): - if sub: - pos = '_' - else: - pos = '__' - if isinstance(coords, (list, tuple)): +### GSG code starts ### +def Symbolic_Matrix(kernel, coords=None, f=False, mode='g'): + """ + Returns a square real matrix the entries of which are symbolic + constants or symbolic functions of the coordinates. + - `kernel` is a one-letter string. It specifies the kernel letter of + indexed symbols or functions used to specify the matrix's entries + - `coords` is a list or tuple. Its entries are used to label the + components of a vector. + - `f`, a boolean, specifies that matrix entries are symbolic functions + of the coordinates or are symbolic constants, according to whether + `f` is True or False. + - `mode` is a one-letter string. When`mode` is 'g', 's', or 'a' the + matrix will be general, symmetric, or antisymmetric. + """ + + def general_matrix(kernel, coords=None, f=False): + """Returns a general square matrix. The row index of each entry + appears as a superscript, while the column index appears as a + subscript.""" n = len(coords) - n_range = range(n) - mat = zeros(n) - if mode == 'g': # General symbolic matrix - for row in n_range: - row_index = str(coords[row]) - for col in n_range: - col_index = str(coords[col]) - element = root + pos + row_index + col_index - if not f: - mat[row, col] = Symbol(element, real=True) - else: - mat[row, col] = Function(element)(*coords) - - elif mode == 's': # Symmetric symbolic matrix - for row in n_range: - row_index = str(coords[row]) - for col in n_range: - col_index = str(coords[col]) - if row <= col: - element = root + pos + row_index + col_index - else: - element = root + pos + col_index + row_index - if not f: - mat[row, col] = Symbol(element, real=True) - else: - mat[row, col] = Function(element)(*coords) - - elif mode == 'a': # Asymmetric symbolic matrix - for row in n_range: - row_index = str(coords[row]) - for col in n_range: - col_index = str(coords[col]) - if row <= col: - sign = S.One - element = root + pos + row_index + col_index - else: - sign = -S.One - element = root + pos + col_index + row_index - if row == col: - sign = S.Zero - if not f: - mat[row, col] = sign * Symbol(element, real=True) - else: - mat[row, col] = sign * Function(element)(*coords) - else: - raise ValueError('In Symbolic_Matrix mode = ' + str(mode)) - else: - raise ValueError('In Symbolic_Matrix coords = ' + str(coords)) - return mat + # Create matrix entries and store in appropriate locations in `G`: + G = zeros(n,n) + if f: # entries are symbolic functions + for i in range(n): + for j in range(n): + entry = '{' + kernel + '__' + str(coords[i]) + '}_' + str(coords[j]) + G[i,j] = Function(entry)(*coords) + else: # entries are symbolic constants + for i in range(n): + for j in range(n): + entry = '{' + kernel + '__' + str(coords[i]) + '}_' + str(coords[j]) + G[i,j] = Symbol(entry, real=True) + return G + + def symmetric_matrix(kernel, coords=None, f=False): + """Returns a symmetric matrix. Entries have a single index, which + appears as a subscript.""" + n = len(coords) + # Create and temporarily store matrix entries in `parameters` + parameters = [] + if f: # entries are symbolic functions + for i in range((n*(n+1)//2), 0, -1): + parameters.append(Function(kernel + '_' + str(i))(*coords)) + else: # entries are symbolic constants + for i in range((n*(n+1)//2), 0, -1): + parameters.append(Symbol(kernel + '_' + str(i), real=True)) + # Transfer entries to symmetric matrix `S`. + S = zeros(n,n) + for i in range(n): + for j in range(i,n): + S[i,j] = parameters.pop() + S[j,i] = S[i,j] + return S + + def antisymmetric_matrix(kernel, coords=None, f=False): + """Returns an antisymmetric matrix. Entries have a a single index, + which appears as a subscript.""" + n = len(coords) + # Create and temporarily store matrix entries in `parameters` + parameters = [] + if f: # entries are symbolic functions + for i in range((n*(n-1)//2), 0, -1): + parameters.append(Function(kernel + '_' + str(i))(*coords)) + else: # entries are symbolic constants + for i in range((n*(n-1)//2), 0, -1): # each parameter is a symbol + parameters.append(Symbol(kernel + '_' + str(i), real=True)) + # Transfer entries to antisymmetric matrix `A`. + A = zeros(n,n) + for i in range(n): + for j in range(i+1,n): + A[i,j] = parameters.pop() + A[j,i] = - A[i,j] + return A + + # Check legitimacy of parameter values: + if not isinstance(coords, (list, tuple)): + raise ValueError('coords = ' + str(coords) + ' in Symbolic_Matrix') + if mode not in ['g', 's', 'a']: + raise ValueError('mode = ' + str(mode) + ' in Symbolic_Matrix') + if mode == 'g': + return general_matrix(kernel, coords, f) + if mode == 's': + return symmetric_matrix(kernel, coords, f) + if mode == 'a': + return antisymmetric_matrix(kernel, coords, f) +### GSG code ends ### + def Matrix_to_dictionary(mat_rep, basis): @@ -104,29 +136,33 @@ def Matrix_to_dictionary(mat_rep, basis): } +### GSG code starts ### def Dictionary_to_Matrix(dict_rep, ga): - """ Convert dictionary representation of linear transformation to matrix """ - lst_mat = [] # list representation of sympy matrix - for e_row in ga.basis: - lst_mat_row = len(ga.basis) * [S.Zero] - - element = dict_rep.get(e_row, S.Zero) - if isinstance(element, mv.Mv): - element = element.obj - for coef, base in metric.linear_expand_terms(element): - index = ga.basis.index(base) - lst_mat_row[index] = coef - - lst_mat.append(lst_mat_row) - # expand the transpose - return Transpose(Matrix(lst_mat)).doit() + """Returns the matrix representation of that linear transformation on + geometric algebra ga which has dictionary representation dict_rep.""" + # columns[j] is a list of the entries in the matrix's jth column. + # columns[j][i] is the (i,j)th entry in the matrix. + # Matrix[columns] instantiates the transpose of the desired matrix. + columns = [] + for b in ga.basis: # b is a basis symbol for ga. + column = ga.n * [S.Zero] # Initialize column for dict_rep value at b. + dict_value = dict_rep[b] # dict_rep's value at b + if isinstance(dict_value, mv.Mv): + dict_value = dict_value.obj + if dict_value is not S.Zero: + for coef, base in metric.linear_expand_terms(dict_value): + row_index = ga.basis.index(base) + column[row_index] = coef + columns.append(column) + return Transpose(Matrix(columns)).doit() +### GSG code ends ### class Lt(printer.GaPrintable): r""" A Linear Transformation - Except for the spinor representation the linear transformation + Except for the versor representation, the linear transformation is stored as a dictionary with basis vector keys and vector values ``self.lt_dict`` so that a is a vector :math:`a = a^{i}e_{i}` then @@ -134,11 +170,13 @@ class Lt(printer.GaPrintable): \mathtt{self(}a\mathtt{)} = a^{i} * \mathtt{self.lt\_dict[}e_{i}\mathtt{]}. - For the spinor representation the linear transformation is - stored as the even multivector ``self.R`` so that if a is a + For the versor representation, the linear transformation is + stored as a versor ``self.V`` so that if a is a vector:: - self(a) = self.R * a * self.R.rev(). + self(a) = self.V.g_invol() * a * self.V.inv() + + where ``self.V.g_invol()`` is the grade involute of ``self.V``. Attributes ---------- @@ -201,7 +239,7 @@ def fct_flg(self): if self.Ga.coords is None: return False return set(self.Ga.coords) <= self.matrix().free_symbols - + def __init__(self, *args, ga, f=False, mode='g'): """ __init__(self, *args, ga, **kwargs) @@ -219,11 +257,19 @@ def __init__(self, *args, ga, f=False, mode='g'): :noindex: Construct from the operation of matrix pre-multiplication. - - .. class:: Lt(spinor: mv.Mv, /, *, ga) + + ### GSG code starts ### + .. class:: Lt(lt_list: list, /, *, ga) + :noindex: + + Construct from a list of lists, the j_th list of which contains + the coefficients of j_th image vector's basis expansion. + ### GSG code ends ### + + .. class:: Lt(versor: mv.Mv, /, *, ga) :noindex: - Construct from a spinor / rotor, which need not square to one. + Construct from a not-necessarily-normalized versor. .. class:: Lt(func: Callable[[mv.Mv], mv.Mv], /, *, ga) :noindex: @@ -239,7 +285,7 @@ def __init__(self, *args, ga, f=False, mode='g'): Parameters ---------- ga : Ga - Geometric algebra which is the domain and codomain of this transform + Geometric algebra which is both domain and codomain of this transformation f : bool True if Lt if function of coordinates. Only supported in the string constructor @@ -247,22 +293,28 @@ def __init__(self, *args, ga, f=False, mode='g'): g:general, s:symmetric, a:antisymmetric transformation. Only supported in the string constructor. """ - mat_rep = args[0] - self.Ga = ga - self.spinor = False - self.rho_sq = None - self.lt_dict = {} - self.mat = None - - if isinstance(mat_rep, dict): # Dictionary input + mat_rep = args[0] + self.Ga = ga + self.lt_dict = {} + self.mat = None + self.versor = False + # self.V, self.Vrev, and self.Vqform are never actually used in the current + # implementation of orthogonal outermorphisms created by a versor input. + self.V = None + self.Vrev = None + self.Vqform = None + + if isinstance(mat_rep, dict): # Dictionary input for key in mat_rep: self.lt_dict[key] = mat_rep[key] - elif isinstance(mat_rep, list): # List of lists input + elif isinstance(mat_rep, list): # List input if not isinstance(mat_rep[0], list): + # At this point mat_rep[i] is the desired image vector for the + # i_th basis image vectors. for lt_i, base in zip(mat_rep, self.Ga.basis): - self.lt_dict[base] = lt_i + self.lt_dict[base] = sym(lt_i) else: # mat_rep = map(list, zip(*mat_rep)) # Transpose list of lists for row, base1 in zip(mat_rep, self.Ga.basis): @@ -271,29 +323,38 @@ def __init__(self, *args, ga, f=False, mode='g'): tmp += col * base2 self.lt_dict[base1] = tmp - elif isinstance(mat_rep, Matrix): # Matrix input - self.mat = mat_rep - mat_rep = self.mat * self.Ga.g_inv + ### GSG code starts ### + elif isinstance(mat_rep, Matrix): # Matrix input self.lt_dict = Matrix_to_dictionary(mat_rep, self.Ga.basis) - - elif isinstance(mat_rep, mv.Mv): # Spinor input - self.spinor = True - self.R = mat_rep - self.Rrev = mat_rep.rev() - self.rho_sq = self.R * self.Rrev - if self.rho_sq.is_scalar(): - self.rho_sq = self.rho_sq.scalar() - if self.rho_sq == S.One: - self.rho_sq = None - else: - raise ValueError('In Spinor input for Lt, S*S.rev() not a scalar!\n') - - elif isinstance(mat_rep, str): # String input - Amat = Symbolic_Matrix(mat_rep, coords=self.Ga.coords, mode=mode, f=f) - self.__init__(Amat, ga=self.Ga) - - elif callable(mat_rep): # Linear multivector function input - # F is a multivector function to be tested for linearity + ### GSG code ends ### + + ### GSG code starts. ### + # This code segment uses versor `mat_rep` and a sandwich product only to + # create a linear vector-valued function of vector. That function is then + # used to create a dictionary-based outermorphism. Evaluation of the + # outermorphism on a multivector is by dictionary lookup, not by a + # sandwich product of the multivector with the versor. + elif isinstance(mat_rep, mv.Mv): # Versor input + if not mat_rep.is_versor: + raise ValueError(mat_rep, 'is not a versor in Versor input for Lt!\n') + V = mat_rep + Vg_invol = V.g_invol() + Vinv = V.inv() + outermorphism = ga.lt(lambda x: Vg_invol * x * Vinv) + self.lt_dict = simplify(outermorphism.lt_dict) + ### GSG code ends ### + + ### GSG code starts ### + elif isinstance(mat_rep, str): # (One-letter) string input + Amat = Symbolic_Matrix(mat_rep, coords=self.Ga.coords, f=f, mode=mode) + if mode=='g': + self.__init__(Amat, ga=self.Ga) + elif mode in ['s','a']: + self.__init__(self.Ga.g_inv * Amat, ga=self.Ga) + ### GSG code ends ### + + elif callable(mat_rep): # Linear multivector function input + # Function is tested for linearity before use. F = mat_rep a = mv.Mv('a', 'vector', ga=self.Ga) b = mv.Mv('b', 'vector', ga=self.Ga) @@ -311,10 +372,9 @@ def __init__(self, *args, ga, f=False, mode='g'): @_cached_property def mv_dict(self) -> Mapping[Expr, Expr]: # dict for linear transformation of multivector - if self.spinor: + if self.versor: # no lt_dict return None - return { blade: reduce( self.Ga.wedge, @@ -324,47 +384,58 @@ def mv_dict(self) -> Mapping[Expr, Expr]: for index, blade in self.Ga.indexes_to_blades_dict.items() } - def __call__(self, v, obj=False): + def __call__(self, M, obj=False): r""" - Returns the image of the multivector :math:`A` under the linear transformation :math:`L`. - - :math:`{{L}\lp {A} \rp }` is defined by the linearity of :math:`L`, the - vector values :math:`{{L}\lp {{{\eb}}_{i}} \rp }`, and the definition - :math:`{{L}\lp {{{\eb}}_{i_{1}}{\wedge}\dots{\wedge}{{\eb}}_{i_{r}}} \rp } = {{L}\lp {{{\eb}}_{i_{1}}} \rp }{\wedge}\dots{\wedge}{{L}\lp {{{\eb}}_{i_{r}}} \rp }`. + Returns the image of multivector :math:`M` under the linear transformation + :math:`L`. :math:`{{L}\lp{M}\rp}` is defined by + the linearity of :math:`L`, + the vector values :math:`{{L}\lp{{{\eb}}_{j}}\rp }`, and the definition + :math:`{{L}\lp{{{\eb}}_{j_{1}}{\wedge}\dots{\wedge}{{\eb}}_{j_{r}}}\rp}={{L}\lp{{{\eb}}_{j_{1}}}\rp}{\wedge}\dots{\wedge}{{L}\lp{{{\eb}}_{j_{r}}}\rp}`. """ - if isinstance(v, mv.Mv) and self.Ga != v.Ga: + if isinstance(M, mv.Mv) and self.Ga != M.Ga: raise ValueError('In Lt call Lt and argument refer to different vector spaces') - if self.spinor: - if not isinstance(v, mv.Mv): - v = mv.Mv(v, ga=self.Ga) - if self.rho_sq is None: - R_v_Rrev = self.R * v * self.Rrev + ### GSG code starts ### + # Given the current way an outermorphism is created from a versor input, + # self.versor will always be false; hence the following code fragment will + # never execute. + if self.versor: + # Sandwich M or M's grade involute depending on whether versor self.V + # is even or odd. + if self.V == self.V.odd(): + V_M_Vrev = self.V * M.g_invol() * self.Vrev + elif self.V == self.V.even(): + V_M_Vrev = self.V * M * self.Vrev else: - R_v_Rrev = self.rho_sq * self.R * v * self.Rrev + raise ValueError('self.V is not a versor in __call__') + # Divide by normalization factor self.Vqform to convert sandwiching + # between self.V and its reverse to sandwiching between self.V and + # its inverse. + V_M_Vinv = 1/(self.Vqform) * V_M_Vrev if obj: - return R_v_Rrev.obj + return V_M_Vinv.obj else: - return R_v_Rrev + return V_M_Vinv + ### GSG code ends ### - if isinstance(v, mv.Mv): - if v.is_vector(): - lt_v = v.obj.xreplace(self.lt_dict) + if isinstance(M, mv.Mv): + if M.is_vector(): + lt_M = M.obj.xreplace(self.lt_dict) if obj: - return lt_v + return lt_M else: - return mv.Mv(lt_v, ga=self.Ga) + return mv.Mv(lt_M, ga=self.Ga) else: - mv_obj = v.obj + mv_obj = M.obj else: - mv_obj = mv.Mv(v, ga=self.Ga).obj + mv_obj = mv.Mv(M, ga=self.Ga).obj - lt_v = mv_obj.xreplace(self.mv_dict) + lt_M = mv_obj.xreplace(self.mv_dict) if obj: - return lt_v + return lt_M else: - return mv.Mv(lt_v, ga=self.Ga) + return mv.Mv(lt_M, ga=self.Ga) def __add__(self, LT): @@ -420,15 +491,18 @@ def __rmul__(self, LT): else: raise TypeError('Cannot have LT as left argument in Lt __rmul__\n') - def det(self) -> Expr: # det(L) defined by L(I) = det(L)I + + ### GSG code starts ### + def det(self) -> Expr: # det(L) defined by L(E) = det(L)E r""" - Returns the determinant (a scalar) of the linear transformation, - :math:`L`, defined by :math:`{{\det}\lp {L} \rp }I = {{L}\lp {I} \rp }`. + - Returns the determinant of the linear transformation :math:`L`, + defined by :math:`\det(L) = L(E) E^{-1}`, where :math:`E` is the + basis blade for the pseudoscalar grade space. + - Expression returned is a real SymPy scalar, not a GAlgebra 0-vector. """ - - lt_I = self(self.Ga.i, obj=True) - det_lt_I = lt_I.subs(self.Ga.i.obj, S.One) - return det_lt_I + return (self(self.Ga.e) * self.Ga.e.inv()).scalar() + ### GSG code ends ### + def tr(self) -> Expr: # tr(L) defined by tr(L) = grad|L(x) r""" @@ -436,23 +510,21 @@ def tr(self) -> Expr: # tr(L) defined by tr(L) = grad|L(x) :math:`L`, defined by :math:`{{\operatorname{tr}}\lp {L} \rp }=\nabla_{a}\cdot{{L}\lp {a} \rp }` where :math:`a` is a vector in the tangent space. """ - connect_flg = self.Ga.connect_flg self.Ga.connect_flg = False - F_x = mv.Mv(self(self.Ga.coord_vec, obj=True), ga=self.Ga) tr_F = (self.Ga.grad | F_x).scalar() self.Ga.connect_flg = connect_flg return tr_F + ''' def adj(self) -> 'Lt': r""" - Returns the adjoint (a linear transformation) of the linear - transformation, :math:`L`, defined by :math:`a\cdot{{L}\lp {b} \rp } = b\cdot{{\bar{L}}\lp {a} \rp }` - where :math:`a` and :math:`b` are any two vectors in the tangent space - and :math:`\bar{L}` is the adjoint of :math:`L`. + Returns the adjoint :math:`{\bar{L}}`(a linear transformation) of linear + transformation :math:`L`, defined by + :math:`a\cdot{{L}\lp {b} \rp } = b\cdot{{\bar{L}}\lp {a} \rp }` + where :math:`a` and :math:`b` are any two vectors in the tangent space. """ - self_adj = [] for e_j in self.Ga.basis: s = S.Zero @@ -463,19 +535,44 @@ def adj(self) -> 'Lt': else: self_adj.append(expand(s) / self.Ga.e_sq) return Lt(self_adj, ga=self.Ga) - + ''' + + ### GSG code starts ### + def adj(self) -> 'Lt': + r""" + Returns the adjoint transformation :math:`{\bar{L}}` of linear + transformation :math:`L`, defined by + :math:`a\cdot{{L}\lp {b} \rp } = b\cdot{{\bar{L}}\lp {a} \rp }`, + where :math:`a` and :math:`b` are any two vectors in the tangent space. + """ + matrix_of_adjoint = self.Ga.g_inv * self.matrix().T * self.Ga.g + return self.Ga.lt(matrix_of_adjoint) + ### GSG code ends ### + + ### GSG code starts ### + def is_singular(self): + """Returns `True` if and only if linear transformation `self` is singular.""" + E = self.Ga.E() + return simplify((self(E) < E.inv()).scalar()) == S.Zero + ### GSG code ends + + ### GSG code starts ### def inv(self): - if self.spinor: - Lt_inv = Lt(self.Rrev, ga=self.Ga) - Lt_inv.rho_sq = S.One/(self.rho_sq**2) + """Returns compositional inverse of linear transformation`self`. + Assumes transformation is nonsingular. If `self` is a versor based + transformation, its inverse will also be versor based.""" + if self.versor: + return self.Ga.lt(self.V.rev()) + if not self.is_singular(): + return self.Ga.lt(Matrix( self.matrix().inv() )) else: - raise ValueError('Lt inverse currently implemented only for spinor!\n') - return Lt_inv + raise ValueError('transformation in inv() is non-invertible') + ### GSG code ends ### def _sympystr(self, print_obj): - if self.spinor: - return 'R = ' + print_obj._print(self.R) + if self.versor: ### GSG: changed `self.spinor` to `self.versor` ### + return 'R = ' + print_obj._print(self.V) else: pre = 'Lt(' s = '' @@ -486,59 +583,50 @@ def _sympystr(self, print_obj): s += pre + print_obj._print(base) + ') = 0\n' return s[:-1] - def _latex(self, print_obj): + ### GSG code starts ### + def _latex(self, print_obj): parts = [] - for base in self.Ga.basis: - if self.spinor: - val = self.R * mv.Mv(base, ga=self.Ga) * self.Rrev + for base in self.Ga.basis: # base is a basis symbol + if self.versor: + b = mv.Mv(base, ga=self.Ga) # b is the corresponding basis vector + if self.V == self.V.odd(): + unnormalized_image = self.V * (b.g_invol()) * self.Vrev + elif self.V == self.V.even(): + unnormalized_image = self.V * b * self.Vrev + else: + raise ValueError('self.V is not a versor in _latex') + image = 1/(self.Vqform) * unnormalized_image else: - val = mv.Mv(self.lt_dict.get(base, S.Zero), ga=self.Ga) - parts.append(print_obj._print(base) + ' &\\mapsto ' + print_obj._print(val)) + image = mv.Mv(self.lt_dict.get(base, S.Zero), ga=self.Ga) + parts.append(print_obj._print(base) + ' &\\mapsto ' + print_obj._print(image)) return '\\left\\{ \\begin{aligned} ' + ' \\\\ '.join(parts) + ' \\end{aligned} \\right\\}' + ### GSG code ends ### def Fmt(self, fmt=1, title=None) -> printer.GaPrintable: return printer._FmtResult(self, title) + ### GSG code starts ### def matrix(self) -> Matrix: r""" - Returns the matrix representation of the linear transformation, - :math:`L`, defined by :math:`{{L}\lp {{{\eb}}_{i}} \rp } = L_{ij}{{\eb}}_{j}` - where :math:`L_{ij}` is the matrix representation. + Returns the matrix :math:`[{L__i}_j]` defined for linear transformation + :math:`L` by :math:`L({\eb}_j)=\sum_i {L__i}_j \eb}_i`. """ if self.mat is not None: return self.mat + elif self.versor: + self.lt_dict = {} + for base in self.Ga.basis: + self.lt_dict[base] = self(base).simplify() + self.versor = False # temporary change of self.versor + mat = self.matrix() + self.versor = True # reverse change to self.versor + return mat else: - if self.spinor: - self.lt_dict = {} - for base in self.Ga.basis: - self.lt_dict[base] = self(base).simplify() - self.spinor = False - mat = self.matrix() - self.spinor = True - return mat - else: - """ - mat_rep = [] - for base in self.Ga.basis: - if base in self.lt_dict: - row = [] - image = (self.lt_dict[base]) - if isinstance(image, mv.Mv): - image = image.obj - coefs, bases = metric.linear_expand(image) - for base in self.Ga.basis: - try: - i = bases.index(base) - row.append(coefs[i]) - except: - row.append(0) - mat_rep.append(row) - else: - mat_rep.append(self.Ga.n * [0]) - return Matrix(mat_rep).transpose() - """ - self.mat = Dictionary_to_Matrix(self.lt_dict, self.Ga) * self.Ga.g - return self.mat + self.mat = Dictionary_to_Matrix(self.lt_dict, self.Ga) + return self.mat.doit() + ### GSG code ends ### + + class Mlt(printer.GaPrintable): @@ -754,17 +842,16 @@ def __init__(self, f, Ga, nargs=None, fct=False): else: if isinstance(f, types.FunctionType): # Tensor defined by general multi-linear function - args = inspect.getfullargspec(f)[0] + args, _varargs, _kwargs, _defaults = inspect.getargspec(f) self.nargs = len(args) self.f = f Mlt.increment_slots(self.nargs, Ga) self.fvalue = f(*tuple(Ga._mlt_a[0:self.nargs])) else: # Tensor defined by component expression - raise NotImplementedError - # self.f = None - # self.nargs = len(args) # args isn't defined, which is why we raise NotImplementedError - # Mlt.increment_slots(self.nargs, Ga) - # self.fvalue = f + self.f = None + self.nargs = len(args) + Mlt.increment_slots(self.nargs, Ga) + self.fvalue = f def __call__(self, *args): """ @@ -913,3 +1000,26 @@ def comps(self): print('') output += str(i)+':'+str(i_index)+':'+str(self(*e)) + '\n' return output + +### GSG code starts ### +def det(L:Lt) -> Expr: # det(L) defined by L(E) = det(L)E + r""" + - Returns the determinant of the linear transformation :math:`L`, + defined by :math:`\det(L) = L(E) E^{-1}`, where :math:`E` is the + basis blade for the pseudoscalar grade space. + - Expression returned is a real SymPy scalar, not a GAlgebra 0-vector. + """ + return L.det() +### GSG code ends ### + +### GSG code starts ### +def sym(v): + """ + Returns that linear combination of basis vector symbols which corresponds + to vector v, itself a linear combination of basis vectors. + """ + # Obtain the coefficients in basis vector expansion of `v`. + # Then construct and return corresponding basis vector symbol expansion. + coefs = v.blade_coefs(v.Ga.mv()) + return sum(coefs[j]*v.Ga.basis[j] for j in range(v.Ga.n)) +### GSG code ends ### From c892a887ac62b00d55295fd486e135cd9703cad1 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 10:43:27 +0800 Subject: [PATCH 07/78] lint --- galgebra/lt.py | 200 ++++++++++++++++++++++++------------------------- 1 file changed, 99 insertions(+), 101 deletions(-) diff --git a/galgebra/lt.py b/galgebra/lt.py index a20412f3..857bf9fc 100644 --- a/galgebra/lt.py +++ b/galgebra/lt.py @@ -11,7 +11,7 @@ from typing import Mapping from sympy import ( - expand, symbols, Matrix, Transpose, zeros, Symbol, Function, S, Add, Expr, simplify + expand, symbols, Matrix, Transpose, zeros, Symbol, Function, S, Add, Expr, simplify ) from sympy.printing.latex import LatexPrinter as _LatexPrinter from sympy.printing.str import StrPrinter as _StrPrinter @@ -32,39 +32,39 @@ }) -### GSG code starts ### +# ## GSG code starts ### def Symbolic_Matrix(kernel, coords=None, f=False, mode='g'): """ Returns a square real matrix the entries of which are symbolic constants or symbolic functions of the coordinates. - - `kernel` is a one-letter string. It specifies the kernel letter of + - `kernel` is a one-letter string. It specifies the kernel letter of indexed symbols or functions used to specify the matrix's entries - - `coords` is a list or tuple. Its entries are used to label the + - `coords` is a list or tuple. Its entries are used to label the components of a vector. - `f`, a boolean, specifies that matrix entries are symbolic functions - of the coordinates or are symbolic constants, according to whether + of the coordinates or are symbolic constants, according to whether `f` is True or False. - `mode` is a one-letter string. When`mode` is 'g', 's', or 'a' the matrix will be general, symmetric, or antisymmetric. """ - + def general_matrix(kernel, coords=None, f=False): - """Returns a general square matrix. The row index of each entry - appears as a superscript, while the column index appears as a + """Returns a general square matrix. The row index of each entry + appears as a superscript, while the column index appears as a subscript.""" n = len(coords) # Create matrix entries and store in appropriate locations in `G`: - G = zeros(n,n) + G = zeros(n, n) if f: # entries are symbolic functions for i in range(n): for j in range(n): entry = '{' + kernel + '__' + str(coords[i]) + '}_' + str(coords[j]) - G[i,j] = Function(entry)(*coords) + G[i, j] = Function(entry)(*coords) else: # entries are symbolic constants for i in range(n): for j in range(n): entry = '{' + kernel + '__' + str(coords[i]) + '}_' + str(coords[j]) - G[i,j] = Symbol(entry, real=True) + G[i, j] = Symbol(entry, real=True) return G def symmetric_matrix(kernel, coords=None, f=False): @@ -74,37 +74,37 @@ def symmetric_matrix(kernel, coords=None, f=False): # Create and temporarily store matrix entries in `parameters` parameters = [] if f: # entries are symbolic functions - for i in range((n*(n+1)//2), 0, -1): + for i in range((n*(n+1)//2), 0, -1): parameters.append(Function(kernel + '_' + str(i))(*coords)) else: # entries are symbolic constants for i in range((n*(n+1)//2), 0, -1): parameters.append(Symbol(kernel + '_' + str(i), real=True)) # Transfer entries to symmetric matrix `S`. - S = zeros(n,n) + S = zeros(n, n) for i in range(n): - for j in range(i,n): - S[i,j] = parameters.pop() - S[j,i] = S[i,j] + for j in range(i, n): + S[i, j] = parameters.pop() + S[j, i] = S[i, j] return S - + def antisymmetric_matrix(kernel, coords=None, f=False): - """Returns an antisymmetric matrix. Entries have a a single index, + """Returns an antisymmetric matrix. Entries have a a single index, which appears as a subscript.""" n = len(coords) # Create and temporarily store matrix entries in `parameters` parameters = [] if f: # entries are symbolic functions - for i in range((n*(n-1)//2), 0, -1): + for i in range((n*(n-1)//2), 0, -1): parameters.append(Function(kernel + '_' + str(i))(*coords)) else: # entries are symbolic constants for i in range((n*(n-1)//2), 0, -1): # each parameter is a symbol parameters.append(Symbol(kernel + '_' + str(i), real=True)) # Transfer entries to antisymmetric matrix `A`. - A = zeros(n,n) + A = zeros(n, n) for i in range(n): - for j in range(i+1,n): - A[i,j] = parameters.pop() - A[j,i] = - A[i,j] + for j in range(i+1, n): + A[i, j] = parameters.pop() + A[j, i] = - A[i, j] return A # Check legitimacy of parameter values: @@ -118,8 +118,7 @@ def antisymmetric_matrix(kernel, coords=None, f=False): return symmetric_matrix(kernel, coords, f) if mode == 'a': return antisymmetric_matrix(kernel, coords, f) -### GSG code ends ### - +# ## GSG code ends ### def Matrix_to_dictionary(mat_rep, basis): @@ -136,14 +135,14 @@ def Matrix_to_dictionary(mat_rep, basis): } -### GSG code starts ### +# ## GSG code starts ### def Dictionary_to_Matrix(dict_rep, ga): - """Returns the matrix representation of that linear transformation on + """Returns the matrix representation of that linear transformation on geometric algebra ga which has dictionary representation dict_rep.""" # columns[j] is a list of the entries in the matrix's jth column. # columns[j][i] is the (i,j)th entry in the matrix. # Matrix[columns] instantiates the transpose of the desired matrix. - columns = [] + columns = [] for b in ga.basis: # b is a basis symbol for ga. column = ga.n * [S.Zero] # Initialize column for dict_rep value at b. dict_value = dict_rep[b] # dict_rep's value at b @@ -155,7 +154,7 @@ def Dictionary_to_Matrix(dict_rep, ga): column[row_index] = coef columns.append(column) return Transpose(Matrix(columns)).doit() -### GSG code ends ### +# ## GSG code ends ### class Lt(printer.GaPrintable): @@ -175,7 +174,7 @@ class Lt(printer.GaPrintable): vector:: self(a) = self.V.g_invol() * a * self.V.inv() - + where ``self.V.g_invol()`` is the grade involute of ``self.V``. Attributes @@ -239,7 +238,7 @@ def fct_flg(self): if self.Ga.coords is None: return False return set(self.Ga.coords) <= self.matrix().free_symbols - + def __init__(self, *args, ga, f=False, mode='g'): """ __init__(self, *args, ga, **kwargs) @@ -257,15 +256,15 @@ def __init__(self, *args, ga, f=False, mode='g'): :noindex: Construct from the operation of matrix pre-multiplication. - - ### GSG code starts ### + + # ## GSG code starts ### .. class:: Lt(lt_list: list, /, *, ga) :noindex: - - Construct from a list of lists, the j_th list of which contains + + Construct from a list of lists, the j_th list of which contains the coefficients of j_th image vector's basis expansion. - ### GSG code ends ### - + # ## GSG code ends ### + .. class:: Lt(versor: mv.Mv, /, *, ga) :noindex: @@ -294,17 +293,17 @@ def __init__(self, *args, ga, f=False, mode='g'): Only supported in the string constructor. """ - mat_rep = args[0] - self.Ga = ga - self.lt_dict = {} - self.mat = None + mat_rep = args[0] + self.Ga = ga + self.lt_dict = {} + self.mat = None self.versor = False # self.V, self.Vrev, and self.Vqform are never actually used in the current # implementation of orthogonal outermorphisms created by a versor input. - self.V = None + self.V = None self.Vrev = None self.Vqform = None - + if isinstance(mat_rep, dict): # Dictionary input for key in mat_rep: self.lt_dict[key] = mat_rep[key] @@ -323,15 +322,15 @@ def __init__(self, *args, ga, f=False, mode='g'): tmp += col * base2 self.lt_dict[base1] = tmp - ### GSG code starts ### + # ## GSG code starts ### elif isinstance(mat_rep, Matrix): # Matrix input self.lt_dict = Matrix_to_dictionary(mat_rep, self.Ga.basis) - ### GSG code ends ### + # ## GSG code ends ### - ### GSG code starts. ### + # ## GSG code starts. ### # This code segment uses versor `mat_rep` and a sandwich product only to # create a linear vector-valued function of vector. That function is then - # used to create a dictionary-based outermorphism. Evaluation of the + # used to create a dictionary-based outermorphism. Evaluation of the # outermorphism on a multivector is by dictionary lookup, not by a # sandwich product of the multivector with the versor. elif isinstance(mat_rep, mv.Mv): # Versor input @@ -341,17 +340,17 @@ def __init__(self, *args, ga, f=False, mode='g'): Vg_invol = V.g_invol() Vinv = V.inv() outermorphism = ga.lt(lambda x: Vg_invol * x * Vinv) - self.lt_dict = simplify(outermorphism.lt_dict) - ### GSG code ends ### + self.lt_dict = simplify(outermorphism.lt_dict) + # ## GSG code ends ### - ### GSG code starts ### + # ## GSG code starts ### elif isinstance(mat_rep, str): # (One-letter) string input Amat = Symbolic_Matrix(mat_rep, coords=self.Ga.coords, f=f, mode=mode) - if mode=='g': + if mode == 'g': self.__init__(Amat, ga=self.Ga) - elif mode in ['s','a']: + elif mode in ['s', 'a']: self.__init__(self.Ga.g_inv * Amat, ga=self.Ga) - ### GSG code ends ### + # ## GSG code ends ### elif callable(mat_rep): # Linear multivector function input # Function is tested for linearity before use. @@ -387,8 +386,8 @@ def mv_dict(self) -> Mapping[Expr, Expr]: def __call__(self, M, obj=False): r""" Returns the image of multivector :math:`M` under the linear transformation - :math:`L`. :math:`{{L}\lp{M}\rp}` is defined by - the linearity of :math:`L`, + :math:`L`. :math:`{{L}\lp{M}\rp}` is defined by + the linearity of :math:`L`, the vector values :math:`{{L}\lp{{{\eb}}_{j}}\rp }`, and the definition :math:`{{L}\lp{{{\eb}}_{j_{1}}{\wedge}\dots{\wedge}{{\eb}}_{j_{r}}}\rp}={{L}\lp{{{\eb}}_{j_{1}}}\rp}{\wedge}\dots{\wedge}{{L}\lp{{{\eb}}_{j_{r}}}\rp}`. """ @@ -396,7 +395,7 @@ def __call__(self, M, obj=False): if isinstance(M, mv.Mv) and self.Ga != M.Ga: raise ValueError('In Lt call Lt and argument refer to different vector spaces') - ### GSG code starts ### + # ## GSG code starts ### # Given the current way an outermorphism is created from a versor input, # self.versor will always be false; hence the following code fragment will # never execute. @@ -410,14 +409,14 @@ def __call__(self, M, obj=False): else: raise ValueError('self.V is not a versor in __call__') # Divide by normalization factor self.Vqform to convert sandwiching - # between self.V and its reverse to sandwiching between self.V and - # its inverse. + # between self.V and its reverse to sandwiching between self.V and + # its inverse. V_M_Vinv = 1/(self.Vqform) * V_M_Vrev if obj: return V_M_Vinv.obj else: return V_M_Vinv - ### GSG code ends ### + # ## GSG code ends ### if isinstance(M, mv.Mv): if M.is_vector(): @@ -491,18 +490,16 @@ def __rmul__(self, LT): else: raise TypeError('Cannot have LT as left argument in Lt __rmul__\n') - - ### GSG code starts ### + # ## GSG code starts ### def det(self) -> Expr: # det(L) defined by L(E) = det(L)E r""" - Returns the determinant of the linear transformation :math:`L`, - defined by :math:`\det(L) = L(E) E^{-1}`, where :math:`E` is the + defined by :math:`\det(L) = L(E) E^{-1}`, where :math:`E` is the basis blade for the pseudoscalar grade space. - Expression returned is a real SymPy scalar, not a GAlgebra 0-vector. """ return (self(self.Ga.e) * self.Ga.e.inv()).scalar() - ### GSG code ends ### - + # ## GSG code ends ### def tr(self) -> Expr: # tr(L) defined by tr(L) = grad|L(x) r""" @@ -517,11 +514,11 @@ def tr(self) -> Expr: # tr(L) defined by tr(L) = grad|L(x) self.Ga.connect_flg = connect_flg return tr_F - ''' + r''' def adj(self) -> 'Lt': r""" - Returns the adjoint :math:`{\bar{L}}`(a linear transformation) of linear - transformation :math:`L`, defined by + Returns the adjoint :math:`{\bar{L}}`(a linear transformation) of linear + transformation :math:`L`, defined by :math:`a\cdot{{L}\lp {b} \rp } = b\cdot{{\bar{L}}\lp {a} \rp }` where :math:`a` and :math:`b` are any two vectors in the tangent space. """ @@ -536,42 +533,42 @@ def adj(self) -> 'Lt': self_adj.append(expand(s) / self.Ga.e_sq) return Lt(self_adj, ga=self.Ga) ''' - - ### GSG code starts ### + + # ## GSG code starts ### def adj(self) -> 'Lt': r""" - Returns the adjoint transformation :math:`{\bar{L}}` of linear - transformation :math:`L`, defined by + Returns the adjoint transformation :math:`{\bar{L}}` of linear + transformation :math:`L`, defined by :math:`a\cdot{{L}\lp {b} \rp } = b\cdot{{\bar{L}}\lp {a} \rp }`, where :math:`a` and :math:`b` are any two vectors in the tangent space. """ - matrix_of_adjoint = self.Ga.g_inv * self.matrix().T * self.Ga.g + matrix_of_adjoint = self.Ga.g_inv * self.matrix().T * self.Ga.g return self.Ga.lt(matrix_of_adjoint) - ### GSG code ends ### + # ## GSG code ends ### - ### GSG code starts ### + # ## GSG code starts ### def is_singular(self): """Returns `True` if and only if linear transformation `self` is singular.""" E = self.Ga.E() return simplify((self(E) < E.inv()).scalar()) == S.Zero - ### GSG code ends - - ### GSG code starts ### + # ## GSG code ends + + # ## GSG code starts ### def inv(self): - """Returns compositional inverse of linear transformation`self`. + """Returns compositional inverse of linear transformation`self`. Assumes transformation is nonsingular. If `self` is a versor based transformation, its inverse will also be versor based.""" if self.versor: return self.Ga.lt(self.V.rev()) if not self.is_singular(): - return self.Ga.lt(Matrix( self.matrix().inv() )) + return self.Ga.lt(Matrix(self.matrix().inv())) else: - raise ValueError('transformation in inv() is non-invertible') - ### GSG code ends ### + raise ValueError('transformation in inv() is non-invertible') + # ## GSG code ends ### def _sympystr(self, print_obj): - if self.versor: ### GSG: changed `self.spinor` to `self.versor` ### + if self.versor: # ## GSG: changed `self.spinor` to `self.versor` ### return 'R = ' + print_obj._print(self.V) else: pre = 'Lt(' @@ -583,8 +580,8 @@ def _sympystr(self, print_obj): s += pre + print_obj._print(base) + ') = 0\n' return s[:-1] - ### GSG code starts ### - def _latex(self, print_obj): + # ## GSG code starts ### + def _latex(self, print_obj): parts = [] for base in self.Ga.basis: # base is a basis symbol if self.versor: @@ -600,12 +597,12 @@ def _latex(self, print_obj): image = mv.Mv(self.lt_dict.get(base, S.Zero), ga=self.Ga) parts.append(print_obj._print(base) + ' &\\mapsto ' + print_obj._print(image)) return '\\left\\{ \\begin{aligned} ' + ' \\\\ '.join(parts) + ' \\end{aligned} \\right\\}' - ### GSG code ends ### + # ## GSG code ends ### def Fmt(self, fmt=1, title=None) -> printer.GaPrintable: return printer._FmtResult(self, title) - ### GSG code starts ### + # ## GSG code starts ### def matrix(self) -> Matrix: r""" Returns the matrix :math:`[{L__i}_j]` defined for linear transformation @@ -624,9 +621,7 @@ def matrix(self) -> Matrix: else: self.mat = Dictionary_to_Matrix(self.lt_dict, self.Ga) return self.mat.doit() - ### GSG code ends ### - - + # ## GSG code ends ### class Mlt(printer.GaPrintable): @@ -842,16 +837,17 @@ def __init__(self, f, Ga, nargs=None, fct=False): else: if isinstance(f, types.FunctionType): # Tensor defined by general multi-linear function - args, _varargs, _kwargs, _defaults = inspect.getargspec(f) + args = inspect.getfullargspec(f)[0] self.nargs = len(args) self.f = f Mlt.increment_slots(self.nargs, Ga) self.fvalue = f(*tuple(Ga._mlt_a[0:self.nargs])) else: # Tensor defined by component expression - self.f = None - self.nargs = len(args) - Mlt.increment_slots(self.nargs, Ga) - self.fvalue = f + raise NotImplementedError + # self.f = None + # self.nargs = len(args) # args isn't defined, which is why we raise NotImplementedError + # Mlt.increment_slots(self.nargs, Ga) + # self.fvalue = f def __call__(self, *args): """ @@ -1001,18 +997,20 @@ def comps(self): output += str(i)+':'+str(i_index)+':'+str(self(*e)) + '\n' return output -### GSG code starts ### -def det(L:Lt) -> Expr: # det(L) defined by L(E) = det(L)E + +# ## GSG code starts ### +def det(L: Lt) -> Expr: # det(L) defined by L(E) = det(L)E r""" - Returns the determinant of the linear transformation :math:`L`, - defined by :math:`\det(L) = L(E) E^{-1}`, where :math:`E` is the + defined by :math:`\det(L) = L(E) E^{-1}`, where :math:`E` is the basis blade for the pseudoscalar grade space. - Expression returned is a real SymPy scalar, not a GAlgebra 0-vector. """ return L.det() -### GSG code ends ### +# ## GSG code ends ### + -### GSG code starts ### +# ## GSG code starts ### def sym(v): """ Returns that linear combination of basis vector symbols which corresponds @@ -1020,6 +1018,6 @@ def sym(v): """ # Obtain the coefficients in basis vector expansion of `v`. # Then construct and return corresponding basis vector symbol expansion. - coefs = v.blade_coefs(v.Ga.mv()) + coefs = v.blade_coefs(v.Ga.mv()) return sum(coefs[j]*v.Ga.basis[j] for j in range(v.Ga.n)) -### GSG code ends ### +# ## GSG code ends ### From 33a33fbefc67a480e7f0565273cc16b0e34f8d09 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 11:03:56 +0800 Subject: [PATCH 08/78] Blindly regenerate failing notebooks for comparison --- examples/ipython/LaTeX.ipynb | 54 +++++++++++++-------------- examples/ipython/simple_ga_test.ipynb | 34 ++++++++--------- 2 files changed, 43 insertions(+), 45 deletions(-) diff --git a/examples/ipython/LaTeX.ipynb b/examples/ipython/LaTeX.ipynb index 60b98304..fab88b66 100644 --- a/examples/ipython/LaTeX.ipynb +++ b/examples/ipython/LaTeX.ipynb @@ -1519,43 +1519,43 @@ "\\begin{equation*} \\boldsymbol{\\nabla} \\cdot A = \\partial_{u} A^{u} + \\partial_{v} A^{v} \\end{equation*}\n", "\\begin{equation*} \\boldsymbol{\\nabla} A = \\left ( \\partial_{u} A^{u} + \\partial_{v} A^{v} \\right ) + \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\partial_{v} A^{u} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\partial_{u} A^{u} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\partial_{v} A^{v} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) \\partial_{u} A^{v} }{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u}\\wedge \\boldsymbol{e}_{v} \\end{equation*}\n", "3d orthogonal ($A,\\;B$ are linear transformations)\n", - "\\begin{equation*} A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto A_{xx} \\boldsymbol{e}_{x} + A_{yx} \\boldsymbol{e}_{y} + A_{zx} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto A_{xy} \\boldsymbol{e}_{x} + A_{yy} \\boldsymbol{e}_{y} + A_{zy} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto A_{xz} \\boldsymbol{e}_{x} + A_{yz} \\boldsymbol{e}_{y} + A_{zz} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} \\f{mat}{A} = \\left[\\begin{array}{ccc}A_{xx} & A_{xy} & A_{xz}\\\\A_{yx} & A_{yy} & A_{yz}\\\\A_{zx} & A_{zy} & A_{zz}\\end{array}\\right] \\end{equation*}\n", - "\\begin{equation*} \\f{\\det}{A} = A_{xz} \\left(A_{yx} A_{zy} - A_{yy} A_{zx}\\right) - A_{yz} \\left(A_{xx} A_{zy} - A_{xy} A_{zx}\\right) + A_{zz} \\left(A_{xx} A_{yy} - A_{xy} A_{yx}\\right) \\end{equation*}\n", - "\\begin{equation*} \\overline{A} = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto A_{xx} \\boldsymbol{e}_{x} + A_{xy} \\boldsymbol{e}_{y} + A_{xz} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto A_{yx} \\boldsymbol{e}_{x} + A_{yy} \\boldsymbol{e}_{y} + A_{yz} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto A_{zx} \\boldsymbol{e}_{x} + A_{zy} \\boldsymbol{e}_{y} + A_{zz} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} \\f{\\Tr}{A} = A_{xx} + A_{yy} + A_{zz} \\end{equation*}\n", - "\\begin{equation*} \\f{A}{e_x\\W e_y} = \\left ( A_{xx} A_{yy} - A_{xy} A_{yx}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + \\left ( A_{xx} A_{zy} - A_{xy} A_{zx}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + \\left ( A_{yx} A_{zy} - A_{yy} A_{zx}\\right ) \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}\n", - "\\begin{equation*} \\f{A}{e_x}\\W \\f{A}{e_y} = \\left ( A_{xx} A_{yy} - A_{xy} A_{yx}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + \\left ( A_{xx} A_{zy} - A_{xy} A_{zx}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + \\left ( A_{yx} A_{zy} - A_{yy} A_{zx}\\right ) \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}\n", + "\\begin{equation*} A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto {A^{x}}_{x} \\boldsymbol{e}_{x} + {A^{y}}_{x} \\boldsymbol{e}_{y} + {A^{z}}_{x} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto {A^{x}}_{y} \\boldsymbol{e}_{x} + {A^{y}}_{y} \\boldsymbol{e}_{y} + {A^{z}}_{y} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto {A^{x}}_{z} \\boldsymbol{e}_{x} + {A^{y}}_{z} \\boldsymbol{e}_{y} + {A^{z}}_{z} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} \\f{mat}{A} = \\left[\\begin{array}{ccc}{A^{x}}_{x} & {A^{x}}_{y} & {A^{x}}_{z}\\\\{A^{y}}_{x} & {A^{y}}_{y} & {A^{y}}_{z}\\\\{A^{z}}_{x} & {A^{z}}_{y} & {A^{z}}_{z}\\end{array}\\right] \\end{equation*}\n", + "\\begin{equation*} \\f{\\det}{A} = {A^{x}}_{x} {A^{y}}_{y} {A^{z}}_{z} - {A^{x}}_{x} {A^{y}}_{z} {A^{z}}_{y} - {A^{x}}_{y} {A^{y}}_{x} {A^{z}}_{z} + {A^{x}}_{y} {A^{y}}_{z} {A^{z}}_{x} + {A^{x}}_{z} {A^{y}}_{x} {A^{z}}_{y} - {A^{x}}_{z} {A^{y}}_{y} {A^{z}}_{x} \\end{equation*}\n", + "\\begin{equation*} \\overline{A} = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto {A^{x}}_{x} \\boldsymbol{e}_{x} + {A^{x}}_{y} \\boldsymbol{e}_{y} + {A^{x}}_{z} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto {A^{y}}_{x} \\boldsymbol{e}_{x} + {A^{y}}_{y} \\boldsymbol{e}_{y} + {A^{y}}_{z} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto {A^{z}}_{x} \\boldsymbol{e}_{x} + {A^{z}}_{y} \\boldsymbol{e}_{y} + {A^{z}}_{z} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} \\f{\\Tr}{A} = {A^{x}}_{x} + {A^{y}}_{y} + {A^{z}}_{z} \\end{equation*}\n", + "\\begin{equation*} \\f{A}{e_x\\W e_y} = \\left ( {A^{x}}_{x} {A^{y}}_{y} - {A^{x}}_{y} {A^{y}}_{x}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + \\left ( {A^{x}}_{x} {A^{z}}_{y} - {A^{x}}_{y} {A^{z}}_{x}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + \\left ( {A^{y}}_{x} {A^{z}}_{y} - {A^{y}}_{y} {A^{z}}_{x}\\right ) \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}\n", + "\\begin{equation*} \\f{A}{e_x}\\W \\f{A}{e_y} = \\left ( {A^{x}}_{x} {A^{y}}_{y} - {A^{x}}_{y} {A^{y}}_{x}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + \\left ( {A^{x}}_{x} {A^{z}}_{y} - {A^{x}}_{y} {A^{z}}_{x}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + \\left ( {A^{y}}_{x} {A^{z}}_{y} - {A^{y}}_{y} {A^{z}}_{x}\\right ) \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}\n", "\\begin{equation*} g = \\left[\\begin{array}{ccc}1 & 0 & 0\\\\0 & 1 & 0\\\\0 & 0 & 1\\end{array}\\right] \\end{equation*}\n", "\\begin{equation*} g^{-1} = \\left[\\begin{array}{ccc}1 & 0 & 0\\\\0 & 1 & 0\\\\0 & 0 & 1\\end{array}\\right] \\end{equation*}\n", - "\\begin{equation*} A + B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto \\left ( A_{xx} + B_{xx}\\right ) \\boldsymbol{e}_{x} + \\left ( A_{yx} + B_{yx}\\right ) \\boldsymbol{e}_{y} + \\left ( A_{zx} + B_{zx}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto \\left ( A_{xy} + B_{xy}\\right ) \\boldsymbol{e}_{x} + \\left ( A_{yy} + B_{yy}\\right ) \\boldsymbol{e}_{y} + \\left ( A_{zy} + B_{zy}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto \\left ( A_{xz} + B_{xz}\\right ) \\boldsymbol{e}_{x} + \\left ( A_{yz} + B_{yz}\\right ) \\boldsymbol{e}_{y} + \\left ( A_{zz} + B_{zz}\\right ) \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} AB = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto \\left ( A_{xx} B_{xx} + A_{xy} B_{yx} + A_{xz} B_{zx}\\right ) \\boldsymbol{e}_{x} + \\left ( A_{yx} B_{xx} + A_{yy} B_{yx} + A_{yz} B_{zx}\\right ) \\boldsymbol{e}_{y} + \\left ( A_{zx} B_{xx} + A_{zy} B_{yx} + A_{zz} B_{zx}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto \\left ( A_{xx} B_{xy} + A_{xy} B_{yy} + A_{xz} B_{zy}\\right ) \\boldsymbol{e}_{x} + \\left ( A_{yx} B_{xy} + A_{yy} B_{yy} + A_{yz} B_{zy}\\right ) \\boldsymbol{e}_{y} + \\left ( A_{zx} B_{xy} + A_{zy} B_{yy} + A_{zz} B_{zy}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto \\left ( A_{xx} B_{xz} + A_{xy} B_{yz} + A_{xz} B_{zz}\\right ) \\boldsymbol{e}_{x} + \\left ( A_{yx} B_{xz} + A_{yy} B_{yz} + A_{yz} B_{zz}\\right ) \\boldsymbol{e}_{y} + \\left ( A_{zx} B_{xz} + A_{zy} B_{yz} + A_{zz} B_{zz}\\right ) \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} A - B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto \\left ( A_{xx} - B_{xx}\\right ) \\boldsymbol{e}_{x} + \\left ( A_{yx} - B_{yx}\\right ) \\boldsymbol{e}_{y} + \\left ( A_{zx} - B_{zx}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto \\left ( A_{xy} - B_{xy}\\right ) \\boldsymbol{e}_{x} + \\left ( A_{yy} - B_{yy}\\right ) \\boldsymbol{e}_{y} + \\left ( A_{zy} - B_{zy}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto \\left ( A_{xz} - B_{xz}\\right ) \\boldsymbol{e}_{x} + \\left ( A_{yz} - B_{yz}\\right ) \\boldsymbol{e}_{y} + \\left ( A_{zz} - B_{zz}\\right ) \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} A + B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto \\left ( {A^{x}}_{x} + {B^{x}}_{x}\\right ) \\boldsymbol{e}_{x} + \\left ( {A^{y}}_{x} + {B^{y}}_{x}\\right ) \\boldsymbol{e}_{y} + \\left ( {A^{z}}_{x} + {B^{z}}_{x}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto \\left ( {A^{x}}_{y} + {B^{x}}_{y}\\right ) \\boldsymbol{e}_{x} + \\left ( {A^{y}}_{y} + {B^{y}}_{y}\\right ) \\boldsymbol{e}_{y} + \\left ( {A^{z}}_{y} + {B^{z}}_{y}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto \\left ( {A^{x}}_{z} + {B^{x}}_{z}\\right ) \\boldsymbol{e}_{x} + \\left ( {A^{y}}_{z} + {B^{y}}_{z}\\right ) \\boldsymbol{e}_{y} + \\left ( {A^{z}}_{z} + {B^{z}}_{z}\\right ) \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} AB = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto \\left ( {A^{x}}_{x} {B^{x}}_{x} + {A^{x}}_{y} {B^{y}}_{x} + {A^{x}}_{z} {B^{z}}_{x}\\right ) \\boldsymbol{e}_{x} + \\left ( {A^{y}}_{x} {B^{x}}_{x} + {A^{y}}_{y} {B^{y}}_{x} + {A^{y}}_{z} {B^{z}}_{x}\\right ) \\boldsymbol{e}_{y} + \\left ( {A^{z}}_{x} {B^{x}}_{x} + {A^{z}}_{y} {B^{y}}_{x} + {A^{z}}_{z} {B^{z}}_{x}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto \\left ( {A^{x}}_{x} {B^{x}}_{y} + {A^{x}}_{y} {B^{y}}_{y} + {A^{x}}_{z} {B^{z}}_{y}\\right ) \\boldsymbol{e}_{x} + \\left ( {A^{y}}_{x} {B^{x}}_{y} + {A^{y}}_{y} {B^{y}}_{y} + {A^{y}}_{z} {B^{z}}_{y}\\right ) \\boldsymbol{e}_{y} + \\left ( {A^{z}}_{x} {B^{x}}_{y} + {A^{z}}_{y} {B^{y}}_{y} + {A^{z}}_{z} {B^{z}}_{y}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto \\left ( {A^{x}}_{x} {B^{x}}_{z} + {A^{x}}_{y} {B^{y}}_{z} + {A^{x}}_{z} {B^{z}}_{z}\\right ) \\boldsymbol{e}_{x} + \\left ( {A^{y}}_{x} {B^{x}}_{z} + {A^{y}}_{y} {B^{y}}_{z} + {A^{y}}_{z} {B^{z}}_{z}\\right ) \\boldsymbol{e}_{y} + \\left ( {A^{z}}_{x} {B^{x}}_{z} + {A^{z}}_{y} {B^{y}}_{z} + {A^{z}}_{z} {B^{z}}_{z}\\right ) \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} A - B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto \\left ( {A^{x}}_{x} - {B^{x}}_{x}\\right ) \\boldsymbol{e}_{x} + \\left ( {A^{y}}_{x} - {B^{y}}_{x}\\right ) \\boldsymbol{e}_{y} + \\left ( {A^{z}}_{x} - {B^{z}}_{x}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto \\left ( {A^{x}}_{y} - {B^{x}}_{y}\\right ) \\boldsymbol{e}_{x} + \\left ( {A^{y}}_{y} - {B^{y}}_{y}\\right ) \\boldsymbol{e}_{y} + \\left ( {A^{z}}_{y} - {B^{z}}_{y}\\right ) \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto \\left ( {A^{x}}_{z} - {B^{x}}_{z}\\right ) \\boldsymbol{e}_{x} + \\left ( {A^{y}}_{z} - {B^{y}}_{z}\\right ) \\boldsymbol{e}_{y} + \\left ( {A^{z}}_{z} - {B^{z}}_{z}\\right ) \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", "\\begin{equation*} General Symmetric Linear Transformation \\end{equation*}\n", - "\\begin{equation*} A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto A_{xx} \\boldsymbol{e}_{x} + A_{xy} \\boldsymbol{e}_{y} + A_{xz} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto A_{xy} \\boldsymbol{e}_{x} + A_{yy} \\boldsymbol{e}_{y} + A_{yz} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto A_{xz} \\boldsymbol{e}_{x} + A_{yz} \\boldsymbol{e}_{y} + A_{zz} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto A_{1} \\boldsymbol{e}_{x} + A_{2} \\boldsymbol{e}_{y} + A_{3} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto A_{2} \\boldsymbol{e}_{x} + A_{4} \\boldsymbol{e}_{y} + A_{5} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto A_{3} \\boldsymbol{e}_{x} + A_{5} \\boldsymbol{e}_{y} + A_{6} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", "\\begin{equation*} General Antisymmetric Linear Transformation \\end{equation*}\n", - "\\begin{equation*} A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto - A_{xy} \\boldsymbol{e}_{y} - A_{xz} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto A_{xy} \\boldsymbol{e}_{x} - A_{yz} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto A_{xz} \\boldsymbol{e}_{x} + A_{yz} \\boldsymbol{e}_{y} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto - A_{1} \\boldsymbol{e}_{y} - A_{2} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto A_{1} \\boldsymbol{e}_{x} - A_{3} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto A_{2} \\boldsymbol{e}_{x} + A_{3} \\boldsymbol{e}_{y} \\end{aligned} \\right\\} \\end{equation*}\n", "2d general ($A,\\;B$ are linear transformations)\n", "\\begin{equation*} g = \\left[\\begin{array}{cc}\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) & \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\\\\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) & \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) \\end{array}\\right] \\end{equation*}\n", "\\begin{equation*} g^{-1} = \\left[\\begin{array}{cc}\\frac{\\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) }{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} & - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) }{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\\\- \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) }{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} & \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) }{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\end{array}\\right] \\end{equation*}\n", "\\begin{equation*} gg^{-1} = \\left[\\begin{array}{cc}1 & 0\\\\0 & 1\\end{array}\\right] \\end{equation*}\n", - "\\begin{equation*} A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} \\f{mat}{A} = \\left[\\begin{array}{cc}A_{uu} & A_{uv}\\\\A_{vu} & A_{vv}\\end{array}\\right] \\end{equation*}\n", - "\\begin{equation*} \\f{\\det}{A} = \\frac{- \\left(\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{uv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\left(- \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{u}\\wedge \\boldsymbol{e}_{v} + \\left(\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{vv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\left(- \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{u}\\wedge \\boldsymbol{e}_{v}}{\\sqrt{\\left (\\left(\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{uv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{u} + \\left(\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{vv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{v}\\cdot \\left(\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{uv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{u} + \\left(\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{vv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{v}\\right ) \\left (\\left(- \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{u} + \\left(- \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{v}\\cdot \\left(- \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{u} + \\left(- \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{v}\\right ) - \\left (\\left(- \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{u} + \\left(- \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{v}\\cdot \\left(\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{uv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{u} + \\left(\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{vv}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\right) \\boldsymbol{e}_{v}\\right ) ^{2}}} \\end{equation*}\n", - "\\begin{equation*} \\overline{A} = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} \\boldsymbol{e}_{u} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{3} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} \\boldsymbol{e}_{u} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} \\f{mat}{\\overline{A}} = \\left[\\begin{array}{cc}\\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left(\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vu}\\right) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left(\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vv} - \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vu}\\right)}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} & \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vv} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4} A_{vu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uv} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4} A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}}\\\\\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{4} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{3} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{3} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vv} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} & \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left(\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{3} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}\\right) + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) \\left(\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vu}\\right)}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} - 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}}\\end{array}\\right] \\end{equation*}\n", - "\\begin{equation*} \\f{\\Tr}{A} = - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{vv}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} A_{uu}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{uv}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{3} A_{vu}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} + 2 \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{4}} \\end{equation*}\n", - "\\begin{equation*} \\f{A}{e_u\\W e_v} = \\frac{A_{uu} A_{vv} - A_{uv} A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u}\\wedge \\boldsymbol{e}_{v} \\end{equation*}\n", - "\\begin{equation*} \\f{A}{e_u}\\W \\f{A}{e_v} = \\frac{A_{uu} A_{vv} - A_{uv} A_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u}\\wedge \\boldsymbol{e}_{v} \\end{equation*}\n", - "\\begin{equation*} B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{uv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) B_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{vv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) B_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) B_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) B_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} A + B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{uv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) B_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{vv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) B_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) B_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{vv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) B_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} A - B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{uv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} - \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) B_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vv} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{vv} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu} - \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) B_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) B_{uv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{uu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{uu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) A_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) B_{vv} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) A_{vu} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) B_{vu}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto {A^{u}}_{u} \\boldsymbol{e}_{u} + {A^{v}}_{u} \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto {A^{u}}_{v} \\boldsymbol{e}_{u} + {A^{v}}_{v} \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} \\f{mat}{A} = \\left[\\begin{array}{cc}{A^{u}}_{u} & {A^{u}}_{v}\\\\{A^{v}}_{u} & {A^{v}}_{v}\\end{array}\\right] \\end{equation*}\n", + "\\begin{equation*} \\f{\\det}{A} = - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{u} {A^{v}}_{v}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{v} {A^{v}}_{u}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{u}}_{u} {A^{v}}_{v}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{u}}_{v} {A^{v}}_{u}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\end{equation*}\n", + "\\begin{equation*} \\overline{A} = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{v} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{u} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{v}}_{v} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{u}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} {A^{u}}_{v} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{u} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{v} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{v}}_{u}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{u}}_{v} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{u} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{v} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{v}}_{u}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{u} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{v} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{v} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{u}}_{u} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{u}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} \\f{mat}{\\overline{A}} = \\left[\\begin{array}{cc}\\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{v} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{u} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{v}}_{v} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{u}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} & \\frac{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{u}}_{v} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{u} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{v} + \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{v}}_{u}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\\\\\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) ^{2} {A^{u}}_{v} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{u} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{v} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{v}}_{u}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} & \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{v} + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{v} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{u}}_{u} - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{u}}{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) - \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}}\\end{array}\\right] \\end{equation*}\n", + "\\begin{equation*} \\f{\\Tr}{A} = - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{u}}_{u}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} - \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) {A^{v}}_{v}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{u}}_{u}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} + \\frac{\\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2} {A^{v}}_{v}}{- \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{u}\\right ) \\left (\\boldsymbol{e}_{v}\\cdot \\boldsymbol{e}_{v}\\right ) + \\left (\\boldsymbol{e}_{u}\\cdot \\boldsymbol{e}_{v}\\right ) ^{2}} \\end{equation*}\n", + "\\begin{equation*} \\f{A}{e_u\\W e_v} = \\left ( {A^{u}}_{u} {A^{v}}_{v} - {A^{u}}_{v} {A^{v}}_{u}\\right ) \\boldsymbol{e}_{u}\\wedge \\boldsymbol{e}_{v} \\end{equation*}\n", + "\\begin{equation*} \\f{A}{e_u}\\W \\f{A}{e_v} = \\left ( {A^{u}}_{u} {A^{v}}_{v} - {A^{u}}_{v} {A^{v}}_{u}\\right ) \\boldsymbol{e}_{u}\\wedge \\boldsymbol{e}_{v} \\end{equation*}\n", + "\\begin{equation*} B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto {B^{u}}_{u} \\boldsymbol{e}_{u} + {B^{v}}_{u} \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto {B^{u}}_{v} \\boldsymbol{e}_{u} + {B^{v}}_{v} \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} A + B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto \\left ( {A^{u}}_{u} + {B^{u}}_{u}\\right ) \\boldsymbol{e}_{u} + \\left ( {A^{v}}_{u} + {B^{v}}_{u}\\right ) \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto \\left ( {A^{u}}_{v} + {B^{u}}_{v}\\right ) \\boldsymbol{e}_{u} + \\left ( {A^{v}}_{v} + {B^{v}}_{v}\\right ) \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} A - B = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{u} &\\mapsto \\left ( {A^{u}}_{u} - {B^{u}}_{u}\\right ) \\boldsymbol{e}_{u} + \\left ( {A^{v}}_{u} - {B^{v}}_{u}\\right ) \\boldsymbol{e}_{v} \\\\ \\boldsymbol{e}_{v} &\\mapsto \\left ( {A^{u}}_{v} - {B^{u}}_{v}\\right ) \\boldsymbol{e}_{u} + \\left ( {A^{v}}_{v} - {B^{v}}_{v}\\right ) \\boldsymbol{e}_{v} \\end{aligned} \\right\\} \\end{equation*}\n", "\\begin{equation*} a\\cdot \\f{\\overline{A}}{b}-b\\cdot \\f{\\underline{A}}{a} = 0 \\end{equation*}\n", "\\begin{equation*} g = \\left[\\begin{array}{cccc}1 & 0 & 0 & 0\\\\0 & -1 & 0 & 0\\\\0 & 0 & -1 & 0\\\\0 & 0 & 0 & -1\\end{array}\\right] \\end{equation*}\n", - "\\begin{equation*} \\underline{T} = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{t} &\\mapsto T_{tt} \\boldsymbol{e}_{t} + T_{xt} \\boldsymbol{e}_{x} + T_{yt} \\boldsymbol{e}_{y} + T_{zt} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{x} &\\mapsto - T_{tx} \\boldsymbol{e}_{t} - T_{xx} \\boldsymbol{e}_{x} - T_{yx} \\boldsymbol{e}_{y} - T_{zx} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto - T_{ty} \\boldsymbol{e}_{t} - T_{xy} \\boldsymbol{e}_{x} - T_{yy} \\boldsymbol{e}_{y} - T_{zy} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto - T_{tz} \\boldsymbol{e}_{t} - T_{xz} \\boldsymbol{e}_{x} - T_{yz} \\boldsymbol{e}_{y} - T_{zz} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} \\overline{T} = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{t} &\\mapsto T_{tt} \\boldsymbol{e}_{t} + T_{tx} \\boldsymbol{e}_{x} + T_{ty} \\boldsymbol{e}_{y} + T_{tz} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{x} &\\mapsto - T_{xt} \\boldsymbol{e}_{t} - T_{xx} \\boldsymbol{e}_{x} - T_{xy} \\boldsymbol{e}_{y} - T_{xz} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto - T_{yt} \\boldsymbol{e}_{t} - T_{yx} \\boldsymbol{e}_{x} - T_{yy} \\boldsymbol{e}_{y} - T_{yz} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto - T_{zt} \\boldsymbol{e}_{t} - T_{zx} \\boldsymbol{e}_{x} - T_{zy} \\boldsymbol{e}_{y} - T_{zz} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", - "\\begin{equation*} \\f{\\det}{\\underline{T}} = T_{tz} \\left(T_{xt} T_{yx} T_{zy} - T_{xt} T_{yy} T_{zx} - T_{xx} T_{yt} T_{zy} + T_{xx} T_{yy} T_{zt} + T_{xy} T_{yt} T_{zx} - T_{xy} T_{yx} T_{zt}\\right) - T_{xz} \\left(T_{tt} T_{yx} T_{zy} - T_{tt} T_{yy} T_{zx} - T_{tx} T_{yt} T_{zy} + T_{tx} T_{yy} T_{zt} + T_{ty} T_{yt} T_{zx} - T_{ty} T_{yx} T_{zt}\\right) + T_{yz} \\left(T_{tt} T_{xx} T_{zy} - T_{tt} T_{xy} T_{zx} - T_{tx} T_{xt} T_{zy} + T_{tx} T_{xy} T_{zt} + T_{ty} T_{xt} T_{zx} - T_{ty} T_{xx} T_{zt}\\right) - T_{zz} \\left(T_{tt} T_{xx} T_{yy} - T_{tt} T_{xy} T_{yx} - T_{tx} T_{xt} T_{yy} + T_{tx} T_{xy} T_{yt} + T_{ty} T_{xt} T_{yx} - T_{ty} T_{xx} T_{yt}\\right) \\end{equation*}\n", - "\\begin{equation*} \\f{\\mbox{tr}}{\\underline{T}} = T_{tt} - T_{xx} - T_{yy} - T_{zz} \\end{equation*}\n", + "\\begin{equation*} \\underline{T} = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{t} &\\mapsto {T^{t}}_{t} \\boldsymbol{e}_{t} + {T^{x}}_{t} \\boldsymbol{e}_{x} + {T^{y}}_{t} \\boldsymbol{e}_{y} + {T^{z}}_{t} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{x} &\\mapsto {T^{t}}_{x} \\boldsymbol{e}_{t} + {T^{x}}_{x} \\boldsymbol{e}_{x} + {T^{y}}_{x} \\boldsymbol{e}_{y} + {T^{z}}_{x} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto {T^{t}}_{y} \\boldsymbol{e}_{t} + {T^{x}}_{y} \\boldsymbol{e}_{x} + {T^{y}}_{y} \\boldsymbol{e}_{y} + {T^{z}}_{y} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto {T^{t}}_{z} \\boldsymbol{e}_{t} + {T^{x}}_{z} \\boldsymbol{e}_{x} + {T^{y}}_{z} \\boldsymbol{e}_{y} + {T^{z}}_{z} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} \\overline{T} = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{t} &\\mapsto {T^{t}}_{t} \\boldsymbol{e}_{t} - {T^{t}}_{x} \\boldsymbol{e}_{x} - {T^{t}}_{y} \\boldsymbol{e}_{y} - {T^{t}}_{z} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{x} &\\mapsto - {T^{x}}_{t} \\boldsymbol{e}_{t} + {T^{x}}_{x} \\boldsymbol{e}_{x} + {T^{x}}_{y} \\boldsymbol{e}_{y} + {T^{x}}_{z} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto - {T^{y}}_{t} \\boldsymbol{e}_{t} + {T^{y}}_{x} \\boldsymbol{e}_{x} + {T^{y}}_{y} \\boldsymbol{e}_{y} + {T^{y}}_{z} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto - {T^{z}}_{t} \\boldsymbol{e}_{t} + {T^{z}}_{x} \\boldsymbol{e}_{x} + {T^{z}}_{y} \\boldsymbol{e}_{y} + {T^{z}}_{z} \\boldsymbol{e}_{z} \\end{aligned} \\right\\} \\end{equation*}\n", + "\\begin{equation*} \\f{\\det}{\\underline{T}} = {T^{t}}_{t} {T^{x}}_{x} {T^{y}}_{y} {T^{z}}_{z} - {T^{t}}_{t} {T^{x}}_{x} {T^{y}}_{z} {T^{z}}_{y} - {T^{t}}_{t} {T^{x}}_{y} {T^{y}}_{x} {T^{z}}_{z} + {T^{t}}_{t} {T^{x}}_{y} {T^{y}}_{z} {T^{z}}_{x} + {T^{t}}_{t} {T^{x}}_{z} {T^{y}}_{x} {T^{z}}_{y} - {T^{t}}_{t} {T^{x}}_{z} {T^{y}}_{y} {T^{z}}_{x} - {T^{t}}_{x} {T^{x}}_{t} {T^{y}}_{y} {T^{z}}_{z} + {T^{t}}_{x} {T^{x}}_{t} {T^{y}}_{z} {T^{z}}_{y} + {T^{t}}_{x} {T^{x}}_{y} {T^{y}}_{t} {T^{z}}_{z} - {T^{t}}_{x} {T^{x}}_{y} {T^{y}}_{z} {T^{z}}_{t} - {T^{t}}_{x} {T^{x}}_{z} {T^{y}}_{t} {T^{z}}_{y} + {T^{t}}_{x} {T^{x}}_{z} {T^{y}}_{y} {T^{z}}_{t} + {T^{t}}_{y} {T^{x}}_{t} {T^{y}}_{x} {T^{z}}_{z} - {T^{t}}_{y} {T^{x}}_{t} {T^{y}}_{z} {T^{z}}_{x} - {T^{t}}_{y} {T^{x}}_{x} {T^{y}}_{t} {T^{z}}_{z} + {T^{t}}_{y} {T^{x}}_{x} {T^{y}}_{z} {T^{z}}_{t} + {T^{t}}_{y} {T^{x}}_{z} {T^{y}}_{t} {T^{z}}_{x} - {T^{t}}_{y} {T^{x}}_{z} {T^{y}}_{x} {T^{z}}_{t} - {T^{t}}_{z} {T^{x}}_{t} {T^{y}}_{x} {T^{z}}_{y} + {T^{t}}_{z} {T^{x}}_{t} {T^{y}}_{y} {T^{z}}_{x} + {T^{t}}_{z} {T^{x}}_{x} {T^{y}}_{t} {T^{z}}_{y} - {T^{t}}_{z} {T^{x}}_{x} {T^{y}}_{y} {T^{z}}_{t} - {T^{t}}_{z} {T^{x}}_{y} {T^{y}}_{t} {T^{z}}_{x} + {T^{t}}_{z} {T^{x}}_{y} {T^{y}}_{x} {T^{z}}_{t} \\end{equation*}\n", + "\\begin{equation*} \\f{\\mbox{tr}}{\\underline{T}} = {T^{t}}_{t} + {T^{x}}_{x} + {T^{y}}_{y} + {T^{z}}_{z} \\end{equation*}\n", "\\begin{equation*} a\\cdot \\f{\\overline{T}}{b}-b\\cdot \\f{\\underline{T}}{a} = 0 \\end{equation*}\n", "\\begin{equation*} f = f \\end{equation*}\n", "\\begin{equation*} \\boldsymbol{\\nabla} f = \\partial_{u} f \\boldsymbol{e}_{u} + \\frac{\\partial_{v} f }{\\sin{\\left (u \\right )}} \\boldsymbol{e}_{v} \\end{equation*}\n", diff --git a/examples/ipython/simple_ga_test.ipynb b/examples/ipython/simple_ga_test.ipynb index 3567610c..9891d78b 100644 --- a/examples/ipython/simple_ga_test.ipynb +++ b/examples/ipython/simple_ga_test.ipynb @@ -284,9 +284,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [], "source": [ "A = o3d.lt('A')" @@ -300,12 +298,12 @@ { "data": { "text/latex": [ - "\\begin{equation*}\\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto A_{xx} \\boldsymbol{e}_{x} + A_{yx} \\boldsymbol{e}_{y} + A_{zx} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto A_{xy} \\boldsymbol{e}_{x} + A_{yy} \\boldsymbol{e}_{y} + A_{zy} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto A_{xz} \\boldsymbol{e}_{x} + A_{yz} \\boldsymbol{e}_{y} + A_{zz} \\boldsymbol{e}_{z} \\end{aligned} \\right\\}\\end{equation*}" + "\\begin{equation*}\\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto {A^{x}}_{x} \\boldsymbol{e}_{x} + {A^{y}}_{x} \\boldsymbol{e}_{y} + {A^{z}}_{x} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto {A^{x}}_{y} \\boldsymbol{e}_{x} + {A^{y}}_{y} \\boldsymbol{e}_{y} + {A^{z}}_{y} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto {A^{x}}_{z} \\boldsymbol{e}_{x} + {A^{y}}_{z} \\boldsymbol{e}_{y} + {A^{z}}_{z} \\boldsymbol{e}_{z} \\end{aligned} \\right\\}\\end{equation*}" ], "text/plain": [ - "Lt(e_x) = A_xx*e_x + A_yx*e_y + A_zx*e_z\n", - "Lt(e_y) = A_xy*e_x + A_yy*e_y + A_zy*e_z\n", - "Lt(e_z) = A_xz*e_x + A_yz*e_y + A_zz*e_z" + "Lt(e_x) = {A__x}_x*e_x + {A__y}_x*e_y + {A__z}_x*e_z\n", + "Lt(e_y) = {A__x}_y*e_x + {A__y}_y*e_y + {A__z}_y*e_z\n", + "Lt(e_z) = {A__x}_z*e_x + {A__y}_z*e_y + {A__z}_z*e_z" ] }, "execution_count": 18, @@ -327,12 +325,12 @@ { "data": { "text/latex": [ - "\\begin{equation*}A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto A_{xx} \\boldsymbol{e}_{x} + A_{yx} \\boldsymbol{e}_{y} + A_{zx} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto A_{xy} \\boldsymbol{e}_{x} + A_{yy} \\boldsymbol{e}_{y} + A_{zy} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto A_{xz} \\boldsymbol{e}_{x} + A_{yz} \\boldsymbol{e}_{y} + A_{zz} \\boldsymbol{e}_{z} \\end{aligned} \\right\\}\\end{equation*}" + "\\begin{equation*}A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto {A^{x}}_{x} \\boldsymbol{e}_{x} + {A^{y}}_{x} \\boldsymbol{e}_{y} + {A^{z}}_{x} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto {A^{x}}_{y} \\boldsymbol{e}_{x} + {A^{y}}_{y} \\boldsymbol{e}_{y} + {A^{z}}_{y} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto {A^{x}}_{z} \\boldsymbol{e}_{x} + {A^{y}}_{z} \\boldsymbol{e}_{y} + {A^{z}}_{z} \\boldsymbol{e}_{z} \\end{aligned} \\right\\}\\end{equation*}" ], "text/plain": [ - "A = Lt(e_x) = A_xx*e_x + A_yx*e_y + A_zx*e_z\n", - "Lt(e_y) = A_xy*e_x + A_yy*e_y + A_zy*e_z\n", - "Lt(e_z) = A_xz*e_x + A_yz*e_y + A_zz*e_z" + "A = Lt(e_x) = {A__x}_x*e_x + {A__y}_x*e_y + {A__z}_x*e_z\n", + "Lt(e_y) = {A__x}_y*e_x + {A__y}_y*e_y + {A__z}_y*e_z\n", + "Lt(e_z) = {A__x}_z*e_x + {A__y}_z*e_y + {A__z}_z*e_z" ] }, "execution_count": 19, @@ -352,12 +350,12 @@ { "data": { "text/latex": [ - "\\begin{equation*}A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto A_{xx} \\boldsymbol{e}_{x} + A_{yx} \\boldsymbol{e}_{y} + A_{zx} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto A_{xy} \\boldsymbol{e}_{x} + A_{yy} \\boldsymbol{e}_{y} + A_{zy} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto A_{xz} \\boldsymbol{e}_{x} + A_{yz} \\boldsymbol{e}_{y} + A_{zz} \\boldsymbol{e}_{z} \\end{aligned} \\right\\}\\end{equation*}" + "\\begin{equation*}A = \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto {A^{x}}_{x} \\boldsymbol{e}_{x} + {A^{y}}_{x} \\boldsymbol{e}_{y} + {A^{z}}_{x} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{y} &\\mapsto {A^{x}}_{y} \\boldsymbol{e}_{x} + {A^{y}}_{y} \\boldsymbol{e}_{y} + {A^{z}}_{y} \\boldsymbol{e}_{z} \\\\ \\boldsymbol{e}_{z} &\\mapsto {A^{x}}_{z} \\boldsymbol{e}_{x} + {A^{y}}_{z} \\boldsymbol{e}_{y} + {A^{z}}_{z} \\boldsymbol{e}_{z} \\end{aligned} \\right\\}\\end{equation*}" ], "text/plain": [ - "A = Lt(e_x) = A_xx*e_x + A_yx*e_y + A_zx*e_z\n", - "Lt(e_y) = A_xy*e_x + A_yy*e_y + A_zy*e_z\n", - "Lt(e_z) = A_xz*e_x + A_yz*e_y + A_zz*e_z" + "A = Lt(e_x) = {A__x}_x*e_x + {A__y}_x*e_y + {A__z}_x*e_z\n", + "Lt(e_y) = {A__x}_y*e_x + {A__y}_y*e_y + {A__z}_y*e_z\n", + "Lt(e_z) = {A__x}_z*e_x + {A__y}_z*e_y + {A__z}_z*e_z" ] }, "execution_count": 20, @@ -379,7 +377,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -393,9 +391,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.0" + "version": "3.11.8" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } From ff354e263e8cd9dc1497cb01be371e5a2e274cf5 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 12:21:00 +0800 Subject: [PATCH 09/78] Add gprinter.py by Alan Bromborsky as the version adopted by GSG Co-authored-by: Alan Bromborsky --- galgebra/gprinter.py | 283 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 283 insertions(+) create mode 100644 galgebra/gprinter.py diff --git a/galgebra/gprinter.py b/galgebra/gprinter.py new file mode 100644 index 00000000..1352b5b8 --- /dev/null +++ b/galgebra/gprinter.py @@ -0,0 +1,283 @@ +from galgebra.printer import GaLatexPrinter, isinteractive, Format_cnt, latex +import subprocess,sys,shutil + +from sympy import init_printing + +try: + from IPython.display import display, Latex, Math, display_latex +except ImportError: + pass +try: + from sympy.interactive import printing +except ImportError: + pass + +SYS_CMD = {'linux2': {'rm': 'rm', 'evince': 'evince', 'null': ' > /dev/null', '&': '&'}, + 'linux': {'rm': 'rm', 'evince': 'evince', 'null': ' > /dev/null', '&': '&'}, + 'win32': {'rm': 'del', 'evince': 'start', 'null': ' > NUL', '&': ''}, + 'darwin': {'rm': 'rm', 'evince': 'open', 'null': ' > /dev/null', '&': '&'}} + +class LaTeX: + +#LaTeX data + + line_sep = \ +""" +************************************************************************ +""" + latex_flg = False + latex_str = '' + + latex_preamble = \ +""" +\\pagestyle{empty} +\\usepackage[latin1]{inputenc} +\\usepackage{amsmath} +\\usepackage{amsfonts} +\\usepackage{amssymb} +\\usepackage{amsbsy} +\\usepackage{tensor} +\\usepackage{listings} +\\usepackage{color} +\\usepackage{xcolor} +\\usepackage{bm} +\\usepackage{breqn} +\\definecolor{gray}{rgb}{0.95,0.95,0.95} +\\setlength{\\parindent}{0pt} +\\DeclareMathOperator{\\Tr}{Tr} +\\DeclareMathOperator{\\Adj}{Adj} +\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}} +\\newcommand{\\lp}{\\left (} +\\newcommand{\\rp}{\\right )} +\\newcommand{\\paren}[1]{\\lp {#1} \\rp} +\\newcommand{\\half}{\\frac{1}{2}} +\\newcommand{\\llt}{\\left <} +\\newcommand{\\rgt}{\\right >} +\\newcommand{\\abs}[1]{\\left |{#1}\\right | } +\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}} +\\newcommand{\\lbrc}{\\left \\{} +\\newcommand{\\rbrc}{\\right \\}} +\\newcommand{\\W}{\\wedge} +\\newcommand{\\prm}[1]{{#1}^{\prime}} +\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}} +\\newcommand{\\R}{\\dagger} +\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}} +\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}} +\\newcommand{\\f}[2]{{#1}\\lp{#2}\\rp} +\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}} +\\newcommand{\\Nabla}{\\boldsymbol{\\nabla}} +\\newcommand{\\eb}{\\boldsymbol{e}} +\\newcommand{\\bs}[1]{\\boldsymbol{#1}} +\\newcommand{\\grad}{\\bs{\\nabla}} +\\usepackage{float} +\\floatstyle{plain} % optionally change the style of the new float +\\newfloat{Code}{H}{myc} +\\lstloadlanguages{Python} +\\begin{document} + +""" + + ip_cmds = \ +[r'$$\DeclareMathOperator{\Tr}{Tr}$$',\ +r'$$\DeclareMathOperator{\Adj}{Adj}$$',\ +r'$$\newcommand{\bfrac}[2]{\displaystyle\frac{#1}{#2}}$$',\ +r'$$\newcommand{\lp}{\left (}$$',\ +r'$$\newcommand{\rp}{\right )}$$',\ +r'$$\newcommand{\paren}[1]{\lp {#1} \rp}$$',\ +r'$$\newcommand{\half}{\frac{1}{2}}$$',\ +r'$$\newcommand{\llt}{\left <}$$',\ +r'$$\newcommand{\rgt}{\right >}$$',\ +r'$$\newcommand{\abs}[1]{\left |{#1}\right | }$$',\ +r'$$\newcommand{\pdiff}[2]{\bfrac{\partial {#1}}{\partial {#2}}}$$',\ +r'$$\newcommand{\npdiff}[3]{\bfrac{\partial^{#3} {#1}}{\partial {#2}^{#3}}}$$',\ +r'$$\newcommand{\lbrc}{\left \{}$$',\ +r'$$\newcommand{\rbrc}{\right \}}$$',\ +r'$$\newcommand{\W}{\wedge}$$',\ +r'$$\newcommand{\prm}[1]{{#1}^{\prime}}$$',\ +r'$$\newcommand{\ddt}[1]{\bfrac{d{#1}}{dt}}$$',\ +r'$$\newcommand{\R}{\dagger}$$',\ +r'$$\newcommand{\deriv}[3]{\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$',\ +r'$$\newcommand{\grade}[2]{\left < {#1} \right >_{#2}}$$',\ +r'$$\newcommand{\f}[2]{{#1}\lp {#2} \rp}$$',\ +r'$$\newcommand{\eval}[2]{\left . {#1} \right |_{#2}}$$',\ +r'$$\newcommand{\bs}[1]{\boldsymbol{#1}}$$',\ +r'$$\newcommand{\grad}{\bs{\nabla}}$$'] + +#*********************************************************************** + +def gFormat(Fmode: bool = True, Dmode: bool = True, inverse='full'): + r""" + Turns on latex printing with configurable options. + + This redirects printer output so that latex compiler can capture it. + + ``Format()`` is also required for printing from *ipython notebook* (note that ``xpdf()`` is not needed to print from *ipython notebook*). + + Parameters + ---------- + Fmode: + Value for the ``omit_function_args`` setting of + :class:`GaLatexPrinter`. + Dmode: + Value for the ``omit_partial_derivative_fraction`` setting of + :class:`GaLatexPrinter`. + """ + global Format_cnt + + GaLatexPrinter.set_global_settings( + omit_partial_derivative_fraction=Dmode, + omit_function_args=Fmode, + inv_trig_style=inverse, + ) + + if Format_cnt == 0: + Format_cnt += 1 + + LaTeX.latex_flg = True + + if isinteractive(): + init_printing(use_latex='mathjax') + from IPython.display import Math, display + cmds = '\n'.join(LaTeX.ip_cmds) + display(Math(cmds)) + + return + +def gprint(*xargs): + """ + Print latex or text from python script or latex from Jupyter Notebook/Lab + + """ + x = [] + fstr = '' + new_eq_flg = False + i = 0 + for xi in xargs: + if isinstance(xi,str): + if r'\\' in xi and i > 0: + if isinteractive(): + xi_rep = xi.replace(r'\\',r'\end{equation*}@\begin{equation*} ') + else: + xi_rep = xi.replace(r'\\',r'\end{equation*}'+'\n'+r'\begin{equation*} ') + new_eq_flg = True + fstr += xi_rep + else: + fstr += xi + elif isinstance(xi,type): + if LaTeX.latex_flg: + fstr += r' \text{'+str(xi)+'} ' + else: + fstr += str(xi) + else: + if LaTeX.latex_flg: + x.append(latex(xi)) + if new_eq_flg: + new_eq_flg = False + fstr += r' %s ' + else: + x.append(str(xi)) + fstr += r' %s ' + + i += 1 + + if LaTeX.latex_flg: + if isinteractive(): + lstr = fstr % tuple(x) + if '@' in lstr: + lines = lstr.split('@') + lines[0] = r'\begin{equation*} '+lines[0] + lines[-1] += r'\end{equation*}' + for line in lines: + display(Math(line)) + else: + display(Math(lstr)) + else: + LaTeX.latex_str += r'\begin{equation*} ' + (fstr % tuple(x)) + r'\end{equation*} '+'\n' + else: + print(fstr % tuple(x)) + + return + +def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debug=False, pt='10pt', pdfprog='pdflatex'): + + """ + Post processes LaTeX output (see comments below), adds preamble and + postscript, generates tex file, inputs file to latex, displays resulting + pdf file. + + Arg Value Result + pdfprog 'pdflatex' Use pdfprog to generate pdf output, only generate tex if pdfprog is None + crop True Use "pdfcrop" to crop output file (pdfcrop must be installed, linux only) + png True Use "convert" to produce png output (imagemagick must be installed, linux only) + + We assume that if xpdf() is called then Format() has been called at the beginning of the program. + """ + + + latex_str = paper_format(paper,pt)+LaTeX.latex_preamble+LaTeX.latex_str+r'\end{document}' + + if filename is None: + pyfilename = sys.argv[0] + rootfilename = pyfilename.replace('.py', '') + tex_filename = rootfilename + '.tex' + pdf_filename = rootfilename + '.pdf' + else: + tex_filename = filename + pdf_filename = tex_filename.replace('.tex','.pdf') + + if debug: + print('latex file =', filename) + + latex_file = open(tex_filename, 'w') + latex_file.write(latex_str) + latex_file.close() + + if pdfprog is not None: + sys_cmd = SYS_CMD[sys.platform] + pdflatex = shutil.which(pdfprog) + + if debug: # Display latex excution output for debugging purposes + print('pdflatex path =', pdflatex) + #os.system(pdfprog + ' ' + filename[:-4]) + else: # Works for Linux don't know about Windows + subprocess.call([pdfprog,tex_filename,sys_cmd['null']]) + #os.system(pdfprog + ' ' + filename[:-4] + sys_cmd['null']) + + subprocess.call([sys_cmd['evince'],pdf_filename]) + + #eval(input('!!!!Return to continue!!!!\n')) + + if debug: + subprocess.call([sys_cmd['rm'],rootfilename+'.aux ',rootfilename+'.log']) + else: + subprocess.call([sys_cmd['rm'],rootfilename+'.aux ',rootfilename+'.log ',rootfilename+'.tex']) + if crop: + subprocess.call(['pdfcrop',pdf_filename]) + subprocess.call(['rm',pdf_filename]) + subprocess.call(['mv',rootfilename+'-crop.pdf', pdf_filename]) + if png: + subprocess.call(['Pdf2Png',rootfilename]) + return + +def paper_format(paper,pt): #Set size of paper and font size + + if paper == 'letter': + paper_size = \ +""" +\\documentclass[@10pt@,fleqn]{book} +""" + else: + paper_size = \ +""" +\\documentclass[@10pt@,fleqn]{book} +\\usepackage[vcentering]{geometry} +""" + if paper == 'landscape': + paper = [11, 8.5] + paper_size += '\\geometry{papersize={' + str(paper[0]) + \ + 'in,' + str(paper[1]) + 'in},total={' + str(paper[0] - 1) + \ + 'in,' + str(paper[1] - 1) + 'in}}\n' + + paper_size = paper_size.replace('@10pt@', pt) + + return(paper_size) From 6e1e6fdb59c644001d84dd4b5bee6ab0f9bff87c Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 12:19:57 +0800 Subject: [PATCH 10/78] lint --- galgebra/gprinter.py | 126 +++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 65 deletions(-) diff --git a/galgebra/gprinter.py b/galgebra/gprinter.py index 1352b5b8..ce6912bb 100644 --- a/galgebra/gprinter.py +++ b/galgebra/gprinter.py @@ -1,14 +1,12 @@ -from galgebra.printer import GaLatexPrinter, isinteractive, Format_cnt, latex -import subprocess,sys,shutil +from .printer import GaLatexPrinter, isinteractive, latex +import subprocess +import sys +import shutil from sympy import init_printing try: - from IPython.display import display, Latex, Math, display_latex -except ImportError: - pass -try: - from sympy.interactive import printing + from IPython.display import display, Math except ImportError: pass @@ -17,19 +15,16 @@ 'win32': {'rm': 'del', 'evince': 'start', 'null': ' > NUL', '&': ''}, 'darwin': {'rm': 'rm', 'evince': 'open', 'null': ' > /dev/null', '&': '&'}} -class LaTeX: - -#LaTeX data - line_sep = \ -""" +class LaTeX: + # LaTeX data + line_sep = """ ************************************************************************ """ latex_flg = False latex_str = '' - latex_preamble = \ -""" + latex_preamble = """ \\pagestyle{empty} \\usepackage[latin1]{inputenc} \\usepackage{amsmath} @@ -78,32 +73,33 @@ class LaTeX: """ ip_cmds = \ -[r'$$\DeclareMathOperator{\Tr}{Tr}$$',\ -r'$$\DeclareMathOperator{\Adj}{Adj}$$',\ -r'$$\newcommand{\bfrac}[2]{\displaystyle\frac{#1}{#2}}$$',\ -r'$$\newcommand{\lp}{\left (}$$',\ -r'$$\newcommand{\rp}{\right )}$$',\ -r'$$\newcommand{\paren}[1]{\lp {#1} \rp}$$',\ -r'$$\newcommand{\half}{\frac{1}{2}}$$',\ -r'$$\newcommand{\llt}{\left <}$$',\ -r'$$\newcommand{\rgt}{\right >}$$',\ -r'$$\newcommand{\abs}[1]{\left |{#1}\right | }$$',\ -r'$$\newcommand{\pdiff}[2]{\bfrac{\partial {#1}}{\partial {#2}}}$$',\ -r'$$\newcommand{\npdiff}[3]{\bfrac{\partial^{#3} {#1}}{\partial {#2}^{#3}}}$$',\ -r'$$\newcommand{\lbrc}{\left \{}$$',\ -r'$$\newcommand{\rbrc}{\right \}}$$',\ -r'$$\newcommand{\W}{\wedge}$$',\ -r'$$\newcommand{\prm}[1]{{#1}^{\prime}}$$',\ -r'$$\newcommand{\ddt}[1]{\bfrac{d{#1}}{dt}}$$',\ -r'$$\newcommand{\R}{\dagger}$$',\ -r'$$\newcommand{\deriv}[3]{\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$',\ -r'$$\newcommand{\grade}[2]{\left < {#1} \right >_{#2}}$$',\ -r'$$\newcommand{\f}[2]{{#1}\lp {#2} \rp}$$',\ -r'$$\newcommand{\eval}[2]{\left . {#1} \right |_{#2}}$$',\ -r'$$\newcommand{\bs}[1]{\boldsymbol{#1}}$$',\ -r'$$\newcommand{\grad}{\bs{\nabla}}$$'] - -#*********************************************************************** + [r'$$\DeclareMathOperator{\Tr}{Tr}$$', + r'$$\DeclareMathOperator{\Adj}{Adj}$$', + r'$$\newcommand{\bfrac}[2]{\displaystyle\frac{#1}{#2}}$$', + r'$$\newcommand{\lp}{\left (}$$', + r'$$\newcommand{\rp}{\right )}$$', + r'$$\newcommand{\paren}[1]{\lp {#1} \rp}$$', + r'$$\newcommand{\half}{\frac{1}{2}}$$', + r'$$\newcommand{\llt}{\left <}$$', + r'$$\newcommand{\rgt}{\right >}$$', + r'$$\newcommand{\abs}[1]{\left |{#1}\right | }$$', + r'$$\newcommand{\pdiff}[2]{\bfrac{\partial {#1}}{\partial {#2}}}$$', + r'$$\newcommand{\npdiff}[3]{\bfrac{\partial^{#3} {#1}}{\partial {#2}^{#3}}}$$', + r'$$\newcommand{\lbrc}{\left \{}$$', + r'$$\newcommand{\rbrc}{\right \}}$$', + r'$$\newcommand{\W}{\wedge}$$', + r'$$\newcommand{\prm}[1]{{#1}^{\prime}}$$', + r'$$\newcommand{\ddt}[1]{\bfrac{d{#1}}{dt}}$$', + r'$$\newcommand{\R}{\dagger}$$', + r'$$\newcommand{\deriv}[3]{\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$', + r'$$\newcommand{\grade}[2]{\left < {#1} \right >_{#2}}$$', + r'$$\newcommand{\f}[2]{{#1}\lp {#2} \rp}$$', + r'$$\newcommand{\eval}[2]{\left . {#1} \right |_{#2}}$$', + r'$$\newcommand{\bs}[1]{\boldsymbol{#1}}$$', + r'$$\newcommand{\grad}{\bs{\nabla}}$$'] + +# *********************************************************************** + def gFormat(Fmode: bool = True, Dmode: bool = True, inverse='full'): r""" @@ -143,6 +139,7 @@ def gFormat(Fmode: bool = True, Dmode: bool = True, inverse='full'): return + def gprint(*xargs): """ Print latex or text from python script or latex from Jupyter Notebook/Lab @@ -153,17 +150,17 @@ def gprint(*xargs): new_eq_flg = False i = 0 for xi in xargs: - if isinstance(xi,str): + if isinstance(xi, str): if r'\\' in xi and i > 0: if isinteractive(): - xi_rep = xi.replace(r'\\',r'\end{equation*}@\begin{equation*} ') + xi_rep = xi.replace(r'\\', r'\end{equation*}@\begin{equation*} ') else: - xi_rep = xi.replace(r'\\',r'\end{equation*}'+'\n'+r'\begin{equation*} ') + xi_rep = xi.replace(r'\\', r'\end{equation*}'+'\n'+r'\begin{equation*} ') new_eq_flg = True fstr += xi_rep else: fstr += xi - elif isinstance(xi,type): + elif isinstance(xi, type): if LaTeX.latex_flg: fstr += r' \text{'+str(xi)+'} ' else: @@ -192,12 +189,13 @@ def gprint(*xargs): else: display(Math(lstr)) else: - LaTeX.latex_str += r'\begin{equation*} ' + (fstr % tuple(x)) + r'\end{equation*} '+'\n' + LaTeX.latex_str += r'\begin{equation*} ' + (fstr % tuple(x)) + r'\end{equation*} '+'\n' else: print(fstr % tuple(x)) return + def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debug=False, pt='10pt', pdfprog='pdflatex'): """ @@ -213,8 +211,7 @@ def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debu We assume that if xpdf() is called then Format() has been called at the beginning of the program. """ - - latex_str = paper_format(paper,pt)+LaTeX.latex_preamble+LaTeX.latex_str+r'\end{document}' + latex_str = paper_format(paper, pt)+LaTeX.latex_preamble+LaTeX.latex_str+r'\end{document}' if filename is None: pyfilename = sys.argv[0] @@ -223,7 +220,7 @@ def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debu pdf_filename = rootfilename + '.pdf' else: tex_filename = filename - pdf_filename = tex_filename.replace('.tex','.pdf') + pdf_filename = tex_filename.replace('.tex', '.pdf') if debug: print('latex file =', filename) @@ -238,37 +235,36 @@ def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debu if debug: # Display latex excution output for debugging purposes print('pdflatex path =', pdflatex) - #os.system(pdfprog + ' ' + filename[:-4]) + # os.system(pdfprog + ' ' + filename[:-4]) else: # Works for Linux don't know about Windows - subprocess.call([pdfprog,tex_filename,sys_cmd['null']]) - #os.system(pdfprog + ' ' + filename[:-4] + sys_cmd['null']) + subprocess.call([pdfprog, tex_filename, sys_cmd['null']]) + # os.system(pdfprog + ' ' + filename[:-4] + sys_cmd['null']) - subprocess.call([sys_cmd['evince'],pdf_filename]) + subprocess.call([sys_cmd['evince'], pdf_filename]) - #eval(input('!!!!Return to continue!!!!\n')) + # eval(input('!!!!Return to continue!!!!\n')) if debug: - subprocess.call([sys_cmd['rm'],rootfilename+'.aux ',rootfilename+'.log']) + subprocess.call([sys_cmd['rm'], rootfilename+'.aux ', rootfilename+'.log']) else: - subprocess.call([sys_cmd['rm'],rootfilename+'.aux ',rootfilename+'.log ',rootfilename+'.tex']) + subprocess.call([sys_cmd['rm'], rootfilename+'.aux ', rootfilename+'.log ', rootfilename+'.tex']) if crop: - subprocess.call(['pdfcrop',pdf_filename]) - subprocess.call(['rm',pdf_filename]) - subprocess.call(['mv',rootfilename+'-crop.pdf', pdf_filename]) + subprocess.call(['pdfcrop', pdf_filename]) + subprocess.call(['rm', pdf_filename]) + subprocess.call(['mv', rootfilename+'-crop.pdf', pdf_filename]) if png: - subprocess.call(['Pdf2Png',rootfilename]) + subprocess.call(['Pdf2Png', rootfilename]) return -def paper_format(paper,pt): #Set size of paper and font size + +def paper_format(paper, pt): # Set size of paper and font size if paper == 'letter': - paper_size = \ -""" + paper_size = """ \\documentclass[@10pt@,fleqn]{book} """ else: - paper_size = \ -""" + paper_size = """ \\documentclass[@10pt@,fleqn]{book} \\usepackage[vcentering]{geometry} """ @@ -280,4 +276,4 @@ def paper_format(paper,pt): #Set size of paper and font size paper_size = paper_size.replace('@10pt@', pt) - return(paper_size) + return paper_size From bf0b2b10447b45b3d553b305ebe12b1a4f973393 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 12:25:55 +0800 Subject: [PATCH 11/78] lint --- galgebra/gprinter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galgebra/gprinter.py b/galgebra/gprinter.py index ce6912bb..15224c19 100644 --- a/galgebra/gprinter.py +++ b/galgebra/gprinter.py @@ -53,7 +53,7 @@ class LaTeX: \\newcommand{\\lbrc}{\\left \\{} \\newcommand{\\rbrc}{\\right \\}} \\newcommand{\\W}{\\wedge} -\\newcommand{\\prm}[1]{{#1}^{\prime}} +\\newcommand{\\prm}[1]{{#1}^{\\prime}} \\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}} \\newcommand{\\R}{\\dagger} \\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}} From 591678003d970daa297961686f8dd113dfb9e7e5 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 12:45:30 +0800 Subject: [PATCH 12/78] Add GAlgebraInit from GSG as is but rename it to primer Co-authored-by: Greg Grunberg --- galgebra/primer.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 galgebra/primer.py diff --git a/galgebra/primer.py b/galgebra/primer.py new file mode 100644 index 00000000..3f051676 --- /dev/null +++ b/galgebra/primer.py @@ -0,0 +1,68 @@ +# Author: Greg Grunberg +# Last revised: 2023-01-13 + +# INSTRUCTIONS: +# +# Place this GAlgebrainit.py file in the "galgebra" folder, which should +# already contain the other GAlgebra modules +# +# atoms.py dop.py ga.py +# lt.py metric.py mv.py +# printer.py gprinter.py utils.py . +# +# To invoke this program within a Jupyter notebok, write the command +# +# from galgebra.GAlgebraInit import * +# +# in the notebook's first In[ ] cell and execute that cell. + +# Make SymPy available to this program +import sympy +from sympy import * + +# Make GAlgebra available to this program. +import galgebra +from galgebra.ga import * +from galgebra.mv import * +from galgebra.lt import * +from galgebra.dop import * +from galgebra.printer import Fmt, GaPrinter, Format + # Fmt: sets display mode of a multivector's basis expansion. + # GaPrinter: makes GA output a little more readable. + # Format: turns on latex printer. +from galgebra.gprinter import gFormat, gprint +gFormat() + # Default `Fmode=True` suppresses display of the arguments of + # multivector fields. + # Default `Dmode=True` causes partial differentiation + # operators to be displayed in shortened form. +Ga.dual_mode('Iinv+') + # Sets multivector dualization to be right multiplication by the + # by the inverse unit pseudoscalar (the convention used in the + # textbooks LAGA, VAGC, and GACS). + +initializations_list = \ +r"""\textsf{The following initialization commands were executed:}\\ +\quad\texttt{from sys import version}\\ +\quad\texttt{import sympy}\\ +\quad\texttt{from sympy import *}\\ +\quad\texttt{import galgebra}\\ +\quad\texttt{from galgebra.ga import *}\\ +\quad\texttt{from galgebra.mv import *}\\ +\quad\texttt{from galgebra.lt import *}\\ +\quad\texttt{from galgebra.dop import *}\\ +\quad\texttt{from galgebra.printer import Fmt, GaPrinter, Format}\\ +\quad\texttt{from galgebra.gprinter import gFormat, gprint}\\ +\quad\texttt{gFormat()}\\~~~~~~~~ +\quad\textsf{# default 'Fmode=True' suppresses arguments of multivector fields}\\~~~~~~~~ +\quad\textsf{# default 'Dmode=True' displays partial differentiation operators in short form}\\ +\quad\texttt{Ga.dual_mode('Iinv+')}\\~~~~~~~~ +\quad\textsf{# dual and undual defined by }\mathbf{M}^\star = \mathbf{M}\mathbf{I}^{-1} \textsf{ and } \mathbf{M}^{-\star} = \mathbf{M}\mathbf{I}\\""" +gprint(initializations_list) + +from sys import version +# Display versions of softwared being used. +gprint(r'\textsf{This notebook is now using} \\', + r'\qquad\bullet~ \textsf{Python }', version[:5], + r'\qquad\bullet~ \textsf{SymPy }', sympy.__version__[:8], + r'\qquad\bullet~ \textsf{GAlgebra }', galgebra.__version__[:], r'.') From c28d293d75c4d0be97efa4b96c29ad383eebb52f Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 15:04:40 +0800 Subject: [PATCH 13/78] lint --- galgebra/primer.py | 43 +++++++++++++++++++++---------------------- setup.cfg | 11 +++++++++++ 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/galgebra/primer.py b/galgebra/primer.py index 3f051676..c1924fd7 100644 --- a/galgebra/primer.py +++ b/galgebra/primer.py @@ -2,54 +2,54 @@ # Last revised: 2023-01-13 # INSTRUCTIONS: -# +# # Place this GAlgebrainit.py file in the "galgebra" folder, which should -# already contain the other GAlgebra modules +# already contain the other GAlgebra modules # # atoms.py dop.py ga.py # lt.py metric.py mv.py # printer.py gprinter.py utils.py . # -# To invoke this program within a Jupyter notebok, write the command +# To invoke this program within a Jupyter notebok, write the command # # from galgebra.GAlgebraInit import * # # in the notebook's first In[ ] cell and execute that cell. +from sys import version + # Make SymPy available to this program -import sympy +import sympy from sympy import * # Make GAlgebra available to this program. import galgebra -from galgebra.ga import * +from galgebra.ga import * from galgebra.mv import * from galgebra.lt import * from galgebra.dop import * from galgebra.printer import Fmt, GaPrinter, Format - # Fmt: sets display mode of a multivector's basis expansion. - # GaPrinter: makes GA output a little more readable. - # Format: turns on latex printer. +# Fmt: sets display mode of a multivector's basis expansion. +# GaPrinter: makes GA output a little more readable. +# Format: turns on latex printer. from galgebra.gprinter import gFormat, gprint gFormat() - # Default `Fmode=True` suppresses display of the arguments of - # multivector fields. - # Default `Dmode=True` causes partial differentiation - # operators to be displayed in shortened form. -Ga.dual_mode('Iinv+') - # Sets multivector dualization to be right multiplication by the - # by the inverse unit pseudoscalar (the convention used in the - # textbooks LAGA, VAGC, and GACS). - -initializations_list = \ -r"""\textsf{The following initialization commands were executed:}\\ +# Default `Fmode=True` suppresses display of the arguments of +# multivector fields. +# Default `Dmode=True` causes partial differentiation +# operators to be displayed in shortened form. +Ga.dual_mode('Iinv+') +# Sets multivector dualization to be right multiplication by the +# by the inverse unit pseudoscalar (the convention used in the +# textbooks LAGA, VAGC, and GACS). +initializations_list = r"""\textsf{The following initialization commands were executed:}\\ \quad\texttt{from sys import version}\\ \quad\texttt{import sympy}\\ \quad\texttt{from sympy import *}\\ \quad\texttt{import galgebra}\\ -\quad\texttt{from galgebra.ga import *}\\ +\quad\texttt{from galgebra.ga import *}\\ \quad\texttt{from galgebra.mv import *}\\ -\quad\texttt{from galgebra.lt import *}\\ +\quad\texttt{from galgebra.lt import *}\\ \quad\texttt{from galgebra.dop import *}\\ \quad\texttt{from galgebra.printer import Fmt, GaPrinter, Format}\\ \quad\texttt{from galgebra.gprinter import gFormat, gprint}\\ @@ -60,7 +60,6 @@ \quad\textsf{# dual and undual defined by }\mathbf{M}^\star = \mathbf{M}\mathbf{I}^{-1} \textsf{ and } \mathbf{M}^{-\star} = \mathbf{M}\mathbf{I}\\""" gprint(initializations_list) -from sys import version # Display versions of softwared being used. gprint(r'\textsf{This notebook is now using} \\', r'\qquad\bullet~ \textsf{Python }', version[:5], diff --git a/setup.cfg b/setup.cfg index 7220a6b2..1b364eac 100644 --- a/setup.cfg +++ b/setup.cfg @@ -63,3 +63,14 @@ per-file-ignores = # F401 'sympy.core.function._coeff_isneg' imported but unused # F401 'sympy.interactive.printing' imported but unused ./galgebra/printer.py: E122,E127,E128,E262,E265,E402,F401 + + # F403 'from sympy import *' used; unable to detect undefined names + # F403 'from galgebra.ga import *' used; unable to detect undefined names + # F403 'from galgebra.mv import *' used; unable to detect undefined names + # F403 'from galgebra.lt import *' used; unable to detect undefined names + # F403 'from galgebra.dop import *' used; unable to detect undefined names + # F401 'galgebra.printer.Fmt' imported but unused + # F401 'galgebra.printer.GaPrinter' imported but unused + # F401 'galgebra.printer.Format' imported but unused + # F405 'Ga' may be undefined, or defined from star imports: galgebra.dop, galgebra.ga, galgebra.lt, galgebra.mv, sympy + ./galgebra/primer.py: F403,F401,F405 From 6a179323a1c0ce724cdad485ee1e7f0402dba73b Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 15:01:55 +0800 Subject: [PATCH 14/78] Update instructions --- galgebra/primer.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/galgebra/primer.py b/galgebra/primer.py index c1924fd7..30305457 100644 --- a/galgebra/primer.py +++ b/galgebra/primer.py @@ -3,16 +3,9 @@ # INSTRUCTIONS: # -# Place this GAlgebrainit.py file in the "galgebra" folder, which should -# already contain the other GAlgebra modules -# -# atoms.py dop.py ga.py -# lt.py metric.py mv.py -# printer.py gprinter.py utils.py . -# # To invoke this program within a Jupyter notebok, write the command # -# from galgebra.GAlgebraInit import * +# from galgebra.primer import * # # in the notebook's first In[ ] cell and execute that cell. From 12aa6666d590836c2781349cfeb6f49350b947a7 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 15:42:15 +0800 Subject: [PATCH 15/78] Add notebooks from GSG almost as is. They are put into examples/primer, and `GAlgebraOutput.ipynb` is renamed to `gprint.ipynb`, and the rest are ensured to be in lowercase. Co-authored-by: Greg Grunberg --- .github/workflows/ci.yml | 1 + README.md | 2 +- examples/ipython/norm.ipynb | 215 +++++++++++++ examples/primer/cm3.ipynb | 389 +++++++++++++++++++++++ examples/primer/g2.ipynb | 72 +++++ examples/primer/g3.ipynb | 73 +++++ examples/primer/g4.ipynb | 67 ++++ examples/primer/gprint.ipynb | 157 ++++++++++ examples/primer/h3.ipynb | 107 +++++++ examples/primer/primer.ipynb | 534 ++++++++++++++++++++++++++++++++ examples/primer/sp2.ipynb | 91 ++++++ examples/primer/sp2g3.ipynb | 95 ++++++ examples/primer/sp2sp3.ipynb | 97 ++++++ examples/primer/sp3.ipynb | 87 ++++++ examples/primer/spacetime.ipynb | 76 +++++ 15 files changed, 2062 insertions(+), 1 deletion(-) create mode 100644 examples/ipython/norm.ipynb create mode 100644 examples/primer/cm3.ipynb create mode 100644 examples/primer/g2.ipynb create mode 100644 examples/primer/g3.ipynb create mode 100644 examples/primer/g4.ipynb create mode 100644 examples/primer/gprint.ipynb create mode 100644 examples/primer/h3.ipynb create mode 100644 examples/primer/primer.ipynb create mode 100644 examples/primer/sp2.ipynb create mode 100644 examples/primer/sp2g3.ipynb create mode 100644 examples/primer/sp2sp3.ipynb create mode 100644 examples/primer/sp3.ipynb create mode 100644 examples/primer/spacetime.ipynb diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9b37beb6..b34bfaa4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,6 +51,7 @@ jobs: pytest \ --cov=galgebra \ --nbval examples/ipython/ \ + --nbval examples/primer/ \ test \ --nbval-current-env \ --nbval-sanitize-with test/.nbval_sanitize.cfg \ diff --git a/README.md b/README.md index c4fc0c8e..f5b56d7b 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,7 @@ Further, to run the complete test suite including the ones using [nbval](https:/ ```bash pip install nbval -pytest --nbval examples/ipython/ test --nbval-current-env --nbval-sanitize-with test/.nbval_sanitize.cfg +pytest --nbval examples/ipython/ --nbval examples/primer/ test --nbval-current-env --nbval-sanitize-with test/.nbval_sanitize.cfg ``` This could take more than 10 minutes, please be patient. diff --git a/examples/ipython/norm.ipynb b/examples/ipython/norm.ipynb new file mode 100644 index 00000000..9a0c18f4 --- /dev/null +++ b/examples/ipython/norm.ipynb @@ -0,0 +1,215 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "b86c4cdf-e245-4077-ab9d-165c93206a07", + "metadata": {}, + "outputs": [], + "source": [ + "import sympy\n", + "from galgebra.ga import Ga\n", + "from sympy import simplify" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "89bc7050-685d-4ab9-a3f9-2014ac3031f2", + "metadata": {}, + "outputs": [], + "source": [ + "from galgebra.metric import square_root_of_expr" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e5501b5d-df05-465e-99db-314a920404b8", + "metadata": {}, + "outputs": [], + "source": [ + "ga, e_1, e_2, e_3 = Ga.build('e*1|2|3', g=[1, 1, 1])\n", + "B = ga.mv('B', 'bivector')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c8108fa9-2cdd-4956-9fe2-4dc01d9a907f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "abs(B*B) == -(B*B).scalar()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5dcdbd34-3248-4d3e-8793-008443b2ed11", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\sqrt{\\left(B^{12}\\right)^{4} + 2 \\left(B^{12}\\right)^{2} \\left(B^{13}\\right)^{2} + 2 \\left(B^{12}\\right)^{2} \\left(B^{23}\\right)^{2} + \\left(B^{13}\\right)^{4} + 2 \\left(B^{13}\\right)^{2} \\left(B^{23}\\right)^{2} + \\left(B^{23}\\right)^{4}}$" + ], + "text/plain": [ + "sqrt(B__12**4 + 2*B__12**2*B__13**2 + 2*B__12**2*B__23**2 + B__13**4 + 2*B__13**2*B__23**2 + B__23**4)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "abs(B*B)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "15e53fae-a7bf-40bc-950a-e6412128b069", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left(B^{12}\\right)^{2} + \\left(B^{13}\\right)^{2} + \\left(B^{23}\\right)^{2}$" + ], + "text/plain": [ + "B__12**2 + B__13**2 + B__23**2" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "-(B*B).scalar()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "d19adf94-3b0f-46f7-8669-c688fbdb94fd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\left(B^{12}\\right)^{2} - \\left(B^{13}\\right)^{2} - \\left(B^{23}\\right)^{2} + \\sqrt{\\left(B^{12}\\right)^{4} + 2 \\left(B^{12}\\right)^{2} \\left(B^{13}\\right)^{2} + 2 \\left(B^{12}\\right)^{2} \\left(B^{23}\\right)^{2} + \\left(B^{13}\\right)^{4} + 2 \\left(B^{13}\\right)^{2} \\left(B^{23}\\right)^{2} + \\left(B^{23}\\right)^{4}}$" + ], + "text/plain": [ + "-B__12**2 - B__13**2 - B__23**2 + sqrt(B__12**4 + 2*B__12**2*B__13**2 + 2*B__12**2*B__23**2 + B__13**4 + 2*B__13**2*B__23**2 + B__23**4)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(abs(B*B) + (B*B).scalar()).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8bf5a1ed-901e-47be-a05d-1fa183cbc3f2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\sqrt{\\left(B^{12}\\right)^{2} + \\left(B^{13}\\right)^{2} + \\left(B^{23}\\right)^{2}}$" + ], + "text/plain": [ + "sqrt(B__12**2 + B__13**2 + B__23**2)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "square_root_of_expr(B.norm2())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8544082c-bc58-497e-9e8d-97f7a231db42", + "metadata": {}, + "outputs": [], + "source": [ + "def mynorm(mv, hint='0'):\n", + " return simplify(square_root_of_expr(mv.norm2(hint)))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c8825d1d-f5bc-47b2-a93f-f903c9fbf7cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mynorm(B*B) == -(B*B).scalar()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40d3da1e-a3d6-4a2a-8096-723b74a478b8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/primer/cm3.ipynb b/examples/primer/cm3.ipynb new file mode 100644 index 00000000..4e89173c --- /dev/null +++ b/examples/primer/cm3.ipynb @@ -0,0 +1,389 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

*Introduction*

\n", + "\n", + "This file enables a user to construct and manipulate geometric objects in $\\mathbb{R}^3$. The constructions and manipulations are performed using a conformal model of $\\mathbb{R}^3$. A user need not know much about the conformal model, as all constructions and manipulations are via the functions provided here. \n", + "\n", + "My intent is that the functions are self documenting through their code and comments. \n", + "\n", + "Vectors passed to the functions must be in conformal representation. \n", + "Exceptions: pt, which converts a 3D point to a conformal point; a 3D normal vector $\\mathbf{n}$; and a 3D parallel bivector $\\mathbf{B}$.\n", + "\n", + "Objects returned by the functions are in conformal representation. Exception: tp, which returns a 3D point.\n", + "\n", + "To start, pull down the \"Run\" menu item and choose \"Run All Cells\".\n", + "\n", + "Comments and proposed changes or additions are welcome." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Conformal Model, Amsterdam convention. Dorst et al. p. 361\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# 3D confiormakl model\n", + "\n", + "cm3coords = (o,x,y,z,infty) = symbols('o 1 2 3 infty', real=True)\n", + "cm3g = '0 0 0 0 -1, 0 1 0 0 0, 0 0 1 0 0, 0 0 0 1 0, -1 0 0 0 0'\n", + "cm3 = Ga('o \\mathbf{e}_1 \\mathbf{e}_2 \\mathbf{e}_3 \\infty', g = cm3g, coords = cm3coords)\n", + "(eo, e1, e2, e3, eoo) = cm3.mv()\n", + "ep = eo - eoo/2 # ep^2 = +1 Geometric Algebra for Computer Science 408\n", + "em = eo + eoo/2 # em^2 = -1\n", + "E = eo^eoo\n", + "Ga.dual_mode('Iinv+')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def pt(arg): # R^3 vector --> conformal point. \n", + " if isinstance(arg,str): # Return general 3D point\n", + " v = cm3.mv(arg, 'vector') # General conformal vector \n", + " v = v + (v < eoo)*eo + (v < eo)*eoo # 3D part \n", + " v = eo + v + (v R^3 vector\n", + " if isinstance(arg,str): # Return general 3D vector\n", + " v = cm3.mv(arg, 'vector')\n", + " else: # Return 3D vector part of arg\n", + " v = arg\n", + " v = v + (v < eoo)*eo + (v < eo)*eoo\n", + " return(v) " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def normalize(v): \n", + " if (v < eoo) == 0: # Normalize 3D vector\n", + " return(v/sqrt((v* Create direct representations of geometric objects *" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def round(*args): # args are conformal points\n", + " ans = args[0]\n", + " for i in range(1,len(args)):\n", + " ans = ans ^ args[i]\n", + " return(ans)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def flat(*args): # args are conformal points\n", + " return(round(*args) ^ eoo)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def line(p,q): # If q is 3D vector, line thru p parallel to q returned\n", + " return(flat(p,q))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def plane(p,q,r):\n", + " return(flat(p,q,r))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def circle(p,q,r):\n", + " return(round(p,q,r))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def sphere(p,q,r,s):\n", + " return(round(p,q,r,s))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

* Create dual representations of geometric objects *

" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def dualLine(p, B): # Thru point p, orthogonal to 3D bivector B\n", + " return(p < (B*eoo)) # A vector" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def dualPlane(p,n): # n: GA^3 normal vector \n", + " m = normalize(n)\n", + " if isinstance(p,(int, long, float)):\n", + " p = scalar(p) # Python scalar -> GAlgebra scalar\n", + " if (p!=0) and ((p GAlgebra scalar\n", + " if (rho!=0) and ((rho* Geometric operations *" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def translate(object,a3): # a3: 3D vector\n", + " return(1 - a3*eoo/2)*object*(1 + a3*eoo/2)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def rotate(object,itheta):\n", + " return(exp(-itheta/2)*object*exp(itheta/2))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def invert(p, norm=False): # GACS 513\n", + " ans = -(eo - eoo/2)*p*(eo - eoo/2) \n", + " if norm:\n", + " ans = normalize(ans)\n", + " return(ans)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Reflect point p in hyperplane with normal 3D vector n.\n", + "def reflect(p,n):\n", + " return(-n*p*(n/norm2(n))) " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Can be considerably simplified: A Covariant Approach ..., 16 \n", + "def dilate(p, alpha, norm = False): # Dilate by alpha (> 0)\n", + " ans = exp(E*ln(alpha)/2)*p*exp(-E*ln(alpha)/2)\n", + " if norm:\n", + " ans = normalize(ans)\n", + " return(ans)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

* Play *

" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Raw Cell Format", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/g2.ipynb b/examples/primer/g2.ipynb new file mode 100644 index 00000000..3140a13b --- /dev/null +++ b/examples/primer/g2.ipynb @@ -0,0 +1,72 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# G2: Standard 2D Model\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# g2: The geometric algebra G^2.\n", + "g2coords = (x,y) = symbols('x y', real=True)\n", + "g2 = Ga('e', g=[1,1,1], coords=g2coords)\n", + "(ex, ey) = g2.mv()\n", + "\n", + "grad = g2.grad\n", + "from galgebra.dop import *\n", + "pdx = Pdop(x)\n", + "pdy = Pdop(y)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/g3.ipynb b/examples/primer/g3.ipynb new file mode 100644 index 00000000..240ffeac --- /dev/null +++ b/examples/primer/g3.ipynb @@ -0,0 +1,73 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# G3: Standard 3D Model\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# g3: The geometric algebra G^3.\n", + "g3coords = (x,y,z) = symbols('x y z', real=True)\n", + "g3 = Ga('e', g=[1,1,1], coords=g3coords)\n", + "(ex, ey, ez) = g3.mv()\n", + "\n", + "grad = g3.grad\n", + "from galgebra.dop import *\n", + "pdx = Pdop(x)\n", + "pdy = Pdop(y)\n", + "pdz = Pdop(z)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/g4.ipynb b/examples/primer/g4.ipynb new file mode 100644 index 00000000..45418061 --- /dev/null +++ b/examples/primer/g4.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# G4: Standard 4D Model\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# g4: R^4 using cartesian coordiantes\n", + "g4coords = (x,y,z,w) = symbols('x y z w', real=True)\n", + "g4 = Ga('e', g=[1,1,1,1], coords=g4coords)\n", + "(ex, ey, ez, ew) = g4.mv()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/gprint.ipynb b/examples/primer/gprint.ipynb new file mode 100644 index 00000000..e5a458fe --- /dev/null +++ b/examples/primer/gprint.ipynb @@ -0,0 +1,157 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Set up standard G^3 geometric algebra\n", + "g3coords = (x,y,z) = symbols('x y z', real=True) # Without real=True, symbols are complex\n", + "g3 = Ga('\\mathbf{e}', g=[1,1,1], coords=g3coords)\n", + "(ex, ey, ez) = g3.mv() # Program names of basis vectors.\n", + "(exr, eyr, ezr) = g3.mvr() # Program names of reciprocal basis vectors." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gprint(r'word word\\ word \\cdot ex}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# h3: 3D Homogeneous Coordinates\n", + "\n", + "import sympy \n", + "from sympy import * # Make SymPy available to this program\n", + "sympy.init_printing() \n", + "\n", + "from galgebra.printer import Fmt, GaPrinter # Need all these parameters\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()\n", + "\n", + "from galgebra.ga import * # Make GAlgebra available to this program.\n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "h3coords = (x,y,z,e) = symbols('x y z e', real=True)\n", + "# h3 = Ga('e_x e_y e_z e_e', g=[1,1,1,1], coords=h3coords)\n", + "h3 = Ga('\\mathbf{e}', g=[1,1,1,1], coords=h3coords)\n", + "(ex,ey,ez,ee) = h3.mv()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/primer.ipynb b/examples/primer/primer.ipynb new file mode 100644 index 00000000..81bb93c1 --- /dev/null +++ b/examples/primer/primer.ipynb @@ -0,0 +1,534 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# G3: Standard 3D Model\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "# from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# g3: The geometric algebra G^3.\n", + "g3coords = (x,y,z) = symbols('x y z', real=True)\n", + "g3 = Ga('e', g=[1,1,1], coords=g3coords)\n", + "(ex, ey, ez) = g3.mv()\n", + "\n", + "grad = g3.grad\n", + "# from galgebra.dop import *\n", + "# pdx = Pdop(x)\n", + "# pdy = Pdop(y)\n", + "# pdz = Pdop(z)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\boldsymbol{e}_{x} \\cdot \\boldsymbol{e}_{y} = 0 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gprint(ex,r'\\cdot',ey,'=',ex < ey)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{B}^{\\dagger}= - B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} - B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} - B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{I can do three lines output from one cell}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\mathbf{B} = B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\mathbf{B}^2 = - {B^{xy} }^{2} - {B^{xz} }^{2} - {B^{yz} }^{2} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\mathbf{B}^{\\dagger}= - B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} - B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} - B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\mathbf{\\nabla B} = \\left ( - \\partial_{y} B^{xy} - \\partial_{z} B^{xz} \\right ) \\boldsymbol{e}_{x} + \\left ( \\partial_{x} B^{xy} - \\partial_{z} B^{yz} \\right ) \\boldsymbol{e}_{y} + \\left ( \\partial_{x} B^{xz} + \\partial_{y} B^{yz} \\right ) \\boldsymbol{e}_{z} + \\left ( \\partial_{z} B^{xy} - \\partial_{y} B^{xz} + \\partial_{x} B^{yz} \\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Fmt(3)\n", + "B = g3.mv('B', 'bivector',f=True)\n", + "gprint(r'\\mathbf{B}^{\\dagger}=',B.rev())\n", + "gprint(r'\\text{I can do three lines output from one cell}')\n", + "gprint(r'\\mathbf{B} =',B,r'\\\\ \\mathbf{B}^2 =',B*B,r'\\\\ \\mathbf{B}^{\\dagger}=',B.rev(),r'\\\\ \\mathbf{\\nabla B} =',grad*B)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\partial^{3}}{\\partial x^{2}\\partial y} \\bs{B}= \\frac{\\partial^{3}}{\\partial^{2} x\\partial y} B^{xy} {\\left (x,y,z \\right )} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + \\frac{\\partial^{3}}{\\partial^{2} x\\partial y} B^{xz} {\\left (x,y,z \\right )} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + \\frac{\\partial^{3}}{\\partial^{2} x\\partial y} B^{yz} {\\left (x,y,z \\right )} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from galgebra.dop import *\n", + "gFormat(Fmode=False, Dmode=False)\n", + "pdx2y = Pdop({x:2,y:1})\n", + "gprint(pdx2y,r'\\bs{B}=',pdx2y*B)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\partial^{3}}{\\partial x^{2}\\partial y} \\bs{B}= \\partial^{2}_{x}\\partial_{y} B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + \\partial^{2}_{x}\\partial_{y} B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + \\partial^{2}_{x}\\partial_{y} B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pdx2y = Pdop({x:2,y:1})\n", + "gFormat(Fmode=True, Dmode=True)\n", + "gprint(pdx2y,r'\\bs{B}=',pdx2y*B)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{B} = B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Fmt(1)\n", + "gprint(r'\\mathbf{B} =',B)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\grade{B}{2} = B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Fmt(3)\n", + "gprint(r'\\grade{B}{2} =',B.grade(2))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle type(\\bs{B}) =$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gprint(r'type(\\bs{B}) =',str(type(B)))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\grad\\ \\ \\boldsymbol{e}_{x} \\frac{\\partial}{\\partial x} + \\boldsymbol{e}_{y} \\frac{\\partial}{\\partial y} + \\boldsymbol{e}_{z} \\frac{\\partial}{\\partial z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gprint('\\grad\\ \\ ', grad)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle * \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gprint(r'*', ex*ey)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\\begin{equation*} V = V^{x} \\boldsymbol{e}_{x} + V^{y} \\boldsymbol{e}_{y} + V^{z} \\boldsymbol{e}_{z} \\end{equation*}" + ], + "text/plain": [ + "V__x*e_x + V__y*e_y + V__z*e_z" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "V = g3.mv('V', 'vector')\n", + "V" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# G2: Standard 3D Model\n", + "\n", + "g2coords = (x,y) = symbols('x y', real=True)\n", + "g2 = Ga('e', g=[1,1], coords=g2coords)\n", + "(ex, ey) = g2.mv()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left ( L_{xx} L_{yy} - L_{xy} L_{yx}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "L = g2.lt('L')\n", + "gprint(L(ex^ey))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left \\{ \\begin{array}{ll} L \\left ( \\boldsymbol{e}_{x}\\right ) =& 2 \\boldsymbol{e}_{y} \\\\ L \\left ( \\boldsymbol{e}_{y}\\right ) =& \\boldsymbol{e}_{x} + \\boldsymbol{e}_{y} \\end{array} \\right \\} \n", + " $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "L = g2.lt([ [0,2], [1,1] ])\n", + "gprint(L)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle -2 \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gprint(L(ex^ey))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & 1\\\\2 & 1\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎑0 1⎀\n", + "⎒ βŽ₯\n", + "⎣2 1⎦" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "L.matrix()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & 2\\\\1 & 1\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎑0 2⎀\n", + "⎒ βŽ₯\n", + "⎣1 1⎦" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "L.adj().matrix()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/sp2.ipynb b/examples/primer/sp2.ipynb new file mode 100644 index 00000000..2c22f0ae --- /dev/null +++ b/examples/primer/sp2.ipynb @@ -0,0 +1,91 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# sp2: Geometric algebra for unit sphere in R^3 using spherical coordinates.\n", + "# Mathematics coordinate order: (phi,theta)\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# sp2: Geometric algebra for unit sphere in R^3 using spherical coordinates.\n", + "# Mathematics coordinate order: (phi,theta)\n", + "\n", + "# Set up sp2\n", + "basis = 'e_phi e_theta'\n", + "coords = (phi,th) = symbols('phi theta', real=True)\n", + "g = [sin(phi)*cos(th), sin(phi)*sin(th), cos(phi)]\n", + "sp2 = Ga('\\mathbf{e}', g=None , coords=coords, \\\n", + " X=[sin(phi)*cos(th), sin(phi)*sin(th), cos(phi)], norm=True)\n", + "\n", + "(ephi, eth) = sp2.mv()\n", + "(rphi, rth) = sp2.mvr()\n", + "\n", + "# Derivatives\n", + "grad = sp2.grad\n", + "# from galgebra.dop import *\n", + "# pdphi = Pdop(phi)\n", + "# pdth = Pdop(th)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "grad" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/sp2g3.ipynb b/examples/primer/sp2g3.ipynb new file mode 100644 index 00000000..18ba5f8e --- /dev/null +++ b/examples/primer/sp2g3.ipynb @@ -0,0 +1,95 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Unit sphere R^3 as a submanifold of g3 in cartesian coordinates\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Unit sphere R^3 as a submanifold of g3 in cartesian coordinates\n", + "\n", + "# g3: Base manifold.\n", + "g3coords = (x,y,z) = symbols('x y z', real=True) \n", + "g3 = Ga('\\mathbf{e}', g=[1,1,1], coords=g3coords)\n", + "(ex, ey, ez) = g3.mv()\n", + "\n", + "# sp2: Submanifold\n", + "sp2coords = (phi,th) = symbols('phi theta', real=True)\n", + " # Parameterize unit sphere using the coordinates of g3:\n", + "sp2param = [sin(phi)*cos(th), sin(phi)*sin(th), cos(phi)] \n", + " # Map the g3 coordinates of the sphere to its sp2 coordinates:\n", + "sp2 = g3.sm(sp2param, sp2coords, norm=True) # \"sm\" is submanifold\n", + "\n", + "(ephi, eth) = sp2.mv()\n", + "(rphi, rth) = sp2.mvr()\n", + "\n", + "# Derivatives\n", + "grad = sp2.grad\n", + "from galgebra.dop import *\n", + "pdphi = Pdop(phi)\n", + "pdth = Pdop(th)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "grad = sp2.grad\n", + "grad" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/sp2sp3.ipynb b/examples/primer/sp2sp3.ipynb new file mode 100644 index 00000000..27280692 --- /dev/null +++ b/examples/primer/sp2sp3.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# A geometric algebra for the unit sphere in R^3 \n", + "# as a submanifold of R^3 with spherical coordintes.\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# A geometric algebra for the unit sphere in R^3 \n", + "# as a submanifold of R^3 with spherical coordintes.\n", + "\n", + "# sp3: Base manifold\n", + "sp3coords = (r, phi, theta) = symbols('r phi theta', real=True) \n", + "sp3 = Ga('e', g=None, coords=sp3coords, \\\n", + " X=[r*sin(phi)*cos(theta), r*sin(phi)*sin(theta), r*cos(phi)], norm=True)\n", + "(er, ephi, etheta) = sp3.mv()\n", + "\n", + "# sp2: Submanifold\n", + "sp2coords = (p,t) = symbols('phi theta', real=True) # they output as Greek phi and theta\n", + " # Parameterize the unit sphere using the spherical coordinates of sp3:\n", + "sp2param = [1, p, t] \n", + " # Map the sp3 coordinates of the sphere to its sp2 coordinates:\n", + "sp2 = sp3.sm(sp2param, sp2coords, norm=True)\n", + "\n", + "(ep, et) = sp2.mv()\n", + "(rp, rt) = sp2.mvr()\n", + "\n", + "# Derivatives\n", + "grad = sp2.grad\n", + "from galgebra.dop import *\n", + "pdph = Pdop(p)\n", + "pdth = Pdop(t)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gprint(grad) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/sp3.ipynb b/examples/primer/sp3.ipynb new file mode 100644 index 00000000..a76be1da --- /dev/null +++ b/examples/primer/sp3.ipynb @@ -0,0 +1,87 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# sp3: Spherical Coordinates in R^3\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# sp3: Geometric algebra for R^3 using spherical coordinates \n", + "# Mathematics convention: r, phi (colatitude), theta (longitude), in right handed order. \n", + "\n", + "sp3coords = (r, phi, theta) = symbols('r phi theta') \n", + "sp3 = Ga('e', g=None, coords=sp3coords, \\\n", + " X=[r*sin(phi)*cos(theta), r*sin(phi)*sin(theta),r*cos(phi)], norm=True)\n", + " # g = None. Instead, the spherical coordinate parameterization X is used.\n", + " # \"\\\" is Python's line continuation character\n", + "(er, ephi, etheta) = sp3.mv()\n", + "\n", + "grad = sp3.grad\n", + "from galgebra.dop import *\n", + "pdr = Pdop(r)\n", + "pdphi = Pdop(phi)\n", + "pdtheta = Pdop(theta)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sp3.grad" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/primer/spacetime.ipynb b/examples/primer/spacetime.ipynb new file mode 100644 index 00000000..f04e2bff --- /dev/null +++ b/examples/primer/spacetime.ipynb @@ -0,0 +1,76 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Spacetime algebra. [1, -1, -1, -1] signature\n", + "\n", + "# Make SymPy available to this program:\n", + "import sympy \n", + "from sympy import *\n", + "\n", + "# Make GAlgebra available to this program:\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets the way that a multivector's basis expansion is output.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "txyz = (t, x, y, z) = symbols('t x y z', real=True)\n", + "stcoords = (t,x,y,z) = symbols('t x y z')\n", + "st = Ga('\\mathbf{e}', g=[1, -1, -1, -1], coords=stcoords)\n", + "(et, ex, ey, ez) = st.mv()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "st.mv('X', 'vector')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 40642b023d4f5658142482923338a128898150a4 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 15:54:57 +0800 Subject: [PATCH 16/78] Fix "name 'Format_cnt' is not defined" --- galgebra/gprinter.py | 2 +- setup.cfg | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/galgebra/gprinter.py b/galgebra/gprinter.py index 15224c19..6c76477d 100644 --- a/galgebra/gprinter.py +++ b/galgebra/gprinter.py @@ -1,4 +1,4 @@ -from .printer import GaLatexPrinter, isinteractive, latex +from .printer import GaLatexPrinter, isinteractive, Format_cnt, latex import subprocess import sys import shutil diff --git a/setup.cfg b/setup.cfg index 1b364eac..bcac97f2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -64,6 +64,9 @@ per-file-ignores = # F401 'sympy.interactive.printing' imported but unused ./galgebra/printer.py: E122,E127,E128,E262,E265,E402,F401 + # F401 '.printer.Format_cnt' imported but unused + ./galgebra/gprinter.py: F401 + # F403 'from sympy import *' used; unable to detect undefined names # F403 'from galgebra.ga import *' used; unable to detect undefined names # F403 'from galgebra.mv import *' used; unable to detect undefined names From 51a70091c06785910940d54c11231e0cd47146c1 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 17:01:43 +0800 Subject: [PATCH 17/78] Remove accidentally committed norm.ipynb --- examples/ipython/norm.ipynb | 215 ------------------------------------ 1 file changed, 215 deletions(-) delete mode 100644 examples/ipython/norm.ipynb diff --git a/examples/ipython/norm.ipynb b/examples/ipython/norm.ipynb deleted file mode 100644 index 9a0c18f4..00000000 --- a/examples/ipython/norm.ipynb +++ /dev/null @@ -1,215 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "b86c4cdf-e245-4077-ab9d-165c93206a07", - "metadata": {}, - "outputs": [], - "source": [ - "import sympy\n", - "from galgebra.ga import Ga\n", - "from sympy import simplify" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "89bc7050-685d-4ab9-a3f9-2014ac3031f2", - "metadata": {}, - "outputs": [], - "source": [ - "from galgebra.metric import square_root_of_expr" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "e5501b5d-df05-465e-99db-314a920404b8", - "metadata": {}, - "outputs": [], - "source": [ - "ga, e_1, e_2, e_3 = Ga.build('e*1|2|3', g=[1, 1, 1])\n", - "B = ga.mv('B', 'bivector')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "c8108fa9-2cdd-4956-9fe2-4dc01d9a907f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "abs(B*B) == -(B*B).scalar()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "5dcdbd34-3248-4d3e-8793-008443b2ed11", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\sqrt{\\left(B^{12}\\right)^{4} + 2 \\left(B^{12}\\right)^{2} \\left(B^{13}\\right)^{2} + 2 \\left(B^{12}\\right)^{2} \\left(B^{23}\\right)^{2} + \\left(B^{13}\\right)^{4} + 2 \\left(B^{13}\\right)^{2} \\left(B^{23}\\right)^{2} + \\left(B^{23}\\right)^{4}}$" - ], - "text/plain": [ - "sqrt(B__12**4 + 2*B__12**2*B__13**2 + 2*B__12**2*B__23**2 + B__13**4 + 2*B__13**2*B__23**2 + B__23**4)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "abs(B*B)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "15e53fae-a7bf-40bc-950a-e6412128b069", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left(B^{12}\\right)^{2} + \\left(B^{13}\\right)^{2} + \\left(B^{23}\\right)^{2}$" - ], - "text/plain": [ - "B__12**2 + B__13**2 + B__23**2" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "-(B*B).scalar()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "d19adf94-3b0f-46f7-8669-c688fbdb94fd", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle - \\left(B^{12}\\right)^{2} - \\left(B^{13}\\right)^{2} - \\left(B^{23}\\right)^{2} + \\sqrt{\\left(B^{12}\\right)^{4} + 2 \\left(B^{12}\\right)^{2} \\left(B^{13}\\right)^{2} + 2 \\left(B^{12}\\right)^{2} \\left(B^{23}\\right)^{2} + \\left(B^{13}\\right)^{4} + 2 \\left(B^{13}\\right)^{2} \\left(B^{23}\\right)^{2} + \\left(B^{23}\\right)^{4}}$" - ], - "text/plain": [ - "-B__12**2 - B__13**2 - B__23**2 + sqrt(B__12**4 + 2*B__12**2*B__13**2 + 2*B__12**2*B__23**2 + B__13**4 + 2*B__13**2*B__23**2 + B__23**4)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(abs(B*B) + (B*B).scalar()).simplify()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "8bf5a1ed-901e-47be-a05d-1fa183cbc3f2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\sqrt{\\left(B^{12}\\right)^{2} + \\left(B^{13}\\right)^{2} + \\left(B^{23}\\right)^{2}}$" - ], - "text/plain": [ - "sqrt(B__12**2 + B__13**2 + B__23**2)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "square_root_of_expr(B.norm2())" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "8544082c-bc58-497e-9e8d-97f7a231db42", - "metadata": {}, - "outputs": [], - "source": [ - "def mynorm(mv, hint='0'):\n", - " return simplify(square_root_of_expr(mv.norm2(hint)))" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "c8825d1d-f5bc-47b2-a93f-f903c9fbf7cf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mynorm(B*B) == -(B*B).scalar()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "40d3da1e-a3d6-4a2a-8096-723b74a478b8", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From ddcd0a7deda9ae16f6be533fd9085706cd6527d5 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 17:37:35 +0800 Subject: [PATCH 18/78] Regenerate h3, diff is only the preamble --- examples/primer/h3.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/primer/h3.ipynb b/examples/primer/h3.ipynb index 89b84394..ccf942db 100644 --- a/examples/primer/h3.ipynb +++ b/examples/primer/h3.ipynb @@ -23,7 +23,7 @@ "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", "$$\\newcommand{\\W}{\\wedge}$$\n", - "$$\\newcommand{\\prm}[1]{{#1}}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", "$$\\newcommand{\\R}{\\dagger}$$\n", "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", @@ -85,7 +85,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -99,7 +99,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, From 89c57c5717f96c72e54a7e0e2ebafb70c75c4568 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 18:01:22 +0800 Subject: [PATCH 19/78] Regenerate primer.ipynb --- examples/primer/primer.ipynb | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/examples/primer/primer.ipynb b/examples/primer/primer.ipynb index 81bb93c1..0a851f81 100644 --- a/examples/primer/primer.ipynb +++ b/examples/primer/primer.ipynb @@ -23,7 +23,7 @@ "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", "$$\\newcommand{\\W}{\\wedge}$$\n", - "$$\\newcommand{\\prm}[1]{{#1}}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", "$$\\newcommand{\\R}{\\dagger}$$\n", "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", @@ -107,7 +107,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\mathbf{B}^{\\dagger}= - B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} - B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} - B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} $" + "$\\displaystyle \\mathbf{B}^{\\dagger}= \\begin{aligned}[t] & - B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} \\\\ & - B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} \\\\ & - B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{aligned} $" ], "text/plain": [ "" @@ -131,7 +131,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\begin{equation*} \\mathbf{B} = B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}$" + "$\\displaystyle \\begin{equation*} \\mathbf{B} = \\begin{aligned}[t] & B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} \\\\ & + B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} \\\\ & + B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{aligned} \\end{equation*}$" ], "text/plain": [ "" @@ -155,7 +155,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\begin{equation*} \\mathbf{B}^{\\dagger}= - B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} - B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} - B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}$" + "$\\displaystyle \\begin{equation*} \\mathbf{B}^{\\dagger}= \\begin{aligned}[t] & - B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} \\\\ & - B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} \\\\ & - B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{aligned} \\end{equation*}$" ], "text/plain": [ "" @@ -167,7 +167,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\begin{equation*} \\mathbf{\\nabla B} = \\left ( - \\partial_{y} B^{xy} - \\partial_{z} B^{xz} \\right ) \\boldsymbol{e}_{x} + \\left ( \\partial_{x} B^{xy} - \\partial_{z} B^{yz} \\right ) \\boldsymbol{e}_{y} + \\left ( \\partial_{x} B^{xz} + \\partial_{y} B^{yz} \\right ) \\boldsymbol{e}_{z} + \\left ( \\partial_{z} B^{xy} - \\partial_{y} B^{xz} + \\partial_{x} B^{yz} \\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{equation*}$" + "$\\displaystyle \\begin{equation*} \\mathbf{\\nabla B} = \\begin{aligned}[t] & \\left ( - \\partial_{y} B^{xy} - \\partial_{z} B^{xz} \\right ) \\boldsymbol{e}_{x} \\\\ & + \\left ( \\partial_{x} B^{xy} - \\partial_{z} B^{yz} \\right ) \\boldsymbol{e}_{y} \\\\ & + \\left ( \\partial_{x} B^{xz} + \\partial_{y} B^{yz} \\right ) \\boldsymbol{e}_{z} \\\\ & + \\left ( \\partial_{z} B^{xy} - \\partial_{y} B^{xz} + \\partial_{x} B^{yz} \\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{aligned} \\end{equation*}$" ], "text/plain": [ "" @@ -193,7 +193,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\frac{\\partial^{3}}{\\partial x^{2}\\partial y} \\bs{B}= \\frac{\\partial^{3}}{\\partial^{2} x\\partial y} B^{xy} {\\left (x,y,z \\right )} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + \\frac{\\partial^{3}}{\\partial^{2} x\\partial y} B^{xz} {\\left (x,y,z \\right )} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + \\frac{\\partial^{3}}{\\partial^{2} x\\partial y} B^{yz} {\\left (x,y,z \\right )} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} $" + "$\\displaystyle \\frac{\\partial^{3}}{\\partial x^{2}\\partial y} \\bs{B}= \\begin{aligned}[t] & \\frac{\\partial^{3}}{\\partial^{2} x\\partial y} B^{xy} {\\left (x,y,z \\right )} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} \\\\ & + \\frac{\\partial^{3}}{\\partial^{2} x\\partial y} B^{xz} {\\left (x,y,z \\right )} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} \\\\ & + \\frac{\\partial^{3}}{\\partial^{2} x\\partial y} B^{yz} {\\left (x,y,z \\right )} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{aligned} $" ], "text/plain": [ "" @@ -218,7 +218,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\frac{\\partial^{3}}{\\partial x^{2}\\partial y} \\bs{B}= \\partial^{2}_{x}\\partial_{y} B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + \\partial^{2}_{x}\\partial_{y} B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + \\partial^{2}_{x}\\partial_{y} B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} $" + "$\\displaystyle \\frac{\\partial^{3}}{\\partial x^{2}\\partial y} \\bs{B}= \\begin{aligned}[t] & \\partial^{2}_{x}\\partial_{y} B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} \\\\ & + \\partial^{2}_{x}\\partial_{y} B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} \\\\ & + \\partial^{2}_{x}\\partial_{y} B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{aligned} $" ], "text/plain": [ "" @@ -265,7 +265,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\grade{B}{2} = B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} + B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} + B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} $" + "$\\displaystyle \\grade{B}{2} = \\begin{aligned}[t] & B^{xy} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} \\\\ & + B^{xz} \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} \\\\ & + B^{yz} \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\end{aligned} $" ], "text/plain": [ "" @@ -354,10 +354,12 @@ { "data": { "text/latex": [ - "\\begin{equation*} V = V^{x} \\boldsymbol{e}_{x} + V^{y} \\boldsymbol{e}_{y} + V^{z} \\boldsymbol{e}_{z} \\end{equation*}" + "$\\displaystyle V = \\begin{aligned}[t] & V^{x} \\mathbf{e}_{x} \\\\ & + V^{y} \\mathbf{e}_{y} \\\\ & + V^{z} \\mathbf{e}_{z} \\end{aligned} $" ], "text/plain": [ - "V__x*e_x + V__y*e_y + V__z*e_z" + " V__x*e_x\n", + " + V__y*e_y\n", + " + V__z*e_z" ] }, "execution_count": 12, @@ -391,7 +393,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\left ( L_{xx} L_{yy} - L_{xy} L_{yx}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} $" + "$\\displaystyle \\left ( {L^{x}}_{x} {L^{y}}_{y} - {L^{x}}_{y} {L^{y}}_{x}\\right ) \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} $" ], "text/plain": [ "" @@ -414,8 +416,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\left \\{ \\begin{array}{ll} L \\left ( \\boldsymbol{e}_{x}\\right ) =& 2 \\boldsymbol{e}_{y} \\\\ L \\left ( \\boldsymbol{e}_{y}\\right ) =& \\boldsymbol{e}_{x} + \\boldsymbol{e}_{y} \\end{array} \\right \\} \n", - " $" + "$\\displaystyle \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto 2 \\boldsymbol{e}_{y} \\\\ \\boldsymbol{e}_{y} &\\mapsto \\begin{aligned}[t] & \\boldsymbol{e}_{x} \\\\ & + \\boldsymbol{e}_{y} \\end{aligned} \\end{aligned} \\right\\} $" ], "text/plain": [ "" @@ -512,7 +513,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -526,7 +527,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.11.8" } }, "nbformat": 4, From 0c8abcdf6c8bfc4523b13838c321fe318bc0495f Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 2 Apr 2024 21:54:16 +0800 Subject: [PATCH 20/78] Minor print style tweaks --- examples/primer/primer.ipynb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/examples/primer/primer.ipynb b/examples/primer/primer.ipynb index 0a851f81..cdc466b6 100644 --- a/examples/primer/primer.ipynb +++ b/examples/primer/primer.ipynb @@ -310,7 +310,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\grad\\ \\ \\boldsymbol{e}_{x} \\frac{\\partial}{\\partial x} + \\boldsymbol{e}_{y} \\frac{\\partial}{\\partial y} + \\boldsymbol{e}_{z} \\frac{\\partial}{\\partial z} $" + "$\\displaystyle \\grad = \\boldsymbol{e}_{x} \\frac{\\partial}{\\partial x} + \\boldsymbol{e}_{y} \\frac{\\partial}{\\partial y} + \\boldsymbol{e}_{z} \\frac{\\partial}{\\partial z} $" ], "text/plain": [ "" @@ -321,7 +321,7 @@ } ], "source": [ - "gprint('\\grad\\ \\ ', grad)" + "gprint('\\grad = ', grad)" ] }, { @@ -354,12 +354,10 @@ { "data": { "text/latex": [ - "$\\displaystyle V = \\begin{aligned}[t] & V^{x} \\mathbf{e}_{x} \\\\ & + V^{y} \\mathbf{e}_{y} \\\\ & + V^{z} \\mathbf{e}_{z} \\end{aligned} $" + "$\\displaystyle V = V^{x} \\mathbf{e}_{x} + V^{y} \\mathbf{e}_{y} + V^{z} \\mathbf{e}_{z}$" ], "text/plain": [ - " V__x*e_x\n", - " + V__y*e_y\n", - " + V__z*e_z" + "V__x*e_x + V__y*e_y + V__z*e_z" ] }, "execution_count": 12, @@ -368,6 +366,7 @@ } ], "source": [ + "Fmt(1)\n", "V = g3.mv('V', 'vector')\n", "V" ] @@ -416,7 +415,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto 2 \\boldsymbol{e}_{y} \\\\ \\boldsymbol{e}_{y} &\\mapsto \\begin{aligned}[t] & \\boldsymbol{e}_{x} \\\\ & + \\boldsymbol{e}_{y} \\end{aligned} \\end{aligned} \\right\\} $" + "$\\displaystyle \\left\\{ \\begin{aligned} \\boldsymbol{e}_{x} &\\mapsto 2 \\boldsymbol{e}_{y} \\\\ \\boldsymbol{e}_{y} &\\mapsto \\boldsymbol{e}_{x} + \\boldsymbol{e}_{y} \\end{aligned} \\right\\} $" ], "text/plain": [ "" From 6b11bbe7963cebf19fb23a34d7269f29e011dbf2 Mon Sep 17 00:00:00 2001 From: utensil Date: Sat, 6 Apr 2024 21:06:02 +0800 Subject: [PATCH 21/78] Add `tests of undual, g_invol, ccon, sp, norm2, & norm.ipynb` from #472 as is, as tests, renamed to `test_gsg_undual_etc.ipynb` Co-authored-by: Greg Grunberg --- examples/ipython/test_gsg_undual_etc.ipynb | 4071 ++++++++++++++++++++ 1 file changed, 4071 insertions(+) create mode 100644 examples/ipython/test_gsg_undual_etc.ipynb diff --git a/examples/ipython/test_gsg_undual_etc.ipynb b/examples/ipython/test_gsg_undual_etc.ipynb new file mode 100644 index 00000000..c6a4cda9 --- /dev/null +++ b/examples/ipython/test_gsg_undual_etc.ipynb @@ -0,0 +1,4071 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Testing of undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm\n", + "\n", + "Author: Greg Grunberg \n", + "Last updated 2021-03-31 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook I test the operations `undual`, `g_invol`, `ccon`, `sp`, `norm2`, and `norm`, code for which was described in the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**. The first four of these are operations new to GAlgebra, while the last two are old operations I have newly recoded. \n", + "\n", + "Herein I use SymPy and the latest development version, as of this writing, of PyGAE Galgebra. PyGAE GAlgebra is available from https://github.com/pygae/galgebra, with the latest development version uploaded on 2020-10-18. *The GAlgebra module* **mv.py** *being used by this notebook is the 2020-10-18 version except modified so as to incoporate the `Mv` class methods testing of which is the purpose of this notebook.*\n", + "\n", + "I also use the GAlgebra module **gprinter.py**. That module, not yet available from the GitHub website, was provided directly to me by Alan Bromborsky, the original author of GAlgebra. The functions **`gprint`** and **`gFormat`** used herein come from **gprinter.py**.\n", + "\n", + "\n", + "**References** \n", + "[CAGC]: *Clifford Algebra to Geometric Calculus*, by Hestenes & Sobczyk \n", + "[GACS]: *Geometric Algebra for Computer Science*, by Dorst, Fontijne, & Mann \n", + "[LAGA]: *Linear and Geometric Algebra*, by Alan Macdonald\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Notebook initialization\n", + "\n", + "Execution of the next cell makes SymPy and GAlgebra available within this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{This notebook is now using} \\\\\\qquad\\bullet~ \\text{Python }3.8.5\\qquad\\bullet~ \\text{SymPy }1.8.dev\\qquad\\bullet~ \\text{GAlgebra }0.5.0.$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from sys import version\n", + "\n", + "import sympy \n", + "from sympy import *\n", + "import galgebra\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + " # Fmt: sets display mode of a multivector's basis expansion.\n", + " # GaPrinter: makes GA output a little more readable.\n", + " # Format: turns on latex printer.\n", + "from galgebra.gprinter import gFormat, gprint\n", + "\n", + "gFormat()\n", + "\t# Default `Fmode=True` suppresses display of a multivector fields'\n", + "\t# arguments. Default `Dmode=True` causes partial differentiation\n", + "\t# operators to be displayed in shortened form.\n", + "Ga.dual_mode('Iinv+') \n", + " # Sets dual of a multivector to be the multivector multiplied on \n", + " # its right by the inverse unit pseudoscalar, the convention used\n", + " # in LAGA, VAGC, and GACS.\n", + "gprint(r'\\text{This notebook is now using} \\\\',\n", + " r'\\qquad\\bullet~ \\text{Python }', version[:5],\n", + " r'\\qquad\\bullet~ \\text{SymPy }', sympy.__version__[:7],\n", + " r'\\qquad\\bullet~ \\text{GAlgebra }', \n", + " galgebra.__version__[:], r'.')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Testing environment `g3` for operations `undual`, `g_invol`, `ccon`, and `sp`\n", + "\n", + "For testing purposes we will use the geometric algebra $\\mathbb{G}^{3,0}$ of Euclidean 3-space, which we implement in the next cell as `g3`. Cartesian coordinates $(x,y,z)$ are used.\n", + "\n", + "**Notation:** Unlike [GACS] and [LAGA], where boldface is used to signal that a multivector is a blade, this notebook uses boldface to denote non-scalar multivectors. Doing so allows establishes a visual distinction between a multivector $\\mathbf{A}$ and its grade 0 part, $A = \\left< \\mathbf{A} \\right>_0$. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{model } \\textsf{g3} \\textbf{ of } \\mathbb{R}^{3}:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{coordinates}~~ \\left[ x, \\ y, \\ z\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{basis}~~ \\left( \\boldsymbol{\\mathbf{e}}_{x}, \\ \\boldsymbol{\\mathbf{e}}_{y}, \\ \\boldsymbol{\\mathbf{e}}_{z}\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{metric tensor}~~ [g_{ij}] = \\left[\\begin{array}{ccc}1 & 0 & 0\\\\0 & 1 & 0\\\\0 & 0 & 1\\end{array}\\right] \\text{ is Euclidean}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{unit pseudoscalar}~~ \\mathbf{I} = \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\quad\\text{generic multivectors} \\\\ \\quad\\quad\\mathbf{A} = \\begin{aligned}[t] & A \\\\ & + A^{x} \\boldsymbol{\\mathbf{e}}_{x} + A^{y} \\boldsymbol{\\mathbf{e}}_{y} + A^{z} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + A^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + A^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xyz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\quad \\quad \\mathbf{B} = \\begin{aligned}[t] & B \\\\ & + B^{x} \\boldsymbol{\\mathbf{e}}_{x} + B^{y} \\boldsymbol{\\mathbf{e}}_{y} + B^{z} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + B^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + B^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + B^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + B^{xyz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Instantiate Cartesian coordinates.\n", + "# Instantiate the geometric algebra `g3` of Euclidean 3-space:\n", + "x, y, z = symbols('x y z', real=True) \n", + "g3 = Ga('\\mathbf{e}', \n", + " g=[[1,0,0], [0,1,0], [0,0,1]],\n", + " coords=(x,y,z))\n", + "\n", + "# Show various attributes and functions of `g3`:\n", + "gprint(r\"\\textbf{model } \\textsf{g3} \\textbf{ of } \\mathbb{R}^{3}:\")\n", + "gprint(r'\\quad \\text{coordinates}~~', g3.coords)\n", + "gprint(r'\\quad \\text{basis}~~', g3.mv())\n", + "gprint(r'\\quad \\text{metric tensor}~~ [g_{ij}] =', g3.g,\n", + " r'\\text{ is Euclidean}')\n", + "gprint(r'\\quad \\text{unit pseudoscalar}~~ \\mathbf{I} =', g3.I())\n", + "\n", + "# Instantiate and show generic multivectors `A` and `B` of `g3`:\n", + "A = g3.mv('A', 'mv')\n", + "B = g3.mv('B', 'mv')\n", + "gprint(r'\\quad\\text{generic multivectors} \\\\ \\quad\\quad\\mathbf{A} =',\n", + " A.Fmt(2), r'\\\\\\quad \\quad \\mathbf{B} =', B.Fmt(2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3 Tests of `undual`, `g_invol`, `ccon`, and `sp`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.1. `undual` (undualization)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A} = \\begin{aligned}[t] & A \\\\ & + A^{x} \\boldsymbol{\\mathbf{e}}_{x} + A^{y} \\boldsymbol{\\mathbf{e}}_{y} + A^{z} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + A^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + A^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xyz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A}^{\\star} = \\begin{aligned}[t] & A^{xyz} \\\\ & + A^{yz} \\boldsymbol{\\mathbf{e}}_{x} - A^{xz} \\boldsymbol{\\mathbf{e}}_{y} + A^{xy} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & - A^{z} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + A^{y} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} - A^{x} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & - A \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A}^{-\\star} = \\begin{aligned}[t] & - A^{xyz} \\\\ & - A^{yz} \\boldsymbol{\\mathbf{e}}_{x} + A^{xz} \\boldsymbol{\\mathbf{e}}_{y} - A^{xy} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{z} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} - A^{y} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + A^{x} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A}^{-\\star} = -\\mathbf{A}^{\\star}:~~ \\text{True} \\qquad \\text {(Note: }\\mathbf{I}^2 = -1 )$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle (\\mathbf{A}^{\\star})^{-\\star} = \\mathbf{A}:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle (\\mathbf{A}^{-\\star})^{\\star} = \\mathbf{A}:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Show `A`, its method dual, and its method undual. \n", + "gprint(r'\\mathbf{A} =', A.Fmt(2))\n", + "gprint(r'\\mathbf{A}^{\\star} =', A.dual().Fmt(2))\n", + "gprint(r'\\mathbf{A}^{-\\star} =', A.undual().Fmt(2))\n", + "gprint(r'\\mathbf{A}^{-\\star} = -\\mathbf{A}^{\\star}:~~',\n", + " A.undual() == - A.dual(), \n", + " r'\\qquad \\text {(Note: }\\mathbf{I}^2 =', I**2, ')')\n", + "\n", + "# Check whether method `dual` and method `undual` have inverse actions:\n", + "gprint(r'(\\mathbf{A}^{\\star})^{-\\star} = \\mathbf{A}:~~',\n", + " A.dual().undual() == A)\n", + "gprint(r'(\\mathbf{A}^{-\\star})^{\\star} = \\mathbf{A}:~~',\n", + " A.undual().dual() == A)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2. `g_invol` (grade involution)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A} = \\begin{aligned}[t] & A \\\\ & + A^{x} \\boldsymbol{\\mathbf{e}}_{x} + A^{y} \\boldsymbol{\\mathbf{e}}_{y} + A^{z} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + A^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + A^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xyz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\widehat{\\mathbf{A}} = \\begin{aligned}[t] & A \\\\ & - A^{x} \\boldsymbol{\\mathbf{e}}_{x} - A^{y} \\boldsymbol{\\mathbf{e}}_{y} - A^{z} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + A^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + A^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & - A^{xyz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\widehat{\\left< \\mathbf{A} \\right>_+} = +\\left< \\mathbf{A} \\right>_+:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\widehat{\\left< \\mathbf{A} \\right>_-} = -\\left< \\mathbf{A} \\right>_-:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\widehat{\\widehat{\\mathbf{A}}} = \\mathbf{A}:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Show `A` and its grade involute. \n", + "# Check whether `g_invol` is self-inverse:\n", + "gprint(r'\\mathbf{A} =', A.Fmt(2))\n", + "gprint(r'\\widehat{\\mathbf{A}} =', A.g_invol().Fmt(2))\n", + "gprint(r'\\widehat{\\left< \\mathbf{A} \\right>_+} = '\n", + " + r'+\\left< \\mathbf{A} \\right>_+:~~',\n", + " A.even().g_invol() == A.even())\n", + "gprint(r'\\widehat{\\left< \\mathbf{A} \\right>_-} = '\n", + " + r'-\\left< \\mathbf{A} \\right>_-:~~',\n", + " A.odd().g_invol() == - A.odd())\n", + "gprint(r'\\widehat{\\widehat{\\mathbf{A}}} = \\mathbf{A}:~~',\n", + " A.g_invol().g_invol() == A)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.3. `ccon` (Clifford conjugation)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A} = \\begin{aligned}[t] & A \\\\ & + A^{x} \\boldsymbol{\\mathbf{e}}_{x} + A^{y} \\boldsymbol{\\mathbf{e}}_{y} + A^{z} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + A^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + A^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xyz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\overline{\\mathbf{A}} = \\begin{aligned}[t] & A \\\\ & - A^{x} \\boldsymbol{\\mathbf{e}}_{x} - A^{y} \\boldsymbol{\\mathbf{e}}_{y} - A^{z} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & - A^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} - A^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} - A^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xyz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\overline{\\overline{\\mathbf{A}}} = \\mathbf{A}:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\overline{\\mathbf{A}} = \\widehat{\\mathbf{A}}^\\dagger:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\overline{\\mathbf{A}} = \\widehat{\\mathbf{A^\\dagger}}:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Show `A` and its Clifford conjugate. \n", + "# Check whether `ccon` is self-inverse:\n", + "gprint(r'\\mathbf{A} =', A.Fmt(2))\n", + "gprint(r'\\overline{\\mathbf{A}} =', A.ccon().Fmt(2))\n", + "gprint(r'\\overline{\\overline{\\mathbf{A}}} = \\mathbf{A}:~~',\n", + " A.ccon().ccon() == A)\n", + "gprint(r'\\overline{\\mathbf{A}} = \\widehat{\\mathbf{A}}^\\dagger:~~',\n", + " A.ccon() == (A.g_invol()).rev())\n", + "gprint(r'\\overline{\\mathbf{A}} = \\widehat{\\mathbf{A^\\dagger}}:~~',\n", + " A.ccon() == (A.g_invol()).rev())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.4. `sp` (scalar products)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A} = \\begin{aligned}[t] & A \\\\ & + A^{x} \\boldsymbol{\\mathbf{e}}_{x} + A^{y} \\boldsymbol{\\mathbf{e}}_{y} + A^{z} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + A^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + A^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + A^{xyz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{B} = \\begin{aligned}[t] & B \\\\ & + B^{x} \\boldsymbol{\\mathbf{e}}_{x} + B^{y} \\boldsymbol{\\mathbf{e}}_{y} + B^{z} \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + B^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + B^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + B^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + B^{xyz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A} \\ast \\mathbf{B} = \\left< \\mathbf{A} \\mathbf{B} \\right>_0:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A} \\ast \\mathbf{B} = A B + A^{x} B^{x} - A^{xy} B^{xy} - A^{xyz} B^{xyz} - A^{xz} B^{xz} + A^{y} B^{y} - A^{yz} B^{yz} + A^{z} B^{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\Vert \\mathbf{A} \\Vert^2 = A^\\dagger \\ast A:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A} \\circledast \\mathbf{B} = A B + A^{x} B^{x} + A^{xy} B^{xy} + A^{xyz} B^{xyz} + A^{xz} B^{xz} + A^{y} B^{y} + A^{yz} B^{yz} + A^{z} B^{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\Vert\\mathbf{A}\\Vert^2 = \\mathbf{A}\\circledast\\mathbf{A}:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A} \\ast \\mathbf{B} =\\mathbf{A}^\\dagger \\circledast \\mathbf{B}:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A} \\circledast \\mathbf{B} =\\mathbf{A}^\\dagger \\ast \\mathbf{B}:~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Show `A`, `B`, their scalar product, and their alternate \n", + "# scalar product.\n", + "gprint(r'\\mathbf{A} =', A.Fmt(2))\n", + "gprint(r'\\mathbf{B} =', B.Fmt(2))\n", + "gprint(r'\\mathbf{A} \\ast \\mathbf{B} = '\n", + " + r'\\left< \\mathbf{A} \\mathbf{B} \\right>_0:~~',\n", + " A.sp(B) == (A*B).scalar()) \n", + "gprint(r'\\mathbf{A} \\ast \\mathbf{B} =', A.sp(B))\n", + "gprint(r'\\Vert \\mathbf{A} \\Vert^2 = A^\\dagger \\ast A:~~',\n", + " A.norm2() == A.rev().sp(A))\n", + "gprint(r'\\mathbf{A} \\circledast \\mathbf{B} =', A.sp(B,'rev'))\n", + "gprint(r'\\Vert\\mathbf{A}\\Vert^2 = \\mathbf{A}\\circledast\\mathbf{A}:~~',\n", + " A.norm2() == A.sp(A,'rev'))\n", + "gprint(r'\\mathbf{A} \\ast \\mathbf{B} ='\n", + " + r'\\mathbf{A}^\\dagger \\circledast \\mathbf{B}:~~',\n", + " A.sp(B) == A.rev().sp(B, 'rev'))\n", + "gprint(r'\\mathbf{A} \\circledast \\mathbf{B} ='\n", + " + r'\\mathbf{A}^\\dagger \\ast \\mathbf{B}:~~',\n", + " A.sp(B,'rev') == A.rev().sp(B))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above tests include tests of the relationship of the (usual) scalar product $\\ast$ and the alternate scalar product $\\circledast$ to the normsquared operation $\\Vert \\cdot \\Vert^2$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.5. Conclusions from testing the new operations\n", + "\n", + "The output from each of the executable In[ ] cells of subsections 3.1, 3.2, 3.3, and 3.4 was precisely what was expected from calculations done by hand. That, together with the simplicity of the code, should give confidence that the operations were correctly coded." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Testing environments `e2`, `e2_polar`, `m2`, and `m2_polar` for `norm2` and `norm`\n", + "\n", + "We shall test `norm2` and `norm` in the context of four simple models: \n", + "1. `e2` models $\\mathbb{E}^2$ (Euclidean 2-space) using Cartesian coordinates $(x,y)$. The basis $(\\mathbf{e}_x,\\mathbf{e}_y)$ for the tangent space to $\\mathbb{E}^2$ at location $(x,y)$ is orthonormal. Basis vectors are independent of location, which is to say every tangent space uses the same basis. \n", + "\n", + "2. `e2_polar` models $\\mathbb{E}^2$ using polar coordinates $(r,\\theta)$, which are related to the Cartesian coordinates through the relationship $(x,y) = (r \\cos(\\theta), r \\sin(\\theta))$. The basis $(\\mathbf{b}_r,\\mathbf{b}_\\theta)$ for the tangent space to $\\mathbb{E}^2$ at location $(r,\\theta)$ is orthogonal but not orthonormal. The lengths and directions of the basis vectors depend on location ($(r,\\theta)$) (the point of tangency). The origin $r=0$ is excluded from the coordinate system, so we require $r>0$. \n", + "\n", + "3. `m2` models $\\mathbb{M}^{1,1}$ (Minkowski 2-space) using Cartesian coordinates $(s,t)$. The basis $(\\mathbf{e}_s,\\mathbf{e}_t)$ for the tangent space to $\\mathbb{M}^{1,1}$ at $(s,t)$ is orthonormal. Basis vectors are independent of location $(s,t)$. \n", + "\n", + "4. `m2_polar` models $\\mathbb{M}^{1,1}$ using hyperbolic polar coordinates$^\\ast$ $(\\rho,\\phi)$, which are related to the Cartesian coordinates through the relationship $(s,t) = (\\rho \\cosh(\\phi), \\rho \\sinh(\\phi))$. The basis $(\\mathbf{b}_\\rho,\\mathbf{b}_\\phi)$ for the tangent space to $\\mathbb{E}^2$ at $(\\rho,\\phi)$ is orthogonal but not orthonormal. The lengths and directions of the basis vectors depend on location. Hyperbolic polar coordinates as defined here correspond to the region described in Cartesian coordinates $(s,t)$ as lying between the null lines $t=+s$ and $t=-s$, with $s>0$. In particular this excludes the origin $\\rho=0$, so we require $\\rho>0$. But even were the origin included, the polar coordinates describe only a quarter of the 2-space. More specifically they should be called a coordinates *patch*.\n", + "\n", + "For each of the four models I define a symbolic multivector $\\mathbf{S}$ and a constant (location-independent) numeric multivector $\\mathbf{N}$. The numeric multivector `N2` of model `e2_polar` has been so designed as to represent the same constant multivector $\\mathbf{N}$ as numeric multivector `N1` of model `e2`. Similarly `N4` of `m2_polar` represents the same constant numeric multivector as does `N3` of `m2`. For models `m2` and `m2_polar` of the non-Euclidean space $\\mathbb{M}^{1,1}$, I also define multivector fields $\\mathbf{A}$ and $\\mathbf{B}$, respectively, for which $\\Vert\\mathbf{A}\\Vert^2 > 0$ and $\\Vert\\mathbf{B}\\Vert^2 < 0$.\n", + "\n", + "$^\\ast$ \"Hyperbolic polar\" is a name of my own invention, meant to indicate an analog on the *hyperbolic* plane (Minkowski 2-space) of *polar* coordinates $(r,\\theta)$ on the Euclidean plane. If there's a standard name or standard symbols for these coordinates, I'm unaware of it." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{model }\\textsf{e2}\\textbf{ of }\\mathbb{E}^2:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{coordinates}~~ \\left[ x, \\ y\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{basis}~~ \\left( \\boldsymbol{\\mathbf{e}}_{x}, \\ \\boldsymbol{\\mathbf{e}}_{y}\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{metric tensor}~~ [g_{ij}] = \\left[\\begin{array}{cc}1 & 0\\\\0 & 1\\end{array}\\right] \\text{ is Euclidean:}~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{multivectors}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{S} = S + S^{x} \\boldsymbol{\\mathbf{e}}_{x} + S^{y} \\boldsymbol{\\mathbf{e}}_{y} + S^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{N} = - 2 \\sqrt{6} - \\frac{3 \\sqrt{3}}{2} \\boldsymbol{\\mathbf{e}}_{x} + \\frac{3}{2} \\boldsymbol{\\mathbf{e}}_{y} -4 \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Model 1 \n", + "# Create Cartesian coordinates model `e2` of Euclidean 2-space.\n", + "x, y = symbols('x y', real=True)\n", + "e2 = Ga('\\mathbf{e}', g=[1,1], coords=(x,y))\n", + "ex, ey = e2.mv()\n", + "# Create symbolic mixed grade multivector `S1`.\n", + "S1 = e2.mv('S', 'mv')\n", + "# Create numeric mixed grade multivector `N1`.\n", + "N1 = -sqrt(24) - (sqrt(27)/2)*ex + Rational(3,2)*ey - 4*(ex^ey)\n", + "\n", + "# Show various attributes and functions of `e2`:\n", + "gprint(r\"\\textbf{model }\\textsf{e2}\\textbf{ of }\\mathbb{E}^2:\")\n", + "gprint(r'\\quad \\text{coordinates}~~', e2.coords)\n", + "gprint(r'\\quad \\text{basis}~~', e2.mv())\n", + "gprint(r'\\quad \\text{metric tensor}~~ [g_{ij}] =', e2.g,\n", + " r'\\text{ is Euclidean:}~~', e2.g.is_positive_definite)\n", + "# Show multivectors `S1` and `N1` of `e2`:\n", + "gprint(r'\\quad \\text{multivectors}')\n", + "gprint(r'\\quad \\quad \\mathbf{S} =', S1)\n", + "gprint(r'\\quad \\quad \\mathbf{N} =', N1)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{model }\\textsf{e2_polar}\\textbf{ of }\\mathbb{E}^2:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{coordinates}~~ \\left[ r, \\ \\theta \\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{basis}~~ \\left( \\boldsymbol{\\mathbf{b}}_{r}, \\ \\boldsymbol{\\mathbf{b}}_{\\theta }\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{metric tensor}~~ [g_{ij}] = \\left[\\begin{array}{cc}1 & 0\\\\0 & r^{2}\\end{array}\\right] \\text{ is Euclidean:}~~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{multivectors}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{S} = S + S^{r} \\boldsymbol{\\mathbf{b}}_{r} + S^{\\theta } \\boldsymbol{\\mathbf{b}}_{\\theta } + S^{r\\theta } \\boldsymbol{\\mathbf{b}}_{r}\\wedge \\boldsymbol{\\mathbf{b}}_{\\theta } $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{N} = - 2 \\sqrt{6} - 3 \\cos{\\left (\\theta + \\frac{\\pi}{6} \\right )} \\boldsymbol{\\mathbf{b}}_{r} + \\frac{3 \\sin{\\left (\\theta + \\frac{\\pi}{6} \\right )}}{r} \\boldsymbol{\\mathbf{b}}_{\\theta } - \\frac{4}{r} \\boldsymbol{\\mathbf{b}}_{r}\\wedge \\boldsymbol{\\mathbf{b}}_{\\theta } $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Model 2\n", + "# Create polar coordinates model `e2_polar` of Euclidean 2-space. \n", + "r = symbols('r', positive=True) # origin r=0 NOT included \n", + "theta = symbols('theta', real=True)\n", + "p = (r*cos(theta), r*sin(theta)) \n", + "e2_polar = Ga('\\mathbf{b}', g=[1,r**2], coords=(r,theta))\n", + "br, btheta = e2_polar.mv() # basis vectors NOT normalized\n", + "# Create symbolic mixed grade multivector `S2`.\n", + "# Create numeric mixed grade multivector `N2`.\n", + "S2 = e2_polar.mv('S', 'mv')\n", + "N2 = -sqrt(24) + ((3*sin(theta) - sqrt(27)*cos(theta))/2)*br \\\n", + " + ((3*cos(theta) + sqrt(27)*sin(theta))/(2*r))*btheta \\\n", + " - (4/r)*(br^btheta)\n", + "\n", + "# Show various attributes and functions of `e2_polar`:\n", + "gprint(r\"\\textbf{model }\\textsf{e2_polar}\\textbf{ of }\\mathbb{E}^2:\")\n", + "gprint(r'\\quad \\text{coordinates}~~', e2_polar.coords)\n", + "gprint(r'\\quad \\text{basis}~~', e2_polar.mv())\n", + "gprint(r'\\quad \\text{metric tensor}~~ [g_{ij}] =', e2_polar.g,\n", + " r'\\text{ is Euclidean:}~~', e2_polar.g.is_positive_definite)\n", + "# Show multivectors `S2` and `N2` of `e2_polar`:\n", + "gprint(r'\\quad \\text{multivectors}')\n", + "gprint(r'\\quad \\quad \\mathbf{S} =', S2)\n", + "gprint(r'\\quad \\quad \\mathbf{N} =', N2)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{model }\\textsf{m2}\\textbf{ of }\\mathbb{M}^{1,1}:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{coordinates}~~ \\left[ s, \\ t\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{basis}~~ \\left( \\boldsymbol{\\mathbf{e}}_{s}, \\ \\boldsymbol{\\mathbf{e}}_{t}\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{metric tensor}~~ [g_{ij}] = \\left[\\begin{array}{cc}1 & 0\\\\0 & -1\\end{array}\\right] \\text{ is Euclidean:}~~ \\text{False} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{multivectors}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{S} = S + S^{s} \\boldsymbol{\\mathbf{e}}_{s} + S^{t} \\boldsymbol{\\mathbf{e}}_{t} + S^{st} \\boldsymbol{\\mathbf{e}}_{s}\\wedge \\boldsymbol{\\mathbf{e}}_{t} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{N} = - 2 \\sqrt{7} + 3 \\boldsymbol{\\mathbf{e}}_{s} + 5 \\boldsymbol{\\mathbf{e}}_{t} - \\sqrt{37} \\boldsymbol{\\mathbf{e}}_{s}\\wedge \\boldsymbol{\\mathbf{e}}_{t} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{A} = 5 + \\left ( s^{2} + t^{2}\\right ) \\boldsymbol{\\mathbf{e}}_{s} + s^{2} \\boldsymbol{\\mathbf{e}}_{t} -5 \\boldsymbol{\\mathbf{e}}_{s}\\wedge \\boldsymbol{\\mathbf{e}}_{t} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Model 3 \n", + "# Create Cartesian coordinates model `m2` of Minkowski 2-space. \n", + "s, t = symbols('s t', real=True)\n", + "m2 = Ga('\\mathbf{e}', g=[1,-1], coords=(s,t))\n", + "es, et = m2.mv()\n", + "# Create symbolic mixed grade multivector `S3`.\n", + "S3 = m2.mv('S', 'mv')\n", + "# Create numeric mixed grade multivector `N3`.\n", + "N3 = -sqrt(28) + 3*es + 5*et - sqrt(37)*(es^et)\n", + "# Create position-dependent multivector `A3` with a nonnegative\n", + "# normsquared. `A3` will be used to test Case 3(a) in the execution\n", + "# of `norm`'s code.\n", + "A3 = 5 + (s**2 + t**2)*es + (s**2)*et - 5*(es^et) \n", + "\n", + "# Show various attributes and functions of `m2`:\n", + "gprint(r\"\\textbf{model }\\textsf{m2}\\textbf{ of }\\mathbb{M}^{1,1}:\")\n", + "gprint(r'\\quad \\text{coordinates}~~', m2.coords)\n", + "gprint(r'\\quad \\text{basis}~~', m2.mv())\n", + "gprint(r'\\quad \\text{metric tensor}~~ [g_{ij}] =', m2.g,\n", + " r'\\text{ is Euclidean:}~~', m2.g.is_positive_definite)\n", + "# Show multivectors `S3`,`N3`, and `A3` of `m2`:\n", + "gprint(r'\\quad \\text{multivectors}')\n", + "gprint(r'\\quad \\quad \\mathbf{S} =', S3)\n", + "gprint(r'\\quad \\quad \\mathbf{N} =', N3)\n", + "gprint(r'\\quad \\quad \\mathbf{A} =', A3)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{model }\\textsf{m2_polar}\\textbf{ of }\\mathbb{M}^{1,1}:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{coordinates}~~ \\left[ \\rho , \\ \\phi \\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{basis}~~ \\left( \\boldsymbol{\\mathbf{b}}_{\\rho }, \\ \\boldsymbol{\\mathbf{b}}_{\\phi }\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{metric tensor}~~ [g_{ij}] = \\left[\\begin{array}{cc}1 & 0\\\\0 & - \\rho ^{2}\\end{array}\\right] \\text{ is Euclidean:}~~ \\text{False} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\text{multivectors}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{S} = S + S^{\\rho } \\boldsymbol{\\mathbf{b}}_{\\rho } + S^{\\phi } \\boldsymbol{\\mathbf{b}}_{\\phi } + S^{\\rho \\phi } \\boldsymbol{\\mathbf{b}}_{\\rho }\\wedge \\boldsymbol{\\mathbf{b}}_{\\phi } $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{N} = - 2 \\sqrt{7} + \\left ( - e^{\\phi } + 4 e^{- \\phi }\\right ) \\boldsymbol{\\mathbf{b}}_{\\rho } + \\frac{e^{\\phi } + 4 e^{- \\phi }}{\\rho } \\boldsymbol{\\mathbf{b}}_{\\phi } - \\frac{\\sqrt{37}}{\\rho } \\boldsymbol{\\mathbf{b}}_{\\rho }\\wedge \\boldsymbol{\\mathbf{b}}_{\\phi } $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\quad \\quad \\mathbf{B} = \\rho ^{2} -16 \\boldsymbol{\\mathbf{b}}_{\\rho } + \\frac{16}{\\rho } \\boldsymbol{\\mathbf{b}}_{\\phi } - \\sqrt{\\phi ^{2} + \\rho ^{2}} \\boldsymbol{\\mathbf{b}}_{\\rho }\\wedge \\boldsymbol{\\mathbf{b}}_{\\phi } $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Model 4 \n", + "# Create hyperbolic polar coordinates model `m2_polar` of\n", + "# Minkowski 2-space.\n", + "rho = symbols('rho', positive=True) # origin rho=0 NOT included\n", + "phi = symbols('phi', real=True)\n", + "m2_polar = Ga('\\mathbf{b}', g=[1,-rho**2], coords=(rho, phi))\n", + "brho, bphi = m2_polar.mv() # basis vectors NOT normalized\n", + "# Create symbolic mixed grade multivector `S4`.\n", + "S4 = m2_polar.mv('S', 'mv')\n", + "# Create numeric mixed grade multivector `N3`.\n", + "N4 = -sqrt(28) + (3*cosh(phi) - 5*sinh(phi))*brho \\\n", + " + ((5*cosh(phi) - 3*sinh(phi))/rho)*bphi \\\n", + " - (sqrt(37)/rho)*(brho^bphi)\n", + "# Create position-dependent multivector `B4` with a nonpositive\n", + "# normsquared. `B4` will be used to test Case 3(b) in the execution\n", + "# of `norm`'s code.\n", + "B4 = rho**2 - 16*brho + (16/rho)*bphi - sqrt(rho**2 \\\n", + " + phi**2)*(brho^bphi)\n", + "\n", + "# Show various attributes and functions of `m2_polar`:\n", + "gprint(r\"\\textbf{model }\\textsf{m2_polar}\\textbf{ of }\\mathbb{M}^{1,1}:\")\n", + "gprint(r'\\quad \\text{coordinates}~~', m2_polar.coords)\n", + "gprint(r'\\quad \\text{basis}~~', m2_polar.mv())\n", + "gprint(r'\\quad \\text{metric tensor}~~ [g_{ij}] =', m2_polar.g,\n", + " r'\\text{ is Euclidean:}~~', m2_polar.g.is_positive_definite)\n", + "# Show multivectors `S4`,`N4`, and `B4` of `m2_polar`:\n", + "gprint(r'\\quad \\text{multivectors}')\n", + "gprint(r'\\quad \\quad \\mathbf{S} =', S4)\n", + "gprint(r'\\quad \\quad \\mathbf{N} =', N4)\n", + "gprint(r'\\quad \\quad \\mathbf{B} =', B4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Remark:* The above reports as to whether the model's metric tensor `g` is Euclidean use the same test `g.is_positive_definite` as is used in Case 2 of `norm`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. The test program for `norm2` and `norm` \n", + "The next cell defines a program that displays the multivector `M` which is its argument, indicates the geometric algebra to which `M` belongs, shows the normsquared of `M`, and then shows for each of the three possible `hint` values the norm of `M`.\n", + "\n", + "Only multivectors defined in Section 4 (i.e. `S1`, `S2`, `S3`, `S4`, `N1`, `N2`, `N3`, `N4`, `A3`, and `B4`) are allowed values of `M`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def test_with(M):\n", + " \"\"\"\n", + " Computes and displays the multivector `M`, its normsquared, \n", + " and its norm as computed with each of the allowed hint values.\n", + " Does the same for each grade part of `M`.\n", + " \"\"\"\n", + " ga_str = \\\n", + " {e2:r'\\mathbb{G}(\\mathbb{E}^2)',\n", + " e2_polar:r'\\mathbb{G}(\\mathbb{E}^2)',\n", + " m2:r'\\mathbb{G}(\\mathbb{M}^{1,1})',\n", + " m2_polar:r'\\mathbb{G}(\\mathbb{M}^{1,1})'}\n", + " model_str = {e2:r'\\textsf{e2}', e2_polar:r'\\textsf{e2_polar}',\n", + " m2:r'\\testsf{m2}', m2_polar:r'\\textsf{m2_polar}'}\n", + " M_str = {S1:r'\\mathbf{S}', S2:r'\\mathbf{S}',\n", + " S3:r'\\mathbf{S}', S4:r'\\mathbf{S}',\n", + " N1:r'\\mathbf{N}', N2:r'\\mathbf{N}',\n", + " N3:r'\\mathbf{N}', N4:r'\\mathbf{N}',\n", + " A3:r'\\mathbf{A}', B4:r'\\mathbf{B}'}\n", + " # Display multivector `M`, its normsquared, and its norm:\n", + " gprint(M_str[M] + r'=', M, r'\\in', ga_str[M.Ga])\n", + " gprint(r'\\qquad \\implies \\Vert'+M_str[M]+r'\\Vert^2 =', \n", + " M.norm2())\n", + " gprint(r'\\qquad \\implies \\vert'+M_str[M]+r'\\vert =',\n", + " M.norm('0'), r\"\\quad \\text{ when hint is '0'}\")\n", + " gprint(r'\\qquad \\qquad\\; \\vert'+M_str[M]+r'\\vert =', \n", + " M.norm('+'), r\"\\quad \\text{ when hint is '+'}\")\n", + " gprint(r'\\qquad \\qquad\\; \\vert'+M_str[M]+r'\\vert =', \n", + " M.norm('-'), r\"\\quad \\text{ when hint is '-'}\")\n", + " # Display grade parts of multivector `M`, their normsquareds,\n", + " # and their norms:\n", + " for g in range(3):\n", + " gprint(r'\\left<' +M_str[M]+r'\\right>_'+str(g)+r' =',\n", + " M.grade(g), r'\\in ', ga_str[M.grade(g).Ga]) \n", + " gprint(r'\\qquad \\implies \\Vert\\left<'+M_str[M]+r'\\right>_'\n", + " +str(g)+r'\\Vert^2 =', M.grade(g).norm2())\n", + " gprint(r'\\qquad \\implies \\vert\\left<'+M_str[M]+r'\\right>_'\n", + " +str(g)+r'\\vert =', M.grade(g).norm('0'),\n", + " r\"\\quad \\text{ when hint is '0'}\")\n", + " gprint(r'\\qquad \\qquad\\; \\vert\\left<'+M_str[M]+r'\\right>_'\n", + " +str(g)+r'\\vert =', M.grade(g).norm('+'),\n", + " r\"\\quad \\text{ when hint is '+'}\")\n", + " gprint(r'\\qquad \\qquad\\; \\vert\\left<'+M_str[M]+r'\\right>_'\n", + " +str(g)+r'\\vert =', M.grade(g).norm('-'),\n", + " r\"\\quad \\text{ when hint is '-'}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Tests of `norm2` and `norm`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.1 Testing within `e2` \n", + "The next two In[ ] cells test `norm2` and `norm` with the multivectors `S1` and `N1` from `e2`. \n", + "- Since `e2` has a Euclidean metric, the value of `S1.norm(hint)` should not and does not depend on the `hint` given.\n", + "- Since `N1` is a location-independent numeric multivector, the value of `N1.norm(hint)` should not and does not depend on the `hint` given. Neither does it depend on location." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{S}= S + S^{x} \\boldsymbol{\\mathbf{e}}_{x} + S^{y} \\boldsymbol{\\mathbf{e}}_{y} + S^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} \\in\\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} + {\\left ( S^{x} \\right )}^{2} + {\\left ( S^{xy} \\right )}^{2} + {\\left ( S^{y} \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} + {\\left ( S^{x} \\right )}^{2} + {\\left ( S^{xy} \\right )}^{2} + {\\left ( S^{y} \\right )}^{2}} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} + {\\left ( S^{x} \\right )}^{2} + {\\left ( S^{xy} \\right )}^{2} + {\\left ( S^{y} \\right )}^{2}} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} + {\\left ( S^{x} \\right )}^{2} + {\\left ( S^{xy} \\right )}^{2} + {\\left ( S^{y} \\right )}^{2}} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_0 = S \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_0\\Vert^2 = S^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_1 = S^{x} \\boldsymbol{\\mathbf{e}}_{x} + S^{y} \\boldsymbol{\\mathbf{e}}_{y} \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = {\\left ( S^{x} \\right )}^{2} + {\\left ( S^{y} \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{x} \\right )}^{2} + {\\left ( S^{y} \\right )}^{2}} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{x} \\right )}^{2} + {\\left ( S^{y} \\right )}^{2}} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{x} \\right )}^{2} + {\\left ( S^{y} \\right )}^{2}} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_2 = S^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = {\\left ( S^{xy} \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(S1)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{N}= - 2 \\sqrt{6} - \\frac{3 \\sqrt{3}}{2} \\boldsymbol{\\mathbf{e}}_{x} + \\frac{3}{2} \\boldsymbol{\\mathbf{e}}_{y} -4 \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} \\in\\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = 49 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{N}\\vert = 7 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{N}\\vert = 7 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{N}\\vert = 7 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_0 = - 2 \\sqrt{6} \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_0\\Vert^2 = 24 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{6} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{6} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{6} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_1 = - \\frac{3 \\sqrt{3}}{2} \\boldsymbol{\\mathbf{e}}_{x} + \\frac{3}{2} \\boldsymbol{\\mathbf{e}}_{y} \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = 9 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_1\\vert = 3 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_1\\vert = 3 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_1\\vert = 3 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_2 = -4 \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = 16 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_2\\vert = 4 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_2\\vert = 4 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_2\\vert = 4 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(N1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.2 Testing within `e2_polar` \n", + "The next two In[ ] cells test `norm2` and `norm` with the multivectors `S2` and `N2` from `e2_polar`. \n", + "- Since `e2_polar` has a Euclidean metric, the value of `S2.norm(hint)` should not and does not depend on the `hint` given.\n", + "- Since `N2` is a location-independent numeric multivector, the value of `N2.norm(hint)` should not and does not depend on the `hint` given. Neither does it depend on location.\n", + "- Notice the results for `N2` should and do agree with those for `N1` above, which is as desired since `N1` and `N2` represent the same position-independent numeric multivector in $\\mathbb{G}(\\mathbb{E}^2)$." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{S}= S + S^{r} \\boldsymbol{\\mathbf{b}}_{r} + S^{\\theta } \\boldsymbol{\\mathbf{b}}_{\\theta } + S^{r\\theta } \\boldsymbol{\\mathbf{b}}_{r}\\wedge \\boldsymbol{\\mathbf{b}}_{\\theta } \\in\\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} + {\\left ( S^{r} \\right )}^{2} + {\\left ( S^{r\\theta } \\right )}^{2} r^{2} + {\\left ( S^{\\theta } \\right )}^{2} r^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} + {\\left ( S^{r} \\right )}^{2} + {\\left ( S^{r\\theta } \\right )}^{2} r^{2} + {\\left ( S^{\\theta } \\right )}^{2} r^{2}} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} + {\\left ( S^{r} \\right )}^{2} + {\\left ( S^{r\\theta } \\right )}^{2} r^{2} + {\\left ( S^{\\theta } \\right )}^{2} r^{2}} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} + {\\left ( S^{r} \\right )}^{2} + {\\left ( S^{r\\theta } \\right )}^{2} r^{2} + {\\left ( S^{\\theta } \\right )}^{2} r^{2}} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_0 = S \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_0\\Vert^2 = S^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_1 = S^{r} \\boldsymbol{\\mathbf{b}}_{r} + S^{\\theta } \\boldsymbol{\\mathbf{b}}_{\\theta } \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = {\\left ( S^{r} \\right )}^{2} + {\\left ( S^{\\theta } \\right )}^{2} r^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{r} \\right )}^{2} + {\\left ( S^{\\theta } \\right )}^{2} r^{2}} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{r} \\right )}^{2} + {\\left ( S^{\\theta } \\right )}^{2} r^{2}} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{r} \\right )}^{2} + {\\left ( S^{\\theta } \\right )}^{2} r^{2}} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_2 = S^{r\\theta } \\boldsymbol{\\mathbf{b}}_{r}\\wedge \\boldsymbol{\\mathbf{b}}_{\\theta } \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = {\\left ( S^{r\\theta } \\right )}^{2} r^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(S2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Remark:* SymPy was able to take a factor of $r^2$ out from under the radical as $r$ rather than $\\vert r \\vert$ because `r` was instantiated with condition `positive=True`. SymPy does not know whether basis blade coefficients $S$ and $S^{r\\theta}$ are nonnegative, so it takes their squares out from under the radical as $\\vert S \\vert$ and $\\vert S^{r\\theta} \\vert$." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{N}= - 2 \\sqrt{6} - 3 \\cos{\\left (\\theta + \\frac{\\pi}{6} \\right )} \\boldsymbol{\\mathbf{b}}_{r} + \\frac{3 \\sin{\\left (\\theta + \\frac{\\pi}{6} \\right )}}{r} \\boldsymbol{\\mathbf{b}}_{\\theta } - \\frac{4}{r} \\boldsymbol{\\mathbf{b}}_{r}\\wedge \\boldsymbol{\\mathbf{b}}_{\\theta } \\in\\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = 49 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{N}\\vert = 7 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{N}\\vert = 7 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{N}\\vert = 7 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_0 = - 2 \\sqrt{6} \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_0\\Vert^2 = 24 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{6} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{6} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{6} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_1 = - 3 \\cos{\\left (\\theta + \\frac{\\pi}{6} \\right )} \\boldsymbol{\\mathbf{b}}_{r} + \\frac{3 \\sin{\\left (\\theta + \\frac{\\pi}{6} \\right )}}{r} \\boldsymbol{\\mathbf{b}}_{\\theta } \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = 9 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_1\\vert = 3 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_1\\vert = 3 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_1\\vert = 3 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_2 = - \\frac{4}{r} \\boldsymbol{\\mathbf{b}}_{r}\\wedge \\boldsymbol{\\mathbf{b}}_{\\theta } \\in \\mathbb{G}(\\mathbb{E}^2)$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = 16 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_2\\vert = 4 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_2\\vert = 4 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_2\\vert = 4 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(N2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.3 Testing within `m2` \n", + "The next three In[ ] cells test `norm2` and `norm` using the `m2` multivectors `S3`, `N3`, and `A3. \n", + "- Since `m2` has a non-Euclidean metric, the value of `S3.norm(hint)` should be expected to and does depend on the `hint` given.\n", + "- Since `N3` is a location-independent numeric multivector, the value of `N3.norm(hint)` should not and does not depend on the `hint` given. Neither does it depend on location.\n", + "- `A3` has a nonnegative normsquared, discernible as such by SymPy, so it should and does trigger Case 3(a) of `norm`'s code, leading to a `A3.norm(hint)` which is `hint` independent." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{S}= S + S^{s} \\boldsymbol{\\mathbf{e}}_{s} + S^{t} \\boldsymbol{\\mathbf{e}}_{t} + S^{st} \\boldsymbol{\\mathbf{e}}_{s}\\wedge \\boldsymbol{\\mathbf{e}}_{t} \\in\\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{- S^{2} - {\\left ( S^{s} \\right )}^{2} + {\\left ( S^{st} \\right )}^{2} + {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_0 = S \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_0\\Vert^2 = S^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_1 = S^{s} \\boldsymbol{\\mathbf{e}}_{s} + S^{t} \\boldsymbol{\\mathbf{e}}_{t} \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{- {\\left ( S^{s} \\right )}^{2} + {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_2 = S^{st} \\boldsymbol{\\mathbf{e}}_{s}\\wedge \\boldsymbol{\\mathbf{e}}_{t} \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = - {\\left ( S^{st} \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(S3)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{N}= - 2 \\sqrt{7} + 3 \\boldsymbol{\\mathbf{e}}_{s} + 5 \\boldsymbol{\\mathbf{e}}_{t} - \\sqrt{37} \\boldsymbol{\\mathbf{e}}_{s}\\wedge \\boldsymbol{\\mathbf{e}}_{t} \\in\\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = -25 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{N}\\vert = 5 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{N}\\vert = 5 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{N}\\vert = 5 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_0 = - 2 \\sqrt{7} \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_0\\Vert^2 = 28 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{7} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{7} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{7} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_1 = 3 \\boldsymbol{\\mathbf{e}}_{s} + 5 \\boldsymbol{\\mathbf{e}}_{t} \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = -16 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_1\\vert = 4 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_1\\vert = 4 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_1\\vert = 4 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_2 = - \\sqrt{37} \\boldsymbol{\\mathbf{e}}_{s}\\wedge \\boldsymbol{\\mathbf{e}}_{t} \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = -37 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_2\\vert = \\sqrt{37} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_2\\vert = \\sqrt{37} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_2\\vert = \\sqrt{37} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(N3)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{A}= 5 + \\left ( s^{2} + t^{2}\\right ) \\boldsymbol{\\mathbf{e}}_{s} + s^{2} \\boldsymbol{\\mathbf{e}}_{t} -5 \\boldsymbol{\\mathbf{e}}_{s}\\wedge \\boldsymbol{\\mathbf{e}}_{t} \\in\\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{A}\\Vert^2 = t^{2} \\left(2 s^{2} + t^{2}\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{A}\\vert = \\sqrt{2 s^{2} + t^{2}} \\left|{t}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{A}\\vert = \\sqrt{2 s^{2} + t^{2}} \\left|{t}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{A}\\vert = \\sqrt{2 s^{2} + t^{2}} \\left|{t}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{A}\\right>_0 = 5 \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_0\\Vert^2 = 25 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{A}\\right>_0\\vert = 5 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{A}\\right>_0\\vert = 5 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{A}\\right>_0\\vert = 5 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{A}\\right>_1 = \\left ( s^{2} + t^{2}\\right ) \\boldsymbol{\\mathbf{e}}_{s} + s^{2} \\boldsymbol{\\mathbf{e}}_{t} \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_1\\Vert^2 = t^{2} \\left(2 s^{2} + t^{2}\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{A}\\right>_1\\vert = \\sqrt{2 s^{2} + t^{2}} \\left|{t}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{A}\\right>_1\\vert = \\sqrt{2 s^{2} + t^{2}} \\left|{t}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{A}\\right>_1\\vert = \\sqrt{2 s^{2} + t^{2}} \\left|{t}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{A}\\right>_2 = -5 \\boldsymbol{\\mathbf{e}}_{s}\\wedge \\boldsymbol{\\mathbf{e}}_{t} \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_2\\Vert^2 = -25 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{A}\\right>_2\\vert = 5 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{A}\\right>_2\\vert = 5 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{A}\\right>_2\\vert = 5 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{A3.norm2() >= 0}: \\quad \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{(A3.norm2() >= 0) == 0}: \\quad \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{A3.norm2() <= 0}: \\quad t^{2} \\left(2 s^{2} + t^{2}\\right) \\leq 0 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{(A3.norm2() <= 0) == 0}: \\quad \\text{False} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{A3.norm2() < 0}: \\quad \\text{False} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{(A3.norm2() < 0) == 0}: \\quad \\text{False} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(A3)\n", + "# Is `normsquared` nonnegative? Show values of relational and \n", + "# conditional in Case 3(a) of `norm`'s code:\n", + "gprint(r'\\text{A3.norm2() >= 0}: \\quad', A3.norm2() >= 0)\n", + "gprint(r'\\text{(A3.norm2() >= 0) == 0}: \\quad',\n", + " (A3.norm2() >= 0) == True)\n", + "# Is `normsquared` nonpositive? Show values of relational and \n", + "# conditional in Case 3(b):\n", + "gprint(r'\\text{A3.norm2() <= 0}: \\quad', A3.norm2() <= 0)\n", + "gprint(r'\\text{(A3.norm2() <= 0) == 0}: \\quad',\n", + " (A3.norm2() <= 0) == True)\n", + "# Is `normsquared` negative? Show values of relational and \n", + "# conditional complementary to Case 3(a):\n", + "gprint(r'\\text{A3.norm2() < 0}: \\quad', A3.norm2() < 0)\n", + "gprint(r'\\text{(A3.norm2() < 0) == 0}: \\quad',\n", + " (A3.norm2() < 0) == True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So as to provide a test of Case 3(a) in the execution of `norm`, the multivector `A3` from `m2` was designed to have a nonnegative `normsquared`. (The various cases are described in the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**.) The relational `normsquared >= 0` within Case 3(a)'s conditional evaluates to `True`; hence the conditional itself, `(normsquared >= 0) == True`, also evaluates to `True`. The consequent of the `if` statement then executes, returning the `hint`-independent expression `\\sqrt(+normsquared)`.\n", + "\n", + "As an experiment as to how SymPy would handle other relationals, the above cell also showed how SymPy would evaluate the nonpositivity relational `normsquared <= 0` of Case 3(b)'s conditional. SymPy wasn't able to assign a `True` or `False` value to `normsquared <= 0`, possibly because some of the possible values of `normsquared` are positive.\n", + "\n", + "Not unexpectedly, the complementary relational `normsquared < 0` (negativity) to Case 3(a)'s `normsquared >= 0` relational returns `False` when the 3(a) relational (nonnegativity) returns `True`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.4 Testing within `m2_polar` \n", + "The next three In[ ] cells test `norm2` and `norm` with the multivectors `S4`, `N4`, and `B4` from `m2_polar`. \n", + "- Since `m2_polar` has a non-Euclidean metric, the value of `S4.norm(hint)` should be expected to and does depend on the `hint` given.\n", + "- Since `N4` is a location-independent numeric multivector, the value of `N43.norm(hint)` should not and does not depend on the `hint` given. Neither does it depend on location.\n", + "- Notice the results for `N4` should and do agree with those for `N3` above, which is as desired since `N3` and `N4` represent the same position-independent numeric multivector in $\\mathbb{G}(\\mathbb{M}^{1,1})$." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{S}= S + S^{\\rho } \\boldsymbol{\\mathbf{b}}_{\\rho } + S^{\\phi } \\boldsymbol{\\mathbf{b}}_{\\phi } + S^{\\rho \\phi } \\boldsymbol{\\mathbf{b}}_{\\rho }\\wedge \\boldsymbol{\\mathbf{b}}_{\\phi } \\in\\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}}\\right|} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{- S^{2} + {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2} + {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_0 = S \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_0\\Vert^2 = S^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_1 = S^{\\rho } \\boldsymbol{\\mathbf{b}}_{\\rho } + S^{\\phi } \\boldsymbol{\\mathbf{b}}_{\\phi } \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}}\\right|} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{- {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2}} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{S}\\right>_2 = S^{\\rho \\phi } \\boldsymbol{\\mathbf{b}}_{\\rho }\\wedge \\boldsymbol{\\mathbf{b}}_{\\phi } \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(S4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Remark:* SymPy was able to take a factor of $\\rho^2$ out from under the radical as $\\rho$ rather than $\\vert \\rho \\vert$ because `rho` was instantiated with condition `positive=True`. SymPy does not know whether basis blade coefficients $S$ and $S^{\\rho\\phi}$ are nonnegative, so it takes their squares out from under the radical as $\\vert S \\vert$ and $\\vert S^{\\rho\\phi} \\vert$." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{N}= - 2 \\sqrt{7} + \\left ( - e^{\\phi } + 4 e^{- \\phi }\\right ) \\boldsymbol{\\mathbf{b}}_{\\rho } + \\frac{e^{\\phi } + 4 e^{- \\phi }}{\\rho } \\boldsymbol{\\mathbf{b}}_{\\phi } - \\frac{\\sqrt{37}}{\\rho } \\boldsymbol{\\mathbf{b}}_{\\rho }\\wedge \\boldsymbol{\\mathbf{b}}_{\\phi } \\in\\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = -25 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{N}\\vert = 5 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{N}\\vert = 5 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{N}\\vert = 5 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_0 = - 2 \\sqrt{7} \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_0\\Vert^2 = 28 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{7} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{7} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_0\\vert = 2 \\sqrt{7} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_1 = \\left ( - e^{\\phi } + 4 e^{- \\phi }\\right ) \\boldsymbol{\\mathbf{b}}_{\\rho } + \\frac{e^{\\phi } + 4 e^{- \\phi }}{\\rho } \\boldsymbol{\\mathbf{b}}_{\\phi } \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = -16 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_1\\vert = 4 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_1\\vert = 4 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_1\\vert = 4 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{N}\\right>_2 = - \\frac{\\sqrt{37}}{\\rho } \\boldsymbol{\\mathbf{b}}_{\\rho }\\wedge \\boldsymbol{\\mathbf{b}}_{\\phi } \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = -37 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{N}\\right>_2\\vert = \\sqrt{37} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_2\\vert = \\sqrt{37} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{N}\\right>_2\\vert = \\sqrt{37} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(N4)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{B}= \\rho ^{2} -16 \\boldsymbol{\\mathbf{b}}_{\\rho } + \\frac{16}{\\rho } \\boldsymbol{\\mathbf{b}}_{\\phi } - \\sqrt{\\phi ^{2} + \\rho ^{2}} \\boldsymbol{\\mathbf{b}}_{\\rho }\\wedge \\boldsymbol{\\mathbf{b}}_{\\phi } \\in\\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{B}\\Vert^2 = - \\phi ^{2} \\rho ^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{B}\\right>_0 = \\rho ^{2} \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{B}\\right>_0\\Vert^2 = \\rho ^{4} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{B}\\right>_0\\vert = \\rho ^{2} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{B}\\right>_0\\vert = \\rho ^{2} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{B}\\right>_0\\vert = \\rho ^{2} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{B}\\right>_1 = -16 \\boldsymbol{\\mathbf{b}}_{\\rho } + \\frac{16}{\\rho } \\boldsymbol{\\mathbf{b}}_{\\phi } \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{B}\\right>_1\\Vert^2 = 0 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{B}\\right>_1\\vert = 0 \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{B}\\right>_1\\vert = 0 \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{B}\\right>_1\\vert = 0 \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left<\\mathbf{B}\\right>_2 = - \\sqrt{\\phi ^{2} + \\rho ^{2}} \\boldsymbol{\\mathbf{b}}_{\\rho }\\wedge \\boldsymbol{\\mathbf{b}}_{\\phi } \\in \\mathbb{G}(\\mathbb{M}^{1,1})$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{B}\\right>_2\\Vert^2 = - \\rho ^{2} \\left(\\phi ^{2} + \\rho ^{2}\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{B}\\right>_2\\vert = \\rho \\sqrt{\\phi ^{2} + \\rho ^{2}} \\quad \\text{ when hint is '0'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{B}\\right>_2\\vert = \\rho \\sqrt{\\phi ^{2} + \\rho ^{2}} \\quad \\text{ when hint is '+'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{B}\\right>_2\\vert = \\rho \\sqrt{\\phi ^{2} + \\rho ^{2}} \\quad \\text{ when hint is '-'}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{B4.norm2() >= 0}: \\quad - \\phi ^{2} \\rho ^{2} \\geq 0 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{(B4.norm2() >= 0) == 0}: \\quad \\text{False} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{B4.norm2() <= 0}: \\quad \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{(B4.norm2() <= 0) == 0}: \\quad \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{B4.norm2() > 0}: \\quad \\text{False} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{(B4.norm2() > 0) == 0}: \\quad \\text{False} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_with(B4)\n", + "# Is `normsquared` nonnegative? Show values of relational and \n", + "# conditional in Case 3(a) of `norm`'s code:\n", + "gprint(r'\\text{B4.norm2() >= 0}: \\quad', B4.norm2() >= 0)\n", + "gprint(r'\\text{(B4.norm2() >= 0) == 0}: \\quad',\n", + " (B4.norm2() >= 0) == True)\n", + "# Is `normsquared` nonpositive? Show values of relational and \n", + "# conditional in Case 3(b):\n", + "gprint(r'\\text{B4.norm2() <= 0}: \\quad', B4.norm2() <= 0)\n", + "gprint(r'\\text{(B4.norm2() <= 0) == 0}: \\quad',\n", + " (B4.norm2() <= 0) == True)\n", + "# Is `normsquared` positive? Show values of relational and \n", + "# conditional complementary to Case 3(b):\n", + "gprint(r'\\text{B4.norm2() > 0}: \\quad', B4.norm2() > 0)\n", + "gprint(r'\\text{(B4.norm2() > 0) == 0}: \\quad',\n", + " (B4.norm2() > 0) == True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So as to provide a test of Case 3(b) in the execution of `norm`, the multivector `B4` from `m2_polar` was designed to have a nonpositive `normsquared`. (The various cases are described in the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**.) The relational `normsquared <= 0` within Case 3(b)'s conditional evaluates to `True`; hence the conditional itself, `(normsquared <= 0) == True`, also evaluates to `True`. The consequent of the `if` statement then executes, returning the `hint`-independent expression `\\sqrt(-normsquared)`.\n", + "\n", + "As an experiment as to how SymPy would handle other relationals, the above cell also showed how SymPy would evaluate the nonnegativity relational `normsquared >= 0` of Case 3(a)'s conditional. SymPy wasn't able to assign a `True` or `False` value to `normsquared >= 0`, possibly because some of the possible values of `normsquared` are negative.\n", + "\n", + "Not unexpectedly, the complementary relational `normsquared > 0` (positivity) to Case 3(b)'s `normsquared <= 0` relational returns `False` when the 3(b) relational (nonnegativity) returns `True`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.5. Conclusions from testing the recoded old operations\n", + "\n", + "The output from each of the executable In[ ] cells of subsections 6.1, 6.2, 6.3, and 6.4 was precisely as was desired and expected. I am confident of the implementation of `norm2`. But while the tests of `norm` gave correct results, I still suspect weaknesses in that method, weaknesses that were explicated at the end of Section 6 of the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**. Further testing, with more complex geometric algebras and multivectors therefrom, is needed." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 3dca083af47b4f64f162d8330237f2b5757d2e3d Mon Sep 17 00:00:00 2001 From: utensil Date: Sat, 6 Apr 2024 21:25:13 +0800 Subject: [PATCH 22/78] Fix regression and ignore lint E712 in norm2 --- galgebra/mv.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/galgebra/mv.py b/galgebra/mv.py index 97b22b44..55b7e948 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -1280,16 +1280,22 @@ def norm2(self, hint: str = '0') -> Expr: Euclidean. """ quadform = self.qform() # the quadratic form at `self` - if quadform.is_number: # Case1: quadform is numeric + # Case1: quadform is numeric + if quadform.is_number: return Abs(quadform) - if self.Ga.g.is_positive_definite: # Case2: metric is positive definite + # Case2: metric is positive definite + if self.Ga.g.is_positive_definite: return quadform - if quadform >= 0: # Case3: quadform is nonnegative + # Case3: quadform is nonnegative + if (quadform >= 0) == True: # noqa: E712 return +quadform - if quadform <= 0: # Case4: quadform is nonpositive + # Case4: quadform is nonpositive + if (quadform <= 0) == True: # noqa: E712 return -quadform - if hint == '0': # Case5: quadform's sign is - return Abs(quadform) # unknown, so use `hint`. + + # Case5: quadform's sign is unknown, so use `hint`. + if hint == '0': + return Abs(quadform) elif hint == '+': return +quadform elif hint == '-': From 4ae3b2a3267e07bbe3d95d478a8ca955d51e115c Mon Sep 17 00:00:00 2001 From: utensil Date: Sat, 6 Apr 2024 21:35:48 +0800 Subject: [PATCH 23/78] Fix version printing for the test TODO: fix primer.py also --- examples/ipython/test_gsg_undual_etc.ipynb | 6 +++--- test/.nbval_sanitize.cfg | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/examples/ipython/test_gsg_undual_etc.ipynb b/examples/ipython/test_gsg_undual_etc.ipynb index c6a4cda9..b9e48143 100644 --- a/examples/ipython/test_gsg_undual_etc.ipynb +++ b/examples/ipython/test_gsg_undual_etc.ipynb @@ -90,7 +90,7 @@ } ], "source": [ - "from sys import version\n", + "import platform\n", "\n", "import sympy \n", "from sympy import *\n", @@ -112,8 +112,8 @@ " # its right by the inverse unit pseudoscalar, the convention used\n", " # in LAGA, VAGC, and GACS.\n", "gprint(r'\\text{This notebook is now using} \\\\',\n", - " r'\\qquad\\bullet~ \\text{Python }', version[:5],\n", - " r'\\qquad\\bullet~ \\text{SymPy }', sympy.__version__[:7],\n", + " r'\\qquad\\bullet~ \\text{Python }', platform.python_version(),\n", + " r'\\qquad\\bullet~ \\text{SymPy }', sympy.__version__[:],\n", " r'\\qquad\\bullet~ \\text{GAlgebra }', \n", " galgebra.__version__[:], r'.')" ] diff --git a/test/.nbval_sanitize.cfg b/test/.nbval_sanitize.cfg index 0bf1eee4..1b7dc83c 100644 --- a/test/.nbval_sanitize.cfg +++ b/test/.nbval_sanitize.cfg @@ -45,3 +45,14 @@ replace: \\mathbf{\1}_{\2} # sympy master shows trailing commas on 1-tuples. This replacement is easier to do in reverse. regex: ,\\right\) replace: \\right) + +# ignore versions +# \text{Python }3.8.5 +regex: \\text\{Python \}(\d+\.\d+(\.\d+)?) +replace: \\text{Python } +# \text{SymPy }1.8.dev +regex: \\text\{SymPy \}(\d+\.\d+(\.\d+)?(\.dev)?) +replace: \\text{SymPy } +# \text{GAlgebra }0.5.0 +regex: \\text\{GAlgebra \}(\d+\.\d+(\.\d+)?) +replace: \\text{GAlgebra } From 7a54897f5187456c24a2f9fac89cb8f1a0ed0152 Mon Sep 17 00:00:00 2001 From: utensil Date: Sat, 6 Apr 2024 21:40:58 +0800 Subject: [PATCH 24/78] Blindly regenerate failing notebooks for comparison and test coverage assessment. --- examples/ipython/test_gsg_undual_etc.ipynb | 187 ++++++++++++--------- 1 file changed, 111 insertions(+), 76 deletions(-) diff --git a/examples/ipython/test_gsg_undual_etc.ipynb b/examples/ipython/test_gsg_undual_etc.ipynb index b9e48143..a627904b 100644 --- a/examples/ipython/test_gsg_undual_etc.ipynb +++ b/examples/ipython/test_gsg_undual_etc.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "0185309f", "metadata": {}, "source": [ "# Testing of undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm\n", @@ -12,6 +13,7 @@ }, { "cell_type": "markdown", + "id": "12a530fa", "metadata": {}, "source": [ "In this notebook I test the operations `undual`, `g_invol`, `ccon`, `sp`, `norm2`, and `norm`, code for which was described in the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**. The first four of these are operations new to GAlgebra, while the last two are old operations I have newly recoded. \n", @@ -29,6 +31,7 @@ }, { "cell_type": "markdown", + "id": "cec8f476", "metadata": {}, "source": [ "## 1. Notebook initialization\n", @@ -39,6 +42,7 @@ { "cell_type": "code", "execution_count": 1, + "id": "c59e2276", "metadata": {}, "outputs": [ { @@ -79,7 +83,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{This notebook is now using} \\\\\\qquad\\bullet~ \\text{Python }3.8.5\\qquad\\bullet~ \\text{SymPy }1.8.dev\\qquad\\bullet~ \\text{GAlgebra }0.5.0.$" + "$\\displaystyle \\text{This notebook is now using} \\\\\\qquad\\bullet~ \\text{Python }3.11.8\\qquad\\bullet~ \\text{SymPy }1.12\\qquad\\bullet~ \\text{GAlgebra }0.5.1.$" ], "text/plain": [ "" @@ -120,6 +124,7 @@ }, { "cell_type": "markdown", + "id": "82333d41", "metadata": {}, "source": [ "## 2. Testing environment `g3` for operations `undual`, `g_invol`, `ccon`, and `sp`\n", @@ -132,6 +137,7 @@ { "cell_type": "code", "execution_count": 2, + "id": "3b574d78", "metadata": {}, "outputs": [ { @@ -244,6 +250,7 @@ }, { "cell_type": "markdown", + "id": "321e81de", "metadata": {}, "source": [ "## 3 Tests of `undual`, `g_invol`, `ccon`, and `sp`" @@ -251,6 +258,7 @@ }, { "cell_type": "markdown", + "id": "59725d39", "metadata": {}, "source": [ "### 3.1. `undual` (undualization)" @@ -259,6 +267,7 @@ { "cell_type": "code", "execution_count": 3, + "id": "e80aa821", "metadata": {}, "outputs": [ { @@ -352,6 +361,7 @@ }, { "cell_type": "markdown", + "id": "2c352f81", "metadata": {}, "source": [ "### 3.2. `g_invol` (grade involution)" @@ -360,6 +370,7 @@ { "cell_type": "code", "execution_count": 4, + "id": "69918cc5", "metadata": {}, "outputs": [ { @@ -440,6 +451,7 @@ }, { "cell_type": "markdown", + "id": "58a4f1c2", "metadata": {}, "source": [ "### 3.3. `ccon` (Clifford conjugation)" @@ -448,6 +460,7 @@ { "cell_type": "code", "execution_count": 5, + "id": "c2616f56", "metadata": {}, "outputs": [ { @@ -526,6 +539,7 @@ }, { "cell_type": "markdown", + "id": "7fc1dded", "metadata": {}, "source": [ "### 3.4. `sp` (scalar products)" @@ -534,6 +548,7 @@ { "cell_type": "code", "execution_count": 6, + "id": "2b3accd0", "metadata": {}, "outputs": [ { @@ -669,6 +684,7 @@ }, { "cell_type": "markdown", + "id": "143c1c25", "metadata": {}, "source": [ "The above tests include tests of the relationship of the (usual) scalar product $\\ast$ and the alternate scalar product $\\circledast$ to the normsquared operation $\\Vert \\cdot \\Vert^2$." @@ -676,6 +692,7 @@ }, { "cell_type": "markdown", + "id": "eb4fd6e0", "metadata": {}, "source": [ "### 3.5. Conclusions from testing the new operations\n", @@ -685,6 +702,7 @@ }, { "cell_type": "markdown", + "id": "9bf99470", "metadata": {}, "source": [ "## 4. Testing environments `e2`, `e2_polar`, `m2`, and `m2_polar` for `norm2` and `norm`\n", @@ -706,6 +724,7 @@ { "cell_type": "code", "execution_count": 7, + "id": "1b36abc2", "metadata": {}, "outputs": [ { @@ -819,6 +838,7 @@ { "cell_type": "code", "execution_count": 8, + "id": "72b55459", "metadata": {}, "outputs": [ { @@ -936,6 +956,7 @@ { "cell_type": "code", "execution_count": 9, + "id": "7ae3a823", "metadata": {}, "outputs": [ { @@ -1066,6 +1087,7 @@ { "cell_type": "code", "execution_count": 10, + "id": "d5a53baa", "metadata": {}, "outputs": [ { @@ -1200,6 +1222,7 @@ }, { "cell_type": "markdown", + "id": "52d80715", "metadata": {}, "source": [ "*Remark:* The above reports as to whether the model's metric tensor `g` is Euclidean use the same test `g.is_positive_definite` as is used in Case 2 of `norm`." @@ -1207,6 +1230,7 @@ }, { "cell_type": "markdown", + "id": "2d905f82", "metadata": {}, "source": [ "## 5. The test program for `norm2` and `norm` \n", @@ -1218,6 +1242,7 @@ { "cell_type": "code", "execution_count": 11, + "id": "1a87d603", "metadata": {}, "outputs": [], "source": [ @@ -1269,6 +1294,7 @@ }, { "cell_type": "markdown", + "id": "eb06f329", "metadata": {}, "source": [ "## 6. Tests of `norm2` and `norm`" @@ -1276,6 +1302,7 @@ }, { "cell_type": "markdown", + "id": "53f73ec2", "metadata": {}, "source": [ "### 6.1 Testing within `e2` \n", @@ -1287,9 +1314,8 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "scrolled": false - }, + "id": "a43027ea", + "metadata": {}, "outputs": [ { "data": { @@ -1378,7 +1404,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -1390,7 +1416,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -1402,7 +1428,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -1498,7 +1524,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{xy} \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -1510,7 +1536,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{xy} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -1522,7 +1548,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{xy} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -1539,9 +1565,8 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "scrolled": false - }, + "id": "52728f59", + "metadata": {}, "outputs": [ { "data": { @@ -1790,6 +1815,7 @@ }, { "cell_type": "markdown", + "id": "7879c9c4", "metadata": {}, "source": [ "### 6.2 Testing within `e2_polar` \n", @@ -1802,6 +1828,7 @@ { "cell_type": "code", "execution_count": 14, + "id": "5b7d756d", "metadata": {}, "outputs": [ { @@ -1891,7 +1918,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -1903,7 +1930,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -1915,7 +1942,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2011,7 +2038,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{r\\theta } r \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -2023,7 +2050,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{r\\theta } r \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2035,7 +2062,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{r\\theta } r \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2051,6 +2078,7 @@ }, { "cell_type": "markdown", + "id": "3bd68f9b", "metadata": {}, "source": [ "*Remark:* SymPy was able to take a factor of $r^2$ out from under the radical as $r$ rather than $\\vert r \\vert$ because `r` was instantiated with condition `positive=True`. SymPy does not know whether basis blade coefficients $S$ and $S^{r\\theta}$ are nonnegative, so it takes their squares out from under the radical as $\\vert S \\vert$ and $\\vert S^{r\\theta} \\vert$." @@ -2059,9 +2087,8 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "scrolled": false - }, + "id": "ad2cbbe3", + "metadata": {}, "outputs": [ { "data": { @@ -2310,6 +2337,7 @@ }, { "cell_type": "markdown", + "id": "693d5172", "metadata": {}, "source": [ "### 6.3 Testing within `m2` \n", @@ -2322,6 +2350,7 @@ { "cell_type": "code", "execution_count": 16, + "id": "bb3580b2", "metadata": {}, "outputs": [ { @@ -2339,7 +2368,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = \\left|{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right| $" ], "text/plain": [ "" @@ -2363,7 +2392,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2375,7 +2404,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{- S^{2} - {\\left ( S^{s} \\right )}^{2} + {\\left ( S^{st} \\right )}^{2} + {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2411,7 +2440,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -2423,7 +2452,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2435,7 +2464,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2459,7 +2488,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = \\left|{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right| $" ], "text/plain": [ "" @@ -2483,7 +2512,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2495,7 +2524,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{- {\\left ( S^{s} \\right )}^{2} + {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2519,7 +2548,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = - {\\left ( S^{st} \\right )}^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = {\\left ( S^{st} \\right )}^{2} $" ], "text/plain": [ "" @@ -2531,7 +2560,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{st} \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -2543,7 +2572,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{st} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2555,7 +2584,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{st} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2572,6 +2601,7 @@ { "cell_type": "code", "execution_count": 17, + "id": "152f21a7", "metadata": {}, "outputs": [ { @@ -2589,7 +2619,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = -25 $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = 25 $" ], "text/plain": [ "" @@ -2709,7 +2739,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = -16 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = 16 $" ], "text/plain": [ "" @@ -2769,7 +2799,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = -37 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = 37 $" ], "text/plain": [ "" @@ -2822,6 +2852,7 @@ { "cell_type": "code", "execution_count": 18, + "id": "a4532cc3", "metadata": {}, "outputs": [ { @@ -2839,7 +2870,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{A}\\Vert^2 = t^{2} \\left(2 s^{2} + t^{2}\\right) $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{A}\\Vert^2 = t^{2} \\cdot \\left(2 s^{2} + t^{2}\\right) $" ], "text/plain": [ "" @@ -2959,7 +2990,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_1\\Vert^2 = t^{2} \\left(2 s^{2} + t^{2}\\right) $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_1\\Vert^2 = t^{2} \\cdot \\left(2 s^{2} + t^{2}\\right) $" ], "text/plain": [ "" @@ -3019,7 +3050,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_2\\Vert^2 = -25 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_2\\Vert^2 = 25 $" ], "text/plain": [ "" @@ -3091,7 +3122,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{A3.norm2() <= 0}: \\quad t^{2} \\left(2 s^{2} + t^{2}\\right) \\leq 0 $" + "$\\displaystyle \\text{A3.norm2() <= 0}: \\quad t^{2} \\cdot \\left(2 s^{2} + t^{2}\\right) \\leq 0 $" ], "text/plain": [ "" @@ -3158,6 +3189,7 @@ }, { "cell_type": "markdown", + "id": "39070b41", "metadata": {}, "source": [ "So as to provide a test of Case 3(a) in the execution of `norm`, the multivector `A3` from `m2` was designed to have a nonnegative `normsquared`. (The various cases are described in the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**.) The relational `normsquared >= 0` within Case 3(a)'s conditional evaluates to `True`; hence the conditional itself, `(normsquared >= 0) == True`, also evaluates to `True`. The consequent of the `if` statement then executes, returning the `hint`-independent expression `\\sqrt(+normsquared)`.\n", @@ -3169,6 +3201,7 @@ }, { "cell_type": "markdown", + "id": "5e98f135", "metadata": {}, "source": [ "### 6.4 Testing within `m2_polar` \n", @@ -3181,9 +3214,8 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "scrolled": false - }, + "id": "fcb1965b", + "metadata": {}, "outputs": [ { "data": { @@ -3200,7 +3232,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = \\left|{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}}\\right| $" ], "text/plain": [ "" @@ -3224,7 +3256,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}}\\right|} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3236,7 +3268,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{- S^{2} + {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2} + {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}}\\right|} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3272,7 +3304,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -3284,7 +3316,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3296,7 +3328,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3320,7 +3352,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = \\left|{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}}\\right| $" ], "text/plain": [ "" @@ -3344,7 +3376,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{- {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2}} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}}\\right|} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3356,7 +3388,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}}\\right|} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3380,7 +3412,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" ], "text/plain": [ "" @@ -3392,7 +3424,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{\\rho \\phi } \\rho \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -3404,7 +3436,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{\\rho \\phi } \\rho \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3416,7 +3448,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{\\rho \\phi } \\rho \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3432,6 +3464,7 @@ }, { "cell_type": "markdown", + "id": "a6a1a8b8", "metadata": {}, "source": [ "*Remark:* SymPy was able to take a factor of $\\rho^2$ out from under the radical as $\\rho$ rather than $\\vert \\rho \\vert$ because `rho` was instantiated with condition `positive=True`. SymPy does not know whether basis blade coefficients $S$ and $S^{\\rho\\phi}$ are nonnegative, so it takes their squares out from under the radical as $\\vert S \\vert$ and $\\vert S^{\\rho\\phi} \\vert$." @@ -3440,6 +3473,7 @@ { "cell_type": "code", "execution_count": 20, + "id": "8f859d71", "metadata": {}, "outputs": [ { @@ -3457,7 +3491,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = -25 $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = 25 $" ], "text/plain": [ "" @@ -3577,7 +3611,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = -16 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = 16 $" ], "text/plain": [ "" @@ -3637,7 +3671,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = -37 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = 37 $" ], "text/plain": [ "" @@ -3690,9 +3724,8 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "scrolled": false - }, + "id": "93249a73", + "metadata": {}, "outputs": [ { "data": { @@ -3709,7 +3742,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{B}\\Vert^2 = - \\phi ^{2} \\rho ^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{B}\\Vert^2 = \\phi ^{2} \\rho ^{2} $" ], "text/plain": [ "" @@ -3721,7 +3754,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{B}\\vert = \\phi \\rho \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -3733,7 +3766,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\phi \\rho \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3745,7 +3778,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\phi \\rho \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3889,7 +3922,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{B}\\right>_2\\Vert^2 = - \\rho ^{2} \\left(\\phi ^{2} + \\rho ^{2}\\right) $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{B}\\right>_2\\Vert^2 = - \\rho ^{2} \\left(- \\phi ^{2} - \\rho ^{2}\\right) $" ], "text/plain": [ "" @@ -3937,7 +3970,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{B4.norm2() >= 0}: \\quad - \\phi ^{2} \\rho ^{2} \\geq 0 $" + "$\\displaystyle \\text{B4.norm2() >= 0}: \\quad \\text{True} $" ], "text/plain": [ "" @@ -3949,7 +3982,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{(B4.norm2() >= 0) == 0}: \\quad \\text{False} $" + "$\\displaystyle \\text{(B4.norm2() >= 0) == 0}: \\quad \\text{True} $" ], "text/plain": [ "" @@ -3961,7 +3994,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{B4.norm2() <= 0}: \\quad \\text{True} $" + "$\\displaystyle \\text{B4.norm2() <= 0}: \\quad \\phi ^{2} \\rho ^{2} \\leq 0 $" ], "text/plain": [ "" @@ -3973,7 +4006,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{(B4.norm2() <= 0) == 0}: \\quad \\text{True} $" + "$\\displaystyle \\text{(B4.norm2() <= 0) == 0}: \\quad \\text{False} $" ], "text/plain": [ "" @@ -3985,7 +4018,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{B4.norm2() > 0}: \\quad \\text{False} $" + "$\\displaystyle \\text{B4.norm2() > 0}: \\quad \\phi ^{2} \\rho ^{2} > 0 $" ], "text/plain": [ "" @@ -4028,6 +4061,7 @@ }, { "cell_type": "markdown", + "id": "c9ece961", "metadata": {}, "source": [ "So as to provide a test of Case 3(b) in the execution of `norm`, the multivector `B4` from `m2_polar` was designed to have a nonpositive `normsquared`. (The various cases are described in the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**.) The relational `normsquared <= 0` within Case 3(b)'s conditional evaluates to `True`; hence the conditional itself, `(normsquared <= 0) == True`, also evaluates to `True`. The consequent of the `if` statement then executes, returning the `hint`-independent expression `\\sqrt(-normsquared)`.\n", @@ -4039,6 +4073,7 @@ }, { "cell_type": "markdown", + "id": "0986f88c", "metadata": {}, "source": [ "### 6.5. Conclusions from testing the recoded old operations\n", @@ -4049,7 +4084,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -4063,7 +4098,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, From c0c1d2f647d7a626557f74110e6e8f4bea3fcb65 Mon Sep 17 00:00:00 2001 From: utensil Date: Sun, 7 Apr 2024 19:48:37 +0800 Subject: [PATCH 25/78] Regenerate all primer notebooks --- examples/primer/cm3.ipynb | 4 +- examples/primer/g2.ipynb | 46 ++++++- examples/primer/g3.ipynb | 46 ++++++- examples/primer/g4.ipynb | 46 ++++++- examples/primer/gprint.ipynb | 234 +++++++++++++++++++++++++++++--- examples/primer/sp2.ipynb | 4 +- examples/primer/sp2g3.ipynb | 64 ++++++++- examples/primer/sp2sp3.ipynb | 63 ++++++++- examples/primer/sp3.ipynb | 64 ++++++++- examples/primer/spacetime.ipynb | 64 ++++++++- 10 files changed, 566 insertions(+), 69 deletions(-) diff --git a/examples/primer/cm3.ipynb b/examples/primer/cm3.ipynb index 4e89173c..cbd79aac 100644 --- a/examples/primer/cm3.ipynb +++ b/examples/primer/cm3.ipynb @@ -367,7 +367,7 @@ "metadata": { "celltoolbar": "Raw Cell Format", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -381,7 +381,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/primer/g2.ipynb b/examples/primer/g2.ipynb index 3140a13b..29ded884 100644 --- a/examples/primer/g2.ipynb +++ b/examples/primer/g2.ipynb @@ -2,9 +2,45 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# G2: Standard 2D Model\n", "\n", @@ -25,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -50,7 +86,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -64,7 +100,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/primer/g3.ipynb b/examples/primer/g3.ipynb index 240ffeac..bc9923e2 100644 --- a/examples/primer/g3.ipynb +++ b/examples/primer/g3.ipynb @@ -2,9 +2,45 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# G3: Standard 3D Model\n", "\n", @@ -25,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -51,7 +87,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -65,7 +101,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/primer/g4.ipynb b/examples/primer/g4.ipynb index 45418061..0c35e51c 100644 --- a/examples/primer/g4.ipynb +++ b/examples/primer/g4.ipynb @@ -2,9 +2,45 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# G4: Standard 4D Model\n", "\n", @@ -25,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -45,7 +81,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -59,7 +95,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/primer/gprint.ipynb b/examples/primer/gprint.ipynb index e5a458fe..63ff1b24 100644 --- a/examples/primer/gprint.ipynb +++ b/examples/primer/gprint.ipynb @@ -1,10 +1,59 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Demo of `gprint`\n", + "\n", + "Author: Alan Bromborsky\n", + "\n", + "Last updated: 2020-09-22\n", + "\n", + "Original name: `GAlgebraOutput.ipynb` in http://www.faculty.luther.edu/~macdonal/GAfiles.zip" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Make SymPy available to this program:\n", "import sympy \n", @@ -23,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -36,9 +85,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} word word\\ word \\cdot ex" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\text{word word\\ word \\cdot ex" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "gprint(r'word word\\ word \\cdot ex" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{B} = \\begin{aligned}[t] & B^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} \\\\ & + B^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\\\ & + B^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{B} = B^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + B^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + B^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "B = g3.mv('B', 'bivector')\n", "Fmt(1) # Set Fmt globally\n", @@ -59,18 +170,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{B}^2 = - {\\left ( B^{xy} \\right )}^{2} - {\\left ( B^{xz} \\right )}^{2} - {\\left ( B^{yz} \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "gprint(r'\\mathbf{B}^2 =', B*B)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\langle \\mathbf{M} \\rangle_2 = M^{xy} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{y} + M^{xz} \\boldsymbol{\\mathbf{e}}_{x}\\wedge \\boldsymbol{\\mathbf{e}}_{z} + M^{yz} \\boldsymbol{\\mathbf{e}}_{y}\\wedge \\boldsymbol{\\mathbf{e}}_{z} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "M = g3.mv('M', 'mv')\n", "gprint(r'\\langle \\mathbf{M} \\rangle_2 =', M.grade(2)) \n", @@ -79,18 +216,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\alpha_1\\mathbf{X}/\\gamma_r^3$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "gprint(r'\\alpha_1\\mathbf{X}/\\gamma_r^3')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\theta , \\theta $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Program name and output are different\n", "theta = symbols('theta', real = True) \n", @@ -100,7 +263,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -109,18 +272,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{\\mathbf{e}_x} \\frac{\\partial}{\\partial x} + \\mathbf{\\mathbf{e}_y} \\frac{\\partial}{\\partial y} + \\mathbf{\\mathbf{e}_z} \\frac{\\partial}{\\partial z}$" + ], + "text/plain": [ + "\\mathbf{e}_x*D{x} + \\mathbf{e}_y*D{y} + \\mathbf{e}_z*D{z}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "grad" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle {\\nabla}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "gprint(r'{\\nabla}')" ] @@ -135,7 +325,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -149,7 +339,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/primer/sp2.ipynb b/examples/primer/sp2.ipynb index 2c22f0ae..15ef6677 100644 --- a/examples/primer/sp2.ipynb +++ b/examples/primer/sp2.ipynb @@ -69,7 +69,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -83,7 +83,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/primer/sp2g3.ipynb b/examples/primer/sp2g3.ipynb index 18ba5f8e..d89f2f81 100644 --- a/examples/primer/sp2g3.ipynb +++ b/examples/primer/sp2g3.ipynb @@ -2,9 +2,45 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Unit sphere R^3 as a submanifold of g3 in cartesian coordinates\n", "\n", @@ -25,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -55,9 +91,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{e}_{\\phi} \\frac{\\partial}{\\partial \\phi} + \\mathbf{e}_{\\theta} \\frac{1}{\\sin{\\left(\\phi \\right)}} \\frac{\\partial}{\\partial \\theta}$" + ], + "text/plain": [ + "e_phi*D{phi} + e_theta*1/sin(phi)*D{theta}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "grad = sp2.grad\n", "grad" @@ -73,7 +123,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -87,7 +137,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/primer/sp2sp3.ipynb b/examples/primer/sp2sp3.ipynb index 27280692..e2fece30 100644 --- a/examples/primer/sp2sp3.ipynb +++ b/examples/primer/sp2sp3.ipynb @@ -2,9 +2,45 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# A geometric algebra for the unit sphere in R^3 \n", "# as a submanifold of R^3 with spherical coordintes.\n", @@ -26,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -58,9 +94,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\boldsymbol{e}_{\\phi } \\frac{\\partial}{\\partial \\phi } + \\boldsymbol{e}_{\\theta } \\frac{1}{\\sin{\\left (\\phi \\right )}} \\frac{\\partial}{\\partial \\theta } $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "gprint(grad) " ] @@ -75,7 +124,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -89,7 +138,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/primer/sp3.ipynb b/examples/primer/sp3.ipynb index a76be1da..d5112704 100644 --- a/examples/primer/sp3.ipynb +++ b/examples/primer/sp3.ipynb @@ -2,9 +2,45 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# sp3: Spherical Coordinates in R^3\n", "\n", @@ -25,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -48,9 +84,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{e}_{r} \\frac{\\partial}{\\partial r} + \\mathbf{e}_{\\phi} \\frac{1}{r} \\frac{\\partial}{\\partial \\phi} + \\mathbf{e}_{\\theta} \\frac{1}{r \\sin{\\left(\\phi \\right)}} \\frac{\\partial}{\\partial \\theta}$" + ], + "text/plain": [ + "e_r*D{r} + e_phi*1/r*D{phi} + e_theta*1/(r*sin(phi))*D{theta}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "sp3.grad" ] @@ -65,7 +115,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -79,7 +129,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/examples/primer/spacetime.ipynb b/examples/primer/spacetime.ipynb index f04e2bff..6cd9bcc2 100644 --- a/examples/primer/spacetime.ipynb +++ b/examples/primer/spacetime.ipynb @@ -2,9 +2,45 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Spacetime algebra. [1, -1, -1, -1] signature\n", "\n", @@ -25,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -37,9 +73,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle X = X^{t} \\mathbf{\\mathbf{e}_t} + X^{x} \\mathbf{\\mathbf{e}_x} + X^{y} \\mathbf{\\mathbf{e}_y} + X^{z} \\mathbf{\\mathbf{e}_z}$" + ], + "text/plain": [ + "X__t*\\mathbf{e}_t + X__x*\\mathbf{e}_x + X__y*\\mathbf{e}_y + X__z*\\mathbf{e}_z" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "st.mv('X', 'vector')" ] @@ -54,7 +104,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -68,7 +118,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.8" } }, "nbformat": 4, From ccd25da379df1dfa463dac251889730a753b92c0 Mon Sep 17 00:00:00 2001 From: utensil Date: Sun, 7 Apr 2024 19:49:02 +0800 Subject: [PATCH 26/78] Add autodoc for gprinter --- galgebra/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/galgebra/__init__.py b/galgebra/__init__.py index 833af113..405c5fae 100644 --- a/galgebra/__init__.py +++ b/galgebra/__init__.py @@ -20,6 +20,7 @@ dop atoms printer + gprinter utils .. note:: From 5e5558701fe89158bd77c57d9706a57a4f55b2a8 Mon Sep 17 00:00:00 2001 From: utensil Date: Sun, 7 Apr 2024 20:43:45 +0800 Subject: [PATCH 27/78] Add `Linear Transformations in GAlgebra.ipynb` from #478 by GSG with minor fixes Co-authored-by: Greg Grunberg --- examples/ipython/lt.ipynb | 1858 +++++++++++++++++++++++++++++++++++++ galgebra/mv.py | 2 +- 2 files changed, 1859 insertions(+), 1 deletion(-) create mode 100644 examples/ipython/lt.ipynb diff --git a/examples/ipython/lt.ipynb b/examples/ipython/lt.ipynb new file mode 100644 index 00000000..cedad1b5 --- /dev/null +++ b/examples/ipython/lt.ipynb @@ -0,0 +1,1858 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6db85fa4", + "metadata": {}, + "source": [ + "# Linear Transformations / Outermorphisms in GAlgebra\n", + "\n", + "Author: Greg Grunberg\n", + "\n", + "Last updated: 2021-11-04\n", + "\n", + "Original name: `Linear Transformations in GAlgebra.ipynb` in [GSG_2021-11-05_GAlgebra_fixes.zip](https://github.com/pygae/galgebra/issues/478)" + ] + }, + { + "cell_type": "markdown", + "id": "3fa7d107", + "metadata": {}, + "source": [ + "## 1. Preliminaries\n", + "\n", + "This Markdown cell implements certain user-defined LaTeX macros which I'm in the habit of using. (Not all are used by this notebook.) The macros ease creation of LaTeX/MathJax code, which in turn allows production of more readable Markdown cells and In[ ] cell output. \n", + "- Enter edit mode to see definitions of the macros. \n", + "- Exit edit mode (Shift+Enter) to activate the macros in this notebook. \n", + "- An example of each macro follows its definition. The typeset result of each macro appears when not in edit mode.\n", + "\n", + "$$\\newcommand {\\Rn}[1] {\\mathbb{R}^{#1}}$$ $\\Rn{p,q}$ scalar product space of signature $(p,q)$ \n", + "$$\\newcommand {\\Gn}[1]{\\mathbb{G}^{#1}}$$ $\\Gn{p,q}$ geometric algebra of signature $(p,q)$\n", + "$$\\newcommand {\\op} {\\wedge}$$ $A \\op B$ outer product\n", + "$$\\newcommand {\\ip} {\\cdot}$$ $A \\ip B$ dot product\n", + "$$\\newcommand {\\lc} {\\rfloor}$$ $A \\lc B$ left contraction\n", + "$$\\newcommand {\\rc} {\\lfloor}$$ $A \\rc B$ right contraction\n", + "$$\\newcommand {\\dual} {^\\star}$$ $A\\dual$ dual of multivector\n", + "$$\\newcommand {\\undual} {^{-\\star}}$$ $A\\undual$ undual of multivector \n", + "$$\\newcommand {\\rev} {^\\dagger}$$ $A\\rev$ reverse of multivector (dagger notation)\n", + "$$\\newcommand {\\til}[1] {\\widetilde{#1}}$$ $\\til{A}$ reverse of multivector (tilde notation)\n", + "$$\\newcommand {\\ginvol}[1] {\\widehat{#1}}$$ $\\ginvol{A}$ grade involute of multivector\n", + "$$\\newcommand {\\ccon}[1] {\\overline{#1}}$$ $\\ccon{A}$ Clifford conjugate of multivector \n", + "$$\\newcommand {\\lt}[1] {\\mathsf{#1}}$$ $\\lt{T}$ linear transformation / outermorphism \n", + "$$\\newcommand {\\ad}[1] {\\mathsf{#1}^\\ast}$$ $\\ad{T}$ adjoint of linear transformation / outermorphism \n", + "$$\\newcommand {\\es}[1] {\\mathbf{e}_{#1}}$$ $\\es{j}$ (orthonormal) basis vector\n", + "$$\\newcommand {\\eS}[1] {\\mathbf{e}^{#1}}$$ $\\eS{i}$ (orthonormal) reciprocal basis vector\n", + "$$\\newcommand {\\bas}[2] {\\mathbf{#1}_{#2}}$$ $\\bas{b}{j}$ basis vector\n", + "$$\\newcommand {\\baS}[2] {\\mathbf{#1}^{#2}}$$ $\\baS{b}{i}$ reciprocal basis vector\n", + "$$\\newcommand {\\oder}[3] {\\dfrac{d^{#3}{#1}}{d{#2}^{#3}}}$$ $\\oder{y}{x}{k}$ $k$th ordinary derivative \n", + "$$\\newcommand {\\pder}[3] {\\dfrac{\\partial^{#3} {#1}}{\\partial{#2}^{#3}}}$$ \n", + "$\\pder{u}{(x^i)}{k}$ $k$th partial derivative\n", + "$$\\newcommand {\\qform}[1] {\\mathscr{Q}\\left({#1}\\right)}$$ $\\qform{A}$ quadratic form \n", + "$$\\newcommand {\\norm}[1] {\\left\\|{#1}\\right\\|}$$ $\\norm{A}$ norm \n", + "$$\\newcommand {\\normsq}[1] {\\left\\|{#1}\\right\\|^2}$$ $\\normsq{A}$ normsquared \n", + "$$\\newcommand {\\mag}[1] {\\left|{#1}\\right|}$$ $\\mag{A}$ magnitude \n", + "$$\\newcommand {\\magsq}[1] {\\left|{#1}\\right|^2}$$ $\\magsq{A}$ magnitude squared \n", + "$$\\newcommand {\\mbf}[1] {\\mathbf{#1}}$$ $\\mbf{A}$ mathboldface font \n", + "$$\\newcommand {\\msf}[1] {\\mathsf{#1}}$$ $\\msf{A}$ mathsansserif font\n", + "$$\\newcommand {\\mbs}[1] {\\boldsymbol{#1}}$$ $\\mbs{\\kappa}$ boldsymbol font \n", + "$$\\newcommand {\\scrB} {\\mathscr{B}}$$ $\\scrB$ basis \n", + "$$\\newcommand {\\scrE} {\\mathscr{E}}$$ $\\scrE$ (orthonormal) basis" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b65eb12b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\DeclareMathOperator{\\Tr}{Tr}$$\n", + "$$\\DeclareMathOperator{\\Adj}{Adj}$$\n", + "$$\\newcommand{\\bfrac}[2]{\\displaystyle\\frac{#1}{#2}}$$\n", + "$$\\newcommand{\\lp}{\\left (}$$\n", + "$$\\newcommand{\\rp}{\\right )}$$\n", + "$$\\newcommand{\\paren}[1]{\\lp {#1} \\rp}$$\n", + "$$\\newcommand{\\half}{\\frac{1}{2}}$$\n", + "$$\\newcommand{\\llt}{\\left <}$$\n", + "$$\\newcommand{\\rgt}{\\right >}$$\n", + "$$\\newcommand{\\abs}[1]{\\left |{#1}\\right | }$$\n", + "$$\\newcommand{\\pdiff}[2]{\\bfrac{\\partial {#1}}{\\partial {#2}}}$$\n", + "$$\\newcommand{\\npdiff}[3]{\\bfrac{\\partial^{#3} {#1}}{\\partial {#2}^{#3}}}$$\n", + "$$\\newcommand{\\lbrc}{\\left \\{}$$\n", + "$$\\newcommand{\\rbrc}{\\right \\}}$$\n", + "$$\\newcommand{\\W}{\\wedge}$$\n", + "$$\\newcommand{\\prm}[1]{{#1}^{\\prime}}$$\n", + "$$\\newcommand{\\ddt}[1]{\\bfrac{d{#1}}{dt}}$$\n", + "$$\\newcommand{\\R}{\\dagger}$$\n", + "$$\\newcommand{\\deriv}[3]{\\bfrac{d^{#3}#1}{d{#2}^{#3}}}$$\n", + "$$\\newcommand{\\grade}[2]{\\left < {#1} \\right >_{#2}}$$\n", + "$$\\newcommand{\\f}[2]{{#1}\\lp {#2} \\rp}$$\n", + "$$\\newcommand{\\eval}[2]{\\left . {#1} \\right |_{#2}}$$\n", + "$$\\newcommand{\\bs}[1]{\\boldsymbol{#1}}$$\n", + "$$\\newcommand{\\grad}{\\bs{\\nabla}}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\textsf{This notebook is now using} \\\\\\qquad\\bullet~ \\textsf{Python }3.11.\\qquad\\bullet~ \\textsf{SymPy }1.12\\qquad\\bullet~ \\textsf{GAlgebra }0.5.1.$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Initialize this notebook to use SymPy and GAlgebra:\n", + "from sys import version\n", + "import sympy \n", + "import galgebra\n", + "from galgebra.ga import * \n", + "from galgebra.mv import *\n", + "from galgebra.lt import *\n", + "from galgebra.printer import Fmt, GaPrinter, Format\n", + "from galgebra.gprinter import gFormat, gprint\n", + "gFormat()\n", + "Ga.dual_mode('Iinv+') \n", + "gprint(r'\\textsf{This notebook is now using} \\\\',\n", + " r'\\qquad\\bullet~ \\textsf{Python }', version[:5],\n", + " r'\\qquad\\bullet~ \\textsf{SymPy }', sympy.__version__[:8],\n", + " r'\\qquad\\bullet~ \\textsf{GAlgebra }', galgebra.__version__[:], r'.')" + ] + }, + { + "cell_type": "markdown", + "id": "9d4c3b94", + "metadata": {}, + "source": [ + "**Important:** GAlgebra 0.5.0 is the version available as of this file date from the PyGAE GAlgebra website at https://github.com/pygae/galgebra. This notebook actually uses GAlgebra 0.5.0 but with two of its modules, **lt.py** and **mv.py**, modified. The modifications have corrected those version 0.5.0 bugs of which I'm aware. The changes have also added to the capabilities offered by those modules.\n", + "\n", + "This notebook also uses module **gprinter.py**, provided to me by Alan Bromborsky (the original author of GAlgebra), which is not part of GAlgebra 0.5.0. That module's `gprint` function is used extensively in this notebook's In[ ] cells to produce beautifully formatted output." + ] + }, + { + "cell_type": "markdown", + "id": "35aaabcf", + "metadata": {}, + "source": [ + "## 2. `m3`, the geometric algebra used in examples" + ] + }, + { + "cell_type": "markdown", + "id": "fcafa8d7", + "metadata": {}, + "source": [ + "This notebook's examples use `m3`, a model of the geometric algebra $\\Gn{1,2}$ generated by an orthonormal basis of 3-dimensional Minkowski space." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ede9a31e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{m3: a model of }\\Gn{1,2}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{basis:}~~\\scrE= \\left( \\boldsymbol{\\mbf{e}}_{1}, \\ \\boldsymbol{\\mbf{e}}_{2}, \\ \\boldsymbol{\\mbf{e}}_{3}\\right) \\qquad\\text{reciprocal basis:}~~\\scrE^{-1}= \\left( \\boldsymbol{\\mbf{e}}^{1}, \\ \\boldsymbol{\\mbf{e}}^{2}, \\ \\boldsymbol{\\mbf{e}}^{3}\\right) = \\left( \\boldsymbol{\\mbf{e}}_{1}, \\ - \\boldsymbol{\\mbf{e}}_{2}, \\ - \\boldsymbol{\\mbf{e}}_{3}\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{metric tensor:}~~[g_{ij}]= \\left[\\begin{array}{ccc}1 & 0 & 0\\\\0 & -1 & 0\\\\0 & 0 & -1\\end{array}\\right] \\quad\\text{reciprocal metric tensor:}~~[g^{ij}]= \\left[\\begin{array}{ccc}1 & 0 & 0\\\\0 & -1 & 0\\\\0 & 0 & -1\\end{array}\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{unit pseudoscalar:}~~\\mbf{I}= \\boldsymbol{\\mbf{e}}_{123} \\qquad\\text{square of unit pseudoscalar:}~~\\mbf{I}^2= -1 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\text{generic}\\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\quad\\text{scalar (0-vector):}~~ \\kappa \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\quad\\text{vector:}~~\\mbf{x}= x^{1} \\boldsymbol{\\mbf{e}}_{1} + x^{2} \\boldsymbol{\\mbf{e}}_{2} + x^{3} \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\quad\\text{multivector:}~~\\mbf{X}= X + X^{1} \\boldsymbol{\\mbf{e}}_{1} + X^{2} \\boldsymbol{\\mbf{e}}_{2} + X^{3} \\boldsymbol{\\mbf{e}}_{3} + X^{12} \\boldsymbol{\\mbf{e}}_{12} + X^{13} \\boldsymbol{\\mbf{e}}_{13} + X^{23} \\boldsymbol{\\mbf{e}}_{23} + X^{123} \\boldsymbol{\\mbf{e}}_{123} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "index_values = symbols('1 2 3', int=True)\n", + "coords = (x1, x2, x3) = symbols('x__1, x__2, x__3', real=True)\n", + "m3= Ga('\\mbf{e}*1|2|3', g=[1,-1,-1], coords=index_values, wedge=False)\n", + "e1, e2, e3 = m3.mv() # basis vectors \n", + "re1, re2, re3 = m3.mvr() # reciprocal basis vectors\n", + "kappa = m3.mv('kappa', 0) # generic 0-vector\n", + "x = m3.mv('x',1) # generic 1-vector\n", + "X = m3.mv('X', 'mv') # generic multivector\n", + "I = m3.I() # unit pseudoscalar \n", + "gprint(r'\\textbf{m3: a model of }\\Gn{1,2}')\n", + "gprint(r'\\text{basis:}~~\\scrE=', m3.mv(),\n", + " r'\\qquad\\text{reciprocal basis:}~~\\scrE^{-1}=', tuple(m3.r_symbols),\n", + " '=', m3.mvr())\n", + "gprint(r'\\text{metric tensor:}~~[g_{ij}]=', m3.g,\n", + " r'\\quad\\text{reciprocal metric tensor:}~~[g^{ij}]=', m3.g_inv)\n", + "gprint(r'\\text{unit pseudoscalar:}~~\\mbf{I}=', I, \n", + " r'\\qquad\\text{square of unit pseudoscalar:}~~\\mbf{I}^2=', I**2)\n", + "gprint(r'\\text{generic}',\n", + " r'\\\\\\quad\\text{scalar (0-vector):}~~', kappa, \n", + " r'\\\\\\quad\\text{vector:}~~\\mbf{x}=', x, \n", + " r'\\\\\\quad\\text{multivector:}~~\\mbf{X}=', X)" + ] + }, + { + "cell_type": "markdown", + "id": "5a249570", + "metadata": {}, + "source": [ + "The `wedge=False` specification of `m3`'s instantiations means that \"no wedge\" notation is being used, in which $\\es{i_1 \\cdots i_g}$ is an abbreviation for the basis blade $\\es{i_1} \\op \\cdots \\op \\es{i_g}$." + ] + }, + { + "cell_type": "markdown", + "id": "6ca8af1f", + "metadata": {}, + "source": [ + "It will be useful to have the following function for simplifying the coefficients in a multivector's basis blade expansion. The function doesn't always accomplish its purpose, but seems to do an adequate job when the coefficients are trigonometric expressions." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7d764d41", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy.simplify.fu import fu \n", + "def mv_simplify(M:Mv, simp=simplify) -> Mv:\n", + " \"\"\"\n", + " Returns the multivector M but with the coefficients of its basis\n", + " blade expansion simplified. Does not modify the original multivector.\n", + " Uses the SymPy simplification function specified by the simp parameter.\n", + " \"\"\"\n", + " # Create `basis_blades`, a list of all basis blades for the geometric\n", + " # algebra to which multivector M belongs. The blades are listed in \n", + " # ascending grade order. Blades of the same grade are listed with \n", + " # ascending strictly ordered indexes.\n", + " basis_blades = []\n", + " for k_blades in M.Ga.blades:\n", + " for blade in k_blades:\n", + " basis_blades.append(M.Ga.mv(blade))\n", + " # Create a list `coefficients` of M's scalar coefficients in its basis\n", + " # blade expansion. Then simplify each coefficient in the list.\n", + " coefficients = M.blade_coefs(basis_blades)\n", + " for k in range(len(coefficients)):\n", + " coefficients[k] = simp(coefficients[k])\n", + " # Create and return a new version of M with simplified coefficients.\n", + " simplified_M = 0\n", + " for k in range(len(basis_blades)):\n", + " simplified_M += coefficients[k]*basis_blades[k]\n", + " return simplified_M" + ] + }, + { + "cell_type": "markdown", + "id": "e45cbd7b", + "metadata": {}, + "source": [ + "## 3. Contravariant/covariant indexing in GAlgebra's output" + ] + }, + { + "cell_type": "markdown", + "id": "af3da0c5", + "metadata": {}, + "source": [ + "Most introductory linear algebra textbooks, including Alan Macdonald's *Linear and Geometric Algebra*, write the basis expansion $\\mbf{x}=\\sum_{i=1}^n x_i \\es{i}$ of a vector $\\mbf{x}$ with the scalar coefficients $x_i$ labelled by a subscript.\n", + "\n", + "GAlgebra uses a somewhat different notational scheme, one borrowed from *tensor algebra*. GAlgebra places the labelling index $i$ of the scalar coefficient as a *superscript* and thus writes the basis expansion of $\\mbf{x}$ in the form \n", + "\n", + "$$\\mbf{x}=\\sum_{i=1}^n x^i \\es{i} = x^1 \\es{1} + x^2 \\es{2} + \\dots + x^n \\es{n},$$ \n", + "\n", + "where $n=p+q$ is the dimension of the scalar product space $\\Rn{p,q}$. Indexes written in superscript position, which should not be confused with exponents, are called *contravariant*, while those written as subscripts (as on the basis vectors) are called *covariant*. (Although not very relevant for GAlgebra, which uses only one basis per geometric algebra model, contravariant/covariant index positioning carries information about how an indexed quantity changes under a change of basis.)\n", + "\n", + "Something similar happens with the basis blade expansion of a multivector $\\mbf{X}$. GAlgebra labels the coefficient which multiplies basis blade $\\es{i_1 \\cdots i_g} := \\es{i_1} \\op \\cdots \\op \\es{i_g}$ with *contravariant indices* identical to the *covariant indices* on the basis blade multiplied. Thus $\\mbf{X}$'s expansion has the form \n", + "\n", + "$$\\mbf{X} = \\sum_{g=0}^n \\left< {\\mbf{X}} \\right>_g\n", + "= X + \\sum_{g=1}^n \\left( \\sum_{1 \\le i_1 < \\cdots < i_g \\le n} X^{i_1 \\cdots i_g} \\es{i_1 \\cdots i_g} \\right).$$\n", + "\n", + "$X = \\left<\\mbf{X}\\right>_0$ has no indices and is displayed in normal math italic so as to distinguish it from the multivector $\\mbf{X}$ of which it is the grade-zero part. In order to keep linearly independent the set of basis blades used in the expansion, only *strictly ordered* index values, $1 \\le i_1 < \\cdots < i_g \\le n$, are included in the summation." + ] + }, + { + "cell_type": "markdown", + "id": "2450d643", + "metadata": {}, + "source": [ + "$\\lt{T}(\\es{j})$, the image by a linear transformation $\\lt{T}$ of a basis vector $\\es{j}$, is itself a vector, so the image's expansion coefficients are also labelled by a contravariant index. Convention is to write the expansion coefficient of $\\lt{T}(\\es{j})$ which multiplies the $i$th basis vector $\\es{i}$ as ${T^i}_j$. Therefore\n", + "\n", + "$$\\lt{T}(\\es{j}) = \\sum_{i=1}^n {T^i}_j \\es{i} = {T^1}_j \\es{1} + {T^2}_j \\es{2} + \\cdots + {T^n}_j \\es{n}.$$ \n", + "\n", + "Notice that the coefficient's contravariant index $i$, which denotes which basis vector the coefficient is to multiply, is written not only as a superscript but also to the left of the covariant index $j$ which indicates the image vector in question. This is done so that when the coefficients of the various basis vector images are placed into a matrix, a coefficient's left index specifies the row in which a coefficient is placed while its right index specifies the column. With indexes so placed, the image vector may be written\n", + "\n", + "$$\\begin{align}\\lt{T}(\\mbf{x}) \n", + "= \\lt{T}\\left(\\sum_{j=1}^n x^j \\es{j}\\right) \n", + "= \\sum_{j=1}^n x^j \\lt{T}(\\es{j})\n", + "= \\sum_{j=1}^n x^j \\sum_{i=1}^n {T^i}_j \\es{i} \n", + "= \\sum_{i=1}^n \\left( \\sum_{j=1}^n {T^i}_j x^j \\right) \\es{i}. \n", + "\\end{align}$$ \n", + "\n", + "and the matrix of all expansion coefficients becomes\n", + "\n", + "$$[\\lt{T}]_\\scrE = \\left[ {T^i}_j \\right]\n", + "= \\left[ \\begin{matrix} {T^1}_1 & \\cdots & {T^1}_j & \\cdots & {T^1}_n \\\\\n", + " \\vdots & & \\vdots & & \\vdots \\\\\n", + " {T^i}_1 & \\cdots & {T^i}_j & \\cdots & {T^i}_n \\\\\n", + " \\vdots & & \\vdots & & \\vdots \\\\\n", + " {T^n}_1 & \\cdots & {T^n}_j & \\cdots & {T^n}_n \\\\\n", + " \\end{matrix} \\right].$$\n", + "\n", + "This *contravariant-covariant matrix* is the standard matrix of the linear transformation $\\lt{T}$ with respect to the basis $\\scrE = \\left(\\es{1}, \\dots, \\es{n}\\right)$. The definitions employed are the same as those in introductory textbooks; the only difference is that the matrix entries have been written with the row index appearing as a left superscript rather than a left subscript. \n", + "\n", + "Notice that the $j$th column of $\\lt{T}$'s matrix consists of the expansion coefficients of $\\lt{T}(\\es{j})$, the $j$th basis image vector.\n", + "\n", + "A GAlgebra user must keep in mind that Python indexing starts at $0$ while it's traditional in mathematics to start at $1$. The difference in start values means that for the SymPy matrix `T.matrix()`, it's the quantity `T.matrix()[i-1, j-1]` which retutrns ${T^i}_j$. It may not *display* as such, however, as we will see when we examine the matrices for symmetric and antisymmetric transformations.\n", + "\n", + "Beside the standard matrix $\\left[{T^i}_j\\right]$ (the contravariant-covariant matrix) associated with $\\lt{T}$, there exists a different matrix, useful when discussing symmetric and antisymmetric transformations, that we will refer to as the *covariant-covariant matrix* $\\left[T_{ij}\\right]$. The entries of the two matrices are related by the formulas\n", + "\n", + "$$T_{ij} = \\sum_{k=1}^n g_{ik}{T^k}_j \\qquad\\text{and}\\qquad {T^i}_j = \\sum_{k=1}^n g^{ik} T_{kj}.$$ \n", + "\n", + "Use of Euclidean metrics and orthonormal bases is common in introductory textbooks. Since $\\left[g_{ij}\\right]$ is the identity matrix in such situations, the above relations then reduce to $T_{ij} = {T^i}_j$, which is one reason introductory textbooks do not make the contravariant/covariant distinction. But if the metric is non-Euclidean or the basis is not orthonormal, the distinction is essential." + ] + }, + { + "cell_type": "markdown", + "id": "ad4283a5", + "metadata": {}, + "source": [ + "## 4. General symbolic transformations; transformation operations" + ] + }, + { + "cell_type": "markdown", + "id": "0a6c0a65", + "metadata": {}, + "source": [ + "As illustrated by the next In[ ] cell, GAlgebra may be used to: \n", + "- Instantiate a *general* symbolic linear transformation $\\lt{G}$. \n", + "- Display how $\\lt{G}$ maps each basis vector to a linear combination of basis vectors.\n", + "- Find the matrix of $\\lt{G}$.\n", + "- Compute $\\lt{G}$'s action on a generic vector $\\mbf{x}$.\n", + "- Compute $\\lt{G}$'s action on a generic multivector $\\mbf{X}$.\n", + "- Find the determinant of $\\lt{G}$.\n", + "- Find the trace of $\\lt{G}$." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "281d5ac4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mbf{G}:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto {G^{1}}_{1} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{1} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{1} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto {G^{1}}_{2} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{2} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{2} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto {G^{1}}_{3} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{3} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{3} \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle [\\lt{G}]_\\scrE = \\left[\\begin{array}{ccc}{G^{1}}_{1} & {G^{1}}_{2} & {G^{1}}_{3}\\\\{G^{2}}_{1} & {G^{2}}_{2} & {G^{2}}_{3}\\\\{G^{3}}_{1} & {G^{3}}_{2} & {G^{3}}_{3}\\end{array}\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{G.matrix()[3-1, 1-1]}= {G^{3}}_{1} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\lt{G}(\\mbf{x})= \\begin{aligned}[t] & \\left ( x^{1} {G^{1}}_{1} + x^{2} {G^{1}}_{2} + x^{3} {G^{1}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} \\\\ & + \\left ( x^{1} {G^{2}}_{1} + x^{2} {G^{2}}_{2} + x^{3} {G^{2}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{2} \\\\ & + \\left ( x^{1} {G^{3}}_{1} + x^{2} {G^{3}}_{2} + x^{3} {G^{3}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\lt{G}(\\mbf{X})= \\begin{aligned}[t] & X \\\\ & + \\left ( X^{1} {G^{1}}_{1} + X^{2} {G^{1}}_{2} + X^{3} {G^{1}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} \\\\ & + \\left ( X^{1} {G^{2}}_{1} + X^{2} {G^{2}}_{2} + X^{3} {G^{2}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{2} \\\\ & + \\left ( X^{1} {G^{3}}_{1} + X^{2} {G^{3}}_{2} + X^{3} {G^{3}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\\\ & + \\left ( X^{12} {G^{1}}_{1} {G^{2}}_{2} - X^{12} {G^{1}}_{2} {G^{2}}_{1} + X^{13} {G^{1}}_{1} {G^{2}}_{3} - X^{13} {G^{1}}_{3} {G^{2}}_{1} + X^{23} {G^{1}}_{2} {G^{2}}_{3} - X^{23} {G^{1}}_{3} {G^{2}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{12} \\\\ & + \\left ( X^{12} {G^{1}}_{1} {G^{3}}_{2} - X^{12} {G^{1}}_{2} {G^{3}}_{1} + X^{13} {G^{1}}_{1} {G^{3}}_{3} - X^{13} {G^{1}}_{3} {G^{3}}_{1} + X^{23} {G^{1}}_{2} {G^{3}}_{3} - X^{23} {G^{1}}_{3} {G^{3}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{13} \\\\ & + \\left ( X^{12} {G^{2}}_{1} {G^{3}}_{2} - X^{12} {G^{2}}_{2} {G^{3}}_{1} + X^{13} {G^{2}}_{1} {G^{3}}_{3} - X^{13} {G^{2}}_{3} {G^{3}}_{1} + X^{23} {G^{2}}_{2} {G^{3}}_{3} - X^{23} {G^{2}}_{3} {G^{3}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{23} \\\\ & + X^{123} \\left({G^{1}}_{1} {G^{2}}_{2} {G^{3}}_{3} - {G^{1}}_{1} {G^{2}}_{3} {G^{3}}_{2} - {G^{1}}_{2} {G^{2}}_{1} {G^{3}}_{3} + {G^{1}}_{2} {G^{2}}_{3} {G^{3}}_{1} + {G^{1}}_{3} {G^{2}}_{1} {G^{3}}_{2} - {G^{1}}_{3} {G^{2}}_{2} {G^{3}}_{1}\\right) \\boldsymbol{\\mbf{e}}_{123} \\end{aligned} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\det(\\lt{G})= {G^{1}}_{1} {G^{2}}_{2} {G^{3}}_{3} - {G^{1}}_{1} {G^{2}}_{3} {G^{3}}_{2} - {G^{1}}_{2} {G^{2}}_{1} {G^{3}}_{3} + {G^{1}}_{2} {G^{2}}_{3} {G^{3}}_{1} + {G^{1}}_{3} {G^{2}}_{1} {G^{3}}_{2} - {G^{1}}_{3} {G^{2}}_{2} {G^{3}}_{1} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{tr}(\\lt{G})= {G^{1}}_{1} + {G^{2}}_{2} + {G^{3}}_{3} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = m3.lt('G') # instantiate general symbolic transformation \n", + "gprint(r'\\mbf{G}:~', G) # transformation's action on basis vectors\n", + "gprint(r'[\\lt{G}]_\\scrE =', G.matrix()) # matrix with respect to basis\n", + "gprint(r'\\text{G.matrix()[3-1, 1-1]}=', G.matrix()[3-1, 1-1])\n", + " # example: (3,1) matrix entry\n", + "gprint(r'\\lt{G}(\\mbf{x})=', G(x).Fmt(3)) # action on generic vector\n", + "gprint(r'\\lt{G}(\\mbf{X})=', G(X).Fmt(3)) # action on generic multivector\n", + "gprint(r'\\det(\\lt{G})=', G.det()) # transformation's determinant\n", + "gprint(r'\\text{tr}(\\lt{G})=', G.tr()) # transformation's trace" + ] + }, + { + "cell_type": "markdown", + "id": "5b062eb6", + "metadata": {}, + "source": [ + "- GAlgebra can multiply a linear transformation by a scalar provided it's a SymPy scalar. \n", + "If multiplying the transformation by a 0-vector (i.e. a GAlgebra scalar), the 0-vector has to first be converted into a SymPy scalar by use of the multivector method `.scalar()`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "b31c6cd4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\kappa \\text{ belongs to } \\text{} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{converted } \\kappa \\text{ belongs to } \\text{} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\kappa\\lt{G}:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto \\kappa {G^{1}}_{1} \\boldsymbol{\\mbf{e}}_{1} + \\kappa {G^{2}}_{1} \\boldsymbol{\\mbf{e}}_{2} + \\kappa {G^{3}}_{1} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto \\kappa {G^{1}}_{2} \\boldsymbol{\\mbf{e}}_{1} + \\kappa {G^{2}}_{2} \\boldsymbol{\\mbf{e}}_{2} + \\kappa {G^{3}}_{2} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto \\kappa {G^{1}}_{3} \\boldsymbol{\\mbf{e}}_{1} + \\kappa {G^{2}}_{3} \\boldsymbol{\\mbf{e}}_{2} + \\kappa {G^{3}}_{3} \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\lambda \\text{ belongs to } \\text{} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\lambda\\lt{G}:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto \\lambda {G^{1}}_{1} \\boldsymbol{\\mbf{e}}_{1} + \\lambda {G^{2}}_{1} \\boldsymbol{\\mbf{e}}_{2} + \\lambda {G^{3}}_{1} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto \\lambda {G^{1}}_{2} \\boldsymbol{\\mbf{e}}_{1} + \\lambda {G^{2}}_{2} \\boldsymbol{\\mbf{e}}_{2} + \\lambda {G^{3}}_{2} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto \\lambda {G^{1}}_{3} \\boldsymbol{\\mbf{e}}_{1} + \\lambda {G^{2}}_{3} \\boldsymbol{\\mbf{e}}_{2} + \\lambda {G^{3}}_{3} \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "kappa = m3.mv('kappa', 0) # a 0-vector, not a SymPy scalar\n", + "gprint(kappa, r'\\text{ belongs to }', type(kappa))\n", + "gprint(r'\\text{converted }', kappa.scalar(), r'\\text{ belongs to }', type(kappa.scalar()))\n", + "gprint(r'\\kappa\\lt{G}:~', kappa.scalar()*G) \n", + " # product of 0-vector and transformation\n", + "gprint()\n", + "lamda = symbols('lambda', real=True) # a SymPy scalar, not a 0-vector\n", + "gprint(lamda, r'\\text{ belongs to }', type(lamda))\n", + "gprint(r'\\lambda\\lt{G}:~', lamda*G) # product of SymPy scalar and transformation" + ] + }, + { + "cell_type": "markdown", + "id": "93d54c19", + "metadata": {}, + "source": [ + "GAlgebra can combine transformations $\\lt{F}$ and $\\lt{G}$ using\n", + "- addition, $\\lt{F} + \\lt{G}$, \n", + "- subtraction, $\\lt{F} - \\lt{G}$, and/or \n", + "- compositional multiplication, $\\lt{F}\\lt{G}$.\n", + "\n", + "The compositional product $\\lt{FG} \\equiv \\lt{F}\\circ\\lt{G}$ is obtained from GAlgebra expression `F*G`." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0ccb8a6f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\lt{F} + \\lt{G}:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto \\left ( {F^{1}}_{1} + {G^{1}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( {F^{2}}_{1} + {G^{2}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( {F^{3}}_{1} + {G^{3}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto \\left ( {F^{1}}_{2} + {G^{1}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( {F^{2}}_{2} + {G^{2}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( {F^{3}}_{2} + {G^{3}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto \\left ( {F^{1}}_{3} + {G^{1}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( {F^{2}}_{3} + {G^{2}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( {F^{3}}_{3} + {G^{3}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} \\qquad[\\lt{F}+\\lt{G}]_\\scrE = \\left[\\begin{array}{ccc}{F^{1}}_{1} + {G^{1}}_{1} & {F^{1}}_{2} + {G^{1}}_{2} & {F^{1}}_{3} + {G^{1}}_{3}\\\\{F^{2}}_{1} + {G^{2}}_{1} & {F^{2}}_{2} + {G^{2}}_{2} & {F^{2}}_{3} + {G^{2}}_{3}\\\\{F^{3}}_{1} + {G^{3}}_{1} & {F^{3}}_{2} + {G^{3}}_{2} & {F^{3}}_{3} + {G^{3}}_{3}\\end{array}\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\lt{F} - \\lt{G}:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto \\left ( {F^{1}}_{1} - {G^{1}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( {F^{2}}_{1} - {G^{2}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( {F^{3}}_{1} - {G^{3}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto \\left ( {F^{1}}_{2} - {G^{1}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( {F^{2}}_{2} - {G^{2}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( {F^{3}}_{2} - {G^{3}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto \\left ( {F^{1}}_{3} - {G^{1}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( {F^{2}}_{3} - {G^{2}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( {F^{3}}_{3} - {G^{3}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} \\qquad[\\lt{F}-\\lt{G}]_\\scrE = \\left[\\begin{array}{ccc}{F^{1}}_{1} - {G^{1}}_{1} & {F^{1}}_{2} - {G^{1}}_{2} & {F^{1}}_{3} - {G^{1}}_{3}\\\\{F^{2}}_{1} - {G^{2}}_{1} & {F^{2}}_{2} - {G^{2}}_{2} & {F^{2}}_{3} - {G^{2}}_{3}\\\\{F^{3}}_{1} - {G^{3}}_{1} & {F^{3}}_{2} - {G^{3}}_{2} & {F^{3}}_{3} - {G^{3}}_{3}\\end{array}\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\lt{F}\\lt{G}:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto \\left ( {F^{1}}_{1} {G^{1}}_{1} + {F^{1}}_{2} {G^{2}}_{1} + {F^{1}}_{3} {G^{3}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( {F^{2}}_{1} {G^{1}}_{1} + {F^{2}}_{2} {G^{2}}_{1} + {F^{2}}_{3} {G^{3}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( {F^{3}}_{1} {G^{1}}_{1} + {F^{3}}_{2} {G^{2}}_{1} + {F^{3}}_{3} {G^{3}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto \\left ( {F^{1}}_{1} {G^{1}}_{2} + {F^{1}}_{2} {G^{2}}_{2} + {F^{1}}_{3} {G^{3}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( {F^{2}}_{1} {G^{1}}_{2} + {F^{2}}_{2} {G^{2}}_{2} + {F^{2}}_{3} {G^{3}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( {F^{3}}_{1} {G^{1}}_{2} + {F^{3}}_{2} {G^{2}}_{2} + {F^{3}}_{3} {G^{3}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto \\left ( {F^{1}}_{1} {G^{1}}_{3} + {F^{1}}_{2} {G^{2}}_{3} + {F^{1}}_{3} {G^{3}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( {F^{2}}_{1} {G^{1}}_{3} + {F^{2}}_{2} {G^{2}}_{3} + {F^{2}}_{3} {G^{3}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( {F^{3}}_{1} {G^{1}}_{3} + {F^{3}}_{2} {G^{2}}_{3} + {F^{3}}_{3} {G^{3}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} \\qquad[\\lt{F}\\lt{G}]_\\scrE = \\left[\\begin{array}{ccc}{F^{1}}_{1} {G^{1}}_{1} + {F^{1}}_{2} {G^{2}}_{1} + {F^{1}}_{3} {G^{3}}_{1} & {F^{1}}_{1} {G^{1}}_{2} + {F^{1}}_{2} {G^{2}}_{2} + {F^{1}}_{3} {G^{3}}_{2} & {F^{1}}_{1} {G^{1}}_{3} + {F^{1}}_{2} {G^{2}}_{3} + {F^{1}}_{3} {G^{3}}_{3}\\\\{F^{2}}_{1} {G^{1}}_{1} + {F^{2}}_{2} {G^{2}}_{1} + {F^{2}}_{3} {G^{3}}_{1} & {F^{2}}_{1} {G^{1}}_{2} + {F^{2}}_{2} {G^{2}}_{2} + {F^{2}}_{3} {G^{3}}_{2} & {F^{2}}_{1} {G^{1}}_{3} + {F^{2}}_{2} {G^{2}}_{3} + {F^{2}}_{3} {G^{3}}_{3}\\\\{F^{3}}_{1} {G^{1}}_{1} + {F^{3}}_{2} {G^{2}}_{1} + {F^{3}}_{3} {G^{3}}_{1} & {F^{3}}_{1} {G^{1}}_{2} + {F^{3}}_{2} {G^{2}}_{2} + {F^{3}}_{3} {G^{3}}_{2} & {F^{3}}_{1} {G^{1}}_{3} + {F^{3}}_{2} {G^{2}}_{3} + {F^{3}}_{3} {G^{3}}_{3}\\end{array}\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{(F*G).matrix() == F.matrix() * G.matrix()}:~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "F = m3.lt('F') # a symbolic linear transformation\n", + "G = m3.lt('G') # another symbolic transformation\n", + "gprint(r'\\lt{F} + \\lt{G}:~', F + G,\n", + " r'\\qquad[\\lt{F}+\\lt{G}]_\\scrE =', (F + G).matrix())\n", + "gprint(r'\\lt{F} - \\lt{G}:~', F - G,\n", + " r'\\qquad[\\lt{F}-\\lt{G}]_\\scrE =', (F - G).matrix())\n", + "gprint(r'\\lt{F}\\lt{G}:~', F * G,\n", + " r'\\qquad[\\lt{F}\\lt{G}]_\\scrE =', (F * G).matrix())\n", + "# Test: Is the matrix of two transformations' compositional product\n", + "# the same as the product of the transformations' matrices?\n", + "gprint(r'\\text{(F*G).matrix() == F.matrix() * G.matrix()}:~',\n", + " (F*G).matrix() == F.matrix() * G.matrix())" + ] + }, + { + "cell_type": "markdown", + "id": "f43bd94f", + "metadata": {}, + "source": [ + "Observe that the $(i,j)$ entry in the above output for $[\\lt{F}\\lt{G}]_\\scrE$ is given by $\\sum_{k=1}^n {F^i}_k {G^k}_j$ (where $n=3$ for $\\Gn{1,2}$), as it should be." + ] + }, + { + "cell_type": "markdown", + "id": "0190f4e4", + "metadata": {}, + "source": [ + "- The GAlgebra expression `G.adj()` returns the adjoint $\\ad{G}$ of transformation $\\lt{G}$." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3494bb1f", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{adjoint }\\ad{G}\\text{ of general symbolic transformation }\\lt{G}:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\ad{G}: \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto {G^{1}}_{1} \\boldsymbol{\\mbf{e}}_{1} - {G^{1}}_{2} \\boldsymbol{\\mbf{e}}_{2} - {G^{1}}_{3} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto - {G^{2}}_{1} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{2} \\boldsymbol{\\mbf{e}}_{2} + {G^{2}}_{3} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto - {G^{3}}_{1} \\boldsymbol{\\mbf{e}}_{1} + {G^{3}}_{2} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{3} \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} \\qquad[\\ad{G}]_\\scrE= \\left[\\begin{array}{ccc}{G^{1}}_{1} & - {G^{2}}_{1} & - {G^{3}}_{1}\\\\- {G^{1}}_{2} & {G^{2}}_{2} & {G^{3}}_{2}\\\\- {G^{1}}_{3} & {G^{2}}_{3} & {G^{3}}_{3}\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\ad{G}(\\mbf{x})= \\begin{aligned}[t] & \\left ( x^{1} {G^{1}}_{1} - x^{2} {G^{2}}_{1} - x^{3} {G^{3}}_{1}\\right ) \\boldsymbol{\\mbf{e}}_{1} \\\\ & + \\left ( - x^{1} {G^{1}}_{2} + x^{2} {G^{2}}_{2} + x^{3} {G^{3}}_{2}\\right ) \\boldsymbol{\\mbf{e}}_{2} \\\\ & + \\left ( - x^{1} {G^{1}}_{3} + x^{2} {G^{2}}_{3} + x^{3} {G^{3}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad {{G^*}^1}_2=(1,2)\\text{ entry of matrix of }\\ad{G}= - {G^{2}}_{1} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gprint(r'\\text{adjoint }\\ad{G}\\text{ of general symbolic transformation }\\lt{G}:')\n", + "gprint(r'\\qquad\\ad{G}:', G.adj(),\n", + " r'\\qquad[\\ad{G}]_\\scrE=', G.adj().matrix(),\n", + " r'\\\\\\qquad\\ad{G}(\\mbf{x})=', G.adj()(x).Fmt(3))\n", + "gprint(r'\\qquad {{G^*}^1}_2=(1,2)\\text{ entry of matrix of }\\ad{G}=',\n", + " G.adj().matrix()[1-1,2-1]) # example matrix entry" + ] + }, + { + "cell_type": "markdown", + "id": "4e2ca7a3", + "metadata": {}, + "source": [ + "*Remark:* As the above output shows, the adjoint's matrix is not necessarily the transpose of the transformation's matrix. The two are necessarily equal only when the basis used is orthonormal and the metric has a Euclidean signature. The algebra being used, `m3`, fails the second of those two requirements." + ] + }, + { + "cell_type": "markdown", + "id": "de6e7f4c", + "metadata": {}, + "source": [ + "**Internal representation of a linear transformation.** The model `G` of a transformation $\\lt{G}$ is stored internally as a Python dictionary, accessible as the attribute `G.lt_dict`. The dictionary's *key: value* pairs, when printed, *appear* to have the form *basis vector: $\\lt{G}$(basis vector)*, but appearances are deceiving. Instead the keys are basis *symbols*, i.e. are objects which are mapped to the basis *vectors* by application of the method `m3.mv()`. And the values are linear combinations of the basis symbols, i.e. are objects which `m3.mv()` maps to basis image vectors. This distinction will be important in Section 6, when we explore the different ways one can specify a non-symbolic linear transformation." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "21468025", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{basis vectors}:~~\\text{m3.mv()}= \\left( \\boldsymbol{\\mbf{e}}_{1}, \\ \\boldsymbol{\\mbf{e}}_{2}, \\ \\boldsymbol{\\mbf{e}}_{3}\\right) $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{basis symbols}:~~\\text{m3.basis}= \\left[ \\boldsymbol{\\mbf{e}}_{1}, \\ \\boldsymbol{\\mbf{e}}_{2}, \\ \\boldsymbol{\\mbf{e}}_{3}\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{internal dictionary}:~~\\text{G.lt\\_dict}= \\left\\{ \\boldsymbol{\\mbf{e}}_{1} : {G^{1}}_{1} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{1} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{1} \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{2} : {G^{1}}_{2} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{2} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{2} \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{3} : {G^{1}}_{3} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{3} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{3} \\boldsymbol{\\mbf{e}}_{3}\\right\\} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\boldsymbol{\\mbf{e}}_{1} \\text{ from m3.basis belongs to } \\text{} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle {G^{1}}_{1} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{1} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{1} \\boldsymbol{\\mbf{e}}_{3} \\text{ belongs to } \\text{} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\boldsymbol{\\mbf{e}}_{2} \\text{ from m3.basis belongs to } \\text{} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle {G^{1}}_{2} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{2} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{2} \\boldsymbol{\\mbf{e}}_{3} \\text{ belongs to } \\text{} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\boldsymbol{\\mbf{e}}_{3} \\text{ from m3.basis belongs to } \\text{} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle {G^{1}}_{3} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{3} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{3} \\boldsymbol{\\mbf{e}}_{3} \\text{ belongs to } \\text{} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gprint(r'\\text{basis vectors}:~~\\text{m3.mv()}=', m3.mv())\n", + "gprint(r'\\text{basis symbols}:~~\\text{m3.basis}=', m3.basis)\n", + "gprint(r'\\text{internal dictionary}:~~\\text{G.lt\\_dict}=', G.lt_dict)\n", + "for base in m3.basis:\n", + " gprint(base, r'\\text{ from m3.basis belongs to }', type(base))\n", + " gprint(G.lt_dict[base], r'\\text{ belongs to }',\n", + " type(G.lt_dict[base]))" + ] + }, + { + "cell_type": "markdown", + "id": "80cc64e8", + "metadata": {}, + "source": [ + "Versor-based transformations will be discussed in Section 7. Such a transformation stores a versor internally in its `.V` attribute. Each transformation, whether dictionary based or versor based, have a boolean `.versor` attribute which, when `True`, signals the existence of the `.V` attribute." + ] + }, + { + "cell_type": "markdown", + "id": "e30fa966", + "metadata": {}, + "source": [ + "## 5. Symmetric and antisymmetric symbolic transformations" + ] + }, + { + "cell_type": "markdown", + "id": "f951af56", + "metadata": {}, + "source": [ + "Besides *general* symbolic transformations, encountered in the previous section, GAlgebra can create *symmetric* (a.k.a. self-adjoint) and *antisymmetric* (a.k.a. skew) symbolic transformations." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "76906c9d", + "metadata": {}, + "outputs": [], + "source": [ + "G = m3.lt('G', mode='g') # instantiate a general symbolic transformation\n", + " # specification mode='g' is not strictly necessary as 'g' is the default\n", + " # value of the mode parameter\n", + "S = m3.lt('S', mode='s') # instantiate a symmetric symbolic transformation\n", + "A = m3.lt('A', mode='a') # instantiate an antisymmetric symbolic transformation" + ] + }, + { + "cell_type": "markdown", + "id": "48f61f17", + "metadata": {}, + "source": [ + "Unlike a *general* symbolic transformation $\\lt{G}$, the entries in `S.matrix()` for a symmetric symbolic transformation $\\lt{S}$ will not *appear* to be entries in the standard (contravariant-covariant) matrix for that transformation, although they are. Instead they will appear as linear combinations of doubly-subscripted symbols $S_{ij}$, where $1 \\le i \\le j \\le n$. Those symbols have the significance of being the entries on or above the diagonal of $\\lt{S}$'s covariant-covariant matrix.\n", + "\n", + "Similarly, the entries in `A.matrix()` for an antisymmetric symbolic transformation $\\lt{A}$ will appear as linear combinations of doubly-subscripted symbols $A_{ij}$, where $1 \\le i < j \\le n$. Those symbols have the significance of being the entries above the diagonal of $\\lt{A}$'s covariant-covariant matrix. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "952ad12b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{general symbolic transformation }\\lt{G}:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{G}: \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto {G^{1}}_{1} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{1} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{1} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto {G^{1}}_{2} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{2} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{2} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto {G^{1}}_{3} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{3} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{3} \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} \\qquad[\\lt{G}]_\\scrE= \\left[\\begin{array}{ccc}{G^{1}}_{1} & {G^{1}}_{2} & {G^{1}}_{3}\\\\{G^{2}}_{1} & {G^{2}}_{2} & {G^{2}}_{3}\\\\{G^{3}}_{1} & {G^{3}}_{2} & {G^{3}}_{3}\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{G}(\\mbf{x})= \\left ( x^{1} {G^{1}}_{1} + x^{2} {G^{1}}_{2} + x^{3} {G^{1}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( x^{1} {G^{2}}_{1} + x^{2} {G^{2}}_{2} + x^{3} {G^{2}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( x^{1} {G^{3}}_{1} + x^{2} {G^{3}}_{2} + x^{3} {G^{3}}_{3}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad(3,1)\\text{ entry of the contravariant-covariant matrix is } {G^{3}}_{1} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\text{covariant-covariant matrix of }\\lt{G}= \\left[\\begin{array}{ccc}{G^{1}}_{1} & {G^{1}}_{2} & {G^{1}}_{3}\\\\- {G^{2}}_{1} & - {G^{2}}_{2} & - {G^{2}}_{3}\\\\- {G^{3}}_{1} & - {G^{3}}_{2} & - {G^{3}}_{3}\\end{array}\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{symmetric symbolic transformation }\\lt{S}:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{S}: \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto S_{1} \\boldsymbol{\\mbf{e}}_{1} - S_{2} \\boldsymbol{\\mbf{e}}_{2} - S_{3} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto S_{2} \\boldsymbol{\\mbf{e}}_{1} - S_{4} \\boldsymbol{\\mbf{e}}_{2} - S_{5} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto S_{3} \\boldsymbol{\\mbf{e}}_{1} - S_{5} \\boldsymbol{\\mbf{e}}_{2} - S_{6} \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} \\qquad[\\lt{S}]_\\scrE= \\left[\\begin{array}{ccc}S_{1} & S_{2} & S_{3}\\\\- S_{2} & - S_{4} & - S_{5}\\\\- S_{3} & - S_{5} & - S_{6}\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{S}(\\mbf{x})= \\left ( S_{1} x^{1} + S_{2} x^{2} + S_{3} x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( - S_{2} x^{1} - S_{4} x^{2} - S_{5} x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( - S_{3} x^{1} - S_{5} x^{2} - S_{6} x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad(3,1)\\text{ entry of the contravariant-covariant matrix is } - S_{3} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\text{covariant-covariant matrix of }\\lt{S}= \\left[\\begin{array}{ccc}S_{1} & S_{2} & S_{3}\\\\S_{2} & S_{4} & S_{5}\\\\S_{3} & S_{5} & S_{6}\\end{array}\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\text{antisymmetric symbolic transformation }\\lt{A}:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{A}: \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto A_{1} \\boldsymbol{\\mbf{e}}_{2} + A_{2} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto A_{1} \\boldsymbol{\\mbf{e}}_{1} + A_{3} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto A_{2} \\boldsymbol{\\mbf{e}}_{1} - A_{3} \\boldsymbol{\\mbf{e}}_{2} \\end{aligned} \\right\\} \\qquad[\\lt{A}]_\\scrE= \\left[\\begin{array}{ccc}0 & A_{1} & A_{2}\\\\A_{1} & 0 & - A_{3}\\\\A_{2} & A_{3} & 0\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{A}(\\mbf{x})= \\left ( A_{1} x^{2} + A_{2} x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( A_{1} x^{1} - A_{3} x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( A_{2} x^{1} + A_{3} x^{2}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad(3,1)\\text{ entry of the contravariant-covariant matrix is } A_{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\text{covariant-covariant matrix of }\\lt{A}= \\left[\\begin{array}{ccc}0 & A_{1} & A_{2}\\\\- A_{1} & 0 & A_{3}\\\\- A_{2} & - A_{3} & 0\\end{array}\\right] $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gprint(r'\\text{general symbolic transformation }\\lt{G}:')\n", + "gprint(r'\\qquad\\lt{G}:', G,\n", + " r'\\qquad[\\lt{G}]_\\scrE=', G.matrix(),\n", + " r'\\\\\\qquad\\lt{G}(\\mbf{x})=', G(x))\n", + "gprint(r'\\qquad(3,1)\\text{ entry of the contravariant-covariant matrix is }',\n", + " G.matrix()[3-1,1-1]) # example matrix entry\n", + "gprint(r'\\qquad\\text{covariant-covariant matrix of }\\lt{G}=', m3.g * G.matrix())\n", + "gprint()\n", + "gprint(r'\\text{symmetric symbolic transformation }\\lt{S}:')\n", + "gprint(r'\\qquad\\lt{S}:', S,\n", + " r'\\qquad[\\lt{S}]_\\scrE=', S.matrix(),\n", + " r'\\\\\\qquad\\lt{S}(\\mbf{x})=', S(x))\n", + "gprint(r'\\qquad(3,1)\\text{ entry of the contravariant-covariant matrix is }',\n", + " S.matrix()[3-1,1-1]) # example matrix entry\n", + "gprint(r'\\qquad\\text{covariant-covariant matrix of }\\lt{S}=', m3.g * S.matrix())\n", + "gprint()\n", + "gprint(r'\\text{antisymmetric symbolic transformation }\\lt{A}:')\n", + "gprint(r'\\qquad\\lt{A}:', A,\n", + " r'\\qquad[\\lt{A}]_\\scrE=', A.matrix(),\n", + " r'\\\\\\qquad\\lt{A}(\\mbf{x})=', A(x))\n", + "gprint(r'\\qquad(3,1)\\text{ entry of the contravariant-covariant matrix is }',\n", + " A.matrix()[3-1,1-1]) # example matrix entry\n", + "gprint(r'\\qquad\\text{covariant-covariant matrix of }\\lt{A}=', m3.g * A.matrix())" + ] + }, + { + "cell_type": "markdown", + "id": "77ceaac3", + "metadata": {}, + "source": [ + "Notice in the above output that the covariant-covariant matrices of the general transformation $\\lt{G}$, the symmetric transformation $\\lt{S}$, and the antisymmetric transformation $\\lt{A}$ are respectively neither symmetric nor antisymmetric, symmetric, and antisymmetric. None of the transformations display symmetry or antisymmetry in their standard (contravariant-covariant) matrices." + ] + }, + { + "cell_type": "markdown", + "id": "ca059499", + "metadata": {}, + "source": [ + "## 6. Non-symbolic, dictionary-based transformations" + ] + }, + { + "cell_type": "markdown", + "id": "d1c36ad5", + "metadata": {}, + "source": [ + "All examples in Sections 4--6 were of symbolic transformations. To create such transformations, all that was needed was a one-letter string, used to specify the kernel symbol of the matrix entries, and specification as to whether the transformation was to be general (`mode='g'`), symmetric (`mode='s'`), or antisymmetric (`mode='a'`).\n", + "\n", + "Besides one-letter strings, the transformation constructor `m3.lt` can accept objects of other types for its instantiation parameter. Such objects can be:\n", + "\n", + "- `lt_list`, a list of lists, has its $j$th entry `lt_list[j]` a list of the expansion coefficients of the $j$the image vector. \n", + "- `lt_matrix`, a SymPy matrix, is identical to the matrix of the desired tranformation. \n", + "- `lt_dict`, a Python dictionary, consists of *key:value* pairs, where each *key* is a basis symbol (entry in `m3.basis`) and each *value* is a linear combination of basis symbols. \n", + "- `lt_func`, a linear vector-valued function of a vector argument, has the same action on vectors as the desired linear transformation/outermorphism.\n", + "\n", + "Each such parameter is a different ways of specifying the images of the basis vectors by the desired transformation/outermorphism. The `mode` parameter is not specified since symmetry or antisymmetry, if either, is determined by the basis vector images." + ] + }, + { + "cell_type": "markdown", + "id": "9d442aad", + "metadata": {}, + "source": [ + "**An example.** Suppose we want to instantiate a transformation $\\lt{T}$ the actions of which on basis vectors are\n", + "\n", + "$$\\left\\{~ \\begin{array}{llrrr}\n", + "\\lt{T}(\\es{1}) &= &(0)\\es{1} + &(-1)\\es{2} + &(2)\\es{3} \\\\\n", + "\\lt{T}(\\es{2}) &= &(5)\\es{1} + &(2)\\es{2} + &(3)\\es{3} \\\\\n", + "\\lt{T}(\\es{3}) &= &(2)\\es{1} + &(0)\\es{2} + &(0)\\es{3} \\\\\n", + "\\end{array} ~\\right\\}.$$\n", + "\n", + "We create different type objects each of which encodes the information in the above set of equations:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3d14e81d", + "metadata": {}, + "outputs": [], + "source": [ + "# type list (of lists)\n", + "lt_list = [[0, -1, 2], [5, 2, 3], [2, 0, 0]] \n", + "\n", + "# type Matrix\n", + "lt_matrix = Matrix([[0, 5, 2], [-1, 2, 0], [2, 3, 0]])\n", + "\n", + "# type dict\n", + "lt_dict = {} # create empty dictionary, then add key:value pairs\n", + "b1,b2,b3 = m3.basis # basis symbols corresponding to basis vectors\n", + "lt_dict[b1] = -b2 + 2*b3 # 1st linear combination of basis symbols\n", + "lt_dict[b2] = 5*b1 + 2*b2 + 3*b3 # 2nd linear combination of basis symbols\n", + "lt_dict[b3] = 2*b1 # 3rd linear combination of basis symbols\n", + "\n", + "# type function\n", + "lt_func = lambda x: (re1" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_1:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto - \\boldsymbol{\\mbf{e}}_{2} + 2 \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto 5 \\boldsymbol{\\mbf{e}}_{1} + 2 \\boldsymbol{\\mbf{e}}_{2} + 3 \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto 2 \\boldsymbol{\\mbf{e}}_{1} \\end{aligned} \\right\\} \\qquad\\left[ \\lt{T}_1 \\right]= \\left[\\begin{array}{ccc}0 & 5 & 2\\\\-1 & 2 & 0\\\\2 & 3 & 0\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_1(\\mbf{x})= \\left ( 5 x^{2} + 2 x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( - x^{1} + 2 x^{2}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( 2 x^{1} + 3 x^{2}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{T2 = m3.lt(lt\\_matrix)}, \\quad\\text{where lt\\_matrix}= \\left[\\begin{array}{ccc}0 & 5 & 2\\\\-1 & 2 & 0\\\\2 & 3 & 0\\end{array}\\right] :$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_2:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto - \\boldsymbol{\\mbf{e}}_{2} + 2 \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto 5 \\boldsymbol{\\mbf{e}}_{1} + 2 \\boldsymbol{\\mbf{e}}_{2} + 3 \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto 2 \\boldsymbol{\\mbf{e}}_{1} \\end{aligned} \\right\\} \\qquad\\left[ \\lt{T}_2 \\right]= \\left[\\begin{array}{ccc}0 & 5 & 2\\\\-1 & 2 & 0\\\\2 & 3 & 0\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_2(\\mbf{x})= \\left ( 5 x^{2} + 2 x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( - x^{1} + 2 x^{2}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( 2 x^{1} + 3 x^{2}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{T3 = m3.lt(lt\\_dict)}, \\quad\\text{where lt\\_dict}= \\left\\{ \\boldsymbol{\\mbf{e}}_{1} : - \\boldsymbol{\\mbf{e}}_{2} + 2 \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{2} : 5 \\boldsymbol{\\mbf{e}}_{1} + 2 \\boldsymbol{\\mbf{e}}_{2} + 3 \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{3} : 2 \\boldsymbol{\\mbf{e}}_{1}\\right\\} :$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_3:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto - \\boldsymbol{\\mbf{e}}_{2} + 2 \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto 5 \\boldsymbol{\\mbf{e}}_{1} + 2 \\boldsymbol{\\mbf{e}}_{2} + 3 \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto 2 \\boldsymbol{\\mbf{e}}_{1} \\end{aligned} \\right\\} \\qquad\\left[ \\lt{T}_3 \\right]= \\left[\\begin{array}{ccc}0 & 5 & 2\\\\-1 & 2 & 0\\\\2 & 3 & 0\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_3(\\mbf{x})= \\left ( 5 x^{2} + 2 x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( - x^{1} + 2 x^{2}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( 2 x^{1} + 3 x^{2}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{T4 = m3.lt(lt\\_func)}\\qquad\\text{where lt\\_func is defined by}\\\\\\qquad\\text{lambda x: (e2+2*e3)*(re1" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_4:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto 5 \\boldsymbol{\\mbf{e}}_{2} + 2 \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto - \\boldsymbol{\\mbf{e}}_{1} + 2 \\boldsymbol{\\mbf{e}}_{2} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto 2 \\boldsymbol{\\mbf{e}}_{1} + 3 \\boldsymbol{\\mbf{e}}_{2} \\end{aligned} \\right\\} \\qquad\\left[ \\lt{T}_4 \\right]= \\left[\\begin{array}{ccc}0 & -1 & 2\\\\5 & 2 & 3\\\\2 & 0 & 0\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_4(\\mbf{x})= \\left ( - x^{2} + 2 x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{1} + \\left ( 5 x^{1} + 2 x^{2} + 3 x^{3}\\right ) \\boldsymbol{\\mbf{e}}_{2} + 2 x^{1} \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "T1 = m3.lt(lt_list) # instantiate transformation using list-type object\n", + "gprint(r'\\textbf{T1 = m3.lt(lt\\_list)}, \\quad\\text{where lt\\_list}=', lt_list, ':')\n", + "gprint(r'\\qquad\\lt{T}_1:~', T1,\n", + " r'\\qquad\\left[ \\lt{T}_1 \\right]=', T1.matrix(),\n", + " r'\\\\\\qquad\\lt{T}_1(\\mbf{x})=', T1(x))\n", + "gprint()\n", + "\n", + "T2 = m3.lt(lt_matrix) # instantiate transformation using Matrix-type object\n", + "gprint(r'\\textbf{T2 = m3.lt(lt\\_matrix)}, \\quad\\text{where lt\\_matrix}=', lt_matrix, ':')\n", + "gprint(r'\\qquad\\lt{T}_2:~', T2,\n", + " r'\\qquad\\left[ \\lt{T}_2 \\right]=', T2.matrix(),\n", + " r'\\\\\\qquad\\lt{T}_2(\\mbf{x})=', T2(x))\n", + "gprint()\n", + "\n", + "T3 = m3.lt(lt_dict) # instantiate transformation using dict-type object\n", + "gprint(r'\\textbf{T3 = m3.lt(lt\\_dict)}, \\quad\\text{where lt\\_dict}=', lt_dict, ':')\n", + "gprint(r'\\qquad\\lt{T}_3:~', T3,\n", + " r'\\qquad\\left[ \\lt{T}_3 \\right]=', T3.matrix(),\n", + " r'\\\\\\qquad\\lt{T}_3(\\mbf{x})=', T3(x))\n", + "gprint()\n", + "\n", + "T4 = m3.lt(lt_func) # instantiate transformation using function-type object\n", + "gprint(r'\\textbf{T4 = m3.lt(lt\\_func)}\\qquad\\text{where lt\\_func is defined by}\\\\\\qquad'\n", + " + r'\\text{lambda x: (e2+2*e3)*(re1" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_\\mbf{V}:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto - \\boldsymbol{\\mbf{e}}_{1} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto \\cos{\\left (\\theta \\right )} \\boldsymbol{\\mbf{e}}_{2} + \\sin{\\left (\\theta \\right )} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto - \\sin{\\left (\\theta \\right )} \\boldsymbol{\\mbf{e}}_{2} + \\cos{\\left (\\theta \\right )} \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} \\qquad\\left[\\lt{T}_\\mbf{V}\\right]= \\left[\\begin{array}{ccc}- \\frac{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} - \\frac{{\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} & 0 & 0\\\\0 & - \\frac{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} + \\frac{{\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} & - \\frac{2 \\sin{\\left (\\frac{\\theta }{2} \\right )} \\cos{\\left (\\frac{\\theta }{2} \\right )}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}}\\\\0 & \\frac{2 \\sin{\\left (\\frac{\\theta }{2} \\right )} \\cos{\\left (\\frac{\\theta }{2} \\right )}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} & - \\frac{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} + \\frac{{\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}}\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad\\lt{T}_\\mbf{V}(\\mbf{x})= - x^{1} \\boldsymbol{\\mbf{e}}_{1} + \\left ( x^{2} \\cos{\\left (\\theta \\right )} - x^{3} \\sin{\\left (\\theta \\right )}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( x^{2} \\sin{\\left (\\theta \\right )} + x^{3} \\cos{\\left (\\theta \\right )}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\mathscr{Q}(\\lt{T}_\\mbf{V}(\\mbf{x}))= {\\left ( x^{1} \\right )}^{2} - {\\left ( x^{2} \\right )}^{2} - {\\left ( x^{3} \\right )}^{2} \\qquad\\mathscr{Q}(\\mbf{x})= {\\left ( x^{1} \\right )}^{2} - {\\left ( x^{2} \\right )}^{2} - {\\left ( x^{3} \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\mathscr{Q}(\\lt{T}_\\mbf{V}(\\mbf{x})) = \\mathscr{Q}(\\mbf{x}):~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\det(\\lt{T}_\\mbf{V})= -1 $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "theta = symbols('theta', real=True)\n", + "v1 = e2\n", + "v2 = cos(theta/2)*e2 + sin(theta/2)*e3\n", + "v3 = e1\n", + "lt_versor = v3 * v2 * v1\n", + "T_V = m3.lt(lt_versor) # instantiate versor-based orthogonal transformation\n", + "\n", + "gprint(r'\\textbf{T\\_V = m3.lt(lt\\_versor)}, \\quad\\text{where lt\\_versor}=', lt_versor, ':')\n", + "gprint(r'\\qquad\\lt{T}_\\mbf{V}:~', T_V,\n", + " r'\\qquad\\left[\\lt{T}_\\mbf{V}\\right]=', T_V.matrix(),\n", + " r'\\\\\\qquad\\lt{T}_\\mbf{V}(\\mbf{x})=', mv_simplify(T_V(x), fu))\n", + "gprint(r'\\qquad\\mathscr{Q}(\\lt{T}_\\mbf{V}(\\mbf{x}))=', qform(T_V(x)),\n", + " r'\\qquad\\mathscr{Q}(\\mbf{x})=', qform(x))\n", + "gprint(r'\\qquad\\mathscr{Q}(\\lt{T}_\\mbf{V}(\\mbf{x})) = \\mathscr{Q}(\\mbf{x}):~',\n", + " fu(qform(T_V(x))) == fu(qform(x)))\n", + "gprint(r'\\qquad\\det(\\lt{T}_\\mbf{V})=', trigsimp(T_V.det()))" + ] + }, + { + "cell_type": "markdown", + "id": "086ee861", + "metadata": {}, + "source": [ + "The output's penultimate line confirms that $\\lt{T}_\\mbf{V}$ is orthogonal, for a tranformation is orthogonal if and only if it preserves the quadratic form $\\mbf{x} \\mapsto \\mathscr{Q}(\\mbf{x}) = \\mbf{x}^2$. That $\\det(\\lt{T}_\\mbf{V}) = -1$ is a consequence of the transformation being a composition of three orientation-reversing reflections.\n", + "\n", + "The compositional inverse method `.inv()` is only implemented in GAlgebra for versor-based transformations. The next In[ ] cell computes the compositional inverse of the transformation `T_V` found in the previous cell. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "75a0ce52", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\textbf{T\\_Vinv = T\\_V.inv()}:$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad{\\lt{T}\\_\\mbf{V}}^{-1}:~ \\left\\{ \\begin{aligned} \\boldsymbol{\\mbf{e}}_{1} &\\mapsto - \\boldsymbol{\\mbf{e}}_{1} \\\\ \\boldsymbol{\\mbf{e}}_{2} &\\mapsto \\cos{\\left (\\theta \\right )} \\boldsymbol{\\mbf{e}}_{2} - \\sin{\\left (\\theta \\right )} \\boldsymbol{\\mbf{e}}_{3} \\\\ \\boldsymbol{\\mbf{e}}_{3} &\\mapsto \\sin{\\left (\\theta \\right )} \\boldsymbol{\\mbf{e}}_{2} + \\cos{\\left (\\theta \\right )} \\boldsymbol{\\mbf{e}}_{3} \\end{aligned} \\right\\} \\qquad\\left[{\\lt{T}_\\mbf{V}}^{-1}\\right]= \\left[\\begin{array}{ccc}-1 & 0 & 0\\\\0 & - \\frac{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} + \\frac{{\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} & \\frac{2 \\sin{\\left (\\frac{\\theta }{2} \\right )} \\cos{\\left (\\frac{\\theta }{2} \\right )}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}}\\\\0 & - \\frac{2 \\sin{\\left (\\frac{\\theta }{2} \\right )} \\cos{\\left (\\frac{\\theta }{2} \\right )}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} & - \\frac{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}} + \\frac{{\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}}{{\\sin{\\left (\\frac{\\theta }{2} \\right )}}^{2} + {\\cos{\\left (\\frac{\\theta }{2} \\right )}}^{2}}\\end{array}\\right] \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\begin{equation*} \\qquad{\\lt{T}_\\mbf{V}}^{-1}(\\mbf{x})= - x^{1} \\boldsymbol{\\mbf{e}}_{1} + \\left ( x^{2} \\cos{\\left (\\theta \\right )} + x^{3} \\sin{\\left (\\theta \\right )}\\right ) \\boldsymbol{\\mbf{e}}_{2} + \\left ( - x^{2} \\sin{\\left (\\theta \\right )} + x^{3} \\cos{\\left (\\theta \\right )}\\right ) \\boldsymbol{\\mbf{e}}_{3} \\end{equation*}$" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\mathscr{Q}({\\lt{T}_\\mbf{V}}^{-1}(\\mbf{x}))= {\\left ( x^{1} \\right )}^{2} - {\\left ( x^{2} \\right )}^{2} - {\\left ( x^{3} \\right )}^{2} \\qquad\\mathscr{Q}(\\mbf{x})= {\\left ( x^{1} \\right )}^{2} - {\\left ( x^{2} \\right )}^{2} - {\\left ( x^{3} \\right )}^{2} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\mathscr{Q}({\\lt{T}_\\mbf{V}}^{-1}(\\mbf{x})) = \\mathscr{Q}(\\mbf{x}):~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\det({\\lt{T}_\\mbf{V}}^{-1})= - \\frac{\\left(1 - \\cos{\\left (\\theta \\right )}\\right)^{2}}{2} - \\cos{\\left (\\theta \\right )} + \\frac{\\cos{\\left (2 \\theta \\right )}}{4} - \\frac{1}{4} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\left(\\lt{T}_\\mbf{V}{\\lt{T}_\\mbf{V}}^{-1}\\right)(\\mbf{{x}})= x^{1} \\boldsymbol{\\mbf{e}}_{1} + x^{2} \\boldsymbol{\\mbf{e}}_{2} + x^{3} \\boldsymbol{\\mbf{e}}_{3} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\qquad\\left(\\lt{T}_\\mbf{V}{\\lt{T}_\\mbf{V}}^{-1}\\right)(\\mbf{{x}})==\\mbf{x}:~ \\text{True} $" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "T_Vinv = T_V.inv()\n", + " # compositional inverse of versor-based transformation\n", + "gprint(r'\\textbf{T\\_Vinv = T\\_V.inv()}:')\n", + "gprint(r'\\qquad{\\lt{T}\\_\\mbf{V}}^{-1}:~', T_Vinv,\n", + " r'\\qquad\\left[{\\lt{T}_\\mbf{V}}^{-1}\\right]=', T_Vinv.matrix(),\n", + " r'\\\\\\qquad{\\lt{T}_\\mbf{V}}^{-1}(\\mbf{x})=', mv_simplify(T_Vinv(x), fu))\n", + "gprint(r'\\qquad\\mathscr{Q}({\\lt{T}_\\mbf{V}}^{-1}(\\mbf{x}))=', fu(qform(T_Vinv(x))),\n", + " r'\\qquad\\mathscr{Q}(\\mbf{x})=', fu(qform(x)))\n", + "gprint(r'\\qquad\\mathscr{Q}({\\lt{T}_\\mbf{V}}^{-1}(\\mbf{x})) = \\mathscr{Q}(\\mbf{x}):~',\n", + " fu(qform(T_Vinv(x))) == fu(qform(x)))\n", + "gprint(r'\\qquad\\det({\\lt{T}_\\mbf{V}}^{-1})=', trigsimp(T_Vinv.det()))\n", + "gprint(r'\\qquad\\left(\\lt{T}_\\mbf{V}{\\lt{T}_\\mbf{V}}^{-1}\\right)(\\mbf{{x}})=',\n", + " (T_V*T_Vinv)(x))\n", + "gprint(r'\\qquad\\left(\\lt{T}_\\mbf{V}{\\lt{T}_\\mbf{V}}^{-1}\\right)(\\mbf{{x}})==\\mbf{x}:~',\n", + " (T_V*T_Vinv)(x) == x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8594bcc5-e9a6-4de3-807f-7c3d9acc9c36", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/galgebra/mv.py b/galgebra/mv.py index 55b7e948..2804140f 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -2050,7 +2050,7 @@ def qform(A: Mv) -> Expr: """ if not isinstance(A, Mv): raise TypeError('A not a multivector in qform(A)') - A.qform() + return A.qform() # ## GSG code ends ### From 2c30ae1c35e6105c1672b04ab893dff6e0f3deba Mon Sep 17 00:00:00 2001 From: utensil Date: Sun, 7 Apr 2024 20:56:54 +0800 Subject: [PATCH 28/78] Escaping underscore makes local `jupyter lab` happy but not Sphinx and nbviewer --- examples/ipython/lt.ipynb | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/ipython/lt.ipynb b/examples/ipython/lt.ipynb index cedad1b5..e6d3b5b5 100644 --- a/examples/ipython/lt.ipynb +++ b/examples/ipython/lt.ipynb @@ -844,7 +844,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{internal dictionary}:~~\\text{G.lt\\_dict}= \\left\\{ \\boldsymbol{\\mbf{e}}_{1} : {G^{1}}_{1} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{1} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{1} \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{2} : {G^{1}}_{2} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{2} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{2} \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{3} : {G^{1}}_{3} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{3} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{3} \\boldsymbol{\\mbf{e}}_{3}\\right\\} $" + "$\\displaystyle \\text{internal dictionary}:~~\\text{G.lt_dict}= \\left\\{ \\boldsymbol{\\mbf{e}}_{1} : {G^{1}}_{1} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{1} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{1} \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{2} : {G^{1}}_{2} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{2} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{2} \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{3} : {G^{1}}_{3} \\boldsymbol{\\mbf{e}}_{1} + {G^{2}}_{3} \\boldsymbol{\\mbf{e}}_{2} + {G^{3}}_{3} \\boldsymbol{\\mbf{e}}_{3}\\right\\} $" ], "text/plain": [ "" @@ -929,7 +929,7 @@ "source": [ "gprint(r'\\text{basis vectors}:~~\\text{m3.mv()}=', m3.mv())\n", "gprint(r'\\text{basis symbols}:~~\\text{m3.basis}=', m3.basis)\n", - "gprint(r'\\text{internal dictionary}:~~\\text{G.lt\\_dict}=', G.lt_dict)\n", + "gprint(r'\\text{internal dictionary}:~~\\text{G.lt_dict}=', G.lt_dict)\n", "for base in m3.basis:\n", " gprint(base, r'\\text{ from m3.basis belongs to }', type(base))\n", " gprint(G.lt_dict[base], r'\\text{ belongs to }',\n", @@ -1319,7 +1319,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\textbf{T1 = m3.lt(lt\\_list)}, \\quad\\text{where lt\\_list}= \\left[ \\left[ 0, \\ -1, \\ 2\\right], \\ \\left[ 5, \\ 2, \\ 3\\right], \\ \\left[ 2, \\ 0, \\ 0\\right]\\right] :$" + "$\\displaystyle \\textbf{T1 = m3.lt(lt_list)}, \\quad\\text{where lt_list}= \\left[ \\left[ 0, \\ -1, \\ 2\\right], \\ \\left[ 5, \\ 2, \\ 3\\right], \\ \\left[ 2, \\ 0, \\ 0\\right]\\right] :$" ], "text/plain": [ "" @@ -1367,7 +1367,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\textbf{T2 = m3.lt(lt\\_matrix)}, \\quad\\text{where lt\\_matrix}= \\left[\\begin{array}{ccc}0 & 5 & 2\\\\-1 & 2 & 0\\\\2 & 3 & 0\\end{array}\\right] :$" + "$\\displaystyle \\textbf{T2 = m3.lt(lt_matrix)}, \\quad\\text{where lt_matrix}= \\left[\\begin{array}{ccc}0 & 5 & 2\\\\-1 & 2 & 0\\\\2 & 3 & 0\\end{array}\\right] :$" ], "text/plain": [ "" @@ -1415,7 +1415,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\textbf{T3 = m3.lt(lt\\_dict)}, \\quad\\text{where lt\\_dict}= \\left\\{ \\boldsymbol{\\mbf{e}}_{1} : - \\boldsymbol{\\mbf{e}}_{2} + 2 \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{2} : 5 \\boldsymbol{\\mbf{e}}_{1} + 2 \\boldsymbol{\\mbf{e}}_{2} + 3 \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{3} : 2 \\boldsymbol{\\mbf{e}}_{1}\\right\\} :$" + "$\\displaystyle \\textbf{T3 = m3.lt(lt_dict)}, \\quad\\text{where lt_dict}= \\left\\{ \\boldsymbol{\\mbf{e}}_{1} : - \\boldsymbol{\\mbf{e}}_{2} + 2 \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{2} : 5 \\boldsymbol{\\mbf{e}}_{1} + 2 \\boldsymbol{\\mbf{e}}_{2} + 3 \\boldsymbol{\\mbf{e}}_{3}, \\ \\boldsymbol{\\mbf{e}}_{3} : 2 \\boldsymbol{\\mbf{e}}_{1}\\right\\} :$" ], "text/plain": [ "" @@ -1463,7 +1463,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\textbf{T4 = m3.lt(lt\\_func)}\\qquad\\text{where lt\\_func is defined by}\\\\\\qquad\\text{lambda x: (e2+2*e3)*(re1" @@ -1499,28 +1499,28 @@ ], "source": [ "T1 = m3.lt(lt_list) # instantiate transformation using list-type object\n", - "gprint(r'\\textbf{T1 = m3.lt(lt\\_list)}, \\quad\\text{where lt\\_list}=', lt_list, ':')\n", + "gprint(r'\\textbf{T1 = m3.lt(lt_list)}, \\quad\\text{where lt_list}=', lt_list, ':')\n", "gprint(r'\\qquad\\lt{T}_1:~', T1,\n", " r'\\qquad\\left[ \\lt{T}_1 \\right]=', T1.matrix(),\n", " r'\\\\\\qquad\\lt{T}_1(\\mbf{x})=', T1(x))\n", "gprint()\n", "\n", "T2 = m3.lt(lt_matrix) # instantiate transformation using Matrix-type object\n", - "gprint(r'\\textbf{T2 = m3.lt(lt\\_matrix)}, \\quad\\text{where lt\\_matrix}=', lt_matrix, ':')\n", + "gprint(r'\\textbf{T2 = m3.lt(lt_matrix)}, \\quad\\text{where lt_matrix}=', lt_matrix, ':')\n", "gprint(r'\\qquad\\lt{T}_2:~', T2,\n", " r'\\qquad\\left[ \\lt{T}_2 \\right]=', T2.matrix(),\n", " r'\\\\\\qquad\\lt{T}_2(\\mbf{x})=', T2(x))\n", "gprint()\n", "\n", "T3 = m3.lt(lt_dict) # instantiate transformation using dict-type object\n", - "gprint(r'\\textbf{T3 = m3.lt(lt\\_dict)}, \\quad\\text{where lt\\_dict}=', lt_dict, ':')\n", + "gprint(r'\\textbf{T3 = m3.lt(lt_dict)}, \\quad\\text{where lt_dict}=', lt_dict, ':')\n", "gprint(r'\\qquad\\lt{T}_3:~', T3,\n", " r'\\qquad\\left[ \\lt{T}_3 \\right]=', T3.matrix(),\n", " r'\\\\\\qquad\\lt{T}_3(\\mbf{x})=', T3(x))\n", "gprint()\n", "\n", "T4 = m3.lt(lt_func) # instantiate transformation using function-type object\n", - "gprint(r'\\textbf{T4 = m3.lt(lt\\_func)}\\qquad\\text{where lt\\_func is defined by}\\\\\\qquad'\n", + "gprint(r'\\textbf{T4 = m3.lt(lt_func)}\\qquad\\text{where lt_func is defined by}\\\\\\qquad'\n", " + r'\\text{lambda x: (e2+2*e3)*(re1 Date: Sun, 7 Apr 2024 21:43:06 +0800 Subject: [PATCH 30/78] Cover `undual` and `norm2` functions with tests --- examples/ipython/test_gsg_undual_etc.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/ipython/test_gsg_undual_etc.ipynb b/examples/ipython/test_gsg_undual_etc.ipynb index a627904b..6223303a 100644 --- a/examples/ipython/test_gsg_undual_etc.ipynb +++ b/examples/ipython/test_gsg_undual_etc.ipynb @@ -349,7 +349,7 @@ "gprint(r'\\mathbf{A}^{\\star} =', A.dual().Fmt(2))\n", "gprint(r'\\mathbf{A}^{-\\star} =', A.undual().Fmt(2))\n", "gprint(r'\\mathbf{A}^{-\\star} = -\\mathbf{A}^{\\star}:~~',\n", - " A.undual() == - A.dual(), \n", + " undual(A) == - A.dual(), \n", " r'\\qquad \\text {(Note: }\\mathbf{I}^2 =', I**2, ')')\n", "\n", "# Check whether method `dual` and method `undual` have inverse actions:\n", @@ -1280,7 +1280,7 @@ " gprint(r'\\left<' +M_str[M]+r'\\right>_'+str(g)+r' =',\n", " M.grade(g), r'\\in ', ga_str[M.grade(g).Ga]) \n", " gprint(r'\\qquad \\implies \\Vert\\left<'+M_str[M]+r'\\right>_'\n", - " +str(g)+r'\\Vert^2 =', M.grade(g).norm2())\n", + " +str(g)+r'\\Vert^2 =', norm2(M.grade(g)))\n", " gprint(r'\\qquad \\implies \\vert\\left<'+M_str[M]+r'\\right>_'\n", " +str(g)+r'\\vert =', M.grade(g).norm('0'),\n", " r\"\\quad \\text{ when hint is '0'}\")\n", From 4a6bd16db20af2b154d31d98c04463abbe3cc2d7 Mon Sep 17 00:00:00 2001 From: utensil Date: Mon, 8 Apr 2024 17:52:41 +0800 Subject: [PATCH 31/78] Fix contraction in README --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f5b56d7b..05d1f9f3 100644 --- a/README.md +++ b/README.md @@ -54,8 +54,8 @@ Overloaded Python operators for basic GA operations: AB &= \texttt{A*B} \\ A \wedge B &= \mathtt{A \verb!^! B} \\ A \cdot B &= \texttt{A|B} \\ - A \rfloor B &= \texttt{AB} \\ + A \rfloor B &= \mathtt{A \lt B} \\ + A \lfloor B &= \mathtt{A \gt B} \\ A/B &= \texttt{A/B} \\ \end{aligned}\end{split} ``` @@ -77,10 +77,10 @@ The various derivatives of a multivector function is accomplished by multiplying F {\wedge}\bar{\nabla} &= \mathtt{F \verb!^! rgrad} \\ \nabla \cdot F &= \texttt{grad|F} \\ F \cdot \bar{\nabla} &= \texttt{F|rgrad} \\ - \nabla \rfloor F &= \texttt{gradF} \\ - F \lfloor \bar{\nabla} &= \texttt{F>rgrad} + \nabla \rfloor F &= \mathtt{grad \lt F} \\ + F \rfloor \bar{\nabla} &= \mathtt{F \lt rgrad} \\ + \nabla \lfloor F &= \mathtt{grad \gt F} \\ + F \lfloor \bar{\nabla} &= \mathtt{F \gt rgrad} \end{aligned} ``` @@ -92,10 +92,10 @@ The various derivatives of a multivector function is accomplished by multiplying \bar{\nabla} {\wedge}F &= \mathtt{rgrad \verb!^! F} \\ F \cdot \nabla &= \texttt{F|grad} \\ \bar{\nabla}\cdot F &= \texttt{rgrad|F} \\ - F \rfloor \nabla &= \texttt{Fgrad} \\ - \bar{\nabla} \lfloor F &= \texttt{rgrad>F} + F \rfloor \nabla &= \mathtt{F \lt grad} \\ + \bar{\nabla} \rfloor F &= \mathtt{rgrad \lt F} \\ + F \lfloor \nabla &= \mathtt{F \gt grad} \\ + \bar{\nabla} \lfloor F &= \mathtt{rgrad \gt F} \end{aligned} ``` From 6207e11c1c4672911a5bd816d9c2d2de795e62ca Mon Sep 17 00:00:00 2001 From: utensil Date: Mon, 8 Apr 2024 17:53:06 +0800 Subject: [PATCH 32/78] Addthe gprint tutorial to TOC --- doc/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/index.rst b/doc/index.rst index 7b1043c6..3734c494 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -23,6 +23,7 @@ :hidden: tutorials/algebra + tutorials/gprint .. toctree:: :caption: API From 451f9bf3db1d8dd5d4cf41916563c464ee3c5e6b Mon Sep 17 00:00:00 2001 From: utensil Date: Mon, 8 Apr 2024 17:55:20 +0800 Subject: [PATCH 33/78] Improve test coverage for mv and fix found bugs --- galgebra/mv.py | 4 +- test/test_mv.py | 116 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 115 insertions(+), 5 deletions(-) diff --git a/galgebra/mv.py b/galgebra/mv.py index 2804140f..02397d12 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -2007,7 +2007,7 @@ def g_invol(A: Mv) -> Mv: - Grade involution is its own inverse operation. """ if not isinstance(A, Mv): - return ValueError('A not a multivector in g_invol(A)') + raise ValueError('A not a multivector in g_invol(A)') return A.g_invol() # ## GSG code ends ### @@ -2187,7 +2187,7 @@ def ccon(A: Mv) -> Mv: def scalar(A: Mv) -> Expr: """ Equivalent to :meth:`Mv.scalar` """ if not isinstance(A, Mv): - raise ValueError('A = ' + str(A) + ' not a multivector in inv(A).') + raise ValueError('A = ' + str(A) + ' not a multivector in scalar(A).') return A.scalar() diff --git a/test/test_mv.py b/test/test_mv.py index 002dad49..4dbd3cee 100644 --- a/test/test_mv.py +++ b/test/test_mv.py @@ -2,7 +2,10 @@ import pytest import sympy +from sympy import symbols from galgebra.ga import Ga +from galgebra.mv import proj, undual, g_invol, exp, norm, norm2, mag, mag2, ccon, rev, scalar, qform, sp + class TestMv: @@ -52,14 +55,13 @@ def test_get_coefs(self): with pytest.raises(ValueError): (e_1 ^ e_2).get_coefs(3) - def test_blade_coefs(self): """ Various tests on several multivectors. """ _g3d, e_1, e_2, e_3 = Ga.build('e*1|2|3') - m0 = 2 * e_1 + e_2 - e_3 + 3 * (e_1 ^ e_3) + (e_1 ^ e_3) + (e_2 ^ (3 * e_3)) + m0 = 2 * e_1 + e_2 - e_3 + 3 * (e_1 ^ e_3) + (e_1 ^ e_3) + (e_2 ^ (3 * e_3)) assert m0.blade_coefs([e_1]) == [2] assert m0.blade_coefs([e_2]) == [1] assert m0.blade_coefs([e_1, e_2]) == [2, 1] @@ -93,7 +95,7 @@ def test_rep_switching(self): # this ga has a non-diagonal metric _g3d, e_1, e_2, e_3 = Ga.build('e*1|2|3') - m0 = 2 * e_1 + e_2 - e_3 + 3 * (e_1 ^ e_3) + (e_1 ^ e_3) + (e_2 ^ (3 * e_3)) + m0 = 2 * e_1 + e_2 - e_3 + 3 * (e_1 ^ e_3) + (e_1 ^ e_3) + (e_2 ^ (3 * e_3)) m1 = (-4*(e_1 | e_3)-3*(e_2 | e_3))+2*e_1+e_2-e_3+4*e_1*e_3+3*e_2*e_3 # m1 was chosen to make this true assert m0 == m1 @@ -148,6 +150,8 @@ def check(x, expected_grades): ga.mv('A', 'grade', not_an_argument=True) # invalid kwarg with pytest.raises(TypeError): ga.mv([1, 2, 3], 'vector', f=True) # can't pass f with coefficients + with pytest.raises(TypeError): + ga.mv(e_1, 'even') # Must be a string def test_abs(self): ga, e_1, e_2, e_3 = Ga.build('e*1|2|3', g=[1, 1, 1]) @@ -214,3 +218,109 @@ def test_contraction(self, make_one): assert (e12 > one) == e12 assert (e12 < one) == 0 assert (one > e12) == 0 + + def test_proj(self): + g3coords = symbols('x y z', real=True) + V = Ga('e', g=[1, 1, 1], coords=g3coords) + + u = V.mv("u", "vector") + v = V.mv("v", "vector") + w = V.mv("w", "vector") + B = V.mv("B", "mv") + + assert proj(u, v) == v.project_in_blade(u) + assert proj(w, v) + proj(w, u) == proj(w, u + v) + assert proj(u, v) == (v | u) / u + + Vr = u ^ v + assert proj(Vr, B) == ((B < Vr) * Vr.inv()) + assert proj(Vr, B) == ((B < Vr) < Vr.inv()) + + def test_norm2(self): + g3coords = symbols('x y z', real=True) + g3 = Ga('e', g=[1, 1, 1], coords=g3coords) + A = g3.mv('A', 'mv') + + assert A.norm2() == A.rev().sp(A) + assert A.norm2('+') == A.rev().sp(A) + assert A.norm2('-') == A.rev().sp(A) + + assert norm2(A) == norm(A) * norm(A) + assert norm2(A, '+') == norm(A) * norm(A) + assert norm2(A, '-') == norm(A) * norm(A) + + def test_mag2(self): + g3coords = symbols('x y z', real=True) + g3 = Ga('e', g=[1, 1, 1], coords=g3coords) + A = g3.mv('A', 'mv') + + assert mag2(A) == mag(A) * mag(A) + + def test_undual(self): + # A not a multivector in undual(A). + with pytest.raises(ValueError): + undual(1) + + def test_g_invol(self): + g3coords = symbols('x y z', real=True) + g3 = Ga('e', g=[1, 1, 1], coords=g3coords) + A = g3.mv('A', 'mv') + + assert g_invol(A.even()) == A.even() + assert g_invol(A.odd()) == -A.odd() + + with pytest.raises(ValueError): + g_invol(1) + + def test_exp(self): + g3coords = (x, y, z) = symbols('x y z', real=True) + g3 = Ga('e', g=[1, 1, 1], coords=g3coords) + + u = g3.mv("u", "vector") + v = g3.mv("v", "vector") + + assert exp(u ^ v) == exp(-v ^ u) + assert exp(x + y + z) == exp(z + y + x) + + def test_ccon(self): + g3coords = symbols('x y z', real=True) + g3 = Ga('e', g=[1, 1, 1], coords=g3coords) + + A = g3.mv('A', 'mv') + + assert ccon(ccon(A)) == A + assert ccon(A) == g_invol(rev(A)) + assert ccon(A) == rev(g_invol(A)) + + # not a multivector in ccon(A) + with pytest.raises(ValueError): + ccon(1) + + def test_scalar(self): + g3coords = symbols('x y z', real=True) + g3 = Ga('e', g=[1, 1, 1], coords=g3coords) + + A = g3.mv('A', 'mv') + u = g3.mv("u", "vector") + + assert scalar(A) == A.scalar() + assert scalar(u) == 0 + assert scalar(u * u) == qform(u) + + # not a multivector in scalar(A) + with pytest.raises(ValueError): + scalar(1) + + def test_sp(self): + g3coords = symbols('x y z', real=True) + g3 = Ga('e', g=[1, 1, 1], coords=g3coords) + + A = g3.mv('A', 'mv') + B = g3.mv('B', 'mv') + + assert sp(A, B) == A.sp(B) + assert sp(A, B) == (A*B).scalar() + + # not a multivector in sp(A, B) + with pytest.raises(ValueError): + sp(1, 1) From da8693cc257650cfe87dc8ea3894b9643c2ac5f2 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 9 Apr 2024 14:58:26 +0800 Subject: [PATCH 34/78] Make gxpdf more testable and setup PDF diff tests --- .github/workflows/ci.yml | 19 +++++++++ .gitignore | 3 ++ galgebra/gprinter.py | 30 +++++++------ test/fixtures/test_gprinter.pdf | Bin 0 -> 10063 bytes test/test_gprinter.py | 73 ++++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 12 deletions(-) create mode 100644 test/fixtures/test_gprinter.pdf create mode 100644 test/test_gprinter.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b34bfaa4..f5d0276f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,6 +41,25 @@ jobs: - name: Lint run: | flake8 -v + - name: Install apt deps with cache + uses: awalsh128/cache-apt-pkgs-action@latest + if: "matrix.python-version == '3.11'" + with: + packages: diff-pdf + version: 1.0 + - uses: actions/cache@v3 + name: Tectonic Cache + if: "matrix.python-version == '3.11'" + with: + path: ~/.cache/Tectonic + key: ${{ runner.os }}-tectonic-${{ hashFiles('**/*.tex') }} + restore-keys: | + ${{ runner.os }}-tectonic- + - uses: wtfjoke/setup-tectonic@v2 + if: "matrix.python-version == '3.11'" + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + biber-version: "latest" - name: Test run: | PYTEST_ARGS=(); diff --git a/.gitignore b/.gitignore index 9b724e36..172a254a 100644 --- a/.gitignore +++ b/.gitignore @@ -139,3 +139,6 @@ examples/**/*.tex # Mac .DS_Store + +test/generated +test/diff diff --git a/galgebra/gprinter.py b/galgebra/gprinter.py index 6c76477d..b65a9bcf 100644 --- a/galgebra/gprinter.py +++ b/galgebra/gprinter.py @@ -26,7 +26,7 @@ class LaTeX: latex_preamble = """ \\pagestyle{empty} -\\usepackage[latin1]{inputenc} +\\usepackage[utf8]{inputenc} \\usepackage{amsmath} \\usepackage{amsfonts} \\usepackage{amssymb} @@ -196,7 +196,7 @@ def gprint(*xargs): return -def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debug=False, pt='10pt', pdfprog='pdflatex'): +def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debug=False, pt='10pt', pdfprog='pdflatex', evince=True, rm=True, null=True): """ Post processes LaTeX output (see comments below), adds preamble and @@ -208,10 +208,11 @@ def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debu crop True Use "pdfcrop" to crop output file (pdfcrop must be installed, linux only) png True Use "convert" to produce png output (imagemagick must be installed, linux only) - We assume that if xpdf() is called then Format() has been called at the beginning of the program. + We assume that if gxpdf() is called then gFormat() has been called at the beginning of the program. """ latex_str = paper_format(paper, pt)+LaTeX.latex_preamble+LaTeX.latex_str+r'\end{document}' + if filename is None: pyfilename = sys.argv[0] @@ -221,13 +222,13 @@ def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debu else: tex_filename = filename pdf_filename = tex_filename.replace('.tex', '.pdf') + rootfilename = tex_filename.replace('.tex', '') if debug: print('latex file =', filename) - latex_file = open(tex_filename, 'w') - latex_file.write(latex_str) - latex_file.close() + with open(tex_filename, 'w') as latex_file: + latex_file.write(latex_str) if pdfprog is not None: sys_cmd = SYS_CMD[sys.platform] @@ -237,17 +238,22 @@ def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debu print('pdflatex path =', pdflatex) # os.system(pdfprog + ' ' + filename[:-4]) else: # Works for Linux don't know about Windows - subprocess.call([pdfprog, tex_filename, sys_cmd['null']]) + if null: + subprocess.call([pdfprog, tex_filename, sys_cmd['null']]) + else: + subprocess.call([pdfprog, tex_filename]) # os.system(pdfprog + ' ' + filename[:-4] + sys_cmd['null']) - subprocess.call([sys_cmd['evince'], pdf_filename]) + if evince: + subprocess.call([sys_cmd['evince'], pdf_filename]) # eval(input('!!!!Return to continue!!!!\n')) - if debug: - subprocess.call([sys_cmd['rm'], rootfilename+'.aux ', rootfilename+'.log']) - else: - subprocess.call([sys_cmd['rm'], rootfilename+'.aux ', rootfilename+'.log ', rootfilename+'.tex']) + if rm: + if debug: + subprocess.call([sys_cmd['rm'], rootfilename+'.aux ', rootfilename+'.log']) + else: + subprocess.call([sys_cmd['rm'], rootfilename+'.aux ', rootfilename+'.log ', rootfilename+'.tex']) if crop: subprocess.call(['pdfcrop', pdf_filename]) subprocess.call(['rm', pdf_filename]) diff --git a/test/fixtures/test_gprinter.pdf b/test/fixtures/test_gprinter.pdf new file mode 100644 index 0000000000000000000000000000000000000000..203f96ae1018c12178b366108a3ce855367bac81 GIT binary patch literal 10063 zcmbW7Wl){lvaWHRxJ!@(g1gL#hZ)?0ySoN=x8M?7Ccz=N1^3_(+?lw$LvZd|_nxY~ z*V*gryX*YGJk?qJS@FPmz2LV4Hpe zuC0%>s;KetUf%~{BYuX)1&LwpzztOmNb^?LWpT^PVE&NCr;S{#9~d9AIeWjsZy5g4 z8_!_MU48$~r|t5L_4%gMUvJezBrC*%&E)(YE-h*zTW$}WDYGcdq-xLhbZh?f*6+mm z%HCYucf{t56qc2I2Rz(U^hHfm<(m#thUrmB&EG%FBsqNjnu_W#?`>Ak3m+>jyN@(H zJ{pf!5WYPdkmjI;bW+F}ogO$?8=8Cmk;yYKFXKm*Y1EHt!ZrYhvW(hNF-y=$ToX^1 z78zAP_#qn>QV;WRC4nAykS zNuPWT6})>agM>33yw`Z^Qw$&>aE-&Jj5w>KBx)y}_kyPn*)e?V$q@lO46yHWd^GC! znm7u_i%iGlQ}TAlE7pbOw^9?b#v~1zin5F~y zu83Kb`@{}0GSSBQu#%4$D}g7S6&`a69(7!TNs%^8Tko0H8jmrb6Ie@H68Yb~_fyPdQu1Gn(|0+LieLXQOo%=s{rzzMq1y+>k8NR5NJY)pSY%wX(5Yd_Sy8mV*QWP zpUJ_&{hwqBClB{OXNjKTh;p+4<|V|DakBpME#R4Is~v~nNAvyZ>0^MTr}*mP{)T-xe!?(K-*^ax)_&1vKab{br#fX%MBSv6L?nD5R}^%$SB#M8WZ zf;~WTQTrPSdH*4yimS1Ur-K=r>K`ADkN<`{AkM!iN*iZqsbhvekPTg4^=|C9H28_T zk|Cg>r6Zd%JD0AEW|P}g6JD-(n~-caTF=1MykfUhuBMsRK*I-|9A!0`T8OdxY^xV6 zuQS}IL3|X3A%cpDfQa!uv6M3Ds<$`@csp|Dfcfft_a^pSa04{vwm$oe9DCEbuyrI{ zJFoJsZFztb>e=qnksvI&?-qOdJ?Dl{d*F;J#LzXpQ$)}FBAqi+UNgf6W!!P<4!VBP zwtefN?LG4q)y{(+KbZ_UbGu#ttb?$5cI#sJu_uyOkT`s>;{$g=2)t6Ar^=}ca#-?y z$npY7q=Y2@?Quk(@#zPTnF{NVdh#qzwjk03ET;TO-b#cWeIDFo1N0CA&*`OhEw7pL zK~2?3(`-`JA1Ku1Yw|wZC`xjpdcE>(1*xj)*sZXaUwMG|826d#G+ z`H|vRZ-r&g>7DC5&X-$DSX*G79Aj4+cd{cREer5b1_+1C?gh-&eDQ*ctObciA%(>l zO!?O=fi)(KEY7AfFUTB;;pwJ_=jRcKWeaC|E#IOtN@W<_(Ku5QrgjF<+63oD;IWr{ zDtMQkggH-Rz5jM~K{Go-@7q|AGp6v}c{@p)Z2HGF`ixkx@D(~U%QKp%b1IIum~l1N zCUGxyrF4U`)%3o;)gpL&D$DJ-mur!!r6b-^e_S^}hiZj4NqbNxs(MRJ{Y*!7uL?LN{#b67BN_GetRVNr${S-Y@W*T<`cuY0G) zZ#u4e!JmwJ{Z4Rwj)MeL*2tfaV|@H8iD>5L=DJE3>-@P*1R5%zgfa!trz@q|UDrrO z{O+zrxoWvW$Hw)pe7uwlI{5wT6q|g=9MB6Ed4*^eH?AyWZrDx|V5-=0k$~@yRB}zj2 z#MhW5i5(Im3rJ9gR#y8m$A85a9H!kHa)Figp=YNLny$r3!g^!!4`^@$c3W+vA+~4G z76YO%=Q0TlPX(BSL?T^?-o`oWbpV#ptrenn$$OA)sj$LBCPybI-|2(2l324#U2lC? zAA4*{397V$6|CnpK0@-{@7r3AFJE8TWiO9M?UfIs1_m%F;aP#YUQfD`$FdX9bWuJr zhfe`(<$thD;s3EL?!Q=;IpYHQ8~ynHq2GVZG9J)hSSB8;C#7OU-oNH^ zv@1S=jHvfK?$d6GSC~mDh$SdOArmbDW~ldk;P>|Rb=5a;Pt;`AhL>BB**(j=?hz9K z-;f56IX}RfU{G({n|)n75%;U0zqEw?a;4TQRbuAB%@WD-S;_WR0$I{HH!z2}39cTj z;_a=|KEWJ$^7Eh?A06=tr+Y6oSb2es=qF1q9Vv?RW%xQjPSQ^IR!mG}UeogiwL3Sj zLv4e;BG^fBKjllof?bILh%9FCr?|f+uA6YH`+m$9%vG;$>5kJR)10Mm^!XL$tM=>ezs4r#f7H-( zg4q9(+e$+A!R**8_XNPAQpV_r1Wc5OfOuldvIKg)7+=K#V`g~x*N&GQ68;50cfa30 zzsYyil!lA~&p&=@>qcx5MT@!mVI4bREHX%yM}^dJ{1tjXsEWPIqhfC>hEi6=*}C@a zs-^PnrBiFlBr1a2H>VYRxRtF^%LdQxnuHYuX;$lKidBH}Q>(yzWW&~)9NBIkyR=V) zaxi+FNw7&6Di7(0_WW{B=4fmx=}4MO4ds? z8?J9xOC%N+Q+XQ>8P3TMkTUZ)UR-% zm!{B;LXkZ>OBrmrl41Lb$eJvg zG&oPnpp;`Kd@!{t=UdKY$(tD_RU9*g+$=(>W-*;jj(-NJS1YSeM@5MY^rmf)stxa6u4#Q+uC9?THWOcpcKYRL`b=NpnS8RFM_XLjOI-gJM^TqkIi=xTP=TzKsVAdn7W2<)=>XJz$2dJc)jn; zxBEjQif@jQB7M00_zQz*-0Q{^xtm`C4`F z0gXG@vHr{?g9N&vmaT1)=L5y9(2W=L3ndoKokVwkN)Xom7Bnn8I#79jqrW12VaS(6 zI`AF^9v-zktx4GLW_Tj$JJu*pM2Q2N6_w0;lWurv!8bibi9gP7EK2SqvxkohPr0Bl zTE~We%=2O0=*p0=X@{jw;wBZJ6VI2j)vB|fMEj?wIy8C;6jGzI$?X8-_KA~I$1owP z%iC&Oro;CTTQu*Ue8`#I;7`s2+t-)GOh3p+PGYBkU&9Jfrw*Pc`g7>i=dgQc_ireM zd;6yRuL&XA*}ny)O*kpC0=D6@3Mh9_uWHYUiS7{;1p&ToZt}cZTaF^Vx!Fr%%zbde$<{Pe>V_zBObJaEsy) zO;0fpD*3{dMGQM5a7b_d!DdlS0)H+KZB}}6TEa5={Zow}u^2o?u6b5&<-=W-T;in_ zaq9`XOG-?#J~FpI!3Zu6a&kox`T zRyM1O(FlzS%eR;vu*HOmdqy`^b@XD*-Jv9Q-idW%T1TZqqHbmlz-%v9U`|iNP$RKN zvA4BpgH2v=n6OLpL&ZBjGt(@SuaSaq`eSQ6=l6GrUuC|Nm6EV896`))mWpseUoJl% z`Z0B)yjuwlW(m`dE5({qv$l@yu>x(>=^h8sLr$VY-YM;i4=rJ~)(m@H51K9}`B3b> z3Wujg-0?J|D+1j6!Cc&94|T`SHhXv`(&q~8K;GLviy8w~R=BV2puY0f(OmERNo}l~ ziHED*&(6zJ8iEjk*? z@(>{VI_lKxO)!*{?d28{id6}(b6YoE)*~umeLYb z;pl4}LA~NcAIAJUoHyczAGBqSs2_ME>n)A26UZR5#>C*b{CFDaKy>qu+xEOl@_Dtn z4~YsWO24O9PARL*re_wR`DF?2>!4$?M(Ysn-kW+oizpQqWW+zFgS^K%hX(V|>CiF? z1IVozh?H6qBs4t7bdq<2N0&rstc>5GS6kJKKcJ=Z<;yURG{peowwfAt(vtzJ>NWgh z;g@Z#mamR&La`W!-63v^p24*v3g6(H_m*MydW{ftq8HV#-R{R*g+hCKlq!CdUG8Ct z40^8ojd(o&5br;p4fsHR@mKZYb>wth$p^-*1b(Ly#G8pF)J$I$=+Kla;EILy$Nxfi z1G46ubhRi;1nRqad6`U*{YZLQni`R@LdKW13M8ZhoWrRADI|&}zYm#4aIi*=?Hl_{ zI;RL*w)PSk2oIg5`dmHw`GNYkj6ktOyx**Sj;>qTW+KGwHTH<=E6W=pL_W6AzSDsP zCx}p&5i08=b6nFa<{72%9?TabIq7fy_qr!m|si;ZPDy^lN>vYvczqt_5-cfNmoW(8LebsoTa^SZ&AL-|pqs<)e(+RtbICz=$G7x0Z*SpxU+;Srl>BN` z2^2Drd+6D8`S>`Z8x)n zoYc;JjN>3#>B(miCiKD z{?l1zT>isZ7VAq+|HS)NEUwnhzR%myjzaoray`-L0DrR+%d3PK)Rf5>A> z0vp~z)Hk$9cRcoov%KpKWSWrS>8fPOn6NT8@pBa0p?dF0v7IoBHxEbG1JW)+qR}GX zi&s-qP>k@me{{`1y2q-6(iEbON;j~?pA?rt}KBO~a4L0w*6-hZxO;&CfB%0}b^*^=YOKhoRd z3&g#wl@f=W38MSx!OP;+L36A~N?8ZedL7YqbrC<8y9E_|cPIJw2%W9$l~Xsw@n=R~ z0;q^r#HyoCTLs1!9cL$TT0J_j#()3z7CsLQpn?gRU_T`#Yu#$wCntGx=KLcgcOu(c zpmXO2(-tu;=q?&5dv+5q#O#sqLZgZg1Ljz0Y1lbT$MZ5gW4(kIQ8(Vcy5ZkYCNKvGT6-qX0H4I6w6j|cO1{Ct z@TuSZ!c5{@NK7>e2=gQ?#|99rD#eQ=dOnNvh?jh$rW}yhJ35IGd+WvzvcsxdJ!+6u z?H#}W-ujEXXN;4=8brSN9qJOFd#iimoytWH$=D!HAw~5j<}Dz_ff0le9xT;%ZGxF* zhp+ok42zB3g=DWfasP_2+q`nBX!6(z1jQya*r9&DRk zvT>%?6wzr(8{HWFi3uzmxJjRdzni4%JWbPEN0RjRUOCT}A#Z2-(%Fh)UVh4_PCr9W z)YFtTRmO~II2TeaLs~73VnmPhAqW0t61sQhc21m%pmuFkxkr6VgZyVh~#O3V*>6-vQPbL8XyJf!M znA-(z?tl`R^0BBDNdvPtAF3q12>Ng8_Xu8~_N%jLE)j!O{m=779*ChmZyfaA{PY`v znlz5V7S90)OCw<>WFbK0&Y!0_wsD_IZVw2&>?9UeJW`ofHkYv!EaBLd=RI{DJEgQk z>+o>f+218Z){vGKm7tQ|R5fxu7zL+@hoqRfME8L>Uc4e8V#3_ReUDAT{%_G`ftJB> z7JNszOi;F;p`XA0t6W?h{~I`P{sj&uriMmFhNh<5j@P#iv6pjhw-}tr7xL(Szn>p& z>mqK#xO=cj`YCJWM7GoX!|Mh)+1cB$5x!#Gi*D<|Vwa%Nr0IqbYZ8<2$uKTq0HSXI zfN01SI%5>)G?xrMcLEOqfQ4n$6+apPU?w1UR*B+F#Jj@x!IR}wcE*zpfRKl-KW+b- zNsvLr$c#=%fMfD~zPxm5?_D--f68+akbe_;`6~esnlrOGlUF-~kJ$LshKtzQyR3>B zpLp{j#M$q&sFk$!*C2a88EYj9_zB7{asU7r@DuPBz$^!d1~3CU0IekOelF+FAZYu` zK*9}lkIOIHCG7rjD;q9vgx~ver_C48lF-68wMgWieIon=vNcX~TYk##+C1aZ&@8le z|HxbZz&cYCFKOn>*y{B=n&*-#n8L^Z>ZZ@DU&Wvk*lF}K`M4s>omi3ogCnQ1rg^rq zwIOq>5eu41bd*B5=6bUbnz&L0>bPRme`dMV=~@;OG1h_3^fB$0XG3dQbwAG*UZK0Y zI=8La+t9ArZ62j$y|muACyJScJQjasBBu0t`1Tre z|2TCPCuUE9sdmS*4k4t^UbYitxmc)NwX$g;awuojPfE--NG^C>JQFx`zn^DY9dTW| z?zqpinoNx$t8&d=Z!&W@242~l*C`(T3MF9D7&Z8zTj?!+9|T!-g|f*(Cq`?wR7)a! z+>PyQjTF?a{VYr+l`JgWb%-P_oGm_{B%ShI`s`f!gT^1e0bPfE8rCAF7v`N;HuZ(m z!}jKEDfIbR39s%2AtGX8Fn7`~mH!&W9RK7!{`qjq_Q}{<#l?^kF~Kq#qEzJfej?0Jap95 z5CJ!l=a|GFH1RUa9}88MmSP9EwkWy$Wfjv;L7G+uZymr?wctVAMkG^FxPU{{DpV&oHn$?y2tX`4fGv(VC=kQ~UJ7vjJtH>Il@=jC=-v zFBVBv{YJq5fOh`z&ipa0HPrj#1$T4ktrQ_)Z{hcY@r}0zW(t*&V_4J7l$CO5((7?W z8Nq@ZfkU<%_CAx8BFoPp2;h`~0StjMOZ8w}XHQpyfusz_zjHl#iFkD@oeBg)AGOxS zMDO7Q$be@`n$fvEKXWMA-bJBw44piTNx!2IH%|}z$-y`>2v3JBRH7KiS5cUgsGZyb#UFZ6gKsqCLfr?GYTm2h*{LJ3 zje6NR5T@JiEbQh+5N=GXC>04jVfa@OSwDBs_3U6YZK70qgq~i{AN1V}yv+~}Vp_wm zl!UHN?Y$4P5B%6rJH#twtkF3-w66-ECHz6d#!>PDaXB^H-d+TQdS)~=rB?MdfZTIK zLO%>CVHz&x{`(%2Bu0p$&0@|jPf0}&F+b@`Jt{n2x<{aVn~$9QdFE);>KdCYZ1|{& zsdY3NkqAkxLD;XM-1rCY;oA2F&m&PAJ%!WhTbncXh50S=lDVvRGiQ?)(-8!5bDME;^YMVVjCf4U zOxXEMIQUH1jkrur%y@yuKrZ3`{|!AhWqW%Uv_H$OGMn^gb9<^knWfC8V&!E<#l^>_ zp~LaVA5Oi011XOGw(&94jS-}XFE&YXM~{NSnD)oY0CmcGLRP3IlAdOqw~d1x7U8*X zVk2LACM>o|5SnN~P#%80Wv>Fc*eC7)LQsbft(<)a=a;@%L61t!WtNeuy^I^%Mfq=h zk6}9p2U_P(HEnG|Kytqh#u|c(g(wAb&zLUCG+n^dze?xqV&vrF;bdlx#s}mCqS4Zd If097^KRnRf(EtDd literal 0 HcmV?d00001 diff --git a/test/test_gprinter.py b/test/test_gprinter.py new file mode 100644 index 00000000..6e30a755 --- /dev/null +++ b/test/test_gprinter.py @@ -0,0 +1,73 @@ +from __future__ import annotations + +import os +import unittest +import pytest +import subprocess +from pathlib import Path + +# Make SymPy available to this program: +import sympy +from sympy import symbols + +# Make GAlgebra available to this program: +from galgebra.ga import Ga +# from galgebra.mv import * +from galgebra.printer import Fmt, GaPrinter, Format +# Fmt: sets the way that a multivector's basis expansion is output. +# GaPrinter: makes GA output a little more readable. +# Format: turns on latex printer. +from galgebra.gprinter import gFormat, gprint, gxpdf + +ROOT = Path(__file__).parent.parent +DIR_TEST = ROOT / 'test' +DIR_GENERATED = DIR_TEST / 'generated' +DIR_FIXTURES = DIR_TEST / 'fixtures' +DIR_DIFF = DIR_TEST / 'diff' + + +class TestGprinter(unittest.TestCase): + # @pytest.mark.skipif("TEST_GXPDF" not in os.environ, reason="Only run if TEST_GXPDF is set") + def test_gxpdf(self): + gFormat() + # Set up standard G^3 geometric algebra + g3coords = (x, y, z) = symbols('x y z', real=True) # Without real=True, symbols are complex + g3 = Ga(r'\mathbf{e}', g=[1, 1, 1], coords=g3coords) + (ex, ey, ez) = g3.mv() # Program names of basis vectors. + (exr, eyr, ezr) = g3.mvr() # Program names of reciprocal basis vectors. + + B = g3.mv('B', 'bivector') + Fmt(1) # Set Fmt globally + gprint(r'\mathbf{B} =', B) # B will be bold. + gprint(r'\mathbf{B} =', B.Fmt(3)) # Fmt(3) here only. + gprint(r'\mathbf{B} =', B) # Global Fmt remembered. + + gprint(r'\mathbf{B}^2 =', B*B) + + M = g3.mv('M', 'mv') + gprint(r'\langle \mathbf{M} \rangle_2 =', M.grade(2)) + # grade(2) could be replaced by, e.g., odd(), or omitted altogether. + + gprint(r'\alpha_1\mathbf{X}/\gamma_r^3') + + grad = g3.grad + + gprint(r'{\nabla} = ', grad) + + # mkdir -p + os.makedirs(DIR_GENERATED, exist_ok=True) + os.makedirs(DIR_DIFF, exist_ok=True) + os.chdir(DIR_GENERATED) + + gxpdf('test_gprinter.tex', pdfprog='tectonic', rm=False, null=False, evince=False) + + os.chdir(ROOT) + retcode = subprocess.call([ + 'diff-pdf', + '--output-diff=%s' % (DIR_DIFF / 'test_gprinter-diff.pdf'), + DIR_FIXTURES / 'test_gprinter.pdf', + DIR_GENERATED / 'test_gprinter.pdf' + ]) + assert retcode == 0 + + # os.system('pdf2svg test_gprinter.pdf test_gprinter.svg') From 27b93ca3d979d6e0f928d466ac920ec1f5ad73a8 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 9 Apr 2024 15:17:07 +0800 Subject: [PATCH 35/78] lint and add back skip --- galgebra/gprinter.py | 1 - test/test_gprinter.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/galgebra/gprinter.py b/galgebra/gprinter.py index b65a9bcf..b9de1269 100644 --- a/galgebra/gprinter.py +++ b/galgebra/gprinter.py @@ -212,7 +212,6 @@ def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debu """ latex_str = paper_format(paper, pt)+LaTeX.latex_preamble+LaTeX.latex_str+r'\end{document}' - if filename is None: pyfilename = sys.argv[0] diff --git a/test/test_gprinter.py b/test/test_gprinter.py index 6e30a755..edb2c7ad 100644 --- a/test/test_gprinter.py +++ b/test/test_gprinter.py @@ -27,7 +27,7 @@ class TestGprinter(unittest.TestCase): - # @pytest.mark.skipif("TEST_GXPDF" not in os.environ, reason="Only run if TEST_GXPDF is set") + @pytest.mark.skipif("TEST_GXPDF" not in os.environ, reason="Only run if TEST_GXPDF is set") def test_gxpdf(self): gFormat() # Set up standard G^3 geometric algebra From 09b2ead1bad8f864e67fd196312eb6261dcc53f9 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 9 Apr 2024 16:01:51 +0800 Subject: [PATCH 36/78] Upload PDF diffs for inspection --- .github/workflows/ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f5d0276f..912ba938 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,7 +45,8 @@ jobs: uses: awalsh128/cache-apt-pkgs-action@latest if: "matrix.python-version == '3.11'" with: - packages: diff-pdf + # https://github.com/vslavik/diff-pdf/pull/85 + packages: diff-pdf-wx version: 1.0 - uses: actions/cache@v3 name: Tectonic Cache @@ -80,6 +81,11 @@ jobs: uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} + - uses: actions/upload-artifact@v3 + if: "matrix.python-version == '3.11' && failure()" + with: + name: PDF-diffs + path: test/diff release: name: Create release and send to PyPI From 43743e2ad3df1fbc8904de13ad1941fb0de37c03 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 11:24:15 +0800 Subject: [PATCH 37/78] Try hidakatsuya/action-setup-diff-pdf --- .github/workflows/ci.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 912ba938..fa55cb08 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,13 +41,10 @@ jobs: - name: Lint run: | flake8 -v - - name: Install apt deps with cache - uses: awalsh128/cache-apt-pkgs-action@latest + - uses: hidakatsuya/action-setup-diff-pdf@v1.3.0 if: "matrix.python-version == '3.11'" with: - # https://github.com/vslavik/diff-pdf/pull/85 - packages: diff-pdf-wx - version: 1.0 + diff-pdf-version: '0.5' - uses: actions/cache@v3 name: Tectonic Cache if: "matrix.python-version == '3.11'" From 7e82c5d4598ec6ed7f7b5c063d2f708ff9b1fbca Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 12:03:45 +0800 Subject: [PATCH 38/78] Try failing the PDF diff test --- test/test_gprinter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_gprinter.py b/test/test_gprinter.py index edb2c7ad..39f29fc7 100644 --- a/test/test_gprinter.py +++ b/test/test_gprinter.py @@ -39,7 +39,7 @@ def test_gxpdf(self): B = g3.mv('B', 'bivector') Fmt(1) # Set Fmt globally gprint(r'\mathbf{B} =', B) # B will be bold. - gprint(r'\mathbf{B} =', B.Fmt(3)) # Fmt(3) here only. + gprint(r'\mathbf{B} =', B.Fmt(1)) # Fmt(3) here only. gprint(r'\mathbf{B} =', B) # Global Fmt remembered. gprint(r'\mathbf{B}^2 =', B*B) From c2c263125cf3b372726251cba29fe7ceca95cba7 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 12:08:55 +0800 Subject: [PATCH 39/78] Run test_gxpdf --- .github/workflows/ci.yml | 1 + test/test_gprinter.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fa55cb08..9210a615 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,7 @@ concurrency: env: PYTHONUNBUFFERED: "1" FORCE_COLOR: "1" + TEST_GXPDF: "1" jobs: build: diff --git a/test/test_gprinter.py b/test/test_gprinter.py index 39f29fc7..edb2c7ad 100644 --- a/test/test_gprinter.py +++ b/test/test_gprinter.py @@ -39,7 +39,7 @@ def test_gxpdf(self): B = g3.mv('B', 'bivector') Fmt(1) # Set Fmt globally gprint(r'\mathbf{B} =', B) # B will be bold. - gprint(r'\mathbf{B} =', B.Fmt(1)) # Fmt(3) here only. + gprint(r'\mathbf{B} =', B.Fmt(3)) # Fmt(3) here only. gprint(r'\mathbf{B} =', B) # Global Fmt remembered. gprint(r'\mathbf{B}^2 =', B*B) From 721905e1dfcbbc6eea0042269ba3651170245214 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 14:36:00 +0800 Subject: [PATCH 40/78] Set TEST_GXPDF=1 only for Python 3.11 --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9210a615..6c512baf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,6 @@ concurrency: env: PYTHONUNBUFFERED: "1" FORCE_COLOR: "1" - TEST_GXPDF: "1" jobs: build: @@ -59,6 +58,10 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} biber-version: "latest" + - name: Set environment variables + if: "matrix.python-version == '3.11'" + run: | + echo "TEST_GXPDF=1" >> "$GITHUB_ENV" - name: Test run: | PYTEST_ARGS=(); From f48b941498785ceecfb74a93b2211b1113215033 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 14:55:24 +0800 Subject: [PATCH 41/78] Try failing the PDF diff test --- test/test_gprinter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_gprinter.py b/test/test_gprinter.py index edb2c7ad..39f29fc7 100644 --- a/test/test_gprinter.py +++ b/test/test_gprinter.py @@ -39,7 +39,7 @@ def test_gxpdf(self): B = g3.mv('B', 'bivector') Fmt(1) # Set Fmt globally gprint(r'\mathbf{B} =', B) # B will be bold. - gprint(r'\mathbf{B} =', B.Fmt(3)) # Fmt(3) here only. + gprint(r'\mathbf{B} =', B.Fmt(1)) # Fmt(3) here only. gprint(r'\mathbf{B} =', B) # Global Fmt remembered. gprint(r'\mathbf{B}^2 =', B*B) From 4bd4a3e61b2d611fd9d9c4c1072670759792cc39 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 15:40:46 +0800 Subject: [PATCH 42/78] Resume tests --- test/test_gprinter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_gprinter.py b/test/test_gprinter.py index 39f29fc7..edb2c7ad 100644 --- a/test/test_gprinter.py +++ b/test/test_gprinter.py @@ -39,7 +39,7 @@ def test_gxpdf(self): B = g3.mv('B', 'bivector') Fmt(1) # Set Fmt globally gprint(r'\mathbf{B} =', B) # B will be bold. - gprint(r'\mathbf{B} =', B.Fmt(1)) # Fmt(3) here only. + gprint(r'\mathbf{B} =', B.Fmt(3)) # Fmt(3) here only. gprint(r'\mathbf{B} =', B) # Global Fmt remembered. gprint(r'\mathbf{B}^2 =', B*B) From 53cdd720e12744054ca0806de78982fc0bf240cb Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 15:49:07 +0800 Subject: [PATCH 43/78] Set the patch coverage target to 75% --- codecov.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..e315dae4 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,10 @@ +codecov: + status: + project: + default: + # Keep the project coverage target to auto + target: auto + patch: + default: + # Set the patch coverage target to 75% + target: 0.75 From 1c11b9e1eea51376f38f99753ec7563d69b4844b Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 16:08:27 +0800 Subject: [PATCH 44/78] Validate and fix codecov.yml `cat codecov.yml | curl --data-binary @- https://codecov.io/validate` --- codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index e315dae4..e6e44665 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,4 +1,4 @@ -codecov: +coverage: status: project: default: From 47e25c3a71472e0e79e14a6f7f58fce59251e2b6 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 16:46:29 +0800 Subject: [PATCH 45/78] Fix 0.75% --- codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index e6e44665..f0e50a7b 100644 --- a/codecov.yml +++ b/codecov.yml @@ -7,4 +7,4 @@ coverage: patch: default: # Set the patch coverage target to 75% - target: 0.75 + target: 75% From c22ea9c8596b903df25364309605f158d721a3aa Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 18:33:04 +0800 Subject: [PATCH 46/78] Add nblinks to added notebooks for reference --- doc/tutorials/cm3.nblink | 3 +++ doc/tutorials/g2.nblink | 3 +++ doc/tutorials/g3.nblink | 3 +++ doc/tutorials/g4.nblink | 3 +++ doc/tutorials/gprint.nblink | 3 +++ doc/tutorials/h3.nblink | 3 +++ doc/tutorials/lt.nblink | 3 +++ doc/tutorials/sp2.nblink | 3 +++ doc/tutorials/sp2g3.nblink | 3 +++ doc/tutorials/sp2sp3.nblink | 3 +++ doc/tutorials/sp3.nblink | 3 +++ doc/tutorials/spacetime.nblink | 3 +++ 12 files changed, 36 insertions(+) create mode 100644 doc/tutorials/cm3.nblink create mode 100644 doc/tutorials/g2.nblink create mode 100644 doc/tutorials/g3.nblink create mode 100644 doc/tutorials/g4.nblink create mode 100644 doc/tutorials/gprint.nblink create mode 100644 doc/tutorials/h3.nblink create mode 100644 doc/tutorials/lt.nblink create mode 100644 doc/tutorials/sp2.nblink create mode 100644 doc/tutorials/sp2g3.nblink create mode 100644 doc/tutorials/sp2sp3.nblink create mode 100644 doc/tutorials/sp3.nblink create mode 100644 doc/tutorials/spacetime.nblink diff --git a/doc/tutorials/cm3.nblink b/doc/tutorials/cm3.nblink new file mode 100644 index 00000000..b3362829 --- /dev/null +++ b/doc/tutorials/cm3.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/cm3.ipynb" +} diff --git a/doc/tutorials/g2.nblink b/doc/tutorials/g2.nblink new file mode 100644 index 00000000..aaaea087 --- /dev/null +++ b/doc/tutorials/g2.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/g2.ipynb" +} diff --git a/doc/tutorials/g3.nblink b/doc/tutorials/g3.nblink new file mode 100644 index 00000000..4296628e --- /dev/null +++ b/doc/tutorials/g3.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/g3.ipynb" +} diff --git a/doc/tutorials/g4.nblink b/doc/tutorials/g4.nblink new file mode 100644 index 00000000..792efcd3 --- /dev/null +++ b/doc/tutorials/g4.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/g4.ipynb" +} diff --git a/doc/tutorials/gprint.nblink b/doc/tutorials/gprint.nblink new file mode 100644 index 00000000..8e24f846 --- /dev/null +++ b/doc/tutorials/gprint.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/gprint.ipynb" +} diff --git a/doc/tutorials/h3.nblink b/doc/tutorials/h3.nblink new file mode 100644 index 00000000..26e2a89e --- /dev/null +++ b/doc/tutorials/h3.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/h3.ipynb" +} diff --git a/doc/tutorials/lt.nblink b/doc/tutorials/lt.nblink new file mode 100644 index 00000000..5b8c4a56 --- /dev/null +++ b/doc/tutorials/lt.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/ipython/lt.ipynb" +} diff --git a/doc/tutorials/sp2.nblink b/doc/tutorials/sp2.nblink new file mode 100644 index 00000000..04ff90dc --- /dev/null +++ b/doc/tutorials/sp2.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/sp2.ipynb" +} diff --git a/doc/tutorials/sp2g3.nblink b/doc/tutorials/sp2g3.nblink new file mode 100644 index 00000000..53c81af0 --- /dev/null +++ b/doc/tutorials/sp2g3.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/sp2g3.ipynb" +} diff --git a/doc/tutorials/sp2sp3.nblink b/doc/tutorials/sp2sp3.nblink new file mode 100644 index 00000000..56b4de64 --- /dev/null +++ b/doc/tutorials/sp2sp3.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/sp2sp3.ipynb" +} diff --git a/doc/tutorials/sp3.nblink b/doc/tutorials/sp3.nblink new file mode 100644 index 00000000..5d2df21e --- /dev/null +++ b/doc/tutorials/sp3.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/sp3.ipynb" +} diff --git a/doc/tutorials/spacetime.nblink b/doc/tutorials/spacetime.nblink new file mode 100644 index 00000000..b27ea42d --- /dev/null +++ b/doc/tutorials/spacetime.nblink @@ -0,0 +1,3 @@ +{ + "path": "../../examples/primer/spacetime.ipynb" +} From d384f93777dad693d43ff2744516390ba8dfc452 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 18:36:09 +0800 Subject: [PATCH 47/78] Add changelog entries for this PR --- doc/changelog.rst | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/doc/changelog.rst b/doc/changelog.rst index 59b5281a..816c9697 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -2,6 +2,68 @@ Changelog ========= +.. math:: + \newcommand {\lt}[1] {\mathsf{#1}} + \newcommand {\mbf}[1] {\mathbf{#1}} + \newcommand {\es}[1] {\mathbf{e}_{#1}} + \newcommand {\til}[1] {\widetilde{#1}} + +- :feature:`510` Added :class:`~galgebra.gprinter.gprint` by Alan Bromborsky developed back in 2020, which improved printing of text and LaTeX for multiple GA objects in Jupytper notebooks, and is the recommended way to print GA formulas, see :doc:`tutorials/gprint` for a demonstration. Testability and test coverage are improved. + +- :support:`510` Testing infrastructure for generating and diffing PDFs is added, see ``test/test_gprinter.py`` and ``.github/workflows/ci.yml`` for details. + +- :feature:`510` Improved functionality for :class:`~galgebra.mv.Mv`, :class:`~galgebra.lt.Lt` by Greg Grunberg, with improved test coverage and minor fixes. + + Changes by Greg Grunberg include (see the attached notebooks in :issue:`478` for details): + + * The following methods of ``Mv`` are added, along with their corresponding functions (applied to multivectors ``A`` and ``B``): + + * Undualization: :meth:`A.undual() ` and :func:`undual(A) ` + * Grade involution: :meth:`A.g_invol() ` and :func:`g_invol(A) ` + * Clifford conjugation: :meth:`A.ccon() ` and :func:`ccon(A) ` + * Scalar product: :meth:`A.sp(B) ` and :func:`sp(A,B) ` + * Quadratic form: :meth:`A.qform() ` and :func:`qform(A) ` + * Magnitude squared: :meth:`A.mag2() ` and :func:`mag2(A) ` + * Magnitude: :meth:`A.mag() ` and :func:`mag(A) ` + + * The following methods of ``Mv`` are improved, along with their corresponding functions: + + * Norm squared: :meth:`A.norm2() ` and :func:`norm2(A) ` now returns the absolute value of the quadratic form of ``A``. + * Norm: :meth:`A.norm() ` and :func:`norm(A) ` + + * :class:`~galgebra.lt.Lt` adopts the contravariant-covariant indexing notation long used in tensor analysis and differential geometry, which is consistent with the indexing notation GAlgebra already uses for the display of a multivector's basis blade expansion + * :meth:`~galgebra.lt.Lt.Symbolic_Matrix` allows the creation, for a symbolic transformation :math:`\lt{T}`, of matrices with entries of any of the four forms :math:`{T^i}_j`, :math:`T^{ij}`, :math:`T_{ij}`, or :math:`{T_i}^j`, although GAlgebra will use only the first two. + * :meth:`~galgebra.lt.Lt.Dictionary_to_Matrix` fixes a bug that incorrectly raises an exception if `T` maps one or more of the basis vectors to the zero multivector, and improves the readability. + * :class:`~galgebra.lt.Lt` fixes a bug that erroneously post multiplies the transformation's standard matrix by ``self.Ga.g_inv`` (the reciprocal metric tensor), resulting in a contravariant-contravariant matrix :math:`[T^{ij}] = [{T^i}_k g^{kj}]` instead of the standard matrix :math:`[{T^i}_j]`. In the same spirit, :meth:`~galgebra.lt.Lt.matrix` now returns the standard matrix $[{T^i}_j]$ instead of the product matrix :math:`[{T^i}_j][g_{ij}]`. + * :class:`~galgebra.lt.Lt` now distinguishes symmetric and antisymmetric transformations from general transformations, ``Amat`` will be the standard matrix :math:`[{T^i}_j]` of the transformation when ``mode=='g'``, , but will be :math:`[T_{ij}]` when ``mode in ['s','a']``. Since :math:`[g^{ij}][T_{ij}] = [{T^i}_j]`, in either case ``Lt.__init__`` will receive the standard matrix as its first parameter. + * :class:`~galgebra.lt.Lt` now correctly handles Versor input, and initializes the internal ``lt_dict`` for the versor-based linear transformation. + * :class:`~galgebra.lt.Lt` adds support for both even and odd versors, after generalization of spinors to versors in ``Mv``. + * For versor based transformations, the inverse transformation :meth:`~galgebra.lt.Lt.inv` is now based on simply :math:`\til{\mbf{V}}` instead of :math:`\mbf{V}^{-1} = {\frac 1 {\mbf{V} \til{\mbf{V}}}} {\til{\mbf{V}}}`, as a versor-based transformation is independent of taking nonzero scalar multiples of the versor. + * :class:`~galgebra.lt.Lt` adds support for LaTeX printing of versor-based transformations. + * The determinant method :meth:`~galgebra.lt.Lt.det` for a linear transformation is fixed, it now uses directly the geometric algebra definition of :math:`\lt{L}`'s determinant: :math:`\det(\lt{L}) = \lt{L}(\mbf{E}) \mbf{E}^{-1}`, where :math:`\mbf{E}` denotes the basis blade :math:`\mbf{E} = \es{1} \wedge \cdots \wedge \es{n}` for the grade space of pseudoscalars. + + Minor fixes includes: + + * ``norm`` is fixed by using ``metric.square_root_of_expr`` instead of ``sqrt`` + * making a "spinor" mv is kept for backward compatibility with existing tests, which is still aliased to making an "even" mv, see discussions ``10. An unimplemented suggestion`` in ``Changes to module lt.py`` attached in :issue:`478` + * fixed linting errors reported by ``flake8`` + * fixed some typos of ``return``, ``raise`` etc. + +- :feature:`510` Added example notebooks for typical GAs by Greg Grunberg, and they are now part of the tests: + + * Standard 2D Model :math:`\mathcal{G}_2`: :doc:`g2 ` + * Standard 3D Model :math:`\mathcal{G}_3`: :doc:`g3 ` + * Standard 4D Model :math:`\mathcal{G}_4`: :doc:`g4 ` + * 3D Homogeneous Coordinates :math:`\mathcal{G}_4`: :doc:`h3 ` + * 3D Conformal Model, Amsterdam convention :math:`\mathcal{G}_{4,1}`: :doc:`cm3 ` + * Spacetime algebra: :doc:`spacetime ` + * Sphere-related algebras: + + * Geometric algebra for unit sphere in :math:`\mathbb{R}^3` using spherical coordinates: :doc:`sp2 ` + * Unit sphere :math:`\mathbb{R}^3` as a submanifold of :math:`\mathcal{G}_3` in cartesian coordinates: :doc:`sp2g3 ` + * A geometric algebra for the unit sphere in :math:`\mathbb{R}^3` as a submanifold of :math:`\mathbb{R}^3` with spherical coordintes: :doc:`sp2sp3 ` + * Spherical Coordinates in :math:`\mathbb{R}^3`: :doc:`sp3 ` + - :release:`0.5.1 <2024.03.31>` - :bug:`495` ``MatrixFunction`` is broken since SymPy 1.11, which is required by initializing :class:`~galgebra.ga.Ga` with ``gsym`` and ``coords``, this is now fixed with a workaround (:issue:`507`). From f94da89fba9b7f5246b39de22b6a966e48625314 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 22:16:58 +0800 Subject: [PATCH 48/78] Misc fixes of changelog --- doc/changelog.rst | 22 ++++++++++++---------- doc/index.rst | 1 + 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/doc/changelog.rst b/doc/changelog.rst index 816c9697..71c51361 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -31,16 +31,18 @@ Changelog * Norm squared: :meth:`A.norm2() ` and :func:`norm2(A) ` now returns the absolute value of the quadratic form of ``A``. * Norm: :meth:`A.norm() ` and :func:`norm(A) ` - * :class:`~galgebra.lt.Lt` adopts the contravariant-covariant indexing notation long used in tensor analysis and differential geometry, which is consistent with the indexing notation GAlgebra already uses for the display of a multivector's basis blade expansion - * :meth:`~galgebra.lt.Lt.Symbolic_Matrix` allows the creation, for a symbolic transformation :math:`\lt{T}`, of matrices with entries of any of the four forms :math:`{T^i}_j`, :math:`T^{ij}`, :math:`T_{ij}`, or :math:`{T_i}^j`, although GAlgebra will use only the first two. - * :meth:`~galgebra.lt.Lt.Dictionary_to_Matrix` fixes a bug that incorrectly raises an exception if `T` maps one or more of the basis vectors to the zero multivector, and improves the readability. - * :class:`~galgebra.lt.Lt` fixes a bug that erroneously post multiplies the transformation's standard matrix by ``self.Ga.g_inv`` (the reciprocal metric tensor), resulting in a contravariant-contravariant matrix :math:`[T^{ij}] = [{T^i}_k g^{kj}]` instead of the standard matrix :math:`[{T^i}_j]`. In the same spirit, :meth:`~galgebra.lt.Lt.matrix` now returns the standard matrix $[{T^i}_j]$ instead of the product matrix :math:`[{T^i}_j][g_{ij}]`. - * :class:`~galgebra.lt.Lt` now distinguishes symmetric and antisymmetric transformations from general transformations, ``Amat`` will be the standard matrix :math:`[{T^i}_j]` of the transformation when ``mode=='g'``, , but will be :math:`[T_{ij}]` when ``mode in ['s','a']``. Since :math:`[g^{ij}][T_{ij}] = [{T^i}_j]`, in either case ``Lt.__init__`` will receive the standard matrix as its first parameter. - * :class:`~galgebra.lt.Lt` now correctly handles Versor input, and initializes the internal ``lt_dict`` for the versor-based linear transformation. - * :class:`~galgebra.lt.Lt` adds support for both even and odd versors, after generalization of spinors to versors in ``Mv``. - * For versor based transformations, the inverse transformation :meth:`~galgebra.lt.Lt.inv` is now based on simply :math:`\til{\mbf{V}}` instead of :math:`\mbf{V}^{-1} = {\frac 1 {\mbf{V} \til{\mbf{V}}}} {\til{\mbf{V}}}`, as a versor-based transformation is independent of taking nonzero scalar multiples of the versor. - * :class:`~galgebra.lt.Lt` adds support for LaTeX printing of versor-based transformations. - * The determinant method :meth:`~galgebra.lt.Lt.det` for a linear transformation is fixed, it now uses directly the geometric algebra definition of :math:`\lt{L}`'s determinant: :math:`\det(\lt{L}) = \lt{L}(\mbf{E}) \mbf{E}^{-1}`, where :math:`\mbf{E}` denotes the basis blade :math:`\mbf{E} = \es{1} \wedge \cdots \wedge \es{n}` for the grade space of pseudoscalars. + * :class:`~galgebra.lt.Lt` is significantly improved and fixed, see also :doc:`tutorials/lt`: + + * :class:`~galgebra.lt.Lt` adopts the contravariant-covariant indexing notation long used in tensor analysis and differential geometry, which is consistent with the indexing notation GAlgebra already uses for the display of a multivector's basis blade expansion + * :meth:`~galgebra.lt.Lt.Symbolic_Matrix` allows the creation, for a symbolic transformation :math:`\lt{T}`, of matrices with entries of any of the four forms :math:`{T^i}_j`, :math:`T^{ij}`, :math:`T_{ij}`, or :math:`{T_i}^j`, although GAlgebra will use only the first two. + * :meth:`~galgebra.lt.Lt.Dictionary_to_Matrix` fixes a bug that incorrectly raises an exception if `T` maps one or more of the basis vectors to the zero multivector, and improves the readability. + * :class:`~galgebra.lt.Lt` fixes a bug that erroneously post multiplies the transformation's standard matrix by ``self.Ga.g_inv`` (the reciprocal metric tensor), resulting in a contravariant-contravariant matrix :math:`[T^{ij}] = [{T^i}_k g^{kj}]` instead of the standard matrix :math:`[{T^i}_j]`. In the same spirit, :meth:`~galgebra.lt.Lt.matrix` now returns the standard matrix $[{T^i}_j]$ instead of the product matrix :math:`[{T^i}_j][g_{ij}]`. + * :class:`~galgebra.lt.Lt` now distinguishes symmetric and antisymmetric transformations from general transformations, ``Amat`` will be the standard matrix :math:`[{T^i}_j]` of the transformation when ``mode=='g'``, , but will be :math:`[T_{ij}]` when ``mode in ['s','a']``. Since :math:`[g^{ij}][T_{ij}] = [{T^i}_j]`, in either case ``Lt.__init__`` will receive the standard matrix as its first parameter. + * :class:`~galgebra.lt.Lt` now correctly handles Versor input, and initializes the internal ``lt_dict`` for the versor-based linear transformation. + * :class:`~galgebra.lt.Lt` adds support for both even and odd versors, after generalization of spinors to versors in ``Mv``. + * For versor based transformations, the inverse transformation :meth:`~galgebra.lt.Lt.inv` is now based on simply :math:`\til{\mbf{V}}` instead of :math:`\mbf{V}^{-1} = {\frac 1 {\mbf{V} \til{\mbf{V}}}} {\til{\mbf{V}}}`, as a versor-based transformation is independent of taking nonzero scalar multiples of the versor. + * :class:`~galgebra.lt.Lt` adds support for LaTeX printing of versor-based transformations. + * The determinant method :meth:`~galgebra.lt.Lt.det` for a linear transformation is fixed, it now uses directly the geometric algebra definition of :math:`\lt{L}`'s determinant: :math:`\det(\lt{L}) = \lt{L}(\mbf{E}) \mbf{E}^{-1}`, where :math:`\mbf{E}` denotes the basis blade :math:`\mbf{E} = \es{1} \wedge \cdots \wedge \es{n}` for the grade space of pseudoscalars. Minor fixes includes: diff --git a/doc/index.rst b/doc/index.rst index 3734c494..7c6561de 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -23,6 +23,7 @@ :hidden: tutorials/algebra + tutorials/lt tutorials/gprint .. toctree:: From 444e4989b567cc1ca2247ff8aa05f5c3879e759b Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 22:17:31 +0800 Subject: [PATCH 49/78] Fixes of gprint 1. Clean up the latex string after printing 2. Support specifying `documentclass` 3. Added `gPrint_Function` --- galgebra/gprinter.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/galgebra/gprinter.py b/galgebra/gprinter.py index b9de1269..ef2bbeb3 100644 --- a/galgebra/gprinter.py +++ b/galgebra/gprinter.py @@ -2,6 +2,7 @@ import subprocess import sys import shutil +import inspect from sympy import init_printing @@ -196,7 +197,7 @@ def gprint(*xargs): return -def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debug=False, pt='10pt', pdfprog='pdflatex', evince=True, rm=True, null=True): +def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debug=False, pt='10pt', pdfprog='pdflatex', evince=True, rm=True, null=True, documentclass='book'): """ Post processes LaTeX output (see comments below), adds preamble and @@ -211,7 +212,9 @@ def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debu We assume that if gxpdf() is called then gFormat() has been called at the beginning of the program. """ - latex_str = paper_format(paper, pt)+LaTeX.latex_preamble+LaTeX.latex_str+r'\end{document}' + latex_str = paper_format(paper, pt, documentclass)+LaTeX.latex_preamble+LaTeX.latex_str+r'\end{document}' + # Clean up the latex string after printing + LaTeX.latex_str = '' if filename is None: pyfilename = sys.argv[0] @@ -262,17 +265,17 @@ def gxpdf(filename=None, paper=(14, 11), crop=False, png=False, prog=False, debu return -def paper_format(paper, pt): # Set size of paper and font size +def paper_format(paper, pt, documentclass='book'): # Set size of paper and font size if paper == 'letter': paper_size = """ -\\documentclass[@10pt@,fleqn]{book} -""" +\\documentclass[@10pt@,fleqn]{%s} +""" % documentclass else: paper_size = """ -\\documentclass[@10pt@,fleqn]{book} +\\documentclass[@10pt@,fleqn]{%s} \\usepackage[vcentering]{geometry} -""" +""" % documentclass if paper == 'landscape': paper = [11, 8.5] paper_size += '\\geometry{papersize={' + str(paper[0]) + \ @@ -282,3 +285,17 @@ def paper_format(paper, pt): # Set size of paper and font size paper_size = paper_size.replace('@10pt@', pt) return paper_size + +def gPrint_Function(): + """ Print out the source of the current function """ + + tmp_str = inspect.getsource(inspect.currentframe().f_back) + if LaTeX.latex_flg: + #print '#Code for '+fct_name + LaTeX.latex_str += r'\begin{lstlisting}[language=Python,showspaces=false,showstringspaces=false,backgroundcolor=\color{gray},frame=single]%s\end{lstlisting}\text{Code Output:}' % tmp_str + else: + print('\n' + 80 * '*') + #print '\nCode for '+fct_name + print(tmp_str) + print('Code output:\n') + return \ No newline at end of file From 3b3fb6bed1c39e8d3268161a8e427d69fa5df502 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 22:17:57 +0800 Subject: [PATCH 50/78] Add test_lt_pdf --- test/fixtures/test_lt_pdf.pdf | Bin 0 -> 152575 bytes test/test_gprinter.py | 153 +++++++++++++++++++++++++++++----- 2 files changed, 134 insertions(+), 19 deletions(-) create mode 100644 test/fixtures/test_lt_pdf.pdf diff --git a/test/fixtures/test_lt_pdf.pdf b/test/fixtures/test_lt_pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0b4d011d033e5b2804c62c402250ddc17b2a8baf GIT binary patch literal 152575 zcma%iQ$Q!s_H{NV+qRqR$+m6V)@0kZo0@Ff=49LT{bug>cK;8zmwKpk&R%=1wNa7D zi-^%N(X+vj%`6PAz_1W9651JB67ulCFi4x&nmL;jvaxe;5dQmsVGy&hb~bS&WDv79 za5fP!F|so@f#KtWadLJvF|dJgU%SxJiv82-;+w0dAn>gf+jYJ}@7uEh#t6OsAENpr zn@(8i!?}||=~xzy>GRs@@5VogD~nDG+*i_@-}0qY7AxfDD0~SJ2gi5YGx4^4zJdwt zG#J}o4mKw*k2CpwzW(^-Lan4;4aiEEhOB+J!BVq*dY?pj=QAJ8V&NW4a%*>EaI4LE zSDObe@u>v$AQ}h#xF*@|^#A%m_AL(F{-C>jf%u#=(7XDC`=P_R*i*!Mgfw^cLKWEg zXBpU)`@_b*;b^88i@d|G`*Uc$923LvD9LnV{KQof-FpQZxIL53?e3m_>iJB~fpcq@ zSrt}&*#)-&Zz+FELu90Gb?k_wTkP+b=lXi%<5h?)J76$&0T( z`0h6Jtv&Aetq+<4oq>&RejWLMBx!LDS#TEL7MQjC3>EoC!HPfyk)s5uo_p7-vcLur zt=?b(F?c7TQpb;6dBftBZmG=mrr%PTi1nCiqOA5QKp@H%X0l`sqsvpI=7;`Gr_x-JW##)FrysdIroEPi|2S_cu7<<_<~)ce3freH+b@EZDW@o?6K3{z|i&U zt;PKucI@)=bHU^M9EPlF-udtwUT(R`T)yEwCkgzX6`0`tg~NlQk@d4|N~DA(UT`-@ za_qU7ZI&adUlNsLdJZDS05l5$h%ZFRsWtVc?7Y85^}%WpV!8-ZO$zR3V#RoZS?bCDWj!b!zq(Ofwm!3#}~$UljkO2wUaMZQBpkZ|<0o#D=n5DOJ( zSwWVtMq)*wYpwF*NsU>ANYHvz-Vx*>k{#J<2#H4U`JT(C&q@B5YC{rsjH9BPlzD$T zP}daMen;tRN@!5*BC3yAwb5?q;k7PA=NGW3PehoxSohoyWdX)R;6gtw>w=KI zQVa{wPdZ*)(c}FH0rx=85zleLChVhXKyq4s3A1@wO+u8n#1M165dqJy*QazW3itQE z_H^(K2ok0v;SeIF@8^4pqcB9^;;(l(cocHRY zVlLJh^6$H0yt$Sg8tOF)YM%c<&W@!1d+L%9%o*-oJ_40-#jN$mCXMtt?Ay**xt@Ugv)BGQg`V!~9P!)GH;MLctGWgWfVRm&Ox!`1r_Vv6I-r?WoaR%?fopt8k9P zIJX!EZjc)Mq=DasaQVksC6Te2BOR)fCd?r*4AMEbDV+4QY3LeH!x1=n88&}Ifb|9_ zffjJlBbE0kAG)szvzQX0|Dr;7HKC27_qZO3!(Bj1i|e(*#zdHS-Xvc@ShN;m!zm(X zjX1W(1^Y`KRw85|iQeQ2TyWT&oc=q^$-TqDa)?e-!F>&LPMlRD!7JdA1&SLcyhjx5 zbm^OxJ{HjFL_}min&~Ed^|R^c%|NR#OLT2Oc6P*&vqgpes#LUBqKvWG824A$>7j@g zdf#1ZViIq1W`CGS3E!HTa>{@_9!Gax+QJJ&%?^U0XQAN;!)cFzxr*p{ecM3K2gixU zPARHVhjiwV#T}8&RtbEWszr7IT!cR!G4uuGQZj%O&g=OZ#afMm)SCdo{ze7})=Hvn zC=c3xX!o`-txF@$R)21_HPe}Qu^{N{haW=>u0XfKonjf~J~TQSX~ zjx#`n9uV;DF7aMv>Mk2H(CZYAKiQl;c;X_^PhK=@(o==?dU?mRhOb4H<@_O~nw{Ob3w|0;)w z+Qda9=$~wC^2pBd#LEGP>Hac%=ZnzT^*ZwLHaxQSJhi1?XlSW-L?0_U@+HStE7sMu z4@Nwhw^{3$Y!|0Pm_|)(yoXxfDeH9T{LSKBTeTjqsiLDKNOh_}D#t~t@4>QAQ6Muz zD6?F9jEZiBMq))|gS^E>ks1h`PiJqvM`gZ+0uL4BjH@G!cjs0C?_|?;x4bq%mz8ryp z-Js?XI7)#68#&>rKD(U*S$oFHMJepjeT#_^U%j7pd}MdNv-}9o!R%$Cf)O8`7y0b_ zt=URD3f9E&Y&k9_IcYrumP$y*8nfWDT(>z<6~fFhHO}nalFUZJ#;qX=ULFrm{M}2A ze>^jPNoT@=Jm>;>4Br3!A^$vu606fH6ZZGkVWY|7ltN}M~&VxSa z<-|?Tr;z=Tw~#yGxM+iOoem$-{-9bD%4_iKM0$YWbkz0*Du6+%3XOuNXocZZFcg1l zXqygZ*-?|beEYSurB_!;*qKto4ATa9KuFgBqd$Eic!)vL017sQ>?Wc?mH|Mxp|b$t zVgiI4$^>AF<3I3lLVrnnL_8C_cI8^4$@aT@mADSue&avGB4CyDDo4@xD`K)aEEM6T zt#>7&dY&VMLe3K`B-RpKj zDGZ*cKuzwP?ECpyg9o~N(Tsmo15jN%z=_-cI&nL|)3}NMdFG~yMM-kr*;>5Pa?H=U zp_+tL3nw*iNtC$V`NpPRU0k{tPY1=+D(Oy60|AB@iB3*edj^DH$1TLDIMa7q_!eO{ zt5(w><$eG-Z6yD|2_@=Vo{G7cnDwn@8HPfW>uswk6YlpayRD2&A98gbjnzV5=%IE7 z2y-Cxl#X@ZtKJJikI@M8r=3RPsZa{Qa^tHbH1-0;8COnW3XNOQ{B zUn+u|<}KjndUZ>9tc*Dbss?P^C;|vUuF@!IsR)R9=$~V{B;Ka1>Y3Hfl4k~vKLqv_ z!)#5ZB|%AhItkJqFx-@HB~G)evd%t`M{B;Mai7y%E?K5d)M6_z_Z{%#%#tPz;K^r65|^3d~U z+n&Gu>ydhr519+!PxGDB)z3XwHMZX3HC!h9n`$Yv0r@8(-Rxt(|B1L6JxnEKS}06&AN+rdX7qVL0lGQ_q{s=3$m8f&fm!0lqhq{vRhz@_3x` zb--uD_g_|VrZmxszJH#yQqrAkf6+y?Ks$lHEE>9j9_?EDg}79RFA(iR5h9n&^Z9Pn z9uXyS_OH_!?Crbh#8&ZufMCR(dQ*fu7&c=Jl$33(H)SNm!g3CgEhw4b?UCBK`{C&E zAC0k*a}#2s6crmPB39{{z1tdDgjuqu07}0RmZ&p3=zruI*)&13sneY!DaX<;imag3 zf+;_qX1!ZgKjH|fE%bJI?HLgYJ1+OOHy5N`T)eT^Fe$KbwIIA2#bd<6#Cb!%7NtT_ z>Py#LGLc`9Z$HAwsGEM%Zc_{(fhvFmHYNZP!2Bgavn`DfOE;N*ej{4$Lnz%&(+o-t z!5g!WXDVN(Y_9G6q3xQu>ZSa)G62sxO~raPpic=lMeVlF?FI ziaSpk0}y4ZiJXQ(bEKijywI6}fAc`zyQ_GxEpxt`mUHlis+Jf!t^vhGdi|sVh9|l% zc5|PkG8n%w2dhYO6H^|5B@Fv+OY#?v1OOZ)065V3|7J)vS_E91iO+jc%<=PN1iUv0 z=E)0!UOK+k%)r52Ta*G5JQ$jM$}MQC9Y6Nx-5;7$hds=!RXK}BXKzS@{6*AZH{g!J z<>9XeR&I<6%-M?s>L04Q_>M3;gOVr=s%!mjdJ#OJIx*1Lv!IRR=+B!ms|btdX#fL_ z`5tk6?)b0sahsqd_&83(;3h{RZ=X9c9i}b+>iD*t?Nnv?=Sz-;0f4oE01}JF7;&s^`LFN5mmgfyL593T!p)u zE3xwpNr+hu@NfsDwi_V6$4EeGyD>$bmpFmv@ziaU31D&=ClI80wRYSvx&U2vA7HT3 zdv4gd*Ru86esapbmDgX}s34l(j2v8G<0sc6c z@lXBVcIB6N1tWjJP(E*onTR(>IQa-$|Ewr9cl1W{4u}yrP0L;W&Y^F*g-W2M=K2iyA)PeSg;2GD#Tl;P1Ks(ur^m z_#FT(19*cdpwiJa0NxM}cmp-@zq&-s+tiOI$jmzW@#%Gby=x)wW*I!4yHz}CP#?aW zCKht_1&0%pEg-uyfa0F3t2boFH}G_|cV^@56Juqz_TjhVKf}7ITy#=W=aJ41nDZDw zDmF{qTbp<&Z{ESxS0o!y%0Ok-aTF1dy0GMhnkDGhb&H?W4Ea`4_I-{1@+FBFyDh4{a{EZ_6J*FV6;; z#He2Zy?pt%zoezgfx{h7H834JdY(k1{}J4brmD(x$sz=YKsCQ$;Df6Ov#+2tXW15~ z=(rM-s2F;ss>q_)7)MPl?!p@WNBjOwV+*cX*F$np8Z)alV;wxe^(5de?cE}c5YTgo z{^eHzAh#%h+>)jL<5vSx>+$RQO2b`U#W`wLDh(D-e*0&Xd14sz}R}NzS)FoOdGYN-!^`TSq3&GcwnOh4kGuexSm#{*9Zsu{AtWQWKi zsIJ@5<^VHf96(+nQN&!Smj4O~&A=|L;#(}c=9frqYShw?8X+~I4vQw=L9PRHAK(@h z1nDTiMQ@@2|Ih2$#PHm!RxMef9-l`*dfa= zLU_5#kwFEn))%X_j+)OWYMZVdOB>US>ufm3QTGyoUE|-n@El|tERQP8wl?2CJ`K&3 zdNKsE&4;|c9Z+ebN{zQU=SJ|Hs)fXs-d{mYD_d|LmDgXk-yZoKbl zD;H0D5LAtJ#ukRue7m8AXKqS~TT&$#OnG_(D9r|-bua+54tRfC2LpiN==`U3KmZl= zWju7Sc>S7IF;sgWIz7eybA$bW`Wbi@2rsSo7cMCPT-|@+8VA5d@oxcCq!95~a0BC{ zw$ePjW$&#cK7UGd&Y_M=6)*eaQx)c^=&hx53 z`wH*z=UHbW{X8wFnWsK|3rM$?J)qeNtOQJw8-Ods{~@89?=;!U9xFivRe8j^@s{Pc zd##FPY^;}a#n;K9!h#BoeEO!|t{(g4j_Br~?Ze;y)F#KRSoyM`Eblo@nLyD__-`J& z0ULd;^>BG!qCgY-U2w2tR4d#y7s3+EjuS)cZEvO=9SOdpVE+_ItSamZnfMAk)9Rlor_y$XqB7%r12g7*z-P(2oivke|(AL zF7B=ndiZW#>^a$6?X$tEQGmaSBn|e8n=ZE2S%qG)jk^}9HddAAv5o_VQiLD>&TnKz zCk`7n7Qo0PyDlz1Wgky?jE$tIF7}fKbIyP&%lx83l=pzdFX$UVM9ZS3hNE!gBSfo2 zsEJU}H{nfW0aaL}$^gyZPw7eDZJ+n&AYn5Dt}P>!0pSb(lhx9mdoU?4)me$lqi02a zk%dgTGvA10hBIdQE1w4|p@WxWMr6+b_Tb|SsMRTU9md4g`2X*X0bc=j&M-_&|Htx~ zgM;mVUp}wL;Qo&HSyn^cfmAapu}J7W1A%b0c89ng@6+v^9P=+)vdLe!Y+Fz1@+BFO zG-Zy|P?;dr$_UV-eoJr};lZLH9)Tl&xm=97^7R}DBf0bB@b&g=&ipvI;^%$s{sA(5 zz+DfjuN|JPl0Zf0I=#(X&@FYCy$u~uO41j(IsU^>E0Q4{#WCXR4yCKT_v-^~8sf_J z3(l;ou+hlN&h3lWq6S=9Cw4LmKGx5&H>9P3V0O!rJj<%@9->NR2r`Sx?iFi0ynFTe zG`}L6!K|?S=7E?COB%Ff+34fsrjY-g@_vfNu4t9l_cu${s=j`N1BF|xoh$zpzpf5< z*H>_^;TQS)JD>NKF0aS?GXMKAxgO*=DaVTR^WIf$4cqybvrBc;=GV=srns;lDAm)p zo{pBmiJvdS$$n@LJ@E}gENmcBjK!iHBD8NKZbf{>Vw}RPGF-N}>|=ZO!J_=QWLyHY zMGFn^pHE0-khBjs1tf4Cff;ZP_Yx5eDCNQC!zmd>IirJG}2VDndtCaGI0tK(hfi;r6Ey0DXlyaoVCX zNYHR+%}W{$(U|6C4v0Nh!&LsLKvS0$mGXHY_J|V!O;Ho3ix_twE;2`pk6|OJD>TO_ zG<6qbNwBaZ&!94Mm&k4?lf6g>@+l$HSIjs(bxy!qX8@7C<~VD_uh7i%pWD&3vh z%PD&8(B;?^n_ZcyGbBqTQ*|H_eBuPB2{osEz?pO_2qldI3OH!}}kqN1{>6KedZ)md6zl!a+q@a_nu+L1J(m#IqD`K}ZfGpVv#D z*VmudGu_?!vm7_-m?u1$&eob_25E~}TazfYO02nnHxn1bra{tr5(A z#X4AWzF5Q~*lmWpM)jos8qFE1kK4=Gi;@3C$|mRc(6ffYjaZ3ksk1*}+}d*pcAoMnjN>qLcq>xuLi?rb?z&wfkV)*J-f)%*(f*~vOPwvoHndWgdV{OK!3;1~pF6mp{cr#d(bKMKSA-PV9+Mi3eKD}1+v|&g`hCp+?S;Ru$Gy}h7XxOX? z7#L&s9~v5G2=nH*Vud4Zg&O2B5)GoV<4cR{T-&1{VhR|`$LA5~Kq2voe0zV5r@G;h6McQolNawjoNy*<1Wf%x;?&kL!n4c4FWmrXw5kPVK>I?-+=N3Kpo>hvt z!Zw5nMv{1;jj<JQEuW^YPIGHf*A-)SHB_j5V6YUAO zb@JKEpQ{W%Gw#_f{oqw@=5u7vI4#7O9WB9O?8LXyAP{1LpFHG-{a)N7%>iA`_!T1j z>*foQ`{Q8fq-1#TgyHf&0=iN-2CLuz{l@Al5bN>V7non=vzowSgx`>u)Qua7Cz3Vn zKXc2KYSRBe8;t$7f0>^v$=R;)aNBfR3qE}q@1V_<{$mKYV^_J%b;am7m00?k!|SJK znI%JfBMVKRro2V16QX@4^xs-BN83|uy`Lv>p2a|=M|`D7$e%NPi~tDR zO{|)q;&>rvzia$+r$t?>AR|g9hE82iQ^HmnG~Hnk#S2+fUB74$#cFVr5+hwEKyG9K zKj{j{jb$kyH(UR5Q~s%GHCVND_j(rS{=TXLJC|BfyGs)R$s?TSyN7kd5m^ebavnf* zgY%Kc#@B!4*_@R`Gg|fZRnuk5I_*Jz2JY{trsvmrdggRD19Zxv;SE25&8GX>XZ-!? zuD~icqGq$|*z-AdQA%_<)O)cXO=q60@6Wfz{sql_q6N(spB_S+G=pRGhac~g3IO(T zogP`UM!$B3%f`3;O;?PPX)j=9N^XCc6ruUM%5!1hR)J(f|CpWAd?z1hK|&v$>0ld#grYY6#m@p1yVlHJTY~++}9I$7yq#R#_;?k?W>2lJ=kXz2_BeHUDN(sC- zfy6&84#|UOFWTSnW}y8YZlpOcv7k6cUpG%3RpyB=FfxFz(jH@)eJfUfE>sZ zIa_4i|Kvfvn2F^xTs-FcQK^I4iafS092F=(k@sAM2?2OOkO`|@RAN}j%RL90BO67( zB9w$7h_vA`Kf9>|F^r6eM8q*j@U)J9Uo8R+H(1P;hIYq2ZA{tKUd1uT%{BXH{42O; z7t}zqD!G0_&^c9y>2#};Rtou!5989|`K&o~m{f7-$pe*alX)79eAGBjS9EX(`Jqj@ zPh1ZV2mBgj6wlP3$$gs#_6-N35<3tYx(Rs)1F>)z&J|j|%{u=}Qm?aFgHG+6j~}e4 z62j;b27?fd{l|(RKggwHE}nm?(M11lq9uQHl|COQR36JnP>Il{MqpII)E|=&n%<`_ zKw>Y}8!JZ3s0+j5J_X~J{Rz$Oe3~esjjkdk_QxPZf~(fP4Zd_7{Wk+7#MmRO56S1@ zj2fZ}-YbB6p>tYIjqTf&AH~}BOirG?lvvp>2bGKJ zu8hlbc5R4DKtAD(Del#EgC{oz+fm|cSDwCO$M%UP-#o-`R9O7iAQ)HB0euGbp$|}a zQCf>{loaQ^hg;Tn{q`6wo=nsGU!(|2h1IPct4H-3FvQwJ!da0A4n&ZMN{kRnL;OQ< zH%QbDBW@TJmO|*r+eFFaE_3F$<^e{yGF*NgJ+l*HiJZ4MT1fTa<)ZA=QH=><`CE+C z&iiHZvSJ}MH)Zlf*)XpmL(re5SMrD|7kGd`J;QWGC`35`2C8}^Q6Y4-Gc#2rxh0t3 z)MJlPBG)eWQdq7z~JS!1bqyQeUw<|FrFKC*$9U6@Y?E7PO>HJIjH1>pS zxqnxQXJep0(|zpid41l!H5xK0{icalTAmTZU~VZeymkO8Q6g-QFl>wzl298r>y?u; znuWJ-aDe^&Q2898q(|A9EU*S1k<^^z3FpC@w!hwvpBKRF2W>=^>Z7da63^0H!HMMsrZGRXkD8FC61}#TN2VvCM z2`yHM581==@g=a1Rf);4Ki{66E6{`dA_5_xF9!wm0^e-@Ih)KKwWk(Sj7RBw$6DOW zX`HkaieYn*{v10x=Wh*3nJt4$9%Xxcr0k%K?uEJ4l;##mLG{l?8B&r@)A$8pl}J*+ zapC~g!u|992x4SRAJoO}R#qa?)^LfV-4N%nmiwb$fIf&4qf06o zG`|-?Nx>9y_0WoV|LfN=5Kre;gWf$rQ;WSYWtw;sE9T`vwjzkX)&l`n7s&;5g(VO) znRh&ycSmu3z`Iz~?{6l%d_I95#xN53HixN@G8Ep2RT2%mTxl>)sNfzW&Sgd){S9{T zHbvTWZW3j>!B9$3HA^QEV5LJN$E8k|qW@U`tRMSYE7Pt`9 z8kX^J|IPrRSk#i5C$^VOU&rPwM^}qpZXY!5EIN@}ai+4W3dAGAVYOA$kJ={i0vaZsv})M;>{J~9BS<(4b%tdt%BY0vx`r-%vvLBYCL^zPmUjc` zv?TQ?Xbrutoe<&=^rcKrTr*D}+vrG44DB#*Vo!A}<{I$bSu^QDnjn&Zep4OF4N3&^ZRchH1cAoYUDDMf-zHx$iJ5cauII@y^yWuU^K z_88HiMJw&fqrJqHv6|{Dtsx;_6;XEK)CJ~7arR8E?S!t^E=3CvBw(+Y5m5~YlHfl< z7X65{nymA?zfM4Nv(<5t4hPTDRI_oXbb26?y9OQ#gKX2qkI5ZOq5xZ z^(Yb&4SxYfLd$Y*L{3H)>$&f;A4}jl_4eMna;!9aL3CFQlcyvI2O_+8q9^9CGrpO@ z($_5&w&2Ru=cd+83pyMHkj+hhsj7&admp%JkULtholm}yRgue^v^gpDVhCIv5GnOC zKnC7ay{sZ(m3G`Zd;o~<@o#jgfatsc(Ru#s&Ic*#=R8fd&K*`;lH{-ljfXpF0n~H> zRFCQ)fMU4-4%o2ycXHNT3aFo`ULC*HqCDu|rpKd)F-r&OIdeI`hkc$xCxr@Kb&%D@ zW=PS?tUm8oxs{+xKW_y-1Y9~?253w%0gB-j12m>%|JuD(BlF3P40uL@h6Fikd|mJ@ z8E^nY&;UkR`PX-00D7Qp`P+4+sN@0pJk~bG*+FH7J^gvcWZxXED@R3X5M9Z-{>5g= zPP?BtLcbED;54v(&HxDSLliJC`^^I8{hPn9rhbJznCStM!}%rq&N`92b97<+Nc#El zAt{wI0fm~TJn`n>o8=nTYYq>WrPF^6%`FX2mxz)Xy@A>m!I~=;zI`+db(moHR=2+Q z-aZSb#=(pIJ zf5k_bTuUu~$Lsay$-28@8c5Wqva}DGVvPx{q2H&?sF)TXlXL~sS(2MqF`o;YtvXSlR&{lM zbZdHp@t~>t@G4cmjC~-#ea0Xvyq5;NqW{Cu^vACirV-sI-flZc6#pib*d|*A8W>Sp z`a)3jY7;~E{jLvj+6Vsf|{H1yQx@-%YEE4SnQl zd9S*?sdH$@bQpvm8_gDxErJC!4^#;lZZFNIuf*>Or2{Lw0~T(yiwB=K{E?D{$bP-$ zCY-af6cmfCYa~ycDqk9MP8y~B7^@`nRTuXKUe>c#eoLj`R#g{wsRdMqr-J+Hw=qL+ z8>n|NRwmQxtE_N(m*@l&J3AmjK`AY^qg&c8xpM0`+G(QNL-(#h+!tbl^#t&rZ!6K$ zs{0=0v2JnWZ5HV&pS?bPpergIOv(^v8bVb>oADLe?p+^VDXO1^Gf76WnQbNXfa0N>%%c9zGT)m2=f_rDfXfPm5Mkl6r~cyZZia8BI6rUPPAI zw5BJxq&`c_A4dsw@N=*5);mw;!q;dm4j43V(g1IMLph@XG9PrY4kdKQOb02Dlgw<**yh?_-Bj)^V|3pU$p9MD=+=T`; zi^Du=8b~s~Vg$)5vb?x??>qX6Y#4m=KLre!oqTnX%$?fG+^{yxsJ`|Xn>@az5J+LU zI;d;R>9&_8OJoV%A+rPhZDm4M%R>XQCP8u@D7nwwo;RO^rRq9)DPpdg%r!1gdmwca zG&e4mu$K|{QeB5kA36>KbS7_mfp3luz&)a!Q%B;LQY{129e3!{cN0`Ty+)ocqeh-8 zUpy7g@YLt|s`|csg$YW2qbTbYha2&e#?>Lq&{*xx**R2~%PXfH8maN^@08lL)naiJ zwZe|)rC%ji%RV>1Vaf{MRK|c<%h=p3LYbc^*_d+~^6DEQ*HbaHm1o(;^~yHKFJpL? zv$WjY)+#LWHCFOU-YvSo^exM16uO7n63CQl{EWMhu)TQj+ZoL4fflp7V!_)RZ>PF> zeDA+R9pOL!d%exf_}}Yo7B&v1|9!o^8N1H@&2PI~C{`ED^yS0B#$U?c%D;di>{4qT zG|)5=Lfq9MGq&+#d0V`pqd-KmNJQeXCWpP=!jY3D>t)hjeD7R1w2?#Y`T6N#auJbV zDG|$!^iHq2sj?TqM zYOMR=NbRLuH#4Dg)>>BgeWM^G8n}zwc$@Y`n2{x~UYVyIB(@6h@8mrml5+QVT<&!dZ}2u(u$*eoweYOa<}?x}EGF`XATE4nb38tyG= zbN4>0Fy-S~LgQx{JwY11@mNNSOvwteHJ^03bvZCjCChf)kf_=!uBi;Xtn}N|{&=F! zWttKfBXyR9)~haqH|t@2IK(=gr?Bc~reap#@*9 z{IV*yXoiG?DK?Jywfp2F5`;&m^|4kWN%Co~jQ`zgv~{`T*Mr4TgBzyla)X=4#LJu@ zZ-~EAo!I^9jrc9+@syzVrKtN)%s(So0<@;pVO#zzQKy}WmZ2s{i;rt-?PWu0vI392 z670R6K&z0;4aC|c)J{h5G(ri#Rot&w7uH0|>t+n3(H7IR$T_%Ug(zX4b0V>|irQVU zXi!96&)ckLeeK&h?5}UEpD0-Yf7fKDW^OQROw+_jTG@P}VqUz*`U+&5=FXa-kJ7I> zTRU5zMRN=^_f*&&}>dCyeiA~3b)AJaFQfCfD2J}=$&1-?{e^3lt_kOHR2q8}h zI^_t3{(^h}0^#IO1qw|5b9AD^k^DrNH_zO>D?5}-e+)RofZB5BjkS`bXOA9JEDr2} z)&vvL^t_7@jCIVhP64xU6)V|Pz)W_Z9J(*05n@q+w19j3sM(BWAG%3fA%RK@p@7#; z#^~^(A!^GbG9RLn&5o@}czJ9(6+M{xy8w4X`0u44`(V#tLHR5c;fS5z=1-T8R%VBw z$7T@-dSfxoQ6%h+vRIMR3P|Hpy?L{y#lI*Wy}{nC0T-BiA<-<#L}k&SF65ns14 zAo29pcM_sx8p4wUeu@h@jhMHC93=CnfGHVBGYg_P*502qw)Wpk)^~BG&_x_FgmFX0 z^{l;9$wY+W4tUC?*cjSgpnD*#chF)@je@`E`g=UgA?sBX7Weo0Xq5sOF^sjF#c9EgE6Pid3|QKRd`adtb5`U$8-!Ajo2ZWq7?r~tnyF3xn0LG!le>F= z>}Tj?kaX5nMTnvs;c2t|!oIUmIX@}+C9}5hiy5VSWvko}emy~T*m|VLqbnVTJw&|6 z)02IK5ad>o*qb6BL)E<`sUc1UOaO%mkJZ3nCRp?y4MIkpy1Tb;Lh&80EgxFySDC2) zHj+i2gfdv>m|Y#C`8S3J zM#!=cWDe}#TnmSX=*H54RTHA(iMv;|w&%;j0|}16`Lg&^-tc}yjwz->yiY+-ot5g6 z7To{I4Cg+u3WFb)6q2U+sV-=q)@=NXFw0)~6eY~7MP8TNt%>b`#I@-l9PeVvC(+*q zh3UfAl}eppY$ z(Y-)K1}%$f;yKQ$?I8R1)OaXZ?L$aa zRW6wo#H>=inrN(s?cs!YcD#=f0Rd_2+VEA}z|`L_7}XSKc9SjX2nNX+)wYn=iycPq zST_fmel90WaA!o^xWFp9PTLnJav3s+Z8 zQP0kwl|Vkkh;?^%c8HlmZj$6LbB@C3mMOiomROrQn5|%Bsub5y`!nOWZQOPht{_nJ z)$OT3Mk$Iq1ZnxgrHsE%BalRd3;(b3j?6WCsDi2`J_QHj~e>kSS-;m~3~7BBCfAA`4slIR{%!lbkemA zzNU!fdC3sf=}>%~t-;2H>^EK3LVL6P1tY-mHtj0@hceg9}wI<<6xRpMPcIYTj`iL=Y>=J4_I5%^CD$4ijufVFS? z7K{(;b}s+6FJ1Th^K$Jlwt@7D~HVP=cUy)+M(c8QkdYu`w8(zA}7^u5z-{Z0Lk}=@oy=g+J zi)eh|yMtq{ha+FUdXl_$2UWB2YbD*-E;vdvZc}pFFnc4-hzseTJ`Vd3P`Q_U)l|Tb zQ;7S;Y-N&US!ST7brOFydGm>YWJ zQ!5?wLq}U&1LPXi4lJV;HLfC=?QO_^!(|N?>w^B^%~FQ4^1V4t8AF^p{WD)V%Aza9 zz|%MmOkbLM*cWyTWLg(JkU+iND(z?@QGQBl1sSN;xumQDPdNHTGnd^OZl0mCQJF6mO3G0U+8-ILOfTV z5PAeQ>}Wn;%bzbO6(aji z_)-%!^KoUAl+qtm>tOP&rRp9gNpudg5-}Tj*LMj9!2jW>|wUL9^B z$UJrp=;~gGnAg}dZC*Sq-CMm?G^551X&Mt%JbR*@r&GJgQ9BqIB*(j{puF!dc)WmB zRDb*S$Itp85?Lpo=j%H`rM_wNSR#e}G)Jer1S-+f+m+=QfxI;7ojpgvvSM3Af&4l;A6 zSZ0IBr=ZUGZ}==D@LWR?wH5+;9J z*-Rqc7_p}x^kjGC?X+uiqQVTo;~~h>IG|&~viElhGdinG#pmMMnMCG}99daiD>7CN zF-8pB!~hFbo6?j*4zHLxVpb4dB0((gV;Ua{mPK@ z`~6EA~_Oa1h5+JgcLKe;(aj7QQ`&! zPmBYT1rioTM&L+a@{?wuB%makNflGY|Fj`Vu&HSQ6NfC#4F^BC{u%2F)9+@2PN+Cy z-Z8E#dK9sz6vEfs-eB5c&DW=&uKHMXVYTw9DAJMQDEu++$%`mrc8og=LHhFC2>C81XjpdsM0h z-4Pqa@1e&cG*3B}ieim&(P*q!Mt(5KtAJUlVwBHVx5%D?`N(ibBmS221WzGghpJE( z*q=rvPzIe;tSm~w4a>4}C0Gm(+XXF(%kse9`ZX)#c(udLIJ3Flp?}XWE4NQye-B9@Ejm z#V0Xu-NI0iRmp~5l_!a0iJj2tqsF?f$b^nm0bM=3Hy>U@^Gs5HZaGk)<^W$`+=_DGCo7i@kHx3UWrT4evN(%B3C;M4J z(gQWRc+t%_B1ghOFm-t@u<}Pk1`-SPdr`~J+3cBKv$hw>fbfIEea75K+Fy@{(-*PPCU1 zazMMHxcs_*@Qr3FC@@k#vnO|RfoES7@P85ePo%T@0??owmIU^Sur(m*7 zrt(@C29y*E?kUrCr|RelpI!tJZt}aATIzdU?H(p+@`XtwBSA-MHr^uI_F2uGXsE(^O#V~RbLx>&x%1Q3Z zFqG$R@va~%UXSKA=|}`yqH8$`Pf!S`6ZG-%6ghsMeH!HxQav&FxZo>E`*fTS;|*3n zs-Z2j7=k{kYAwMkSv_Z*JnT(P=)^M8=8~+cEXn|czGiA}Y=DVkm1%&AQkX_VZ_7>^ z1Sch2%SU542iK5vYjVFzrX&2)h7fx48V+}iIpFLAM`FEkTs%hH(t8aI0+C$5fR(X!-1h$%d*>KYgCJjYY}>YN+qP}n_RN`?Gq!Ep zwr$(?+_P`rzPy{=VhqUPe6br#~T13KEWO^h)+OWqnEkNrYw)b9xNHgiBJhg<1^s_S3ioyYvDoQ(Sn4wsea~M1b zLn+8$%$tybz2Qh}9CRcDoxTY&qS$y5Nzn57od-4yaSVpx5CpLp2ID{k;)rT0N9Ol1 z5!Da3eLF2F^H3d^Zn#~rp=Tp&A*k2^12XPprlBV@jeSeXgISd{1@s4?^)=m)FMx%3 zpdFA!Z9|#A5;4#e{GjUT-!?KO&<%+tuz=`G)hAc?Es45qPK1GScDeaSlW+`1C7dcjW|!+R3I3)bS zhlAjo%ea@AKCqT^KF9B;;_x&$440u7A}zNUc1l`RLfT;jt&%B_f63f|-O>=E&iACl zA%=o_@Ux)XhAglV5UwdNZ?#{3F z93lyiH_2Q;PK^Y=m&}v?2xRlpXr@R>0qnjje#cBK0$=17g~m~VFWmsN&V&__30T^X zgp_3fX+ViKkcAYeolZq*dRi?&it3!&Qrl7dR#t5adku+1b=GvO94NP#is|TIj%J*) z8Kae0{*N3Trc)7TU@_JYL$0vw4$FDd;uOp)GPSf>SxGu77$duqP&lNJ*m#6ej}!q0 zWTQ0`_v}gKMUXgZB?HDZomB(OECGyv#*N@R+QQ7Q3h%p+X8Fmuh+qpQP%?q#L^R(* z#CEg?S7tQEtN4d<*$}^hS}6i~-I4LAO2U>USciP@X=D^4M~JirpgEaJfYjSFXv=&| zS8RidDiW})$T}}UOTb~TJWPjlb|OJQ67gT^R*@3H26QBO&cPTc8zZB^1qGL$9X*7V zIPrw<{khA)Ko(hZ@c$M2X`~1n&wK(q)>jBB;zt_fi33TEcB7FgheG7gLzCWb0^ok| z_^jgJ7^hr|?{Jl=6T^3K69VbK41mQ^+;~TvIyN)Y-Qa*lUJI`M(^uquB-9-XBF$zr zOr*Nc$Epp9P>_&2{7lBP8bQWAp6*hE+Svo>@?J=Brw@?6hW5cNNRwiD~jCG56e*?q&F<6R}f#B%srN?$D5Z? zd3CKQPR2DhFPIZ>O`;Eo104wWFf7qM4b96nrhZM3tI;6rXD*kacgOVZeDzoc!x?_=4nLm=E`PoU zcezdx)3mC4q4+2+;tpRD3QG248-7p2!MDAhfy-?>l@VoJ+Jqa@x#ceNW!Wy7a!KVa zXiO<6pl|QIb=|hq_m0pvBBK@|-mEwXabT$%+KB6{Dltm>wZDJP0zE;>W)a8Ztkk`=19}pw$6b}@^;us8s z9V)OB*ScZNw8>r+ke6V5`$%~U10(W$)Uo}Ok4M{Ha58)Y{R~#9^F0*6mc|(_ZhNaR z+ID;fdez24$^*B{KZ;W}bcS9xQeH$WUh3%G!Nw^LCl?s8tNj<4v7b;_w>z5LTuhYW zSg~k^rs{P;+1u!=mFfnyJFqKy=}b(K-CnKdiW)8F5r~piu8mT=cA=vr)kVK$x$$?j zMWmI+0y|=ZM=Mg})!vVzcD${q^PrEqY$xkOTPw{cEqt?|1dKiW{&$Y7XeMbhU>QX= znepGX5arC5ER>~g*sDJAc-@#cD!9V1toH%&n8OgDW0l6{y5gI5QKu%~Rv=vT=;;TM z_7Lux1n|l{jKj#e2nWamkkj+ce1uKNryg!oG^$2sZ~eK+jbrS?wgr8*xO$;14x*L}9X(^Nv{Nyk1jUUj$^#e+zAsAS2`%(a^Qy zP37$R#-FWcpWoUT$;%y_Hphxq17;`${vvl$$87e6hD>B`E`2sKQzKi3Y$tXN1@r$J zb^mcPW;-Fm;$krBPZ^3hh~<@kvpe8~{fAmVe(oH?z#PZ}P#nx4W|UDui*DuFYe{|SGLy1(Z$qcIvW3N84STr?~@ zW>A0GP=o0Vc_(OR$JQxU3TmCNGvPL?&HoNqw|+aa9JDM->j^uzPU~qQ0ybhjx3;Dv zixBK#4P0LvRZ5?tEpH}6=_xbj|97!Bm-x};+MixujmdXABY3|CQunb^^|!>X(buE{ zl#BzBk=oxQ%HE>lqJq~hUk*oLXyib?>|IJ}d-4yX{<&$BNR>+_S;kkNwaVBbnxOQt z!lKhv1)pQ}b(za^S|^UVWMXOH;d%UMvihO4yISjTd?ofOl%qEU%Xn$d1xb7qW`^XP z(vg8?mRXRr#eFNiFru=?O4lS2O_dX5`xRx)t&`_9!kE1L>fcCU<0|k{)l#fbhXxW~ ze2lrhLyaA!xzeQROaP2onB$Iv~X0qu4PBoVN!s^ zP|opaXO~;X8lISw6bBTQBa#(IK`P615~=~oRzOuMq#ByOnVL8X(t{JHb^jhre+Hyf zgOaTbH6X)sP+{zd^T7BgKU*U`FiBJN<=>o!-Fd~Q5U6BQ)YAZzf+h?i4b6>wSF`5^ zNYg!R@DTRtR-dWJK{uSSCq%4e;DV*Vrw##WkuupfEr6P2BVb`Qq8Slw`?A}#vwrOQ zs6cE-&g1n(`Y!*o0%G~!Dj@m$7oDi>&9&C;c9yE+fAtRl`KB`<_!`(*t$z1Y{5)X! zc0{(Q$(2oYYK)ns3Cp*jIGLb~KvGddz!^~~F2@?SbH3A@9$TV;z+f^Zs?XSTl;$U` zD_M3s%H?`is;zGD{u0oUnn)>G=S9HzruWI6>7T(?Nl>({~VEmHCM7R%CA9OvZzeoU(1lgeC2#C*2rMcZoowM=+f6VB^kV zS+6LS!6+T~F9n3*VOvaeZR>`MM^_wFHo%#te7ecahd>b-qp{4SK$cY5k(3A$%ByV< z#$H50xNMz_uP|Qbw-KLDDTC+PO=lE}1n!`7CV@vPM>Jd-9IgmM!-ex=zWf^&a`R$|&1%pw zs;U@{s-Wcp6&!08lQGM>;Mj*FtJm!)F?~S{>$tzQg7(U^)-Q4ft5Yazs+H#Jtthy- z4n$n)VRgn6wFRPs@d?TURWl{Cth^h{v8Xc~^I|w8kCEOs!!53$*UL7c#|(IXyVs45 zRd-bN3>j?0tZUaHJpY=98isVi+r1$hdV8mXm09vh3r9)dR!WpD$rp-34rZR7k!mG5 zibTq&g`4aI=S4SDOkHRQ8&O*+ChG=dDO84!mL^!@DoF`_a|Z-9#YV+8gyW^THgJKM z9j^{A6#!sgFvNkcNiA5cbNUT2xnCqeF7pZFN zk_w@^=v6~*r_3r>g#@mP{M9oR&~M;6m1icP?$D^$qH9r8sFHylmg3WQ^r+#teJ`&W zEKIn{%4AijmpWd8BzU1Ljy+YrNZJ#TUMppqj*eO6&6bL6oMv@kC!I;vJULzBx$F({ zcWSy@e&6{xJa%^==WzVFdp#fGq@D^aKcO5yn(bN|L&KyEHz;cvIA{J98`mxCR}uyD z6$E~pP!bZHyTPapGoxF-)DS~xuA*L1X)}8Fpp1?>e;W<1jDIyw&^NH#c??hcqaDi)rM|>5r zD5HqFgi9u}RR3vrnt9FsEcQjw>v)rdhVOhhq&j>^ZEl383tn|qK|O2?_1b-KAMA1+ zeydpTRp?;JW0f+OT^ptNrk1N{nbDrpJY89>unXUt-rNd*scwxLOO8)FOZi2B#k33E=nq4vawOZ|XT-*;5=6{O(}VZ*-URQR2G8r2A+>NxNcj~A0upO+%3DP`4Z9#v31 zB-X&m8_rD{JD`vFno6*?E0xGv5>^8fb7txwK# z6V^WIJSmwvqSzz(0|~}U#b+J7L~lQpbY`?TXVp2F)sY$%ssto2~1F60`I!VMv@>h#ll98}-k7_Q=Z4P8iE^@rp-*DzDbLZSDrBt=I5iCI4XM+X zggVHP6sRDu?6m~i7~1rNwS=LO$4!fhkoscZ;S>`=8%a2CLep0y_6+6yjIr>Q%Zxp2 zH(7%;2PgauW4JF$AB#(OSsrSyHWm1(ry5AbZ>{WP?Q3RX;_j}v8 zvCMv^Kna#@e@A=QuEpf*5;7O{>ebRIyqhf@?XZ_#A}SA=GPBDZ)K)7FShC`&`qgWi z_tMIuej@8PULp7jFYNg9c2AvAJ+E7MsM*Im@h00NrO8xlpbiCQbQ|OL*|H<{oMWuo zwl$e6;wYI{7ZWX34(b3>wJo2%5Q4a;e-DUxmIbi^ja(Tr_t~=UrR`CI=1sY*UhBOZ zi_HU6u;n6)CvMTH8ML(dLrLG0`d_%_ftk)hDV{hR0lZXFBu$H4-~=@VId7B4`|gF0 zzfzs>4bR$AhOS#lR8?Em)kgJLQls@&Nep=(8j3|?nBqwe-&RQ`JCS+O%M^j6WK`vf zW(D+xJ$1SvekQYq>Jl?Sok7Kj9uP@SI*fW;ybb>tFS- z8IzrJ7>xu}QDI`kqHxnL;Q4Cc<_l#h74>!>#o zPS^is33yLTB@TQ+Wtb;sFjqCnTO*4L;@3u$Kvk>yVANWQhszdg#Hk7uNZ`asqU;Hb zwSbxSg(*t;a)oj&x*9cw3K`g9DY`!IPZjkIHZP_yDOB!KQ&^P>rF3_oi0f^|m57KkQF@O9@?Q1(tKfXcd!W&EA``fq1|3Y3Gm@`N=4o=QaF5T60$!AxH zOzmZv4gkTn+Sy$#WY5pKfEcU*%+33x%6C3O2{$nmp4grwMnP15o>mhHb zU_->yo$Cu{k)!ns=GqG-a#;LZ$wpFQ^5aVmq(Hm%i>de>N)Vflc|49@RPgbrLU^mq zkZjkF1%@~X7t+y@G>Ot)dP%nAin*;%v#Gm|Z6Z3qw?Ao8Ep*?by|?}aL==02TZoyf zHzGl0D)e=3LnYl_aP09tJMH)h>mNS|+O|@9`pD6%buD#_3wgLA$rG}r*2}tMl-eJq zLkoeI`}|?_-^xmoXHPffO%JoF5ul(eKB7%flq=jv$05y9^)LT{Yu?FQQfgeomEV9Ta*x9nci`jb|2G&Dz% z2H&|4Jk=@WfBGL5i6loAeib8+h}%x3AFx`dfqU~WZxN;E^vqMGP^&1Cq>?E#6A`6y zk$FOD^n19ZR)~|mAXHT&Why3g9JRhnb0#}tDhF-8@zRfK9KMZ)KKNJntW=4T7w7nC zlewsL7$m?n&Xn%?l+V}4NcBMBSuA?}hVs6JYdvRKfJIb*r$6gl`aMbTX)Y67CfkUM}j8s1Ec^#b(luODy$P`9Md%&2t+p54S7 zVzQN7Wq%bD02k(}n3+0 ziq=AaObMt3i$mRlQ%pg0-9OM9sRSeaXMXTc*jh?IPRjc6Fjo(hOj-c)$|=iAf%q_V z%3|#~?ZP1MBSj|(c~2le6e?<5;vr*7lOI+&hVDkg%2!;T&p}-bhChO>pRj~MOzfLQ zIJ#hDgsHfErr>6sQSUxniZb(dFO+Af4E*OpXs@(rcE@5BIEbdTg(=KeR!z!|XD%AB z?VYYMW2ww9-B(VTIAw2CCf-W`UC+E0z8roz8UKf8tab*yc06b>>E2ZTs`gpsa{b7d zl^~U&L{3T*>Bt67T#pK9>(oU->%kRZ>!bNu6j-OWg%7c3ndPQ(*R1hi6K90?VACR_ zW-cxJ?cl1Pox2q=_0HH&(kScJw^KeQbK6F(>E%s{YnW-PD3-8RtKpP zN(zDUY6YMnEe!~7689gbx$(H2R4)5Wn^i#CXD_ILvmhV>HwpIo93X<0A|MI6=zw<| zaDuG+bFjE2JOdqMV-JBnBp|iQUqN40mbE|KBvD^kTzb2-v|gBhJ+K6W5!;~CHr+jt zVC|_L387=X~htHz>$*DpCVYH_Puyx!SwNcAfC4uW- z5Op$MCXhyI)TF%3LjItk#75(ikgJ)zZ=%;(GChA_eDNgQ-3rdY{Pg}l^Lyg3$_A2U zoM)Pso$a8`uPf*iOz2r9z?AX+#Nzn{&j0#+LpHtp=Z1Rk{&x-t^Zy_t;ACX@PYMXZ z|Aj@nhO|90BSO!q`kRER>BYVE6)=)efkZcBleFyR?J>9IGx;lC) zACoZT3X*XX7(I6|NLjr=Yx9~w9ts?g<*o*Tf`B2wyo(roHezpYaD848`sCP!GuXs~ zrWy^Rj6}UrE@aFCQ3K~}+cux7=Xcuu27smRQL}W{j!`ItwImt|RlSN$8CPen=4^F- z;AvsfyWzwLrZDir+suU+Rq|vt@WWV6V2U4?ics+3(v?$#N2Au42EivG=tDXZ336nT zDK|0SHhqnKaoZt&Z3qZ%*V|&o4)id3QU-o+-KyS4Mh*2mDG@0hHlbz-=6m&xK(k8Xh^Bv*I_2Ei63dPvSW#ts zH#lFc7rh8=QKLlNf0a&LE0%i`ElX0YO}x?yA)5ag#Z+*ot0aQm5;`;?Rj0VVh0Dxz z4&Y$=j^&)$`nNY=QlwrLo3U!vZaNM)`&-ej9vXNORAJn$w2z0zDNW-Pp=h8(iKmu+ zHi$!Eldg?dSho57jksD_&u3X1P>GRyj9jx!^x&S4$0c}uF)Dr~w@Rf~;fuLpKWmK| zAK7=>qRW0w6mm1z)VR8A<3;IhHPz0Jf6Qmj0%BfyAdpQs_|PxO;0@F+5K)M-Zd|y+ zDA^VLvN3xH07$>-x0Y+Q58sUXWAhaO)A&Uu9)!fBN=SJj$}i|l(m!ZQ0UC?R_Jzf zj@%=JfO#jja1Vdd@AM)maw%(3B0bpdm5_WQ&#Z;3eZ%q;YV`nlzlpaxzLcZf?Z!sM zWz&L3J1_ANcLS$arOSN%;eWa&KfR$xE~mo$?|(N7%YS2dF%mGcFf#ntI0hyHRt`?4 z|2q8}*YICk0yYj7&i`8?*dKRrg+%RDR?#Rx!6FG{pap9oaKsRRpeHI-2n2#8kOTpW zpr;xak$5;IQA(vEsasV6FXZzmiR1(HZm(PK-QV2zo^hFk#@7w+T-O<`*{Q+tl0y12 zgXpHPasosQ!8!y9Fo=1TC3e8z0D|~31PBtKy(5+Y<19mea)2x`1{ADVk+Cmukf0zz z#*u4+} z-EIX3Z*Um9x!hg>JZwDz4J|FDJ#|ine$cR>O#ws!S&9+Blb}osU{|mUV%t52nAKjb zyD=^Uh8m`U0Sy{8h>IXJp@OSp56}P&juF5zaN$7(JO=GO`2_*mGUzLKc0vI1xjw+y zAL_!mra^;z3Je5vhp^2)1Ph%%+yiJ~KnEkh&&wRn`Vn6QxZ9Xv%Bl+pL+*zl0P-O=a|Oznu_7zOy#)4W6s&Rf zR(J9RP(gJGP{i-q1)E@@ZlVOC^Y>@?C82(8g1OC2Luf(H4}gRX<^pm*m4gZm*xG_$ zk$#+eRzrMa_fykM(Ne0$0@!x8-(bO20 zloi@0f5RVlHAO{>$mhfrM1UwLXu$@~)l@(zNQvN{zTFFZM z`~2-Chqu??(F0D|4}Jj!boXZTdI>ocJB=N{=0y%{g5K=UeAo0_)I_*8f86C@frr;c z01e|3I|wvnAV{cw)PZ8v0=)-pT=y`r!+V#WPT3rYv-Tm<;E-T{-|za90|kDQ2iIpu zAYTIn4{xs2p~9S3d%>xRZQ@(_Z7GQ807D8C6zBoufZCEd=D=efD`}@5Q^x`agdj-3 z)PaT+pFlSV6$5hFp~0d7LlHT`h5SbVe=lqgV}`u$gWzuqabL)d|Y^^w_Cs&KMNqb4Ce zDOGz0@?Ew$_Nna|FLQZ{$J<>c&B*`ZS?XT$Hlsw>p3O{h94X{e6NxGl>_;dqYz<{gv zc$2XkL2z2gi5+5D8atOyQzhZc&p=QDpPwV9=RX$1rNZ@_EXdpfoPCG5CdIX=8X9?j z%J&ci_$Yi3ax6?pXj86TQHTiM4NX)bOO)jvBoQCjNU?Oe97awFyYA6FM7*drf4gp~ zKXT2wqZYJwqTTq2$n1z@196n)%9gI>*}5>Url0lrv`FY)sU+Cy)Ix~3I4L(hL@H61 zzkJsaZC;}CTCa8>BYgS%3}i$jEbGZJce{6Y>6mZK+Y`_N|2t>-Vf>wkD5U1;Z_a6T zj18kV63Cs+q^0Ckre`IQblf5H5Ar)$ z-TNn6G9kXA3AO%#e4uB)5@M;Z4uxlev~`m2_+oD3OQ$W~tOgL7^rGHnI0RVm#7vaX zZgtDDxLGLAO4c+2+?GZQ`mQQHT?->-eal(~4y|DV#4gVnMW>aKzj7&}pMhf|uT&r! zp|uL6o{mTH-Nm!jAlf9Je7&xM-QbjgP_G|BxjcP%!w_!`;(LG8k9Flm{U`=7gmbgl zz+s1+9z54-e+$7zP=YoIdS`2mzI3boSX-I(3H3T3v^IwsrA5C^2cL3<-Hjx}IF%aJ zlpN`-$Jrg*>=vm>m%UB9hN(wd3&3M=%&+IY0lx1eRenv0LQ3g?a|)qf!4ke?zA!df z@vyv#Ek71ZPVPiG7*GV{N3rRRTpI<9<~2wrA0iUGKx4GBW&E~!b++9LJS~r$7oiT> z&r6Jj3R;K{YZ{Yz-4{ucYuh=mrD4@T%c=Hd*<=E?s4EPJt2h&IWoL!SY^!ly7xSu0 z4V>tVMtdY|EC(<17{H(9ew%5ja@EaFDQ>96zgUrLClRPa(td9_pL~d zvG!?BQ5v$G^tSK1{~m<2_NS0bkjtWv4hx5~IRso0GKmUc6&x zYkyEuaP>rT!L*j`a}2NBT1vJOR`9@V-bGyzLP<-njU$)p*NuznBaPPl zU9Up!Ddm4Z>0Bj)lmT`$15(*j@mJ+MBj;g4v15${4#p$QYzqx1?(69S=te#Kz zxdAp##@TawlQF##m2q7F>XZlWWEx`@X~Rf$YsTP@YA1<#stTJ6tDvjTn!fKa+$_qg z<%PbOG?HDtbk~xKbk0J16 zHjOBGi$B|x{|#XrVzMGfdB1`hTDa&ViYc8DDKhTVnI(`4TTU7X4~fuOPiVlhXD3wM z_iz{Br8UfNdZ?DctX?xeCg4k*gNyvI-lArN4 zItPaa1gakk@vMyqfC&>Nt2#dsb7>FxI5}8ag8RYHNL`RAi6=Wb>vxw?w3iJ<9lF}{ z8R3W$)m~7p@zAz(e2Ac&R{Wr3$-RQ)WPT9OOr077%ySX-W+OUVHpnKfj_^`|CNcD2 zEsQkgU{M@(^azjsO|cQT&!g9}=2O%-|D@`#Q?$7Y9&*Cbs7_Ki|M_7us>1x}0`;v(>FU5<@^hOB+mfygdpKR)9V}%!I9kZ?fWhqz4Bh*9 zf{_&Hvo@`-j~}KV0+UPpC}>FF1d9@#FeY83o@L6$i#}gFc|986!aitllEyX2xV@&< z?HO!+wv}~rX?hD<9O-s2)>L=S-CcCc3=yQQ8@d-T^u9@N03z4pNOl6O4iW|`FKi!& zURD~qF1PXNM{^N2=9NjGy)xFlu4Gvh7V0!*YCdwqgNmsN1;lhMeqGk%DzGDA1l@DX z=VGA<(g`GA%5#wo1|2p^7m`$}MK88+7uN0=2rKEFD(1=EU9SxtlLn?J`1SHxi}F$I zdjK7l)bdE<=UvrvouBX;d{V6NnHOLw?GTw>^V@t){b*z_$F$#)r9aBSA_=2_gpeTz zFYZ2Xqr$75!qnQK?Otm^lu_EA!Nj&zl+x2yi!`{dZPJ##K9i|ZHzjnNkJn~iBQPrH z9B?l`;IS5ECi^mxtMON)uYi<`PvdD0E7 z=tnf;TkjA#^~210>eitVg`Vv6sJK`3zjX2X&20F|l|jv`Wt2~*({p}j5j4{C3u2+k zN-SE&>P$>_X2d`QJY;V&Z`M_H_)&AEvZSw1Nw|Mlj1ys_&x$jUFhZiTSm&u2=Cr4}xj1eQ zu#c2c*dDT@DGFq9RUYycSZzwWb#4^x)x#NlIa+l8`s#`9wBHlbc`GT}l|E<AeDQLMM@^GL? zUBmAU2Lb^WT4&qV>^YvcOh=^T*2{cwFHrmGVbL0n=wKvDX`r2w!^f1snSE$g)+NrR z*3LQ#4j4JQqN(Krdsq0DX8ywX4UL$XpSnm z18Ogx#eBBDiyWRq3?nWOh~;@jI~Pr^zJF_PKU*A-6AVKX?hi^;>tUsJC-ggYCy4`* z(G|P(Y|5sPncZFM@VPWAPg+~`5PA?Sl{~Y1~p^X+-^$jXX z-{2z>7)5*lw*tbjO8MFQn`s9w{+yYUYB#KNJ9z`u&z%^WCF;b{b>!gP$FuHygnn}} z@zvDVIWN$yei*JUEDysa;UQ*uAb$ z-CR@+M7s94Xi8r;Hj5wd807Jq7nh4}p_WA=naB8Aj+;(l!U!HK(apzA=Gm3-DDWqL z!?k2UH-WwAxk|XzN6*pxDB2qGLsQdb84AQC+%4wmD=tNDKGla(Um`y>* z#s#zks&Jz4NrgO$GK@%>p|*2Fg%JEClT&!rR=oc4CfFh$1Nh)=Ug+!iSwlWB{+p;# zBE}$zKBQFedH+&woa3kU0&2if{un-qN^A8HS2)ECnbb`C8K~_>vIuS!aUEF{U(v%Q z3+F*(Fbg}Tber@&i4{4h35b;=CYO*w`2-++mIOMAAoeTaCNMQCZEZA zK#HKzwU7nPa}T^=aix-ZzI|sYbC@#{o;`%McmKY`GT>5~b{!UDRg8jF{MnD(y+6}s z^ld<7lh>ZZdrsM?8hP2c0fZeWmybp|?8s&`;5P$PyNNiw8o>KLT1__tReBM%^5H-y z`D#Bb_FXgkO*T7j#`s>6pq?00sg4)pV`!x<@!l6RnmGH$;x^6*`=gTf3J6u^TYQLQ zF>=^cX*%$>jV2JWS=*H72*T;Ss=m<19Owp{qO6QWT7mM9fE>Cu<>ETC5{HzUIv>6* z1aY-F_Qt|`W3tP*0|X0b_XRzjoGkq{4>Cz-4wuCmhCYNp+72cP0fQjpy}O3sYd_hj z$Z+UfU*G_w>C9<#gJo3Rc1yL%3xmCJUH;aBMID2SSFMn8lND~=s7#!Q?>50okZZ?| z4f~RcRigLcj>l-EK9AdlRFcZo@GH=fvj>~}-9Sz&DixdaUM<>QOeL6)Su8b+fL)-$ z#g7}|Hn5I|nm-XZ`vE`k9&QLVO4)THH#|w|CmMVWXl3vrC+3^cZ0+Pp)jH<&l9tRz zb=qa(%YT?IoLP=y$6tIaClFw7)xT-Nwi#Rdh?l?Ro$)hR$5F=2ylQ=Y>Wm zCC^@|Bx0$fm+E`AA8;}+-mhDMR8w`j7jDAuqKYqSB&bUlwCNC6-4B#~biNm&IZ9kZ z{e6EFV0yigY^Rj!=nbm)J#okA*~!T22I)j-+%&?elv22be7hstFz|JuS#co+DfC3<*Xz+w^uJ z_wul}6SmbC_^$7-rh5T!;2*)^S1u@dX??gTjA+qHZW3DzjVznvn#A{T??9wZYf$qE zTWHG4)&{ZqhqY}J^3#+_0$fS>-(y&Fgq%A`aZ|3rXqj><=W$*~t&bCx>Jwc^sPz7a zxY{o>CT%i`doyT27-lzKjNmiySn8qKaQ1F^g1V*F6u`JKPLPe#VwZu*(&^ogs_q~B)c-$EKH2j^~~j>B$#ttqqNJ(sw~;4etkLk(g; zpJJXGthfVj8OBRiVurV)`~7vE!7^%p+=rtCSyq9fn!+?qXGfAz9qes(zhWn=8<(hi zZR1M52$q6%j7o*@iiVC-5=_dRjJz^p0!WwXaW89vr;zv6K<*({wFCrP#n*>ODI2&K ze_E&Np4o;TDZ>qe^O+d#R=et=IvW0p4b}$}E=xr`Hw;;9$mMSDpVsPY%)euYKg6)GW=8M z_X;n{7TWjOL ziIKnbSgF*T1Qaiwi1}@L1s@1ngb55SbZS9ll)PBm8`pSpnO$$Au|HiVf9 zCl;B1)ae+SJ=-QT^U%4iaO37~q0mZU^+j<8TOl)!!wfxbyiuz?;x`z|;m#jeb02EL z@ahjh6HOBk_nc6QL@EN`+il&^yZ@6vY+trTzM8Q*+qwGLvDOEPCyzu{aRgC49Gmz7 zX(zfD*3PaTOaCy@_n>KrKxm%TDa@g2y3`?)=&AX{!4uf|N77P4c$lu^IF3AENk0MK zvG#EC(h1CKxvY?y_&G4VcZX$u`<+5tcF-s5PDSJity8zXO-b3E$a_k9DFvapbb zJrNz-1wz689-pV7T{9Y06kQ>5M%~6W+E4Lc$2`?-$1#<1tYXmb#>X45U|=lsZzHuY zJj8DqUH&x#FCTX=F;CoI&kpKP4$Z-)e#@Yo7)}(in#cNV$5iRz#CEKr$Ge4Oaw!-g zsh(K^42dx|46JujqH+|RQX@g$r8XJmfO&b-q)7PF@&0gOHruKP=+3%4#(5rxMFv*T zQwqTw+oJF5uAciNx6u4fq8IsvTtdTxmlo!m<)EvcMwUqt7vcoQA4%f-!;5Zt`)DRv zXgdRSZW~?=g$TyUUXs6NaTb4Uvi!(QYkWQ)NE?9+U0Jo;oft{i|9$WDZHz$M<5dC> zYy-)Z`T=2x`D2;L^aP0s{q5e+e2pK2@SHxAaFX!AE@Rv7{d5kAFj_+Y*Q%1XEmfTI znET+aRHUNgVQ-C-uMvD&F3!Sg5MNembZHi7)v3IlNAw@mkey=M5N!8&&g+$mnW18` z2bYY8`A#?9y=6RLF6K)%%pfByDUewtWdsB}>TTDQMxIEC;8eS1!>b%g#D5+$Ze5&k zDy#6CO>Za9mg`e-vn1mDFhuqI?rQ)?7z_8J1$9YaJsE6)995Ir@7#AIFOS6D;khu% z{1tk|HDWg#F`BiRrPf>SN4H~_YMi)Z*^J~I=el^e9hHGhfl2rjK{Z+kqL5rf{j1;5?69~=&Mho zuzR{D`TfG$zsgMDe4yO$B-pzvASM=K^K?wIBB6b&S3e9cT6G6t8Cbq#e@i#^X7>$m zHm#ZeKj3C;{}XP;%J}~wWlRK|3>@tL1(yB)aWh5+29E!9Q20NC=YN_&6?86u3@8y_E>86W>6CSGa{?+o;9D_*z=F1UR~ zXt3|kV3J2ba5YW_9m0#aOkfbu(1{!n4c<3QKSfF~H4eFVa)k1c2@wbdY!Zm~vI4;B z7Qh4o<0M>|7}(|^d~JJeAn*F)2g;zu2-p@90;2H?0WQHAocE$8z#sq%(Fn}Rui6B} z1?WPc_Ck>M+N;D6wb5@tH-Lkalaq5LV9xFav80w2iMnSA-w13Gyd|IjAJ4kiY7)RT zhxwGs;>N-iP?O!gnG1&-0Xu~Z0ScG{Bln_4P`9ZZ!M%nB0?MNbenwFa#G)gx$3I@- zkE8+UuL~CtoqfrF{uA|+J%;xs&M-Ftb#Mg);=LJc3&{2&M-UL!Ma4Y@Jpu&~RPB!( zC}$U6>X8RNw*zVMF7kGGCJ@k-ga+_dbVu)Nr>5YIo`&6-*}Z802d8(DN4F7YO$+Sc z3I=F!YtAoMegzMz!K=gFKDIaG5+cka$oEH#?Zv=4bC;=VTbJXh@1^F3fONf=L!PYZ zcf&@I0RW$zycD390N@A;z*BSG@ry3+@*3!4aQu1mtEhi=6!f2QrDp=*Lt`r-?|1%t z8z8R$0LBvT(dnc7XfGlbI(py64is1&$ofX`{7>fhI84JkGXFEa)h#H)i4PV(9l+`B zuK$iqF4+_oklVu#{dXLiGllgThJ|Ir7wJ2{oTX(1dSCdTIQ+hm=~2kNgM(902%he@ zZ|+%tyFL47e+|~a7ys-Ve9YuNHiUq=T%sJiTYEx0e_60Yed|GxH+N9iu|=L>fS6xg ze`Gm6xyn-T)!#>?FT{sm_RrqNFa6P9e|eJIo1>@j+Mj-WSXGbaRVR-?oaNraF@F+y#(k1z)$dFuzPjy z;77m?Yrp7xu=wC__;-<45Ab8qdjUVd55OD-zX3o1aIgG(y-ynL!uj%@Kchpuk>A+A z_lAIhT>@$r(9Q_de+|Mr_FgKrD3#<}vK{L!J8*+t$k=j0&&Xdh(Z?udSl8`W^HP;4 zg?ZN|wVh(n6QYw|`NC;o#|*0_wQO5^+)p4kl(}s!^vNMV$)n(kFFwZ<$Jbm)-FX zq$x}6Sq|X}$O&w~8zv8_QRycu&oC=n;t8MP+xy4~(;=Tn*vU9nW*1$Zuh%1Qv^T=3 zXHcJNbu^EXX6%}d#qs~?v?hs#+Di(eGKzxTqM9z~0NYPx%m(7;ye4c-3nRim>=^}m zIncL(o5dOMi8h=es~qS)(+d*GIBfkl=ha)1eD`+OePk0BlYQkt9|1(xDAOGx)LwR= z4c{Xn1H=!ck;)NSviD8zFEK}1R?i4$^zD^cNw@(+xvR0QhlnWKGWosH2Vd!-cl%Jn z3gZppt$Vy%k`YYDxeJMRm~_DV5k|VmOQvoAp^o8Lk3-{*^efRi39<1h40EiY!Qs<` zT_27;mQ>*)=dHm3%|4ur>QZjb0s(W;f-)+FNpxl8!nIXvK580gj{Ms3o+9rsij&dB zOTTL7hhKvkLC6Ump39c#PL`8zoJA2*Ub#mGK=LfoH)*MkhI=NZPzT>|&5geXS{c9Y zWmG}Mlo4O(0mF7(B$&6yaejk>#5<(PL2N?4SH&?FbwzF&2`l=;!=4tzTC7dagn&N* z{U%M3K;iDokJiE+1q(sL z!M7E5{_H0zJtBV?H7cG|hL4FfG3YuEuX0*X+EkqLitPz2?zw5T{ z@Q;&6*t*vFn3j89iYPCe@uG)oiUvTo6}GtQo7w-mVB>mFOs9MmeeO_sFCmz4#wXcS ze}UnqA(9(Usob$;u{}UK1TV3lIf|n{bx}Dv$6Xdm2kM3n?!#K+bP0!%Ys;Oy$JHOB zv_JaX+WQ};7V4#Y*wAsm|9F{3{t1?-Y6g+*LS}{jRRr~nqaCozntcX^dwjmQe`QIa zbm39Mt-eOz8nz8>O@4wY-lIZ7j^ znN8da$Y6oy1^P$vzYg z1J7@q-6OBBoq4RVE;C_)r5ptn?#IYw6WyhTx(jhE>1OftUYX^nRJCJC(SBH8(a6t& z{EO01k&H1EHUMFBy2`kIa<6sj>(Y?_F)kwuk8#+p&4RRy_^ujUTj!rR+r0pzH9Am= z1CAIbpHyxE$1-NX>0^;x+Ib7nFG8Pekm*r-x(3i^}M2)H2zq{|UD1@WY z+VUh8j}$89C58o3XOex=+H%l!E#A5o*U$%T(x;S{Hbj1j)Z|Eh&Xs0X=vs+auxjyn z5nw4v`gNDRAg`*8T==8E?zBMfJ2&ofvVQk3Zn3B)?Kqncg%%b7O;&wic?lHZ{%(zW z*Ihq$4G7&WBh4<~v@%^nSO4q|DdflkehZb0@oqZqB_$NOVCWk|fkv{}(w`W5#%2lz zRQi%)HL*{ktf8;pu1dWP$Jkh2P_1T>0D;!=Y8Y#_~0vVXR~VST~0>8 z?0eWG8Ql7hIp$8Fpy{kSE&i1wX~ez}vimLk=}DfbbUFp{Y!*O%Adl?Mrfc`qM=YR$ zE!lXAsp^pyGtZ%|Sa!{arv6wSQzfb$Z_rU9cLCRDxL0G;uPz<7jPZWRBXR0v3Ij>w zfK`G#&okES$;lSW4h@mkq4TQ~Yio#2?(LW$1RN;c#gkbVy~E3d-6=N4x=(0~Aw zX_Y`ToH8y=Sn#n3tL^*HtPeGdIfm=V#TsDxLa=@T_=BakET1B-&G2(EA|Ar4Jx9Ln7L2ofjWY@wIjY+@O^U?fGsY2T6hs&VNIdo{M6jAG&dxQXme zdGGp|ffEQOsq%{sd5)6992!a74?jF1MXU#{LzwS}hmB7`j}pDmv2LI|P0qRKqAt0Z zWc;FTS4TR_14I*jeNrYQe*Y%M&3awY9s){yGCL}l2t6ve&ip=uForPo%c{H-bhvBB zuU+3-x+7IRO|sHO!nl(a2QaKWGh8i_Tb7qVwFyR032Xt)g{I6JZ2{Ct^Q-=hNI2fpGv z5_owQ!%Av#ulrou1~+g5q)3sH6N+^I;v2Pr=v>U|Cy^P3ES{`Okg?P487i*eDqtbR zeRO_(T^Xjg=LlbMDo1{?!~y9g|0xiY76Z775axK*!o2(7j5Fy~(f#V;rK;`2UBO1P zK%_urH3mp^3wTN*cp&2p%Lk}aqq4`8Q2_Wm;`Y=uh7heIJY|X>M27&O58VfXQ!|x| zltd!)zc(=)deOom9S`oC}sAd zwvR+>2b1ERNh-gDo{y%8lDir$T+5?A5gKoyY}~S`IHDmrp85yj;7)10rn_*h+o*^7 z>2$vLdWlNrUW;B~!yN;*cnYHjgH*AFWO(d+1Aa#*AsOFCgB4m_*ktPC9kDc%=Q%8k zZbTkyFu?HqM5!FEAx@-uj}uT;d&%UsfV+me`(jf;?{OXMC4b^e7;dk>V@5V3%nx_F ztZ=N6Mg`j3Jkl`DFdnZ$dlpvJFi)bbfYsy|z1eG|-&N>pgMQceHXOP+1ex=(vUxxKlR4byL*OpsB3=ioINyCQ$c=Zq;_htlvJbW*5;MnBm9^2I1(!^N z%LkZX%cU(+nv$wbz(qXbeEg9GG}(vUv`<1kh%K5SYM*9u!QZ_CB7xWW9arKD%o8Zn zsE5co#itBqewi!I&q#py%{k(>`{PZCtCDgDIh!4otM@osOV~+64PV2O3`--eodlqq z?oSjD4|Z6z=R91_D&z-{_zD;G1zJ+C40=_7&hFB@h-03rPVze?Wt(%O z$NWi_fj+&G{JV{Jl=1X6wmH;JmTj03+R`_}`Y}vhQ*B44>le62`yem-6}9!NqlebX zagn=pcc;5?$lP$vdmK*n^Zgize+eaL%1MrTSVr+ess-nY5i2g~7T%XFQ4{PMX&%#h zBqO-NQcOzoIB~b5XCb3=EF4ZcalZN#jBG0ScJ3niv+FW%H1(xjQ(>azIB{)xRo@2? ztRu=*!kFN>@@mbPj~4>@<4WS{+kh$o715<9j?fYho`iKHNI0g_iQ$*b@14)%9~08v zbJOLCPm7i%J+pV4KfYy_LIzzbrnZP`qL+pc~Py=a`eZyB|(oh23uX~Ck6hu z{!OYyEzC#=0>d!>}Y6rmD0hfIk=k1v&{@_uJ>(GPl^8E^UqjI}62qP!MIYxeGlnv22&; zF~ab!s^3)=JtR+)TnBYMnZ!@vAg};grh*xHOPz)Z#;NF;ftg4av*q>s%RNW5eBs%Q zR^}MP!uLh_eT=IDVT|n?Ki0Ls-IXX$DEzn_AngN z$un<`l&7jv&oDd6e0k4=>nopMSR02gKj=v= z?OksU>@7BH2;gd@bYoB~m6c*=S+pP5MJsx~&6 zXI#6zbc_A_K|l0qw*1wD{zt$3;@@edo`I ztomSHmj`y%#yvIjcc~w(giN_tvzf-7lver0(gE798ycrE9}>}rO>VCp)<>Y7JYYEi zXe~9VLqT9VsV@53y(VW5(LKC_%n_VpXxA{Rv)?MBkPqeXTyXyPvIE}!VO zlj+MCCrP;%1Oaz`sW@<7bUu*TFD3_L;NLFHp=0dM{rQj#IYmmyX1mwWVyYj&E{b*I z(0=U39#QOIO%yBp7?snd73|@yCWc%l;)V}D8T~c8mkZ}_+{gf1LP`HeswCX(RsU`G7AlVq&hqn+iv%UJROpTqBs%)K;@r* zSHxi4&zW^!p2dQhFfI>UL&hyONc#m-Ey;CC8L7_-@Ie%->9&aGr0eYa z#&<+QE|Yw%8fv6huXkyNt7cZacdx%0+K)9iKigi6FJA&fb!xsXQAV3WP6-*4ZDsb_ z(5FGd=R9WofBMB=_qbz7iljH&=I$q2Yzv4_5OVR&BFHhq&=(|hZaxOC0*|-Mtw%Qo z@F^cxbO6Q&5uR4(2jF%s^!H7yyoI0L%%g3(SLs4hP-x`*Az2zC=q!2`9~K`5lsB>J zEt6>WvF10DW0sS{j87VLu>7wmG1#lVRnQOo8N+wXWGTpjpxb9y|BWrf#Oc@cL^JNk z>3oLL5g4;`-5fcm&1_TQKZouQr3VvP`a zZ*M%Uer>ExcD~Fmk?^U=BCm;qIexzd_KSK9PIN}xxkmBEFh6HAuGqEd9%}Nbt z7-ZkI6S@eVw%?OUa`jyrhJSa-a@!0dArg$UqNMul&vpa>e8(BFieJgDU%TuJ-G9vh znWAL$s0ojGw;LDGVn%vH+{MKaLVrMP7?~*I(B-4*Dx%}ce~?AqVRrroQzz3tFuB<)5@$5GU0gqh)~FJ2Ta5SvST>-dwo2w-EYeCHLsH6 zfXJ}N)wlxSYh{p5v-sI~y}&PdLnplS7uhX+f#&g!#@)ET{B!oTP-u(yG<$eNb&XwH zVEzwq8S7n$5CV-IMO!cyZ?=l3WF$e`LvUc(U~v{C$GXlwmM7*dZ&@LfZ&Q{v46H>G z*}ldM%?yhv@)Qbc%iY5YTLH0|v02DcEd8jurJTxyjUzRt0B%R<$`$zrR+ zdxBA$jP3ZUL(x%wTtJgoH_yLJ9&*0gf_!)^rw4ezBn`H;9SBT*$xkMoB&1!0QPR@t ztM*}@`-0?4jIFrXAO`v+SD&Z);@1>98PKlocN*0ENpxy za@I}CzY$Ru)N9{11=gyvxO57x2P`O~hhZCtZQ6{l6uX>f7RT=@UgU3?>Z6>B4Kf1X z(3x$9k0;&w3QehRA!|VpT-6(SIX}hIeXnc?2?*2GHa)G*iXU$*&=mcnqpYuv$6t#CNpECT5Us$*8KgYS5=YMF-0*bXwj`>=_XK^bgWsyC(P0q4J(wvaf1{ z!lL-{hKb7fO3`&*bU(zgi!+$g35NZ+Bj})xS#axLZw*)kXwIX4NhcMjFuA zBSx}{AH%QdN{{)xRC0Xzo$I@4ZJUw zD`W2Q@-R*cV(bng>?RkA#vl!d{Yp+0A3UEUecj5I4FU}Dg25|jdh>?U;1I)H2%&hV zQP(DG`m4K0yNv;e*UQ5Pt^jDm>2xKHDV5h<{)dOje)HTe*Mr?8^VG3x0P1{-ejyu(epu^hhM(zC0LSJc_24_<3iFv7iVm6G=0ls{%Of#H-7L-}cbRt!#`}Ho&hFbJsUl zQqvmygRo~@e*6t(u<0!{WkfDqvuaw2&Q8-IBSb?ttg07Rp$n52GQ0OLZcn+@>Od(f zB*6!?g4YwraY?;TKw=zV+AYuBQ6=Z4k%*mJc(rWR?ht>u$zN(HBrckF0z8hnFt z32H6YmHi2=ITBqyG-9%4V%+dafh`=;)t zGg$XkTE#4#_ENlBuhq}81rVe*ibtjNxX#Gt&)`^Nvd@@Sn)>t>riza}wRhxhGaISX z3c5v~lpf{MyG-ZS8>7SW_}VCS&-Jb`Tb)ey>`#RFo+YxsYFKcK#gG>iNTig@L~8cK z#pBm0G{a-x?CVyS`D@DmmM-xpT>e_6h$9m?XNim;3Y?fU#N(wI4jffq8qdUci#R>0 zml<+s(Y5C0W2Fd86yO@gxD->FpdI+i0y*^={W^IhuwBrho06tPSf#z|b6skkoYZ_m z%&1Cko^%c({0Jme2y8v&eeV$g*j0mIJRvOIXWjW5d@4Z@+;cY=Y4I>zvz!Knz`^MI z_~R}Me`3TgibB%eR*!nNBs0vb{=BYt%$5{{SIC@|=f-9grG|Pf&ZqbrmV5r}4{kaO ztgD*`yS|j2MiYWUB)3?mTQ1|q6QvvKu^gGsf%H15PZ9JikDCZGj+?&;H<=BOGM{PD zUE!@IKoe1iZwc{9@XD9KqFsBhbmAM%<=ZyNQc*S-$e(@^%&1tuD>UYm<_>r&kIjN? zDnQY?ViZotE5rhe@|14=BAo_NAjT{`8UY#f@-5*T_U#bqyW5UUIrdkJ^MB$3_TweM zNH);}sgK2~P)}8$?N?8P`{ld2_5&@vRXh;xFXq?D`CN_fdyk8Fi4NNw^Yb)%JG>=A zwoeM{xqf@QL+i4~Lz&!yC5Fn`hN%xq# z6jUJiyGf40I3!NW($F;~G$Fq>RI@O+ycb@gkL!-#j#*`__2iqsJ(*o$ZDH!jjG$Og zWG}0dXR&cy+{qN)r`Xx9RT8pcK;a;9x*(P&&2T8CU($ttH6T zNwlfM5-2)=Sc}y#r91|U2qK*{65Q_3C?FJgb%8*SjI;I9<5&iL)+uJN1Qd@fTZu1H zaS5ZJ4+a+Pze zlz$IC3(Zt8f>OSP~8!B@|p?@#%WJ$5Kf2TLEVg2~te`$44i3FFzHaR?{ag zR>e=JwP%fK*+uj|21-rCdC({-2SUb2S$}@YICB_rW$=fjJ9lH+H2?cg&r6BcU`ME|A<+I2(!Cc(9Y!T(D#GP4%)4kx3f|R6{ksE zKs+$X!RZYBAZ*oSgb!l3Ne}KrN&gp%>ITB$Y?9QxC2tXWIwC1iNtska>{z9_7C{5-QP2!%*wU9NtSa^ezL`HFcc}Q%!ZJrv;Xpd?o%d>g(+YjiWQ14n~<0Sfd@D%Zq39Z&qW{nlOQ<%YP2|k`C zltU?ZirttnJ&a@n3-r#xSq|(2!|kE-IiMDLl7&`nUB;&r#~o;xc%)&Zvs#2%!NBce zg3=5hOij|xuOHSlLv5au*^zQ(%8g~R;++_-Mxr!}Bbp>Wxck&b(z3$2f5Bm5j~jCJ zA%I7Fhlreu>Kjxc(LxVTBr>vvJ{7lL`d|Bfn*~oM_Z1rGLX}ftn-xms8#S&J10N~H z3bDP)!4|f|K#0XvKw>^xF)j0iH+~LDkTlcDRW0Jt2>5TDu=>41(qSux@x+>0GhjeA+KQ4eWOn4MRCx#1pgq{izPR5Ka;mio!3ynkD zm8pa4;sRG^hC!8&Te(r~?tkYSVg+a^E`W>wrL3{{mgHny)_=Uvd0MzP$8W`FYv=t0I~-?z`>2nClj?s*~~jBc%0iOtwV z#-!Bi7uR>0#b(Z_K!Dj7BpaHg+OvD*4y|PIp5k(6Oa6s*H)$xp43OkrXJt#i*V$4Z zdM0%)o984Lk5#9fLUyuXIOJIu^AW`D!Lb<>I;EH8aw1dmQ)YkEh;$a1_vn9#GyEVW zR*5TTtSfq=r{HPr+p~$Jx!AO;M0fo1vtON4cGQ{t1w0w{Y5qTWAN&8o`xxn&+5Zdr z{=@rNIsW_hzj+_yzs%w{`fzXm z2o+?kVjSzi4!EuToxQ!?eI5hdsh?hKj?cjf)Ej;Y2HGC=TSf>K5@-O|$bo+?umE!i zBk$k_d~YB44m{!kJlw$%*sZ-?F|JM*Ks3XGh z!Nb$j(I3usd%?UGMCvO5Ir=HsJQxRH0UrJpzg!C7C4bpGy>j~kCIF}FJ{wf_zpP(X)o(3-oV!YP09@G|-|g>)pL6i5 zuT+Nr=)NN$rx#GJO(3hjn18x2fRgN=?t=y3)cRHa!`UH#d*zSIUq>|eAh2IM=MMm4 zP6Kd9FsS$5t|8D*OV1|DR(Cjy-R{%jPTttn*i1b%4sitSDD;bwi;ezI_my?Bt=67! zvI}u%d;fB*`(;;K`;_Qk-wYI=Lc2JFQA~a>xWniFk~M<#0|0Fib_oUq0K`!N92pyr zJ}2_8Zh}0ajXf%T#Rc}(LJfiZeT)Mg!?ObRcoTSa2KMj+pfBSZ+kJK2n?>S;gX_bz z0s&SJu<$J<|d;v;&0r>8ox4^fo>s&o<`MgS+VAfsTEi%Uum}F_asKi_X z_UB0hz+HF*`Cj`<*S^d5RakK|zEck_28e(K%>Mb2E0*f4kW>^c1Y`igvk!QJMr z`3l2DK5{*18UOitdgVfz?H${-|NS=$!nbFu4dg4>oA@0&xx40uJ8|(~SIYH!G1m)# zcbnVi3;t^BcWjHwJ>Uz}OCZ=A=j-u=2etc)-;41b^VLuEz&B<)Hwcvi1=;lD4)`VX zI2xzbE`$fI@2evWhjlmmUW+y}xED}0cUnTAYM}q(tZ&U{QAEMb!5T75hRzDjsKM@a znsM?>mM7d)WY(!LfV*iXl8Zy~ z!>-sxrL!v)EIOV~)qL)Hc~OdYp z3TOZ$Edwz7N`N$Dk?xb;#Df9udI7&;>J5GoU!ZO`?>hUX6VWKC!E#wjo&>%hRU+Ea z^MsqMF8l4rYUB=>k2>sE8=PiE;6>V9n_~(w{P28&7|GaCiIy>5RaowKM;{S-%U#o% zey>KfAFRBWRFA^k7Ka_BVYDxW9iZezsaprx&FJ)cH}&C%qQ!~!Gnit}S)zD*;uj}V zGr|9%a{I74?s4H=@!Uf(txZ=?2+Cweo1=XHK$P_P=G7%AlGJo@ocA3KkV%E|Q>U}P zE~OW%4AQ)q$_M0I#X4^crtBjmxpP1DP^NvI8P!H~V7}G;Syu@S7J6P}aK;~V;)gEB z-n>oKCq$fzhSo0pF>f>naB$FOGSlTtF3Nm^(eN;|r#ff{h<43VFBPYNiVy9cv({K= zYa&7k(ob0!C6R7s#rJ%{^CNXzvbUj|LIUM_OvruS#DJ_dh6_BA?)V`J#4`v(5m|AP zX`y>C=9*GG`yxKgnDx9)R!a*`F0^?qLmHlRL3;U|TS>C11=)+a0GV3ACvU=>Fj(zkVus?yeF2 zdKi@&n=hUQgY1~4-K_f}G~l(~MsE5DMunKqi+GfI%}$7RVaS1tt=Hp;Ow+h^c7Zxx zuh>jk`ElCoTwJB$&0~AcLS%0*dmMAUo1;G6M#I@fbz{aV(*0@xO}MeN1YfU2or|ah zl0&!6CK1Ofhu6+C8ga!mzBjNQw~CAS=~UH?LzWUD^QsWn-dgoT5nM!l9T${VjUzRR zTtZm)4lgsLQ5j`Y|0ofLJbt3!M#}^^ok$l;c-TPkwKkyfRm#iR>n6j*?RNBd@ zvF%l?r!>-1>Djs5m~RKG*mDxLR4!IDkvRxmXs`SGvOfEoj3QGM-71F7=lT!n*QAGv z1|8iSL^1q`FZpqHKM1fa5-G)l%>G>FoMtS8(?XEBiqoKSUGG)!2%k9b2sjfri1D)4 z>iYO1QEjuv84;!shP0qiK{a8zeA$i`nFbDK5i5l zzVZy`%^tMa_5*<;tGQ&fess@=FIQOE+T$%$?nquxzDZ?9Yb8j<3Y=1I18eDEY;rhe zrqII-7z9d2ownh4$)Q>IE(dPMwwNgKBO;%sUQEv-nJ)P3sin+mxAmN)FYjY#`HZK` zjeJv3-i=R)l&^2j;<_&{%94+ufz?8OFf{JYX-BqVoo!<5(_8GmtIj`w&d@bkGh9~) zfs}t(B2gbgVn^f#C-_icX$fuDv=hycol_IxX|5YzBt;M(zKb^vte!=B7ri(!Fr2Nw zKR33+Mf8bmzb=5M#DW%twnghrzSW?i8EDAaHW58mWRS2h|pXA=ftDDM6KA;@f2lwco9=zY~EGx&>UbIOBzH1gO@W&A$o@IJLkcTd-M=i;6-`G6S0^0Y0GB;Bp-8j)UvxNdwdU1 zizGyf(7qNVR}rX2j2h*zDYQ2Z1{>&5l!ZgZ1`>BqWugfnC1koE^MY67*oB^=&dg3bWbT#1Y)UxmUfOBONwv zmP;eiL{#2M9#q@Ml`VN|c7Hq-PeG3t-X;ZY{x9#xF;OCDLGl?qdSzk!lzo4Vcz8a2GkQ@pNqTLj}WF{HH*HTrZS|3JQv^|<86Ck5j|*;W&b6+ zM>+W9yvDNwPWx2j@B)~P`&rEZKO+$pU3=4b20GF6o5Fj}ua-0O-IR`$hgm9wEnBORy9Oi0wlIXU&Xsko!jQsv~Xi<#K1 zk^lDmtn?#Zq*MXyevW&8u%SOMz!EL7H)_x7J?N9zj41UYLP@rVZRyBt{t%ZZ9%Anl zz0PlMsby5Qiv@Mzk02pS-yRJ`8H#w?6nL&PGUgI3Y@&_hX6EH}(i%B?>mwI^Fk9e&LqElvk(K61Ow%?M_yM#- zZ-qWe%|h%W-C)8mx1oXw8{|q+U+s+-%d{zLveBP6UpsUll)D6A!;Gxt$-AxMGXOVQ zJMC5Xk6(;{9MW&iJ2K~mSsj+})`~%&Oo$T|sWP_+PR3Uj+_B z{~d%ayS8JUTtUXrk2hS&yJrdDC~7WDt2gj9r8+*ru&K=7qZVEsj3u^Q6hvm^d;OM!5s9c{Z!C^D{(nnieEJj2Rm06^c3YP60an(60@XtT11@#A|X z^bcA(MAy)4Sy_&ic~wxT1;PXJ6^SDvOj5&2VZ_of%jUM#gYx_D^>*Eb;uTElC{E25 zebm##O|wLZQ&{lC^HE8}^NRF{bDql$`DyU0?ZG;>z$u>AVvl#g2rqiZ8O^KLL+?x; z%@k`&lR9F^3@EUahbP7X){i`=~%_tk;HZLrcx`!*PWel*Gv<&U9Jdz;{D1^DpS%Whu%$Jqwa>&Ob3l%PT3X{0HP1viW5P2U4S3NDQS7P zev=8=fMWwI(ygbSQ)9>E(&R%X_lNHF%o*1~frz^&=2%X*wdl1Svnay#!#cKYVLX_?=Z)DKG-#2JAvqEBqT|ugz)aoHyAT> z5A!m>All8`V2w z2~gfxF+!wz%J8B_*0OV#8ap^Jd|)=GvEWaoIelPxKw8@5lH#zR|L5vLA+p)x`1 zCaq2@)x><5AS;L*E7nZa_8N3&iz0H03X~8DQ?FV^r{-VbIOI-6cAbP*&Fq?tROu0M z6^A-MG&^VY2G=7&7WzelE15jMi&|*Y=M*Pi9ewMWr-@{<#jAXmPtH5m>G z&i&k6O~0D3@7qzVkX0o_UuHI$LWE~|?!231xZD$8EEb{|a{tNI3H;Zi&lmmE0_MzO zaSyZMU8&8m_Qs`iRyqs)X&Sn!#pRNJBfX%fvnBAyD)0zZlpL{UA0Y5HB*HpiB{Uul zXQXXh{Wdn7s!l+i1M3gMYZ*bg>8Kh<$26br%Pk&nq}z_QE$(1F$B5B^_SKb4k-j!@ zMZFIjMLAloCa!wMTK_3g2>?h<(jj5W2blxU;KYeKZt|pQz|y>;MU^GPF!WLdY_62C zLCUnl!i9UZ4_qIh`DWy0I9zXn<93y|<^xMQ!>o?cC#L-vi>LZc_?a62VJ3PPipr#m zY){MKXCHm#GZ%3PovsNAlY&9mvWgBKJbkSA2AkifEmL#%;A8zsbZ?mK@H0E%cs+n&K9tb>5!VeASJKFVofx?Hqt@m@xh`{!D4wN7Pz%wLW|oe7;R~-=6^vbM6GR^AYjkMF zIts%!4MAQ?8ag=ncZ#m1dF<>9E^~8~Moll?on{Oe!bNn1(@U@TRTpPH(=q)*M^O-> zQ4M8cG(v9``^l=dn1*M`1Km=$N0sjqF8YCK(c4k2r=5_~M3C?O=@i-6n!^vE)`boa z&b)>|HttVZ9b*pMZ5vzqk@LyT1*@@W-|K?;RhufH<^JyLr{V%q%N{AWj?&XddY*0n z4k6+doctFNhb$G5WVe0ZkoF4my5>St0}8y{RH?!%`8;X^Ipk(p?MGrM0!|z(&~ggX z{Xnyx!W~B6v{PluJ=KGWcW51bSDuBQ2}Vjxd?H1lqtN-jWrVrPMS#{K)^_uNWe9=i zy+{S#$ps*Yh;W&IcB@jZSt@*E|_ENheNlGcZ8oa ztWxj^1D6)m5oW!rS`9Ev@{3Z{KL%p*gdh%?%K6)=BaE zi99lFZdes}%L1Nf!<*&%FfSF1PW^bMoQB; z3gNO}%gzL;{`o}pBQ8KL%^In2;Gn$!EO=G4Cv_9onTn8hV>)unLR>!TVoswo} zG(hTr8XSg82!bmvWx0F1a%ySkvyaTuG9lN;cRfQ`$%eSB^ymA8K@(6&KZyW-qtsW%a0#4BF zWBc@DZlyOJAlq6}4q}XQYgowH=DESVh7fbOx9J#|#qePIbd9Cy6+4bD3X5v;x+8l& z&uZu!)OuFF&;FFs&IOs2rGf}?*a(yQ1M6nYGw!I3R3|!Ond^_^7nE+QQMit0vH`SO zU*t7e6j}N^ek_pGA6|bKJ|fg4!EL8^DeswLb2p4O=y>u#J}}^V{|rXs`TI-MgUJMZ zf4mKHoth14!3h3<)E_O~1I7hC}uk`48OUU9>cOMqEG9&!4t7TKNM6PPcSqr%>lde`hPZabej*8A) z*YVPLhy1)K8FvM&C+{9cpw>K)avQ2w*ok>A%n9lAcELB02Zo4z;qIPx+hU*RD#vmT7zxQ_O^ABExFJ7r!$bIssd$1Sg_#h#J}nb|+8 z0bx5Nrs`&WPw_s*$PnEf%k8rHbGhq^y0z(><@R0D&aBc%o}{@wNqmWYXxB9L&I~W- zcmf57(hWFKHd<+AzF+(r5WK=maqFP+8mk`xmI9Q))}C{f)qV}})KWc$GHZA%iXwc< z2?rnZW-GD{Ve~{-QS=#^oZVGWLfAjVP@x$LgW9x zK|_q!BFc66_GX|uALG9N0*GjJF@OzVjx(Hg>UqtMgoFT zQFsD#M>GG-7_%t2pvdcTg>de+I>kI9%Cd)Oe=BIRi>_>^IvI4Y>#yg5w5I0FH{sZ; z8&$DjI{~#lfW+YG)1R@TL*c$~mqQVTx@T@{z4foqdJW2n2oJoyKtZ5Y!}$$36SFdM zc@~>$m_g$gH^NOB#B1(0uP8?<4x~|4OrTJ68E4G2a71Hpl=|K^6?Pj`$XX#SEs*0M zrX9BO3#$(+^dp}Z9@pV<0@-F9C%1WbrM4a<9wkOf$Qq~GZ&dciM^hyda;O<;^U^Cn zN*Rt;bsW7tgz8C@`3`TQ(_uGe8u;p}B9rnABHdHu0iBK_^2p)@Lo6Ij~ ziBt7TCZ&mBW`#0QN=_v#XZ>ArVyVn41Jg1}@Tkiobl6!JcFe?Lrr!SJ_Y|WA;e>sz zkuCwXR3IdD6=1_u8u6Ti*EX8_|KL1!uQO=k6Q~y)NVOwa*`5N51QDT_ z9h(=4rUVj+UV4C6IS4en{JDMJBw%(AQX6}5$jJT~HWh0F0ikGvMRj^}dAE14-%fhn z_*D;0g<@)bl`E+_19m=m54_hwUu0km@^qw(qJBq!$_Mam7bp!Q+3||s8TWakPSq*d z%;m=;30q~?-+SSaw`D0_OlMC^Y1Ga)GnAXkx;q}Ij1=WVQV4m1*o@S*)_M%eAY#QZDi3>y~| zw2mi_SU}1h1Y#cbqKSfb<@3wW*Vk$5nGhJAaL=yiF|+N@mAiU9h5F99lRO1koJ3c(``Qq30Oo+ zk&K&G&PWX7xPArc&)5N*3%^eC9vZ0wovi0fR%WoSyT;k@-WB)IFL|~0Q!&QJH)LE- zk!mE#Jkt>4C;qJB5sZphaOwa5}JBGWjYM=#IvLD z#nF7sY46nXaK#LdTyG>M%Z6Ir^8(3Fblo;Yj+uz2w#qx8P2UE#r9Ly23%H) zfUM>1T0lFv1g`75ZV4zG`FN7>?d2&GBNI>4EGaRxBQWt8|IpYq*g<>>hk=WroGaIy zLkY2_q6o;*=9~i#veY)o&1yljWunvH2OR#{s)exQeV>Qj&YsWmFC|5s^w=v}f&l~h za#>*pvNW{a!)%}yt@Iu$Om44xNxkRYxrM}~H^`&J@^36UrOW+jg#~R7!4<&Ov9S2K zD>TvDAk8AI8q1Nf4mR zqGj7wmu=g&-DTUhZQHhO+qP}jbi~BOEaqFxAIN29fiIJXG zX)XsC7odXp#2i<}JscRC-A zJ4uMFb@n489v2B*8gQ>JUdDDU-Ftk2@&szgG_AmZ3tA?8-Xox(c=-HSrjOVCO>5a6 z_RJV?BH7AmyqW)9%%~83AXOBrXQ@!x1}6gsPbDl-(xGnI<;$`3Tid$xGCxgS6w@EFP?yRAb z(8}SJX(L@j=Av?^P5yv#AE6S?whR^Tl_NSgvjjf5mPp3`lGvIurlN08c_La{+UEFNjkl+6P_J;g0OvMHJg?WVRiokVc(@cGUN#Zc(pyz>%i> zNBMDkM1xxzm7axa5yjN)0PV4Kt2w4A`uNfwhF= z5Z<45DuSi+EvLvkmFOrrb=!r<_GDB#XweDpBa;%vi7F_Sdny_{mXdFF3DV7JNo*fu zL!xh1KK>PkLnEC%DXnhkesT`{B~6*vPAbv3$?5H^%jz%Dqv3hGbJcGO4=P=|BT13k zeG({5vCd;wPZHHr%4ohucGE`mUl}{YV(b8N7aC9aIy_M^>V96N)X!~SG*$8YfAv`2 zl%Y(<)RBi9hfuxSVe*;A?Dr?D4r>(wWcP~r4fwL_!X-Qorz46B-ISl5J4fl(!du0t zY8xdmJMvN7S%RJ+L!Tc+4}P55XjK#qKrs|Bg>8d(mRZ2gSd$4+@`XmXzZf%7Uz$FT z8q8|9VZ*>qr`>m43R?HUw`Xq!wa2s`$AcPNUrE>W*J#cx)0kI%06I1L-Vgu$<2j@F zn#9E9wxYwQ^5rDv#Hkq@o9p{#lj{3xV6zSRnuj76iOI@nQMuv8$x`v$SgRE2B{v1x zE1@DPN6{h3YiKyT95u*vh+dco2`kbBd_PywJV(A2nkR`^Gj;_j75T6&Tj8wF*Aqsq z6}lqJ#0Eo9K~n6l88W1mb*zZor{m49AWB|Z?h3t8@nJ99bI@{|dNz%;6=o+Ye*)N0 zwk5GT844Y5U3A6crm5b@D@F-&b3i0yZtfKZCXkd8LILuc4AS$M51xqvWFUZFIAZ)G zAEaTR{wk`b^(vZD8JtXd>TQaEzwCr<316R5r&A_ZEYLY#3MQ5CGY5_6_%`kBpuu(lFvkSviKTWv_yd#^d`N#bZgjqIq#)<^Ej;xT`49(KV>XYvF4<80&kN~kzc(|`ex zYs}nau*!XCi4)*!FVyL=B6F?IoZQkcv6!&8$@?6@90&IslTo!LS_V9lpt*met9b)I zU!rU>J0mF@2IV&IT2@7BAZogr4E9djYPkDhkLbA>GXEmdojuzvK4&yCm35w@8#q#b z+(_Sc5=nf$5i(}+Adh_smbpc(T8d8Bk!3!s>{@KJnoUAe2)Z=Kvj|JYCPnTXk!H2n zSF|IkR7I6+O;`JJ3x2l9WQ;+_#`qivDeU%q)&$czCK@27xE!w1K5Bx|Atgq=Cl0ms-Oh;IaN}XZbD*-6*Tje zH`TKw4}=D$5U-L(mw~?%o9Q`e@TyvlMQK&FRpgXGAIgWzX)3f-8k^U_?!pH^S*{EZaR|o znU(drk$IszSJ?^${pa1|Xtd5XJ>SoxU+S`s%qQrNKWoM5FL=1P6vF?F7_$6duiiiN z7CQsO|AYz|2^bg{{>PP7f`b11whsYfGih*tQP?s+%Gav=+0J%TpNM_*db6I=%4dKQeLc%39XwMa7F)fAkAy-{d?#X!0Wz%?uqmLK{GCZyA!2C(;E$dDgyueYq;a30vnieSc< zvMFDc_J)8RJYn0O!{ZOhcU?SD!#kF07EH56S=@tZcHpuG6ip4v0S{r59Gj?QNW%?@H}IDH$_;5YNnoom`C<0Pl1q!2DnUkvSxdhaY5uzw&8 z-sKJCS7p0PjJ&JZZErm4(EP#$8?2NXhWskx!4Z^d();9zLeO*U6xJ2c-Z8@7DcT;W zUp9a~JT&&+EeK~0{T;sK%}zdUM2xC@-z`e726xJ>Evb!f^go86=RbzvEsDk5s6QAm#&5c>A)GE;qM@F9O^2RCgf<&(V#&hM%+{@1B! zWdIFf4cu>~iW49YZFo`P^I=}2{X?DO-4{hD`=kJOUkVliI&>yq==rS;_eotSdjLz` zOx!N|Y#}=M=+HbIy@S2a)p{;v+~Xlp$JhMMF2+}z#jiJEVNB0MAdFJ3!nv;>E)mklWD}bX~x}zm-TvEIL5a7tIIqJ)ocB zufP`$K;9N#7&1W8FF228#TPiF9kAcVF99Ba{3)M!96kWZcOVD=|D$gl0f5;({?I2j z&ko?Px+AX*1i}~H7$|_|H#Bca^AEb$5zsrjm$dOO-5bXCKK>i~HUFq@|ETbs@5S91 z09ZgLKmSV#LZz?qk(YAcFDO0}=Pxub+VC;{TiUPvmd=kz=wm%v&2K;~n$0hN%_x)G z58!X*Fj|e>+ab(XeP-Z>#%;q%vea?Uv)x2@%e8!>L&ubE4%huoS#izd5r=7E%4U5DYiy=B zyI7X&Q%_!A_OP{}TWv0p2#GSxt;k$n)X?P+N^8^2a>?kkyT;--%Y3$fop6jEMUhH% zcVh*yRB)J}{Ow+6id5sf-wf$3#rR~_EnL08rNYR5xdmp^1ktscI^<2VTjh5kaO4|L zQtlt%q%9z}*mFUhJL6z*awE4ns%NyvoShSt&TCTyx6Dbt#I@Ed8m+&Q?Nth&#*O!u zyFnog<%zo^)Z>&9kA0UBNcb({vgV~I zXa!dseA_(r9+wqa6=wg2j8kJ383Z1BJ@$KAa=U2PCa4ih4-J%{zCtO%HKArg8b9Y;tk*B=3Mcq0P ze|O3m7Z@@KCM=s>=E(~8zMm1v?xeCsJe-r7QacAX+U1HzGr}c%ft%)D3)L!tZ)2A^ zzS79c5d1hl2X)1S?U*4wrP!}WgP(I+O_h(u?NcB~EZU7%O96%dc+aVV*ig47_?2CH z*LHdr!T4dJRn0&*D<8Jk?HGl!==ti>u_mmst%T+p(3D^NNOHp^;0(HIZoxKAPXz(* zTvNLX(_n)Hyjc<=tWGm57r{D1YGdoQm_kP}u=@vP01I?N)+DNK~tj%oj9k-B@ag8H+OIk14NPg@80I+!bP>bZN)j4dVvj^?mN#&+|fKx1p z4t7q}sLa*soKbO@KD(9d6#;$xk*d*~zEQBq<&~uf%N~Er!8N4rio9i!_SyI-tjSn> zQ4xuA9#?9DlYM+Sp)OX8i`D3qajJjEE}6Xv5fDQYg~4f&7-a#2_{vFLQJ-C~5^u&9 zdcct1eM9QIStot1GSLI(XKO4`?>>6r*7fKl^Y%T0PS@`ms% z+@n{L_Vp-HE_0cRV0u-zs?wpoyd;18N0F}0H-SNTk%x#aN7?w;VNwnl&g_}DocWUy z?*2s~yaoLIfmI`b!7Oz`T1k!5zAa=mXCa&avJti+EcWu%XdSY`AA}!w4CZMVXa*k_ zAJS?>SGR9mmj+PDF+J{8%3tVOkD<|60O-AmTxCU3m_!MGwPbp(69k}Spy@!dJZ)oE-CEc>s z)!HumuVaC#dG?Cmj^90~Li&oiX}K#K zP#sQOQXvnBVqHxUXe4I<6i^MoqC(gyM z#>ydjKIy$Xh!#fE+HD=?HbewLG^f`&iGnNT$0A3Q`$BN*PmmIVT&qUHc`?kOFGsL7 zfWiW(*gc()w3mrp@w3=SHiq1UpG@P@DqUYEJ8aXtb-_<244p=i!{UwE@j`v~`vUX= z6HTk*ngpbLq<8omqn3Dy+KMpVDf$42DD)0#J2MFm%_FivX~Zk4)JA!2+$I%P-0M51 zSia#yo*E7c(&RGZ_(0$x%mF0#dvww+Z~mC^-Wc%EYJq>aSR1l`GkYb=}#@hvF!w&bo&DUZanpvmAP`FFN-!wdyMr6HS}Qx|kIgQol1PE2=cPCDPXN zdtPHLpft+nKR_)fqlV4 zLN@#ob#y_*s|lArKOjHh^=dqIJfZR*$u#)C`cU;~?W_jUBLL^a#A23UFUs@55W91Mr-mWRo+ufy9LzIBE$fjm+JaSp-e zLIEGyg1=beV+5^T&9N^*6I6&%BjGEGwp7@goJ$@-qRm$j(cV^ihAO$96=@NN3P>nmDnq2v~XU?x^=#cg>IyvivrI;PR z17XE^PN~nV+>qzz3uwFi1CC`*4MluJh?|%9FF}2V({M`5#XHQA8JMXq^*e>n?%MF? zG+8EJd-|!B-kED};yUtLc+n@z@gr4ci2|*Gu^oHCd5)EpsAt8WIsWO=-3%`n#kkF{F=bquW?O6@{@^^KQ5dN9|+j*B0Pf?hBv1Sz|$j<46Sf zU;W%EN!iyLw+$w+no0uJ*mkdpVo~0O=s)b-YyDTmG>&m;Mx-6#i-agqT5;B*luK%@ zCYf^S-#Ecq#dXk|MD9?E{DlR>^e>ccmjl4EvI?M+8yEQ=y@xP-`#5k5<+3YE?U_f< zOKLCo54qeLay&2Twsrz^b;%7|u=B{(cON4>yX8!kN2?vi%8Rm|BPs95fIS zpTfvVCDOOL#kta%0ry6^7M*)27n*l?QR1}{!eD})?)M)&%0{A`#EV2&J6q2cs0uNb ze*u(Z!E3y5EbWRrV3uiR-O2 z3EmwnYaUf5mB|3XsIt*87XNCFK)f3|nKDn=p0ypY<6uwgGblXB_6aOpZmzqaMHqKx z&|iyo;6rW*3rcWV6+d%7yCau3dCe>R3OCi*jKTx`W@`HLF9R4!Ee7`O#~~iZXSAfi|_B2i6-a7Xt);po$1kewMj)l6CYM~q=m|-1agP&}h6cO-%|2Dgepu`O$X>5UfV-7oq1$?dI zlMtgtch{5H>0xs@T^zp2wopJd@f}A@{7tD(Gy92V7R8#}hY&#?Zv7|zqvr$|l;f6X zu))o?G7rcSYyt*agt~VCWV2|Wj94KhUd)LJ+!>5Hk>%7G)3bBkbV|BTtj*4y2pW2c zeW1-Ebf3>zHD=X&O}nCG$|Ot!I#Ie$MVhG%r{g)oUpo|HuzQtQq7!7&6~Wt3t(io; zpl*pdtXuGp2^ecatEkDYPPll0?!n@E(^|6^tkh`P(GP;PtAb!xTV`TYQ*HtymJQ(x# zn1{gs)3^-f(0Jr}i4+jeY%XsInJgS9TM?cD{Q_8{CUz{vcruILF_3T7fNYdW7(OS* zd9s_z>BdHh&1JLMmas8A0hh#+)z%5E)|=LWqU1BR6^;FxK9^hQI~mVM-9ds)r?8$d zZv9%eaul)?NUelobIXGsFZRpPAIOK?s%r7AN2lw!y)_=8Q zYnC#b@uFllW<{<@!F&>Li<2mG#_IMSv0!-7p$0van4%P`)oooWD|kcZV>}qOjZ$#K zV(6Od!h#wClJy3W8H!HUybt3Y+S7_Qi$TxdsPD(kF@El7Xqc-Ld#~gbYU4&2iP@3) zRm1K|9RJ}%Am5Lh$A{gj>3Pyeukb=Hzx>E@w3C(-+WObqK{sO|=n5_7DD3tTiIABB z)(4w0O^FU9D7VY~xAJCx2s4=R^jSB#tog}a*Gs1_;ca>5Ckws9?%(FjfNJaZ-nLcH zz?gmR7_IZuC{*qPxVOt$+HqqU-GOk6ib6r4gXt;v`;*uyed=E{!gLjw)ozO^gFxEC zuKjLiPU%kpz)Rc3Y+utoen?t95*uq_G(XG<#+U2v7 zC#4cE7uDKG#u6D!8EaY z+m1Wyr3L6(HPI+fPy7;mNMdRQXA_p0^yx+OGvkd1jocN7TW9mIQ)N5-Da`Lw zU7t{#L@gevR39sUIc~kV>P}upd zs47K%DvRZzqGR|vdqemPy;wpvSF-1N+LF!KA#YDG3? zE?Ra=ipEayu@0Z?c`H9=caN9uY&Cf`pg3g~5afE@5QEG--&gL(2*!z?OJy-%kWteX z4I1|)KOQS0c&yo@e_ym0e1ARGdB6Ahnhh_5h{oh};)N{Kw z8N?8@JR7*4VHG7_VYrA~AQGtfvF%h0gVcjr@$ke#OLRVp^*vsZvbPAfYR$Mw2o zVr^cnksWS2VD1SgOT7w6FUSc@qPtK~T3d+3;)s209&@Txdm==roUVlq3k?IewVlZGi4YAdrH|lvPLlXo z@xRH_Gx{Lv=SF&pJ2;#Psx@ng_^ihU0($rR$l6?6OWrx}GiwJYCc$XoCfV>o@Xmz- zDaa2da4zBZKdq-lHd@158z(cR9u%JXf)#@@EJ@8EDkaXcnYs9x7T^qPhIV1rfw!7hYN2jzC2xH&4C+w{nGV%OJ6|kKHnfsPD9VNN zXrzidro^PU{8)*{N4VWDEaprvffBF732a^4TrzSXtDCxcW5I zpaY9JORFyB@rcPa9a=ph2ntW~)+7rK%6B?9X$ydlPjTt5eVjp^DfM<$h0|4`iS7{xXzZlq5|6x^wj~5vy>In<>Q9Qf*b`}S-D!g&)oeTf^ZqWOmFfrx@3iewdLq_6Fc_it zU|7z|lUrYhv$;TbM6tTE8%6@72WiX@>}%A0eoIDN-=|kW>I!+M2o*-h!K5_yqUOmH zGTY-^ndom5ZaoBV)^m;zUkS7HGe}hf{5RN5*B}0kd=~u9CnQmN3fwp&jq)lTyiRkL z_=?{vM^@0#3(TirSSvx()SlB-Qld;%+Cp{0$1|1_qw#(K^jodWmFz+^d=VGj)mf7a ztatQAe`ymwz9I{Y7q%XeiQ5{>;~22m!nNOa<(~@kJ-sX4WwI_Ze|5oy=sDzN>0UaOfh0tsY;M zO8)o#JIU&UE|z=h^Jt%ZykaT4vfw!QEmH&2L*4wzZc48 zX*@x0U}Dl|p)g|?P!Gw&7>3Z;*CRBRP)WAy*t_1<6`KZsuCH|;&O7>uS+aCJ%M283 z)~qD@{zOw=4-9oFa689D(UMl$CIXJk^$GqN*c8#L$fz?!7jtrt^av`Q#v5LQpW%@< zSxyE%wz3;~0xDa_sO+7of{FTLpA%dkpczy(5MKq$>xhl|@*-3QBkLuh1>5DO$dq@H zodF_3gwUyn_hy1hf}!NVzrfZK$b}?_de&62ZLr8iYnocIeQdkCSS*+lg|&lxBcu*aloWgo`ijd?M5r~D7?X{@^CH{yX9_}9 zye<{7*S0q0vsCT&ZKoYw1WPjCs{?^I>p;kvL^u(5O#+G)rtT5LDdLp;zeAlzLzOcr z&z)^H`56j}ky5Y8UU=VwX#TM-n4EM=tN5zm3D6}0GfKeo!t{MbYhDZE*mRHeZnk;| ztIHDOV%RoHd7J0AoaZOEd%k}zcJR?g&TN&w$DYkc{a^OQGw#(pB7TG{vGB`|t#>80 zbA}+(PrJb#H=a#9UFBg8i&$=`JQOOdDZNM6ezczZ8h6zncLRC?oE4Cpsph(Yw@O2qvAi7YMiaI{| zDLLKTQOaq0bNQGC=nXy1KA7!zOrIHi(+E*h*fMdana>uT%-)CFjh|E*n0E_W>st*HITu?0WHgzG+JRMu+oW2@)Y$c`<4@K|^)deOWtEy^=QAqsw*wb5QTE?A{~ zAG{zb=}l9rCtus`bsUpMu0>H`)P@@@B))7w#c;#oQ!qj3d?xZq`kIVw5Sb1H-R??8 z?@r0GD3BR~`Xi3B%*HezQLKTS;|T|8@_55z8-_9ve}~{ib1$_!sH{D>7k;mCV)^*i z%Dl721%qsaG}x7q0yG*BxE3mOB@-e_H%s&3$O!lO?Zm67qGOQXi{E`^(heh3L~uaq z?wu=z!IRsUsAjFTn%>KTL!FobmB|PuRzt3YrDK{O^U9y+_SV}O(knK7_GV{2_|a%*+uW~(kaGpFJ^P_> zp#2`n{B6A0E>Ju&%LNSiY+|YwBUwv9!xQuV5r3qe;FP(Uc+GL@p^1$REY`dfoZb9V zE36@?IujCA!^otDF}>C7h6O)DPE)^sX_yopR}_3sv?uxSom|n8*sWXDf9�%Ggmn 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
ukvxO)my9VN9Mi8)g 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 XjU&d&$%4XRP*W>qJv~QvC*?l@QxzE7 literal 0 HcmV?d00001 diff --git a/test/test_gprinter.py b/test/test_gprinter.py index edb2c7ad..73c9b69f 100644 --- a/test/test_gprinter.py +++ b/test/test_gprinter.py @@ -8,7 +8,7 @@ # Make SymPy available to this program: import sympy -from sympy import symbols +from sympy import symbols, simplify, sin, cos # Make GAlgebra available to this program: from galgebra.ga import Ga @@ -16,8 +16,8 @@ from galgebra.printer import Fmt, GaPrinter, Format # Fmt: sets the way that a multivector's basis expansion is output. # GaPrinter: makes GA output a little more readable. -# Format: turns on latex printer. -from galgebra.gprinter import gFormat, gprint, gxpdf +# Format: turns on latex gprinter. +from galgebra.gprinter import gFormat, gprint, gxpdf, gPrint_Function ROOT = Path(__file__).parent.parent DIR_TEST = ROOT / 'test' @@ -26,7 +26,130 @@ DIR_DIFF = DIR_TEST / 'diff' +def lin_tran(): + gFormat() + gPrint_Function() + (x, y, z) = xyz = symbols('x,y,z',real=True) + (o3d, ex, ey, ez) = Ga.build('e_x e_y e_z', g=[1, 1, 1], coords=xyz) + grad = o3d.grad + (u, v) = uv = symbols('u,v',real=True) + (g2d, eu, ev) = Ga.build('e_u e_v', coords=uv) + grad_uv = g2d.grad + v_xyz = o3d.mv('v','vector') + A_xyz = o3d.mv('A','vector',f=True) + A_uv = g2d.mv('A','vector',f=True) + # gprint(r'\text{3d orthogonal ($A$ is vector function)}') + gprint('A =', A_xyz) + gprint('A^{2} =', A_xyz * A_xyz) + gprint(r'\nabla \cdot A =', grad | A_xyz) + gprint(r'\nabla A =', grad * A_xyz) + gprint('v|(grad*A) =',v_xyz|(grad*A_xyz)) + gprint(r'\text{2d general ($A$ is vector function)}') + gprint('A =', A_uv) + gprint('A^{2} =', A_uv * A_uv) + gprint(r'\nabla \cdot A =', grad_uv | A_uv) + gprint(r'\nabla A =', grad_uv * A_uv) + A = o3d.lt('A') + gprint(r'\text{3d orthogonal ($A$, $B$ are linear transformations)}') + gprint('A =', A) + gprint(r'\f{mat}{A} =', A.matrix()) + gprint('\\f{\\det}{A} =', A.det()) + gprint('\\overline{A} =', A.adj()) + gprint('\\f{\\Tr}{A} =', A.tr()) + gprint('\\f{A}{e_x \\wedge e_y} =', A(ex^ey)) + gprint('\\f{A}{e_x} \\wedge \\f{A}{e_y} =', A(ex)^A(ey)) + B = o3d.lt('B') + gprint('g =', o3d.g) + gprint('g^{-1} =', o3d.g_inv) + + gprint('A + B =', A + B) + gprint('AB =', A * B) + gprint('A - B =', A - B) + gprint('General Symmetric Linear Transformation') + Asym = o3d.lt('A',mode='s') + gprint('A =', Asym) + gprint('General Antisymmetric Linear Transformation') + Aasym = o3d.lt('A',mode='a') + gprint('A =', Aasym) + gprint(r'\text{2d general ($A,\\;B$ are linear transformations)}') + A2d = g2d.lt('A') + gprint('g =', g2d.g) + gprint('g^{-1} =', g2d.g_inv) + gprint('gg^{-1} =', simplify(g2d.g * g2d.g_inv)) + gprint('A =', A2d) + gprint(r'\f{mat}{A} =', A2d.matrix()) + gprint('\\f{\\det}{A} =', A2d.det()) + A2d_adj = A2d.adj() + gprint('\\overline{A} =', A2d_adj) + gprint('\\f{mat}{\\overline{A}} =', simplify(A2d_adj.matrix())) + gprint('\\f{\\Tr}{A} =', A2d.tr()) + gprint('\\f{A}{e_u \\wedge e_v} =', A2d(eu^ev)) + gprint('\\f{A}{e_u} \\wedge \\f{A}{e_v} =', A2d(eu)^A2d(ev)) + B2d = g2d.lt('B') + + gprint('B =', B2d) + gprint('A + B =', A2d + B2d) + gprint('A - B =', A2d - B2d) + gprint('AB =', A2d * B2d) + a = g2d.mv('a','vector') + b = g2d.mv('b','vector') + gprint(r'a|\f{\overline{A}}{b}-b|\f{\underline{A}}{a} =',((a|A2d.adj()(b))-(b|A2d(a))).simplify()) + m4d = Ga('e_t e_x e_y e_z', g=[1, -1, -1, -1],coords=symbols('t,x,y,z',real=True)) + T = m4d.lt('T') + gprint('g =', m4d.g) + gprint(r'\underline{T} =',T) + gprint(r'\overline{T} =',T.adj()) + gprint(r'\f{\det}{\underline{T}} =',T.det()) + gprint(r'\f{\mbox{tr}}{\underline{T}} =',T.tr()) + a = m4d.mv('a','vector') + b = m4d.mv('b','vector') + gprint(r'a|\f{\overline{T}}{b}-b|\f{\underline{T}}{a} =',((a|T.adj()(b))-(b|T(a))).simplify()) + coords = (r, th, phi) = symbols('r,theta,phi', real=True) + (sp3d, er, eth, ephi) = Ga.build('e_r e_th e_ph', g=[1, r**2, r**2*sin(th)**2], coords=coords) + grad = sp3d.grad + sm_coords = (u, v) = symbols('u,v', real=True) + smap = [1, u, v] # Coordinate map for sphere of r = 1 + sph2d = sp3d.sm(smap,sm_coords,norm=True) + (eu, ev) = sph2d.mv() + grad_uv = sph2d.grad + F = sph2d.mv('F','vector',f=True) + f = sph2d.mv('f','scalar',f=True) + gprint('f =',f) + gprint(r'\nabla f =',grad_uv * f) + gprint('F =',F) + gprint(r'\nabla F =',grad_uv * F) + tp = (th,phi) = symbols('theta,phi',real=True) + smap = [sin(th)*cos(phi),sin(th)*sin(phi),cos(th)] + sph2dr = o3d.sm(smap,tp,norm=True) + (eth, ephi) = sph2dr.mv() + grad_tp = sph2dr.grad + F = sph2dr.mv('F','vector',f=True) + f = sph2dr.mv('f','scalar',f=True) + gprint('f =',f) + gprint(r'\nabla f =',grad_tp * f) + gprint('F =',F) + gprint(r'\nabla F =',grad_tp * F) + return + + class TestGprinter(unittest.TestCase): + def setUp(self): + os.makedirs(DIR_GENERATED, exist_ok=True) + os.makedirs(DIR_DIFF, exist_ok=True) + os.chdir(DIR_GENERATED) + + def gen_pdf(self, name, documentclass): + gxpdf('%s.tex' % name, pdfprog='tectonic', rm=False, null=False, evince=False, documentclass=documentclass) + + def check_pdf(self, name, expected_retcode=0): + retcode = subprocess.call([ + 'diff-pdf', + '--output-diff=%s' % (DIR_DIFF / ('%s-diff.pdf' % name)), + DIR_FIXTURES / ('%s.pdf' % name), + DIR_GENERATED / ('%s.pdf' % name) + ]) + assert retcode == expected_retcode + @pytest.mark.skipif("TEST_GXPDF" not in os.environ, reason="Only run if TEST_GXPDF is set") def test_gxpdf(self): gFormat() @@ -54,20 +177,12 @@ def test_gxpdf(self): gprint(r'{\nabla} = ', grad) - # mkdir -p - os.makedirs(DIR_GENERATED, exist_ok=True) - os.makedirs(DIR_DIFF, exist_ok=True) - os.chdir(DIR_GENERATED) - - gxpdf('test_gprinter.tex', pdfprog='tectonic', rm=False, null=False, evince=False) - - os.chdir(ROOT) - retcode = subprocess.call([ - 'diff-pdf', - '--output-diff=%s' % (DIR_DIFF / 'test_gprinter-diff.pdf'), - DIR_FIXTURES / 'test_gprinter.pdf', - DIR_GENERATED / 'test_gprinter.pdf' - ]) - assert retcode == 0 + self.gen_pdf('test_gprinter', documentclass='book') + self.check_pdf('test_gprinter') - # os.system('pdf2svg test_gprinter.pdf test_gprinter.svg') + # This test is a POC, and should skip for now + @pytest.mark.skip + def test_lt_pdf(self): + lin_tran() + self.gen_pdf('test_lt_pdf', documentclass='report') + self.check_pdf('test_lt_pdf', expected_retcode=1) \ No newline at end of file From b5aad3b3b0ab5ea8e96c15b0b513c7e60545796e Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 11 Apr 2024 22:23:10 +0800 Subject: [PATCH 51/78] lint --- galgebra/gprinter.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/galgebra/gprinter.py b/galgebra/gprinter.py index ef2bbeb3..d26aff65 100644 --- a/galgebra/gprinter.py +++ b/galgebra/gprinter.py @@ -286,16 +286,15 @@ def paper_format(paper, pt, documentclass='book'): # Set size of paper and font return paper_size + def gPrint_Function(): """ Print out the source of the current function """ tmp_str = inspect.getsource(inspect.currentframe().f_back) if LaTeX.latex_flg: - #print '#Code for '+fct_name LaTeX.latex_str += r'\begin{lstlisting}[language=Python,showspaces=false,showstringspaces=false,backgroundcolor=\color{gray},frame=single]%s\end{lstlisting}\text{Code Output:}' % tmp_str else: print('\n' + 80 * '*') - #print '\nCode for '+fct_name print(tmp_str) print('Code output:\n') - return \ No newline at end of file + return From da4f68786cfba2727ecc0ca1863f94be34b07cf2 Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 12 Apr 2024 15:57:57 +0800 Subject: [PATCH 52/78] Revert to the original GSG undual test outputs --- examples/ipython/test_gsg_undual_etc.ipynb | 208 ++++++++++----------- 1 file changed, 104 insertions(+), 104 deletions(-) diff --git a/examples/ipython/test_gsg_undual_etc.ipynb b/examples/ipython/test_gsg_undual_etc.ipynb index 6223303a..6922b033 100644 --- a/examples/ipython/test_gsg_undual_etc.ipynb +++ b/examples/ipython/test_gsg_undual_etc.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "0185309f", + "id": "6f55977f", "metadata": {}, "source": [ "# Testing of undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "12a530fa", + "id": "ebee586e", "metadata": {}, "source": [ "In this notebook I test the operations `undual`, `g_invol`, `ccon`, `sp`, `norm2`, and `norm`, code for which was described in the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**. The first four of these are operations new to GAlgebra, while the last two are old operations I have newly recoded. \n", @@ -31,7 +31,7 @@ }, { "cell_type": "markdown", - "id": "cec8f476", + "id": "b8077836", "metadata": {}, "source": [ "## 1. Notebook initialization\n", @@ -124,7 +124,7 @@ }, { "cell_type": "markdown", - "id": "82333d41", + "id": "d5005640", "metadata": {}, "source": [ "## 2. Testing environment `g3` for operations `undual`, `g_invol`, `ccon`, and `sp`\n", @@ -137,7 +137,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "3b574d78", + "id": "e053271f", "metadata": {}, "outputs": [ { @@ -250,7 +250,7 @@ }, { "cell_type": "markdown", - "id": "321e81de", + "id": "99253ba6", "metadata": {}, "source": [ "## 3 Tests of `undual`, `g_invol`, `ccon`, and `sp`" @@ -258,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "59725d39", + "id": "10353087", "metadata": {}, "source": [ "### 3.1. `undual` (undualization)" @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "e80aa821", + "id": "c7fa60e5", "metadata": {}, "outputs": [ { @@ -349,7 +349,7 @@ "gprint(r'\\mathbf{A}^{\\star} =', A.dual().Fmt(2))\n", "gprint(r'\\mathbf{A}^{-\\star} =', A.undual().Fmt(2))\n", "gprint(r'\\mathbf{A}^{-\\star} = -\\mathbf{A}^{\\star}:~~',\n", - " undual(A) == - A.dual(), \n", + " A.undual() == - A.dual(), \n", " r'\\qquad \\text {(Note: }\\mathbf{I}^2 =', I**2, ')')\n", "\n", "# Check whether method `dual` and method `undual` have inverse actions:\n", @@ -361,7 +361,7 @@ }, { "cell_type": "markdown", - "id": "2c352f81", + "id": "3dd6433b", "metadata": {}, "source": [ "### 3.2. `g_invol` (grade involution)" @@ -370,7 +370,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "69918cc5", + "id": "a8c28609", "metadata": {}, "outputs": [ { @@ -451,7 +451,7 @@ }, { "cell_type": "markdown", - "id": "58a4f1c2", + "id": "24492ec8", "metadata": {}, "source": [ "### 3.3. `ccon` (Clifford conjugation)" @@ -460,7 +460,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "c2616f56", + "id": "aa255f32", "metadata": {}, "outputs": [ { @@ -539,7 +539,7 @@ }, { "cell_type": "markdown", - "id": "7fc1dded", + "id": "9f2f5dc1", "metadata": {}, "source": [ "### 3.4. `sp` (scalar products)" @@ -548,7 +548,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "2b3accd0", + "id": "b89afded", "metadata": {}, "outputs": [ { @@ -684,7 +684,7 @@ }, { "cell_type": "markdown", - "id": "143c1c25", + "id": "090e0a7f", "metadata": {}, "source": [ "The above tests include tests of the relationship of the (usual) scalar product $\\ast$ and the alternate scalar product $\\circledast$ to the normsquared operation $\\Vert \\cdot \\Vert^2$." @@ -692,7 +692,7 @@ }, { "cell_type": "markdown", - "id": "eb4fd6e0", + "id": "343b9494", "metadata": {}, "source": [ "### 3.5. Conclusions from testing the new operations\n", @@ -702,7 +702,7 @@ }, { "cell_type": "markdown", - "id": "9bf99470", + "id": "a58386ba", "metadata": {}, "source": [ "## 4. Testing environments `e2`, `e2_polar`, `m2`, and `m2_polar` for `norm2` and `norm`\n", @@ -724,7 +724,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "1b36abc2", + "id": "648220c5", "metadata": {}, "outputs": [ { @@ -838,7 +838,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "72b55459", + "id": "93020af9", "metadata": {}, "outputs": [ { @@ -956,7 +956,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "7ae3a823", + "id": "db8d0100", "metadata": {}, "outputs": [ { @@ -1087,7 +1087,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "d5a53baa", + "id": "bb01bfee", "metadata": {}, "outputs": [ { @@ -1222,7 +1222,7 @@ }, { "cell_type": "markdown", - "id": "52d80715", + "id": "9f3876e9", "metadata": {}, "source": [ "*Remark:* The above reports as to whether the model's metric tensor `g` is Euclidean use the same test `g.is_positive_definite` as is used in Case 2 of `norm`." @@ -1230,7 +1230,7 @@ }, { "cell_type": "markdown", - "id": "2d905f82", + "id": "eeffef9c", "metadata": {}, "source": [ "## 5. The test program for `norm2` and `norm` \n", @@ -1242,7 +1242,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "1a87d603", + "id": "42cf5c27", "metadata": {}, "outputs": [], "source": [ @@ -1280,7 +1280,7 @@ " gprint(r'\\left<' +M_str[M]+r'\\right>_'+str(g)+r' =',\n", " M.grade(g), r'\\in ', ga_str[M.grade(g).Ga]) \n", " gprint(r'\\qquad \\implies \\Vert\\left<'+M_str[M]+r'\\right>_'\n", - " +str(g)+r'\\Vert^2 =', norm2(M.grade(g)))\n", + " +str(g)+r'\\Vert^2 =', M.grade(g).norm2())\n", " gprint(r'\\qquad \\implies \\vert\\left<'+M_str[M]+r'\\right>_'\n", " +str(g)+r'\\vert =', M.grade(g).norm('0'),\n", " r\"\\quad \\text{ when hint is '0'}\")\n", @@ -1294,7 +1294,7 @@ }, { "cell_type": "markdown", - "id": "eb06f329", + "id": "d1ddca69", "metadata": {}, "source": [ "## 6. Tests of `norm2` and `norm`" @@ -1302,7 +1302,7 @@ }, { "cell_type": "markdown", - "id": "53f73ec2", + "id": "413f4854", "metadata": {}, "source": [ "### 6.1 Testing within `e2` \n", @@ -1314,7 +1314,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "a43027ea", + "id": "813ee65a", "metadata": {}, "outputs": [ { @@ -1404,7 +1404,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -1416,7 +1416,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -1428,7 +1428,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -1524,7 +1524,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{xy} \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -1536,7 +1536,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{xy} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -1548,7 +1548,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{xy} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -1565,7 +1565,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "52728f59", + "id": "c6748b4f", "metadata": {}, "outputs": [ { @@ -1815,7 +1815,7 @@ }, { "cell_type": "markdown", - "id": "7879c9c4", + "id": "a2422ab4", "metadata": {}, "source": [ "### 6.2 Testing within `e2_polar` \n", @@ -1828,7 +1828,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "5b7d756d", + "id": "df49d984", "metadata": {}, "outputs": [ { @@ -1918,7 +1918,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -1930,7 +1930,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -1942,7 +1942,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2038,7 +2038,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{r\\theta } r \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -2050,7 +2050,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{r\\theta } r \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2062,7 +2062,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{r\\theta } r \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2078,7 +2078,7 @@ }, { "cell_type": "markdown", - "id": "3bd68f9b", + "id": "a051af1b", "metadata": {}, "source": [ "*Remark:* SymPy was able to take a factor of $r^2$ out from under the radical as $r$ rather than $\\vert r \\vert$ because `r` was instantiated with condition `positive=True`. SymPy does not know whether basis blade coefficients $S$ and $S^{r\\theta}$ are nonnegative, so it takes their squares out from under the radical as $\\vert S \\vert$ and $\\vert S^{r\\theta} \\vert$." @@ -2087,7 +2087,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "ad2cbbe3", + "id": "71b635d8", "metadata": {}, "outputs": [ { @@ -2337,7 +2337,7 @@ }, { "cell_type": "markdown", - "id": "693d5172", + "id": "ee245858", "metadata": {}, "source": [ "### 6.3 Testing within `m2` \n", @@ -2350,7 +2350,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "bb3580b2", + "id": "7006e40f", "metadata": {}, "outputs": [ { @@ -2368,7 +2368,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = \\left|{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right| $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2} $" ], "text/plain": [ "" @@ -2392,7 +2392,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2404,7 +2404,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{- S^{2} - {\\left ( S^{s} \\right )}^{2} + {\\left ( S^{st} \\right )}^{2} + {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2440,7 +2440,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -2452,7 +2452,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2464,7 +2464,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2488,7 +2488,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = \\left|{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right| $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2} $" ], "text/plain": [ "" @@ -2512,7 +2512,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2524,7 +2524,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right|} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{- {\\left ( S^{s} \\right )}^{2} + {\\left ( S^{t} \\right )}^{2}} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2548,7 +2548,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = {\\left ( S^{st} \\right )}^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = - {\\left ( S^{st} \\right )}^{2} $" ], "text/plain": [ "" @@ -2560,7 +2560,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{st} \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -2572,7 +2572,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{st} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2584,7 +2584,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{st} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2601,7 +2601,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "152f21a7", + "id": "9b32e234", "metadata": {}, "outputs": [ { @@ -2619,7 +2619,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = 25 $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = -25 $" ], "text/plain": [ "" @@ -2739,7 +2739,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = 16 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = -16 $" ], "text/plain": [ "" @@ -2799,7 +2799,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = 37 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = -37 $" ], "text/plain": [ "" @@ -2852,7 +2852,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "a4532cc3", + "id": "3862bdb9", "metadata": {}, "outputs": [ { @@ -2870,7 +2870,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{A}\\Vert^2 = t^{2} \\cdot \\left(2 s^{2} + t^{2}\\right) $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{A}\\Vert^2 = t^{2} \\left(2 s^{2} + t^{2}\\right) $" ], "text/plain": [ "" @@ -2990,7 +2990,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_1\\Vert^2 = t^{2} \\cdot \\left(2 s^{2} + t^{2}\\right) $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_1\\Vert^2 = t^{2} \\left(2 s^{2} + t^{2}\\right) $" ], "text/plain": [ "" @@ -3050,7 +3050,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_2\\Vert^2 = 25 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_2\\Vert^2 = -25 $" ], "text/plain": [ "" @@ -3122,7 +3122,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{A3.norm2() <= 0}: \\quad t^{2} \\cdot \\left(2 s^{2} + t^{2}\\right) \\leq 0 $" + "$\\displaystyle \\text{A3.norm2() <= 0}: \\quad t^{2} \\left(2 s^{2} + t^{2}\\right) \\leq 0 $" ], "text/plain": [ "" @@ -3189,7 +3189,7 @@ }, { "cell_type": "markdown", - "id": "39070b41", + "id": "183a219a", "metadata": {}, "source": [ "So as to provide a test of Case 3(a) in the execution of `norm`, the multivector `A3` from `m2` was designed to have a nonnegative `normsquared`. (The various cases are described in the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**.) The relational `normsquared >= 0` within Case 3(a)'s conditional evaluates to `True`; hence the conditional itself, `(normsquared >= 0) == True`, also evaluates to `True`. The consequent of the `if` statement then executes, returning the `hint`-independent expression `\\sqrt(+normsquared)`.\n", @@ -3201,7 +3201,7 @@ }, { "cell_type": "markdown", - "id": "5e98f135", + "id": "c475ccd2", "metadata": {}, "source": [ "### 6.4 Testing within `m2_polar` \n", @@ -3214,7 +3214,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "fcb1965b", + "id": "cf7afd38", "metadata": {}, "outputs": [ { @@ -3232,7 +3232,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = \\left|{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}}\\right| $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" ], "text/plain": [ "" @@ -3256,7 +3256,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}}\\right|} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3268,7 +3268,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{\\left|{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}}\\right|} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{S}\\vert = \\sqrt{- S^{2} + {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2} + {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3304,7 +3304,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -3316,7 +3316,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3328,7 +3328,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3352,7 +3352,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = \\left|{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}}\\right| $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} $" ], "text/plain": [ "" @@ -3376,7 +3376,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}}\\right|} \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{- {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2}} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3388,7 +3388,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{\\left|{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}}\\right|} \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_1\\vert = \\sqrt{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3412,7 +3412,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" ], "text/plain": [ "" @@ -3424,7 +3424,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{\\rho \\phi } \\rho \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -3436,7 +3436,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{\\rho \\phi } \\rho \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3448,7 +3448,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{\\rho \\phi } \\rho \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3464,7 +3464,7 @@ }, { "cell_type": "markdown", - "id": "a6a1a8b8", + "id": "a7b3b632", "metadata": {}, "source": [ "*Remark:* SymPy was able to take a factor of $\\rho^2$ out from under the radical as $\\rho$ rather than $\\vert \\rho \\vert$ because `rho` was instantiated with condition `positive=True`. SymPy does not know whether basis blade coefficients $S$ and $S^{\\rho\\phi}$ are nonnegative, so it takes their squares out from under the radical as $\\vert S \\vert$ and $\\vert S^{\\rho\\phi} \\vert$." @@ -3473,7 +3473,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "8f859d71", + "id": "9374e530", "metadata": {}, "outputs": [ { @@ -3491,7 +3491,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = 25 $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = -25 $" ], "text/plain": [ "" @@ -3611,7 +3611,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = 16 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = -16 $" ], "text/plain": [ "" @@ -3671,7 +3671,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = 37 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = -37 $" ], "text/plain": [ "" @@ -3724,7 +3724,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "93249a73", + "id": "43bb53cd", "metadata": {}, "outputs": [ { @@ -3742,7 +3742,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{B}\\Vert^2 = \\phi ^{2} \\rho ^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{B}\\Vert^2 = - \\phi ^{2} \\rho ^{2} $" ], "text/plain": [ "" @@ -3754,7 +3754,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\mathbf{B}\\vert = \\phi \\rho \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -3766,7 +3766,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\phi \\rho \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3778,7 +3778,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\phi \\rho \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3922,7 +3922,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{B}\\right>_2\\Vert^2 = - \\rho ^{2} \\left(- \\phi ^{2} - \\rho ^{2}\\right) $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{B}\\right>_2\\Vert^2 = - \\rho ^{2} \\left(\\phi ^{2} + \\rho ^{2}\\right) $" ], "text/plain": [ "" @@ -3970,7 +3970,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{B4.norm2() >= 0}: \\quad \\text{True} $" + "$\\displaystyle \\text{B4.norm2() >= 0}: \\quad - \\phi ^{2} \\rho ^{2} \\geq 0 $" ], "text/plain": [ "" @@ -3982,7 +3982,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{(B4.norm2() >= 0) == 0}: \\quad \\text{True} $" + "$\\displaystyle \\text{(B4.norm2() >= 0) == 0}: \\quad \\text{False} $" ], "text/plain": [ "" @@ -3994,7 +3994,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{B4.norm2() <= 0}: \\quad \\phi ^{2} \\rho ^{2} \\leq 0 $" + "$\\displaystyle \\text{B4.norm2() <= 0}: \\quad \\text{True} $" ], "text/plain": [ "" @@ -4006,7 +4006,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{(B4.norm2() <= 0) == 0}: \\quad \\text{False} $" + "$\\displaystyle \\text{(B4.norm2() <= 0) == 0}: \\quad \\text{True} $" ], "text/plain": [ "" @@ -4018,7 +4018,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{B4.norm2() > 0}: \\quad \\phi ^{2} \\rho ^{2} > 0 $" + "$\\displaystyle \\text{B4.norm2() > 0}: \\quad \\text{False} $" ], "text/plain": [ "" @@ -4061,7 +4061,7 @@ }, { "cell_type": "markdown", - "id": "c9ece961", + "id": "f18c50b4", "metadata": {}, "source": [ "So as to provide a test of Case 3(b) in the execution of `norm`, the multivector `B4` from `m2_polar` was designed to have a nonpositive `normsquared`. (The various cases are described in the notebook **Code for undualization, grade involution, Clifford conjugation, scalar product, normsquared, and norm**.) The relational `normsquared <= 0` within Case 3(b)'s conditional evaluates to `True`; hence the conditional itself, `(normsquared <= 0) == True`, also evaluates to `True`. The consequent of the `if` statement then executes, returning the `hint`-independent expression `\\sqrt(-normsquared)`.\n", @@ -4073,7 +4073,7 @@ }, { "cell_type": "markdown", - "id": "0986f88c", + "id": "24afcbaa", "metadata": {}, "source": [ "### 6.5. Conclusions from testing the recoded old operations\n", From 32171f03b10eeea8bfb44c2a56960964af8adc96 Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 12 Apr 2024 15:59:35 +0800 Subject: [PATCH 53/78] Revert to use of `sqrt` instead of smarter but too absolute `metric.square_root_of_expr` --- galgebra/mv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galgebra/mv.py b/galgebra/mv.py index 02397d12..a958f355 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -1318,7 +1318,7 @@ def norm(self, hint='0') -> Expr: sign, except when the quadratic form's sign can be determined by other considerations, such as the metric being Euclidean. """ - return simplify(metric.square_root_of_expr(self.norm2(hint))) + return simplify(sqrt(self.norm2(hint))) # ## GSG code ends ### __abs__ = norm # allow `abs(x)` to call z.norm() From caa4cf8e05351fc39409cce1493c2ea089bd3baf Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 12 Apr 2024 16:41:50 +0800 Subject: [PATCH 54/78] Regenerate `test_gsg_undual_etc.ipynb` and carefully examined diff by diff --- .github/workflows/ci.yml | 1 + examples/ipython/test_gsg_undual_etc.ipynb | 46 +++++++++++----------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6c512baf..42ad92cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,6 +70,7 @@ jobs: PYTEST_ARGS+=(-k "$PYTEST_K_FILTER"); fi; pytest \ + -vv \ --cov=galgebra \ --nbval examples/ipython/ \ --nbval examples/primer/ \ diff --git a/examples/ipython/test_gsg_undual_etc.ipynb b/examples/ipython/test_gsg_undual_etc.ipynb index 6922b033..590d64b7 100644 --- a/examples/ipython/test_gsg_undual_etc.ipynb +++ b/examples/ipython/test_gsg_undual_etc.ipynb @@ -2368,7 +2368,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = \\left|{S^{2} + {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{st} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right| $" ], "text/plain": [ "" @@ -2488,7 +2488,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = {\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = \\left|{{\\left ( S^{s} \\right )}^{2} - {\\left ( S^{t} \\right )}^{2}}\\right| $" ], "text/plain": [ "" @@ -2548,7 +2548,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = - {\\left ( S^{st} \\right )}^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = {\\left ( S^{st} \\right )}^{2} $" ], "text/plain": [ "" @@ -2619,7 +2619,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = -25 $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = 25 $" ], "text/plain": [ "" @@ -2739,7 +2739,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = -16 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = 16 $" ], "text/plain": [ "" @@ -2799,7 +2799,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = -37 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = 37 $" ], "text/plain": [ "" @@ -2870,7 +2870,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{A}\\Vert^2 = t^{2} \\left(2 s^{2} + t^{2}\\right) $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{A}\\Vert^2 = t^{2} \\cdot \\left(2 s^{2} + t^{2}\\right) $" ], "text/plain": [ "" @@ -2990,7 +2990,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_1\\Vert^2 = t^{2} \\left(2 s^{2} + t^{2}\\right) $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_1\\Vert^2 = t^{2} \\cdot \\left(2 s^{2} + t^{2}\\right) $" ], "text/plain": [ "" @@ -3050,7 +3050,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_2\\Vert^2 = -25 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{A}\\right>_2\\Vert^2 = 25 $" ], "text/plain": [ "" @@ -3122,7 +3122,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{A3.norm2() <= 0}: \\quad t^{2} \\left(2 s^{2} + t^{2}\\right) \\leq 0 $" + "$\\displaystyle \\text{A3.norm2() <= 0}: \\quad t^{2} \\cdot \\left(2 s^{2} + t^{2}\\right) \\leq 0 $" ], "text/plain": [ "" @@ -3232,7 +3232,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{S}\\Vert^2 = \\left|{S^{2} - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2}}\\right| $" ], "text/plain": [ "" @@ -3352,7 +3352,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = - {\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} + {\\left ( S^{\\rho } \\right )}^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_1\\Vert^2 = \\left|{{\\left ( S^{\\phi } \\right )}^{2} \\rho ^{2} - {\\left ( S^{\\rho } \\right )}^{2}}\\right| $" ], "text/plain": [ "" @@ -3412,7 +3412,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = - {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{S}\\right>_2\\Vert^2 = {\\left ( S^{\\rho \\phi } \\right )}^{2} \\rho ^{2} $" ], "text/plain": [ "" @@ -3491,7 +3491,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = -25 $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{N}\\Vert^2 = 25 $" ], "text/plain": [ "" @@ -3611,7 +3611,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = -16 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_1\\Vert^2 = 16 $" ], "text/plain": [ "" @@ -3671,7 +3671,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = -37 $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{N}\\right>_2\\Vert^2 = 37 $" ], "text/plain": [ "" @@ -3742,7 +3742,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{B}\\Vert^2 = - \\phi ^{2} \\rho ^{2} $" + "$\\displaystyle \\qquad \\implies \\Vert\\mathbf{B}\\Vert^2 = \\phi ^{2} \\rho ^{2} $" ], "text/plain": [ "" @@ -3922,7 +3922,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{B}\\right>_2\\Vert^2 = - \\rho ^{2} \\left(\\phi ^{2} + \\rho ^{2}\\right) $" + "$\\displaystyle \\qquad \\implies \\Vert\\left<\\mathbf{B}\\right>_2\\Vert^2 = - \\rho ^{2} \\left(- \\phi ^{2} - \\rho ^{2}\\right) $" ], "text/plain": [ "" @@ -3970,7 +3970,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{B4.norm2() >= 0}: \\quad - \\phi ^{2} \\rho ^{2} \\geq 0 $" + "$\\displaystyle \\text{B4.norm2() >= 0}: \\quad \\text{True} $" ], "text/plain": [ "" @@ -3982,7 +3982,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{(B4.norm2() >= 0) == 0}: \\quad \\text{False} $" + "$\\displaystyle \\text{(B4.norm2() >= 0) == 0}: \\quad \\text{True} $" ], "text/plain": [ "" @@ -3994,7 +3994,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{B4.norm2() <= 0}: \\quad \\text{True} $" + "$\\displaystyle \\text{B4.norm2() <= 0}: \\quad \\phi ^{2} \\rho ^{2} \\leq 0 $" ], "text/plain": [ "" @@ -4006,7 +4006,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{(B4.norm2() <= 0) == 0}: \\quad \\text{True} $" + "$\\displaystyle \\text{(B4.norm2() <= 0) == 0}: \\quad \\text{False} $" ], "text/plain": [ "" @@ -4018,7 +4018,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{B4.norm2() > 0}: \\quad \\text{False} $" + "$\\displaystyle \\text{B4.norm2() > 0}: \\quad \\phi ^{2} \\rho ^{2} > 0 $" ], "text/plain": [ "" From 530fe5838b9691a8422441f2dfac9f8c7519e166 Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 12 Apr 2024 18:46:41 +0800 Subject: [PATCH 55/78] `norm` now uses `metric.square_root_of_expr` again, with fixes 1. It now accepts a hint that the expr is nonnegative etc, avoiding unnecessary `abs` calls 2. It had a bug that incorrectly assumed that the sqrt of even product is the product of powers divided by 2 is nonnegative, thus lacking an `abs` call. Passing previously failing tests locally without modifying any notebooks: ``` pytest test/test_mv.py -vv pytest --nbval examples/ipython/test_gsg_undual_etc.ipynb --nbval-current-env --nbval-sanitize-with test/.nbval_sanitize.cfg -vv ``` --- galgebra/metric.py | 26 ++++++++++++++++++-------- galgebra/mv.py | 2 +- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/galgebra/metric.py b/galgebra/metric.py index 757ebdc1..28050556 100644 --- a/galgebra/metric.py +++ b/galgebra/metric.py @@ -114,13 +114,17 @@ def collect(A, nc_list): return C -def square_root_of_expr(expr): +def square_root_of_expr(expr, hint='0'): """ - If expression is product of even powers then every power is divided - by two and the product is returned. If some terms in product are - not even powers the sqrt of the absolute value of the expression is - returned. If the expression is a number the sqrt of the absolute - value of the number is returned. + If expression is product of even powers then every power is divided by two + and the absolute value of product is returned. + If some terms in product are not even powers the sqrt of the absolute value of + the expression is returned. + If the expression is a number the sqrt of the absolute value of the number is returned. + + String values '+', '-', or '0' of hint respectively determine + whether expr should be regarded as nonnegative, nonpositive, + or of unknown sign. """ if expr.is_number: if expr > 0: @@ -137,11 +141,17 @@ def square_root_of_expr(expr): coef = sqrt(abs(coef)) # Product coefficient not a number for p in pow_lst: f, n = p + # Product not all even powers if n % 2 != 0: - return sqrt(abs(expr)) # Product not all even powers + if hint == '+': + return sqrt(expr) + elif hint == '-': + return sqrt(-expr) + else: + return sqrt(abs(expr)) else: coef *= f ** (n / S(2)) # Positive sqrt of the square of an expression - return coef + return abs(coef) def symbols_list(s, indices=None, sub=True, commutative=False): diff --git a/galgebra/mv.py b/galgebra/mv.py index a958f355..f8863bab 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -1318,7 +1318,7 @@ def norm(self, hint='0') -> Expr: sign, except when the quadratic form's sign can be determined by other considerations, such as the metric being Euclidean. """ - return simplify(sqrt(self.norm2(hint))) + return simplify(metric.square_root_of_expr(self.norm2(hint), hint='+')) # ## GSG code ends ### __abs__ = norm # allow `abs(x)` to call z.norm() From 395fb39bf429360f245695600de02a294fbba63d Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 15:32:31 +0800 Subject: [PATCH 56/78] Check #514 --- examples/ipython/issue-514.ipynb | 83 ++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 examples/ipython/issue-514.ipynb diff --git a/examples/ipython/issue-514.ipynb b/examples/ipython/issue-514.ipynb new file mode 100644 index 00000000..135a7c80 --- /dev/null +++ b/examples/ipython/issue-514.ipynb @@ -0,0 +1,83 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "c98f4750-3af1-4749-b2a6-8a17764511bd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(e_xyz, e_xyz, 'Iinv+')" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from galgebra.ga import Ga\n", + "import sympy as S\n", + "\n", + "Ga.dual_mode('Iinv+')\n", + "\n", + "ga = Ga('e', g=[1,1,1], coords=S.symbols('x y z', real=True), wedge=False)\n", + "ex,ey,ez = ga.mv()\n", + "I = ga.i\n", + "(ex*I) * (ex*I).dual(), (ex*I).dual() * (ex*I), ga.dual_mode_value" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "95c6f201-9f55-4e5d-9996-6a19b0f915ff", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(ex*I).dual().undual() == (ex*I)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8d2ce01-aae9-46ff-be2d-225138fa30cf", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c85345d0b3db3dae92941b1f54427456ee6c2d34 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 15:33:54 +0800 Subject: [PATCH 57/78] .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 172a254a..11bd29c3 100644 --- a/.gitignore +++ b/.gitignore @@ -142,3 +142,4 @@ examples/**/*.tex test/generated test/diff +examples/GSG/ From b1c0cc09963b2165bdafd5c419a632d37c1609ff Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 15:35:40 +0800 Subject: [PATCH 58/78] Should not need abs after the treatment above --- galgebra/metric.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galgebra/metric.py b/galgebra/metric.py index 28050556..f5c7a356 100644 --- a/galgebra/metric.py +++ b/galgebra/metric.py @@ -151,7 +151,7 @@ def square_root_of_expr(expr, hint='0'): return sqrt(abs(expr)) else: coef *= f ** (n / S(2)) # Positive sqrt of the square of an expression - return abs(coef) + return coef def symbols_list(s, indices=None, sub=True, commutative=False): From 8b81630e53893bc443ec9e44857ce23f62297b88 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 15:50:04 +0800 Subject: [PATCH 59/78] Make it clear that the version is now 0.6.0-dev --- galgebra/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galgebra/_version.py b/galgebra/_version.py index 5aa7f5f3..a3aa75ae 100644 --- a/galgebra/_version.py +++ b/galgebra/_version.py @@ -5,4 +5,4 @@ # 1) we don't load dependencies by storing it in __init__.py # 2) we can import it in setup.py for the same reason # 3) we can import it into your module -__version__ = '0.5.2' +__version__ = '0.6.0-dev' From f53b98ac7440a632737ecb0b266ef3ae3c608ab2 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 17:11:04 +0800 Subject: [PATCH 60/78] Try extract abs_with_hint --- galgebra/metric.py | 33 +++++++++++++++++++++++++++++++-- galgebra/mv.py | 22 +++------------------- test/.nbval_sanitize.cfg | 2 +- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/galgebra/metric.py b/galgebra/metric.py index f5c7a356..c6028f13 100644 --- a/galgebra/metric.py +++ b/galgebra/metric.py @@ -9,7 +9,7 @@ from sympy import ( diff, trigsimp, Matrix, Rational, sqf_list, sqrt, eye, S, expand, Mul, - Add, simplify, Expr, Function, MatrixSymbol + Add, simplify, Expr, Abs, Function, MatrixSymbol ) from . import printer @@ -114,6 +114,35 @@ def collect(A, nc_list): return C +def abs_with_hint(expr, hint: str) -> Expr: + """ + Heuristics for simplifying the absolute value of an expression with hints. + """ + + # Case1: expr is numeric + if expr.is_number: + return Abs(expr) + # # Case2: metric is positive definite + # if self.Ga.g.is_positive_definite: + # return expr + # Case3: expr is nonnegative + if (expr >= 0) == True: # noqa: E712 + return +expr + # Case4: expr is nonpositive + if (expr <= 0) == True: # noqa: E712 + return -expr + + # Case5: expr's sign is unknown, so use `hint`. + if hint == '0': + return Abs(expr) + elif hint == '+': + return +expr + elif hint == '-': + return -expr + else: + raise ValueError("hint must be '0', '+', or '-'.") + + def square_root_of_expr(expr, hint='0'): """ If expression is product of even powers then every power is divided by two @@ -151,7 +180,7 @@ def square_root_of_expr(expr, hint='0'): return sqrt(abs(expr)) else: coef *= f ** (n / S(2)) # Positive sqrt of the square of an expression - return coef + return abs_with_hint(coef) def symbols_list(s, indices=None, sub=True, commutative=False): diff --git a/galgebra/mv.py b/galgebra/mv.py index f8863bab..77ffddd6 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -1280,28 +1280,12 @@ def norm2(self, hint: str = '0') -> Expr: Euclidean. """ quadform = self.qform() # the quadratic form at `self` - # Case1: quadform is numeric - if quadform.is_number: - return Abs(quadform) + # Case2: metric is positive definite if self.Ga.g.is_positive_definite: return quadform - # Case3: quadform is nonnegative - if (quadform >= 0) == True: # noqa: E712 - return +quadform - # Case4: quadform is nonpositive - if (quadform <= 0) == True: # noqa: E712 - return -quadform - - # Case5: quadform's sign is unknown, so use `hint`. - if hint == '0': - return Abs(quadform) - elif hint == '+': - return +quadform - elif hint == '-': - return -quadform - else: - raise ValueError("hint must be '0', '+', or '-'.") + + return metric.abs_with_hint(quadform, hint) # ## GSG code ends ### # ## GSG code starts ### diff --git a/test/.nbval_sanitize.cfg b/test/.nbval_sanitize.cfg index a0c09986..d4c3f945 100644 --- a/test/.nbval_sanitize.cfg +++ b/test/.nbval_sanitize.cfg @@ -54,5 +54,5 @@ replace: {Python } regex: \{SymPy \}(\d+\.\d+(\.\d+)?(\.dev)?) replace: {SymPy } # \text{GAlgebra }0.5.0 -regex: \{GAlgebra \}(\d+\.\d+(\.\d+)?) +regex: \{GAlgebra \}(\d+\.\d+(\.\d+)?(-dev)?) replace: {GAlgebra } From 099da6ca0b2b7c132c2b9fc9ed338e98a0e29419 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 17:25:01 +0800 Subject: [PATCH 61/78] Default hint to 0 --- galgebra/metric.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galgebra/metric.py b/galgebra/metric.py index c6028f13..e8bd6f4e 100644 --- a/galgebra/metric.py +++ b/galgebra/metric.py @@ -114,7 +114,7 @@ def collect(A, nc_list): return C -def abs_with_hint(expr, hint: str) -> Expr: +def abs_with_hint(expr, hint: str = '0') -> Expr: """ Heuristics for simplifying the absolute value of an expression with hints. """ From 9e2e9b0b85185089bf9d4e71765f37ac0a0ff8d0 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 17:40:05 +0800 Subject: [PATCH 62/78] Simplify square_root_of_expr --- galgebra/metric.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/galgebra/metric.py b/galgebra/metric.py index e8bd6f4e..fe6300b6 100644 --- a/galgebra/metric.py +++ b/galgebra/metric.py @@ -156,10 +156,7 @@ def square_root_of_expr(expr, hint='0'): or of unknown sign. """ if expr.is_number: - if expr > 0: - return sqrt(expr) - else: - return sqrt(-expr) + return sqrt(abs_with_hint(expr, hint)) else: expr = trigsimp(expr) coef, pow_lst = sqf_list(expr) @@ -172,12 +169,7 @@ def square_root_of_expr(expr, hint='0'): f, n = p # Product not all even powers if n % 2 != 0: - if hint == '+': - return sqrt(expr) - elif hint == '-': - return sqrt(-expr) - else: - return sqrt(abs(expr)) + return sqrt(abs_with_hint(expr, hint)) else: coef *= f ** (n / S(2)) # Positive sqrt of the square of an expression return abs_with_hint(coef) From 4c616bdf25390772dd8b8211c3f53c5c65c2c873 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 18:35:28 +0800 Subject: [PATCH 63/78] Less CI during this PR --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 42ad92cd..5a6a7549 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: && !contains(github.event.head_commit.message, '[skip tests]') strategy: matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] + python-version: ["3.11"] # "3.8", "3.9", "3.10", fail-fast: false runs-on: ubuntu-latest steps: From 2bfcb035ce64d4fa19931418c20419cf263332ce Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 19:53:20 +0800 Subject: [PATCH 64/78] Return coef without abs --- galgebra/metric.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galgebra/metric.py b/galgebra/metric.py index fe6300b6..aa26f91b 100644 --- a/galgebra/metric.py +++ b/galgebra/metric.py @@ -172,7 +172,7 @@ def square_root_of_expr(expr, hint='0'): return sqrt(abs_with_hint(expr, hint)) else: coef *= f ** (n / S(2)) # Positive sqrt of the square of an expression - return abs_with_hint(coef) + return coef def symbols_list(s, indices=None, sub=True, commutative=False): From d75db2e078f0e9cb9fe055b38215b37148ac2a90 Mon Sep 17 00:00:00 2001 From: utensil Date: Thu, 9 May 2024 22:24:19 +0800 Subject: [PATCH 65/78] Regenerate `test_gsg_undual_etc.ipynb` for examination --- examples/ipython/test_gsg_undual_etc.ipynb | 58 +++++++++++----------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/examples/ipython/test_gsg_undual_etc.ipynb b/examples/ipython/test_gsg_undual_etc.ipynb index 590d64b7..85d4b49d 100644 --- a/examples/ipython/test_gsg_undual_etc.ipynb +++ b/examples/ipython/test_gsg_undual_etc.ipynb @@ -83,7 +83,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\text{This notebook is now using} \\\\\\qquad\\bullet~ \\text{Python }3.11.8\\qquad\\bullet~ \\text{SymPy }1.12\\qquad\\bullet~ \\text{GAlgebra }0.5.1.$" + "$\\displaystyle \\text{This notebook is now using} \\\\\\qquad\\bullet~ \\text{Python }3.9.18\\qquad\\bullet~ \\text{SymPy }1.12\\qquad\\bullet~ \\text{GAlgebra }0.6.0-dev.$" ], "text/plain": [ "" @@ -1404,7 +1404,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -1416,7 +1416,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -1428,7 +1428,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -1524,7 +1524,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{xy} \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -1536,7 +1536,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{xy} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -1548,7 +1548,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{xy}}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{xy} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -1918,7 +1918,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -1930,7 +1930,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -1942,7 +1942,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2038,7 +2038,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{r\\theta } r \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -2050,7 +2050,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{r\\theta } r \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2062,7 +2062,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = r \\left|{S^{r\\theta }}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{r\\theta } r \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2440,7 +2440,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -2452,7 +2452,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2464,7 +2464,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -2560,7 +2560,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{st} \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -2572,7 +2572,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{st} \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -2584,7 +2584,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\left|{S^{st}}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{st} \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3304,7 +3304,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -3316,7 +3316,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3328,7 +3328,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = \\left|{S}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_0\\vert = S \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3424,7 +3424,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{\\rho \\phi } \\rho \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -3436,7 +3436,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{\\rho \\phi } \\rho \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3448,7 +3448,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = \\rho \\left|{S^{\\rho \\phi }}\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\left<\\mathbf{S}\\right>_2\\vert = S^{\\rho \\phi } \\rho \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -3754,7 +3754,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\implies \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '0'}$" + "$\\displaystyle \\qquad \\implies \\vert\\mathbf{B}\\vert = \\phi \\rho \\quad \\text{ when hint is '0'}$" ], "text/plain": [ "" @@ -3766,7 +3766,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '+'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\phi \\rho \\quad \\text{ when hint is '+'}$" ], "text/plain": [ "" @@ -3778,7 +3778,7 @@ { "data": { "text/latex": [ - "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\rho \\left|{\\phi }\\right| \\quad \\text{ when hint is '-'}$" + "$\\displaystyle \\qquad \\qquad\\; \\vert\\mathbf{B}\\vert = \\phi \\rho \\quad \\text{ when hint is '-'}$" ], "text/plain": [ "" @@ -4098,7 +4098,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.8" + "version": "3.9.18" } }, "nbformat": 4, From 48840051caf823e6ad86716746c4fbfbc7c441d8 Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 12:09:35 +0800 Subject: [PATCH 66/78] Add --durations=50 to inspect slow tests --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a6a7549..66a7ea07 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,7 +70,7 @@ jobs: PYTEST_ARGS+=(-k "$PYTEST_K_FILTER"); fi; pytest \ - -vv \ + -vv --durations=50 \ --cov=galgebra \ --nbval examples/ipython/ \ --nbval examples/primer/ \ From eefc1d1a3d0b9c2399f547e668d9c3621d27ab5a Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 12:14:56 +0800 Subject: [PATCH 67/78] Check #511 --- examples/ipython/issue-511.ipynb | 59 ++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 examples/ipython/issue-511.ipynb diff --git a/examples/ipython/issue-511.ipynb b/examples/ipython/issue-511.ipynb new file mode 100644 index 00000000..5d0ef59f --- /dev/null +++ b/examples/ipython/issue-511.ipynb @@ -0,0 +1,59 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "c037437a-5863-4af2-82fb-3f715a984ad0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1, e_0)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from galgebra.ga import Ga\n", + "import sympy as S\n", + "\n", + "ga = Ga('e', g=[1,1,1], coords=S.symbols(f\"0:{3}\", real=True), wedge=False)\n", + "ex,ey,ez = ga.mv()\n", + "ex**-1, ga.mv(1)/ex" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea2d702a-dd04-4f5c-8794-1efefc8e7ee9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From a013329f1ed118a04dbf53c5e99d4fb4948a7e0f Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 13:03:32 +0800 Subject: [PATCH 68/78] Add type annotation for self.Ga in Mv --- galgebra/mv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galgebra/mv.py b/galgebra/mv.py index 77ffddd6..ddf5933c 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -273,7 +273,7 @@ def _make_odd(ga: 'Ga', __name: str, **kwargs) -> Expr: _make_spinor = _make_even # alias for compatibility with old code ### GSSG: removed alias `_make_even = _make_spinor_` - def __init__(self, *args, ga, recp=None, coords=None, **kwargs): + def __init__(self, *args, ga: 'Ga', recp=None, coords=None, **kwargs): """ __init__(self, *args, ga, recp=None, **kwargs) From f83f63f1632b7ad0b317ffffae9a4c0a4b657cbe Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 13:17:31 +0800 Subject: [PATCH 69/78] Fixes #513 --- examples/ipython/issue-513.ipynb | 196 +++++++++++++++++++++++++++++++ galgebra/ga.py | 5 +- 2 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 examples/ipython/issue-513.ipynb diff --git a/examples/ipython/issue-513.ipynb b/examples/ipython/issue-513.ipynb new file mode 100644 index 00000000..5e42d46c --- /dev/null +++ b/examples/ipython/issue-513.ipynb @@ -0,0 +1,196 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "26c91d51-9f62-4c3e-9d02-2ca3a0977913", + "metadata": {}, + "outputs": [], + "source": [ + "from galgebra.ga import Ga\n", + "import sympy as S\n", + "\n", + "x,y,z = coords = S.symbols('x y z', real=True)\n", + "ga = Ga('e', g=[1,1,1], coords=coords, wedge=False)\n", + "ex,ey,ez = ga.mv()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5d541f6c-f9f8-4adb-a4b5-5ab27a9293dc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{e}_{x} \\frac{\\partial}{\\partial x} + \\mathbf{e}_{y} \\frac{\\partial}{\\partial y} + \\mathbf{e}_{z} \\frac{\\partial}{\\partial z}$" + ], + "text/plain": [ + "e_x*D{x} + e_y*D{y} + e_z*D{z}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ga.grad" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d07a0e79-b467-4cef-9ea6-3b49e925bf0e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 1$" + ], + "text/plain": [ + "1" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ga.grad * (x*ex)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "417d322c-30f5-4353-9f32-cc39cb7b2d8e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{e}_{x}$" + ], + "text/plain": [ + "e_x" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(x*ex).diff(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7d66fe00-5011-4946-ad4f-9ae6f38c315d", + "metadata": {}, + "outputs": [], + "source": [ + "x,y,z = coords = S.symbols('x y z', real=True)\n", + "ga = Ga('e', g=[1,1,1], coords=coords, wedge=False)\n", + "ex,ey,ez = ga.mv()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7bac45e6-985f-497d-b13e-b40f9150dfd5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{e}_{x} \\frac{\\partial}{\\partial x} + \\mathbf{e}_{y} \\frac{\\partial}{\\partial y} + \\mathbf{e}_{z} \\frac{\\partial}{\\partial z}$" + ], + "text/plain": [ + "e_x*D{x} + e_y*D{y} + e_z*D{z}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ga.grad" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2f8161af-c147-4fcf-adfa-53613b24210f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 1$" + ], + "text/plain": [ + "1" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ga.grad * (x*ex)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "231177c9-3422-4e33-9ace-d914502ba060", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\mathbf{e}_{x}$" + ], + "text/plain": [ + "e_x" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(x*ex).pdiff(x) # notice this is pdiff() not diff() this tim" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/galgebra/ga.py b/galgebra/ga.py index c88a0d35..68956561 100644 --- a/galgebra/ga.py +++ b/galgebra/ga.py @@ -2049,7 +2049,10 @@ def pDiff(self, A: _mv.Mv, coord: Union[List, Symbol]) -> _mv.Mv: # Simple partial differentiation, once with respect to a single # variable, but including case of non-constant basis vectors - dA = self.mv(expand(diff(A.obj, coord))) + if isinstance(A, mv.Mv): + A = A.obj + + dA = self.mv(expand(diff(A, coord))) if self.connect_flg and self.dslot == -1 and not A.is_scalar(): # Basis blades are function of coordinates B = self.remove_scalar_part(A) From b5c6a6c6db3d12ff2a33663d426af384a6931c13 Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 13:52:52 +0800 Subject: [PATCH 70/78] Fixes #516 --- examples/ipython/issue-516.ipynb | 59 ++++++++++++++++++++++++++++++++ galgebra/mv.py | 1 + 2 files changed, 60 insertions(+) create mode 100644 examples/ipython/issue-516.ipynb diff --git a/examples/ipython/issue-516.ipynb b/examples/ipython/issue-516.ipynb new file mode 100644 index 00000000..5360e912 --- /dev/null +++ b/examples/ipython/issue-516.ipynb @@ -0,0 +1,59 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "ee7c8882-7356-441a-920e-3603d081002b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1]\n", + "[1]\n" + ] + } + ], + "source": [ + "from galgebra.ga import Ga\n", + "import sympy as S\n", + "\n", + "ga = Ga('e', g=[1,1,1], coords=S.symbols(f\"0:3\", real=True), wedge=False)\n", + "x,y,z = ga.mv()\n", + "a = ga.mv('A','mv')\n", + "print((a.grade(0)*x).grades)\n", + "print((a.grade(0)^x).grades)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8920d631-eb4f-4955-9558-9dc158b5171e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/galgebra/mv.py b/galgebra/mv.py index ddf5933c..32c2dd2d 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -368,6 +368,7 @@ def __init__(self, *args, ga: 'Ga', recp=None, coords=None, **kwargs): self.obj = x.obj self.is_blade_rep = x.is_blade_rep self.i_grade = x.i_grade + self.characterise_Mv() else: if isinstance(x, Expr): # copy constructor for obj expression self.obj = x From 60962d7d23c9f55c7d64a7aa6bd69de1973d0841 Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 13:59:08 +0800 Subject: [PATCH 71/78] Fixes #513 again --- galgebra/ga.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/galgebra/ga.py b/galgebra/ga.py index 68956561..feb8b40e 100644 --- a/galgebra/ga.py +++ b/galgebra/ga.py @@ -2049,10 +2049,7 @@ def pDiff(self, A: _mv.Mv, coord: Union[List, Symbol]) -> _mv.Mv: # Simple partial differentiation, once with respect to a single # variable, but including case of non-constant basis vectors - if isinstance(A, mv.Mv): - A = A.obj - - dA = self.mv(expand(diff(A, coord))) + dA = self.mv(expand(diff(A if isinstance(A, Expr) else A.obj, coord))) if self.connect_flg and self.dslot == -1 and not A.is_scalar(): # Basis blades are function of coordinates B = self.remove_scalar_part(A) From 1ee32c51fbb72beaa936d82ca3f6a1e535e50c3c Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 15:07:06 +0800 Subject: [PATCH 72/78] Add "Migrating guide for readers of LAGA&VAGC" [skip tests] --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index e1ad0f94..1c3fe2bd 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,9 @@ Development Status The fork supports Python 3, increases test coverage, sets up CI and linters, maintains releases to [PyPI](https://pypi.org/project/galgebra/#history), improves [docs](http://galgebra.readthedocs.io) and has many bug fixes, see [Changelog](https://galgebra.readthedocs.io/en/latest/changelog.html). +> [!INFO] +> Readers of [Linear and Geometric Algebra](http://www.faculty.luther.edu/~macdonal/laga/index.html) and [Vector and Geometric Calculus](http://www.faculty.luther.edu/~macdonal/vagc/index.html), please check out **Migrating guide for readers of LAGA&VAGC** below. + Features -------------------- @@ -214,6 +217,15 @@ Migration Guide > Note: The APIs have changed since the era of `sympy.galgebra` and `brombo/galgebra`, some properties and methods are deprecated, the supported versions of Python and SymPy have also changed, please check [Changelog](https://galgebra.readthedocs.io/en/latest/changelog.html) and further update your scripts accordingly besides the following. If you encounter any problems, feel free to [open an issue](https://github.com/pygae/galgebra/issues/new)! +### Migrating guide for readers of LAGA&VAGC + +Readers of [Linear and Geometric Algebra](http://www.faculty.luther.edu/~macdonal/laga/index.html) and [Vector and Geometric Calculus](http://www.faculty.luther.edu/~macdonal/vagc/index.html) might be guided by [GAlgebra Primer](http://www.faculty.luther.edu/~macdonal/GAlgebraPrimer.pdf) (version November 29, 2022, accessed May, 2024) to download [GAfiles.zip](http://www.faculty.luther.edu/~macdonal/GAfiles.zip) and copy `gprinter.py`, `lt.py`, `mv.py`, and `GAlgebraInit.py`ΒΈ into where GAlgebra is installed. These steps are NO LONGER NEEDED since GAlgebra 0.6.0 as they are merge into GAlgebra with tests, copying these files will cause conflicts and regressions of fixed bugs. + +For minor differences to those files, please check out [the change log for GAlgebra 0.6.0](https://galgebra.readthedocs.io/en/latest/changelog.html#0.6.0). Also please note that: + +- `GAlgebraInit.py` is renamed to `primer.py` and can be imported like `from galgebra.primer import *` but it's usage is discouraged, although it saves some boilerplate code, this is not part of GAlgebra's maintained API, GAlgebra might remove it in future. +- Some notebooks from the zip is included in GAlgebra in `examples/primer`. + ### Migrating from [sympy.galgebra](https://docs.sympy.org/0.7.6.1/modules/galgebra/) GAlgebra is no longer part of SymPy since 1.0.0, if you have an import like this in your source: From 15069c5b6f40157d6efe3cb1556767043ff81a87 Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 15:30:02 +0800 Subject: [PATCH 73/78] Fix typos [skip tests] --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1c3fe2bd..899cab2f 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,10 @@ Development Status The fork supports Python 3, increases test coverage, sets up CI and linters, maintains releases to [PyPI](https://pypi.org/project/galgebra/#history), improves [docs](http://galgebra.readthedocs.io) and has many bug fixes, see [Changelog](https://galgebra.readthedocs.io/en/latest/changelog.html). -> [!INFO] -> Readers of [Linear and Geometric Algebra](http://www.faculty.luther.edu/~macdonal/laga/index.html) and [Vector and Geometric Calculus](http://www.faculty.luther.edu/~macdonal/vagc/index.html), please check out **Migrating guide for readers of LAGA&VAGC** below. +> [!NOTE] +> Readers of Prof. Alan Macdonald's [Linear and Geometric Algebra](http://www.faculty.luther.edu/~macdonal/laga/index.html) and [Vector and Geometric Calculus](http://www.faculty.luther.edu/~macdonal/vagc/index.html), please check out [**Migrating guide for readers of LAGA&VAGC**](#migrating-guide-for-readers-of-lagavagc) below. +> +> If you are coming from [sympy.galgebra](https://docs.sympy.org/0.7.6.1/modules/galgebra/) or [brombo/galgebra](https://github.com/brombo/galgebra), please check out section [Migration Guide](#migration-guide) below. Features -------------------- @@ -155,8 +157,6 @@ You may also check out more examples [here](https://github.com/pygae/galgebra/bl For detailed documentation, please visit https://galgebra.readthedocs.io/ . -**NOTE:** If you are coming from [sympy.galgebra](https://docs.sympy.org/0.7.6.1/modules/galgebra/) or [brombo/galgebra](https://github.com/brombo/galgebra), please check out section [Migration Guide](#migration-guide) below. - From 1a9a60563a2c0fe11feb1088d989a692fc84cf82 Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 18:28:56 +0800 Subject: [PATCH 74/78] Fix #511 --- examples/ipython/issue-511.ipynb | 145 ++++++++++++++++++++++++++++++- galgebra/mv.py | 3 + 2 files changed, 146 insertions(+), 2 deletions(-) diff --git a/examples/ipython/issue-511.ipynb b/examples/ipython/issue-511.ipynb index 5d0ef59f..5902a167 100644 --- a/examples/ipython/issue-511.ipynb +++ b/examples/ipython/issue-511.ipynb @@ -9,7 +9,7 @@ { "data": { "text/plain": [ - "(1, e_0)" + "(e_0, e_0)" ] }, "execution_count": 1, @@ -28,9 +28,150 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "ea2d702a-dd04-4f5c-8794-1efefc8e7ee9", "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{1}{8} \\mathbf{e}_{0}$" + ], + "text/plain": [ + "e_0/8" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(2*ex)**-3" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "09faf76e-f43c-4023-be91-3f2460de0456", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{1}{65536}$" + ], + "text/plain": [ + "1/65536" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(2*ex)**-16" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "91e20a05-ba7d-48cd-8916-d7460fb99e87", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(2*e_0/29 + 3*e_1/29 + 4*e_2/29, 2*e_0/841 + 3*e_1/841 + 4*e_2/841)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "((2*ex + 3*ey + 4*ez).inv(), (2*ex + 3*ey + 4*ez)**-3)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "bdf6ce81-ab58-4e3b-aa72-6cd320e6062d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{1}{841}$" + ], + "text/plain": [ + "1/841" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(2*ex + 3*ey + 4*ez).inv() * (2*ex + 3*ey + 4*ez)**-3" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2a557448-ac80-4b1c-87a0-0d25d731953c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 1$" + ], + "text/plain": [ + "1" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "((2*ex + 3*ey + 4*ez)**3) * (2*ex + 3*ey + 4*ez)**-3" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "fd88f171-7f74-4112-9123-e986d8d92d76", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 1$" + ], + "text/plain": [ + "1" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(2*ex + 3*ey + 4*ez)**-3 * ((2*ex + 3*ey + 4*ez)**3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47ca185d-a790-4ba9-9c45-265572e6675d", + "metadata": {}, "outputs": [], "source": [] } diff --git a/galgebra/mv.py b/galgebra/mv.py index 32c2dd2d..7a652123 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -815,6 +815,9 @@ def __ror__(self, A): # dot (|) product def __pow__(self, n): # Integer power operator if not isinstance(n, int): raise ValueError('!!!!Multivector power can only be to integer power!!!!') + + if n < 0: + return (self**(-n)).inv() result = S.One for x in range(n): From 3f3c29db5024882cececed275ff76e323f3f3d65 Mon Sep 17 00:00:00 2001 From: utensil Date: Fri, 10 May 2024 18:30:30 +0800 Subject: [PATCH 75/78] lint --- galgebra/mv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galgebra/mv.py b/galgebra/mv.py index 7a652123..cda90822 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -815,7 +815,7 @@ def __ror__(self, A): # dot (|) product def __pow__(self, n): # Integer power operator if not isinstance(n, int): raise ValueError('!!!!Multivector power can only be to integer power!!!!') - + if n < 0: return (self**(-n)).inv() From 24383a5526dfa79d607095600b4f964f656571fa Mon Sep 17 00:00:00 2001 From: utensil Date: Sat, 11 May 2024 13:25:29 +0800 Subject: [PATCH 76/78] Try fix #518 --- examples/ipython/issue-518.ipynb | 86 ++++++++++++++++++++++++++++++++ galgebra/mv.py | 2 +- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 examples/ipython/issue-518.ipynb diff --git a/examples/ipython/issue-518.ipynb b/examples/ipython/issue-518.ipynb new file mode 100644 index 00000000..2e891d10 --- /dev/null +++ b/examples/ipython/issue-518.ipynb @@ -0,0 +1,86 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "2956314d-53f6-4150-ab15-90eaa84e8815", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 1$" + ], + "text/plain": [ + "1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from galgebra.ga import Ga\n", + "import sympy as S\n", + "\n", + "ga = Ga('e', g=[1,1,1], coords=S.symbols(f\"0:{3}\", real=True), wedge=False)\n", + "x,y,z = ga.mv()\n", + "(x**0).grade()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2fa9ab19-eb44-4eb8-b369-453cd779a249", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 1$" + ], + "text/plain": [ + "1" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(x**2).grade()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b287705-2c5a-4a6b-88f4-ba7c7c336947", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/galgebra/mv.py b/galgebra/mv.py index cda90822..e18c4ed4 100644 --- a/galgebra/mv.py +++ b/galgebra/mv.py @@ -819,7 +819,7 @@ def __pow__(self, n): # Integer power operator if n < 0: return (self**(-n)).inv() - result = S.One + result = Mv(S.One, 'scalar', ga=self.Ga) for x in range(n): result *= self return result From d0b7489a9d2e10a5f0f7fe90bb17e2cb1a9adeb3 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 14 May 2024 23:44:50 +0800 Subject: [PATCH 77/78] Add changelog entries for #511, #513, #516 and #518 --- doc/changelog.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/changelog.rst b/doc/changelog.rst index e8a9c710..ee20e9b0 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -8,6 +8,14 @@ Changelog \newcommand {\es}[1] {\mathbf{e}_{#1}} \newcommand {\til}[1] {\widetilde{#1}} +- :bug:`518` :class:`~galgebra.mv.Mv` now correctly returns ``Mv`` instance when raise to power of zero. But in general, if one needs to call ``Mv`` methods on a result returned by some GA operations, it would be more prudent to initialize it as an ``Mv`` instance first, as sometimes the result becomes a ``sympy`` object. + +- :bug:`516` :attr:`~galgebra.mv.Mv.grades` no longer incorrectly returns ``None`` under some circumstances, as now all initialization branch will correctly call :meth:`~galgebra.mv.Mv.characterise_Mv`. + +- :bug:`513` :class:`~galgebra.mv.Mv` now correctly handles differentiating by a coordinate symbol. + +- :bug:`511` :class:`~galgebra.mv.Mv` now correctly handles negative integer power. + - :feature:`510` Added :class:`~galgebra.gprinter.gprint` by Alan Bromborsky developed back in 2020, which improved printing of text and LaTeX for multiple GA objects in Jupytper notebooks, and is the recommended way to print GA formulas, see :doc:`tutorials/gprint` for a demonstration. Testability and test coverage are improved. - :support:`510` Testing infrastructure for generating and diffing PDFs is added, see ``test/test_gprinter.py`` and ``.github/workflows/ci.yml`` for details. From 0defe0cc14c3ed490883e8aae227f6bae2af1998 Mon Sep 17 00:00:00 2001 From: utensil Date: Tue, 14 May 2024 23:45:33 +0800 Subject: [PATCH 78/78] Resume full CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66a7ea07..2dc787a9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: && !contains(github.event.head_commit.message, '[skip tests]') strategy: matrix: - python-version: ["3.11"] # "3.8", "3.9", "3.10", + python-version: ["3.8", "3.9", "3.10", "3.11"] fail-fast: false runs-on: ubuntu-latest steps: