Пример #1
0
    def test_filter_function_inner_exception(self):
        dag = retworkx.PyDiGraph()
        dag.add_node("a")
        dag.add_child(0, "b", None)
        dag.add_child(1, "c", None)

        def fail_function(node):
            raise IndexError("Things fail from time to time")

        with self.assertRaises(IndexError):
            retworkx.collect_bicolor_runs(dag, fail_function, lambda _: None)

        with self.assertRaises(IndexError):
            retworkx.collect_bicolor_runs(dag, lambda _: True, fail_function)
Пример #2
0
    def test_two_colors(self):
        """
        Input:
        ┌─────────────┐                 ┌─────────────┐
        │             │                 │             │
        │    q0       │                 │    q1       │
        │             │                 │             │
        └───┬─────────┘                 └──────┬──────┘
            │          ┌─────────────┐         │
        q0  │          │             │         │  q1
            │          │             │         │
            └─────────►│     cx      │◄────────┘
            ┌──────────┤             ├─────────┐
            │          │             │         │
        q0  │          └─────────────┘         │  q1
            │                                  │
            │          ┌─────────────┐         │
            │          │             │         │
            └─────────►│      cz     │◄────────┘
             ┌─────────┤             ├─────────┐
             │         └─────────────┘         │
         q0  │                                 │ q1
             │                                 │
         ┌───▼─────────┐                ┌──────▼──────┐
         │             │                │             │
         │    q0       │                │    q1       │
         │             │                │             │
         └─────────────┘                └─────────────┘

        Expected: [[cx, cz]]
        """
        dag = retworkx.PyDAG()
        q0_list = []
        q1_list = []
        for _ in range(2):
            q0_list.append(dag.add_node("q0"))
            q1_list.append(dag.add_node("q1"))

        cx_gate = dag.add_node("cx")
        cz_gate = dag.add_node("cz")

        dag.add_edge(q0_list[0], cx_gate, "q0")
        dag.add_edge(q1_list[0], cx_gate, "q1")
        dag.add_edge(cx_gate, cz_gate, "q0")
        dag.add_edge(cx_gate, cz_gate, "q1")
        dag.add_edge(cz_gate, q0_list[1], "q0")
        dag.add_edge(cz_gate, q1_list[1], "q1")

        def filter_function(node):
            if node in ["cx", "cz"]:
                return True
            else:
                return None

        def color_function(node):
            if "q" in node:
                return int(node[1:])
            else:
                return None

        self.assertEqual(
            [["cx", "cz"]],
            retworkx.collect_bicolor_runs(dag, filter_function,
                                          color_function),
        )
Пример #3
0
 def test_empty(self):
     dag = retworkx.PyDAG()
     self.assertEqual(
         [],
         retworkx.collect_bicolor_runs(dag, lambda _: True, lambda _: None),
     )
Пример #4
0
    def test_color_with_ignored_edge(self):
        """
        Input:
        ┌─────────────┐                 ┌─────────────┐
        │             │                 │             │
        │    q0       │                 │    c0       │
        │             │                 │             │
        └───┬─────────┘                 └──────┬──────┘
            │          ┌─────────────┐         │
        q0  │          │             │         │  c0
            └─────────►│     rx      │◄────────┘
            ┌──────────┤             ├─────────┐
        q0  │          └─────────────┘         │  c0
            │                                  │
            │          ┌─────────────┐         │
            │          │             │         │
            └─────────►│  barrier    │         │
             ┌─────────┤             │         │
             │         └─────────────┘         │
         q0  │                                 │ c0
             │                                 │
             │         ┌─────────────┐         │
             │         │             │         │
             └────────►│     rz      │◄────────┘
            ┌──────────┤             ├─────────┐
        q0  │          └─────────────┘         │  c0
            │                                  │
        ┌───▼─────────┐                 ┌──────▼──────┐
        │             │                 │             │
        │    q0       │                 │    c0       │
        │             │                 │             │
        └─────────────┘                 └─────────────┘

        Expected: []
        """
        dag = retworkx.PyDAG()
        q0_list = []
        c0_list = []
        for _ in range(2):
            q0_list.append(dag.add_node("q0"))
            c0_list.append(dag.add_node("c0"))

        rx_gate = dag.add_node("rx")
        barrier = dag.add_node("barrier")
        rz_gate = dag.add_node("rz")

        # RX
        dag.add_edge(q0_list[0], rx_gate, "q0")
        dag.add_edge(c0_list[0], rx_gate, "c0")
        # Barrier
        dag.add_edge(rx_gate, barrier, "q0")
        # RZ
        dag.add_edge(barrier, rz_gate, "q0")
        dag.add_edge(rx_gate, rz_gate, "c0")
        dag.add_edge(rz_gate, q0_list[1], "q0")
        dag.add_edge(rz_gate, c0_list[1], "c0")

        def filter_function(node):
            if node == "barrier":
                return False
            else:
                return None

        def color_function(node):
            if "q" in node:
                return int(node[1:])
            else:
                return None

        self.assertEqual(
            [],
            retworkx.collect_bicolor_runs(dag, filter_function,
                                          color_function),
        )
Пример #5
0
 def test_cycle(self):
     dag = retworkx.PyDiGraph()
     dag.extend_from_edge_list([(0, 1), (1, 2), (2, 0)])
     with self.assertRaises(retworkx.DAGHasCycle):
         retworkx.collect_bicolor_runs(dag, lambda _: True, lambda _: None)