Skip to main content
IBM Quantum Platform

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')

GitHub

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 times

Entanglement:

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 ii entangled con il qubit i+1i + 1,

    per tutti i i{0,1,...,n2}i \in \{0, 1, ... , n - 2\}, dove nn è il numero totale di qubit.


  • "reverse_linear" l'entanglement è il qubit ii entangled con il qubit i+1i + 1,

    per tutti i i{n2,n3,...,1,0}i \in \{n-2, n-3, ... , 1, 0\}, dove nn è 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' ii e del qubit è intrecciata con il qubit

    i+1i + 1, per tutti i valori pari di ii, e poi un secondo strato in cui il qubit ii è entangled con il qubit i+1i + 1, per tutti i valori dispari di ii.


  • "circular" l'entanglement è un entanglement lineare ma con un ulteriore entanglement del

    primo e ultimo qubit prima della parte lineare.


  • "sca" L'entanglement (circolare-alternato-spostato) è una versione generalizzata e modificata

    del 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 ryy

oppure:

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")
Schema del circuito prodotto dal codice precedente.

È 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")
Schema del circuito prodotto dal codice precedente.

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")
Schema del circuito prodotto dal codice precedente.

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")
Schema del circuito prodotto dal codice precedente.

È 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")
Schema del circuito prodotto dal codice precedente.

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. Se False, 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. Se False, le porte di rotazione agiscono su tutti i qubit.
  • name (str | None) – Il nome del circuito.

Risultati

Un circuito n-locale.

Tipo di restituzione

QuantumCircuit

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.