Propagazione
pauli_prop.propagation
Funzioni per eseguire la propagazione di Pauli.
RotationGates
class RotationGates(gates, qargs, thetas)
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)
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,
clifforddeve 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
thetas
circuit_to_rotation_gates
circuit_to_rotation_gates(circuit)
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)
Propagare un operatore di Pauli sparsa, , attraverso un circuito (rappresentato in rot_gates), .
Per la propagazione di Schrödinger: . Per la propagazione di Heisenberg: .
Se è rot_gates un’istanza NoisyRotationGates di, l’operatore verrà propagato attraverso ciascun generatore di rumore. Il coefficiente associato a ciascun termine in operator, , verrà smorzato in base alla frequenza di ciascun generatore di errore anticommutante, : .
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
atolvengono troncati (impostati a zero).
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) –
sper l'evoluzione di Schrödingerhper l'evoluzione di Heisenberg
Risultati
L'operatore evoluto e la norma uno di tutti i coefficienti troncati.
Aumenti
- ValueError – non è
framené néhs. - ValueError – è
atolnegativo. - ValueError – non
max_termsè positivo.
Tipo di restituzione
tupla [ SparsePauliOp, float ]
propagate_through_circuit
propagate_through_circuit(operator, circuit, max_terms, atol, frame)
Propagare un operatore di Pauli sparsa, , attraverso un circuito, .
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: . Per la propagazione di Heisenberg: .
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, , verrà smorzato in base alla frequenza di ciascun generatore di errore anticommutante, : .
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
atolvengono troncati (impostati a zero).
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) –
sper l'evoluzione di Schrödingerhper l'evoluzione di Heisenberg
Risultati
L'operatore evoluto
Aumenti
- ValueError – non è
framené néhs. - ValueError – è
atolnegativo. - ValueError – non
max_termsè positivo.
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)
Trasferire un operatore, op1 o , tramite un altro operatore, op2 o .
Per l'evoluzione di Schrödinger: .
Per l'evoluzione di Heisenberg: .
L'evoluzione viene eseguita nella base di Pauli sommando i termini della forma (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.
si suppone che sia ermitiana ( = )
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 maggioremax_termsordine nel prodotto diretto dei tre operatori nello spazio di Pauli.Quando
max_termsè eNoneil 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
op1da coniugare per ciascun termine inop2. L'insieme dei termini inclusi viene esteso per includere la sua unione con l'insieme dei termini , per . 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
atolverranno 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_termsricorrenti nel prodotto. Impostando questa dimensione del passo >1, la ricerca viene accelerata di un fattoresearch_step**3, con un potenziale calo di precisione. Si prevede che tale imprecisione sia minima persearch_step**3 << max_terms.
Risultati
L'operatore trasformato
Aumenti
- ValueError – non è
framené nésh. - ValueError – non
search_stepè positivo. - ValueError – contiene
max_termsun valore non valido.
Tipo di restituzione
evolve_through_cliffords
evolve_through_cliffords(circuit)
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 .
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 ]