smt_scope/analysis/
cdcl.rs1use crate::{
2 items::{CdclIdx, TermIdx},
3 FxHashMap, TiVec, Z3Parser,
4};
5
6#[derive(Default)]
7pub struct CdclAnalysis {
8 pub assignments: FxHashMap<TermIdx, (AssignData, AssignData)>,
9}
10
11#[derive(Clone, Copy, Default)]
12pub struct AssignData {
13 pub count: u32,
14 pub cost: u32,
15}
16
17impl CdclAnalysis {
18 pub fn new(parser: &Z3Parser) -> Self {
19 let mut self_ = Self::default();
20 let mut cdcl_size: TiVec<CdclIdx, _> = parser.cdcls().iter().map(|_| 1u32).collect();
21
22 for (cidx, data) in parser.cdcls().iter_enumerated().rev() {
23 let Some(parent) = data.backlink(cidx).to_root() else {
24 continue;
25 };
26 let size = cdcl_size[cidx];
27 cdcl_size[parent] += size;
28
29 for a in data.get_assignments() {
30 let a = parser.lits[a].term;
31 let (true_data, false_data) = self_.assignments.entry(a.literal).or_default();
32 if a.value {
33 true_data.count += 1;
34 true_data.cost += size;
35 } else {
36 false_data.count += 1;
37 false_data.cost += size;
38 }
39 }
40 }
41 self_
42 }
43}