def test_permutate_method_with_multiple_results(self): permutator = FastColorPermutator() aspiration_criteria = AspirationCriteria(None, None) aspiration_criteria.is_permutation_allowed = Mock(return_value=True) n1 = Node(color=3, node_id=3) n2 = Node(color=3, node_id=5) n3 = Node(color=3, node_id=7) n4 = Node(color=3, node_id=9) n5 = Node(color=3, node_id=10) n1.add_edges([n2]) n2.add_edges([n1, n3]) n3.add_edges([n2, n4]) n4.add_edges([n3, n5]) n5.add_edges([n4]) permutations, best_score = permutator.permutate( n1, [3, 4], aspiration_criteria) self.assertEqual(-1, best_score) self.assertEqual(3, len(permutations)) self.assertEqual(n2, permutations[0][0]) self.assertEqual(4, permutations[0][1]) self.assertEqual(n3, permutations[1][0]) self.assertEqual(4, permutations[1][1]) self.assertEqual(n4, permutations[2][0]) self.assertEqual(4, permutations[2][1])
def test_permutate_method_with_multiple_results(self): permutator = FastColorPermutator() aspiration_criteria = AspirationCriteria(None, None) aspiration_criteria.is_permutation_allowed = Mock(return_value=True) n1 = Node(color=3, node_id=3) n2 = Node(color=3, node_id=5) n3 = Node(color=3, node_id=7) n4 = Node(color=3, node_id=9) n5 = Node(color=3, node_id=10) n1.add_edges([n2]) n2.add_edges([n1, n3]) n3.add_edges([n2, n4]) n4.add_edges([n3, n5]) n5.add_edges([n4]) permutations, best_score = permutator.permutate(n1, [3, 4], aspiration_criteria) self.assertEqual(-1, best_score) self.assertEqual(3, len(permutations)) self.assertEqual(n2, permutations[0][0]) self.assertEqual(4, permutations[0][1]) self.assertEqual(n3, permutations[1][0]) self.assertEqual(4, permutations[1][1]) self.assertEqual(n4, permutations[2][0]) self.assertEqual(4, permutations[2][1])
def test_search_method_with_easy_substitutions(self): search_performer = GraphColoringSearchPerformer( StopCriteria(10, 10), 3) n1 = Node('red') n2 = Node('red') n3 = Node('red') n4 = Node('red') n5 = Node('red') n1.add_edges([n2, n3]) n2.add_edges([n1, n4]) n3.add_edges([n1, n4]) n4.add_edges([n2, n3, n5]) n5.add_edges([n4]) search_result = search_performer.search(n1, ['red', 'green']) n1_in_search_result = search_result.get_node_of_id(n1.node_id) n2_in_search_result = search_result.get_node_of_id(n2.node_id) n3_in_search_result = search_result.get_node_of_id(n3.node_id) n4_in_search_result = search_result.get_node_of_id(n4.node_id) n5_in_search_result = search_result.get_node_of_id(n5.node_id) self.assertIsNotNone(n1_in_search_result) self.assertIsNotNone(n2_in_search_result) self.assertIsNotNone(n3_in_search_result) self.assertIsNotNone(n4_in_search_result) self.assertIsNotNone(n5_in_search_result) self.assertEqual('green', n1_in_search_result.color) self.assertEqual('red', n2_in_search_result.color) self.assertEqual('red', n3_in_search_result.color) self.assertEqual('green', n4_in_search_result.color) self.assertEqual('red', n5_in_search_result.color)
def test_search_method_trivially(self): search_performer = GraphColoringSearchPerformer(StopCriteria(10, 10), 4) n1 = Node('red') n2 = Node('green') n3 = Node('green') n4 = Node('red') n5 = Node('green') n1.add_edges([n2, n3]) n2.add_edges([n1, n4]) n3.add_edges([n1, n4]) n4.add_edges([n2, n3, n5]) n5.add_edges([n4]) search_result = search_performer.search(n1, ['red', 'green']) n1_in_search_result = search_result.get_node_of_id(n1.node_id) n2_in_search_result = search_result.get_node_of_id(n2.node_id) n3_in_search_result = search_result.get_node_of_id(n3.node_id) n4_in_search_result = search_result.get_node_of_id(n4.node_id) n5_in_search_result = search_result.get_node_of_id(n5.node_id) self.assertIsNotNone(n1_in_search_result) self.assertIsNotNone(n2_in_search_result) self.assertIsNotNone(n3_in_search_result) self.assertIsNotNone(n4_in_search_result) self.assertIsNotNone(n5_in_search_result) self.assertEqual('red', n1_in_search_result.color) self.assertEqual('green', n2_in_search_result.color) self.assertEqual('green', n3_in_search_result.color) self.assertEqual('red', n4_in_search_result.color) self.assertEqual('green', n5_in_search_result.color)
def test_clone_method(self): n1 = Node(1, 123) n2 = Node(2, 456) n3 = Node(3, 789) n4 = Node(4, 333) n1.add_edges([n2, n3, n4]) n2.add_edges([n1, n4]) n3.add_edges([n1, n4]) n4.add_edges([n1, n2, n3]) cloned_n3 = GraphCloner.clone(n3) cloned_n1 = cloned_n3.get_node_of_id(123) cloned_n2 = cloned_n3.get_node_of_id(456) cloned_n3 = cloned_n3.get_node_of_id(789) cloned_n4 = cloned_n3.get_node_of_id(333) self.assertNotEqual(n3, cloned_n3) self.assertEqual(789, cloned_n3.node_id) self.assertEqual(3, cloned_n3.color) self.assertEqual(2, len(cloned_n3.edges)) self.assertNotEqual(n4, cloned_n4) self.assertEqual(333, cloned_n4.node_id) self.assertEqual(4, cloned_n4.color) self.assertEqual(3, len(cloned_n4.edges)) self.assertNotEqual(n1, cloned_n1) self.assertEqual(123, cloned_n1.node_id) self.assertEqual(1, cloned_n1.color) self.assertEqual(3, len(cloned_n1.edges)) self.assertNotEqual(n2, cloned_n2) self.assertEqual(789, cloned_n3.node_id) self.assertEqual(2, cloned_n2.color) self.assertEqual(2, len(cloned_n2.edges))
def test_evaluate_method_second(self): n1 = Node('red') n2 = Node('green') n3 = Node('green') n4 = Node('red') n5 = Node('red') n1.add_edges([n2, n3]) n2.add_edges([n1, n4]) n3.add_edges([n1, n4]) n4.add_edges([n2, n3, n5]) n5.add_edges([n4]) evaluated_cost = CostEvaluator.evaluate(n1, ['red', 'green']) self.assertEqual(-7, evaluated_cost)
def test_is_coloring_valid_method_positive(self): n1 = Node('red') n2 = Node('green') n3 = Node('green') n4 = Node('red') n5 = Node('green') n1.add_edges([n2, n3]) n2.add_edges([n1, n4]) n3.add_edges([n1, n4]) n4.add_edges([n2, n3, n5]) n5.add_edges([n4]) coloring_valid = ColoringValidator.is_coloring_valid(n1) self.assertTrue(coloring_valid)
def test_find_permutations_method_emergency_procedure(self): search_performer = GraphColoringSearchPerformer(StopCriteria(10, 10), 5) n1 = Node('red', 12) n2 = Node('red', 21) n3 = Node('red', 33) n4 = Node('red', 34) n5 = Node('red', 72) search_performer.memory.add_to_memory(n1, 'black') search_performer.memory.add_to_memory(n2, 'black') search_performer.memory.add_to_memory(n3, 'black') search_performer.memory.add_to_memory(n4, 'black') search_performer.memory.add_to_memory(n5, 'black') n1.add_edges([n2]) n2.add_edges([n3]) n3.add_edges([n4]) n4.add_edges([n5]) first_permutations = search_performer.find_permutations(n1, ['black', 'red'])[0] first_node, first_node_color = first_permutations[0] first_node.set_color(first_node_color) search_performer.memory.add_to_memory(first_node, first_node.previous_color) second_permutations = search_performer.find_permutations(first_node, ['black', 'red'])[0] second_node, second_node_color = second_permutations[0] second_node.set_color(second_node_color) search_performer.memory.add_to_memory(second_node, second_node.previous_color) third_permutations = search_performer.find_permutations(second_node, ['black', 'red'])[0] third_node, third_node_color = third_permutations[0] third_node.set_color(third_node_color) search_performer.memory.add_to_memory(third_node, third_node.previous_color) fourth_permutations = search_performer.find_permutations(third_node, ['black', 'red'])[0] fourth_node, fourth_node_color = fourth_permutations[0] fourth_node.set_color(fourth_node_color) search_performer.memory.add_to_memory(fourth_node, fourth_node.previous_color) fifth_permutations = search_performer.find_permutations(fourth_node, ['black', 'red'])[0] fifth_node, fifth_node_color = fifth_permutations[0] fifth_node.set_color(fifth_node_color) self.assertEqual(1, len(first_permutations)) self.assertEqual(12, first_node.node_id) self.assertEqual('black', first_node.color) self.assertEqual(1, len(second_permutations)) self.assertEqual(21, second_node.node_id) self.assertEqual('black', second_node.color) self.assertEqual(1, len(third_permutations)) self.assertEqual(33, third_node.node_id) self.assertEqual('black', third_node.color) self.assertEqual(1, len(fourth_permutations)) self.assertEqual(34, fourth_node.node_id) self.assertEqual('black', fourth_node.color) self.assertEqual(1, len(fifth_permutations)) self.assertEqual(72, fifth_node.node_id) self.assertEqual('black', fifth_node.color)
def test_permutate_method_with_banned_results(self): permutator = FastColorPermutator() n1 = Node(color=1, node_id=3) n2 = Node(color=1, node_id=5) n3 = Node(color=1, node_id=7) n4 = Node(color=1, node_id=9) n5 = Node(color=1, node_id=10) n1.add_edges([n2]) n2.add_edges([n1, n3]) n3.add_edges([n2, n4]) n4.add_edges([n3, n5]) n5.add_edges([n4]) aspiration_criteria = AspirationCriteria([(n2.node_id, 2), (n3.node_id, 2)], -1) permutations, best_score = permutator.permutate(n1, [1, 2], aspiration_criteria) self.assertEqual(-1, best_score) self.assertEqual(1, len(permutations)) self.assertEqual(n4, permutations[0][0]) self.assertEqual(2, permutations[0][1])
def test_color_classes_method(self): n1 = Node(color='#') n2 = Node(color='*') n3 = Node(color='#') n4 = Node(color='$') n1.add_edges([n2, n3, n4]) n2.add_edges([n1, n3, n4]) n3.add_edges([n1, n2, n4]) n4.add_edges([n1, n2, n3]) color_classes = n1.get_colors_count() self.assertEqual(3, color_classes)
def test_permutate_method_with_banned_results(self): permutator = FastColorPermutator() n1 = Node(color=1, node_id=3) n2 = Node(color=1, node_id=5) n3 = Node(color=1, node_id=7) n4 = Node(color=1, node_id=9) n5 = Node(color=1, node_id=10) n1.add_edges([n2]) n2.add_edges([n1, n3]) n3.add_edges([n2, n4]) n4.add_edges([n3, n5]) n5.add_edges([n4]) aspiration_criteria = AspirationCriteria([(n2.node_id, 2), (n3.node_id, 2)], -1) permutations, best_score = permutator.permutate( n1, [1, 2], aspiration_criteria) self.assertEqual(-1, best_score) self.assertEqual(1, len(permutations)) self.assertEqual(n4, permutations[0][0]) self.assertEqual(2, permutations[0][1])
def test_get_node_of_id_method(self): n1 = Node(node_id=8) n2 = Node(node_id=9) n3 = Node(node_id=12) n4 = Node(node_id=1) n5 = Node(node_id=88) n1.add_edges([n5, n3]) n2.add_edges([n4]) n3.add_edges([n2, n1]) n4.add_edges([n1, n5]) self.assertEqual(n1, n1.get_node_of_id(8)) self.assertEqual(n2, n1.get_node_of_id(9)) self.assertEqual(n3, n1.get_node_of_id(12)) self.assertEqual(n4, n1.get_node_of_id(1)) self.assertEqual(n5, n1.get_node_of_id(88))
def test_is_graph_connected_method_negative(self): n1 = Node() n2 = Node() n3 = Node() n4 = Node() n5 = Node() n1.add_edges([n2, n3]) n2.add_edges([n1]) n3.add_edges([n1]) n4.add_edges([n5]) n5.add_edges([n4]) n1_graph_connected = ConnectionValidator.is_graph_connected(n1, 5) n2_graph_connected = ConnectionValidator.is_graph_connected(n2, 5) n3_graph_connected = ConnectionValidator.is_graph_connected(n3, 5) n4_graph_connected = ConnectionValidator.is_graph_connected(n4, 5) n5_graph_connected = ConnectionValidator.is_graph_connected(n5, 5) self.assertFalse(n1_graph_connected) self.assertFalse(n2_graph_connected) self.assertFalse(n3_graph_connected) self.assertFalse(n4_graph_connected) self.assertFalse(n5_graph_connected)
def test_permutate_method(self): n1 = Node(1, node_id=1) n2 = Node(2, node_id=2) n3 = Node(3, node_id=3) n1.add_edges([n2]) n2.add_edges([n3]) n3.add_edges([n1]) permutations = self.color_permutator.permutate(n1, [1, 2, 3]) self.assertEqual(6, len(permutations)) self.assertEqual(2, permutations[0].get_node_of_id(1).color) self.assertEqual(1, permutations[0].get_node_of_id(1).previous_color) self.assertEqual(2, permutations[0].get_node_of_id(2).color) self.assertEqual(2, permutations[0].get_node_of_id(2).previous_color) self.assertEqual(3, permutations[0].get_node_of_id(3).color) self.assertEqual(3, permutations[0].get_node_of_id(3).previous_color) self.assertEqual(3, permutations[1].get_node_of_id(1).color) self.assertEqual(1, permutations[1].get_node_of_id(1).previous_color) self.assertEqual(2, permutations[1].get_node_of_id(2).color) self.assertEqual(2, permutations[1].get_node_of_id(2).previous_color) self.assertEqual(3, permutations[1].get_node_of_id(3).color) self.assertEqual(3, permutations[1].get_node_of_id(3).previous_color) self.assertEqual(1, permutations[2].get_node_of_id(1).color) self.assertEqual(1, permutations[2].get_node_of_id(1).previous_color) self.assertEqual(1, permutations[2].get_node_of_id(2).color) self.assertEqual(2, permutations[2].get_node_of_id(2).previous_color) self.assertEqual(3, permutations[2].get_node_of_id(3).color) self.assertEqual(3, permutations[2].get_node_of_id(3).previous_color) self.assertEqual(1, permutations[3].get_node_of_id(1).color) self.assertEqual(1, permutations[3].get_node_of_id(1).previous_color) self.assertEqual(3, permutations[3].get_node_of_id(2).color) self.assertEqual(2, permutations[3].get_node_of_id(2).previous_color) self.assertEqual(3, permutations[3].get_node_of_id(3).color) self.assertEqual(3, permutations[3].get_node_of_id(3).previous_color) self.assertEqual(1, permutations[4].get_node_of_id(1).color) self.assertEqual(1, permutations[4].get_node_of_id(1).previous_color) self.assertEqual(2, permutations[4].get_node_of_id(2).color) self.assertEqual(2, permutations[4].get_node_of_id(2).previous_color) self.assertEqual(1, permutations[4].get_node_of_id(3).color) self.assertEqual(3, permutations[4].get_node_of_id(3).previous_color) self.assertEqual(1, permutations[5].get_node_of_id(1).color) self.assertEqual(1, permutations[5].get_node_of_id(1).previous_color) self.assertEqual(2, permutations[5].get_node_of_id(2).color) self.assertEqual(2, permutations[5].get_node_of_id(2).previous_color) self.assertEqual(2, permutations[5].get_node_of_id(3).color) self.assertEqual(3, permutations[5].get_node_of_id(3).previous_color)
def test_node_count_method(self): n1 = Node('a') n2 = Node('b') n3 = Node('c') n4 = Node('d') n5 = Node('e') n1.add_edges([n2, n5]) n2.add_edges([n3]) n3.add_edges([n4]) node_count = n1.node_count() self.assertEqual(node_count, 5)
def test_is_graph_connected_method_positive(self): n1 = Node() n2 = Node() n3 = Node() n1.add_edges([n2, n3]) n2.add_edges([n1]) n3.add_edges([n1]) n1_graph_connected = ConnectionValidator.is_graph_connected(n1, 3) n2_graph_connected = ConnectionValidator.is_graph_connected(n2, 3) n3_graph_connected = ConnectionValidator.is_graph_connected(n3, 3) self.assertTrue(n1_graph_connected) self.assertTrue(n2_graph_connected) self.assertTrue(n3_graph_connected)
def test_permutate_method_with_single_result(self): permutator = FastColorPermutator() aspiration_criteria = AspirationCriteria(None, None) aspiration_criteria.is_permutation_allowed = Mock(return_value=True) n1 = Node(color=0, node_id=10) n2 = Node(color=0, node_id=20) n3 = Node(color=0, node_id=30) n1.add_edges([n2]) n2.add_edges([n1, n3]) n3.add_edges([n2]) permutations, best_score = permutator.permutate(n1, [0, 7], aspiration_criteria) self.assertEqual(-5, best_score) self.assertEqual(1, len(permutations)) self.assertEqual(n2, permutations[0][0]) self.assertEqual(7, permutations[0][1])
def test_permutate_method_with_single_result(self): permutator = FastColorPermutator() aspiration_criteria = AspirationCriteria(None, None) aspiration_criteria.is_permutation_allowed = Mock(return_value=True) n1 = Node(color=0, node_id=10) n2 = Node(color=0, node_id=20) n3 = Node(color=0, node_id=30) n1.add_edges([n2]) n2.add_edges([n1, n3]) n3.add_edges([n2]) permutations, best_score = permutator.permutate( n1, [0, 7], aspiration_criteria) self.assertEqual(-5, best_score) self.assertEqual(1, len(permutations)) self.assertEqual(n2, permutations[0][0]) self.assertEqual(7, permutations[0][1])
def test_permutate_method_with_banned_transitions(self): n1 = Node(1, 18) n2 = Node(2, 23) n3 = Node(3, 51) n1.add_edges([n2]) n2.add_edges([n3]) n3.add_edges([n1]) permutations = self.color_permutator.permutate(n1, [1, 2, 3], [(23, 1), (51, 1)]) self.assertEqual(4, len(permutations)) self.assertEqual(2, permutations[0].get_node_of_id(18).color) self.assertEqual(1, permutations[0].get_node_of_id(18).previous_color) self.assertEqual(2, permutations[0].get_node_of_id(23).color) self.assertEqual(2, permutations[0].get_node_of_id(23).previous_color) self.assertEqual(3, permutations[0].get_node_of_id(51).color) self.assertEqual(3, permutations[0].get_node_of_id(51).previous_color) self.assertEqual(3, permutations[1].get_node_of_id(18).color) self.assertEqual(1, permutations[1].get_node_of_id(18).previous_color) self.assertEqual(2, permutations[1].get_node_of_id(23).color) self.assertEqual(2, permutations[1].get_node_of_id(23).previous_color) self.assertEqual(3, permutations[1].get_node_of_id(51).color) self.assertEqual(3, permutations[1].get_node_of_id(51).previous_color) self.assertEqual(1, permutations[2].get_node_of_id(18).color) self.assertEqual(1, permutations[2].get_node_of_id(18).previous_color) self.assertEqual(3, permutations[2].get_node_of_id(23).color) self.assertEqual(2, permutations[2].get_node_of_id(23).previous_color) self.assertEqual(3, permutations[2].get_node_of_id(51).color) self.assertEqual(3, permutations[2].get_node_of_id(51).previous_color) self.assertEqual(1, permutations[3].get_node_of_id(18).color) self.assertEqual(1, permutations[3].get_node_of_id(18).previous_color) self.assertEqual(2, permutations[3].get_node_of_id(23).color) self.assertEqual(2, permutations[3].get_node_of_id(23).previous_color) self.assertEqual(2, permutations[3].get_node_of_id(51).color) self.assertEqual(3, permutations[3].get_node_of_id(51).previous_color)
def test_next_method(self): n1 = Node('red', 1) n2 = Node('green', 2) n3 = Node('green', 3) n4 = Node('red', 4) n5 = Node('green', 5) n6 = Node('red', 6) n1.add_edges([n2, n3, n6]) n2.add_edges([n1, n4]) n3.add_edges([n1, n4]) n4.add_edges([n2, n3, n5]) n5.add_edges([n4]) n6.add_edges([n1]) iterator = NodeIterator(n1) self.assertEqual(n1, iterator.next()) self.assertEqual(n2, iterator.next()) self.assertEqual(n4, iterator.next()) self.assertEqual(n3, iterator.next()) self.assertEqual(n5, iterator.next()) self.assertEqual(n6, iterator.next()) self.assertRaises(StopIteration, iterator.next)
def test_evaluate_method(self): r1 = Node('red') r2 = Node('red') r3 = Node('red') b1 = Node('blue') b2 = Node('blue') g1 = Node('green') g2 = Node('green') g3 = Node('green') r1.add_edges([g1, r2, b2]) r2.add_edges([r1, r3, b2]) r3.add_edges([r2, b1, g2]) b1.add_edges([r3]) b2.add_edges([r1, r2, g1, g3]) g1.add_edges([r1, b2]) g2.add_edges([r3, g3]) g3.add_edges([g2, b2]) evaluated_cost_r1 = CostEvaluator.evaluate(r1, ['red', 'blue', 'green']) evaluated_cost_g3 = CostEvaluator.evaluate(g3, ['blue', 'red', 'green']) self.assertEqual(evaluated_cost_r1, evaluated_cost_g3) self.assertEqual(-4, evaluated_cost_r1)
def test_find_permutations_method_emergency_procedure(self): search_performer = GraphColoringSearchPerformer( StopCriteria(10, 10), 5) n1 = Node('red', 12) n2 = Node('red', 21) n3 = Node('red', 33) n4 = Node('red', 34) n5 = Node('red', 72) search_performer.memory.add_to_memory(n1, 'black') search_performer.memory.add_to_memory(n2, 'black') search_performer.memory.add_to_memory(n3, 'black') search_performer.memory.add_to_memory(n4, 'black') search_performer.memory.add_to_memory(n5, 'black') n1.add_edges([n2]) n2.add_edges([n3]) n3.add_edges([n4]) n4.add_edges([n5]) first_permutations = search_performer.find_permutations( n1, ['black', 'red'])[0] first_node, first_node_color = first_permutations[0] first_node.set_color(first_node_color) search_performer.memory.add_to_memory(first_node, first_node.previous_color) second_permutations = search_performer.find_permutations( first_node, ['black', 'red'])[0] second_node, second_node_color = second_permutations[0] second_node.set_color(second_node_color) search_performer.memory.add_to_memory(second_node, second_node.previous_color) third_permutations = search_performer.find_permutations( second_node, ['black', 'red'])[0] third_node, third_node_color = third_permutations[0] third_node.set_color(third_node_color) search_performer.memory.add_to_memory(third_node, third_node.previous_color) fourth_permutations = search_performer.find_permutations( third_node, ['black', 'red'])[0] fourth_node, fourth_node_color = fourth_permutations[0] fourth_node.set_color(fourth_node_color) search_performer.memory.add_to_memory(fourth_node, fourth_node.previous_color) fifth_permutations = search_performer.find_permutations( fourth_node, ['black', 'red'])[0] fifth_node, fifth_node_color = fifth_permutations[0] fifth_node.set_color(fifth_node_color) self.assertEqual(1, len(first_permutations)) self.assertEqual(12, first_node.node_id) self.assertEqual('black', first_node.color) self.assertEqual(1, len(second_permutations)) self.assertEqual(21, second_node.node_id) self.assertEqual('black', second_node.color) self.assertEqual(1, len(third_permutations)) self.assertEqual(33, third_node.node_id) self.assertEqual('black', third_node.color) self.assertEqual(1, len(fourth_permutations)) self.assertEqual(34, fourth_node.node_id) self.assertEqual('black', fourth_node.color) self.assertEqual(1, len(fifth_permutations)) self.assertEqual(72, fifth_node.node_id) self.assertEqual('black', fifth_node.color)