pub struct Kernel {Show 19 fields
pub assignment: Vec<i8>,
pub vars: Vec<Variable>,
pub clauses: Vec<Clause>,
pub watches: Vec<Vec<Watches>>,
pub trail: Vec<Literal>,
pub vsids: ActivityTable,
pub phases: Phases,
pub result: SATResult,
pub level: usize,
pub backtrack_level: usize,
pub propagated: usize,
pub assigned: usize,
pub conflict: Option<(usize, Literal)>,
pub lemma: Vec<Literal>,
pub learnt: (Literal, Option<usize>),
pub statistics: Statistics,
mark_table: Vec<usize>,
mark_epoch: usize,
pending_clause: Vec<Literal>,
}Expand description
CDCL 求解核心内核状态。
Kernel 聚合了:
- CNF 子句库与 watcher 索引(2WL);
- trail/决策层等搜索状态;
- VSIDS 与相位策略;
- 冲突分析与学习子句所需的临时缓存。
Fields§
§assignment: Vec<i8>变量赋值表:-1=false,0=unassigned,1=true。
vars: Vec<Variable>变量元信息表(层级、原因子句等)。
clauses: Vec<Clause>子句数据库(原始子句 + 学习子句)。
watches: Vec<Vec<Watches>>2WL watcher 桶。
trail: Vec<Literal>trail(仅存当前被赋为真的文字)。
vsids: ActivityTableVSIDS 活跃度表。
phases: Phases相位策略状态表。
result: SATResult当前求解结果。
level: usize当前决策层。
backtrack_level: usize冲突分析后要回跳到的层级。
propagated: usizetrail 中“已完成传播”的前缀长度。
assigned: usize当前已赋值变量计数。
conflict: Option<(usize, Literal)>当前冲突信息 (clause_id, conflict_lit)。
lemma: Vec<Literal>冲突分析中的临时学习子句缓冲(lemma)。
learnt: (Literal, Option<usize>)回跳后需要立即断言的 (literal, reason_clause)。
statistics: Statistics统计信息。
mark_table: Vec<usize>冲突分析与 LBD 计算用的时间戳标记表。
mark_epoch: usize标记表当前 epoch。
pending_clause: Vec<Literal>DIMACS 流式解析时暂存“尚未遇到 0 终止符”的子句。
Implementations§
Source§impl Kernel
impl Kernel
Sourcepub fn add(&mut self, lit: Option<Literal>)
pub fn add(&mut self, lit: Option<Literal>)
以流式方式添加子句文字。
Some(lit):把文字加入当前待完成子句;None:结束当前子句,落库并挂接 watcher。
Sourcefn watcher_index(&self, lit: Literal) -> usize
fn watcher_index(&self, lit: Literal) -> usize
把非零文字映射到 watcher 桶索引。
每个变量对应两个桶:
- 正文字
v->2*(v-1) - 反文字
-v->2*(v-1)+1
例:v = 3 时,
watch(3)的索引是4watch(-3)的索引是5
Sourcepub fn add_watch(&mut self, watched_lit: Literal, watch: Watches)
pub fn add_watch(&mut self, watched_lit: Literal, watch: Watches)
向 watched_lit 对应桶追加一个 watcher。
本实现遵循 2WL 常见约定:通常存入的是 -w(而非 w),
即“让被监视文字 w 失效时会被触发”的桶,便于传播时 O(相关子句数) 访问。
Sourcefn attach_clause_watchers(&mut self, clause_id: usize)
fn attach_clause_watchers(&mut self, clause_id: usize)
为新子句初始化 watcher。
- 单子句
(l):在watch(-l)挂一个 watcher; - 非单子句
(l0 ∨ l1 ∨ ...):l0的 watcher 放在watch(-l0),blocker=l1l1的 watcher 放在watch(-l1),blocker=l0
这样传播时只需读取被新真值文字触发的桶即可。
例:子句 (x1 ∨ -x4 ∨ x7) 初始挂接后:
watch(-x1)存一条 watcher,blocker = -x4watch(x4)存一条 watcher,blocker = x1
Sourcepub fn watches(&mut self, lit: Literal) -> Vec<Watches>
pub fn watches(&mut self, lit: Literal) -> Vec<Watches>
取走并返回 lit 的整桶 watcher。
传播阶段采用 “take -> 处理 -> set” 方式,避免借用冲突并允许 watcher 迁移。
Sourcepub fn set_watches(&mut self, lit: Literal, ws: Vec<Watches>)
pub fn set_watches(&mut self, lit: Literal, ws: Vec<Watches>)
将传播后压实得到的 watcher 桶写回。
Sourcepub fn assign(&mut self, var_id: usize, lit: Literal, reason: Option<usize>)
pub fn assign(&mut self, var_id: usize, lit: Literal, reason: Option<usize>)
写入一次变量赋值并记录到 trail。
reason=None:决策赋值;reason=Some(clause_id):传播蕴含赋值。
例:若在第 5 层写入 lit = -9 且 reason = Some(12),
表示变量 x9 在第 5 层被子句 12 蕴含为假。
Sourcepub fn reset_value(&mut self, var_id: usize)
pub fn reset_value(&mut self, var_id: usize)
撤销变量赋值(用于回跳时弹栈)。
Sourcepub fn next_mark_epoch(&mut self) -> usize
pub fn next_mark_epoch(&mut self) -> usize
申请一个新的标记 epoch。
若发生 usize 回绕,则清空标记表并从 1 重新开始。
Sourcepub fn set_mark_at(&mut self, idx: usize, stamp: usize)
pub fn set_mark_at(&mut self, idx: usize, stamp: usize)
设置标记表 idx 的时间戳,不足则自动扩容。