@@ -437,5 +437,129 @@ def test_tree_csp_solver():
437437 (tcs ['NT' ] == 'B' and tcs ['WA' ] == 'R' and tcs ['Q' ] == 'R' and tcs ['NSW' ] == 'B' and tcs ['V' ] == 'R' )
438438
439439
440+ def test_different_values_constraint ():
441+ assert different_values_constraint ('A' , 1 , 'B' , 2 ) == True
442+ assert different_values_constraint ('A' , 1 , 'B' , 1 ) == False
443+
444+
445+ def test_flatten ():
446+ sequence = [[0 , 1 , 2 ], [4 , 5 ]]
447+ assert flatten (sequence ) == [0 , 1 , 2 , 4 , 5 ]
448+
449+
450+ def test_sudoku ():
451+ h = Sudoku (easy1 )
452+ assert backtracking_search (h , select_unassigned_variable = mrv , inference = forward_checking ) is not None
453+ g = Sudoku (harder1 )
454+ assert backtracking_search (g , select_unassigned_variable = mrv , inference = forward_checking ) is not None
455+
456+
457+ def test_make_arc_consistent ():
458+ neighbors = parse_neighbors ('A: B; B: ' )
459+ domains = {'A' : [0 ], 'B' : [3 ]}
460+ constraints = lambda X , x , Y , y : x % 2 == 0 and (x + y ) == 4
461+
462+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
463+ csp .support_pruning ()
464+ Xi = 'A'
465+ Xj = 'B'
466+
467+ assert make_arc_consistent (Xi , Xj , csp ) == []
468+
469+ domains = {'A' : [0 ], 'B' : [4 ]}
470+ constraints = lambda X , x , Y , y : x % 2 == 0 and (x + y ) == 4
471+
472+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
473+ csp .support_pruning ()
474+ Xi = 'A'
475+ Xj = 'B'
476+
477+ assert make_arc_consistent (Xi , Xj , csp ) == [0 ]
478+
479+ domains = {'A' : [0 , 1 , 2 , 3 , 4 ], 'B' : [0 , 1 , 2 , 3 , 4 ]}
480+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
481+ csp .support_pruning ()
482+
483+ assert make_arc_consistent (Xi , Xj , csp ) == [0 , 2 , 4 ]
484+
485+ def test_assign_value ():
486+ neighbors = parse_neighbors ('A: B; B: ' )
487+ domains = {'A' : [0 , 1 , 2 , 3 , 4 ], 'B' : [0 , 1 , 2 , 3 , 4 ]}
488+ constraints = lambda X , x , Y , y : x % 2 == 0 and (x + y ) == 4
489+ Xi = 'A'
490+ Xj = 'B'
491+
492+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
493+ csp .support_pruning ()
494+
495+ assignment = {'A' : 1 }
496+ assert assign_value (Xi , Xj , csp , assignment ) is None
497+
498+ assignment = {'A' : 2 }
499+ assert assign_value (Xi , Xj , csp , assignment ) == 2
500+
501+ constraints = lambda X , x , Y , y : (x + y ) == 4
502+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
503+ csp .support_pruning ()
504+
505+ assignment = {'A' : 1 }
506+ assert assign_value (Xi , Xj , csp , assignment ) == 3
507+
508+ def test_no_inference ():
509+ neighbors = parse_neighbors ('A: B; B: ' )
510+ domains = {'A' : [0 , 1 , 2 , 3 , 4 ], 'B' : [0 , 1 , 2 , 3 , 4 , 5 ]}
511+ constraints = lambda X , x , Y , y : (x + y ) < 8
512+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
513+
514+ var = 'B'
515+ value = 3
516+ assignment = {'A' : 1 }
517+ assert no_inference (csp , var , value , assignment , None ) == True
518+
519+
520+ def test_mac ():
521+ neighbors = parse_neighbors ('A: B; B: ' )
522+ domains = {'A' : [0 ], 'B' : [0 ]}
523+ constraints = lambda X , x , Y , y : x % 2 == 0
524+ var = 'B'
525+ value = 0
526+ assignment = {'A' : 0 }
527+
528+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
529+ assert mac (csp , var , value , assignment , None ) == True
530+
531+ neighbors = parse_neighbors ('A: B; B: ' )
532+ domains = {'A' : [0 , 1 , 2 , 3 , 4 ], 'B' : [0 , 1 , 2 , 3 , 4 ]}
533+ constraints = lambda X , x , Y , y : x % 2 == 0 and (x + y ) == 4 and y % 2 != 0
534+ var = 'B'
535+ value = 3
536+ assignment = {'A' : 1 }
537+
538+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
539+ assert mac (csp , var , value , assignment , None ) == False
540+
541+ constraints = lambda X , x , Y , y : x % 2 != 0 and (x + y ) == 6 and y % 2 != 0
542+ csp = CSP (variables = None , domains = domains , neighbors = neighbors , constraints = constraints )
543+ assert mac (csp , var , value , assignment , None ) == True
544+
545+ def test_queen_constraint ():
546+ assert queen_constraint (0 , 1 , 0 , 1 ) == True
547+ assert queen_constraint (2 , 1 , 4 , 2 ) == True
548+ assert queen_constraint (2 , 1 , 3 , 2 ) == False
549+
550+
551+ def test_zebra ():
552+ z = Zebra ()
553+ algorithm = min_conflicts
554+ # would take very long
555+ ans = algorithm (z , max_steps = 10000 )
556+ 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 }
557+
558+ # restrict search space
559+ 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 ]}
560+ ans = algorithm (z , max_steps = 10000 )
561+ 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 }
562+
563+
440564if __name__ == "__main__" :
441565 pytest .main ()
0 commit comments