def test_qudit(self) -> None: circuit = Circuit(3, [2, 3, 3]) assert len(circuit.get_gate_set()) == 0 circuit.append_gate(U3Gate(), [0]) assert len(circuit.get_gate_set()) == 1 assert U3Gate() in circuit.get_gate_set() circuit.append_gate(XGate(), [0]) assert len(circuit.get_gate_set()) == 2 assert U3Gate() in circuit.get_gate_set() assert XGate() in circuit.get_gate_set() circuit.append_gate(ZGate(), [0]) assert len(circuit.get_gate_set()) == 3 assert U3Gate() in circuit.get_gate_set() assert XGate() in circuit.get_gate_set() assert ZGate() in circuit.get_gate_set() circuit.append_gate(TGate(), [0]) assert len(circuit.get_gate_set()) == 4 assert U3Gate() in circuit.get_gate_set() assert XGate() in circuit.get_gate_set() assert ZGate() in circuit.get_gate_set() assert TGate() in circuit.get_gate_set() circuit.append_gate(CSUMGate(), [1, 2]) assert len(circuit.get_gate_set()) == 5 assert U3Gate() in circuit.get_gate_set() assert XGate() in circuit.get_gate_set() assert ZGate() in circuit.get_gate_set() assert TGate() in circuit.get_gate_set() assert CSUMGate() in circuit.get_gate_set()
def test_random_batch_remove(self) -> None: num_gates = 200 num_q = 10 circ = Circuit(num_q) for _ in range(num_gates): a = randint(0, num_q - 1) b = randint(0, num_q - 1) if a == b: b = (b + 1) % num_q circ.append_gate(CNOTGate(), [a, b]) ScanPartitioner(2).run(circ, {}) points = [] ops = [] for cycle, op in circ.operations_with_cycles(): point = (cycle, op.location[0]) ops.append(Operation(CNOTGate(), op.location)) points.append(point) circ.batch_replace(points, ops) for op in circ: assert isinstance(op.gate, CNOTGate)
def test_full_pauli_gate() -> None: circuit = Circuit(3) circuit.append_gate(PauliGate(3), [0, 1, 2]) cost = HilbertSchmidtResiduals(circuit, UnitaryMatrix(unitary_group.rvs(8))) circuit.minimize(cost) assert cost.get_cost(circuit.get_params()) < 1e-6
def test_append_gate_4(self, qudit_index: int) -> None: circuit = Circuit(4) circuit.append_gate(CNOTGate(), [0, 1]) circuit.append_gate(CNOTGate(), [1, 2]) circuit.append_gate(CNOTGate(), [2, 3]) circuit.append_gate(CNOTGate(), [0, 1]) circuit.append_gate(CNOTGate(), [1, 2]) circuit.append_gate(CNOTGate(), [2, 3]) circuit.append_gate(CNOTGate(), [0, 1]) circuit.append_gate(CNOTGate(), [1, 2]) circuit.append_gate(CNOTGate(), [2, 3]) circuit.pop_qudit(qudit_index) assert circuit.get_size() == 3 assert len(circuit.get_radixes()) == 3 assert circuit.get_radixes().count(2) == 3 assert circuit.get_num_operations() == 6 assert circuit[0, 0].gate == CNOTGate() assert circuit[0, 0].location == (0, 1) assert circuit[1, 1].gate == CNOTGate() assert circuit[1, 1].location == (1, 2) assert circuit[2, 0].gate == CNOTGate() assert circuit[2, 0].location == (0, 1) assert circuit[3, 1].gate == CNOTGate() assert circuit[3, 1].location == (1, 2) assert circuit[4, 0].gate == CNOTGate() assert circuit[4, 0].location == (0, 1) assert circuit[5, 1].gate == CNOTGate() assert circuit[5, 1].location == (1, 2)
def test_correctness_2(self) -> None: circuit = Circuit(2) circuit.append_gate(HGate(), [0]) circuit.append_gate(CNOTGate(), [0, 1]) assert circuit.get_operation((0, 0)).gate == HGate() assert circuit.get_operation((1, 0)).gate == CNOTGate() assert circuit.get_operation((1, 1)).gate == CNOTGate()
def swap_circuit() -> Circuit: """Provides a swap implemented with 3 cnots as a circuit fixture.""" circuit = Circuit(2) circuit.append_gate(CNOTGate(), [0, 1]) circuit.append_gate(CNOTGate(), [1, 0]) circuit.append_gate(CNOTGate(), [0, 1]) return circuit
def test_example(self) -> None: circuit = Circuit(2) circuit.append_gate(HGate(), [0]) assert circuit.find_available_cycle([1]) == 0 circuit.append_gate(XGate(), [0]) circuit.append_gate(ZGate(), [1]) assert circuit.find_available_cycle([1]) == 1
def test_example(self) -> None: circuit = Circuit(2) circuit.append_gate(HGate(), [0]) circuit.append_gate(XGate(), [0]) circuit.append_gate(ZGate(), [1]) assert not circuit.is_cycle_unoccupied(0, [0]) assert circuit.is_cycle_unoccupied(1, [1])
def test_two_qubit_2(self) -> None: circuit = Circuit(4) assert len(circuit.get_coupling_graph()) == 0 circuit.append_gate(CNOTGate(), [0, 1]) circuit.append_gate(CNOTGate(), [1, 2]) circuit.append_gate(CNOTGate(), [2, 3]) cgraph = circuit.get_coupling_graph() assert len(cgraph) == 3 assert (0, 1) in cgraph assert (1, 2) in cgraph assert (2, 3) in cgraph circuit.append_gate(CNOTGate(), [2, 3]) circuit.append_gate(CNOTGate(), [1, 2]) circuit.append_gate(CNOTGate(), [0, 1]) cgraph = circuit.get_coupling_graph() assert len(cgraph) == 3 assert (0, 1) in cgraph assert (1, 2) in cgraph assert (2, 3) in cgraph circuit.append_gate(CNOTGate(), [0, 2]) circuit.append_gate(CNOTGate(), [3, 0]) cgraph = circuit.get_coupling_graph() assert len(cgraph) == 5 assert (0, 1) in cgraph assert (1, 2) in cgraph assert (2, 3) in cgraph assert (0, 2) in cgraph assert (0, 3) in cgraph
def gen_initial_layer( self, target: UnitaryMatrix | StateVector, data: dict[str, Any], ) -> Circuit: """ Generate the initial layer, see LayerGenerator for more. Raises: ValueError: If `target` has a radix mismatch with `self.initial_layer_gate`. """ if not isinstance(target, (UnitaryMatrix, StateVector)): raise TypeError( 'Expected unitary or state, got %s.' % type(target), ) for radix in target.get_radixes(): if radix != self.initial_layer_gate.get_radixes()[0]: raise ValueError( 'Radix mismatch between target and initial_layer_gate.', ) init_circuit = Circuit(target.get_size(), target.get_radixes()) for i in range(init_circuit.get_size()): init_circuit.append_gate(self.initial_layer_gate, [i]) return init_circuit
def test_type_valid_2(self) -> None: circuit = Circuit(4, [2, 2, 3, 3]) try: circuit.append_gate(HGate(), [2]) except TypeError: assert False, 'Unexpected TypeError.' except BaseException: return
def test_type_invalid_2(self, not_an_int: Any) -> None: circuit = Circuit(4, [2, 2, 3, 3]) try: circuit.append_gate(not_an_int, not_an_int) except TypeError: return except BaseException: assert False, 'Unexpected Exception.'
def test_value(self, gate: Gate) -> None: circuit = Circuit(gate.get_size(), gate.get_radixes()) assert circuit.is_differentiable() circuit.append_gate(gate, list(range(gate.get_size()))) if isinstance(gate, DifferentiableUnitary): assert circuit.is_differentiable() else: assert not circuit.is_differentiable()
def test_invalid_fold(self, points: Sequence[CircuitPointLike]) -> None: circuit = Circuit(4) wide_gate = IdentityGate(4) circuit.append_gate(wide_gate, [0, 1, 2, 3]) circuit.append_gate(wide_gate, [0, 1, 2, 3]) circuit.append_gate(wide_gate, [0, 1, 2, 3]) circuit.append_gate(wide_gate, [0, 1, 2, 3]) with pytest.raises(ValueError): circuit.fold(circuit.get_region(points))
def test_single_qubit_2(self) -> None: circuit = Circuit(4) assert len(circuit.get_coupling_graph()) == 0 for i in range(4): circuit.append_gate(U3Gate(), [i]) assert len(circuit.get_coupling_graph()) == 0 for j in range(4): for i in range(4): circuit.append_gate(U3Gate(), [i]) assert len(circuit.get_coupling_graph()) == 0
def test_type_valid_1(self) -> None: circuit = Circuit(1) circuit_to_add = Circuit(1) circuit_to_add.append_gate(HGate(), [0]) try: circuit.append_circuit(circuit_to_add, [0]) except TypeError: assert False, 'Unexpected TypeError.' except BaseException: return
def test_r1(self, r3_qubit_circuit: Circuit) -> None: start = r3_qubit_circuit.get_num_params() r3_qubit_circuit.append_gate(U3Gate(), [0]) assert r3_qubit_circuit.get_num_params() == start + 3 r3_qubit_circuit.insert_gate(0, U3Gate(), [1]) assert r3_qubit_circuit.get_num_params() == start + 6 r3_qubit_circuit.insert_gate(0, CNOTGate(), [0, 2]) assert r3_qubit_circuit.get_num_params() == start + 6 r3_qubit_circuit.remove(U3Gate()) assert r3_qubit_circuit.get_num_params() == start + 3
def test_index_invalid_2(self, cycle_index: int) -> None: circuit = Circuit(4, [2, 2, 3, 3]) circuit.append_gate(HGate(), [0]) circuit.append_gate(HGate(), [0]) circuit.append_gate(HGate(), [0]) try: circuit.pop_cycle(cycle_index) except IndexError: return except BaseException: assert False, 'Unexpected Exception.'
def test_invalid_value_2(self) -> None: circuit = Circuit(2) circuit.append_gate(HGate(), [0]) circuit.append_gate(CNOTGate(), [0, 1]) try: circuit.point(XGate()) except ValueError: return assert False, 'Should not have reached here.'
def test_removing_gate(self) -> None: circuit = Circuit(1) circuit.append_gate(U3Gate(), [0]) circuit.append_gate(U3Gate(), [0]) circuit.append_gate(U3Gate(), [0]) assert circuit.get_num_params() == 9 circuit.remove(U3Gate()) assert circuit.get_num_params() == 6 circuit.remove(U3Gate()) assert circuit.get_num_params() == 3 circuit.remove(U3Gate()) assert circuit.get_num_params() == 0
def test_removing_gate1(self) -> None: circuit = Circuit(1) circuit.append_gate(U3Gate(), [0]) circuit.append_gate(U3Gate(), [0]) circuit.append_gate(U3Gate(), [0]) assert circuit.get_depth() == 3 circuit.remove(U3Gate()) assert circuit.get_depth() == 2 circuit.remove(U3Gate()) assert circuit.get_depth() == 1 circuit.remove(U3Gate()) assert circuit.get_depth() == 0
def test_removing_gate(self) -> None: circuit = Circuit(1) circuit.append_gate(U3Gate(), [0]) circuit.append_gate(U3Gate(), [0]) circuit.append_gate(U3Gate(), [0]) assert circuit.get_num_operations() == 3 circuit.remove(U3Gate()) assert circuit.get_num_operations() == 2 circuit.remove(U3Gate()) assert circuit.get_num_operations() == 1 circuit.remove(U3Gate()) assert circuit.get_num_operations() == 0
def test_r1(self, r3_qubit_circuit: Circuit) -> None: assert r3_qubit_circuit.get_num_operations() == 10 r3_qubit_circuit.append_gate(U3Gate(), [0]) assert r3_qubit_circuit.get_num_operations() == 11 r3_qubit_circuit.insert_gate(0, U3Gate(), [1]) assert r3_qubit_circuit.get_num_operations() == 12 r3_qubit_circuit.insert_gate(0, CNOTGate(), [0, 2]) assert r3_qubit_circuit.get_num_operations() == 13 r3_qubit_circuit.remove(U3Gate()) assert r3_qubit_circuit.get_num_operations() == 12 r3_qubit_circuit.remove(CNOTGate()) assert r3_qubit_circuit.get_num_operations() == 11
def test_freezing_param(self) -> None: circuit = Circuit(1) circuit.append_gate(U3Gate(), [0]) circuit.append_gate(U3Gate(), [0]) circuit.append_gate(U3Gate(), [0]) assert circuit.get_num_params() == 9 circuit.freeze_param(0) assert circuit.get_num_params() == 8 circuit.freeze_param(0) assert circuit.get_num_params() == 7 circuit.freeze_param(0) assert circuit.get_num_params() == 6 circuit.freeze_param(0)
def test_no_change(self) -> None: u1 = unitary_group.rvs(8) g1 = VariableUnitaryGate(3) circuit = Circuit(3) circuit.append_gate(g1, [0, 1, 2]) utry_before = circuit.get_unitary() # The following call should not make any changes in circuit QFactor().instantiate(circuit, u1, circuit.get_params()) utry_after = circuit.get_unitary() assert np.allclose( utry_before.get_numpy(), utry_after.get_numpy(), )
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_correctness_2(self) -> None: circuit = Circuit(2) circuit.append_gate(HGate(), [0]) circuit.append_gate(CNOTGate(), [0, 1]) assert circuit.point(HGate()) == (0, 0) assert circuit.point(CNOTGate()) == (1, 0) assert circuit.point(Operation(HGate(), [0])) == (0, 0) assert circuit.point(Operation(CNOTGate(), [0, 1])) == (1, 0) try: circuit.point(Operation(CNOTGate(), [1, 0])) except ValueError: return assert False, 'Should not have reached here.'
def test_return_type_1( self, valid_int: int, location: Sequence[int], ) -> None: circuit = Circuit(4, [2, 2, 3, 3]) circuit.append_gate(CNOTGate(), [0, 1]) assert isinstance( circuit.is_cycle_unoccupied( valid_int, location, ), (bool, np.bool_), )
def test_1_gate(self) -> None: u1 = unitary_group.rvs(8) g1 = VariableUnitaryGate(3) circuit = Circuit(3) circuit.append_gate(g1, [0, 1, 2]) params = QFactor().instantiate(circuit, u1, circuit.get_params()) circuit.set_params(params) g1_params = list(np.reshape(u1, (64, ))) g1_params = list(np.real(g1_params)) + list(np.imag(g1_params)) assert np.allclose( circuit.get_unitary().get_numpy(), g1.get_unitary(g1_params).get_numpy(), )
def simple_circuit() -> Circuit: """Provides a simple circuit fixture.""" circuit = Circuit(2) circuit.append_gate(XGate(), [0]) circuit.append_gate(CNOTGate(), [0, 1]) circuit.append_gate(XGate(), [1]) circuit.append_gate(CNOTGate(), [1, 0]) return circuit