canonical
The canonical representative of this dipole — useful for unoriented equivalence.
a.canonical == b.canonical detects the same endpoints under opposed wedge orders. The canonical orientation makes the first non-zero of (gx, gy) positive, negating all six components when it flips; the sign decision reads rounded components, so a == b implies a.canonical == b.canonical. At infinity the rounded g-part is zero and the dipole is returned unchanged (at-infinity weights are data). The representative is rebuilt through copy, so a subclass comes back as its own class; an already-canonical dipole returns this.