Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
fe514c6
changed queue to set in AC3
dmeoli Mar 24, 2019
0129aa9
re-added test commented by mistake
dmeoli Mar 28, 2019
03551fb
added the mentioned AC4 algorithm for constraint propagation
dmeoli Apr 11, 2019
c0b8383
Merge branch 'master' into master
dmeoli Apr 11, 2019
6986247
added doctest in Sudoku for AC4 and and the possibility of choosing t…
dmeoli Apr 11, 2019
b3cd24c
removed useless doctest for AC4 in Sudoku because AC4's tests are alr…
dmeoli Apr 11, 2019
9e0fa55
added map coloring SAT problems
dmeoli Jun 17, 2019
f743146
fixed typo errors and removed unnecessary brackets
dmeoli Jun 17, 2019
20ab0e5
reformulated the map coloring problem
dmeoli Jul 4, 2019
404b179
Revert "reformulated the map coloring problem"
dmeoli Jul 4, 2019
c9c5106
Revert "fixed typo errors and removed unnecessary brackets"
dmeoli Jul 4, 2019
3243ba1
Revert "added map coloring SAT problems"
dmeoli Jul 4, 2019
2af1659
Revert "removed useless doctest for AC4 in Sudoku because AC4's tests…
dmeoli Jul 4, 2019
0c7e5af
Revert "added doctest in Sudoku for AC4 and and the possibility of ch…
dmeoli Jul 4, 2019
ff8c411
Revert "added the mentioned AC4 algorithm for constraint propagation"
dmeoli Jul 4, 2019
93af259
added map coloring SAT problem
dmeoli Jul 4, 2019
002a34e
Merge remote-tracking branch 'upstream/master'
dmeoli Jul 4, 2019
6641c2c
fixed build error
dmeoli Jul 4, 2019
9399dfc
Revert "added map coloring SAT problem"
dmeoli Jul 29, 2019
e130909
Revert "fixed build error"
dmeoli Jul 29, 2019
78bdeb1
Merge remote-tracking branch 'upstream/master'
dmeoli Jul 29, 2019
2f62776
added map coloring SAT problem
dmeoli Jul 29, 2019
aaea704
removed redundant parentheses
dmeoli Jul 29, 2019
0cd6386
Merge remote-tracking branch 'upstream/master'
dmeoli Aug 7, 2019
be656aa
added Viterbi algorithm
dmeoli Aug 14, 2019
c74933a
added monkey & bananas planning problem
dmeoli Aug 23, 2019
6d229ce
simplified condition in search.py
dmeoli Aug 23, 2019
24041e9
added tests for monkey & bananas planning problem
dmeoli Aug 23, 2019
9d37ae0
removed monkey & bananas planning problem
dmeoli Aug 23, 2019
459aae6
Revert "removed monkey & bananas planning problem"
dmeoli Aug 23, 2019
dbfb9c1
Revert "added tests for monkey & bananas planning problem"
dmeoli Aug 23, 2019
14d9014
Revert "simplified condition in search.py"
dmeoli Aug 23, 2019
5eb29cd
Revert "added monkey & bananas planning problem"
dmeoli Aug 23, 2019
396c38b
Merge remote-tracking branch 'upstream/master'
dmeoli Aug 23, 2019
776c131
defined the PlanningProblem as a specialization of a search.Problem &…
dmeoli Aug 27, 2019
ccc7de1
fixed doctest in logic.py
dmeoli Aug 27, 2019
7e98afb
fixed doctest for cascade_distribution
dmeoli Aug 27, 2019
061cba1
added ForwardPlanner and tests
dmeoli Aug 30, 2019
8c10d9f
added __lt__ implementation for Expr
dmeoli Aug 30, 2019
aa61869
added more tests
dmeoli Aug 30, 2019
c4139e5
renamed forward planner
dmeoli Aug 31, 2019
e4c4343
Revert "renamed forward planner"
dmeoli Aug 31, 2019
6e084c0
renamed forward planner class & added doc
dmeoli Aug 31, 2019
b6a0cbd
added backward planner and tests
dmeoli Sep 2, 2019
1131f4d
Merge remote-tracking branch 'upstream/master'
dmeoli Sep 3, 2019
1af8978
fixed mdp4e.py doctests
dmeoli Sep 3, 2019
a4ad133
removed ignore_delete_lists_heuristic flag
dmeoli Sep 3, 2019
26f2b5d
fixed heuristic for forward and backward planners
dmeoli Sep 6, 2019
9faf17a
added SATPlan and tests
dmeoli Sep 6, 2019
0be0f5d
fixed ignore delete lists heuristic in forward and backward planners
dmeoli Sep 7, 2019
2cc2d3f
fixed backward planner and added tests
dmeoli Sep 8, 2019
4222176
updated doc
dmeoli Sep 8, 2019
30af352
Merge remote-tracking branch 'upstream/master'
dmeoli Sep 11, 2019
b69a907
added nary csp definition and examples
dmeoli Sep 11, 2019
6ff465a
added CSPlan and tests
dmeoli Sep 11, 2019
d3c291c
fixed CSPlan
dmeoli Sep 11, 2019
785850a
added book's cryptarithmetic puzzle example
dmeoli Sep 11, 2019
7249058
fixed typo errors in test_csp
dmeoli Sep 11, 2019
42e9cbc
fixed #1111
dmeoli Sep 12, 2019
0fb48f6
added sortedcontainers to yml and doc to CSPlan
dmeoli Sep 12, 2019
5cce7d9
added tests for n-ary csp
dmeoli Sep 13, 2019
b567a6d
fixed utils.extend
dmeoli Sep 13, 2019
2eba772
updated test_probability.py
dmeoli Sep 14, 2019
427e85a
converted static methods to functions
dmeoli Sep 15, 2019
cd1ad41
added AC3b and AC4 with heuristic and tests
dmeoli Sep 15, 2019
0092f27
Merge remote-tracking branch 'upstream/master'
dmeoli Sep 16, 2019
d9dd4bb
added conflict-driven clause learning sat solver
dmeoli Sep 16, 2019
c0220d2
added tests for cdcl and heuristics
dmeoli Sep 16, 2019
8f0779d
fixed probability.py
dmeoli Sep 17, 2019
7a59010
fixed import
dmeoli Sep 17, 2019
0135db6
fixed kakuro
dmeoli Sep 20, 2019
ac98bd8
Merge remote-tracking branch 'upstream/master'
dmeoli Sep 21, 2019
dca70da
added Martelli and Montanari rule-based unification algorithm
dmeoli Sep 25, 2019
84e7a55
removed duplicate standardize_variables
dmeoli Sep 25, 2019
20bc37b
renamed variables known as built-in functions
dmeoli Sep 26, 2019
4b02d92
fixed typos in learning.py
dmeoli Sep 26, 2019
8427b5f
renamed some files and fixed typos
dmeoli Sep 26, 2019
3ffe3e9
fixed typos
dmeoli Sep 26, 2019
2d0dbc2
fixed typos
dmeoli Sep 27, 2019
b7e8206
fixed tests
dmeoli Sep 27, 2019
0c5f0ac
removed unify_mm
dmeoli Sep 29, 2019
bcc169d
remove unnecessary brackets
dmeoli Sep 29, 2019
9dd097b
fixed tests
dmeoli Sep 29, 2019
abc8f17
moved utility functions to utils.py
dmeoli Sep 29, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fixed typo errors in test_csp
  • Loading branch information
dmeoli committed Sep 11, 2019
commit 72490587cbedaa1075c45c5e0b8b895e58a626a1
90 changes: 49 additions & 41 deletions tests/test_csp.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def test_csp_unassign():
assert var not in assignment


def test_csp_nconflits():
def test_csp_nconflicts():
map_coloring_test = MapColoringCSP(list('RGB'), 'A: B C; B: C; C: ')
assignment = {'A': 'R', 'B': 'G'}
var = 'C'
Expand Down Expand Up @@ -67,17 +67,16 @@ def test_csp_result():
def test_csp_goal_test():
map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ')
state = (('A', '1'), ('B', '3'), ('C', '2'))
assert map_coloring_test.goal_test(state) is True
assert map_coloring_test.goal_test(state)

state = (('A', '1'), ('C', '2'))
assert map_coloring_test.goal_test(state) is False
assert not map_coloring_test.goal_test(state)


def test_csp_support_pruning():
map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ')
map_coloring_test.support_pruning()
assert map_coloring_test.curr_domains == {'A': ['1', '2', '3'], 'B': ['1', '2', '3'],
'C': ['1', '2', '3']}
assert map_coloring_test.curr_domains == {'A': ['1', '2', '3'], 'B': ['1', '2', '3'], 'C': ['1', '2', '3']}


def test_csp_suppose():
Expand All @@ -88,8 +87,7 @@ def test_csp_suppose():
removals = map_coloring_test.suppose(var, value)

assert removals == [('A', '2'), ('A', '3')]
assert map_coloring_test.curr_domains == {'A': ['1'], 'B': ['1', '2', '3'],
'C': ['1', '2', '3']}
assert map_coloring_test.curr_domains == {'A': ['1'], 'B': ['1', '2', '3'], 'C': ['1', '2', '3']}


def test_csp_prune():
Expand All @@ -100,16 +98,14 @@ def test_csp_prune():

map_coloring_test.support_pruning()
map_coloring_test.prune(var, value, removals)
assert map_coloring_test.curr_domains == {'A': ['1', '2'], 'B': ['1', '2', '3'],
'C': ['1', '2', '3']}
assert map_coloring_test.curr_domains == {'A': ['1', '2'], 'B': ['1', '2', '3'], 'C': ['1', '2', '3']}
assert removals is None

map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ')
removals = [('A', '2')]
map_coloring_test.support_pruning()
map_coloring_test.prune(var, value, removals)
assert map_coloring_test.curr_domains == {'A': ['1', '2'], 'B': ['1', '2', '3'],
'C': ['1', '2', '3']}
assert map_coloring_test.curr_domains == {'A': ['1', '2'], 'B': ['1', '2', '3'], 'C': ['1', '2', '3']}
assert removals == [('A', '2'), ('A', '3')]


Expand All @@ -125,17 +121,17 @@ def test_csp_choices():
assert map_coloring_test.choices(var) == ['1', '2']


def test_csp_infer_assignement():
def test_csp_infer_assignment():
map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ')
map_coloring_test.infer_assignment() == {}
assert map_coloring_test.infer_assignment() == {}

var = 'A'
value = '3'
map_coloring_test.prune(var, value, None)
value = '1'
map_coloring_test.prune(var, value, None)

map_coloring_test.infer_assignment() == {'A': '2'}
assert map_coloring_test.infer_assignment() == {'A': '2'}


def test_csp_restore():
Expand All @@ -145,8 +141,7 @@ def test_csp_restore():

map_coloring_test.restore(removals)

assert map_coloring_test.curr_domains == {'A': ['2', '3', '1'], 'B': ['1', '2', '3'],
'C': ['2', '3']}
assert map_coloring_test.curr_domains == {'A': ['2', '3', '1'], 'B': ['1', '2', '3'], 'C': ['2', '3']}


def test_csp_conflicted_vars():
Expand Down Expand Up @@ -181,14 +176,14 @@ def test_revise():
Xj = 'B'
removals = []

assert revise(csp, Xi, Xj, removals) is False
assert not revise(csp, Xi, Xj, removals)
assert len(removals) == 0

domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4]}
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
csp.support_pruning()

assert revise(csp, Xi, Xj, removals) is True
assert revise(csp, Xi, Xj, removals)
assert removals == [('A', 1), ('A', 3)]


Expand All @@ -200,13 +195,13 @@ def test_AC3():

csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)

assert AC3(csp, removals=removals) is False
assert not AC3(csp, removals=removals)

constraints = lambda X, x, Y, y: (x % 2) == 0 and (x + y) == 4
removals = []
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)

assert AC3(csp, removals=removals) is True
assert AC3(csp, removals=removals)
assert (removals == [('A', 1), ('A', 3), ('B', 1), ('B', 3)] or
removals == [('B', 1), ('B', 3), ('A', 1), ('A', 3)])

Expand Down Expand Up @@ -302,20 +297,20 @@ def test_forward_checking():
var = 'B'
value = 3
assignment = {'A': 1, 'C': '3'}
assert forward_checking(csp, var, value, assignment, None) == True
assert forward_checking(csp, var, value, assignment, None)
assert csp.curr_domains['A'] == A_curr_domains
assert csp.curr_domains['C'] == C_curr_domains

assignment = {'C': 3}

assert forward_checking(csp, var, value, assignment, None) == True
assert forward_checking(csp, var, value, assignment, None)
assert csp.curr_domains['A'] == [1, 3]

csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
csp.support_pruning()

assignment = {}
assert forward_checking(csp, var, value, assignment, None) == True
assert forward_checking(csp, var, value, assignment, None)
assert csp.curr_domains['A'] == [1, 3]
assert csp.curr_domains['C'] == [1, 3]

Expand All @@ -325,20 +320,18 @@ def test_forward_checking():

value = 7
assignment = {}
assert forward_checking(csp, var, value, assignment, None) == False
assert not forward_checking(csp, var, value, assignment, None)
assert (csp.curr_domains['A'] == [] or csp.curr_domains['C'] == [])


def test_backtracking_search():
assert backtracking_search(australia_csp)
assert backtracking_search(australia_csp, select_unassigned_variable=mrv)
assert backtracking_search(australia_csp, order_domain_values=lcv)
assert backtracking_search(australia_csp, select_unassigned_variable=mrv,
order_domain_values=lcv)
assert backtracking_search(australia_csp, select_unassigned_variable=mrv, order_domain_values=lcv)
assert backtracking_search(australia_csp, inference=forward_checking)
assert backtracking_search(australia_csp, inference=mac)
assert backtracking_search(usa_csp, select_unassigned_variable=mrv,
order_domain_values=lcv, inference=mac)
assert backtracking_search(usa_csp, select_unassigned_variable=mrv, order_domain_values=lcv, inference=mac)


def test_min_conflicts():
Expand Down Expand Up @@ -378,7 +371,6 @@ def test_nqueens_csp():
assert 2 not in assignment
assert 3 not in assignment

assignment = {}
assignment = {0: 0, 1: 1, 2: 4, 3: 1, 4: 6}
csp.assign(5, 7, assignment)
assert len(assignment) == 6
Expand Down Expand Up @@ -421,7 +413,7 @@ def test_topological_sort():
Sort, Parents = topological_sort(australia_csp, root)

assert Sort == ['NT', 'SA', 'Q', 'NSW', 'V', 'WA']
assert Parents['NT'] == None
assert Parents['NT'] is None
assert Parents['SA'] == 'NT'
assert Parents['Q'] == 'SA'
assert Parents['NSW'] == 'Q'
Expand Down Expand Up @@ -482,6 +474,7 @@ def test_make_arc_consistent():

assert make_arc_consistent(Xi, Xj, csp) == [0, 2, 4]


def test_assign_value():
neighbors = parse_neighbors('A: B; B: ')
domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4]}
Expand All @@ -505,6 +498,7 @@ def test_assign_value():
assignment = {'A': 1}
assert assign_value(Xi, Xj, csp, assignment) == 3


def test_no_inference():
neighbors = parse_neighbors('A: B; B: ')
domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4, 5]}
Expand All @@ -514,7 +508,7 @@ def test_no_inference():
var = 'B'
value = 3
assignment = {'A': 1}
assert no_inference(csp, var, value, assignment, None) == True
assert no_inference(csp, var, value, assignment, None)


def test_mac():
Expand Down Expand Up @@ -542,23 +536,37 @@ def test_mac():
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
assert mac(csp, var, value, assignment, None) == True


def test_queen_constraint():
assert queen_constraint(0, 1, 0, 1) == True
assert queen_constraint(2, 1, 4, 2) == True
assert queen_constraint(2, 1, 3, 2) == False
assert queen_constraint(0, 1, 0, 1)
assert queen_constraint(2, 1, 4, 2)
assert not queen_constraint(2, 1, 3, 2)


def test_zebra():
z = Zebra()
algorithm=min_conflicts
# would take very long
algorithm = min_conflicts
# would take very long
ans = algorithm(z, max_steps=10000)
assert ans is None or ans == {'Red': 3, 'Yellow': 1, 'Blue': 2, 'Green': 5, 'Ivory': 4, 'Dog': 4, 'Fox': 1, 'Snails': 3, 'Horse': 2, 'Zebra': 5, 'OJ': 4, 'Tea': 2, 'Coffee': 5, 'Milk': 3, 'Water': 1, 'Englishman': 3, 'Spaniard': 4, 'Norwegian': 1, 'Ukranian': 2, 'Japanese': 5, 'Kools': 1, 'Chesterfields': 2, 'Winston': 3, 'LuckyStrike': 4, 'Parliaments': 5}

# restrict search space
z.domains = {'Red': [3, 4], 'Yellow': [1, 2], 'Blue': [1, 2], 'Green': [4, 5], 'Ivory': [4, 5], 'Dog': [4, 5], 'Fox': [1, 2], 'Snails': [3], 'Horse': [2], 'Zebra': [5], 'OJ': [1, 2, 3, 4, 5], 'Tea': [1, 2, 3, 4, 5], 'Coffee': [1, 2, 3, 4, 5], 'Milk': [3], 'Water': [1, 2, 3, 4, 5], 'Englishman': [1, 2, 3, 4, 5], 'Spaniard': [1, 2, 3, 4, 5], 'Norwegian': [1], 'Ukranian': [1, 2, 3, 4, 5], 'Japanese': [1, 2, 3, 4, 5], 'Kools': [1, 2, 3, 4, 5], 'Chesterfields': [1, 2, 3, 4, 5], 'Winston': [1, 2, 3, 4, 5], 'LuckyStrike': [1, 2, 3, 4, 5], 'Parliaments': [1, 2, 3, 4, 5]}
assert ans is None or ans == {'Red': 3, 'Yellow': 1, 'Blue': 2, 'Green': 5, 'Ivory': 4, 'Dog': 4, 'Fox': 1,
'Snails': 3, 'Horse': 2, 'Zebra': 5, 'OJ': 4, 'Tea': 2, 'Coffee': 5, 'Milk': 3,
'Water': 1, 'Englishman': 3, 'Spaniard': 4, 'Norwegian': 1, 'Ukranian': 2,
'Japanese': 5, 'Kools': 1, 'Chesterfields': 2, 'Winston': 3, 'LuckyStrike': 4,
'Parliaments': 5}

# restrict search space
z.domains = {'Red': [3, 4], 'Yellow': [1, 2], 'Blue': [1, 2], 'Green': [4, 5], 'Ivory': [4, 5], 'Dog': [4, 5],
'Fox': [1, 2], 'Snails': [3], 'Horse': [2], 'Zebra': [5], 'OJ': [1, 2, 3, 4, 5],
'Tea': [1, 2, 3, 4, 5], 'Coffee': [1, 2, 3, 4, 5], 'Milk': [3], 'Water': [1, 2, 3, 4, 5],
'Englishman': [1, 2, 3, 4, 5], 'Spaniard': [1, 2, 3, 4, 5], 'Norwegian': [1],
'Ukranian': [1, 2, 3, 4, 5], 'Japanese': [1, 2, 3, 4, 5], 'Kools': [1, 2, 3, 4, 5],
'Chesterfields': [1, 2, 3, 4, 5], 'Winston': [1, 2, 3, 4, 5], 'LuckyStrike': [1, 2, 3, 4, 5],
'Parliaments': [1, 2, 3, 4, 5]}
ans = algorithm(z, max_steps=10000)
assert ans == {'Red': 3, 'Yellow': 1, 'Blue': 2, 'Green': 5, 'Ivory': 4, 'Dog': 4, 'Fox': 1, 'Snails': 3, 'Horse': 2, 'Zebra': 5, 'OJ': 4, 'Tea': 2, 'Coffee': 5, 'Milk': 3, 'Water': 1, 'Englishman': 3, 'Spaniard': 4, 'Norwegian': 1, 'Ukranian': 2, 'Japanese': 5, 'Kools': 1, 'Chesterfields': 2, 'Winston': 3, 'LuckyStrike': 4, 'Parliaments': 5}
assert ans == {'Red': 3, 'Yellow': 1, 'Blue': 2, 'Green': 5, 'Ivory': 4, 'Dog': 4, 'Fox': 1, 'Snails': 3,
'Horse': 2, 'Zebra': 5, 'OJ': 4, 'Tea': 2, 'Coffee': 5, 'Milk': 3, 'Water': 1, 'Englishman': 3,
'Spaniard': 4, 'Norwegian': 1, 'Ukranian': 2, 'Japanese': 5, 'Kools': 1, 'Chesterfields': 2,
'Winston': 3, 'LuckyStrike': 4, 'Parliaments': 5}


if __name__ == "__main__":
Expand Down