Documentation

HexGraphIso.Nauty.Sparse.CompactRun

theorem Hex.GraphIso.Nauty.Sparse.compact_scan (before : Array Nat) (p : Nat → Bool) (first last : Nat) (hf : first ≤ last) (hb : last ≤ before.size) :
have t := (have lab := before; have v2 := first; have hit := #[]; do let __s ← forIn [first:last] (lab, v2, hit) fun (j : Nat) (__s : Array Nat × Nat × Array Nat) => have lab := __s.fst; have __s := __s.snd; have v2 := __s.fst; have hit := __s.snd; have v := lab[j]!; if p v = true then have hit := hit.push v; pure (ForInStep.yield (lab, v2, hit)) else have lab := lab.set! v2 v; have v2 := v2 + 1; pure (ForInStep.yield (lab, v2, hit)) have lab : Array Nat := __s.fst have __s : Nat × Array Nat := __s.snd have v2 : Nat := __s.fst have hit : Array Nat := __s.snd pure (lab, v2, hit)).run; Compact before p first last (List.map (fun (q : Nat) => before[q]!) (List.range' first (last - first))) t.fst t.snd.snd t.snd.fst

The singleton splitter's actual compaction loop retains unmarked vertices in order and collects marked vertices in order, even when writes alias the position currently being read.