import JaxLean.Core.Tensornamespace JaxLean.Tensor@[simp] theorem scatterSet_same (out : Tensor R s) (p : Index s) (v : R) : scatterSet out p v p = v := R:Types:List ℕout:Tensor R sp:Index sv:R⊢ out.scatterSet p v p = v All goals completed! 🐙@[simp] theorem scatterSet_other (out : Tensor R s) (p q : Index s) (v : R) (h : q ≠ p) : scatterSet out p v q = out q := R:Types:List ℕout:Tensor R sp:Index sq:Index sv:Rh:q ≠ p⊢ out.scatterSet p v q = out q All goals completed! 🐙@[simp] theorem scatterAdd_same [Add R] (out : Tensor R s) (p : Index s) (v : R) : scatterAdd out p v p = out p + v := R:Types:List ℕinst✝:Add Rout:Tensor R sp:Index sv:R⊢ out.scatterAdd p v p = out p + v All goals completed! 🐙@[simp] theorem scatterAdd_other [Add R] (out : Tensor R s) (p q : Index s) (v : R) (h : q ≠ p) : scatterAdd out p v q = out q := R:Types:List ℕinst✝:Add Rout:Tensor R sp:Index sq:Index sv:Rh:q ≠ p⊢ out.scatterAdd p v q = out q All goals completed! 🐙

Coordinate form for vector updates; keeps Index abstract during simplification.

All goals completed! 🐙All goals completed! 🐙

Additive collisions are order-independent in this algebraic model.

theorem scatterAdd_comm [AddCommMonoid R] (out : Tensor R s) (p q : Index s) (a b : R) : scatterAdd (scatterAdd out p a) q b = scatterAdd (scatterAdd out q b) p a := R:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:R⊢ (out.scatterAdd p a).scatterAdd q b = (out.scatterAdd q b).scatterAdd p a R:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index s⊢ (out.scatterAdd p a).scatterAdd q b i = (out.scatterAdd q b).scatterAdd p a i R:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index s⊢ (if i = q then (if i = p then out i + a else out i) + b else if i = p then out i + a else out i) = if i = p then (if i = q then out i + b else out i) + a else if i = q then out i + b else out i R:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index sh✝¹:i = qh✝:i = p⊢ out i + a + b = out i + b + aR:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index sh✝¹:i = qh✝:¬i = p⊢ out i + b = out i + bR:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index sh✝¹:¬i = qh✝:i = p⊢ out i + a = out i + aR:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index sh✝¹:¬i = qh✝:¬i = p⊢ out i = out i R:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index sh✝¹:i = qh✝:i = p⊢ out i + a + b = out i + b + aR:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index sh✝¹:i = qh✝:¬i = p⊢ out i + b = out i + bR:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index sh✝¹:¬i = qh✝:i = p⊢ out i + a = out i + aR:Types:List ℕinst✝:AddCommMonoid Rout:Tensor R sp:Index sq:Index sa:Rb:Ri:Index sh✝¹:¬i = qh✝:¬i = p⊢ out i = out i All goals completed! 🐙end JaxLean.Tensor