@@ -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+
169257def test_backtracking_search ():
170258 assert backtracking_search (australia )
171259 assert backtracking_search (australia , select_unassigned_variable = mrv )
0 commit comments