def test_get_children_ids(self): # konstrukcja grafu g = Graph(directed=False) sim_nodes = [] # 1 - dodanie pierwszego wierzcholka do grafu root_vertex = g.add_vertex() root_node = Node(root_vertex, sim_nodes) root_node.memory['parent_id'] = 0 sim_nodes.append(root_node) # root -> v1 # v1 -> v2 # v1 -> v3 v1 = g.add_vertex() v1_node = Node(v1, sim_nodes) v1_node.memory['parent_id'] = 0 sim_nodes.append(v1_node) g.add_edge(root_vertex, v1) v2 = g.add_vertex() v2_node = Node(v2, sim_nodes) v2_node.memory['parent_id'] = 1 sim_nodes.append(v2_node) g.add_edge(v2, v1) v3 = g.add_vertex() v3_node = Node(v3, sim_nodes) v3_node.memory['parent_id'] = 1 sim_nodes.append(v3_node) g.add_edge(v3, v1) # testowanie funkcji root_kids_ids = get_children_ids(root_vertex, 0) self.failUnless(root_kids_ids == [1]) v1_kids_ids = get_children_ids(v1, 0) v1_kids_ids.sort() self.failUnless(v1_kids_ids == [2, 3])
def _update_outbox(self, sim_node): """ Tworzenie nowych wiadomosci do wyslania innym wezlom. sim_node - instancja Node ktora rozpatrujemy """ # 1 - wyznacz wszystkie swoje dzieci vertex_instance = self.graph.vertex(sim_node.id) children_ids = get_children_ids(vertex_instance, sim_node.memory['parent_id']) # 2 - dodawaj do swojej skrzynki nadawczej wiadomosci for child_id in children_ids: new_msg = Message(sim_node.id, child_id, sim_node.memory['color']) sim_node.outbox.append(new_msg)
def _shift_down_v2(self, root_id): """ Metoda przekazuje rekurencyjnie kolory kazdego z wezlow jego dzieciom. Implementacja w drugiej czesci korzysta z iteratorow dla calego grafu. root_id - id wezla, ktorego uwazamy za roota """ # faza 1 - wysylanie wiadomosci o swoim kolorze children_ids = [root_id] while children_ids: parent_id = children_ids.pop(0) parent_node = self.sim_nodes[parent_id] parent_vertex = self.graph.vertex(parent_id) parents_parent_id = self.sim_nodes[parent_id].memory['parent_id'] new_children_ids = get_children_ids(parent_vertex, parents_parent_id) for child_id in new_children_ids: new_msg = Message(parent_id, child_id, parent_node.memory['color']) parent_node.outbox.append(new_msg) # do listy dodane sa juz wierzcholki z przydzielonymi kolorami children_ids.extend(new_children_ids) # faza 2 - otrzymywanie wiadomosci o swoim kolorze for sim_node in self.sim_nodes: sim_node.process_outbox() # faza 3 - zmiana informacji for sim_node in self.sim_nodes: assert len(sim_node.inbox) < 2 if sim_node.inbox: msg = sim_node.inbox.pop(0) sim_node.memory['old_color'] = sim_node.memory['color'] sim_node.memory['color'] = msg.data old_root_color = self.sim_nodes[root_id].memory['color'] possible_colors = range(3) if old_root_color in possible_colors: possible_colors.remove(old_root_color) self.sim_nodes[root_id].memory['color'] = random.choice(possible_colors)
def test_update_outbox(self): g, sim_nodes = createRandomTree(5) c6instance = Color6(g, sim_nodes) root_node = sim_nodes[0] root_color = 15 root_node.memory['color'] = root_color root_vertex = g.vertex(0) root_children_ids = get_children_ids(root_vertex, 0) c6instance._update_outbox(root_node) self.failUnless(len(root_children_ids) == len(root_node.outbox)) for msg in root_node.outbox: self.failUnless(msg.source_id == 0) self.failUnless(msg.target_id in root_children_ids) self.failUnless(msg.data == root_color)