diff --git a/planner/src/lib.rs b/planner/src/lib.rs index f44390b..cde50e2 100644 --- a/planner/src/lib.rs +++ b/planner/src/lib.rs @@ -1,5 +1,3 @@ -use std::fmt; - mod solver; #[cfg(test)] diff --git a/planner/src/solver.rs b/planner/src/solver.rs index b1f1379..a9456e6 100644 --- a/planner/src/solver.rs +++ b/planner/src/solver.rs @@ -2,6 +2,14 @@ use std::fmt; use std::clone::Clone; use std::collections::HashMap; +type Variables<'a, V> = HashMap>; + +enum Assignment<'a, V> { + Update(String, &'a V), + Clear(String) +} + + #[derive(Clone)] struct Domain { values: Vec @@ -19,7 +27,6 @@ impl fmt::Debug for Domain { } } -type Variables<'a, V> = HashMap>; /// Returns all possible Updates for next assignements, prepended with /// a Clear to ensure the variable is unset before when leaving the branch. @@ -43,17 +50,6 @@ fn assign_next<'a,'b, V>(assign: &'b Variables<'a, V>, domain: &'a Domain) } } -/// Check if any constraint is violated -fn check_consistency<'a, V>(assign: &'a Variables<'a, V>, constraint: fn(&Variables<'a,V>) -> bool) -> bool { - constraint(assign) -} - -enum Assignment<'a, V> { - Update(String, &'a V), - Clear(String) -} - - /// Visit all possible solutions, using a stack. fn solve_all<'a, V: Clone + fmt::Debug>(mut assign: Variables<'a, V>, domain: &'a Domain, is_valid: fn(&Variables<'a,V>) -> bool) -> Vec> @@ -110,5 +106,24 @@ mod tests { assert_eq!(solve_all(assign, &domain, constraint), solutions); } + + #[test] + fn test_solver_find_pairs_with_initial() { + use super::*; + // Find all pairs of two differents + let assign: Variables = [ + ("Left".to_string(), None), + ("Right".to_string(), Some(&2)), + ].iter().cloned().collect(); + let domain = Domain::new(vec![1,2,3]); + let constraint = |assign: &Variables| { + assign.get("Left").unwrap() == assign.get("Right").unwrap() + }; + let solutions: Vec> = vec![ + [("Left".to_string(), Some(&2)), ("Right".to_string(), Some(&2)),].iter().cloned().collect(), + ]; + + assert_eq!(solve_all(assign, &domain, constraint), solutions); + } }