qiskit.circuit.library.n_local
qiskit.circuit.library.n_local(num_qubits, rotation_blocks, entanglement_blocks, entanglement='full', reps=3, insert_barriers=False, parameter_prefix='θ', overwrite_block_parameters=True, skip_final_rotation_layer=False, skip_unentangled_qubits=False, name='nlocal')
Costruire un circuito variazionale n-locale.
La struttura del circuito n-locale è costituita da strati di rotazione e di entanglement alternati. In entrambi i livelli, i blocchi di circuito parametrizzati agiscono sul circuito in modo definito. Nel layer di rotazione, i blocchi vengono applicati impilati l'uno sull'altro, mentre nel layer di entanglement secondo la strategia entanglement . I blocchi del circuito possono avere dimensioni arbitrarie (più piccole del numero di qubit del circuito). Ogni livello viene ripetuto reps volte e, per impostazione predefinita, viene aggiunto un livello di rotazione finale.
Ad esempio, un blocco di rotazione su 2 qubit e un blocco di entanglement su 4 qubit utilizzando l'entanglement di "linear" produce il seguente circuito.
┌──────┐ ░ ┌──────┐ ░ ┌──────┐
┤0 ├─░─┤0 ├──────────────── ... ─░─┤0 ├
│ Rot │ ░ │ │┌──────┐ ░ │ Rot │
┤1 ├─░─┤1 ├┤0 ├──────── ... ─░─┤1 ├
├──────┤ ░ │ Ent ││ │┌──────┐ ░ ├──────┤
┤0 ├─░─┤2 ├┤1 ├┤0 ├ ... ─░─┤0 ├
│ Rot │ ░ │ ││ Ent ││ │ ░ │ Rot │
┤1 ├─░─┤3 ├┤2 ├┤1 ├ ... ─░─┤1 ├
├──────┤ ░ └──────┘│ ││ Ent │ ░ ├──────┤
┤0 ├─░─────────┤3 ├┤2 ├ ... ─░─┤0 ├
│ Rot │ ░ └──────┘│ │ ░ │ Rot │
┤1 ├─░─────────────────┤3 ├ ... ─░─┤1 ├
└──────┘ ░ └──────┘ ░ └──────┘
| |
+---------------------------------+
repeated reps timesEntanglement:
L'entanglement descrive le connessioni delle porte nello strato di entanglement. Per un gate a due qubit, ad esempio, l'entanglement contiene le coppie di qubit su cui il gate deve agire, ad esempio [[ctrl0, target0], [ctrl1, target1], ...]. Viene fornita una serie di strategie di entanglement predefinite che possono essere selezionate per nome:
-
"full"L'entanglement si verifica quando ogni qubit è intrecciato con tutti gli altri. -
"linear"l'entanglement è il qubit entangled con il qubit ,per tutti i , dove è il numero totale di qubit.
-
"reverse_linear"l'entanglement è il qubit entangled con il qubit ,per tutti i , dove è il numero totale di qubit. Si noti che se
entanglement_blocks=="cx"fornisce lo stesso unitario di"full"con un minor numero di porte di entangling. -
"pairwise"L'entanglement è uno strato in cui l' e del qubit è intrecciata 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 ulteriore entanglement delprimo e ultimo qubit prima della parte lineare.
-
"sca"L'entanglement (circolare-alternato-spostato) è una versione generalizzata e modificatadel circuito proposto 14 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).
Se un livello di entanglement contiene più blocchi, l'entanglement deve essere fornito come elenco di entanglement per ciascun blocco. Ad esempio:
entanglement_blocks = ["rxx", "ryy"]
entanglement = ["full", "linear"] # full for rxx and linear for ryyoppure:
structure_rxx = [[0, 1], [2, 3]]
structure_ryy = [[0, 2]]
entanglement = [structure_rxx, structure_ryy]Infine, l'entanglement può variare in ogni ripetizione del circuito. A tal fine, è possibile passare una callable che prende in input l'indice del livello e restituisce l'entanglement per il livello nel formato sopra indicato. Si vedano gli esempi seguenti per un esempio concreto.
Esempi:
Le porte di rotazione e di entanglement possono essere specificate tramite stringhe singole, se sono costituite da un singolo blocco per strato:
from qiskit.circuit.library import n_local
circuit = n_local(3, "ry", "cx", "linear", reps=2, insert_barriers=True)
circuit.draw("mpl")
È possibile impostare più porte per strato passando un elenco. Qui, ad esempio, utilizziamo le rotazioni Pauli-Y e Pauli-Z nel livello di rotazione:
circuit = n_local(3, ["ry", "rz"], "cz", "full", reps=1, insert_barriers=True)
circuit.draw("mpl")
Per omettere gli strati di rotazione o di entanglement, il blocco può essere impostato su un elenco vuoto:
circuit = n_local(4, [], "cry", reps=2)
circuit.draw("mpl")
L'entanglement può essere impostato esplicitamente tramite l'argomento entanglement :
entangler_map = [[0, 1], [2, 0]]
circuit = n_local(3, "x", "crx", entangler_map, reps=2)
circuit.draw("mpl")
È possibile impostare diversi entanglement per ogni livello, specificando una funzione che accetta come parametro l'indice del livello corrente e restituisce la struttura dell'entanglement. Ad esempio, il codice seguente utilizza intrecci diversi per gli strati dispari e quelli pari:
def entanglement(layer_index):
if layer_index % 2 == 0:
return [[0, 1], [0, 2]]
return [[1, 2]]
circuit = n_local(3, "x", "cx", entanglement, reps=3, insert_barriers=True)
circuit.draw("mpl")
Parametri
- num_qubits (int) – Il numero di qubit del circuito.
- rotation_blocks (str |Gate |Iterable[str |Gate]) – I blocchi utilizzati nei livelli di rotazione. Se ne vengono passati più di uno, questi verranno applicati uno dopo l'altro (come nuovi sottolivelli).
- entanglement_blocks (str |Gate |Iterable[str |Gate]) – I blocchi utilizzati negli strati di entanglement. Se ne vengono passati più di uno, questi verranno applicati uno dopo l'altro.
- entanglement (str |Iterable[Iterable[int]] | Iterable[str |Iterable[Iterable[int]]] | Callable[[int], str |Iterable[Iterable[int]] | Iterable[str |Iterable[Iterable[int]]]]) – Gli indici che specificano su quali qubit agiscono i blocchi di input. Questo è specificato da una stringa che descrive una strategia di entanglement (vedere le informazioni aggiuntive) o da un elenco di connessioni qubit. Se viene passato un elenco di blocchi di entanglement, è possibile specificare un entanglement diverso per ciascun blocco passando un elenco di entanglement. Per specificare un entanglement variabile per ogni ripetizione, passare una funzione callable che accetta come input il livello e restituisce l'entanglement per quel livello. Il valore predefinito è
"full", che indica una struttura di entanglement all-to-all. - reps (int) – Specifica la frequenza di ripetizione dei blocchi di rotazione e di entanglement.
- insert_barriers (bool) – Se
True, tra ogni strato vengono inserite delle barriere. SeFalse, non vengono inserite barriere. - parameter_prefix (str) – Il prefisso utilizzato se vengono generati parametri predefiniti.
- overwrite_block_parameters (bool) – Se i parametri dei blocchi aggiunti devono essere sovrascritti. Se
False, i parametri dei blocchi non vengono modificati. - skip_final_rotation_layer (bool) – Se viene aggiunto al circuito uno strato di rotazione finale.
- skip_unentangled_qubits (bool) – Se
True, le porte di rotazione agiscono solo sui qubit che sono entangled. SeFalse, le porte di rotazione agiscono su tutti i qubit. - name (str | None) – Il nome del circuito.
Risultati
Un circuito n-locale.
Tipo di restituzione