@@ -437,5 +437,129 @@ def test_tree_csp_solver():
437
437
(tcs ['NT' ] == 'B' and tcs ['WA' ] == 'R' and tcs ['Q' ] == 'R' and tcs ['NSW' ] == 'B' and tcs ['V' ] == 'R' )
438
438
439
439
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
+
440
564
if __name__ == "__main__" :
441
565
pytest .main ()
0 commit comments