Skip to content

Changes since version 2.5.0

New Features

  • Expression / AffineExpression project_onto — restrict an expression to a blade subspace (MV → its non-zero blades, BladeMask → exact id membership), with a module-level project_onto(x, other) dispatcher and an N3 Euclidean projection example.
  • TwistBivector operator — an N3-only, grade-2 twist bivector built from a rotor + translator via a motor, with create_var / mask_for support (not visualizable).

Bug Fixes

  • AffineExpression.rename_var no longer raises on terms missing the variable — it renames only in the terms that contain it and leaves the others unchanged, while still raising for a name absent from every term or a cross-term name collision.
  • BladeMask(alg, []) now returns an empty mask — and intersection / union / from_mv handle the empty case correctly (the tensor product also gained a zero-tensor fast path for genuinely empty result masks).