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