RealAmplitudes
class qiskit.circuit.library.RealAmplitudes(num_qubits=None, entanglement='reverse_linear', reps=3, skip_unentangled_qubits=False, skip_final_rotation_layer=False, parameter_prefix='θ', insert_barriers=False, initial_state=None, name='RealAmplitudes', flatten=None)
Basi: TwoLocal
Il circuito 2-locale ad ampiezza reale.
Il circuito RealAmplitudes è una funzione d'onda di prova euristica utilizzata come Ansatz nelle applicazioni chimiche o come circuito di classificazione nell'apprendimento automatico. Il circuito è costituito da strati alternati di rotazioni e intrecci. Il modello di entanglement può essere definito dall'utente o selezionato da un insieme predefinito. Si chiama RealAmplitudes poiché gli stati quantici preparati avranno solo ampiezze reali, la parte complessa è sempre 0.
Ad esempio un circuito RealAmplitudes con 2 ripetizioni su 3 qubit con 'reverse_linear' entanglement è
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
┤ Ry(θ[0]) ├─░────────■───░─┤ Ry(θ[3]) ├─░────────■───░─┤ Ry(θ[6]) ├
├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
┤ Ry(θ[1]) ├─░───■──┤ X ├─░─┤ Ry(θ[4]) ├─░───■──┤ X ├─░─┤ Ry(θ[7]) ├
├──────────┤ ░ ┌─┴─┐└───┘ ░ ├──────────┤ ░ ┌─┴─┐└───┘ ░ ├──────────┤
┤ Ry(θ[2]) ├─░─┤ X ├──────░─┤ Ry(θ[5]) ├─░─┤ X ├──────░─┤ Ry(θ[8]) ├
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘L'entanglement può essere impostato usando la parola chiave entanglement come stringa o come elenco di coppie di indici. Si veda la documentazione di TwoLocal e NLocal per maggiori dettagli. Le opzioni aggiuntive che possono essere impostate includono il numero di ripetizioni, il salto delle porte di rotazione sui qubit che non sono entanglement, l'esclusione dello strato finale di rotazione e l'inserimento di barriere tra gli strati di rotazione e di entanglement.
Se alcuni qubit non sono entangled con altri qubit, ha senso non applicare porte di rotazione su questi qubit, poiché una sequenza di rotazioni può essere ridotta a una singola rotazione con angoli di rotazione sommati.
Esempi
>>> ansatz = RealAmplitudes(3, reps=2) # create the circuit on 3 qubits
>>> print(ansatz.decompose())
┌──────────┐ ┌──────────┐ ┌──────────┐
q_0: ┤ Ry(θ[0]) ├──────────■──────┤ Ry(θ[3]) ├──────────■──────┤ Ry(θ[6]) ├
├──────────┤ ┌─┴─┐ ├──────────┤ ┌─┴─┐ ├──────────┤
q_1: ┤ Ry(θ[1]) ├──■─────┤ X ├────┤ Ry(θ[4]) ├──■─────┤ X ├────┤ Ry(θ[7]) ├
├──────────┤┌─┴─┐┌──┴───┴───┐└──────────┘┌─┴─┐┌──┴───┴───┐└──────────┘
q_2: ┤ Ry(θ[2]) ├┤ X ├┤ Ry(θ[5]) ├────────────┤ X ├┤ Ry(θ[8]) ├────────────
└──────────┘└───┘└──────────┘ └───┘└──────────┘>>> ansatz = RealAmplitudes(3, entanglement='full', reps=2, flatten=True)
>>> print(ansatz)
┌──────────┐ ┌──────────┐ ┌──────────┐
q_0: ┤ RY(θ[0]) ├──■────■──┤ RY(θ[3]) ├──────────────■────■──┤ RY(θ[6]) ├────────────
├──────────┤┌─┴─┐ │ └──────────┘┌──────────┐┌─┴─┐ │ └──────────┘┌──────────┐
q_1: ┤ RY(θ[1]) ├┤ X ├──┼───────■──────┤ RY(θ[4]) ├┤ X ├──┼───────■──────┤ RY(θ[7]) ├
├──────────┤└───┘┌─┴─┐ ┌─┴─┐ ├──────────┤└───┘┌─┴─┐ ┌─┴─┐ ├──────────┤
q_2: ┤ RY(θ[2]) ├─────┤ X ├───┤ X ├────┤ RY(θ[5]) ├─────┤ X ├───┤ X ├────┤ RY(θ[8]) ├
└──────────┘ └───┘ └───┘ └──────────┘ └───┘ └───┘ └──────────┘>>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True,
... flatten=True)
>>> qc = QuantumCircuit(3) # create a circuit and append the RY variational form
>>> qc.compose(ansatz, inplace=True)
>>> qc.draw()
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
q_0: ┤ RY(θ[0]) ├─░───■────────░─┤ RY(θ[3]) ├─░───■────────░─┤ RY(θ[6]) ├
├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
q_1: ┤ RY(θ[1]) ├─░─┤ X ├──■───░─┤ RY(θ[4]) ├─░─┤ X ├──■───░─┤ RY(θ[7]) ├
├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤
q_2: ┤ RY(θ[2]) ├─░──────┤ X ├─░─┤ RY(θ[5]) ├─░──────┤ X ├─░─┤ RY(θ[8]) ├
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘>>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True,
... flatten=True)
>>> print(ansatz)
┌──────────┐ ░ ┌───┐ ░ ┌──────────┐
q_0: ┤ RY(θ[0]) ├─░─┤ X ├──■─────────────░─┤ RY(θ[4]) ├
├──────────┤ ░ └─┬─┘┌─┴─┐ ░ ├──────────┤
q_1: ┤ RY(θ[1]) ├─░───┼──┤ X ├──■────────░─┤ RY(θ[5]) ├
├──────────┤ ░ │ └───┘┌─┴─┐ ░ ├──────────┤
q_2: ┤ RY(θ[2]) ├─░───┼───────┤ X ├──■───░─┤ RY(θ[6]) ├
├──────────┤ ░ │ └───┘┌─┴─┐ ░ ├──────────┤
q_3: ┤ RY(θ[3]) ├─░───■────────────┤ X ├─░─┤ RY(θ[7]) ├
└──────────┘ ░ └───┘ ░ └──────────┘>>> ansatz = RealAmplitudes(4, reps=2, entanglement=[[0,3], [0,2]],
... skip_unentangled_qubits=True, flatten=True)
>>> print(ansatz)
┌──────────┐ ┌──────────┐ ┌──────────┐
q_0: ┤ RY(θ[0]) ├──■───────■──────┤ RY(θ[3]) ├──■───────■──────┤ RY(θ[6]) ├
└──────────┘ │ │ └──────────┘ │ │ └──────────┘
q_1: ──────────────┼───────┼────────────────────┼───────┼──────────────────
┌──────────┐ │ ┌─┴─┐ ┌──────────┐ │ ┌─┴─┐ ┌──────────┐
q_2: ┤ RY(θ[1]) ├──┼─────┤ X ├────┤ RY(θ[4]) ├──┼─────┤ X ├────┤ RY(θ[7]) ├
├──────────┤┌─┴─┐┌──┴───┴───┐└──────────┘┌─┴─┐┌──┴───┴───┐└──────────┘
q_3: ┤ RY(θ[2]) ├┤ X ├┤ RY(θ[5]) ├────────────┤ X ├┤ RY(θ[8]) ├────────────
└──────────┘└───┘└──────────┘ └───┘└──────────┘La funzione real_amplitudes() costruisce un circuito funzionalmente equivalente, ma più velocemente.
La classe qiskit.circuit.library.n_local.real_amplitudes.RealAmplitudes è deprecata a partire da Qiskit 2.1. Verrà rimosso in Qiskit 3.0. Utilizzare invece la funzione qiskit.circuit.library.real_amplitudes.
Parametri
- num_qubits (int | None) – Il numero di qubit del circuito RealAmplitudes.
- reps (int) – Specifica la frequenza con cui viene ripetuta la struttura di uno strato di rotazione seguito da uno strato di entanglement.
- entanglement (str |list[list[int]] | Callable[[int], list[int]]) – Specifica la struttura di entanglement. Può essere una stringa («full», «linear», «reverse_linear», «circular» o «sca»), un elenco di coppie di numeri interi che specificano gli indici dei qubit intrecciati tra loro, oppure una funzione che restituisce tale elenco se le viene fornito l'indice del livello di intrecciamento. Impostare come predefinito l'entanglement "reverse_linear". Si noti che l'entanglement «reverse_linear» fornisce lo stesso operatore unitario dell'entanglement «full», ma con un numero inferiore di porte di entanglement. Per ulteriori dettagli, consultare
TwoLocalla sezione Esempi di. - initial_state (QuantumCircuit | None) – Un oggetto
QuantumCircuitda anteporre al circuito. - skip_unentangled_qubits (bool) – Se True, le porte a qubit singolo vengono applicate solo ai qubit che sono entangled con un altro qubit. Se Falso, le porte a qubit singolo vengono applicate a ciascun qubit nell'Ansatz. Il valore predefinito è false.
- skip_final_rotation_layer (bool) – Se False, viene aggiunto un livello di rotazione alla fine dell'ansatz. Se Vero, non viene aggiunto alcun layer di rotazione.
- parameter_prefix (str) – Le porte parametrizzate richiedono la definizione di un parametro, per il quale utilizziamo
ParameterVector. - insert_barriers (bool) – Se Vero, le barriere vengono inserite tra ogni strato. Se Falso, non vengono inserite barriere.
- flatten (bool | None) – Impostare questo valore su
Trueper produrre un circuito piatto invece di annidarlo all'interno di più strati di oggetti gate. Per impostazione predefinita, il contenuto del circuito di uscita viene avvolto in oggetti annidati per una visualizzazione più pulita. Tuttavia, se si usa questo circuito per qualcosa di diverso dalla visualizzazione, si raccomanda vivamente di impostare questo flag aTrueper evitare un grande sovraccarico di prestazioni per il binding dei parametri. - name (str) – Nome del circuito.
Attributi
parameter_bounds
Restituisce i limiti dei parametri.
Risultati
I limiti del parametro.
name
Tipo: str
Un nome leggibile per il circuito.
Esempio
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuit