Skip to content

Split A.4.35 into two separate @test_broken assertions#20

Open
utensil wants to merge 1 commit intomasterfrom
fix/15-a435
Open

Split A.4.35 into two separate @test_broken assertions#20
utensil wants to merge 1 commit intomasterfrom
fix/15-a435

Conversation

@utensil
Copy link
Copy Markdown
Member

@utensil utensil commented Apr 3, 2026

Refs #15

The original test had a chained == mixing three unrelated things:

@test_broken refl(Vr, B) == B  Vr * (Vr)⁻¹ == (B  Vr)  (Vr)⁻¹

After reading galgebra's reflect_in_blade source:

  • refl(Vr, B) is a grade-by-grade sandwich: (-1)^{s(r+1)} * Vr * B[r] * Vr⁻¹ for each grade r, where s = grade(Vr). For a grade-2 blade (like Vr = u∧v in Cl3), the sign is always +1, so it reduces to Vr * B * Vr⁻¹.
  • (B ∧ Vr) * Vr⁻¹ is the rejection (outer projection onto the complement), a completely different operation.

Split into two @test_broken so CI shows which part actually fails:

  1. (B ∧ Vr) * (Vr)⁻¹ == (B ∧ Vr) ⨽ (Vr)⁻¹ — pure rejection formula (A.4.35 as written in the paper)
  2. refl(Vr, B) == (B ∧ Vr) * (Vr)⁻¹ — whether the sandwich equals rejection (likely false in general)

The original test chained three different things in one equality:
  refl(Vr, B) == B∧Vr*(Vr)⁻¹ == (B∧Vr)⨽(Vr)⁻¹

But refl() in galgebra is a grade-by-grade sandwich (Vr*B[r]*Vr⁻¹ with
sign (-1)^{s(r+1)}), which is not the same as the rejection (B∧Vr)*Vr⁻¹.
The chained equality was conflating two unrelated operations.

Split into:
- (B∧Vr)*(Vr)⁻¹ == (B∧Vr)⨽(Vr)⁻¹  (rejection = right-contraction form)
- refl(Vr, B) == (B∧Vr)*(Vr)⁻¹     (sandwich vs rejection)

CI will now show which half passes and which is genuinely broken.

Refs #15
@lodyai lodyai bot force-pushed the fix/15-a435 branch from 6087c35 to 888d771 Compare April 3, 2026 10:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant