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.map $ λ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
|