kissat分析02_主要功能函数02_reduce
涉及search.c、reduce.c、collect.c、clause.c等多个文件
//search.c主程序调用功能函数的流程框架 | |
1 int 2 kissat_search (kissat * solver) 3 { 4 start_search (solver); 5 6 int res = kissat_walk_initially (solver); 7 8 while (!res) 9 { 10 clause *conflict = kissat_search_propagate (solver); 11 if (conflict) 12 res = kissat_analyze (solver, conflict); 13 else if (solver->iterating) 14 iterate (solver); 15 else if (!solver->unassigned) 16 res = 10; 17 else if (TERMINATED (11)) 18 break; 19 else if (conflict_limit_hit (solver)) 20 break; 21 else if (kissat_reducing (solver)) 22 res = kissat_reduce (solver); 23 else if (kissat_restarting (solver)) 24 kissat_restart (solver); 25 else if (kissat_rephasing (solver)) 26 kissat_rephase (solver); 27 else if (kissat_eliminating (solver)) 28 res = kissat_eliminate (solver); 29 else if (kissat_probing (solver)) 30 res = kissat_probe (solver); 31 else if (!solver->level && solver->unflushed) 32 kissat_flush_trail (solver); 33 else if (decision_limit_hit (solver)) 34 break; 35 else 36 kissat_decide (solver); 37 } 38 39 stop_search (solver, res); 40 41 return res; 42 }
|
|
reduce.c |
|
//判断是否达到子句集删除条件 1 bool 2 kissat_reducing (kissat * solver) 3 { 4 if (!GET_OPTION (reduce)) 5 return false; 6 if (!solver->statistics.clauses_redundant) 7 return false; 8 if (CONFLICTS < solver->limits.reduce.conflicts) 9 return false; 10 return true; 11 }
//实施删除子句 1 int 2 kissat_reduce (kissat * solver) 3 { 4 START (reduce); 5 INC (reductions); LOG ("beginreduce"); 6 kissat_phase (solver, "reduce", GET (reductions), 7 "reduce limit %" PRIu64 " hit after %" PRIu64 8 " conflicts", solver->limits.reduce.conflicts, CONFLICTS); 9 force_restart_before_reduction (solver); 10 bool compact = compacting (solver); 11 reference start = compact ? 0 : solver->first_reducible; 12 if (start != INVALID_REF) 13 { 14 #ifndef QUIET 15 size_t arena_size = SIZE_STACK (solver->arena); 16 size_t words_to_sweep = arena_size - start; 17 size_t bytes_to_sweep = sizeof (word) * words_to_sweep; 18 kissat_phase (solver, "reduce", GET (reductions), 19 "reducing clauses after offset %zu in arena", start); 20 kissat_phase (solver, "reduce", GET (reductions), 21 "sweeping %zu words %s %.0f%%", 22 words_to_sweep, FORMAT_BYTES (bytes_to_sweep), 23 kissat_percent (words_to_sweep, arena_size)); 24 #endif 25 if (kissat_flush_and_mark_reason_clauses (solver, start)) 26 { 27 reducibles reds; 28 INIT_STACK (reds); 29 if (collect_reducibles (solver, &reds, start)) 30 { 31 sort_reducibles (solver, &reds); 32 mark_less_useful_clauses_as_garbage (solver, &reds); 33 RELEASE_STACK (reds); 34 kissat_sparse_collect (solver, compact, start); 35 } 36 else if (compact) 37 kissat_sparse_collect (solver, compact, start); 38 else 39 kissat_unmark_reason_clauses (solver, start); 40 } 41 else 42 assert (solver->inconsistent); 43 } 44 else 45 kissat_phase (solver, "reduce", GET (reductions), "nothing to reduce"); 46 UPDATE_CONFLICT_LIMIT (reduce, reductions, NDIVLOGN, false); 47 REPORT (0, '-'); 48 STOP (reduce); 49 return solver->inconsistent ? 20 : 0; 50 }
|
|
//collect.c | |
void kissat_sparse_collect (kissat * solver, bool compact, reference start) { assert (solver->watching); START (collect); INC (garbage_collections); INC (sparse_garbage_collections); REPORT (1, 'G'); unsigned vars, mfixed; if (compact) vars = kissat_compact_literals (solver, &mfixed); else { vars = solver->vars; mfixed = INVALID_LIT; } flush_all_watched_clauses (solver, compact, start); reference move = sparse_sweep_garbage_clauses (solver, compact, start); if (compact) kissat_finalize_compacting (solver, vars, mfixed); if (move != INVALID_REF) move_redundant_clauses_to_the_end (solver, move); rewatch_clauses (solver, start); REPORT (1, 'C'); kissat_check_statistics (solver); STOP (collect); }
|
|
//clause.c | |
static void mark_clause_as_garbage (kissat * solver, clause * c) { assert (!c->garbage); LOGCLS (c, "garbage"); if (!c->redundant) kissat_mark_removed_literals (solver, c->size, c->lits); REMOVE_CHECKER_CLAUSE (c); DELETE_CLAUSE_FROM_PROOF (c); if (c->hyper) { assert (c->size == 3); assert (c->redundant); DEC (hyper_ternaries); } dec_clause (solver, c->redundant); c->garbage = true; }
|
|