fix(mv): wrap norm() in Abs for even-grade multivectors#554
Merged
utensil merged 3 commits intopygae:masterfrom Mar 31, 2026
Merged
fix(mv): wrap norm() in Abs for even-grade multivectors#554utensil merged 3 commits intopygae:masterfrom
utensil merged 3 commits intopygae:masterfrom
Conversation
The norm method could return expressions like s instead of Abs(s) for scalar and even-grade multivectors. Now norm checks whether the result from square_root_of_expr is guaranteed nonneg, and wraps it in Abs when it is not. Fixes #6
The norm/abs/bar fix (issue pygae#522) changes how these operations are printed in LaTeX. Update saved notebook outputs to match.
|
Check out this pull request on See visual diffs & provide feedback on Jupyter Notebooks. Powered by ReviewNB |
Member
|
Thanks for addressing this. Two requests: 1. Dead code. The 2. Test coverage. The test only covers Euclidean G3. Issue #522 (and PR #510) specifically call out non-Euclidean metrics as the hard case. Please add: # non-Euclidean: symbolic vector where norm may not be provably nonneg
g2mn = Ga('e', g=[1, -1], coords=symbols('x t', real=True))
v = g2mn.mv('v', 'vector')
assert v.norm(hint='+').is_nonnegative |
Contributor
Author
|
Addressed both:
Pushed in a16d314. |
utiberious
added a commit
to utiberious/galgebra
that referenced
this pull request
Apr 1, 2026
Groups new entries by: features, bug fixes, examples/docs, tests/maintenance. Features: Cl() kingdon interface (pygae#550, closes pygae#524), Mv.__rtruediv__ (pygae#543, closes pygae#512), shirokov_inverse/hitzer_inverse (pygae#530). Bugs: interop dual mode contamination (pygae#556, closes pygae#555), norm() Abs wrapping (pygae#554, closes pygae#522), is_versor() improvement (pygae#536, closes pygae#533). Examples/docs: sundial + cheatsheet tests (pygae#549+pygae#557, closes pygae#506), coords tutorial (pygae#551), README ops (pygae#548, closes pygae#523). Tests/maintenance: lt.matrix() regression tests (pygae#558, closes pygae#461), extra-cdot regression test (pygae#545), er_blade + ReciprocalFrame refactors (pygae#552+pygae#553), CI fix (pygae#535).
utensil
pushed a commit
that referenced
this pull request
Apr 1, 2026
* docs: add 0.6.0 changelog entries Groups new entries by: features, bug fixes, examples/docs, tests/maintenance. Features: Cl() kingdon interface (#550, closes #524), Mv.__rtruediv__ (#543, closes #512), shirokov_inverse/hitzer_inverse (#530). Bugs: interop dual mode contamination (#556, closes #555), norm() Abs wrapping (#554, closes #522), is_versor() improvement (#536, closes #533). Examples/docs: sundial + cheatsheet tests (#549+#557, closes #506), coords tutorial (#551), README ops (#548, closes #523). Tests/maintenance: lt.matrix() regression tests (#558, closes #461), extra-cdot regression test (#545), er_blade + ReciprocalFrame refactors (#552+#553), CI fix (#535). * docs: add missing issue link for #551 entry * docs: add changelog entry for #560 (Lt callable zero fix) * docs: move Lt zero fix into bug group, use issue #540 as reference
utiberious
added a commit
to utiberious/galgebra
that referenced
this pull request
Apr 2, 2026
* Fix norm to always return nonneg value for even grades The norm method could return expressions like s instead of Abs(s) for scalar and even-grade multivectors. Now norm checks whether the result from square_root_of_expr is guaranteed nonneg, and wraps it in Abs when it is not. Fixes #6 * Update test_gsg_undual_etc notebook output for norm/abs/bar changes The norm/abs/bar fix (issue pygae#522) changes how these operations are printed in LaTeX. Update saved notebook outputs to match. * Remove dead code branch, add non-Euclidean norm test
utiberious
added a commit
to utiberious/galgebra
that referenced
this pull request
Apr 2, 2026
* docs: add 0.6.0 changelog entries Groups new entries by: features, bug fixes, examples/docs, tests/maintenance. Features: Cl() kingdon interface (pygae#550, closes pygae#524), Mv.__rtruediv__ (pygae#543, closes pygae#512), shirokov_inverse/hitzer_inverse (pygae#530). Bugs: interop dual mode contamination (pygae#556, closes pygae#555), norm() Abs wrapping (pygae#554, closes pygae#522), is_versor() improvement (pygae#536, closes pygae#533). Examples/docs: sundial + cheatsheet tests (pygae#549+pygae#557, closes pygae#506), coords tutorial (pygae#551), README ops (pygae#548, closes pygae#523). Tests/maintenance: lt.matrix() regression tests (pygae#558, closes pygae#461), extra-cdot regression test (pygae#545), er_blade + ReciprocalFrame refactors (pygae#552+pygae#553), CI fix (pygae#535). * docs: add missing issue link for pygae#551 entry * docs: add changelog entry for pygae#560 (Lt callable zero fix) * docs: move Lt zero fix into bug group, use issue pygae#540 as reference
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes
norm()to always return a nonnegative value by wrapping the result inAbswhen the multivector has even-grade components (where the norm-squared can be negative, e.g. for timelike vectors in Minkowski space).Previously,
norm()could return expressions with no absolute value bars for even grades, which is mathematically incorrect since the norm should always be nonnegative.Fixes #522
Changes
galgebra/mv.py: Wrapnorm()result inAbs()when the squared norm may be negativetest/test_mv.py: Add test verifyingnorm()returns nonneg for even-grade multivectorsexamples/ipython/test_gsg_undual_etc.ipynb: Update notebook outputs for norm/abs changesTest plan