PauliEvolutionGate
class qiskit.circuit.library.PauliEvolutionGate(operator, time=1.0, label=None, synthesis=None)
Basi: Gate
Evoluzione temporale di un operatore costituito da Paulis.
Per un operatore hermitiano costituito da termini di Pauli e da un tempo di evoluzione (reale) questo gate rappresenta l'operatore unitario
Le porte di evoluzione sono correlate alle porte di rotazione di Pauli con un fattore 2. Ad esempio, l'evoluzione temporale dell'operatore Pauli è collegata alla rotazione Pauli da
Compilazione:
Questo gate rappresenta l'evoluzione esatta dell' e. L'implementazione esatta di questa operazione, tuttavia, richiede in genere un numero esponenziale di gate. Il compilatore, quindi, implementa in genere un ’approssimazione dell’ e unitaria, ad esempio utilizzando una formula di prodotto come quella definita da LieTrotter. Passando l'argomento synthesis , è possibile specificare quale metodo il compilatore debba utilizzare; consultare qiskit.synthesis per le opzioni disponibili.
Si noti che l'ordine in cui l'approssimazione e i metodi come control() e power() sono chiamati in causa. Cambiando l'ordine si possono ottenere unitarietà diverse.
Controlli di commutazione:
Qiskit supporta controlli di commutazione efficienti delle PauliEvolutionGate istanze con altri gate basati su Pauli, come PauliGate o PauliProductMeasurement. Tuttavia, questi controlli richiedono la conversione dell'operatore nel SparseObservable formato, pertanto consigliamo vivamente di creare operatori utilizzando questa classe di operatori se si prevede un numero elevato di controlli di commutazione (ad esempio, se si dispone di un circuito con un numero PauliEvolutionGate elevato di sequenziali).
Esempi:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
X = SparsePauliOp("X")
Z = SparsePauliOp("Z")
I = SparsePauliOp("I")
# build the evolution gate
operator = (Z ^ Z) - 0.1 * (X ^ I)
evo = PauliEvolutionGate(operator, time=0.2)
# plug it into a circuit
circuit = QuantumCircuit(2)
circuit.append(evo, range(2))
print(circuit.draw())Il risultato verrà stampato (si noti che il coefficiente -0.1 non viene stampato!):
┌──────────────────────────┐
q_0: ┤0 ├
│ exp(-it (ZZ + XI))(0.2) │
q_1: ┤1 ├
└──────────────────────────┘Riferimenti:
[1] G. Li et al. Paulihedral: A Generalized Block-Wise Compiler Optimization Framework For Quantum Simulation Kernels (2021). arXiv:2109.03371
Parametri
- operator (qiskit.quantum_info.Pauli |SparsePauliOp |SparseObservable |list[qiskit.quantum_info.Pauli |SparsePauliOp |SparseObservable]) – L'operatore si evolve. Può anche essere fornito come elenco di operatori non commutativi in cui gli elementi sono somme di operatori commutativi. Ad esempio:
[XY + YX, ZZ + ZI + IZ, YY]. - time (ParameterValueType) – Il tempo di evoluzione.
- label (str | None) – Un'etichetta per il gate da visualizzare nelle visualizzazioni. Per impostazione predefinita, l'etichetta è impostata su
exp(-it <operators>), dove<operators>è la somma dei paoli. Si noti che l'etichetta non include alcun coefficiente di Paulis. Si veda il docstring della classe per un esempio. - synthesis (EvolutionSynthesis | None) – Una strategia di sintesi. Se Nessuno, la sintesi predefinita è la formula del prodotto di Lie-Trotter con una sola ripetizione.
Attributi
base_class
Ottiene la classe base di questa istruzione. È garantita la presenza nell'albero ereditario di self.
La "classe base" di un'istruzione è la classe più bassa dell'albero di ereditarietà con cui l'oggetto deve essere considerato completamente compatibile per le applicazioni dei circuiti. Questo in genere significa che la sottoclasse è definita solo per offrire una sorta di comodità al programmatore rispetto alla classe base, mentre la classe base è la "vera" classe dal punto di vista comportamentale. In particolare, non si dovrebbe sovrascrivere base_class se si sta definendo una versione personalizzata di un'istruzione che sarà implementata in modo diverso dall'hardware, come ad esempio una strategia di misura alternativa, o una versione di un gate parametrizzato con un particolare insieme di parametri per distinguerlo in un file Target dalla porta parametrizzata completa.
Spesso è esattamente equivalente a type(obj), tranne nel caso di istanze singleton di istruzioni della libreria standard. Queste istanze singleton sono sottoclassi speciali della loro classe base e questa proprietà restituirà la classe base. Ad esempio:
>>> isinstance(XGate(), XGate)
True
>>> type(XGate()) is XGate
False
>>> XGate().base_class is XGate
TrueIn generale, non si dovrebbe fare affidamento sulla classe precisa di un'istruzione; all'interno di un determinato circuito, si prevede che Instruction.name sia un discriminante più adatto nella maggior parte delle situazioni.
decompositions
Ottenere le scomposizioni dell'istruzione da SessionEquivalenceLibrary.
definition
Definizione di ritorno in termini di altri cancelli di base.
label
Etichetta di istruzioni per la restituzione
mutable
Questa istanza è un'istanza unica mutabile o meno.
Se questo attributo è False , l'istanza del gate è un singleton condiviso e non è mutabile.
name
Restituisce il nome.
num_clbits
Restituisce il numero di clbit.
num_qubits
Restituisce il numero di qubit.
params
I parametri di questo Instruction. Idealmente si tratta di angoli di passaggio.
time
Restituisce il tempo di evoluzione memorizzato nei parametri del gate.
Risultati
Il tempo di evoluzione.
Metodi
add_decomposition
add_decomposition(decomposition)
Aggiungere una decomposizione dell'istruzione a SessionEquivalenceLibrary.
broadcast_arguments
broadcast_arguments(qargs, cargs)
Convalida e gestione degli argomenti e delle loro relazioni.
Ad esempio, cx([q[0],q[1]], q[2]) significa cx(q[0], q[2]); cx(q[1], q[2]). Questo metodo produce gli argomenti nel giusto raggruppamento. Nell'esempio dato:
in: [[q[0],q[1]], q[2]],[]
outs: [q[0], q[2]], []
[q[1], q[2]], []Le regole generali di trasmissione sono:
Se len(qargs) == 1:
[q[0], q[1]] -> [q[0]],[q[1]]Se len(qargs) == 2:
[[q[0], q[1]], [r[0], r[1]]] -> [q[0], r[0]], [q[1], r[1]] [[q[0]], [r[0], r[1]]] -> [q[0], r[0]], [q[0], r[1]] [[q[0], q[1]], [r[0]]] -> [q[0], r[0]], [q[1], r[0]]Se len(qargs) >= 3:
[q[0], q[1]], [r[0], r[1]], ...] -> [q[0], r[0], ...], [q[1], r[1], ...]
Parametri
- qargs (list) – Elenco degli argomenti dei bit quantici.
- cargs (list) – Elenco degli argomenti classici dei bit.
Risultati
Una tupla con argomenti singoli.
Aumenti
CircuitError – Se l'input non è valido. Ad esempio, il numero di argomenti non corrisponde a quanto previsto dal gate.
Tipo di restituzione
control
control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)
Restituisce la versione controllata di se stesso.
Il risultato è la versione controllata specificata di . Il gate restituito rappresenta , dove è l'operatore originale , tensurato con i proiettori e (a seconda dello stato di controllo).
Il gate controllato è implementato come PauliEvolutionGate, indipendentemente dal valore di annotated.
Parametri
- num_ctrl_qubits (int) – Numero di controlli da aggiungere. Il valore predefinito è
1. - label (str | None) – Un'etichetta per il gate di evoluzione di Pauli risultante, da visualizzare nelle rappresentazioni grafiche. Per impostazione predefinita, l'etichetta è impostata su
exp(-it <operators>)dove<operators>è la somma dei Pauli. Si noti che l'etichetta non include alcun coefficiente di Pauli. Vedi la stringa docstring della classe per un esempio. - ctrl_state (int |str | None) – Lo stato di controllo della porta, specificato come numero intero o come stringa di bit (ad es.
"110"). SeNone, assume per impostazione predefinita lo stato in cui tutti i2**num_ctrl_qubits - 1bit sono a 1. - annotated (bool | None) – Ignorato.
Risultati
Una versione controllata di questo cancello.
Tipo di restituzione
copy
copy(name=None)
Copia dell'istruzione.
Parametri
name (str) – nome da assegnare al circuito copiato, se None il nome rimane invariato.
Risultati
una copia dell'istruzione corrente, con il nome aggiornato se è stato fornito
Tipo di restituzione
inverse
inverse(annotated=False)
Restituisce l'inverso, ottenuto invertendo il segno del tempo di evoluzione.
Parametri
annotated (bool)
is_parameterized
power
power(exponent, annotated=False)
Innalzate questo cancello al potere di exponent.
Il risultato rappresenta dove è uguale a exponent.
Parametri
- exponent (float) – Il potere di alzare il cancello a.
- annotated (bool) – Non applicabile a questa classe. Di solito, quando questo è
True, restituiamo un oggettoAnnotatedOperationcon un modificatore di potenza impostato, invece di un concretoGate. Tuttavia, possiamo rappresentare in modo efficiente le potenze delle evoluzioni di Pauli comePauliEvolutionGate, che viene utilizzata in questo caso.
Risultati
Un'operazione che implementa gate^exponent.
Tipo di restituzione
repeat
repeat(n)
Crea un'istruzione con self la ripetizione di « » volte.
Parametri
n (int) – Numero di volte in cui ripetere l'istruzione
Risultati
Contiene la definizione.
Tipo di restituzione
Aumenti
CircuitError – Se n < 1.
reverse_ops
reverse_ops()
Per un'istruzione composta, invertire l'ordine delle sottoistruzioni.
Ciò avviene invertendo ricorsivamente tutte le sottoistruzioni. Non inverte alcun cancello.
Risultati
una nuova istruzione con
le sottoistruzioni invertite.
Tipo di restituzione
soft_compare
soft_compare(other)
Confronto soft tra i gate. I loro nomi, il numero di qubit e i numeri di bit classici devono corrispondere. Il numero di parametri deve corrispondere. Ogni parametro viene confrontato. Se uno è un ParameterExpression non viene preso in considerazione.
Parametri
other (instruction) – altre istruzioni.
Risultati
sono auto e altri uguali fino a espressioni parametriche.
Tipo di restituzione
to_matrix
to_matrix()
Restituisce la matrice come numpy.ndarray.
Risultati
La matrice che questo gate rappresenta.
Aumenti
ValueError - Se i parametri di time non sono numerici.
Tipo di restituzione
to_mutable
to_mutable()
Restituisce una copia mutabile di questo gate.
Questo metodo restituisce una nuova copia mutabile di questa istanza di gate. Se si utilizza un'istanza singleton, questa sarà una nuova istanza unica che può essere mutata. Se l'istanza è già mutabile, sarà una copia profonda di quell'istanza.
validate_parameter
validate_parameter(parameter)
I parametri del gate devono essere int, float o ParameterExpression
Parametri
parameter (ParameterExpression |float)
Tipo di restituzione