def test_run(self) -> None: """Test run with a linear topology.""" # 0 1 2 3 4 ######### # 0 --o-----o--P--P-- --#-o---o-#-----#######-- # 1 --x--o--x--o----- --#-x-o-x-#######-o---#-- # 2 -----x--o--x--o-- => --#---x---#---o-#-x-o-#-- # 3 --o--P--x--P--x-- --#########-o-x-#---x-#-- # 4 --x-----------P-- ----------#-x---#######-- # ####### num_q = 5 circ = Circuit(num_q) circ.append_gate(CNOTGate(), [0, 1]) circ.append_gate(CNOTGate(), [3, 4]) circ.append_gate(CNOTGate(), [1, 2]) circ.append_gate(CNOTGate(), [0, 1]) circ.append_gate(CNOTGate(), [2, 3]) circ.append_gate(CNOTGate(), [1, 2]) circ.append_gate(CNOTGate(), [2, 3]) utry = circ.get_unitary() ScanPartitioner(3).run(circ, {}) assert len(circ) == 3 assert all(isinstance(op.gate, CircuitGate) for op in circ) placeholder_gate = TaggedGate(IdentityGate(1), '__fold_placeholder__') assert all( op.gate._circuit.count(placeholder_gate) == 0 for op in circ) # type: ignore # noqa assert circ.get_unitary() == utry for cycle_index in range(circ.get_num_cycles()): assert not circ._is_cycle_idle(cycle_index)
def test_corner_case_2(self) -> None: circuit = Circuit(6) circuit.append_gate(ConstantUnitaryGate(UnitaryMatrix.random(1)), [0]) circuit.append_gate(ConstantUnitaryGate(UnitaryMatrix.random(1)), [1]) circuit.append_gate(ConstantUnitaryGate(UnitaryMatrix.random(1)), [5]) circuit.append_gate( ConstantUnitaryGate(UnitaryMatrix.random(2), ), [ 3, 0, ], ) circuit.append_gate( ConstantUnitaryGate(UnitaryMatrix.random(2), ), [ 5, 0, ], ) circuit.append_gate(ConstantUnitaryGate(UnitaryMatrix.random(1)), [3]) circuit.append_gate( ConstantUnitaryGate(UnitaryMatrix.random(4), ), [ 4, 0, 1, 2, ], ) circuit.append_gate(ConstantUnitaryGate(UnitaryMatrix.random(1)), [5]) circuit.append_gate( ConstantUnitaryGate(UnitaryMatrix.random(3), ), [ 5, 0, 1, ], ) circuit.append_gate(ConstantUnitaryGate(UnitaryMatrix.random(1)), [1]) utry = circuit.get_unitary() ScanPartitioner(3).run(circuit, {}) assert all( isinstance(op.gate, CircuitGate) or len(op.location) > 3 for op in circuit) assert all(not isinstance(op.gate, TaggedGate) or not op.gate.tag != '__fold_placeholder__' for op in circuit) assert circuit.get_unitary() == utry for cycle_index in range(circuit.get_num_cycles()): assert not circuit._is_cycle_idle(cycle_index)
def test_run_r6(self, r6_qudit_circuit: Circuit) -> None: utry = r6_qudit_circuit.get_unitary() ClusteringPartitioner(3, 2).run(r6_qudit_circuit, {}) assert any(isinstance(op.gate, CircuitGate) for op in r6_qudit_circuit) assert r6_qudit_circuit.get_unitary() == utry for cycle_index in range(r6_qudit_circuit.get_num_cycles()): assert not r6_qudit_circuit._is_cycle_idle(cycle_index)
def test_run_r6(self, r6_qudit_circuit: Circuit) -> None: utry = r6_qudit_circuit.get_unitary() ScanPartitioner(3).run(r6_qudit_circuit, {}) assert all( isinstance(op.gate, CircuitGate) or len(op.location) > 3 for op in r6_qudit_circuit) assert all(not isinstance(op.gate, TaggedGate) or not op.gate.tag != '__fold_placeholder__' for op in r6_qudit_circuit) assert r6_qudit_circuit.get_unitary() == utry for cycle_index in range(r6_qudit_circuit.get_num_cycles()): assert not r6_qudit_circuit._is_cycle_idle(cycle_index)
def check_no_idle_cycles(circuit: Circuit) -> None: for cycle_index in range(circuit.get_num_cycles()): assert not circuit._is_cycle_idle(cycle_index)