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)
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), )
def test_empty(self): dag = retworkx.PyDAG() self.assertEqual( [], retworkx.collect_bicolor_runs(dag, lambda _: True, lambda _: None), )
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), )
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)