def test__copy_nodes_along_graph(self): node.set_id(self.n1, 0) node.set_id(self.n2, 1) node.set_children(self.n1, [self.n2, self.n3]) node.set_children(self.n2, [self.n4, self.n5]) node.set_children(self.n3, [self.n6]) graph = [(0, self.n1), (1, self.n2)] pos, parent, root = node.copy_nodes_along_graph(graph) self.assertEqual(pos, 1) self.assertTrue(node.node_equal(parent, self.n2)) self.assertTrue(node.node_equal(root, self.n1, as_tree=True)) self.assertFalse(parent is self.n2) self.assertFalse(root is self.n1)
def test_node_equal(self): node.set_id(self.n1, 0) node.set_id(self.n2, 0) node.set_id(self.n3, 0) node.set_id(self.n4, 0) node.set_id(self.n5, 0) node.set_id(self.n6, 0) node.set_children(self.n1, [self.n2, self.n3]) node.set_children(self.n4, [self.n5, self.n6]) self.assertTrue(node.node_equal(self.n1, self.n4)) self.assertTrue(node.node_equal(self.n1, self.n4, as_tree=True)) node.set_id(self.n2, 1) self.assertFalse(node.node_equal(self.n1, self.n3)) self.assertFalse(node.node_equal(self.n2, self.n3)) self.assertFalse(node.node_equal(self.n1, self.n4, as_tree=True))
def test_destructive_crossover_core(self): s1_nodes = node.get_all_node(self.parents[0].root) s2_nodes = node.get_all_node(self.parents[1].root) points = [s1_nodes[0], s2_nodes[2]] expected_nodes1 = [node.Node(1)] expected_nodes2 = [node.Node(0), node.Node(1), node.Node(0), node.Node(1), node.Node(1), node.Node(0), node.Node(0), node.Node(0), node.Node(0)] node.set_children(expected_nodes2[0], [expected_nodes2[1], expected_nodes2[8]]) node.set_children(expected_nodes2[1], [expected_nodes2[2], expected_nodes2[7]]) node.set_children(expected_nodes2[2], [expected_nodes2[3], expected_nodes2[6]]) node.set_children(expected_nodes2[3], [expected_nodes2[4], expected_nodes2[5]]) new_s1, new_s2 = co.destructive_crossover(self.parents, points) self.assertTrue(node.node_equal(expected_nodes1[0], new_s1.root, as_tree=True)) self.assertTrue(node.node_equal(expected_nodes2[0], new_s2.root, as_tree=True)) self.assertTrue(self.parents[0] is new_s1) self.assertTrue(self.parents[1] is new_s2)
def solution_equal(solution_a, solution_b, as_tree=True): # TODO type check if ``solution'' is Solution if as_tree: if solution_a is solution_b: return True if solution_a.n_nodes != solution_b.n_nodes: return False if solution_a.depth != solution_b.depth: return False return node_equal(solution_a.root, solution_b.root, as_tree=as_tree) else: return solution_a is solution_b
def test_destructive_replace_node(self): na1 = node.Node(1) na2 = node.Node(0) node.set_id(na1, 0) node.set_id(na2, 1) node.set_children(na1, [na2]) original_s1 = copy.deepcopy(self.s1) new_s1 = solution.replace_node(self.s1, self.n2, na1, destructive=True) expected_nodes = [node.Node(0), node.Node(0), node.Node(1), node.Node(0)] node.set_children(expected_nodes[0], [expected_nodes[1], expected_nodes[3]]) node.set_children(expected_nodes[1], [expected_nodes[2]]) self.assertTrue(node.node_equal(new_s1.root, expected_nodes[0], as_tree=True)) self.assertEqual(new_s1.n_nodes, len(expected_nodes)) self.assertEqual(new_s1.depth, 2) # Check whether the original solution is NOT protected. self.assertFalse(solution.solution_equal(original_s1, new_s1)) self.assertTrue(self.s1 is new_s1)