lean4-htt/library/tools/super/selection.lean

79 lines
2.9 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
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