Skip to content

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

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

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

Conversation

@utensil

@utensil utensil commented Apr 3, 2026

Copy link
Copy Markdown
Member

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
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