use super::{Clause, Literal};
pub(crate) fn appearance_mask(clauses: &[Clause], num_vars: usize) -> Vec<bool> {
let mut mask = vec![false; num_vars];
for clause in clauses {
for lit in &clause.literals {
if let Some(slot) = mask.get_mut(lit.var.idx()) {
*slot = true;
}
}
}
mask
}
pub(crate) fn frequency(clauses: &[Clause], num_vars: usize) -> Vec<u32> {
let mut freq = vec![0u32; num_vars];
for clause in clauses {
for lit in &clause.literals {
if let Some(slot) = freq.get_mut(lit.var.idx()) {
*slot += 1;
}
}
}
freq
}
pub(crate) fn literal_index(var: usize, positive: bool) -> usize {
var * 2 + if positive { 0 } else { 1 }
}
pub(crate) fn literal_frequency(clauses: &[Clause], num_vars: usize) -> Vec<u32> {
let mut freq = vec![0u32; num_vars * 2];
for clause in clauses {
for lit in &clause.literals {
if let Some(slot) = freq.get_mut(literal_index(lit.var.idx(), lit.positive)) {
*slot += 1;
}
}
}
freq
}
pub(crate) fn occurrence_lists(
clauses: &[Clause],
num_vars: usize,
) -> (Vec<Vec<usize>>, Vec<Vec<usize>>) {
occurrence_lists_of(clauses.iter().map(|c| c.literals.as_slice()), num_vars)
}
pub(crate) fn occurrence_lists_of<'a>(
clauses: impl IntoIterator<Item = &'a [Literal]>,
num_vars: usize,
) -> (Vec<Vec<usize>>, Vec<Vec<usize>>) {
let mut pos: Vec<Vec<usize>> = vec![Vec::new(); num_vars];
let mut neg: Vec<Vec<usize>> = vec![Vec::new(); num_vars];
for (ci, literals) in clauses.into_iter().enumerate() {
for lit in literals {
let bucket = if lit.positive { &mut pos } else { &mut neg };
if let Some(list) = bucket.get_mut(lit.var.idx()) {
list.push(ci);
}
}
}
(pos, neg)
}