QuantumCircuit classe
class qiskit.circuit.QuantumCircuit(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())
Basi: object
Rappresentazione del nucleo Qiskit di un circuito quantistico.
Per maggiori dettagli sull'impostazione di QuantumCircuit nel contesto di tutte le strutture dati che lo accompagnano, di come si inserisce nel resto del pacchetto qiskit e i diversi regimi di descrizione dei circuiti quantistici in Qiskit, si veda la documentazione a livello di modulo di qiskit.circuit.
Esempio:
from qiskit import QuantumCircuit
# Create a new circuit with two qubits
qc = QuantumCircuit(2)
# Add a Hadamard gate to qubit 0
qc.h(0)
# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0, 1)
# Return a text drawing of the circuit.
qc.draw() ┌───┐
q_0: ┤ H ├──■──
└───┘┌─┴─┐
q_1: ─────┤ X ├
└───┘Attributi del circuito
QuantumCircuit ha un piccolo numero di attributi pubblici, che sono per lo più vecchie funzionalità. La maggior parte delle sue funzionalità è accessibile attraverso i metodi.
Una piccola parte degli attributi è intenzionalmente mutabile, il resto sono attributi di dati che dovrebbero essere considerati immutabili.
Attributo mutabile | Riepilogo |
|---|---|
global_phase | La fase globale del circuito, misurata in radianti. |
metadata | Mappatura arbitraria dell'utente, che Qiskit conserva attraverso il transpiler, ma che altrimenti ignora completamente. |
name | Un nome stringa opzionale per il circuito. |
Attributo immutabile dei dati | Riepilogo |
|---|---|
ancillas | Elenco di AncillaQubittracciati dal circuito. |
cregs | Elenco di ClassicalRegistertracciati dal circuito. |
clbits | Elenco di Clbittracciati dal circuito. |
data | CircuitInstructionElenco delle persone che compongono il circuito. |
_data | Python - handle di spazio all'oggetto QkCircuit dell'API C. |
duration | Durata totale del circuito, sommata alla programmazione dei passaggi del transpiler. Questo attributo è deprecato e estimate_duration() dovrebbe essere utilizzato al suo posto. |
layout | Informazioni sul layout dell'hardware e sul routing aggiunte dal transpiler. |
num_ancillas | Il numero di qubit ancilla nel circuito. |
num_clbits | Il numero di clbit nel circuito. |
num_captured_vars | Numero di variabili classiche in tempo reale acquisite. |
num_captured_stretches | Numero di tratti catturati. |
num_declared_vars | Numero di variabili classiche in tempo reale dichiarate localmente nell'ambito del circuito esterno. |
num_declared_stretches | Numero di tratti dichiarati localmente nell'ambito del circuito esterno. |
num_input_vars | Numero di variabili classiche in tempo reale in ingresso. |
num_parameters | ParameterNumero di "s" presenti nel circuito in fase di compilazione. |
num_qubits | Numero di qubit nel circuito. |
num_vars | Numero totale di variabili classiche in tempo reale nell'ambito del circuito esterno. |
num_stretches | Numero totale di tratti nell'ambito del circuito esterno. |
num_identifiers | Numero totale di variabili e tratti nel circuito esterno. |
op_start_times | Orari di inizio delle operazioni programmate, aggiunti dalla programmazione dei passaggi del transpiler. |
parameters | ParameterVisualizzazione ordinata, simile a un insieme, dei valori tracciati in fase di compilazione dal circuito. |
qregs | Elenco di QuantumRegistertracciati dal circuito. |
qubits | Elenco di Qubittracciati dal circuito. |
unit | L'unità del duration campo. |
L'attributo principale è data. Si tratta di un oggetto simile a una sequenza che espone gli elementi CircuitInstructions contenuti in forma ordinata. In genere non si dovrebbe modificare direttamente questo oggetto; QuantumCircuit è progettato esclusivamente per operazioni di aggiunta (per le quali si dovrebbe utilizzare append()). La maggior parte delle operazioni che modificano i circuiti in loco dovrebbero essere implementate come passaggi del transpiler (qiskit.transpiler). L'API C interagisce con un oggetto interno, denominato _data, che non fa parte dell'API pubblica Python, se non come handle da passare alle chiamate all'API C.
data
I dati del circuito (istruzioni e contesto).
Esempio
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2)
qc.measure([0], [1])
print(qc.data)[CircuitInstruction(operation=Instruction(name='measure', num_qubits=1,
num_clbits=1, params=[]), qubits=(Qubit(QuantumRegister(2, 'q'), 0),),
clbits=(Clbit(ClassicalRegister(2, 'c'), 1),))]Risultati
Un oggetto simile a una lista contenente le CircuitInstruction istanze presenti nel circuito.
Oltre al data, il global_phase di un circuito può influire in qualche misura sulla sua uscita, se il circuito viene utilizzato per descrivere un Gate che può essere controllato. Questo valore è espresso in radianti ed è impostabile direttamente.
global_phase
La fase globale dell'ambito del circuito corrente in radianti.
Esempio
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
print(circuit.global_phase)0.0from numpy import pi
circuit.global_phase = pi/4
print(circuit.global_phase)0.7853981633974483Il nome name di un circuito diventa il nome della funzione Instruction o Gate dell'espressione risultante dalle to_instruction() chiamate a e to_gate() , il che può rivelarsi utile per le visualizzazioni.
name
Tipo: str
Un nome leggibile per il circuito.
Esempio
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuitÈ possibile collegare a un circuito metadata a un circuito. Nessuna parte del nucleo di Qiskit ispezionerà questo dato o modificherà il suo comportamento in base ai metadati, ma verrà passato fedelmente attraverso il transpiler, in modo che possiate etichettare i vostri circuiti da soli. Quando si serializza un circuito con QPY (vedi qiskit.qpy), i metadati saranno serializzati in JSON e potrebbe essere necessario passare un serializzatore personalizzato per gestire oggetti non compatibili con JSON (vedere qpy.dump() per maggiori dettagli). Questo campo viene ignorato durante l'esportazione in OpenQASM 2 o 3.
metadata
Dizionario arbitrario di metadati definiti dall'utente per il circuito.
Qiskit non esaminerà il contenuto di questa mappatura, ma la passerà attraverso il transpiler e la riattaccherà all'output, in modo da poter tenere traccia dei propri metadati.
Esempio
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, metadata={'experiment_type': 'Bell state experiment'})
print(qc.metadata){'experiment_type': 'Bell state experiment'}QuantumCircuit espone gli attributi dei dati tracciando i suoi bit e registri interni quantistici e classici. Questi appaiono come Python listma bisogna considerarli come immutabili; cambiarli non avrà alcun effetto e più probabilmente corromperà semplicemente i dati interni del file QuantumCircuit.
qregs
Un elenco di Qubitnell'ordine in cui sono stati aggiunti. Non si deve mutare questo aspetto.
cregs
Un elenco di Clbitnell'ordine in cui sono stati aggiunti. Non si deve mutare questo aspetto.
qubits
Un elenco di Qubitnell'ordine in cui sono stati aggiunti. Non si deve mutare questo aspetto.
ancillas
Un elenco di AncillaQubitnell'ordine in cui sono stati aggiunti. Non si deve mutare questo aspetto.
clbits
Un elenco di Clbitnell'ordine in cui sono stati aggiunti. Non si deve mutare questo aspetto.
Esempio
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qr1 = QuantumRegister(2)
qr2 = QuantumRegister(1)
cr1 = ClassicalRegister(2)
cr2 = ClassicalRegister(1)
qc = QuantumCircuit(qr1, qr2, cr1, cr2)
print("List the qubits in this circuit:", qc.qubits)
print("List the classical bits in this circuit:", qc.clbits)List the qubits in this circuit: [Qubit(QuantumRegister(2, 'q0'), 0),
Qubit(QuantumRegister(2, 'q0'), 1), Qubit(QuantumRegister(1, 'q1'), 0)]
List the classical bits in this circuit: [Clbit(ClassicalRegister(2, 'c0'), 0),
Clbit(ClassicalRegister(2, 'c0'), 1), Clbit(ClassicalRegister(1, 'c1'), 0)]I parametri di compilazione presenti nelle istruzioni del circuito sono disponibili in parameters. setQuesto presenta un ordine canonico (prevalentemente lessicale, tranne nel caso di ParameterVector), che corrisponde all'ordine in cui i parametri verranno assegnati quando si utilizzano le forme a lista di assign_parameters(), ma supporta anche il test di appartenenza in tempo costante, simile a.
parameters
I parametri definiti nel circuito.
Questo attributo restituisce gli Parameter oggetti presenti nel circuito ordinati in ordine alfabetico. Si noti che i parametri istanziati con un ParameterVector vengono comunque ordinati numericamente.
Esempi
Lo snippet seguente mostra che l'ordine di inserimento dei parametri non ha importanza.
>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
>>> circuit = QuantumCircuit(1)
>>> circuit.rx(b, 0)
>>> circuit.rz(elephant, 0)
>>> circuit.ry(a, 0)
>>> circuit.parameters # sorted alphabetically!
ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])Tenete presente che l'ordinamento alfabetico potrebbe essere poco intuitivo quando si tratta di numeri. Il letterale "10" viene prima del "2" in un rigoroso ordinamento alfabetico.
>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
>>> circuit = QuantumCircuit(1)
>>> circuit.u(*angles, 0)
>>> circuit.draw()
┌─────────────────────────────┐
q: ┤ U(angle_1,angle_2,angle_10) ├
└─────────────────────────────┘
>>> circuit.parameters
ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])Per rispettare l'ordinamento numerico, è possibile utilizzare un ParameterVector .
>>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
>>> x = ParameterVector("x", 12)
>>> circuit = QuantumCircuit(1)
>>> for x_i in x:
... circuit.rx(x_i, 0)
>>> circuit.parameters
ParameterView([
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
..., ParameterVectorElement(x[11])
])Risultati
Gli oggetti ordinati Parameter nel circuito.
Se il circuito è stato trapiantato, in modo da avere un circuito fisico, si può ispezionare l'attributo layout per trovare le informazioni memorizzate dal transpiler sulla corrispondenza tra i qubit virtuali del circuito sorgente e i qubit hardware del circuito fisico, sia all'inizio che alla fine del circuito.
layout
Restituisce tutte le informazioni di layout associate al circuito.
Questo attributo contiene un oggetto facoltativo TranspileLayout . Di norma, questa opzione viene impostata sull'uscita di transpile() o PassManager.run() per conservare le informazioni relative alle permutazioni causate dal circuito di ingresso dalla transpilazione.
Esistono due tipi di permutazioni causate dalla transpile() funzione: una configurazione iniziale che permuta i qubit in base ai qubit fisici selezionati sulla Target, e una configurazione finale, che è una permutazione in uscita causata dagli SwapGates inseriti durante l'instradamento.
Esempio
from qiskit import QuantumCircuit
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.transpiler import generate_preset_pass_manager
# Create circuit to test transpiler on
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.swap(1, 2)
qc.cx(0, 1)
# Add measurements to the circuit
qc.measure([0, 1, 2], [0, 1, 2])
# Specify the QPU to target
backend = GenericBackendV2(3)
# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled = pass_manager.run(qc)
# Print the layout after transpilation
print(transpiled.layout.routing_permutation())[0, 1, 2]Se il circuito è stato programmato anche come parte di una transpilation, verranno mostrate le tempistiche individuali di ogni istruzione, insieme al totale del circuito duration del circuito.
duration
La durata totale del circuito, impostata da un passaggio del transpiler di schedulazione. La sua unità è specificata da unit.
La proprietà qiskit.circuit.quantumcircuit.QuantumCircuit.duration è deprecata a partire da Qiskit 1.3.0. Verrà rimosso in Qiskit 3.0.0.
unit
L'unità che duration è specificata in.
La proprietà qiskit.circuit.quantumcircuit.QuantumCircuit.unit è deprecata a partire da Qiskit 1.3.0. Verrà rimosso in Qiskit 3.0.0.
op_start_times
Restituisce un elenco di orari di inizio delle operazioni.
Questo attributo calcola la stima del tempo di inizio delle operazioni nel circuito programmato e funziona solo per circuiti semplici che non hanno un flusso di controllo o altre operazioni classiche di feed-forward.
Questo attributo è abilitato quando uno dei passaggi di analisi di schedulazione viene eseguito sul circuito quantistico.
Esempio
from qiskit import QuantumCircuit
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.transpiler import generate_preset_pass_manager
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
# Print the original circuit
print("Original circuit:")
print(qc)
# Transpile the circuit with a specific basis gates list and print the resulting circuit
backend = GenericBackendV2(2, basis_gates=['u1', 'u2', 'u3', 'cx'])
pm = generate_preset_pass_manager(
optimization_level=1, backend=backend, scheduling_method="alap"
)
transpiled_qc = pm.run(qc)
print("Transpiled circuit with basis gates ['u1', 'u2', 'u3', 'cx']:")
print(transpiled_qc)
# Print the start times of each instruction in the transpiled circuit
print("Start times of instructions in the transpiled circuit:")
for instruction, start_time in zip(transpiled_qc.data, transpiled_qc.op_start_times):
print(f"{instruction.operation.name}: {start_time}")Original circuit:
┌───┐ ░ ┌─┐
q_0: ┤ H ├──■───░─┤M├───
└───┘┌─┴─┐ ░ └╥┘┌─┐
q_1: ─────┤ X ├─░──╫─┤M├
└───┘ ░ ║ └╥┘
meas: 2/══════════════╩══╩═
0 1
Transpiled circuit with basis gates ['u1', 'u2', 'u3', 'cx']:
┌─────────┐ ░ ┌─────────────────┐┌─┐
q_0 -> 0 ───┤ U2(0,π) ├──────■───░─┤ Delay(1255[dt]) ├┤M├
┌──┴─────────┴───┐┌─┴─┐ ░ └───────┬─┬───────┘└╥┘
q_1 -> 1 ┤ Delay(196[dt]) ├┤ X ├─░─────────┤M├─────────╫─
└────────────────┘└───┘ ░ └╥┘ ║
meas: 2/═══════════════════════════════════╩══════════╩═
1 0
Start times of instructions in the transpiled circuit:
u2: 0
delay: 0
cx: 196
barrier: 2098
delay: 2098
measure: 3353
measure: 2098Risultati
Elenco di numeri interi che rappresentano gli orari di inizio stimati delle istruzioni. L'indice corrisponde all'indice dell'istruzione in QuantumCircuit.data.
Aumenti
AttributeError - Quando il circuito non è programmato.
Infine, QuantumCircuit espone alcune semplici proprietà come attributi numerici dinamici di sola lettura.
num_ancillas
Restituisce il numero di qubit ancilla.
Esempio
from qiskit import QuantumCircuit, QuantumRegister, AncillaRegister
# Create a 2-qubit quantum circuit
reg = QuantumRegister(2)
qc = QuantumCircuit(reg)
# Create an ancilla register with 1 qubit
anc = AncillaRegister(1)
qc.add_register(anc) # Add the ancilla register to the circuit
print("Number of ancilla qubits:", qc.num_ancillas)Number of ancilla qubits: 1num_clbits
Restituisce il numero di bit classici.
Esempio
from qiskit import QuantumCircuit
# Create a new circuit with two qubits and one classical bit
qc = QuantumCircuit(2, 1)
print("Number of classical bits:", qc.num_clbits)Number of classical bits: 1num_captured_vars
Il numero di variabili classiche in tempo reale del circuito contrassegnate come catturate da un ambito di riferimento.
Questa è la lunghezza dell'elemento iter_captured_vars() iterabile. Se questo valore è diverso da zero, num_input_vars deve essere zero.
num_captured_stretches
Il numero di tratti del circuito contrassegnati come acquisiti da un campo d'applicazione.
Questa è la lunghezza dell'elemento iter_captured_stretches() iterabile. Se questo valore è diverso da zero, num_input_vars deve essere zero.
num_declared_vars
Il numero di variabili classiche in tempo reale del circuito che sono dichiarate da questo ambito del circuito, esclusi gli ingressi o le catture.
Questa è la lunghezza dell'elemento iter_declared_vars() iterabile.
num_declared_stretches
Il numero di tratti del circuito dichiarati da questo ambito del circuito, escluse le catture.
Questa è la lunghezza dell'elemento iter_declared_stretches() iterabile.
num_input_vars
Il numero di variabili classiche in tempo reale del circuito contrassegnate come ingressi del circuito.
Questa è la lunghezza dell'elemento iter_input_vars() iterabile. Se questo valore è diverso da zero, num_captured_vars deve essere zero.
num_identifiers
Il numero di variabili classiche in tempo reale e di tratti nel circuito.
Questo è pari a num_vars() + num_stretches().
num_parameters
Il numero di oggetti parametro nel circuito.
num_qubits
Restituisce il numero di qubit.
num_stretches
Il numero di tratti del circuito.
Questa è la lunghezza dell'elemento iter_stretches() iterabile.
num_vars
Il numero di variabili classiche in tempo reale nel circuito.
Questa è la lunghezza dell'elemento iter_vars() iterabile.
Creazione di nuovi circuiti
Metodo | Riepilogo |
|---|---|
__init__() | Costruttore predefinito di circuiti senza istruzioni. |
copy() | Creare una copia completa di un circuito esistente. |
copy_empty_like() | Copiare oggetti di dati da un circuito a un altro senza istruzioni. |
from_instructions() | Desumere gli oggetti di dati necessari da un elenco di istruzioni. |
from_qasm_file() | Interfaccia legacy per qasm2.load(). |
from_qasm_str() | Interfaccia legacy per qasm2.loads(). |
Il costruttore predefinito (QuantumCircuit(...)) produce un circuito senza istruzioni iniziali. Gli argomenti del costruttore predefinito possono essere utilizzati per alimentare il circuito con una memoria di dati quantistici e classici e per fornire un nome, una fase globale e metadati arbitrari. Tutti questi campi possono essere ampliati in seguito.
__init__
__init__(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())
Costruttore predefinito di QuantumCircuit.
Parametri
-
regs (Register |int |Sequence[Bit]) –
I registri da includere nel circuito.
-
Se un elenco di
Registerrappresenta gli oggettiQuantumRegistere/oClassicalRegisterda includere nel circuito.Ad esempio:
QuantumCircuit(QuantumRegister(4))QuantumCircuit(QuantumRegister(4), ClassicalRegister(3))QuantumCircuit(QuantumRegister(4, 'qr0'), QuantumRegister(2, 'qr1'))
-
Se un elenco di
int, la quantità di qubit e/o bit classici da includere nel circuito. Può essere un singolo int per il solo numero di bit quantistici, oppure 2 int per il numero di bit quantistici e classici, rispettivamente.Ad esempio:
QuantumCircuit(4) # A QuantumCircuit with 4 qubitsQuantumCircuit(4, 3) # A QuantumCircuit with 4 qubits and 3 classical bits
-
Se un elenco di liste python contiene
Bitoggetti, un insieme di oggettiBitda aggiungere al circuito.
-
-
name (str | None) – il nome del circuito quantistico. Se non viene impostata, verrà assegnata una stringa generata automaticamente.
-
global_phase (ParameterExpression |float) – La fase globale del circuito espressa in radianti.
-
metadata (dict | None) – Metadati di valore chiave arbitrari da associare al circuito. Questo viene memorizzato come dato libero in un dict nell'attributo
metadatanell'attributo. Non verrà utilizzato direttamente nel circuito. -
inputs (Iterable[Var]) – variabili da dichiarare come variabili
inputdi runtime per questo circuito. Questi dovrebbero essere nodi giàexpr.Varesistenti che hai creato altrove; se devi creare anche gli input, usaQuantumCircuit.add_input(). Le variabili specificate in questo argomento verranno passate direttamente aadd_input(). Un circuito non può avere siainputschecaptures. -
captures (Iterable[Var |Stretch]) – qualsiasi variabile che l'ambito di questo circuito debba ereditare dall'ambito che lo contiene. Le variabili qui indicate verranno passate direttamente a
add_capture(). Un circuito non può avere siainputschecaptures. -
declarations (Mapping[Var, Expr] | Iterable[tuple[Var, Expr]]) –
qualsiasi variabile che questo circuito deve dichiarare e inizializzare immediatamente. È possibile ordinare questo input in modo che le dichiarazioni successive dipendano da quelle precedenti (compresi gli input o le catture). Se è necessario dipendere da valori che verranno calcolati in seguito in fase di esecuzione, utilizzare il metodo
add_var()in un punto appropriato dell'esecuzione del circuito.Questo argomento serve per una comoda inizializzazione del circuito quando si dispone già di un insieme di variabili create. Le variabili utilizzate qui saranno passate direttamente a
add_var()che si può usare direttamente se è la prima volta che si crea la variabile.
Aumenti
- CircuitError - se il nome del circuito, se fornito, non è valido.
- CircuitError - se vengono forniti sia
inputschecaptures.
Se si dispone di un circuito già esistente, è possibile produrne una copia con il metodo copy(), comprese tutte le istruzioni. Questo è utile se si vuole mantenere un circuito parziale mentre se ne estende un altro, o per avere una versione che si può mutare in-place lasciando intatta quella precedente.
copy
copy(name=None)
Copiare il circuito.
Parametri
name (str) – nome da assegnare al circuito copiato. Se nessuno, il nome rimane invariato.
Risultati
una copia profonda del circuito corrente, con il nome specificato
Tipo di restituzione
Allo stesso modo, se desideri un circuito che contenga tutti gli stessi oggetti dati (bit, registri, variabili, ecc.) ma senza alcuna istruzione, puoi usare copy_empty_like(). Questo è piuttosto comune quando si desidera creare un nuovo livello di un circuito da applicare poi sul retro con compose(), oppure per riscrivere completamente le istruzioni di un circuito.
copy_empty_like
copy_empty_like(name=None, *, vars_mode='alike')
Restituisce una copia di self con la stessa struttura, ma vuota.
Tale struttura comprende:
- nome e altri metadati
- fase globale
- tutti i qubit e i clbit, compresi i registri
- le variabili in tempo reale definite nel circuito, gestite in base all'argomento della parola chiave
vars.
Se il circuito contiene dichiarazioni di variabili locali (quelle aggiunte dall'argomento declarations al costruttore del circuito, o utilizzando il metodo add_var()), queste possono essere non inizializzate nel circuito di uscita. È necessario aggiungere manualmente le istruzioni per la memorizzazione (vedi Store e QuantumCircuit.store()) per inizializzarle.
Parametri
-
name (str | None) – Nome del circuito copiato. Se nessuno, il nome rimane invariato.
-
vars_mode (Literal['alike', 'captures', 'drop']) –
La modalità di gestione delle variabili in tempo reale.
simile
Le variabili del circuito di uscita avranno la stessa semantica di dichiarazione del circuito originale. Ad esempio, le variabili di
inputnella sorgente saranno variabili diinputnel circuito di uscita. Si noti che in questo modo le variabili locali non vengono inizializzate, perché i depositi non vengono copiati. Questo può lasciare il circuito in uno stato potenzialmente pericoloso per gli utenti, se non aggiungono nuovamente gli inizializzatori.catture
Tutte le variabili saranno convertite in variabili catturate. Questo è utile quando si sta costruendo un nuovo livello per un circuito esistente che si vuole
compose()sulla base, poichécompose()può inserire le catture nel circuito di base (ma non altre variabili).rimuovere
Il circuito di uscita non avrà variabili definite.
Risultati
Una copia vuota di sé.
Tipo di restituzione
In alcuni casi, è più pratico generare un elenco di CircuitInstructions separatamente rispetto all'intero contesto del circuito, per poi costruire un circuito a partire da esso. Il from_instructions() costruttore acquisirà automaticamente tutte Qubit le istanze di e Clbit utilizzate nelle istruzioni e creerà un nuovo QuantumCircuit oggetto dotato delle risorse corrette e di tutte le istruzioni.
from_instructions
static from_instructions(instructions, *, qubits=(), clbits=(), name=None, global_phase=0, metadata=None)
Costruisci un circuito a partire da un iterabile di CircuitInstructions.
Parametri
- instructions (Iterable[CircuitInstruction |tuple[qiskit.circuit.Instruction] | tuple[qiskit.circuit.Instruction, Iterable[Qubit]] | tuple[qiskit.circuit.Instruction, Iterable[Qubit], Iterable[Clbit]]]) – Le istruzioni da aggiungere al circuito.
- qubits (Iterable[Qubit]) – Qualsiasi qubit da aggiungere al circuito. Questo argomento può essere utilizzato, ad esempio, per imporre un particolare ordinamento dei qubit.
- clbits (Iterable[Clbit]) – Qualsiasi bit classico da aggiungere al circuito. Questo argomento può essere usato, ad esempio, per imporre un particolare ordine dei bit classici.
- name (str | None) – Il nome del circuito.
- global_phase (ParameterValueType) – La fase globale del circuito in radianti.
- metadata (dict | None) – Metadati di valore chiave arbitrari da associare al circuito.
Risultati
Il circuito quantistico.
Tipo di restituzione
QuantumCircuit ha ancora due metodi costruttori che sono legacy wrapper attorno agli importatori in qiskit.qasm2. Questi applicano automaticamente le impostazioni di compatibilità legacy di load() e loads().
from_qasm_file
static from_qasm_file(path)
Leggere un programma di OpenQASM 2.0 da un file e convertirlo in un'istanza di QuantumCircuit.
Parametri
path (str |PathLike) – Percorso del file per un programma di " OpenQASM e 2"
Risultati
L'oggetto QuantumCircuit per l'input OpenQASM 2.
Tipo di restituzione
qasm2.load(): l'interfaccia completa dell'importatore OpenQASM 2.
from_qasm_str
static from_qasm_str(qasm_str)
Converte una stringa contenente un programma di OpenQASM 2.0 in un file di tipo QuantumCircuit.
Parametri
qasm_str (str) – Una stringa contenente un programma OpenQASM 2.0.
Risultati
L'oggetto QuantumCircuit per l'ingresso OpenQASM 2
Tipo di restituzione
qasm2.loads(): l'interfaccia completa dell'importatore OpenQASM 2.
Oggetti dati sui circuiti
Aggiunta di oggetti dati
Metodo | Aggiunge questo tipo di dati |
|---|---|
add_bits() | Qubits e Clbits. |
add_register() | QuantumRegister e ClassicalRegister. |
add_var() | Var con ambito e inizializzatori locali. |
add_stretch() | Stretch nodi con ambito locale. |
add_input() | Var nodi che vengono trattati come ingressi del circuito. |
add_capture() | Var o Stretch nodi catturati da ambiti contenenti. |
add_uninitialized_var() | Var con ambito locale e stato non definito. |
In genere si aggiunge la maggior parte degli oggetti di dati (Qubit, Clbit, ClassicalRegister, ecc.) al circuito come parte dell'utilizzo del costruttore __init__() il costruttore predefinito, oppure copy_empty_like(). Tuttavia, è possibile aggiungerli anche in seguito. I dati classici tipizzati, come i nodi indipendenti (vedi Var (vedere Calcolo classico in tempo reale ), possono essere costruiti e aggiunti con metodi separati.
Nuovo registerless Qubit e Clbit vengono aggiunti utilizzando add_bits(). Questi oggetti non devono essere già presenti nel circuito. È possibile verificare se un bit esiste già nel circuito utilizzando find_bit().
add_bits
I registri vengono aggiunti al circuito con add_register(). In questo metodo, non è un errore se alcuni dei bit sono già presenti nel circuito. In questo caso, il registro sarà un "alias" dei bit. Questo non è generalmente ben supportato dai backend hardware; probabilmente è meglio non fare affidamento su di esso. I registri in cui si trova un determinato bit fanno parte del ritorno di find_bit().
add_register
add_register(*regs)
Aggiungere registri.
Se il circuito quantistico ha un attributo layout l'aggiunta di un attributo QuantumRegister aumenterà solo il numero di qubit. Non aggiornerà il layout.
Parametri
regs (Register |int |Sequence[Bit])
Tipo di restituzione
Nessuna
I dati classici digitati in tempo reale sono rappresentati sul circuito da Var nodi con una ben definita Type. È possibile istanziare queste espressioni separatamente in un circuito (vedere Var.new()), ma spesso è più comodo usare metodi di circuito che gestiscono automaticamente i tipi e l'inizializzazione delle espressioni. I due metodi più comuni sono add_var() (variabili con scope locale) e add_input() (ingressi al circuito). Inoltre, il metodo add_stretch() può essere utilizzato per aggiungere tratti al circuito.
add_var
add_var(name_or_var, /, initial)
Aggiungete a questo circuito una variabile classica con memorizzazione e portata automatica.
La variabile è considerata "dichiarata" all'inizio del circuito, ma viene inizializzata solo nel momento in cui si chiama questo metodo, quindi può dipendere da variabili definite prima di essa.
Parametri
-
name_or_var (str |Var) – una stringa del nome della variabile o un'istanza esistente di
Varda riutilizzare. Le variabili non possono oscurare nomi già in uso all'interno del circuito. -
initial (Any) –
il valore con cui inizializzare questa variabile. Se il primo argomento è stato dato come nome di stringa, il tipo della variabile risultante viene dedotto dall'espressione iniziale; per controllare questo aspetto in modo più manuale, si può usare il comando
Var.new()per costruire manualmente una nuova variabile con il tipo desiderato, oppure usareexpr.cast()per lanciare l'inizializzatore al tipo desiderato.Deve essere un nodo
Expro un valore che può essere portato a uno di essi usandoexpr.lift.
Risultati
La variabile creata. Se è stata fornita un'istanza Var è stata data un'istanza, verrà restituito lo stesso identico oggetto.
Aumenti
CircuitError - se la variabile non può essere creata a causa dell'ombra di un identificatore esistente.
Tipo di restituzione
Esempi
Definire una nuova variabile con un nome e un'espressione di inizializzazione:
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(2)
my_var = qc.add_var("my_var", False)Riutilizzare una variabile che può essere stata presa da un circuito correlato, o altrimenti costruita manualmente, e inizializzarla a un'espressione più complessa:
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit.classical import expr, types
my_var = expr.Var.new("my_var", types.Uint(8))
cr1 = ClassicalRegister(8, "cr1")
cr2 = ClassicalRegister(8, "cr2")
qc = QuantumCircuit(QuantumRegister(8), cr1, cr2)
# Get some measurement results into each register.
qc.h(0)
for i in range(1, 8):
qc.cx(0, i)
qc.measure(range(8), cr1)
qc.reset(range(8))
qc.h(0)
for i in range(1, 8):
qc.cx(0, i)
qc.measure(range(8), cr2)
# Now when we add the variable, it is initialized using the real-time state of the
# two classical registers we measured into above.
qc.add_var(my_var, expr.bit_and(cr1, cr2))add_input
add_input(name_or_var: str, type_: Type, /) → Var
add_input(name_or_var: Var, type_: None = None, /) → Var
Registrare una variabile come ingresso al circuito.
Parametri
- name_or_var (str |Var) – un nome di stringa oppure un nodo
Varesistente da utilizzare come variabile di input. - tipo - se il nome è dato come stringa, questo deve essere un tipo di stringa
Typeda utilizzare per la variabile. Se la variabile è data come un oggetto esistenteVarnon deve essere indicata e verrà letta dall'oggetto stesso. - type_ (Type | None)
Risultati
la variabile creata o la stessa variabile passata.
Aumenti
CircuitError - se la variabile non può essere creata a causa dell'ombra di una variabile esistente.
Tipo di restituzione
add_stretch
add_stretch(name_or_stretch)
Dichiara un nuovo tratto con lo scope di questo circuito.
Parametri
name_or_stretch (str |Stretch) – una stringa del nome dell'estensione o un'istanza esistente di Stretch da riutilizzare. Gli stretch non possono ombreggiare nomi già in uso all'interno del circuito.
Risultati
Il tratto creato. Se è stata fornita un'istanza Stretch è stata data un'istanza, verrà restituito lo stesso identico oggetto.
Aumenti
CircuitError - se il tratto non può essere creato a causa dell'ombra di un identificatore esistente.
Tipo di restituzione
Esempi
Definire e utilizzare un nuovo tratto con un semplice nome:
from qiskit.circuit import QuantumCircuit, Duration
from qiskit.circuit.classical import expr
qc = QuantumCircuit(2)
my_stretch = qc.add_stretch("my_stretch")
qc.delay(expr.add(Duration.dt(200), my_stretch), 1)Inoltre, esistono due metodi di livello inferiore che possono essere utili per la generazione programmatica di circuiti. Quando si lavora in modo interattivo, è probabile che non siano necessari; la maggior parte degli usi di add_uninitialized_var() fanno parte di copy_empty_like()e la maggior parte degli usi di add_capture() sarebbe meglio utilizzare l'interfaccia del costruttore di flussi di controllo.
add_uninitialized_var
add_uninitialized_var(var, /)
Aggiungere una variabile senza inizializzatore.
Nella maggior parte dei casi, si dovrebbe usare add_var() per inizializzare la variabile. Per utilizzare questa funzione, è necessario essere già in possesso di un'istanza di Var poiché l'uso della funzione ha senso solo in contesti di copia.
Qiskit non fa alcuna asserzione sul valore che una variabile non inizializzata avrà in fase di esecuzione e alcuni hardware potrebbero rifiutarla come errore.
Questa funzione va trattata con cautela e come una primitiva di basso livello, utile solo in casi particolari di ricostruzione programmatica di due circuiti simili.
Parametri
var (Var) – la variabile da aggiungere.
add_capture
add_capture(var: Var)
add_capture(stretch: Stretch)
Aggiungere un identificatore al circuito che deve catturare da un ambito in cui sarà contenuto.
Questo metodo richiede un Var o Stretch per assicurarsi di avere un handle a un identificatore, perché sarà necessario dichiarare lo stesso identificatore usando lo stesso oggetto nel circuito esterno.
Si tratta di un metodo di basso livello, utile solo se si costruiscono manualmente le operazioni del flusso di controllo. In genere non è necessario chiamare questo metodo, se si utilizza l'interfaccia del costruttore per gli ambiti del flusso di controllo (with dichiarazioni del gestore di contesto per if_test() e gli altri costrutti di scope). L'interfaccia del costruttore creerà automaticamente le chiusure degli ambiti interni per conto dell'utente, catturando tutti gli identificatori utilizzati al loro interno.
Parametri
var (Union[expr.Var, expr.Stretch]) – la variabile o il tratto da catturare da un ambito chiuso.
Aumenti
CircuitError - se l'identificatore non può essere creato a causa dell'ombra di un identificatore esistente.
Lavorare con bit e registri
Un'istanza Bit , di per sé, è semplicemente un identificatore univoco che i circuiti possono utilizzare nei propri contesti. Se si dispone di Bit un'istanza e di un circuito, è possibile individuare i contesti in cui il bit è presente utilizzando find_bit(), come ad esempio il suo indice intero nel circuito e i registri in cui è contenuto.
find_bit
find_bit(bit)
Individuare le posizioni del circuito che possono essere utilizzate per fare riferimento a una data Bit.
In particolare, questa funzione può trovare l'indice intero di un qubit, che corrisponde al suo indice hardware per un circuito transpilato.
L'indice del circuito di un elemento AncillaQubit sarà il suo indice in qubitse non ancillas.
Parametri
bit (Bit) – Il bit da localizzare.
Risultati
Una 2-tupla. Il primo elemento (index) contiene l'indice in cui si trova Bit (sia in qubits, clbits, a seconda del tipo). Il secondo elemento (registers) è un elenco di coppie di (register, index) con una voce per ogni Register nel circuito che contiene l'elemento Bit (e l'indice nel circuito Register in cui può essere trovato).
Tipo di restituzione
namedtuple (int, List[Tuple (Register, int )])
Aumenti
- CircuitError - Se l'elemento fornito
Bitè di tipo sconosciuto. - CircuitError - Se l'alimentazione
Bitnon è stato possibile trovare il circuito.
Esempi
Eseguire il loop di un circuito, ottenendo gli indici di qubit e clbit di ogni operazione:
from qiskit.circuit import QuantumCircuit, Qubit
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.measure([0, 1, 2], [0, 1, 2])
# The `.qubits` and `.clbits` fields are not integers.
assert isinstance(qc.data[0].qubits[0], Qubit)
# ... but we can use `find_bit` to retrieve them.
assert qc.find_bit(qc.data[0].qubits[0]).index == 0
simple = [
(
instruction.operation.name,
[qc.find_bit(bit).index for bit in instruction.qubits],
[qc.find_bit(bit).index for bit in instruction.clbits],
)
for instruction in qc.data
]Allo stesso modo, si può interrogare un circuito per vedere se un registro è già stato aggiunto ad esso utilizzando has_register().
has_register
has_register(register)
Verificare se questo circuito dispone del registro r.
Parametri
register (Register) – un registro quantistico o classico.
Risultati
Vero se il registro è contenuto in questo circuito.
Tipo di restituzione
Lavorare con i parametri di compilazione
Parametrizzazione in tempo di compilazione
Una discussione più completa su cosa sia la parametrizzazione in tempo di compilazione e come si inserisca nel modello di dati di Qiskit.
A differenza di bit, registri e dati classici digitati in tempo reale, i parametri simbolici in tempo di compilazione non vengono aggiunti manualmente a un circuito. La loro presenza si deduce dal fatto che sono contenute in operazioni aggiunte ai circuiti e alla fase globale. Un elenco ordinato di tutti i parametri attualmente presenti in un circuito si trova a QuantumCircuit.parameters.
L'operazione più comune sulle Parameter istanze consiste nel sostituirle, nelle operazioni simboliche, con un valore numerico o con un'altra espressione simbolica. Questo si ottiene con assign_parameters().
assign_parameters
assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[False] = False, *, flat_input: bool = False, strict: bool = True) → QuantumCircuit
assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[True] = False, *, flat_input: bool = False, strict: bool = True) → None
Assegnare i parametri a nuovi parametri o valori.
Se parameters viene passato come dizionario, le chiavi devono essere Parameter istanze nel circuito corrente. I valori del dizionario possono essere sia valori numerici che nuovi oggetti parametro.
Se parameters viene passato come lista o array, gli elementi vengono assegnati ai parametri correnti nell'ordine di parameters , che è ordinato alfabeticamente (rispettando l'ordinamento degli ParameterVector oggetti in ).
I valori possono essere assegnati all'oggetto circuito corrente o a una sua copia.
Quando parameters viene specificato come mappatura, è consentito utilizzare come chiavi stringhe costituite dai nomi dei parametri; queste verranno ricercate utilizzando get_parameter(). È anche possibile avere chiavi che sono ParameterVector istanze; in questo caso, il valore del dizionario dovrebbe essere una sequenza di valori della stessa lunghezza del vettore.
flat_input=FalseSe si utilizza uno di questi due casi, è necessario lasciare l'impostazione così com'è; modificandola True si attiva il percorso veloce, in cui tutte le chiavi devono essere Parameter istanze.
Parametri
- parameters (Mapping[Parameter, ParameterExpression |float] | Iterable[ParameterExpression |float]) – Un dizionario o un iterabile che specifichi i nuovi valori dei parametri.
- inplace (bool) – Se il valore è False, viene restituita una copia del circuito con i parametri associati. Se il valore è True, viene modificata l'istanza del circuito stessa.
- flat_input (bool) – Se
Trueeparametersè un tipo di mappatura, si presume che sia esattamente una mappatura di{parameter: value}. Per impostazione predefinita (False), la mappatura può contenereParameterVectoranche chiavi che rimandano a una sequenza corrispondente di valori, che verranno sviluppate durante la mappatura, oppure chiavi di tipo stringa, che verranno convertite inParameteristanze tramiteget_parameter(). - strict (bool) – In tal caso
False, eventuali parametri specificati nella mappatura che non vengono utilizzati nel circuito verranno ignorati. SeTrue(impostazione predefinita), verrà generato un errore che segnala un errore logico.
Aumenti
- CircuitError - Se parametri è una dict e contiene parametri non presenti nel circuito.
- ValueError - Se i parametri sono un elenco/array e la loro lunghezza non corrisponde al numero di parametri liberi del circuito.
Risultati
Una copia del circuito con parametri vincolati se inplace è False, altrimenti None.
Tipo di restituzione
QuantumCircuit | Nessuno
Esempi
Creare un circuito parametrizzato e assegnare i parametri in loco.
from qiskit.circuit import QuantumCircuit, Parameter
circuit = QuantumCircuit(2)
params = [Parameter('A'), Parameter('B'), Parameter('C')]
circuit.ry(params[0], 0)
circuit.crx(params[1], 0, 1)
circuit.draw('mpl')
circuit.assign_parameters({params[0]: params[2]}, inplace=True)
circuit.draw('mpl')

Legare i valori fuori posto per elenco e ottenere una copia del circuito originale.
from qiskit.circuit import QuantumCircuit, ParameterVector
circuit = QuantumCircuit(2)
params = ParameterVector('P', 2)
circuit.ry(params[0], 0)
circuit.crx(params[1], 0, 1)
bound_circuit = circuit.assign_parameters([1, 2])
bound_circuit.draw('mpl')
circuit.draw('mpl')

Il circuito tiene traccia dei parametri tramite Parameter le istanze stesse e non consente l'esistenza di più parametri con lo stesso nome, al fine di evitare alcuni problemi durante l'interoperabilità con OpenQASM o altri formati esterni. È possibile utilizzare has_parameter() e get_parameter() per interrogare il circuito in merito a un parametro con il nome specificato nella stringa.
has_parameter
has_parameter(name_or_param, /)
Controlla se esiste un oggetto parametro in questo circuito.
Parametri
name_or_param (str |Parameter) – il parametro, ovvero il nome di un parametro da verificare. TrueSe si tratta di un Parameter nodo, il parametro deve essere esattamente quello specificato affinché questa funzione restituisca il risultato.
Risultati
se un parametro di corrispondenza è assegnabile in questo circuito.
Tipo di restituzione
QuantumCircuit.get_parameter()
Recupera l'istanza Parameter da questo circuito in base al nome.
ParameterUn metodo simile a questo, ma che riguarda le variabili di runtime expr.Var anziché quelle di compilazione.
get_parameter
get_parameter(name: str, default: T) → Parameter | T
get_parameter(name: str, default: builtin_types.EllipsisType = Ellipsis) → Parameter
Recupera un parametro in tempo di compilazione accessibile per nome in questo ambito del circuito.
Parametri
- name (str) – il nome del parametro da recuperare.
- default (Any) – Se specificato, questo valore verrà restituito nel caso in cui il parametro non sia presente. Se non viene specificato, viene
KeyErrorgenerato un.
Risultati
Il parametro corrispondente.
Aumenti
KeyError - se non viene dato alcun valore predefinito, ma il parametro non esiste nel circuito.
Tipo di restituzione
Esempi
Recupera un parametro per nome da un circuito:
from qiskit.circuit import QuantumCircuit, Parameter
my_param = Parameter("my_param")
# Create a parametrized circuit.
qc = QuantumCircuit(1)
qc.rx(my_param, 0)
# We can use 'my_param' as a parameter, but let's say we've lost the Python object
# and need to retrieve it.
my_param_again = qc.get_parameter("my_param")
assert my_param == my_param_againOttiene una variabile da un circuito in base al nome, restituendo un valore predefinito se non è presente:
assert qc.get_parameter("my_param", None) == my_param
assert qc.get_parameter("unknown_param", None) is NoneLavorare con dati classici digitati in tempo reale
Documentazione a livello di modulo sul funzionamento dei sistemi di variabili, espressioni e tipi, sugli oggetti utilizzati per rappresentarli e sulle operazioni classiche disponibili.
Calcolo classico in tempo reale
Una discussione sul modo in cui i dati in tempo reale si inseriscono nell'intero qiskit.circuit modello di dati nel suo complesso.
I metodi per aggiungere nuovi Var o Stretch identificatori a un circuito dopo l'inizializzazione.
È possibile recuperare gli identificatori collegati a un circuito (ad esempio, un circuito Var o Stretch) per nome con i metodi get_var(), get_stretch(), o get_identifier(). Si può anche verificare se un circuito contiene un dato identificatore con has_var(), has_stretch(), o has_identifier().
get_var
get_var(name: str, default: T) → Var | T
get_var(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var
Recupera una variabile accessibile per nome in questo ambito del circuito.
Parametri
- name (str) – il nome della variabile da recuperare.
- default (Any) – Se specificato, questo valore verrà restituito nel caso in cui la variabile non sia presente. Se non viene specificato, viene
KeyErrorgenerato un.
Risultati
La variabile corrispondente.
Aumenti
KeyError - se non viene dato alcun valore predefinito, ma la variabile non esiste.
Esempi
Recupera una variabile per nome da un circuito:
from qiskit.circuit import QuantumCircuit
# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_var = qc.add_var("my_var", False)
# We can use 'my_var' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_var_again = qc.get_var("my_var")
assert my_var == my_var_againOttiene una variabile da un circuito in base al nome, restituendo un valore predefinito se non è presente:
assert qc.get_var("my_var", None) == my_var
assert qc.get_var("unknown_variable", None) is Noneget_stretch
get_stretch(name: str, default: T) → Stretch | T
get_stretch(name: str, default: builtin_types.EllipsisType = Ellipsis) → Stretch
Recupera un tratto accessibile in questo ambito del circuito in base al nome.
Parametri
- name (str) – il nome del tratto da recuperare.
- default (Any) – Se specificato, questo valore verrà restituito nel caso in cui la variabile non sia presente. Se non viene specificato, viene
KeyErrorgenerato un.
Risultati
Il tratto corrispondente.
Aumenti
KeyError - se non viene dato alcun valore predefinito, ma la variabile non esiste.
Esempi
Recupera un tratto per nome da un circuito:
from qiskit.circuit import QuantumCircuit
# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_stretch = qc.add_stretch("my_stretch")
# We can use 'my_stretch' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_stretch_again = qc.get_stretch("my_stretch")
assert my_stretch == my_stretch_againOttiene una variabile da un circuito in base al nome, restituendo un valore predefinito se non è presente:
assert qc.get_stretch("my_stretch", None) == my_stretch
assert qc.get_stretch("unknown_stretch", None) is Noneget_identifier
get_identifier(name: str, default: T) → Var | Stretch | T
get_identifier(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var | Stretch
Recupera un identificatore accessibile in questo ambito del circuito in base al nome.
Attualmente questo include sia le variabili classiche in tempo reale che i tratti.
Parametri
- name (str) – il nome dell'identificatore da recuperare.
- default (Any) – Se specificato, questo valore verrà restituito nel caso in cui la variabile non sia presente. Se non viene specificato, viene
KeyErrorgenerato un.
Risultati
La variabile corrispondente.
Aumenti
KeyError - se non viene dato alcun valore predefinito, ma l'identificatore non esiste.
Ottiene un identificatore noto per essere un expr.Var istanza.
Ottiene un identificatore noto per essere un expr.Stretch istanza.
Un metodo simile, ma che Parameter riguarda i parametri di compilazione anziché le variabili di expr.Var esecuzione.
has_var
has_var(name_or_var, /)
Controlla se una variabile è accessibile in questo ambito.
Parametri
name_or_var (str |Var) – la variabile o il nome di una variabile da controllare. Se si tratta di un expr.Var nodo, la variabile deve essere esattamente quella specificata affinché questa funzione restituisca True.
Risultati
se una variabile corrispondente è accessibile.
Tipo di restituzione
Recuperare l'istanza expr.Var da questo circuito per nome.
QuantumCircuit.has_parameter()
ParameterUn metodo simile a questo, ma che riguarda le variabili definite in fase di compilazione anziché quelle in fase expr.Var di esecuzione.
has_stretch
has_stretch(name_or_stretch, /)
Verificare se un tratto è accessibile in questo ambito.
Parametri
name_or_stretch (str |Stretch) – il tratto o il nome di un tratto da controllare. Se si tratta di un expr.Stretch nodo, l'allungamento deve essere esattamente quello specificato affinché questa funzione restituisca True.
Risultati
se un tratto corrispondente è accessibile.
Tipo di restituzione
Recuperare l'istanza expr.Stretch da questo circuito per nome.
has_identifier
has_identifier(name_or_ident, /)
Verifica se un identificatore è accessibile in questo ambito.
Parametri
name_or_ident (str |Var |Stretch) – l'istanza o il nome dell'identificatore da controllare. Se si tratta di un nodo expr.Varexpr.Stretch o, l'istanza corrispondente deve essere esattamente quella specificata affinché questa funzione restituisca True.
Risultati
se un identificatore corrispondente è accessibile.
Tipo di restituzione
QuantumCircuit.get_identifier()
Recuperare l'opzione expr.Var o expr.Stretch da questo circuito per nome.
Come questo metodo, ma ignorando tutto ciò che non è una variabile expr.Var in fase di esecuzione.
Come questo metodo, ma ignorando tutto ciò che non è una variabile expr.Stretch in fase di esecuzione.
QuantumCircuit.has_parameter()
ParameterUn metodo simile a questo, ma che riguarda le variabili definite in fase di compilazione anziché quelle in fase expr.Var di esecuzione.
Esistono anche diversi metodi iteratori che si possono usare per ottenere l'insieme degli identificatori tracciati da un circuito. Almeno uno di iter_input_vars() e iter_captured_vars() sarà vuoto, poiché gli ingressi e le catture si escludono a vicenda. Tutti gli iteratori hanno proprietà dinamiche corrispondenti su QuantumCircuit che contengono la loro lunghezza: num_vars, num_stretches, num_input_vars, num_captured_vars, num_captured_stretches, num_declared_vars, o num_declared_stretches.
iter_vars
iter_vars()
Ottiene un iterabile su tutte le variabili classiche in tempo reale in ambito di questo circuito.
Questo metodo esegue un'iterazione su tutte le variabili in ambito. Per gli iteratori a grana più fine, vedere iter_declared_vars(), iter_input_vars() e iter_captured_vars().
Tipo di restituzione
iter_stretches
iter_stretches()
Ottenere un iterabile su tutti i tratti in ambito all'interno di questo circuito.
Questo metodo itera su tutte le tratte in ambito. Per gli iteratori a grana più fine, si veda iter_declared_stretches() e iter_captured_stretches().
Tipo di restituzione
iter_input_vars
iter_input_vars()
Ottiene un iterabile su tutte le variabili classiche in tempo reale dichiarate come ingressi di questo ambito circuitale. Sono escluse le variabili dichiarate localmente (vedi iter_declared_vars()) e le variabili catturate (vedere iter_captured_vars()).
Tipo di restituzione
iter_captured_vars
iter_captured_vars()
Ottiene un iterabile su tutte le variabili classiche in tempo reale catturate da questo ambito del circuito da un ambito contenente. Sono escluse le variabili di input (vedere iter_input_vars()) e le variabili dichiarate localmente (vedere iter_declared_vars()).
Tipo di restituzione
iter_captured_stretches
iter_captured_stretches()
Ottiene un iterabile sui tratti catturati da questo ambito di circuito da un ambito contenente. Sono esclusi i tratti dichiarati localmente (vedere iter_declared_stretches()).
Tipo di restituzione
iter_declared_vars
iter_declared_vars()
Ottiene un iterabile su tutte le variabili classiche in tempo reale dichiarate con durata di memorizzazione automatica in questo ambito. Sono escluse le variabili di input (vedere iter_input_vars()) e le variabili catturate (vedere iter_captured_vars()).
Tipo di restituzione
iter_declared_stretches
iter_declared_stretches()
Ottiene un iterabile su tutti i tratti dichiarati in questo ambito. Sono esclusi i tratti catturati (vedi iter_captured_stretches()).
Tipo di restituzione
Aggiunta di operazioni ai circuiti
È possibile aggiungere a un circuito qualsiasi elemento che implementi l'interfaccia Operation con una singola istruzione, anche se la maggior parte degli elementi che si vorrà aggiungere saranno Instruction istanze di o Gate .
Operazioni, istruzioni e cancelli
La documentazione di qiskit.circuit-documentazione di livello sulle diverse interfacce utilizzate da Qiskit per definire le istruzioni a livello di circuito.
Metodi per aggiungere operazioni generali
Questi sono i metodi di base che gestiscono l'aggiunta di qualsiasi oggetto, compresi quelli definiti dall'utente, ai circuiti.
Metodo | Quando utilizzarlo |
|---|---|
append() | Aggiungere un'istruzione come oggetto singolo in un circuito. |
_append() | Uguale a append()ma con un'interfaccia di basso livello che elimina quasi tutti i controlli degli errori. |
compose() | Integrare le istruzioni di un circuito in un altro. |
tensor() | Come compose()ma solo per unire circuiti che agiscono su qubit disgiunti. |
QuantumCircuit ha due modi principali per aggiungere altre operazioni a un circuito. La scelta dipende dal fatto che si voglia aggiungere l'oggetto come una singola "istruzione" (append()), oppure se si vogliono unire le istruzioni di due circuiti (compose()).
Una singola istruzione o operazione appare come una singola voce nello schema data del circuito e come un singolo riquadro quando viene rappresentata nei visualizzatori di circuiti (vedi draw()). Una singola istruzione è l’“unità” in base alla quale può essere definito un backend hardware (vedi Target). Un Instruction può essere accompagnato da un definition, che rappresenta una regola a cui il transpiler (vedi qiskit.transpiler) potrà ricorrere per scomporlo in vista dell'esecuzione sull'hardware, se necessario. Un Operation che non sia anche un Instruction può essere scomposto solo se gli è associato un metodo di sintesi di alto livello registrato (vedi qiskit.transpiler.passes.synthesis.plugin).
Una QuantumCircuit da sola non è un singolo Instruction; è piuttosto più complessa, poiché può, in generale, rappresentare un programma completo con ingressi e uscite di memoria classici tipizzati e flusso di controllo. Il modello di dati di Qiskit (e della maggior parte dell'hardware) non prevede ancora il concetto di subroutine richiamabili e riutilizzabili con operandi quantistici virtuali. È possibile convertire circuiti semplici che agiscono solo sui qubit con operazioni unitarie in un Gate utilizzando to_gate(), e circuiti semplici che agiscono solo su qubit e clbit in un Instruction utilizzando to_instruction().
Quando si dispone di un Operation, Instruction, o Gate, aggiungerlo al circuito, specificando gli argomenti qubit e clbit con append().
append
append(instruction, qargs=None, cargs=None, *, copy=True)
Aggiungere una o più istruzioni alla fine del circuito, modificando il circuito stesso.
Il qargs e cargs il verranno espansi e trasmessi secondo le regole del dato Instruction, e qualsiasi specificatore nonBit (come gli indici interi) verrà risolto nelle istanze pertinenti.
Se viene fornito un CircuitInstruction , questo verrà "sconfezionato", verificato nel contesto di questo circuito e un nuovo oggetto verrà aggiunto al circuito. In questo caso, non è possibile passare qargs o cargs separatamente.
Parametri
- instruction (Operation |CircuitInstruction) –
Instructionun'istanza da aggiungere, oppure unCircuitInstructioncon tutto il suo contesto. Sono supportati anche gli oggetti che implementanoto_instruction, ma in genere è preferibile passare direttamente unInstruction, poiché ciò evita il costo delle conversioni ripetute. - qargs (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – elementi a cui
Qubitassociare l'istruzione - cargs (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]] | None) – elementi a cui
Clbitassociare l'istruzione - copy (bool) – se
True(l'impostazione predefinita), l'istruzioneinstructionin arrivo viene copiata prima di essere aggiunta al circuito se contiene parametri simbolici, in modo che possa essere mutata in modo sicuro senza influenzare altri circuiti in cui potrebbe trovarsi la stessa istruzione. Se si è certi che questa istruzione non verrà utilizzata in altri circuiti, è possibile impostare questoFalseper ottenere un piccolo aumento di velocità.
Risultati
CircuitInstructionun riferimento agli elementi che sono stati effettivamente aggiunti al circuito.
Tipo di restituzione
Aumenti
CircuitError – se l'operazione passata non è un'istanza di Instruction, oppure non può essere convertita in tale istanza richiamando to_instruction su di essa.
append() esegue un sostanziale controllo degli errori per garantire che non si possa accidentalmente rompere il modello dei dati di QuantumCircuit. Se si genera programmaticamente un circuito a partire da dati noti e validi, si può eludere gran parte di questo controllo degli errori utilizzando l'appender fast-path _append()ma con il rischio che il chiamante sia responsabile di passare solo dati validi.
_append
_append(instruction: CircuitInstruction, *, _standard_gate: bool) → CircuitInstruction
_append(instruction: Operation, qargs: Sequence[Qubit], cargs: Sequence[Clbit]) → Operation
Aggiungere un'istruzione alla fine del circuito, modificando il circuito stesso.
Si tratta di una funzione interna di percorso veloce ed è responsabilità del chiamante assicurarsi che tutti gli argomenti siano validi; non è previsto il controllo degli errori. In particolare:
- tutti i qubit e i clbit devono essere già presenti nel circuito e non ci possono essere duplicati nell'elenco.
- le istruzioni per le operazioni di controllo devono agire solo sulle variabili presenti nel circuito.
- il circuito non deve trovarsi in un contesto di costruttore di flussi di controllo.
Questa funzione può essere utilizzata da chiamanti diversi da QuantumCircuit quando il chiamante è sicuro che tutti i controlli degli errori, il broadcasting e lo scoping sono già stati eseguiti e l'unico riferimento al circuito a cui vengono aggiunte le istruzioni è all'interno della stessa funzione. In particolare, non è sicuro chiamare QuantumCircuit._append() su un circuito ricevuto come argomento da una funzione. Questo perché QuantumCircuit._append() non riconosce i costrutti di scoping dell'interfaccia del costruttore di flussi di controllo.
Parametri
-
istruzione -
Una descrizione completa e ben strutturata
CircuitInstructiondell'operazione e del contesto in cui va inserita.Nella forma di compatibilità con le versioni precedenti, può trattarsi di un semplice
Operation, nel qual casoqargsecargsdevono essere specificati esplicitamente. -
qargs – Argomento legacy per i qubit a cui collegare il bare
Operation. Viene ignorato se il primo argomento è nella forma preferenzialeCircuitInstruction. -
cargs – Argomento legacy per clbits a cui associare il bare
Operation. Viene ignorato se il primo argomento è nella forma preferenzialeCircuitInstruction. -
_standard_gate (bool)
Risultati
un handle all'istruzione appena aggiunta.
Tipo di restituzione
In altri casi, è possibile unire due circuiti, applicando le istruzioni di un circuito ai qubit e ai clbit specificati di un altro circuito. Questa operazione di "inlining" è chiamata compose() in Qiskit. compose() è, in generale, più potente di un to_instruction()-piùappend() per unire due circuiti, perché può collegare anche dati classici tipizzati e permette di unire le operazioni di controllo-flusso del circuito a un altro circuito.
Gli svantaggi di compose() è un'operazione più complessa che può comportare una maggiore riscrittura dell'operando e che deve necessariamente spostare i dati da un oggetto del circuito a un altro. Se state costruendo un circuito per voi stessi e le prestazioni grezze sono un obiettivo fondamentale, prendete in considerazione la possibilità di far girare il circuito di base e di far scrivere le diverse parti dell'algoritmo direttamente sul circuito di base, piuttosto che costruire un circuito temporaneo a strati.
compose
compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[True] = True, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → None
compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[False] = False, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → QuantumCircuit
Applicare le istruzioni di un circuito ai qubit e/o ai clbit specificati di un altro circuito.
Per impostazione predefinita, viene creato un nuovo oggetto circuito, lasciando intatto self . Per la maggior parte degli usi di questa funzione, è molto più efficiente impostare inplace=True e modificare il circuito di base sul posto.
Quando si ha a che fare con variabili in tempo reale (expr.Var e expr.Stretch ci sono due strategie principali per l'utilizzo di compose():
- Il circuito
otherè trattato come interamente additivo, comprese le sue variabili. Le variabili inotherdevono essere completamente distinte da quelle inself(per questo si può usarevar_remap) e tutte le variabili inothersaranno dichiarate nuovamente nell'output con uno scoping input/capture/local corrispondente a quello diother. In genere, è quello che si desidera se si devono unire due circuiti non correlati. - Il circuito
otherè stato creato come un'estensione esatta diselfper essere inline su di esso, agendo anche sulle variabili esistenti nei loro stati alla fine diself. In questo caso, si dovrebbe creareothercon tutte le variabili da inserire dichiarate come "catture" e poi si può usareinline_captures=Truein questo metodo per collegarle. Questo è generalmente ciò che si desidera se si sta costruendo un circuito definendo i livelli al volo o ricostruendo un circuito usando livelli presi da se stesso. L'argomentovars_mode="captures"dicopy_empty_like()per creare la base di ogni livello, in questo caso.
Parametri
-
other (qiskit.circuit.Instruction orQuantumCircuit) – (sotto)circuito o istruzione da applicare a se stesso. Se non è un
QuantumCircuit, può essere qualsiasi cosa cheappendaccetti. -
front (bool) – Se
True, verrà eseguita la composizione frontale. Questo non è possibile all'interno dei gestori di contesto dei costruttori di flussi di controllo. -
inplace (bool) – Se
True, modificare l'oggetto. Altrimenti, restituire il circuito composto. -
copy (bool) – Se
True(l'impostazione predefinita), l'input viene trattato come condiviso e tutte le istruzioni contenute verranno copiate, se dovessero essere mutate in futuro. Si può impostareFalsese l'ingresso deve essere considerato di proprietà del circuito di base, per evitare copie inutili; in questo caso, non è valido l'uso successivo diothere alcune istruzioni potrebbero essere state mutate sul posto. -
var_remap (Mapping) –
mappatura da utilizzare per riscrivere
expr.Vareexpr.Stretchinothermentre vengono inseriti inself. Questo può essere usato per evitare conflitti di denominazione.Sia le chiavi che i valori possono essere forniti come stringhe o istanze di identificatori diretti. Se una chiave è una stringa, corrisponde a qualsiasi elemento
VaroStretchcon lo stesso nome. Se un valore è una stringa, ogni volta che una nuova chiave corrisponde ad essa, un nuovo elementoVaroStretchviene creato con il tipo corretto. Se un valore è una variabileVaril suotypedeve corrispondere esattamente a quello della variabile che sostituisce. -
inline_captures (bool) –
se
True, allora tutti i nodi di identificatori "catturati" inotherQuantumCircuitsi presume si riferiscano a identificatori già dichiarati inself(come qualsiasi tipo di ingresso/cattura/locale) e gli usi inothersi applicheranno agli identificatori esistenti. Se si vuole costruire un livello per un circuito esistente da usare concompose()si potrebbe trovare utile l'argomentovars_mode="captures"dicopy_empty_like()utile. Qualsiasi rimappatura invars_remapavviene prima della valutazione di questa variabile inlining.Se questo è
False(l'impostazione predefinita), tutti gli identificatori inotherdovranno essere distinti da quelli inselfe verranno fatte nuove dichiarazioni per loro. -
wrap (bool) – Se è vero, avvolge l'altro circuito in un gate (o in un'istruzione, a seconda che contenga solo istruzioni unitarie) prima di comporlo in sé. Piuttosto che usare questa opzione, è quasi sempre meglio controllare manualmente questo aspetto, usando i tasti
to_instruction()oto_gate()e poi chiamareappend().
Risultati
il circuito composto (restituisce None se inplace==True).
Tipo di restituzione
Aumenti
- CircuitError - se non è possibile effettuare una mappatura corretta dei fili tra i due circuiti, ad esempio se
otherè più largo diself. - CircuitError - se si cerca di emettere un nuovo circuito mentre
selfha un contesto di flusso di controllo parzialmente costruito attivo, come le forme di context-manager diif_test(),for_loop()ewhile_loop(). - CircuitError - se si cerca di comporre la parte anteriore di un circuito quando è attivo un blocco costruttore di flussi di controllo; non c'è un significato chiaro per questa azione.
Esempi
>>> lhs.compose(rhs, qubits=[3, 2], inplace=True) ┌───┐ ┌─────┐ ┌───┐
lqr_1_0: ───┤ H ├─── rqr_0: ──■──┤ Tdg ├ lqr_1_0: ───┤ H ├───────────────
├───┤ ┌─┴─┐└─────┘ ├───┤
lqr_1_1: ───┤ X ├─── rqr_1: ┤ X ├─────── lqr_1_1: ───┤ X ├───────────────
┌──┴───┴──┐ └───┘ ┌──┴───┴──┐┌───┐
lqr_1_2: ┤ U1(0.1) ├ + = lqr_1_2: ┤ U1(0.1) ├┤ X ├───────
└─────────┘ └─────────┘└─┬─┘┌─────┐
lqr_2_0: ─────■───── lqr_2_0: ─────■───────■──┤ Tdg ├
┌─┴─┐ ┌─┴─┐ └─────┘
lqr_2_1: ───┤ X ├─── lqr_2_1: ───┤ X ├───────────────
└───┘ └───┘
lcr_0: 0 ═══════════ lcr_0: 0 ═══════════════════════
lcr_1: 0 ═══════════ lcr_1: 0 ═══════════════════════Se si cerca di unire due circuiti, questo si applica a qubit e clbit completamente disgiunti, tensor() è una comoda soluzione per evitare di aggiungere manualmente gli oggetti bit e di richiamare il comando compose().
tensor
tensor(other, inplace=False)
Tensore self con other.
Ricordate che nella convenzione little-endian l'operazione più a sinistra si trova in fondo al circuito. Per ulteriori informazioni, consultare la documentazione.
┌────────┐ ┌─────┐ ┌─────┐
q_0: ┤ bottom ├ ⊗ q_0: ┤ top ├ = q_0: ─┤ top ├──
└────────┘ └─────┘ ┌┴─────┴─┐
q_1: ┤ bottom ├
└────────┘Parametri
- other (QuantumCircuit) – L'altro circuito con cui tensurare questo circuito.
- inplace (bool) – Se
True, modificare l'oggetto. Altrimenti restituire il circuito composto.
Tipo di restituzione
QuantumCircuit | Nessuno
Esempi
from qiskit import QuantumCircuit
top = QuantumCircuit(1)
top.x(0);
bottom = QuantumCircuit(2)
bottom.cry(0.2, 0, 1);
tensored = bottom.tensor(top)
tensored.draw('mpl')
Risultati
Il circuito tensored (restituisce None se inplace=True).
Tipo di restituzione
Parametri
- other (QuantumCircuit)
- inplace (bool)
Come regole empiriche:
- Se hai un singolo
Operation,InstructionoGate, dovresti assolutamente usareappend()o_append(). - Se si dispone di un oggetto
QuantumCircuitche rappresenta una singola istruzione atomica per un circuito più grande che si vuole riutilizzare, probabilmente si vuole chiamareto_instruction()oto_gate()e poi applicare il risultato di questo al circuito usandoappend(). - Se si dispone di un circuito
QuantumCircuitche rappresenta un "livello" più ampio di un altro circuito, o che contiene variabili classiche tipizzate o un flusso di controllo, si dovrebbe usare il comandocompose()per unirlo a un altro circuito. tensor()è richiesto molto più raramente di quanto non lo siaappend()ocompose(). Internamente, è per lo più un wrapper intorno aadd_bits()ecompose().
Alcune potenziali insidie da cui guardarsi:
- Anche se si riutilizza una funzione personalizzata
Instructiondurante la costruzione del circuito, il transpiler dovrà generalmente “sviluppare” ogni sua chiamata nella sua scomposizione interna prima di iniziare a lavorarci sopra.to_instruction()Ciò non dovrebbe impedirti di utilizzare il modello "-plus-append()", poiché il transpiler migliorerà sotto questo aspetto col passare del tempo. compose()produrrà, per impostazione predefinita, un nuovo circuito per la compatibilità con le versioni precedenti. Questo è più costoso e di solito non è quello che si desidera, quindi si dovrebbe impostareinplace=True.- Sia
append()checompose()(ma non_append()) hanno uncopyargomento chiave il cui valore predefinito èTrue. In questi casi, le istanze in entrataOperationverranno copiate se Qiskit rileva che gli oggetti presentano caratteristiche di mutabilità (come l'assegnazione dei parametri dei gate). Se sei sicuro di non riutilizzare gli oggetti in altri contesti, dovresti impostarecopy=Falseper impedire questa copia, il che può comportare un notevole aumento della velocità nel caso di oggetti di grandi dimensioni.
Metodi per aggiungere istruzioni standard
La QuantumCircuit classe dispone di metodi di supporto che consentono di aggiungere a un circuito molte delle istruzioni e dei gate presenti nella libreria standard di Qiskit. In genere ciò equivale a creare manualmente un'istanza dell'oggetto qiskit.circuit.library in questione, per poi passarla a append() con gli argomenti rimanenti inseriti nei campi qargs cargs e come opportuno.
I seguenti metodi applicano al circuito operazioni speciali non unitarie Instruction :
QuantumCircuit metodo | |
|---|---|
barrier() | Barrier |
delay() | Delay |
initialize() | Initialize |
measure() | Measure |
reset() | Reset |
store() | Store |
Questi metodi applicano al circuito istanze unitarie Gate non controllate:
I seguenti metodi si applicano Gate alle istanze che sono anche gate controllati, e sono quindi sottoclassi dirette di ControlledGate:
QuantumCircuit metodo | |
|---|---|
ccx() | CCXGate |
ccz() | CCZGate |
ch() | CHGate |
cp() | CPhaseGate |
crx() | CRXGate |
cry() | CRYGate |
crz() | CRZGate |
cs() | CSGate |
csdg() | CSdgGate |
cswap() | CSwapGate |
csx() | CSXGate |
cu() | CUGate |
cx() | CXGate |
cy() | CYGate |
cz() | CZGate |
Infine, questi metodi applicano al circuito particolari porte generalizzate a controllo multiplo, spesso con sintesi avventate. Sono elencati in termini di gate di base che controllano, poiché la loro uscita esatta è spesso una versione sintetizzata di un gate.
Il resto di questa sezione è l'elenco delle API di tutti i singoli metodi; le tabelle precedenti sono dei riassunti i cui link portano al posto giusto.
barrier
barrier(*qargs, label=None)
Applicare Barrier. Se qargs è vuoto, si applica a tutti i qubit del circuito.
Parametri
- qargs (QubitSpecifier) – Specifica per uno o più argomenti di qubit.
- label (str) – L'etichetta stringa della barriera.
Risultati
maniglia alle istruzioni aggiunte.
Tipo di restituzione
ccx
ccx(control_qubit1, control_qubit2, target_qubit, ctrl_state=None)
CCXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come primo controllo.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come secondo controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
ccz
ccz(control_qubit1, control_qubit2, target_qubit, label=None, ctrl_state=None)
CCZGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come primo controllo.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come secondo controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '10'). Per impostazione predefinita, controlla lo stato '11'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
ch
ch(control_qubit, target_qubit, label=None, ctrl_state=None)
CHGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
cp
cp(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
CPhaseGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
crx
crx(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
CRXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
cry
cry(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
CRYGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
crz
crz(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
CRZGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
cs
cs(control_qubit, target_qubit, label=None, ctrl_state=None)
CSGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
csdg
csdg(control_qubit, target_qubit, label=None, ctrl_state=None)
CSdgGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
cswap
cswap(control_qubit, target_qubit1, target_qubit2, label=None, ctrl_state=None)
CSwapGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- target_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es.
'1'). L'impostazione predefinita è il controllo dello stato'1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
csx
csx(control_qubit, target_qubit, label=None, ctrl_state=None)
CSXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
cu
cu(theta, phi, lam, gamma, control_qubit, target_qubit, label=None, ctrl_state=None)
CUGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L' e angolo di rotazione del gate.
- phi (ParameterExpression |float) – L' e angolo di rotazione del gate.
- lam (ParameterExpression |float) – L' e angolo di rotazione del gate.
- gamma (ParameterExpression |float) – La fase globale applicata al gate U, se presente.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
cx
cx(control_qubit, target_qubit, label=None, ctrl_state=None)
CXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
cy
cy(control_qubit, target_qubit, label=None, ctrl_state=None)
CYGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
cz
cz(control_qubit, target_qubit, label=None, ctrl_state=None)
CZGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
dcx
dcx(qubit1, qubit2)
DCXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
delay
delay(duration, qarg=None, unit=None)
Applicare Delay. Se qarg è None, si applica a tutti i qubit. Quando si applica a più qubit, verranno creati ritardi con la stessa durata.
Parametri
- duration (Object) – durata del ritardo. Se si tratta di un elemento
Exprdeve essere un'espressione costante di tipoDuration. - qarg (Object) – per applicare questo ritardo.
- unit (str | None) – dell'unità di misura della durata, a meno che
durationnon sia unExprnel qual caso non deve essere specificato. Unità supportate:'s','ms','us','ns','ps', e'dt'. L'impostazione predefinita è'dt', ovvero un'unità di tempo intera che dipende dal backend di destinazione.
Risultati
maniglia alle istruzioni aggiunte.
Tipo di restituzione
Aumenti
CircuitError - se gli argomenti hanno un formato sbagliato.
ecr
ecr(qubit1, qubit2)
ECRGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il primo qubit a cui applicare il gate.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il secondo qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
h
h(qubit)
HGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
id
id(qubit)
IGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
initialize
initialize(params, qubits=None, normalize=False)
Inizializza i qubit in uno stato specifico.
L'inizializzazione dei qubit avviene innanzitutto riportando i qubit allo stato di , per poi richiamare StatePreparation la classe per prepararli in uno stato specificato. Entrambe queste operazioni sono descritte nelle Initialize istruzioni.
Parametri
-
params (Statevector | Sequence[complex] | str |int) –
Lo stato da inizializzare può essere uno dei seguenti.
- Vettore di stato o vettore di ampiezze complesse da inizializzare.
- Etichette degli stati di base degli autostati di Pauli Z, X, Y. Vedi
Statevector.from_label(). Si noti che l'ordine delle etichette è invertito rispetto all'indice del qubit a cui devono essere applicate. L'etichetta'01'"Example" inizializza il qubit zero a e il qubit uno a . - Un numero intero utilizzato come bitmap che indica quali qubit inizializzare a . Esempio: impostando params a 5 si inizializzeranno il qubit 0 e il qubit 2 a e il qubit 1 a .
-
qubits (Sequence[QubitSpecifier] | None) – Qubit da inizializzare. Se
Nonel'inizializzazione viene applicata a tutti i qubit del circuito. -
normalize (bool) – Normalizzare o meno una matrice di input a un vettore unitario.
Risultati
Un handle alle istruzioni create.
Esempi
Preparare un qubit nello stato .
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1)
circuit.initialize([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()Output:
┌──────────────────────────────┐
q_0: ┤ Initialize(0.70711,-0.70711) ├
└──────────────────────────────┘Inizializza due qubit a partire da una stringa nello stato . L'ordine delle etichette è invertito rispetto all'indice dei qubit. Maggiori informazioni sulle etichette relative agli stati di base sono disponibili in Statevector.from_label().
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.initialize('01', circuit.qubits)
circuit.draw()Output:
┌──────────────────┐
q_0: ┤0 ├
│ Initialize(0,1) │
q_1: ┤1 ├
└──────────────────┘Inizializzare due qubit da un array di ampiezze complesse.
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.initialize([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()Output:
┌────────────────────────────────────┐
q_0: ┤0 ├
│ Initialize(0,0.70711,-0.70711j,0) │
q_1: ┤1 ├
└────────────────────────────────────┘iswap
iswap(qubit1, qubit2)
iSwapGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il primo qubit a cui applicare il gate.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il secondo qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
mcp
mcp(lam, control_qubits, target_qubit, ctrl_state=None)
MCPhaseGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- lam (ParameterExpression |float) – L'angolo di rotazione.
- control_qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – I qubit utilizzati come controlli.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
mcrx
mcrx(theta, q_controls, q_target, use_basis_gates=False)
Applicare il gate di rotazione X a controllo multiplo
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – I qubit utilizzati come controlli.
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il qubit su cui agisce il gate.
- use_basis_gates (bool) – utilizzare le porte di base p, u, cx.
mcry
mcry(theta, q_controls, q_target, q_ancillae=None, mode=None, use_basis_gates=False)
Applicare il gate di rotazione Y a controllo multiplo
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – I qubit utilizzati come controlli.
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il qubit su cui agisce il gate.
- q_ancillae (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int] | Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – L'elenco dei qubit ausiliari.
- mode (str | None) – La modalità di implementazione da utilizzare.
- use_basis_gates (bool) – utilizzare le porte di base p, u, cx
mcrz
mcrz(lam, q_controls, q_target, use_basis_gates=False)
Applicare il gate di rotazione Z a controllo multiplo
Parametri
- lam (ParameterExpression |float) – L'angolo di rotazione.
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – I qubit utilizzati come controlli.
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il qubit su cui agisce il gate.
- use_basis_gates (bool) – utilizzare le porte di base p, u, cx.
mcx
mcx(control_qubits, target_qubit, ancilla_qubits=None, mode=None, ctrl_state=None)
MCXGateInvia la candidatura.
La porta multi-cX può essere implementata con diverse tecniche, che utilizzano un numero diverso di qubit ancilla e hanno una profondità di circuito variabile. Queste modalità sono:
'noancilla': Richiede 0 ancilla qubit.'recursion': Richiede 1 qubit ancilla se si utilizzano più di 4 controlli, altrimenti 0.'v-chain': Richiede 2 ancillas in meno rispetto al numero di qubit di controllo.'v-chain-dirty': Come per gli accessori puliti (ma il circuito sarà più lungo).
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
qiskit.circuit.quantumcircuit.QuantumCircuit.mcx() mode è deprecato a partire da Qiskit. 2.1 Verrà rimosso non prima di 3 mesi dalla data di rilascio. Invece, aggiungete un MCXGate generico al circuito e specificate il metodo di sintesi tramite hls_config nella transpilation. In alternativa, le decomposizioni specifiche sono disponibili su https://qisk.it/mcx.
Parametri
- control_qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – I qubit utilizzati come controlli.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
- ancilla_qubits (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int] | Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – I qubit utilizzati come ancillae, qualora la modalità lo richieda.
- mode (str | None) – La scelta della modalità, spiegata più sopra.
- ctrl_state (str |int | None) – Lo stato di controllo in decimale o come stringa di bit (ad es. '1'). Per impostazione predefinita, controlla lo stato '1'.
Risultati
Un handle alle istruzioni create.
Aumenti
- ValueError - se la modalità indicata non è nota o se sono stati passati troppi qubit ancilla.
- AttributeError - se non vengono passati qubit ancilla, ma ne sono necessari alcuni.
Tipo di restituzione
measure
measure(qubit, cbit)
Misurare un bit quantistico (qubit) nella base Z in un bit classico (cbit).
Quando si misura uno stato quantistico, un qubit viene proiettato nella base computazionale (Pauli Z) su o . Il bit classico cbit indica il risultato di tale proiezione come 0 o 1 rispettivamente. Questa operazione non è reversibile.
Parametri
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – qubit da misurare.
- cbit (Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]) – bit classico/i in cui inserire i risultati della misurazione, oppure un
expr.Varditypes.Uinttipo che indichi il clbit di destinazione.
Risultati
maniglia alle istruzioni aggiunte.
Tipo di restituzione
Aumenti
CircuitError - se gli argomenti hanno un formato sbagliato.
Esempi
In questo esempio, un qubit viene misurato e il risultato di tale misurazione viene memorizzato nel bit classico (solitamente espresso nei diagrammi come una doppia linea):
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1, 1)
circuit.h(0)
circuit.measure(0, 0)
circuit.draw() ┌───┐┌─┐
q: ┤ H ├┤M├
└───┘└╥┘
c: 1/══════╩═
0È possibile chiamare measure con gli elenchi qubits e cbits come scorciatoia per la misura uno a uno. Queste due forme producono risultati identici:
circuit = QuantumCircuit(2, 2)
circuit.measure([0,1], [0,1])circuit = QuantumCircuit(2, 2)
circuit.measure(0, 0)
circuit.measure(1, 1)Al posto degli elenchi, si può usare QuantumRegister e ClassicalRegister con la stessa logica.
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
qreg = QuantumRegister(2, "qreg")
creg = ClassicalRegister(2, "creg")
circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg, creg)Ciò equivale a:
circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg[0], creg[0])
circuit.measure(qreg[1], creg[1])ms
ms(theta, qubits)
MSGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – I qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
p
p(theta, qubit)
PhaseGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
pauli
pauli(pauli_string, qubits)
PauliGateInvia la candidatura.
Parametri
- pauli_string (str) – Una stringa che rappresenta l'operatore Pauli da applicare, ad esempio "XX".
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – I qubit a cui applicare questa porta logica.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
prepare_state
prepare_state(state, qubits=None, label=None, normalize=False)
Preparare i qubit in uno stato specifico.
Questa classe implementa uno stato che prepara l'unità. A differenza di initialize() non azzera prima i qubit.
Parametri
-
state (Statevector | Sequence[complex] | str |int) –
Lo stato da inizializzare può essere uno dei seguenti.
- Vettore di stato o vettore di ampiezze complesse da inizializzare.
- Etichette degli stati di base degli autostati di Pauli Z, X, Y. Vedi
Statevector.from_label(). Si noti che l'ordine delle etichette è invertito rispetto all'indice del qubit a cui devono essere applicate. L'etichetta di esempio “01” inizializza il qubit zero a e il qubit uno a . - Un numero intero utilizzato come bitmap che indica quali qubit inizializzare a . Esempio: impostando params a 5 si inizializzeranno il qubit 0 e il qubit 2 a e il qubit 1 a .
-
qubits (Sequence[QubitSpecifier] | None) – Qubit da inizializzare. Se
Nonel'inizializzazione viene applicata a tutti i qubit del circuito. -
label (str | None) – Un'etichetta opzionale per il cancello
-
normalize (bool) – Normalizzare o meno una matrice di input a un vettore unitario.
Risultati
Un handle all'istruzione che è stata appena inizializzata
Tipo di restituzione
Esempi
Preparare un qubit nello stato .
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1)
circuit.prepare_state([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()Output:
┌─────────────────────────────────────┐
q_0: ┤ State Preparation(0.70711,-0.70711) ├
└─────────────────────────────────────┘Preparare, a partire da una stringa, due qubit nello stato . L'ordine delle etichette è invertito rispetto all'indice dei qubit. Maggiori informazioni sulle etichette relative agli stati di base sono disponibili in Statevector.from_label().
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.prepare_state('01', circuit.qubits)
circuit.draw()Output:
┌─────────────────────────┐
q_0: ┤0 ├
│ State Preparation(0,1) │
q_1: ┤1 ├
└─────────────────────────┘Inizializzare due qubit da un array di ampiezze complesse
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.prepare_state([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()Output:
┌───────────────────────────────────────────┐
q_0: ┤0 ├
│ State Preparation(0,0.70711,-0.70711j,0) │
q_1: ┤1 ├
└───────────────────────────────────────────┘r
r(theta, phi, qubit)
RGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- phi (ParameterExpression |float) – L'angolo dell'asse di rotazione nel piano x-y.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
rcccx
rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit)
RC3XGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come primo controllo.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come secondo controllo.
- control_qubit3 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come terzo controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
rccx
rccx(control_qubit1, control_qubit2, target_qubit)
RCCXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come primo controllo.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit utilizzato/i come secondo controllo.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il o i qubit su cui agisce il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
reset
reset(qubit)
Ripristina i bit quantici allo stato predefinito.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – qubit da azzerare.
Risultati
all'istruzione aggiunta.
Tipo di restituzione
rv
rv(vx, vy, vz, qubit)
RVGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Rotazione attorno a un asse di rotazione arbitrario , dove è l'angolo di rotazione in radianti.
Parametri
- vx (ParameterExpression |float) – componente x dell'asse di rotazione.
- vy (ParameterExpression |float) – componente y dell'asse di rotazione.
- vz (ParameterExpression |float) – componente z dell'asse di rotazione.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
rx
rx(theta, qubit, label=None)
RXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione della saracinesca.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
rxx
rxx(theta, qubit1, qubit2)
RXXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
ry
ry(theta, qubit, label=None)
RYGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione della saracinesca.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
ryy
ryy(theta, qubit1, qubit2)
RYYGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione della saracinesca.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
rz
rz(phi, qubit)
RZGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- phi (ParameterExpression |float) – L'angolo di rotazione della saracinesca.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
rzx
rzx(theta, qubit1, qubit2)
RZXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione della saracinesca.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
rzz
rzz(theta, qubit1, qubit2)
RZZGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L'angolo di rotazione della saracinesca.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
s
s(qubit)
SGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
sdg
sdg(qubit)
SdgGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
store
store(lvalue, rvalue, /)
Memorizza il risultato dell'espressione classica in tempo reale rvalue nella posizione di memoria definita da lvalue.
Tipicamente lvalue sarà un nodo Var e rvalue sarà un nodo Expr da scrivere in esso, ma qualsiasi cosa che expr.lift() può portare a un nodo Expr è ammissibile in entrambi i posti e sarà chiamato su di essi.
Parametri
- lvalue (Any) – uno specificatore valido per una posizione di memoria nel circuito. In genere si tratta di un nodo
Varma si può anche scrivere suClbitoClassicalRegisterdi memoria, se l'hardware lo supporta. La posizione di memoria deve essere già presente nel circuito. - rvalue (Any) – un'espressione classica in tempo reale il cui risultato deve essere scritto nella posizione di memoria indicata.
Tipo di restituzione
La classe di supporto Instruction che rappresenta questa operazione.
Crea una nuova variabile nel circuito che può essere scritta con questo metodo.
swap
swap(qubit1, qubit2)
SwapGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il primo qubit a cui applicare il gate.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il secondo qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
sx
sx(qubit)
SXGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
sxdg
sxdg(qubit)
SXdgGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
t
t(qubit)
TGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
tdg
tdg(qubit)
TdgGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
u
u(theta, phi, lam, qubit)
UGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- theta (ParameterExpression |float) – L' e angolo di rotazione del gate.
- phi (ParameterExpression |float) – L' e angolo di rotazione del gate.
- lam (ParameterExpression |float) – L' e angolo di rotazione del gate.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
unitary
unitary(obj, qubits, label=None)
Applicare il cancello unitario specificato da obj a qubits.
Parametri
- obj (np.ndarray | Gate | BaseOperator) – Operatore unitario.
- qubits (Sequence[QubitSpecifier]) – I qubit del circuito a cui applicare la trasformazione.
- label (str | None) – Nome unitario per il backend [Predefinito: Nessuno].
Risultati
Il circuito quantistico.
Tipo di restituzione
Esempio
Applicare un gate specificato da una matrice unitaria a un circuito quantistico
from qiskit import QuantumCircuit
matrix = [[0, 0, 0, 1],
[0, 0, 1, 0],
[1, 0, 0, 0],
[0, 1, 0, 0]]
circuit = QuantumCircuit(2)
circuit.unitary(matrix, [0, 1])x
x(qubit, label=None)
XGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
- label (str | None) – L'etichetta della stringa del gate nel circuito.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
y
y(qubit)
YGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
z
z(qubit)
ZGateInvia la candidatura.
Per la forma matriciale completa di questo gate, vedere la documentazione del gate sottostante.
Parametri
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Il/i qubit a cui applicare il gate.
Risultati
Un handle alle istruzioni create.
Tipo di restituzione
Aggiunta del flusso di controllo ai circuiti
Flusso di controllo nei circuiti
Discussione sul modo in cui le operazioni di flusso di controllo sono rappresentate nell'intero contesto qiskit.circuit contesto.
QuantumCircuit metodo | Istruzione a flusso di controllo |
|---|---|
if_test() | IfElseOp con solo un True corpo |
if_else() | IfElseOp con entrambi True i False corpi |
while_loop() | WhileLoopOp |
switch() | SwitchCaseOp |
for_loop() | ForLoopOp |
box() | BoxOp |
break_loop() | BreakLoopOp |
continue_loop() | ContinueLoopOp |
QuantumCircuit dispone di metodi corrispondenti per tutte le operazioni di controllo del flusso supportate da Qiskit. Esistono due modi per richiamarli. Il primo è un wrapper di comodità molto semplice che accetta come QuantumCircuit argomenti i corpi dei blocchi delle istruzioni e si limita a costruire e aggiungere il corrispondente ControlFlowOp.
La seconda forma, che vi consigliamo vivamente di utilizzare per la creazione del flusso di controllo, è denominata "interfaccia builder". In questo caso, i metodi accettano solo il discriminante in tempo reale dell'operazione e restituiscono i gestori di contesto che si immettono utilizzando with. È quindi possibile utilizzare metodi standard QuantumCircuit all’interno di tali blocchi per costruire i corpi del flusso di controllo, e Qiskit terrà automaticamente traccia di quali risorse di dati sono necessarie per i blocchi interni, costruendo il flusso completo ControlFlowOp man mano che si esce dall’istruzione with . È molto più semplice e meno soggetto a errori costruire il flusso di controllo in modo programmatico in questo modo.
Quando si utilizza l'interfaccia del costruttore di flussi di controllo, a volte si può desiderare che un qubit sia incluso in un blocco, anche se non ha operazioni definite. In questo caso, è possibile utilizzare il metodo noop() metodo.
QuantumCircuit.has_control_flow_op()Per verificare se un circuito contiene un ControlFlowOp è possibile utilizzare il metodo di supporto.
box
box(body_or_annotations=Ellipsis, /, qubits=None, clbits=None, *, label=None, duration=None, unit=None, annotations=Ellipsis)
Crea un box di operazioni su questo circuito che vengono trattate atomicamente nel contesto più ampio.
Una "casella" è un costrutto del flusso di controllo che viene inserito incondizionatamente. Il contenuto della scatola si comporta come se l'inizio e la fine della scatola fossero delle barriere (vedi barrier()), tranne per il fatto che è consentito eseguire operazioni "fino in fondo" alla scatola. La casella è anche un ambito esplicito ai fini delle variabili, dei tratti e dei passaggi del compilatore.
Esistono due forme per richiamare questa funzione:
- Passare una
QuantumCircuitposizione eclbitsgliqubitselementi su cui agisce. In questo modulo, viene immediatamente creato unBoxOpe vi viene aggiunto il circuito come corpo. - Utilizzare in una dichiarazione
withsenzabody,qubitsoclbits. Questo è il "modulo dell'interfaccia del costruttore", in cui poi si utilizzano altri metodiQuantumCircuitall'interno dell'ambito Pythonwithper aggiungere istruzioni all'ambitobox. Questa è la forma preferita e molto meno soggetta a errori.
Esempi
Utilizzo dell'interfaccia del costruttore per aggiungere due caselle in sequenza. Le due caselle di questo circuito possono essere eseguite simultaneamente e la seconda inserisce esplicitamente una dipendenza dal flusso di dati sul qubit 8 per la durata della casella, anche se il qubit è inattivo.
from qiskit.circuit import QuantumCircuit, Annotation
class MyAnnotation(Annotation):
namespace = "my.namespace"
qc = QuantumCircuit(9)
with qc.box():
qc.cz(0, 1)
qc.cz(2, 3)
with qc.box([MyAnnotation()]):
qc.cz(4, 5)
qc.cz(6, 7)
qc.noop(8)Utilizzando la costruzione esplicita della scatola. Questo crea lo stesso circuito di cui sopra e dovrebbe indicare perché la forma precedente è preferibile per l'uso interattivo.
from qiskit.circuit import QuantumCircuit, BoxOp
body_0 = QuantumCircuit(4)
body_0.cz(0, 1)
body_0.cz(2, 3)
# Note that the qubit indices inside a body related only to the body. The
# association with qubits in the containing circuit is made by the ``qubits``
# argument to `QuantumCircuit.box`.
body_1 = QuantumCircuit(5)
body_1.cz(0, 1)
body_1.cz(2, 3)
qc = QuantumCircuit(9)
qc.box(body_0, [0, 1, 2, 3], [])
qc.box(body_1, [4, 5, 6, 7, 8], [])Parametri
- body_or_annotations (QuantumCircuit |Iterable[Annotation]) – il primo argomento posizionale non ha nome. Se viene passato come parametro
QuantumCircuitdi posizione, viene immediatamente utilizzato come corpo del riquadro, equbitsoccorre specificare anche eclbits. Se non viene specificato alcun parametro, oppure se viene specificato un iterabile diAnnotationoggetti, viene attivata la versione con gestore di contesto di questo metodo. - qubits (Sequence[QubitSpecifier] | None) – i qubit a cui applicare l'operazione
BoxOp, nella forma esplicita. - clbits (Sequence[ClbitSpecifier] | None) – i clbit a cui applicare il
BoxOp, nella forma esplicita. - label (str | None) – un'etichetta di stringa opzionale per l'istruzione.
- duration (None) – una durata esplicita facoltativa per il
BoxOp. I pass di pianificazione devono garantire che l'ambito in essi contenuto sia pianificato in modo da corrispondere a una durata prestabilita, inserendo eventuali ritardi se necessario. - unit (Literal['dt', 's', 'ms', 'us', 'ns', 'ps', 'expr'] | None) – l'unità del sito
duration. - annotations (Iterable[Annotation]) – tutti
Annotationgli oggetti che la scatola dovrebbe contenere. Quando questo metodo viene utilizzato nella forma "context-manager", questo argomento può invece essere passato come unico argomento posizionale.
break_loop
break_loop()
BreakLoopOpInvia la candidatura.
if_test()Se si utilizzano le forme "builder" del gestore di contesto, for_loop() o while_loop(), è possibile richiamare questo metodo solo se ci si trova all'interno di un contesto di ciclo, poiché altrimenti non è possibile determinare la "larghezza della risorsa" dell'operazione. Ciò porterebbe rapidamente a circuiti non validi, quindi se si sta cercando di costruire un corpo di ciclo riutilizzabile (senza i gestori di contesto), è necessario utilizzare anche la forma senza gestore di contesto di if_test() e if_else(). Si tenga presente che l'istruzione BreakLoopOp deve coprire tutte le risorse del ciclo che la contiene, non solo l'ambito immediato.
Risultati
Un handle all'istruzione creata.
Aumenti
CircuitError - se questo metodo è stato chiamato in un contesto di costruttore, ma non all'interno di un ciclo.
Tipo di restituzione
continue_loop
continue_loop()
ContinueLoopOpInvia la candidatura.
if_test()Se si utilizzano le forme "builder" del gestore di contesto, for_loop() o while_loop(), è possibile richiamare questo metodo solo se ci si trova all'interno di un contesto di ciclo, poiché altrimenti non è possibile determinare la "larghezza della risorsa" dell'operazione. Ciò porterebbe rapidamente a circuiti non validi, quindi se si sta cercando di costruire un corpo di ciclo riutilizzabile (senza i gestori di contesto), è necessario utilizzare anche la forma senza gestore di contesto di if_test() e if_else(). Si tenga presente che l'istruzione ContinueLoopOp deve coprire tutte le risorse del ciclo che la contiene, non solo l'ambito immediato.
Risultati
Un handle all'istruzione creata.
Aumenti
CircuitError - se questo metodo è stato chiamato in un contesto di costruttore, ma non all'interno di un ciclo.
Tipo di restituzione
for_loop
for_loop(indexset: Iterable[int], loop_parameter: Parameter | Var | None, body: None, qubits: None, clbits: None, *, label: str | None) → ForLoopContext
for_loop(indexset: Iterable[int], loop_parameter: Parameter | Var | None, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet
Creare un circuito for su questo circuito.
Esistono due modi per richiamare questa funzione. bodySe viene chiamata con tutti i suoi argomenti (con la possibile eccezione di label), creerà un ForLoopOp con il specificato. Se body (e qubits e clbits) non vengono passati, allora questo agisce come un gestore di contesto che, una volta avviato, fornisce una variabile di ciclo (a meno che non ne venga specificata una, nel qual caso verrà riutilizzata) e creerà automaticamente un ForLoopOp al termine dell'ambito. In questa forma, non è necessario tenere traccia dei qubit o dei clbit che si stanno utilizzando, poiché lo scope se ne occuperà automaticamente.
Ad esempio:
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 1)
with qc.for_loop(range(5)) as i:
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
with qc.if_test((0, True)):
qc.break_loop()Parametri
-
indexset (Iterable[int]) – Un insieme di numeri interi su cui eseguire il loop. Sempre necessario.
-
loop_parameter (Optional[Parameter|expr.Var]) –
Il parametro utilizzato all'interno di
bodya cui verranno assegnati i valori diindexset. Nella forma context-manager, se questo argomento non viene fornito, verrà allocato un parametro del ciclo e restituito come valore dell'istruzionewith. Questo viene legato al circuito solo se viene utilizzato all'interno del corpo.Se questo argomento è
Nonenella forma manuale di questo metodo,bodyverrà ripetuto una volta per ciascuno degli elementi diindexset, ma i loro valori verranno ignorati. -
body (Optional[QuantumCircuit]) – Il corpo del ciclo da eseguire ripetutamente. Omettere questa opzione per utilizzare la modalità context-manager.
-
qubits (Optional[Sequence[QubitSpecifier]]) – I qubit del circuito su cui deve essere eseguito il corpo del ciclo. Omettere questa opzione per utilizzare la modalità context-manager.
-
clbits (Optional[Sequence[ClbitSpecifier]]) – I bit del circuito su cui deve essere eseguito il corpo del ciclo. Omettere questa opzione per utilizzare la modalità context-manager.
-
label (Optional[str]) – L'etichetta stringa dell'istruzione nel circuito.
Risultati
a seconda della firma della chiamata, o un gestore di contesto per la creazione del ciclo for (che verrà automaticamente aggiunto al circuito alla fine del blocco), oppure un InstructionSet handle all'operazione di ciclo aggiunta.
Tipo di restituzione
InstructionSet oppure ForLoopContext
Aumenti
CircuitError - se viene utilizzata una convenzione di chiamata errata.
if_else
if_else(condition, true_body, false_body, qubits, clbits, label=None)
IfElseOpInvia la candidatura.
Questo metodo non ha un modulo associato di gestione del contesto, perché è già gestito dal metodo if_test() metodo. È possibile utilizzare la parte di else con qualcosa di simile:
from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Clbit()]
qc = QuantumCircuit(bits)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
with qc.if_test((bits[2], 0)) as else_:
qc.h(0)
with else_:
qc.x(0)Parametri
- condition (tuple[ClassicalRegister, int] | tuple[Clbit, int] | tuple[Clbit, bool]) – Una condizione da valutare in tempo reale durante l'esecuzione del circuito che, se vera, attiverà la valutazione di
true_body. Può essere specificato come una tupla di daClassicalRegisterconfrontare per verificare l'uguaglianza con un datoint, oppure come una tupla diClbitda confrontare con unboolo unint. - true_body (QuantumCircuit) – Il corpo del circuito da eseguire se
conditionè vero. - false_body (QuantumCircuit) – Il circuito da eseguire se
conditionè falso. - qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – I qubit del circuito su cui deve essere eseguito il condizionale if/else.
- clbits (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]]) – I bit del circuito su cui deve essere eseguito il comando if/else.
- label (str | None) – L'etichetta stringa dell'istruzione nel circuito.
Aumenti
CircuitError - Se la condizione fornita fa riferimento a Clbit esterni al circuito di chiusura.
Risultati
Un handle all'istruzione creata.
Tipo di restituzione
if_test
if_test(condition: tuple[ClassicalRegister | Clbit, int]) → IfContext
if_test(condition: tuple[ClassicalRegister | Clbit, int], true_body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet
Creare una dichiarazione if su questo circuito.
Esistono due modi per richiamare questa funzione. true_bodySe viene chiamata con tutti i suoi argomenti (con la possibile eccezione di label), creerà un IfElseOp con il specificato, e non ci sarà alcun ramo per la false condizione (vedi anche il if_else() metodo ). Tuttavia, se true_body (e qubits e clbits) non vengono passati, allora questo agisce come un gestore di contesto, che può essere utilizzato per costruire if istruzioni. Il valore restituito dall'istruzione with è un gestore di contesto concatenabile, che può essere utilizzato per creare blocchi successivi else . In questa forma, non è necessario tenere traccia dei qubit o dei clbit che si stanno utilizzando, poiché lo scope se ne occuperà automaticamente.
Ad esempio:
from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Qubit(), Clbit(), Clbit()]
qc = QuantumCircuit(bits)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 1)
with qc.if_test((bits[3], 0)) as else_:
qc.x(2)
with else_:
qc.h(2)
qc.z(2)Parametri
- condition (Tuple[Union[ClassicalRegister, Clbit], int]) – Una condizione da valutare in tempo reale durante l'esecuzione del circuito che, se vera, attiva la valutazione di
true_body. Può essere specificato come una tupla diClassicalRegisterda testare per l'uguaglianza con un datoint, oppure come una tupla diClbitda confrontare con unboolo unint. - true_body (Optional[QuantumCircuit]) – Il corpo del circuito da eseguire se
conditionè vero. - qubits (Optional[Sequence[QubitSpecifier]]) – I qubit del circuito su cui deve essere eseguito l'if/else.
- clbits (Optional[Sequence[ClbitSpecifier]]) – I bit del circuito su cui deve essere eseguito l'if/else.
- label (Optional[str]) – L'etichetta stringa dell'istruzione nel circuito.
Risultati
a seconda della firma della chiamata, o un gestore di contesto per la creazione del if blocco (che verrà automaticamente aggiunto al circuito alla fine del blocco), oppure un InstructionSet handle all'operazione condizionale aggiunta.
Tipo di restituzione
InstructionSet oppure IfContext
Aumenti
- CircuitError - Se la condizione fornita fa riferimento a Clbit esterni al circuito di chiusura.
- CircuitError - se viene utilizzata una convenzione di chiamata errata.
Risultati
Un handle all'istruzione creata.
switch
switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int], cases: None, qubits: None, clbits: None, *, label: str | None) → SwitchContext
switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int], cases: Iterable[tuple[Any, QuantumCircuit]], qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet
Create una struttura switch/case su questo circuito.
Esistono due modi per richiamare questa funzione. Se viene chiamata con tutti i suoi argomenti (con la possibile eccezione di label), creerà un SwitchCaseOp con la struttura case specificata. Se cases (e qubits e clbits) non vengono passati, allora questo agisce come un gestore di contesto, che creerà automaticamente un SwitchCaseOp al termine dell'ambito. In questa forma, non è necessario tenere traccia dei qubit o dei clbit che si stanno utilizzando, poiché lo scope se ne occuperà automaticamente.
Utilizzo di esempio:
from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister
qreg = QuantumRegister(3)
creg = ClassicalRegister(3)
qc = QuantumCircuit(qreg, creg)
qc.h([0, 1, 2])
qc.measure([0, 1, 2], [0, 1, 2])
with qc.switch(creg) as case:
with case(0):
qc.x(0)
with case(1, 2):
qc.z(1)
with case(case.DEFAULT):
qc.cx(0, 1)Parametri
- target (Union[ClassicalRegister, Clbit]) – Il valore classico da commutare uno. Deve essere di tipo intero.
- cases (Iterable[Tuple[Any, QuantumCircuit]]) – Una sequenza di specificatori di caso. Ogni tupla definisce un corpo di caso (il secondo elemento). Il primo elemento della tupla può essere un singolo valore intero, il valore speciale
CASE_DEFAULTo una tupla di più valori interi. Ciascuno dei valori interi verrà provato a turno; il controllo passerà quindi al corpo corrispondente alla prima corrispondenza.CASE_DEFAULTcorrisponde a tutti i valori possibili. Omettere nella forma context-manager. - qubits (Sequence[Qubit]) – I qubit del circuito su cui vengono eseguiti tutti i corpi dei casi. Omettere nella forma context-manager.
- clbits (Sequence[Clbit]) – I clbit del circuito su cui vengono eseguiti tutti i corpi dei casi. Omettere nella forma context-manager.
- label (Optional[str]) – L'etichetta stringa dell'istruzione nel circuito.
Risultati
Se usato in modalità context-manager, deve essere usato come risorsa with , che restituirà un oggetto che può essere inserito ripetutamente per produrre casi per l'istruzione switch. Se viene utilizzata la forma completa, restituisce un handle alle istruzioni create.
Tipo di restituzione
InstructionSet oppure SwitchCaseContext
Aumenti
CircuitError - se viene utilizzata una convenzione di chiamata errata.
while_loop
while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: None, qubits: None, clbits: None, *, label: str | None) → WhileLoopContext
while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet
Creare un circuito while su questo circuito.
Esistono due forme per richiamare questa funzione. Se chiamato con tutti i suoi argomenti (con la possibile eccezione di label), creerà un WhileLoopOp con il body dato. Se body (e qubits e clbits) non vengono passati, agisce come un gestore di contesto, che costruirà automaticamente un WhileLoopOp al termine dell'ambito. In questa forma, non è necessario tenere traccia dei qubit o dei clbit utilizzati, perché l'ambito se ne occuperà per voi.
Utilizzo di esempio:
from qiskit.circuit import QuantumCircuit, Clbit, Qubit
bits = [Qubit(), Qubit(), Clbit()]
qc = QuantumCircuit(bits)
with qc.while_loop((bits[2], 0)):
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)Parametri
- condition (Tuple[Union[ClassicalRegister, Clbit], int]) – Una condizione di uguaglianza da verificare prima dell'esecuzione di
body. Il lato sinistro della condizione deve essere aClassicalRegistero aClbite il lato destro deve essere un intero o un booleano. - body (Optional[QuantumCircuit]) – Il corpo del ciclo da eseguire ripetutamente. Omettere questa opzione per utilizzare la modalità context-manager.
- qubits (Optional[Sequence[Qubit]]) – I qubit del circuito su cui deve essere eseguito il corpo del ciclo. Omettere questa opzione per utilizzare la modalità context-manager.
- clbits (Optional[Sequence[Clbit]]) – I bit del circuito su cui deve essere eseguito il corpo del ciclo. Omettere questa opzione per utilizzare la modalità context-manager.
- label (Optional[str]) – L'etichetta stringa dell'istruzione nel circuito.
Risultati
Se usato in modalità context-manager, deve essere usato come risorsa with , che dedurrà il contenuto del blocco e gli operandi all'uscita. Se viene utilizzata la forma completa, restituisce un handle alle istruzioni create.
Tipo di restituzione
InstructionSet oppure WhileLoopContext
Aumenti
CircuitError - se viene utilizzata una convenzione di chiamata errata.
noop
noop(*qargs)
Contrassegnare i qubit dati come utilizzati nell'ambito corrente, senza aggiungere un'operazione.
Questo non ha alcun effetto (se non quello di sollevare un'eccezione in caso di input non valido) quando viene chiamato nell'ambito superiore di un oggetto QuantumCircuit. All'interno di un costruttore di flussi di controllo, questo fa sì che il qubit venga "usato" dal blocco di flusso di controllo, se non è già usato, senza aggiungere ulteriori operazioni su di esso.
Ad esempio:
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(3)
with qc.box():
# This control-flow block will only use qubits 0 and 1.
qc.cx(0, 1)
with qc.box():
# This control-flow block will contain only the same operation as the previous
# block, but it will also mark qubit 2 as "used" by the box.
qc.cx(0, 1)
qc.noop(2)Parametri
*qargs ( Qubit | QuantumRegister | int | slice | Sequence* [ Qubit | int ]* ) – elenco variadico di specificatori di qubit validi. Qualsiasi elemento che possa essere interpretato come un qubit o un insieme di qubit è valido per ciascun argomento in questo contesto.
Aumenti
CircuitError - se un qubit richiesto non è valido per il circuito.
has_control_flow_op
has_control_flow_op()
Verifica se il circuito contiene un'istanza di ControlFlowOp tra le sue operazioni.
Tipo di restituzione
Conversione dei circuiti in altri oggetti
Come illustrato nella sezione “Metodi per aggiungere operazioni generali ”, è possibile convertire un circuito in un Instruction o in un Gate utilizzando due metodi ausiliari.
to_instruction
to_instruction(parameter_map=None, label=None)
Crea un Instruction con questo circuito.
circuit_to_instruction()
Il driver alla base di questo metodo.
Parametri
- parameter_map (dict[Parameter, ParameterExpression |float] | None) – Per i circuiti parametrizzati, una corrispondenza tra i parametri del circuito e i parametri da utilizzare nell'istruzione. Se il valore è None, anche i parametri del circuito esistenti contribuiranno a parametrizzare l'istruzione.
- label (str | None) – Etichetta opzionale per il cancello.
Risultati
un'istruzione composita che incapsula questo circuito (può essere
dorso decomposto).
Tipo di restituzione
to_gate
to_gate(parameter_map=None, label=None)
Crea un Gate con questo circuito. Il circuito deve agire esclusivamente sui qubit e contenere solo operazioni unitarie.
circuit_to_gate()
Il driver alla base di questo metodo.
Parametri
- parameter_map (dict[Parameter, ParameterExpression |float] | None) – Per i circuiti parametrizzati, una corrispondenza tra i parametri del circuito e i parametri da utilizzare nel gate.
NoneIn tal caso, anche i parametri del circuito esistente determineranno le caratteristiche del gate. - label (str | None) – Etichetta opzionale per il cancello.
Risultati
un gate composito che racchiude questo circuito (può essere nuovamente scomposto).
Tipo di restituzione
Inoltre, è possibile convertire l'intero circuito nella DAGCircuit rappresentazione:
to_dag
to_dag(*, copy_operations=True)
Converti questo circuito in un DAGCircuit.
Si tratta di un semplice wrapper attorno a circuit_to_dag().
Parametri
copy_operations (bool) – se eseguire una copia profonda delle singole istruzioni. Se impostato su False, l'operazione è più economica, ma le mutazioni alle istruzioni nel DAG influenzeranno il circuito originale.
Risultati
un DAG che rappresenta questo stesso circuito.
Tipo di restituzione
Metodi di mutazione ausiliaria
Esistono due metodi di livello superiore su QuantumCircuit per aggiungere misure alla fine di un circuito. Si noti che, per impostazione predefinita, questi aggiungono anche un registro supplementare.
measure_active
measure_active(inplace=True)
Aggiunge la misura a tutti i qubit non inattivi. Crea un nuovo ClassicalRegister con una dimensione pari al numero di qubit non inattivi da misurare.
Restituisce un nuovo circuito con misure se inplace=False.
Parametri
inplace (bool) – Tutte le misure in loco o il ritorno di un nuovo circuito.
Risultati
Restituisce il circuito con le misure quando inplace = False.
Tipo di restituzione
measure_all
measure_all(inplace=True, add_bits=True)
Aggiunge la misura a tutti i qubit.
Per impostazione predefinita, aggiunge nuovi bit classici in un file ClassicalRegister per memorizzare queste misure. Se add_bits=False, i risultati delle misure saranno invece memorizzati nei bit classici già esistenti, con il qubit n che viene misurato nel bit classico n.
Restituisce un nuovo circuito con misure se inplace=False.
Parametri
- inplace (bool) – Tutte le misure in loco o il ritorno di un nuovo circuito.
- add_bits (bool) – Se aggiungere nuovi bit per memorizzare i risultati.
Risultati
Restituisce il circuito con le misure quando inplace=False.
Tipo di restituzione
Aumenti
CircuitError - se add_bits=False ma non ci sono abbastanza bit classici.
Esistono anche due metodi “sottrattivi” su QuantumCircuit . RemoveFinalMeasurementsQuesto non è un caso d'uso per cui QuantumCircuit è stato progettato; in genere è sufficiente utilizzare copy_empty_like() al posto di clear()ed eseguire remove_final_measurements() come sua forma di passaggio del transpiler.
clear
clear()
Cancellare tutte le istruzioni in sé.
La cancellazione dei circuiti manterrà i metadati.
Un metodo per produrre un nuovo circuito senza istruzioni e con lo stesso tracciamento dei dati digitati quantistici e classici, ma senza mutare il circuito originale.
Tipo di restituzione
Nessuna
remove_final_measurements
remove_final_measurements(inplace=True)
Rimuove le misure finali e le barriere su tutti i qubit, se presenti. Cancella i registri classici utilizzati per memorizzare i valori di queste misure che diventano inattivi in seguito a questa operazione e cancella i bit classici che sono referenziati solo dai registri rimossi o che non sono referenziati affatto ma sono diventati inattivi in seguito a questa operazione.
Le misure e le barriere sono considerate definitive se non sono seguite da altre operazioni (a parte altre misure o barriere)
Questo metodo ha un comportamento piuttosto complesso, in particolare per quanto riguarda la rimozione dei nuovi bit e registri classici inattivi. È molto più efficiente evitare di aggiungere dati classici non necessari in primo luogo, piuttosto che cercare di rimuoverli in seguito.
Un passaggio di transpiler che elimina le misure e le barriere finali. Questo non rimuove i dati classici. Se questo è il vostro obiettivo, potete chiamarlo con:
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes import RemoveFinalMeasurements
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.barrier()
qc.measure([0, 1], [0, 1])
pass_ = RemoveFinalMeasurements()
just_bell = pass_(qc)Parametri
inplace (bool) – Tutte le misure sono state rimosse in loco o restituite al nuovo circuito.
Risultati
Restituisce il circuito risultante se inplace=False, altrimenti Nessuno.
Tipo di restituzione
Proprietà del circuito
Metriche di circuito semplici
Quando si costruiscono circuiti quantistici, esistono diverse proprietà che aiutano a quantificare la "dimensione" dei circuiti e la loro capacità di essere eseguiti su un dispositivo quantistico rumoroso. Alcuni di questi, come il numero di qubit, sono di immediata comprensione, mentre altri, come la profondità e il numero di componenti del tensore, richiedono qualche spiegazione in più. Qui spiegheremo tutte queste proprietà e, in preparazione alla comprensione di come i circuiti cambiano quando vengono eseguiti su dispositivi reali, evidenzieremo le condizioni in cui cambiano.
Si consideri il seguente circuito:
from qiskit import QuantumCircuit
qc = QuantumCircuit(12)
for idx in range(5):
qc.h(idx)
qc.cx(idx, idx+5)
qc.cx(1, 7)
qc.x(8)
qc.cx(1, 9)
qc.x(7)
qc.cx(1, 11)
qc.swap(6, 11)
qc.swap(6, 9)
qc.swap(6, 10)
qc.x(6)
qc.draw('mpl')
Dal grafico è facile vedere che questo circuito ha 12 qubit e un insieme di porte Hadamard, CNOT, X e SWAP. Ma come quantificare questo aspetto in modo programmatico? Poiché possiamo eseguire gate a singolo qubit su tutti i qubit simultaneamente, il numero di qubit in questo circuito è uguale al numero di qubit del circuito width() del circuito:
assert qc.width() == 12Si può anche ottenere il numero di qubit direttamente usando num_qubits:
assert qc.num_qubits == 12Per un circuito quantistico composto da soli qubit, la larghezza del circuito è pari al numero di qubit. Questa è la definizione utilizzata nell'informatica quantistica. Tuttavia, per circuiti più complicati con registri classici e porte a controllo classico, questa equivalenza viene meno. Per questo motivo, d'ora in poi non ci riferiremo al numero di qubit di un circuito quantistico come alla sua larghezza.
È anche semplice ottenere il numero e il tipo di porte di un circuito usando count_ops():
qc.count_ops()OrderedDict([('cx', 8), ('h', 5), ('x', 3), ('swap', 3)])Si può anche ottenere solo il conteggio grezzo delle operazioni, calcolando i circuiti size():
assert qc.size() == 19count_ops
count_ops()
Contare ogni tipo di operazione nel circuito.
Risultati
Una ripartizione del numero di operazioni per ciascuna tipologia, ordinata in base all'importo.
Tipo di restituzione
OrderedDict [ str, int ]
depth
depth(filter_function=<function QuantumCircuit.<lambda>>)
Profondità del circuito di ritorno (cioè la lunghezza del percorso critico).
La profondità di un circuito quantistico misura quanti "strati" di porte quantistiche, eseguiti in parallelo, sono necessari per completare la computazione definita dal circuito. Poiché le porte quantistiche richiedono tempo per essere implementate, la profondità di un circuito corrisponde approssimativamente alla quantità di tempo che il computer quantistico impiega per eseguire il circuito.
Questa operazione non è ben definita se il circuito contiene operazioni di flusso di controllo.
Parametri
filter_function (Callable[[CircuitInstruction], bool]) – Una funzione che determina quali istruzioni vengono conteggiate per aumentare la profondità. Dovrebbe accettare come unico parametro di posizione un CircuitInstruction. Le istruzioni alle quali la funzione ritorna False vengono ignorate nel calcolo della profondità del circuito. Per impostazione predefinita, esclude le “direttive”, come ad esempio Barrier.
Risultati
Profondità del circuito.
Tipo di restituzione
Esempi
Calcolo semplice della profondità totale del circuito:
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(4)
qc.h(0)
qc.cx(0, 1)
qc.h(2)
qc.cx(2, 3)
assert qc.depth() == 2Modifica dell'esempio precedente per calcolare solo la profondità delle porte multi-qubit:
assert qc.depth(lambda instr: len(instr.qubits) > 1) == 1get_instructions
get_instructions(name)
Ottenere le istruzioni corrispondenti al nome.
Parametri
name (str) – Il nome dell'istruzione da recuperare.
Risultati
elenco di (istruzioni, qarg, cargs).
Tipo di restituzione
num_connected_components
num_connected_components(unitary_only=False)
In quanti sottocircuiti non ingarbugliati può essere fattorizzato il circuito.
Parametri
unitary_only (bool) – Calcolo della sola parte unitaria del grafo.
Risultati
Numero di componenti collegati nel circuito.
Tipo di restituzione
num_nonlocal_gates
num_nonlocal_gates()
Restituzione del numero di porte non locali (cioè che coinvolgono 2+ qubit).
Sono incluse anche le porte condizionali non locali.
Tipo di restituzione
num_tensor_factors
num_tensor_factors()
Calcola il numero di fattori tensoriali solo nella parte unitaria (quantistica) del circuito.
Note
Questo è presente per la compatibilità all'indietro e sarà rimosso in una futura versione di Qiskit. Si dovrebbe invece chiamare num_unitary_factors.
Tipo di restituzione
num_unitary_factors
num_unitary_factors()
Calcola il numero di fattori tensoriali solo nella parte unitaria (quantistica) del circuito.
Tipo di restituzione
size
size(filter_function=<function QuantumCircuit.<lambda>>)
Restituisce il numero totale di istruzioni nel circuito.
Parametri
filter_function (callable) – una funzione per filtrare alcune istruzioni. Deve prendere come input una tupla di (Istruzione, elenco(Qubit), elenco(Clbit)). Per impostazione predefinita, filtra le "direttive", come barriera o snapshot.
Risultati
Numero totale di operazioni al cancello.
Tipo di restituzione
width
width()
Restituisce il numero di qubit più clbit nel circuito.
Risultati
Larghezza del circuito.
Tipo di restituzione
Accesso alle informazioni sulla programmazione
Se un QuantumCircuit è stato programmato come parte di una pipeline di transpilazione, è possibile accedere alle informazioni sulla tempistica dei singoli qubit. Le informazioni sulla temporizzazione dell'intero circuito sono disponibili con il metodo estimate_duration() metodo e op_start_times attributo.
estimate_duration
estimate_duration(target, unit='s')
Stimare la durata di un circuito programmato
Questo metodo calcola la stima della durata del circuito trovando il percorso di durata maggiore nel circuito in base alle durate fornite da un determinato target. Questo metodo funziona solo per circuiti semplici che non hanno un flusso di controllo o altre operazioni classiche di feed-forward.
Parametri
- target (Target) – L'istanza
Targetche contiene le durate delle istruzioni: se per il target mancano i dati relativi alla durata di una qualsiasi delle istruzioni presenti nel circuito,QiskitErrorverrà generata un'eccezione. Dovrebbe trattarsi dello stesso oggetto di destinazione utilizzato come destinazione per la transpilazione. - unit (str) – L'unità in cui restituire la durata. Il valore predefinito è "s" per i secondi, ma può essere un prefisso SI supportato per i secondi restituiti. Ad esempio, impostando questo valore su "n", il risultato sarà espresso in unità di nanosecondi. I valori supportati di questo tipo sono "f", "p", "n", "u", "µ", "m", "k", "M", "G", "T" e "P". Inoltre, viene accettato anche il valore "dt" per ottenere un numero intero in unità di "dt". Affinché questo funzioni, "dt" deve essere specificato in
target.
Risultati
La durata stimata per l'esecuzione di un singolo scatto del circuito nell'unità specificata.
Aumenti
QiskitError - Se il circuito non è programmato o contiene altri dettagli che impediscono di calcolare una durata stimata (come un ritardo parametrizzato).
Tipo di restituzione
qubit_duration
qubit_duration(*qubits)
Restituisce la durata tra l'ora di inizio e di fine della prima e dell'ultima istruzione, esclusi i ritardi, sui qubit forniti. L'unità di misura del tempo è self.unit.
Parametri
*qubits ( Qubit | int ) – Qubit all'interno self da includere.
Risultati
Restituisce la durata tra il primo avvio e l'ultimo arresto delle istruzioni non ritardate
Tipo di restituzione
qubit_start_time
qubit_start_time(*qubits)
Restituisce l'ora di inizio della prima istruzione, esclusi i ritardi, sui qubit forniti. L'unità di misura del tempo è self.unit.
Restituisce 0 se non ci sono istruzioni sui qubit
Parametri
- *qubit - Qubit all'interno di
selfda includere. Per i qubit sono ammessi numeri interi, che indicano - self.qubits. (indices of)
Risultati
Restituisce il tempo di inizio della prima istruzione, esclusi i ritardi, sui qubit
Aumenti
CircuitError - se self è un circuito non ancora programmato.
Tipo di restituzione
qubit_stop_time
qubit_stop_time(*qubits)
Restituisce il tempo di arresto dell'ultima istruzione, esclusi i ritardi, sui qubit forniti. L'unità di misura del tempo è self.unit.
Restituisce 0 se non ci sono istruzioni sui qubit
Parametri
- *qubit - Qubit all'interno di
selfda includere. Per i qubit sono ammessi numeri interi, che indicano - self.qubits. (indices of)
Risultati
Restituisce il tempo di arresto dell'ultima istruzione, escludendo i ritardi, sui qubit
Aumenti
CircuitError - se self è un circuito non ancora programmato.
Tipo di restituzione
Circuiti astratti e fisici
I circuiti rappresentano un'astrazione di livello piuttosto basso degli algoritmi quantistici. Tuttavia, anche all'interno di questo contesto esistono delle distinzioni. I programmatori quantistici desiderano spesso utilizzare un'ampia gamma di porte logiche e istruzioni, e lavorare in un contesto in cui tutti i qubit interagiscono tra loro. L'hardware quantistico, tuttavia, dispone in genere di un insieme limitato di porte native, e solo determinate coppie di qubit hardware possono interagire tra loro. Chiamiamo questi due regimi rispettivamente «circuiti astratti» e «circuiti fisici».
Qiskit ha due modi per distinguere un circuito destinato a essere fisico. Si tratta di un controllo confuso, per ragioni storiche; in origine, Qiskit non ha mai fatto questa distinzione (ecco perché transpile() si chiama così e non compile!). Il modo più esplicito è attraverso l'attributo layout dei circuiti; se è impostato, il circuito è certamente inteso come fisico. Il metodo più vecchio, più implicito, è quello dei metadati degli oggetti e dei Qubit oggetti e QuantumRegister istanze del circuito. Un circuito può essere considerato (come giudicato da diversi passaggi di transpiler) come fisico solo se contiene esattamente un registro quantistico, che è chiamato q e possiede tutti i qubit del circuito in ordine di indice. Sempre per ragioni storiche, questo è il valore predefinito per la forma QuantumCircuit(int [, int]) del costruttore predefinito.
Normalmente, si crea un oggetto QuantumCircuit e lo si costruisce in senso astratto (indipendentemente dai metadati dei qubit). Si chiama quindi transpile() per compilare il circuito in un circuito supportato dall'hardware. Tuttavia, nei casi in cui si voglia scrivere un circuito efficiente dal punto di vista dell'hardware fin dall'inizio, è possibile evitare l'intera infrastruttura di compilazione utilizzando il metodo ensure_physical() metodo. In questo modo si garantisce che, indipendentemente da come sono stati definiti i metadati iniziali dei qubit, tutti i requisiti affinché il circuito sia considerato fisico saranno soddisfatti, con gli indici dei qubit mappati sui qubit hardware.
Per un controllo più completo sulla scelta della mappatura e dell'instradamento da virtuale a fisico, consultare le fasi di layout e instradamento <transpiler-preset-stage-routing> delle pipeline di compilazione delle preimpostazioni.
ensure_physical
ensure_physical(num_qubits=None, *, apply_layout=True)
Mettere questo circuito in forma fisica canonica, con il numero di qubit indicato, se non lo è già.
Diversi passaggi del transpiler Qiskit hanno senso solo se applicati a circuiti definiti in termini di qubit fisici. Se si è costruito manualmente un circuito in cui gli indici dei qubit corrispondono ai qubit fisici, utilizzare questa funzione per assicurarsi che i metadati del circuito corrispondano alla forma fisica canonica. Ciò significa sostituire i dati dei qubit con un singolo registro proprietario chiamato "q", e (facoltativamente) impostare il campo del circuito per collegare questi qubit fisici con quelli virtuali originali layout del circuito per collegare questi qubit fisici con quelli virtuali originali.
Se il circuito non ha già un layout, questo metodo (con apply_layout=True) è equivalente all'applicazione del metodo di layout banale completo della pipeline di compilazione preimpostata.
Se il circuito è già canonicamente fisico, non gli succede nulla. Questo metodo non può modificare il numero di qubit nel circuito se questo ne ha già uno layout set.
Parametri
- num_qubits (int | None) – se indicato, espandere il circuito con accessori fino a questa dimensione. Gli ancillas saranno sempre gli indici dei qubit più alti del circuito. Se non viene dato (impostazione predefinita), il circuito rimane della stessa larghezza. Questa opzione non può essere impostata se il circuito è già stato realizzato come un
layout. - apply_layout (bool) – se vero (l'impostazione predefinita), imposta l'attributo
layoutdel circuito, in modo che il circuito appaia come se fosse stato tracciato con il layout "banale", compresa l'espansione dell'ancilla, per un backend di larghezzanum_qubits. Questo non ha alcun effetto se il circuito aveva già unalayout.
Risultati
se il circuito è stato modificato per renderlo fisico.
Aumenti
- ValueError - se
num_qubitsè troppo piccolo per il circuito. - CircuitError - se
num_qubitsè impostato per tentare di espandere il circuito, ma il circuito ha già un layout impostato.
Tipo di restituzione
estimate_fidelity
estimate_fidelity(target)
Stimare la fedeltà di un circuito fisico.
Questa funzione calcolerà il prodotto dei tassi di errore di ciascun gate del circuito per stimare la fedeltà del circuito:
..matematica::
etichetta
fedeltà stimata del circuito
prod_ {g in text{gates}} bigl(1 - nome_operatore {error} (g)bigr)
dove è il tasso di errore nel target per l'istruzione proveniente dal circuito nel target. Se il circuito non è fisico, ovvero se nessuna istruzione presente nel circuito (come "operation" e "qargs") è presente nel target, verrà restituito None. Questo metodo non è finalizzato a fornire una simulazione realistica della fedeltà di esecuzione su hardware reale. È stato progettato per fornire una stima del funzionamento del transpiler, tenendo conto del grado di fedeltà delle varie euristiche utilizzate nel suo funzionamento. In genere è utile solo per confrontare tra loro i risultati di diverse compilazioni, al fine di valutare quale di essi garantirebbe un'esecuzione di qualità superiore sull'hardware.
Parametri
target (Target) – L'istanza Target su cui verrà eseguito il circuito e che verrà utilizzata per ottenere i tassi di errore relativi alle istruzioni presenti nel circuito.
Risultati
La fedeltà stimata dell'esecuzione del circuito sul bersaglio specificato. Se una qualsiasi istruzione nel circuito non è presente nel target
Aumenti
QiskitError – Se il circuito contiene operazioni relative al flusso di controllo.
Tipo di restituzione
float | Nessuno
Metodi simili alle istruzioni
QuantumCircuit contiene inoltre un numero limitato di metodi che, nei dettagli, sono molto Instructionsimili a... Potresti ottenere una migliore integrazione e un supporto API più ampio se prima convertissi il tuo circuito in un Instruction (to_instruction()) o Gate in un (to_gate()), a seconda dei casi, e poi chiamassi il metodo corrispondente.
control
control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)
Restituisci la versione controllata di questo circuito.
Il circuito originale viene convertito in una porta logica, e il circuito risultante contiene la versione controllata di tale porta. Questo gate controllato viene implementato come ControlledGate quando annotated è False, e come AnnotatedOperation quando annotated è True.
qiskit.circuit.quantumcircuit.QuantumCircuit.control()L'argomento annotated è deprecato a partire dalla versione Qiskit 2.3. Verrà rimosso in Qiskit 3.0. Il metodo QuantumCircuit.control() non accetta più annotated=None. Il nuovo valore predefinito è annotated=True, che rappresenta il gate controllato nel nuovo circuito quantistico come un gate controllato ( AnnotatedOperation ), a meno che non esista già una classe dedicata per i gate controllati. È possibile impostare esplicitamente annotated=False per mantenere il comportamento precedente. Tuttavia, si consiglia di utilizzare annotated=True, poiché rimanda la costruzione del circuito controllato al transpiler e consente inoltre ulteriori ottimizzazioni del gate controllato (che in genere portano a circuiti di qualità superiore).
Parametri
- num_ctrl_qubits (int) – Numero di controlli da aggiungere. Il valore predefinito è
1. - label (str | None) – Etichetta opzionale per assegnare un nome al gate controllato per la visualizzazione. Il valore predefinito è
None. Ignorato se il gate controllato è implementato come operazione annotata. - ctrl_state (str |int | None) – Lo stato di controllo del gate, specificato come numero intero o stringa di bit (ad esempio )
"110". SeNone, il valore predefinito è lo stato2**num_ctrl_qubits - 1tutto uno. - annotated (bool | None) – Indica se il gate controllato deve essere implementato come gate controllato o come operazione annotata.
Risultati
La versione controllata di questo circuito.
Tipo di restituzione
Aumenti
CircuitError - Se il circuito contiene un'operazione non unitaria e non può essere controllato.
inverse
inverse(annotated=False)
Invertire (prendere l'adjoint di) questo circuito.
Ciò avviene invertendo ricorsivamente tutti i gate.
Parametri
annotated (bool) – indica se il gate inverso può essere implementato come gate annotato.
Risultati
il circuito invertito
Tipo di restituzione
Aumenti
CircuitError - se il circuito non può essere invertito.
Esempi
Input:
┌───┐
q_0: ┤ H ├─────■──────
└───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
└──────────┘Output:
┌───┐
q_0: ──────■──────┤ H ├
┌─────┴─────┐└───┘
q_1: ┤ RX(-1.57) ├─────
└───────────┘power
power(power, matrix_power=False, annotated=False)
Aumentare questo circuito alla potenza di power.
Se power è un numero intero positivo e sia matrix_power che annotated sono False, l'implementazione si limita a chiamare repeat. Altrimenti, il circuito viene convertito in un gate e viene restituito un nuovo circuito, contenente questo gate elevato alla potenza indicata. Il gate elevato alla potenza data è implementato come gate unitario se annotated è False o come operazione annotata se annotated è True.
Parametri
- power (float) – Il potere di elevare questo circuito a.
- matrix_power (bool) – indica se il gate di potenza interno può essere implementato come gate unitario.
- annotated (bool) – indica se il power gate interno può essere implementato come operazione annotata.
Aumenti
CircuitError - Se il circuito deve essere convertito in un gate unitario, ma non è unitario.
Risultati
Un circuito che implementa questo circuito elevato alla potenza di power.
Tipo di restituzione
repeat
repeat(reps, *, insert_barriers=False)
Ripetere questo circuito reps volte.
Parametri
- reps (int) – La frequenza con cui il circuito deve essere ripetuto.
- insert_barriers (bool) – Se includere barriere tra le ripetizioni del circuito.
Risultati
Un circuito contenente reps ripetizioni di questo circuito.
Tipo di restituzione
reverse_ops
reverse_ops()
Invertire il circuito invertendo l'ordine delle istruzioni.
Ciò avviene invertendo ricorsivamente tutte le istruzioni. Non inverte (adjoint) alcun gate.
Risultati
il circuito invertito.
Tipo di restituzione
Esempi
Input:
┌───┐
q_0: ┤ H ├─────■──────
└───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
└──────────┘Output:
┌───┐
q_0: ─────■──────┤ H ├
┌────┴─────┐└───┘
q_1: ┤ RX(1.57) ├─────
└──────────┘Visualizzazione
Qiskit include alcuni strumenti di disegno per dare una rapida idea dell'aspetto del circuito. Questo strumento è destinato principalmente alla produzione di un disegno Matplotlib - o un disegno basato sul testo. Esiste anche un backend LaTeX, meno ricco di funzionalità, per il disegno, ma serve solo per circuiti semplici e non viene mantenuto altrettanto attivamente.
La documentazione principale per tutti gli strumenti di visualizzazione di Qiskit.
draw
draw(output=None, scale=None, filename=None, style=None, interactive=False, plot_barriers=True, reverse_bits=None, justify=None, vertical_compression='medium', idle_wires=None, with_layout=True, fold=None, ax=None, initial_state=False, cregbundle=None, wire_order=None, expr_len=30, measure_arrows=None, barrier_label_len=16)
Disegnare il circuito quantistico. Utilizzare il parametro di output per scegliere il formato del disegno:
text
Arte ASCII TextDrawing che può essere visualizzata nella console.
mpl
Immagini con colori generati esclusivamente in Python utilizzando matplotlib.
latex
Immagini di alta qualità raccolte tramite LaTeX.
Per come è stato progettato, questo richiamerà una versione di sistema installata di pdflatex in base a un input arbitrario dell'utente (ad esempio per eseguire codice personalizzato in Instruction.label), pertanto dovrebbe essere utilizzato solo con input attendibili.
latex_source
Output grezzo e non compilato di LaTeX. Questo è il codice sorgente di ciò che verrebbe visualizzato dal programma latex di disegno.
Il supporto per Expr nodi nei campi condizioni e SwitchCaseOp.target è preliminare e incompleto. I cassetti text e mpl faranno un tentativo di mostrare le dipendenze dei dati, mentre i cassetti LaTeX-based le ignoreranno completamente.
Parametri
-
output (str | None) – Selezionare il metodo di uscita da utilizzare per disegnare il circuito. Le scelte valide sono
text,mpl,latex,latex_source. Per impostazione predefinita, viene utilizzato il cassettotext, a meno che il file di configurazione dell'utente (di solito~/.qiskit/settings.conf) non abbia un backend alternativo impostato come predefinito. Ad esempio,circuit_drawer = latex. Se il kwarg di uscita è impostato, quel backend sarà sempre usato al posto di quello predefinito nel file di configurazione dell'utente. -
scale (float | None) – Scala dell'immagine da disegnare (ridurre se
< 1.0). Utilizzato solo dalle uscitempl,latexelatex_source. L'impostazione predefinita è1.0. -
filename (str | None) – Percorso del file in cui salvare l'immagine. L'impostazione predefinita è
None(il risultato non viene salvato in un file). -
Nome dello stile, nome del file JSON dello stile o un dizionario che specifica lo stile.
- I nomi degli stili supportati sono
"iqp"(predefinito),"iqp-dark","clifford","textbook"e"bw". - Se viene dato un file JSON, ad esempio
my_style.jsonomy_style(l'estensione.jsonpuò essere omessa), questa funzione tenta di caricare il dizionario di stile da quella posizione. Si noti che il file JSON deve specificare completamente le specifiche di visualizzazione. Il file viene cercato inqiskit/visualization/circuit/styles, la directory di lavoro corrente, e nella posizione specificata in~/.qiskit/settings.conf. - Se si tratta di un file di configurazione, ogni voce sovrascrive la configurazione predefinita. Se viene specificato il
"name"tasto, la configurazione predefinita è quella corrispondente a tale stile. Ad esempio,{"name": "textbook", "subfontsize": 5}carica lo"textbook"stile e imposta la dimensione secondaria dei caratteri (ad esempio, gli angoli delle porte) su5. - Se
Noneviene utilizzato lo stile predefinito"iqp"o, se dato, lo stile predefinito specificato in~/.qiskit/settings.conf.
- I nomi degli stili supportati sono
-
interactive (bool) – Se impostato su
True, mostra il circuito in una nuova finestra (permpldipende dal backend matplotlib utilizzato che lo supporta). Si noti che quando viene utilizzato con il tipo di output text olatex_sourcequesto non ha alcun effetto e viene ignorato. L'impostazione predefinita èFalse. -
reverse_bits (bool | None) – Se impostato su
True, inverte l'ordine dei bit all'interno dei registri per la visualizzazione dell'uscita. Il valore predefinito èFalse, a meno che nel file di configurazione dell'utente (di solito~/.qiskit/settings.conf) non sia stato impostato un valore alternativo. Ad esempio,circuit_reverse_bits = True. -
plot_barriers (bool) – Abilita/disabilita le barriere di disegno nel circuito di uscita. L'impostazione predefinita è
True. -
justify (str | None) – Le opzioni sono
"left","right"o"none"(str). Se viene fornito qualcos'altro, verrà utilizzato il tasto sinistro giustificato. Si riferisce alla posizione dei gate nel circuito di uscita, se esiste un'opzione.nonerisulta che ogni cancello viene collocato nella propria colonna. L'impostazione predefinita èleft. -
vertical_compression (str | None) –
high,mediumolow. Unisce le linee generate dall'output di testo in modo che il disegno occupi meno spazio verticale. L'impostazione predefinita èmedium. Utilizzato solo dall'uscitatext, altrimenti viene ignorato. -
idle_wires (bool |str | None) – Includere (o meno) i fili inattivi (fili privi di componenti elettrici) nella visualizzazione dei risultati. È possibile anche
"auto"la stringa, nel qual caso vengono visualizzati i fili inattivi, tranne quando al circuito è allegato uno schema. Il valore predefinito è, a meno"auto"che nel file di configurazione dell'utente (di solito~/.qiskit/settings.conf) non sia specificato un valore alternativo. Ad esempio,circuit_idle_wires = False. -
with_layout (bool) – Includere informazioni sul layout, con etichette sul layout fisico. Il valore predefinito è
True. -
fold (int | None) – Imposta la paginazione. Può essere disattivato utilizzando il sito -1. In
text, imposta la lunghezza delle linee. È utile quando il disegno non entra nella console. Se None (predefinito), cercherà di indovinare la larghezza della console utilizzandoshutil.get_terminal_size(). Tuttavia, se si esegue in jupyter, la lunghezza predefinita delle righe è impostata a 80 caratteri. Inmpl, è il numero di strati (visivi) prima della piegatura. L'impostazione predefinita è 25. -
ax (Any | None) – Utilizzato solo dal backend mpl. Un oggetto
matplotlib.axes.Axesopzionale da utilizzare per l'output di visualizzazione. Se non viene specificato nulla, verrà creata e utilizzata una nuova figura matplotlib. Inoltre, se specificato, non verrà restituita alcuna figura poiché è ridondante. -
initial_state (bool) – Aggiunge all'inizio dei fili dei qubit e ai fili classici. Il valore predefinito è
False. -
cregbundle (bool | None) – Se impostato su
True, raggruppa i registri classici. Il valore predefinito èTrue, tranne quandooutputè impostato su"text". -
wire_order (list[int] | None) – Un elenco di numeri interi utilizzati per riordinare la visualizzazione dei bit. L'elenco deve contenere una voce per ogni bit con i bit nell'intervallo da 0 a (
num_qubits+num_clbits). -
expr_len (int) – Il numero di caratteri da visualizzare se si utilizza un
Exprcome condizione in unControlFlowOp. Se questo numero viene superato, la stringa verrà troncata a quel numero e alla fine verrà aggiunto «…». -
measure_arrows (bool | None) – Se True, disegna una freccia da ogni casella di misura verso il bit o il registro in cui è posizionato il valore della misura. Se il valore è False, non disegnare la freccia, ma inserire invece il nome del bit o del registro nella casella della misura. Il valore predefinito è, a meno
Trueche nel file di configurazione dell'utente (di solito~/.qiskit/settings.conf) non sia specificato un valore alternativo. Ad esempio,circuit_measure_arrows = False. -
barrier_label_len (int) – Il numero di caratteri da visualizzare per
Barrierle etichette nel circuito di uscita. Se questo numero viene superato, la stringa verrà troncata a quel numero e alla fine verrà aggiunto «…».
Risultati
TextDrawing o matplotlib.figure o PIL.Image o str:
-
TextDrawing(seoutput='text')Un disegno che può essere stampato come arte ascii.
-
matplotlib.figure.Figure(seoutput='mpl')Un oggetto figura matplotlib per il diagramma del circuito.
-
PIL.Image(seoutput='latex')Una rappresentazione in memoria dell'immagine dello schema circuitale.
-
str(seoutput='latex_source')Il codice sorgente di LaTeX per la visualizzazione dello schema circuitale.
Aumenti
- VisualizationError - quando viene selezionato un metodo di uscita non valido
- ImportError - quando i metodi di output richiedono librerie non installate.
Esempio
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qc = QuantumCircuit(1, 1)
qc.h(0)
qc.measure(0, 0)
qc.draw(output='mpl', style={'backgroundcolor': '#EEEEEE'})
Oltre al driver principale draw() ci sono due metodi di aiuto alla visualizzazione, utili per lo più per scartare rapidamente alcune istruzioni interne o per invertire le convenzioni di etichettatura dei qubit nel disegno. Per una mutazione più generale, compresa la riscrittura delle porte di base, è necessario utilizzare il transpiler (qiskit.transpiler).
decompose
decompose(gates_to_decompose=None, reps=1)
Chiamare un passaggio di decomposizione su questo circuito, per decomporre un livello (shallow decompose).
Parametri
- gates_to_decompose (str |type[Instruction] | Sequence[str |type[Instruction]] | None) – Sottoinsieme facoltativo di porte da scomporre. Può trattarsi di un tipo di gate, ad esempio
HGate, oppure del nome di un gate, ad esempio “h”, oppure dell’etichetta di un gate, ad esempio “My H Gate”, oppure di un elenco contenente qualsiasi combinazione di questi elementi. Se viene inserito il nome di un gate, verranno scomposti tutti i gate con quel nome, indipendentemente dal fatto che abbiano o meno delle etichette. Per impostazione predefinita, vengono selezionati tutti i gate del circuito. - reps (int) – Numero opzionale di volte in cui il circuito deve essere scomposto. Ad esempio,
reps=2equivale a chiamarecircuit.decompose().decompose().
Risultati
un circuito decomposto a un livello
Tipo di restituzione
reverse_bits
reverse_bits()
Riportare un circuito con l'ordine opposto dei fili.
Il circuito è capovolto "verticalmente". Se un circuito viene definito su più registri, il circuito risultante avrà gli stessi registri ma con l'ordine invertito.
Questo metodo è utile per convertire un circuito scritto in convenzione little-endian nell'equivalente big-endian e viceversa.
Risultati
il circuito con ordine di bit invertito.
Tipo di restituzione
Esempi
Input:
┌───┐
a_0: ┤ H ├──■─────────────────
└───┘┌─┴─┐
a_1: ─────┤ X ├──■────────────
└───┘┌─┴─┐
a_2: ──────────┤ X ├──■───────
└───┘┌─┴─┐
b_0: ───────────────┤ X ├──■──
└───┘┌─┴─┐
b_1: ────────────────────┤ X ├
└───┘Output:
┌───┐
b_0: ────────────────────┤ X ├
┌───┐└─┬─┘
b_1: ───────────────┤ X ├──■──
┌───┐└─┬─┘
a_0: ──────────┤ X ├──■───────
┌───┐└─┬─┘
a_1: ─────┤ X ├──■────────────
┌───┐└─┬─┘
a_2: ┤ H ├──■─────────────────
└───┘Parametri