summaryrefslogtreecommitdiffstats
path: root/vendor/varisat/src/clause/assess.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/varisat/src/clause/assess.rs')
-rw-r--r--vendor/varisat/src/clause/assess.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/vendor/varisat/src/clause/assess.rs b/vendor/varisat/src/clause/assess.rs
new file mode 100644
index 000000000..a28dacb64
--- /dev/null
+++ b/vendor/varisat/src/clause/assess.rs
@@ -0,0 +1,69 @@
+//! Clause assessment.
+use partial_ref::{partial, PartialRef};
+
+use varisat_formula::Lit;
+
+use crate::{
+ clause::{db, ClauseRef},
+ context::{parts::*, Context},
+ glue::compute_glue,
+};
+
+use super::{bump_clause_activity, ClauseHeader, Tier};
+
+/// Assess the newly learned clause and generate a clause header.
+pub fn assess_learned_clause(
+ mut ctx: partial!(Context, mut TmpFlagsP, ImplGraphP),
+ lits: &[Lit],
+) -> ClauseHeader {
+ // This is called while the clause is still in conflict, thus the computed glue level is one
+ // higher than it'll be after backtracking when the clause becomes asserting.
+ let glue = compute_glue(ctx.borrow(), lits) - 1;
+
+ let mut header = ClauseHeader::new();
+
+ header.set_glue(glue);
+ header.set_tier(select_tier(glue));
+
+ header
+}
+
+/// Compute the tier for a redundant clause with a given glue level.
+fn select_tier(glue: usize) -> Tier {
+ if glue <= 2 {
+ Tier::Core
+ } else if glue <= 6 {
+ Tier::Mid
+ } else {
+ Tier::Local
+ }
+}
+
+/// Update stats for clauses involved in the conflict.
+pub fn bump_clause(
+ mut ctx: partial!(
+ Context,
+ mut ClauseActivityP,
+ mut ClauseAllocP,
+ mut ClauseDbP,
+ mut TmpFlagsP,
+ ImplGraphP
+ ),
+ cref: ClauseRef,
+) {
+ bump_clause_activity(ctx.borrow(), cref);
+
+ let (alloc, mut ctx_2) = ctx.split_part_mut(ClauseAllocP);
+
+ let clause = alloc.clause_mut(cref);
+
+ let glue = compute_glue(ctx_2.borrow(), clause.lits());
+
+ clause.header_mut().set_active(true);
+
+ if glue < clause.header().glue() {
+ clause.header_mut().set_glue(glue);
+
+ db::set_clause_tier(ctx.borrow(), cref, select_tier(glue));
+ }
+}