79 lines
2.9 KiB
Text
79 lines
2.9 KiB
Text
/-
|
||
Copyright (c) 2016 Gabriel Ebner. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Gabriel Ebner
|
||
-/
|
||
import .prover_state
|
||
|
||
namespace super
|
||
|
||
meta def simple_selection_strategy (f : (expr → expr → bool) → clause → list ℕ) : selection_strategy :=
|
||
take dc, do gt ← get_term_order, return $
|
||
if dc^.selected^.empty ∧ dc^.c^.num_lits > 0
|
||
then { dc with selected := f gt dc^.c }
|
||
else dc
|
||
|
||
meta def dumb_selection : selection_strategy :=
|
||
simple_selection_strategy $ λgt c,
|
||
match c^.lits_where clause.literal.is_neg with
|
||
| [] := list.range c^.num_lits
|
||
| neg_lit::_ := [neg_lit]
|
||
end
|
||
|
||
meta def selection21 : selection_strategy :=
|
||
simple_selection_strategy $ λgt c,
|
||
let maximal_lits := list.filter_maximal (λi j,
|
||
gt (c^.get_lit i)^.formula (c^.get_lit j)^.formula) (list.range c^.num_lits) in
|
||
if list.length maximal_lits = 1 then maximal_lits else
|
||
let neg_lits := list.filter (λi, (c^.get_lit i)^.is_neg) (list.range c^.num_lits),
|
||
maximal_neg_lits := list.filter_maximal (λi j,
|
||
gt (c^.get_lit i)^.formula (c^.get_lit j)^.formula) neg_lits in
|
||
if ¬maximal_neg_lits^.empty then
|
||
list.taken 1 maximal_neg_lits
|
||
else
|
||
maximal_lits
|
||
|
||
meta def selection22 : selection_strategy :=
|
||
simple_selection_strategy $ λgt c,
|
||
let maximal_lits := list.filter_maximal (λi j,
|
||
gt (c^.get_lit i)^.formula (c^.get_lit j)^.formula) (list.range c^.num_lits),
|
||
maximal_lits_neg := list.filter (λi, (c^.get_lit i)^.is_neg) maximal_lits in
|
||
if ¬maximal_lits_neg^.empty then
|
||
list.taken 1 maximal_lits_neg
|
||
else
|
||
maximal_lits
|
||
|
||
meta def clause_weight (c : derived_clause) : nat :=
|
||
(c^.c^.get_lits^.for (λl, expr_size l^.formula + if l^.is_pos then 10 else 1))^.sum
|
||
|
||
meta def find_minimal_by (passive : rb_map clause_id derived_clause)
|
||
{A} [has_ordering A]
|
||
(f : derived_clause → A) : clause_id :=
|
||
match rb_map.min $ rb_map.of_list $ passive^.values^.for $ λc, (f c, c^.id) with
|
||
| some id := id
|
||
| none := nat.zero
|
||
end
|
||
|
||
meta def age_of_clause_id : name → ℕ
|
||
| (name.mk_numeral i _) := unsigned.to_nat i
|
||
| _ := 0
|
||
|
||
meta def find_minimal_weight (passive : rb_map clause_id derived_clause) : clause_id :=
|
||
find_minimal_by passive $ λc, (c^.sc^.priority, clause_weight c + c^.sc^.cost, c^.sc^.age, c^.id)
|
||
|
||
meta def find_minimal_age (passive : rb_map clause_id derived_clause) : clause_id :=
|
||
find_minimal_by passive $ λc, (c^.sc^.priority, c^.sc^.age, c^.id)
|
||
|
||
meta def weight_clause_selection : clause_selection_strategy :=
|
||
take iter, do state ← state_t.read, return $ find_minimal_weight state^.passive
|
||
|
||
meta def oldest_clause_selection : clause_selection_strategy :=
|
||
take iter, do state ← state_t.read, return $ find_minimal_age state^.passive
|
||
|
||
meta def age_weight_clause_selection (thr mod : ℕ) : clause_selection_strategy :=
|
||
take iter, if iter % mod < thr then
|
||
weight_clause_selection iter
|
||
else
|
||
oldest_clause_selection iter
|
||
|
||
end super
|