Revert "make params.p use a bitvec"

This reverts commit a2b04d35f7.
This commit is contained in:
Folkert 2022-05-06 22:55:06 +02:00
parent 2b1491189a
commit b46de2f0a8
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C

View file

@ -183,10 +183,10 @@ enum Preorder {
struct Params { struct Params {
preorders: Vec<Preorder>, preorders: Vec<Preorder>,
c: usize, c: usize,
p: BitVec, p: Vec<u32>,
s: Vec<u32>, s: Vec<u32>,
scc: Sccs, scc: Sccs,
scca: BitVec, scca: Vec<u32>,
} }
impl Params { impl Params {
@ -201,12 +201,12 @@ impl Params {
preorders, preorders,
c: 0, c: 0,
s: Vec::new(), s: Vec::new(),
p: BitVec::repeat(false, length), p: Vec::new(),
scc: Sccs { scc: Sccs {
matrix: ReferenceMatrix::new(length), matrix: ReferenceMatrix::new(length),
components: 0, components: 0,
}, },
scca: BitVec::repeat(false, length), scca: Vec::new(),
} }
} }
} }
@ -217,19 +217,19 @@ fn recurse_onto(length: usize, bitvec: &BitVec, v: usize, params: &mut Params) {
params.c += 1; params.c += 1;
params.s.push(v as u32); params.s.push(v as u32);
params.p.set(v, true); params.p.push(v as u32);
for w in bitvec[v * length..][..length].iter_ones() { for w in bitvec[v * length..][..length].iter_ones() {
if !params.scca[w] { if !params.scca.contains(&(w as u32)) {
match params.preorders[w] { match params.preorders[w] {
Preorder::Filled(pw) => loop { Preorder::Filled(pw) => loop {
let index = params.p.last_one().unwrap(); let index = *params.p.last().unwrap();
match params.preorders[index as usize] { match params.preorders[index as usize] {
Preorder::Empty => unreachable!(), Preorder::Empty => unreachable!(),
Preorder::Filled(current) => { Preorder::Filled(current) => {
if current > pw { if current > pw {
params.p.set(index, false); params.p.pop();
} else { } else {
break; break;
} }
@ -243,15 +243,15 @@ fn recurse_onto(length: usize, bitvec: &BitVec, v: usize, params: &mut Params) {
} }
} }
if params.p.last_one() == Some(v) { if params.p.last() == Some(&(v as u32)) {
params.p.set(v, false); params.p.pop();
while let Some(node) = params.s.pop() { while let Some(node) = params.s.pop() {
params params
.scc .scc
.matrix .matrix
.set_row_col(params.scc.components, node as usize, true); .set_row_col(params.scc.components, node as usize, true);
params.scca.set(node as usize, true); params.scca.push(node);
params.preorders[node as usize] = Preorder::Removed; params.preorders[node as usize] = Preorder::Removed;
if node as usize == v { if node as usize == v {
break; break;