Skip to content

Commit bf15924

Browse files
lucasmouranorvig
authored andcommitted
Add more tests to csp.py (#328)
Add test for the following functions from csp.py * revise * AC3 * first_unassigned_variable * num_legal_values * mrv
1 parent 1b82e4d commit bf15924

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

tests/test_csp.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,94 @@ def test_csp_conflicted_vars():
166166
assert (conflicted_vars == ['B', 'C'] or conflicted_vars == ['C', 'B'])
167167

168168

169+
def test_revise():
170+
neighbors = parse_neighbors('A: B; B: ')
171+
domains = {'A': [0], 'B': [4]}
172+
constraints = lambda X, x, Y, y: x % 2 == 0 and (x+y) == 4
173+
174+
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
175+
csp.support_pruning()
176+
Xi = 'A'
177+
Xj = 'B'
178+
removals = []
179+
180+
assert revise(csp, Xi, Xj, removals) is False
181+
assert len(removals) == 0
182+
183+
domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4]}
184+
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
185+
csp.support_pruning()
186+
187+
assert revise(csp, Xi, Xj, removals) is True
188+
assert removals == [('A', 1), ('A', 3)]
189+
190+
191+
def test_AC3():
192+
neighbors = parse_neighbors('A: B; B: ')
193+
domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4]}
194+
constraints = lambda X, x, Y, y: x % 2 == 0 and (x+y) == 4 and y % 2 != 0
195+
removals = []
196+
197+
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
198+
199+
assert AC3(csp, removals=removals) is False
200+
201+
constraints = lambda X, x, Y, y: (x % 2) == 0 and (x+y) == 4
202+
removals = []
203+
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
204+
205+
assert AC3(csp, removals=removals) is True
206+
assert (removals == [('A', 1), ('A', 3), ('B', 1), ('B', 3)] or
207+
removals == [('B', 1), ('B', 3), ('A', 1), ('A', 3)])
208+
209+
210+
def test_first_unassigned_variable():
211+
map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ')
212+
assignment = {'A': '1', 'B': '2'}
213+
assert first_unassigned_variable(assignment, map_coloring_test) == 'C'
214+
215+
assignment = {'B': '1'}
216+
assert (first_unassigned_variable(assignment, map_coloring_test) == 'A' or
217+
first_unassigned_variable(assignment, map_coloring_test) == 'C')
218+
219+
220+
def test_num_legal_values():
221+
map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ')
222+
map_coloring_test.support_pruning()
223+
var = 'A'
224+
assignment = {}
225+
226+
assert num_legal_values(map_coloring_test, var, assignment) == 3
227+
228+
map_coloring_test = MapColoringCSP(list('RGB'), 'A: B C; B: C; C: ')
229+
assignment = {'A': 'R', 'B': 'G'}
230+
var = 'C'
231+
232+
assert num_legal_values(map_coloring_test, var, assignment) == 1
233+
234+
235+
def test_mrv():
236+
neighbors = parse_neighbors('A: B; B: C; C: ')
237+
domains = {'A': [0, 1, 2, 3, 4], 'B': [4], 'C': [0, 1, 2, 3, 4]}
238+
constraints = lambda X, x, Y, y: x % 2 == 0 and (x+y) == 4
239+
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
240+
assignment = {'A': 0}
241+
242+
assert mrv(assignment, csp) == 'B'
243+
244+
domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4], 'C': [0, 1, 2, 3, 4]}
245+
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
246+
247+
assert (mrv(assignment, csp) == 'B' or
248+
mrv(assignment, csp) == 'C')
249+
250+
domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4, 5, 6], 'C': [0, 1, 2, 3, 4]}
251+
csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints)
252+
csp.support_pruning()
253+
254+
assert mrv(assignment, csp) == 'C'
255+
256+
169257
def test_backtracking_search():
170258
assert backtracking_search(australia)
171259
assert backtracking_search(australia, select_unassigned_variable=mrv)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy