Skip to main content
IBM Quantum Platform

Propagazione

pauli_prop.propagation

Funzioni per eseguire la propagazione di Pauli.

RotationGates

class RotationGates(gates, qargs, thetas)

GitHub

Basi: NamedTuple

Una rappresentazione minimale intermedia di un QuantumCircuit.

Rotazioni di Pauli supportate: rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate

Crea una nuova istanza di RotationGates(gates, qargs, thetas)

Parametri

append_circuit_instruction

append_circuit_instruction(inst, qargs, num_qubits, *, clifford=None)

GitHub

Analizza un'istruzione di circuito e aggiunge i relativi dati alle liste interne.

Parametri

  • inst (CircuitInstruction) – L'istruzione del circuito per analizzare e aggiungere
  • qargs (list[int]) – L'elenco degli indici dei qubit dell'istruzione nel contesto del relativo circuito
  • num_qubits (int) – Il numero di qubit del circuito che contiene questa istruzione
  • clifford (Clifford | None) – Un oggetto Clifford opzionale attraverso il quale dovrebbe essere spostata l'istruzione fornita. Il Clifford deve agire su tutti i qubit presenti nel circuito.

Aumenti

  • ValueError – Rilevato un gate non supportato nel circuito
  • ValueError – Se specificato, clifford deve agire su tutti i qubit presenti nel circuito

Tipo di restituzione

Nessuna

count

count(value, /)

Restituisce il numero di occorrenze del valore.

gates

Tipo: list[ndarray[tuple[int,...], dtype[bool]]]

Una rappresentazione delle porte logica simile al calcolo ZX.

index

index(value, start=0, stop=9223372036854775807, /)

Restituisce il primo indice del valore.

Genera un'eccezione di tipo ValueError se il valore non è presente.

qargs

Tipo: list[list[int]]

Gli indici dei qubit su cui agisce ciascun gate.

thetas

Tipo: list[float]

Gli angoli di rotazione di tutte le porte.

circuit_to_rotation_gates

circuit_to_rotation_gates(circuit)

GitHub

Converte il circuito fornito in una rappresentazione intermedia.

Supporta i gate di rotazione di Pauli (“rx/rxx”, “ry/ryy”, “rz/rzz”, “ ‘PauliEvolutionGate’ ”) e i canali di errore di Pauli-Lindblad, specificati come istruzioni “ PauliLindbladError ”.

Parametri

circuit (QuantumCircuit) –

Il circuito da convertire. Può contenere rotazioni di Pauli (rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate ) e, facoltativamente, istruzioni " PauliLindbladError ".

Risultati

Viene restituita un'istanza RotationGates se il circuito non contiene PauliLindbladError istruzioni; in caso contrario, viene restituita un'istanza NoisyRotationGates .

Aumenti

ValueError – quando si incontra un gate non supportato in circuit.

Tipo di restituzione

RotationGates | NoisyRotationGates

propagate_through_rotation_gates

propagate_through_rotation_gates(operator, rot_gates, max_terms, atol, frame)

GitHub

Propagare un operatore di Pauli sparsa, OO, attraverso un circuito (rappresentato in rot_gates), UU.

Per la propagazione di Schrödinger: UOUU O U^{\dagger}. Per la propagazione di Heisenberg: UOUU^{\dagger} O U.

Se è rot_gates un’istanza NoisyRotationGates di, l’operatore verrà propagato attraverso ciascun generatore di rumore. Il coefficiente associato a ciascun termine in operator, cic_i, verrà smorzato in base alla frequenza di ciascun generatore di errore anticommutante, rir_i : ci=exp(2.0ri)c_i *= exp(-2.0 * r_i).

In generale, la memoria e il tempo necessari per la propagazione attraverso un circuito crescono in modo esponenziale con il numero di operazioni presenti nel circuito, a causa della crescita esponenziale del numero di termini dell'operatore nella base di Pauli. Per compensare questa difficoltà esponenziale, è possibile troncare i termini di Pauli di piccola entità (ovvero impostarli a zero), ottenendo così una distorsione proporzionale alle grandezze dei termini troncati. Dopo aver applicato ogni operazione del circuito, i termini vengono troncati in base a due parametri:

  • Vengono mantenute solo le componenti di Pauli più grandi max_terms ; eventuali termini di ordine inferiore verranno troncati. Questa opzione consente di stimare in anticipo quanto tempo e quanta memoria saranno sufficienti per il calcolo.
  • I termini con grandezze inferiori a atol vengono troncati (impostati a zero).
Nota

Questa funzione prealloca spazio in memoria per l'operatore a dimensione intera e per il buffer dell'operatore. È responsabilità di chi effettua la chiamata assicurarsi di disporre di memoria sufficiente per contenere gli operatori che includono tali termini max_terms . Quando max_terms è None, i requisiti di memoria e di tempo crescono in genere in modo esponenziale con il numero di operazioni presenti nel circuito.

Parametri

  • operator (SparsePauliOp) – L'operatore da propagare
  • rot_gates (RotationGates | NoisyRotationGates) – Un circuito rappresentato sotto forma di RotationGates.
  • max_terms (int) – Il numero massimo di termini che l'operatore può contenere durante la sua propagazione
  • atol (float) – I termini con coefficienti di grandezza inferiori a questo valore non verranno aggiunti all'operatore durante la sua propagazione. Questo parametro non garantisce l'accuratezza dell'operatore restituito.
  • frame (str) –s per l'evoluzione di Schrödinger h per l'evoluzione di Heisenberg

Risultati

L'operatore evoluto e la norma uno di tutti i coefficienti troncati.

Aumenti

Tipo di restituzione

tupla [ SparsePauliOp, float ]

propagate_through_circuit

propagate_through_circuit(operator, circuit, max_terms, atol, frame)

GitHub

Propagare un operatore di Pauli sparsa, OO, attraverso un circuito, UU.

Supporta i gate di rotazione di Pauli (“rx/rxx”, “ry/ryy”, “rz/rzz”, “ ‘PauliEvolutionGate’ ”) e i canali di errore di Pauli-Lindblad, specificati come istruzioni “ PauliLindbladError ”.

Per la propagazione di Schrödinger: UOUU O U^{\dagger}. Per la propagazione di Heisenberg: UOUU^{\dagger} O U.

Se circuit sono presenti istruzioni relative al rumore di Pauli-Lindblad, l'operatore verrà propagato attraverso ciascun generatore di rumore. Il coefficiente associato a ciascun termine in operator, cic_i, verrà smorzato in base alla frequenza di ciascun generatore di errore anticommutante, rir_i : ci=exp(2.0ri)c_i *= exp(-2.0 * r_i).

In generale, la memoria e il tempo necessari per la propagazione attraverso un circuito crescono in modo esponenziale con il numero di operazioni presenti nel circuito, a causa della crescita esponenziale del numero di termini dell'operatore nella base di Pauli. Per compensare questa difficoltà esponenziale, è possibile troncare i termini di Pauli di piccola entità (ovvero impostarli a zero), ottenendo così una distorsione proporzionale alle grandezze dei termini troncati. Dopo aver applicato ogni operazione del circuito, i termini vengono troncati in base a due parametri:

  • Vengono mantenute solo le componenti di Pauli più grandi max_terms ; eventuali termini di ordine inferiore verranno troncati. Questa opzione consente di stimare in anticipo quanto tempo e quanta memoria saranno sufficienti per il calcolo.
  • I termini con grandezze inferiori a atol vengono troncati (impostati a zero).
Nota

Questa funzione prealloca spazio in memoria per l'operatore a dimensione intera e per il buffer dell'operatore. È responsabilità di chi effettua la chiamata assicurarsi di disporre di memoria sufficiente per contenere gli operatori che includono tali termini max_terms . Quando max_terms è None, i requisiti di memoria e di tempo crescono in genere in modo esponenziale con il numero di operazioni presenti nel circuito.

Parametri

  • operator (SparsePauliOp) – L'operatore da propagare
  • circuit (QuantumCircuit) – Il circuito attraverso il quale verrà trasmesso il segnale dell'operatore
  • max_terms (int) – Il numero massimo di termini che l'operatore può contenere durante la sua propagazione
  • atol (float) – I termini con coefficienti di grandezza inferiori a questo valore non verranno aggiunti all'operatore durante la sua propagazione. Questo parametro non garantisce l'accuratezza dell'operatore restituito.
  • frame (str) –s per l'evoluzione di Schrödinger h per l'evoluzione di Heisenberg

Risultati

L'operatore evoluto

Aumenti

Tipo di restituzione

tupla [ SparsePauliOp, float ]

propagate_through_operator

propagate_through_operator(op1, op2, max_terms=None, coerce_op1_traceless=False, num_leading_terms=0, frame='s', atol=0.0, search_step=4)

GitHub

Trasferire un operatore, op1 o OO, tramite un altro operatore, op2 o UU.

Per l'evoluzione di Schrödinger: UOUU O U^{\dagger}.

Per l'evoluzione di Heisenberg: UOUU^{\dagger} O U.

L'evoluzione viene eseguita nella base di Pauli sommando i termini della forma UiOjUkU_i O_j U_k (trascurando il simbolo "dagger", vedi nota sotto). Il numero di tali termini è di ordine cubico rispetto alla dimensione dell’operatore (len( op1 ) * len( op2 )**2) e, in genere, comprenderà molti Pauli duplicati.

L'impostazione di max_terms produce un risultato approssimativo, in cui vengono calcolati solo i max_terms termini più grandi (in termini di grandezza del coefficiente). Questo metodo può essere molto più veloce, ma comporta alcuni errori dovuti al troncamento dei termini più piccoli.

Il calcolo approssimativo si articola in due fasi: la ricerca dei termini da mantenere e il calcolo di tali termini. Aumentando notevolmente search_step (in modo cubico) si accelera la ricerca, con un costo in termini di precisione che spesso è minimo.

È possibile che alcuni termini "Pauli" presenti nei termini conservati sarebbero comparsi anche nei termini troncati. Poiché tali termini troncati non vengono mai calcolati, non possono in alcun modo essere uniti ai termini conservati che condividono lo stesso Pauli. Pertanto, la può n``th-largest term in the approximate result is not guaranteed to equal the nth-largest term in the exact result. Likewise, convergence to the exact result with increasing ``max_terms essere non monotona.

Nota

OO si suppone che sia ermitiana ( OjO_j = OjO_j^{\dagger} )

Parametri

  • op1 (SparsePauliOp) – L'operatore da propagare

  • op2 (SparsePauliOp) – L'operatore attraverso il quale propagare

  • max_terms (int | None) –

    Quando non None, si ottiene un risultato approssimativo che include solo i termini di maggiore max_terms ordine nel prodotto diretto dei tre operatori nello spazio di Pauli.

    Quando max_terms è e None il numero di qubit è < 12, the propagation will be performed in the computational basis using matrix multiplication. For systems > 12 qubit, tutti i termini di Pauli vengono calcolati e sommati; tuttavia, questo di solito non è un buon metodo per calcolare l'evoluzione esatta a causa dei numerosi termini duplicati presenti.

  • coerce_op1_traceless (bool) – Un flag che indica se rimuovere i termini identitari dall'operatore di output.

  • num_leading_terms (int) – Il numero di termini in op1 da coniugare per ciascun termine in op2. L'insieme dei termini inclusi viene esteso per includere la sua unione con l'insieme dei termini UiOjUiU_i O_j U_i^{\dagger}, per j<numleadingtermsj < num_leading_terms. Ciò può migliorare l'accuratezza per le componenti principali di O nell'output, a un certo costo in termini di tempo di esecuzione.

  • frame (str) – s per l'evoluzione di Schrödinger, h per l'evoluzione di Heisenberg

  • atol (float) – I termini dell'operatore evoluto con grandezze inferiori a atol verranno troncati

  • search_step (int) – Un parametro in grado di accelerare la ricerca nell'ampissimo spazio delle combinazioni di parole ( 3D ) per individuare i termini più max_terms ricorrenti nel prodotto. Impostando questa dimensione del passo >1, la ricerca viene accelerata di un fattore search_step**3, con un potenziale calo di precisione. Si prevede che tale imprecisione sia minima per search_step**3 << max_terms.

Risultati

L'operatore trasformato

Aumenti

Tipo di restituzione

SparsePauliOp

evolve_through_cliffords

evolve_through_cliffords(circuit)

GitHub

Evolvere (nel sistema di riferimento di Schrödinger) tutte le istruzioni non-Clifford attraverso tutte le porte Clifford presenti nel circuito.

Questa operazione sposta tutte le porte di Clifford riconosciute all'inizio del circuito e aggiorna le basi delle porte con rotazione di Pauli (ad es. RxGate, RzzGate, PauliEvolutionGate) e dei canali di tipo " PauliLindbladError ". Altre operazioni non sono supportate. Per ulteriori informazioni sull'evoluzione dei Pauli tramite i Clifford, consultare la documentazione su Pauli.evolve.

L'effetto è simile a quello che si ottiene passando al modello di interazione di Clifford descritto all'indirizzo arXiv:2306.04797, ma senza mappare tutti i valori degli angoli di rotazione in π/4\leq \pi/4.

La funzione restituisce due oggetti che rappresentano le parti Clifford e non Clifford del circuito.

Parametri

circuit (QuantumCircuit) – Il QuantumCircuit da trasformare. Può contenere solo porte di rotazione di Pauli PauliLindbladError (aggiunte al circuito come canali quantistici) e porte di Clifford riconosciute.

Risultati

  • Clifford - Un singolo Clifford a tutti i qubit che rappresenta la prima parte del circuito
  • QuantumCircuit - Un circuito contenente la parte restante e trasformata del circuito

Aumenti

ValueError – Il circuito di ingresso contiene un gate non supportato

Tipo di restituzione

tupla [ Clifford, QuantumCircuit ]

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