TwoLocal
class qiskit.circuit.library.TwoLocal(num_qubits=None, rotation_blocks=None, entanglement_blocks=None, entanglement='full', reps=3, skip_unentangled_qubits=False, skip_final_rotation_layer=False, parameter_prefix='θ', insert_barriers=False, initial_state=None, name='TwoLocal', flatten=None)
Basi: NLocal
Il circuito a due locali.
Il circuito bi-locale è un circuito parametrizzato costituito da strati di rotazione e strati di entanglement alternati. Gli strati di rotazione sono porte a qubit singolo applicate a tutti i qubit. Il livello di entanglement utilizza porte a due qubit per agganciare i qubit secondo una strategia stabilita da entanglement. Sia le porte di rotazione che quelle di entanglement possono essere specificate come stringhe (ad es. 'ry' o 'cx'), come tipo di porta (ad es. RYGate o CXGate) o come QuantumCircuit (ad esempio un circuito a 1 o 2 qubit).
Viene fornita una serie di strategie di entanglement predefinite:
'full'L'entanglement si verifica quando ogni qubit è intrecciato con tutti gli altri.'linear'entanglement è il qubit entangled con il qubit , per tutti i , dove è il numero totale di qubit.'reverse_linear'entanglement è il qubit entangled con il qubit , per tutti i , dove è il numero totale di qubit. Si noti che seentanglement_blocks = 'cx'fornisce lo stesso unitario di'full'con un minor numero di porte di entangling.'pairwise'entanglement è uno strato in cui il qubit è entangled con il qubit , per tutti i valori pari di , e poi un secondo strato in cui il qubit è entangled con il qubit , per tutti i valori dispari di .'circular'l'entanglement è un entanglement lineare, ma con un entanglement aggiuntivo del primo e dell'ultimo qubit prima della parte lineare.'sca'l'entanglement (shifted-circular-alternating) è una versione generalizzata e modificata del circuito proposto in Sim et al. Consiste in un entanglement circolare in cui l'entanglement "lungo" che collega il primo e l'ultimo qubit è spostato di uno ad ogni blocco. Inoltre, il ruolo dei qubit di controllo e di destinazione viene scambiato a ogni blocco (quindi alternato).
L'entanglement può essere ulteriormente specificato utilizzando una mappa di entangler, che è un elenco di coppie di indici, come ad esempio
>>> entangler_map = [(0, 1), (1, 2), (2, 0)]Se si devono usare diversi entanglement per blocco, fornire un elenco di mappe di entangler. Si vedano gli esempi di seguito per capire come si può utilizzare.
>>> entanglement = [entangler_map_layer_1, entangler_map_layer_2, ... ]Le barriere possono essere inserite tra i diversi strati per una migliore visualizzazione utilizzando l'attributo insert_barriers .
Per ogni porta parametrizzata viene generato un nuovo parametro utilizzando ParameterVector. Il nome di questi parametri può essere scelto tramite il sito parameter_prefix.
Esempi
>>> two = TwoLocal(3, 'ry', 'cx', 'linear', reps=2, insert_barriers=True)
>>> print(two.decompose()) # decompose the layers into standard gates
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
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]) ├
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘>>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True, flatten=True)
>>> qc = QuantumCircuit(3)
>>> qc &= two
>>> print(qc.draw())
┌──────────┐┌──────────┐ ░ ░ ┌──────────┐ ┌──────────┐
q_0: ┤ Ry(θ[0]) ├┤ Rz(θ[3]) ├─░──■──■─────░─┤ Ry(θ[6]) ├─┤ Rz(θ[9]) ├
├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤┌┴──────────┤
q_1: ┤ Ry(θ[1]) ├┤ Rz(θ[4]) ├─░──■──┼──■──░─┤ Ry(θ[7]) ├┤ Rz(θ[10]) ├
├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤├───────────┤
q_2: ┤ Ry(θ[2]) ├┤ Rz(θ[5]) ├─░─────■──■──░─┤ Ry(θ[8]) ├┤ Rz(θ[11]) ├
└──────────┘└──────────┘ ░ ░ └──────────┘└───────────┘>>> entangler_map = [[0, 1], [1, 2], [2, 0]] # circular entanglement for 3 qubits
>>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1, flatten=True)
>>> print(two) # note: no barriers inserted this time!
┌───┐ ┌──────────┐┌───┐
q_0: |0>┤ X ├─────■───────────────────────┤ Rx(θ[2]) ├┤ X ├
├───┤┌────┴─────┐ ┌───┐└─────┬────┘└───┘
q_1: |0>┤ X ├┤ Rx(θ[0]) ├─────■──────┤ X ├──────┼──────────
├───┤└──────────┘┌────┴─────┐└───┘ │ ┌───┐
q_2: |0>┤ X ├────────────┤ Rx(θ[1]) ├───────────■─────┤ X ├
└───┘ └──────────┘ └───┘>>> entangler_map = [[0, 3], [0, 2]] # entangle the first and last two-way
>>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1, flatten=True)
>>> circuit = two.compose(two)
>>> print(circuit.draw()) # note, that the parameters are the same!
q_0: ─────■───────────■───────────■───────────■──────
│ │ │ │
q_1: ─────┼───────────┼───────────┼───────────┼──────
│ ┌────┴─────┐ │ ┌────┴─────┐
q_2: ─────┼──────┤ Ry(θ[1]) ├─────┼──────┤ Ry(θ[1]) ├
┌────┴─────┐└──────────┘┌────┴─────┐└──────────┘
q_3: ┤ Ry(θ[0]) ├────────────┤ Ry(θ[0]) ├────────────
└──────────┘ └──────────┘>>> layer_1 = [(0, 1), (0, 2)]
>>> layer_2 = [(1, 2)]
>>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True,
... flatten=True)
>>> print(two)
┌───┐ ░ ░ ┌───┐ ░ ░ ┌───┐
q_0: ┤ X ├─░───■────■───░─┤ X ├─░───────░─┤ X ├
├───┤ ░ ┌─┴─┐ │ ░ ├───┤ ░ ░ ├───┤
q_1: ┤ X ├─░─┤ X ├──┼───░─┤ X ├─░───■───░─┤ X ├
├───┤ ░ └───┘┌─┴─┐ ░ ├───┤ ░ ┌─┴─┐ ░ ├───┤
q_2: ┤ X ├─░──────┤ X ├─░─┤ X ├─░─┤ X ├─░─┤ X ├
└───┘ ░ └───┘ ░ └───┘ ░ └───┘ ░ └───┘La classe qiskit.circuit.library.n_local.two_local.TwoLocal è deprecata a partire da Qiskit 2.1. Verrà rimosso in Qiskit 3.0. Utilizzare invece la funzione qiskit.circuit.library.n_local.
Parametri
- num_qubits (int | None) – Il numero di qubit del circuito bipolare.
- rotation_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – I cancelli utilizzati nello strato di rotazione. Può essere specificato tramite il nome di un gate (ad es.
'ry') oppure il tipo di porta stesso (ad es.RYGate). Se è presente un solo gate, lo stesso gate viene applicato a ciascun qubit. Se viene fornito un elenco di porte, tutte le porte vengono applicate a ciascun qubit nell'ordine indicato. Per ulteriori dettagli, consultare la sezione Esempi. - entanglement_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – I gate utilizzati nello strato di entanglement. Può essere specificato nello stesso formato di
rotation_blocks. - 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 interi che specificano gli indici dei qubit entangled tra loro, o un callable che restituisce tale elenco con l'indice del livello di entanglement. Predefinito a'full'entanglement. Si noti che seentanglement_blocks = 'cx', allora l'entanglement di'full'fornisce la stessa unità di'reverse_linear', ma quest'ultima opzione ha un numero inferiore di porte di entanglement. Per maggiori dettagli, consultare la sezione Esempi. - reps (int) – Specifica la frequenza con cui viene ripetuto un blocco composto da uno strato di rotazione e uno strato di entanglement.
- skip_unentangled_qubits (bool) – Se
True, le porte a qubit singolo si applicano solo ai qubit che sono entangled con un altro qubit. SeFalse, le porte a qubit singolo sono applicate a ciascun qubit nell'ansatz. L'impostazione predefinita èFalse. - skip_final_rotation_layer (bool) – Se
False, alla fine dell'ansatz viene aggiunto un livello di rotazione. SeTrue, non viene aggiunto alcun layer di rotazione. - parameter_prefix (str) – Le porte parametrizzate richiedono la definizione di un parametro, per il quale si utilizzano istanze di
Parameter. Il nome di ogni parametro sarà il prefisso specificato più il suo indice. - insert_barriers (bool) – Se
True, tra ogni strato vengono inserite delle barriere. SeFalse, non vengono inserite barriere. L'impostazione predefinita èFalse. - initial_state (QuantumCircuit | None) – Un
QuantumCircuitoggetto da inserire all'inizio del circuito. - name (str) – Il nome da utilizzare per il circuito generato.
- 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.
Attributi
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