pcp/search/branching/
brancher.rs1use search::search_tree_visitor::*;
16
17use kernel::*;
18use search::branching::*;
19use search::space::*;
20use term::*;
21use term::ops::*;
22use concept::*;
23
24pub struct Brancher<Var,Val,D>
25{
26 var_selector: Var,
27 val_selector: Val,
28 distributor: D
29}
30
31impl<Var,Val,D> Brancher<Var,Val,D>
32{
33 pub fn new(var_selector: Var, val_selector: Val, distributor: D) -> Self {
34 Brancher {
35 var_selector: var_selector,
36 val_selector: val_selector,
37 distributor: distributor
38 }
39 }
40}
41
42impl<Var, Val, D, VStore, CStore, R, Domain, Bound> SearchTreeVisitor<Space<VStore, CStore, R>> for Brancher<Var,Val,D> where
43 VStore: VStoreConcept<Item=Domain, Location=Identity<Domain>, Output=Domain>,
44 CStore: IntCStore<VStore>,
45 R: FreezeSpace<VStore, CStore> + Snapshot<State=Space<VStore, CStore, R>>,
46 Var: VarSelection<Space<VStore, CStore, R>>,
47 Val: ValSelection<Domain>,
48 Domain: IntDomain<Item=Bound>,
49 Bound: IntBound,
50 D: Distributor<Space<VStore, CStore, R>, Bound>
51{
52 fn enter(&mut self, current: Space<VStore, CStore, R>) -> (<Space<VStore, CStore, R> as Freeze>::FrozenState, Status<Space<VStore, CStore, R>>) {
53 let var_idx = self.var_selector.select(¤t);
54
55 let x = Identity::<Domain>::new(var_idx);
56 let dom = x.read(¤t.vstore);
57 assert!(!dom.is_singleton() && !dom.is_empty(),
58 "Can not distribute over assigned or failed variables.");
59 let val = self.val_selector.select(dom);
60
61 let (immutable_space, branches) = self.distributor.distribute(current, var_idx, val);
62 (immutable_space, Status::Unknown(branches))
63 }
64}