Beispiel #1
0
    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()))
Beispiel #2
0
    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
Beispiel #3
0
    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)))