def testDAG(self): """ 1 --- 4 2 --- 6 \ / 5 / 3 """ dag = DAG() [dag.add_node(i) for i in range(1, 7)] dag.add_edge(1, 4) dag.add_edge(2, 6) dag.add_edge(2, 5) dag.add_edge(5, 6) dag.add_edge(3, 5) self.assertEqual(set(dag[2]), set([5, 6])) self.assertEqual(list(dag.topological_iter()), [3, 2, 5, 6, 1, 4]) self.assertEqual(list(dag.dfs()), [3, 2, 5, 6, 1, 4]) self.assertEqual(list(dag.bfs()), [1, 2, 3, 4, 5, 6]) dag.add_edge(6, 1) dag.add_edge(1, 2) self.assertRaises(GraphContainsCycleError, lambda: list(dag.topological_iter()))
def _build_chunk_dag(node_str, edge_str): from mars.tensor.random import TensorRandint from mars.tensor.arithmetic import TensorTreeAdd char_dag = DAG() for s in node_str.split(','): char_dag.add_node(s.strip()) for s in edge_str.split(','): l, r = s.split('->') char_dag.add_edge(l.strip(), r.strip()) chunk_dag = DAG() str_to_chunk = dict() for s in char_dag.topological_iter(): if char_dag.count_predecessors(s): c = TensorTreeAdd(_key=s, dtype=np.float32()).new_chunk(None, shape=(10, 10)) inputs = c.op._inputs = [ str_to_chunk[ps] for ps in char_dag.predecessors(s) ] else: c = TensorRandint(_key=s, dtype=np.float32()).new_chunk(None, shape=(10, 10)) inputs = [] str_to_chunk[s] = c chunk_dag.add_node(c) for inp in inputs: chunk_dag.add_edge(inp, c) return chunk_dag, str_to_chunk
def testDAG(self): r""" 1 --- 4 2 --- 6 \ / 5 / 3 """ dag = DAG() [dag.add_node(i) for i in range(1, 7)] dag.add_edge(1, 4) dag.add_edge(2, 6) dag.add_edge(2, 5) dag.add_edge(5, 6) dag.add_edge(3, 5) with self.assertRaises(KeyError): dag.add_edge(1, 10) with self.assertRaises(KeyError): dag.add_edge(10, 1) self.assertEqual(set(dag[2]), {5, 6}) self.assertEqual(list(dag.topological_iter()), [3, 2, 5, 6, 1, 4]) self.assertEqual(list(dag.dfs()), [3, 2, 5, 6, 1, 4]) self.assertEqual(list(dag.bfs()), [1, 2, 3, 4, 5, 6]) dag.add_edge(6, 1) dag.add_edge(1, 2) with self.assertRaises(KeyError): for _ in dag.iter_predecessors(-1): pass with self.assertRaises(KeyError): for _ in dag.iter_successors(-1): pass self.assertRaises(GraphContainsCycleError, lambda: list(dag.topological_iter())) dag.remove_edge(2, 5) self.assertFalse(dag.has_successor(2, 5)) with self.assertRaises(KeyError): dag.remove_edge(2, 5) rev_dag = dag.build_reversed() for n in dag: self.assertIn(n, rev_dag) self.assertTrue( all( rev_dag.has_successor(n, pred) for pred in dag.predecessors(n))) undigraph = dag.build_undirected() for n in dag: self.assertIn(n, undigraph) self.assertTrue( all( undigraph.has_predecessor(pred, n) for pred in dag.predecessors(n))) self.assertTrue( all( undigraph.has_successor(n, pred) for pred in dag.predecessors(n))) dag_copy = dag.copy() for n in dag: self.assertIn(n, dag_copy) self.assertTrue( all( dag_copy.has_successor(pred, n) for pred in dag_copy.predecessors(n)))