Skip to main content
IBM Quantum Platform

QuantumCircuit Klasse

class qiskit.circuit.QuantumCircuit(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())

GitHub

Basen: object

Qiskit-Kerndarstellung einer Quantenschaltung.

Anmerkung

Für weitere Details, die den QuantumCircuit in den Kontext aller zugehörigen Datenstrukturen stellt, wie es in den Rest des qiskit pakets und die verschiedenen Regime von Quantenschaltkreisbeschreibungen in Qiskit, finden Sie in der Dokumentation auf Modulebene von qiskit.circuit.

Beispiel:

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 ├
          └───┘

Schaltungsattribute

QuantumCircuit hat eine kleine Anzahl öffentlicher Attribute, bei denen es sich meist um ältere Funktionen handelt. Der Zugriff auf die meisten Funktionen erfolgt über Methoden.

Eine kleine Handvoll der Attribute ist absichtlich veränderbar, der Rest sind Datenattribute, die als unveränderlich angesehen werden sollten.

Veränderbares Attribut
Zusammenfassung
global_phaseDie Gesamtphase des Stromkreises, gemessen im Bogenmaß.
metadataBeliebige Benutzerzuordnung, die Qiskit durch den Transpiler beibehält, aber ansonsten vollständig ignoriert.
nameEin optionaler Stringname für den Stromkreis.
Unveränderliches Datenattribut
Zusammenfassung
ancillasListe der AncillaQubits, die von der Schaltung verfolgt werden.
cregsListe der ClassicalRegisters, die von der Schaltung verfolgt werden.
clbitsListe der Clbits, die von der Schaltung verfolgt werden.
dataListe der einzelnen CircuitInstructionElemente, aus denen sich die Schaltung zusammensetzt.
_dataPython -Bindestrich-Handle zum QkCircuit C-API-Objekt.
durationGesamtdauer der Schaltung, addiert durch die Planung der Transpilerdurchläufe. Dieses Attribut ist veraltet und estimate_duration() sollte stattdessen verwendet werden.
layoutVom Transpiler hinzugefügte Hardware-Layout- und Routing-Informationen.
num_ancillasDie Anzahl der Ancilla-Qubits in der Schaltung.
num_clbitsDie Anzahl der Clbits in der Schaltung.
num_captured_varsAnzahl der erfassten klassischen Echtzeit-Variablen.
num_captured_stretchesAnzahl der erfassten Streckenabschnitte.
num_declared_varsAnzahl der lokal deklarierten klassischen Echtzeitvariablen im äußeren Schaltungsbereich.
num_declared_stretchesAnzahl der lokal deklarierten Abschnitte im äußeren Stromkreisumfang.
num_input_varsAnzahl der klassischen Echtzeit-Eingangsvariablen.
num_parametersParameterAnzahl der „s“-Elemente zur Kompilierungszeit in der Schaltung.
num_qubitsAnzahl der Qubits in der Schaltung.
num_varsGesamtzahl der klassischen Echtzeitvariablen im äußeren Schaltungsbereich.
num_stretchesGesamtzahl der Abschnitte im Bereich des äußeren Stromkreises.
num_identifiersGesamtzahl der Variablen und Strecken im äußeren Kreislauf.
op_start_timesStartzeiten der geplanten Vorgänge, die durch die Planung von Transpilerdurchläufen hinzugefügt werden.
parametersParameterGeordnete, mengengleiche Darstellung der vom Schaltkreis erfassten Werte zur Kompilierungszeit.
qregsListe der QuantumRegisters, die von der Schaltung verfolgt werden.
qubitsListe der Qubits, die von der Schaltung verfolgt werden.
unitDie Einheit des duration feldes.

Das Kernattribut lautet data. CircuitInstructionDies ist ein sequenzähnliches Objekt, das die darin enthaltenen s in geordneter Form bereitstellt. append()Sie sollten dieses Objekt grundsätzlich nicht direkt ändern; QuantumCircuit es ist ausschließlich für Append-Only-Operationen vorgesehen (für die verwendet werden sollte). Die meisten Operationen, die Schaltkreise an Ort und Stelle verändern, sollten als Transpiler-Durchläufe (qiskit.transpiler) geschrieben werden. Die C-API interagiert mit einem internen Objekt namens _data, das nicht Teil der öffentlichen Python -API ist, außer als Handle, das an C-API-Aufrufe übergeben wird.

data

Die Schaltkreisdaten (Anweisungen und Kontext).

Beispiel

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),))]

Rückgabe

Ein listenähnliches Objekt, das die CircuitInstruction Instanzen im Schaltkreis enthält.

dataNeben dem kann auch die global_phase einer Schaltung einen gewissen Einfluss auf deren Ausgang haben, wenn die Schaltung zur Beschreibung eines Gate dient, das gesteuert werden kann. Dieser Wert wird in Radianten gemessen und kann direkt eingestellt werden.

global_phase

Die globale Phase des Stromkreisumfangs in Radiant.

Beispiel

from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
print(circuit.global_phase)
0.0
from numpy import pi

circuit.global_phase = pi/4
print(circuit.global_phase)
0.7853981633974483

Der name Name eines Schaltkreises wird zum Namen der Funktion Instruction oder Gate des Ergebnisses, das sich aus to_instruction() den Aufrufen von und to_gate() ergibt, was für Visualisierungen nützlich sein kann.

name

Typ: str

Ein von Menschen lesbarer Name für den Stromkreis.

Beispiel

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_circuit

Sie können beliebige metadata mit einem Stromkreis verbinden. Kein Teil des Qiskit-Kerns wird dies überprüfen oder sein Verhalten aufgrund von Metadaten ändern, aber es wird getreu durch den Transpiler geleitet, so dass Sie Ihre Schaltkreise selbst taggen können. Wenn Sie einen Schaltkreis mit QPY serialisieren (siehe qiskit.qpy), werden die Metadaten JSON-serialisiert und Sie müssen eventuell einen benutzerdefinierten Serializer übergeben, um nicht-JSON-kompatible Objekte darin zu behandeln (siehe qpy.dump() für weitere Details). Dieses Feld wird beim Export nach OpenQASM 2 oder 3 ignoriert.

metadata

Beliebiges benutzerdefiniertes Wörterbuch mit Metadaten für den Stromkreis.

Qiskit untersucht den Inhalt dieser Zuordnung nicht, sondern leitet ihn durch den Transpiler und fügt ihn wieder an die Ausgabe an, so dass Sie Ihre eigenen Metadaten verfolgen können.

Beispiel

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, metadata={'experiment_type': 'Bell state experiment'})

print(qc.metadata)
{'experiment_type': 'Bell state experiment'}

QuantumCircuit legt Datenattribute offen, die seine internen Quanten- und klassischen Bits und Register verfolgen. Diese erscheinen als Python lists, aber Sie sollten sie als unveränderlich behandeln; sie zu ändern hat bestenfalls keine Auswirkungen, und wahrscheinlicher ist es, dass sie einfach die internen Daten der QuantumCircuit.

qregs

Eine Liste von Qubits in der Reihenfolge, in der sie hinzugefügt wurden. Sie sollten diese nicht mutieren.

cregs

Eine Liste von Clbits in der Reihenfolge, in der sie hinzugefügt wurden. Sie sollten diese nicht mutieren.

qubits

Eine Liste von Qubits in der Reihenfolge, in der sie hinzugefügt wurden. Sie sollten diese nicht mutieren.

ancillas

Eine Liste von AncillaQubits in der Reihenfolge, in der sie hinzugefügt wurden. Sie sollten diese nicht mutieren.

clbits

Eine Liste von Clbits in der Reihenfolge, in der sie hinzugefügt wurden. Sie sollten diese nicht mutieren.

Beispiel

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

Die in den Befehlen der Schaltung enthaltenen Kompilierungsparameter sind in parameters. verfügbar. setassign_parameters()Dies folgt einer kanonischen Reihenfolge (größtenteils lexikalisch, außer im Fall von ParameterVector), die der Reihenfolge entspricht, in der Parameter bei der Verwendung der Listenformen von zugewiesen werden, unterstützt aber auch eine -ähnliche Überprüfung der Zugehörigkeit in konstanter Zeit.

parameters

Die in der Schaltung definierten Parameter.

Dieses Attribut gibt die Parameter Objekte im Schaltkreis in alphabetischer Reihenfolge zurück. Beachten Sie, dass mit einem ParameterVector instanziierte Parameter weiterhin numerisch sortiert werden.

Beispiele

Der nachstehende Ausschnitt zeigt, dass die Einfügereihenfolge der Parameter keine Rolle spielt.

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

Beachten Sie, dass die alphabetische Sortierung bei Zahlen nicht intuitiv sein kann. Die wörtliche "10" steht in strenger alphabetischer Sortierung vor der "2".

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

Um die numerische Sortierung zu berücksichtigen, kann ein ParameterVector verwendet werden.

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

Rückgabe

Die sortierten Parameter Objekte im Schaltkreis.

Wenn Sie Ihre Schaltung transpiliert haben, so dass Sie eine physikalische Schaltung haben, können Sie das layout attribut nach Informationen durchsuchen, die der Transpiler darüber gespeichert hat, wie die virtuellen Qubits der Quellschaltung auf die Hardware-Qubits Ihrer physischen Schaltung abgebildet werden, und zwar sowohl am Anfang als auch am Ende der Schaltung.

layout

Gibt alle zugehörigen Layoutinformationen über den Schaltkreis zurück.

Dieses Attribut enthält ein optionales TranspileLayout Objekt. Dies wird in der Regel am Ausgang von transpile() oder PassManager.run() gesetzt, um Informationen über die durch die Transpilierung im Eingangsschaltkreis verursachten Permutationen zu erhalten.

TargetEs gibt zwei Arten von Permutationen, die durch die transpile() Funktion verursacht werden: eine anfängliche Anordnung, bei der die Qubits auf der Grundlage der ausgewählten physikalischen Qubits auf der permutiert werden, und eine endgültige Anordnung, bei der es sich um eine Ausgabepermutation handelt, die durch SwapGatedie während des Routings eingefügten s verursacht wird.

Beispiel

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]

Wenn Ihre Schaltung auch als Teil einer Transpilierung geplant wurde, werden die einzelnen Zeitangaben für jede Anweisung zusammen mit der Gesamtzeit der Schaltung angezeigt duration der Schaltung.

duration

Die Gesamtdauer der Schaltung, die durch einen Transpiler-Durchlauf festgelegt wird. Seine Einheit wird angegeben durch unit.

Veraltet seit Version 1.3.0

Die Eigenschaft qiskit.circuit.quantumcircuit.QuantumCircuit.duration ist ab Qiskit 1.3.0 veraltet. Sie wird in Qiskit 3.0.0 entfernt.

unit

Die Einheit, die duration angegeben ist.

Veraltet seit Version 1.3.0

Die Eigenschaft qiskit.circuit.quantumcircuit.QuantumCircuit.unit ist ab Qiskit 1.3.0 veraltet. Sie wird in Qiskit 3.0.0 entfernt.

op_start_times

Gibt eine Liste der Startzeiten der Operationen zurück.

Anmerkung

Dieses Attribut berechnet die geschätzte Startzeit der Operationen in der geplanten Schaltung und funktioniert nur für einfache Schaltungen, die keinen Kontrollfluss oder andere klassische Feed-Forward-Operationen haben.

Dieses Attribut wird aktiviert, sobald einer der Scheduling-Analysedurchläufe auf der Quantenschaltung läuft.

Beispiel

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: 2098

Rückgabe

Liste ganzer Zahlen, die die geschätzten Startzeiten der Anweisungen angeben. Der Index entspricht dem Index der Anweisung in QuantumCircuit.data.

Erhöht

AttributeError - Wenn die Schaltung nicht geplant ist.

Endlich, QuantumCircuit mehrere einfache Eigenschaften als dynamische, nur lesbare numerische Attribute aus.

num_ancillas

Gibt die Anzahl der Ancilla-Qubits zurück.

Beispiel

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: 1

num_clbits

Rückgabe der Anzahl der klassischen Bits.

Beispiel

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: 1

num_captured_vars

Die Anzahl der klassischen Echtzeitvariablen in der Schaltung, die als von einem umschließenden Bereich erfasst gekennzeichnet sind.

Dies ist die Länge der iter_captured_vars() iterablen. Wenn dieser Wert ungleich Null ist, num_input_vars null sein.

num_captured_stretches

Die Anzahl der Abschnitte im Schaltkreis, die als von einem umschließenden Bereich erfasst markiert sind.

Dies ist die Länge der iter_captured_stretches() iterablen. Wenn dieser Wert ungleich Null ist, num_input_vars null sein.

num_declared_vars

Die Anzahl der klassischen Echtzeitvariablen in der Schaltung, die von diesem Schaltungsbereich deklariert werden, ausgenommen Eingänge oder Captures.

Dies ist die Länge der iter_declared_vars() iterablen.

num_declared_stretches

Die Anzahl der Strecken im Stromkreis, die durch diesen Stromkreisumfang deklariert werden, ausgenommen Captures.

Dies ist die Länge der iter_declared_stretches() iterablen.

num_input_vars

Die Anzahl der klassischen Echtzeitvariablen in der Schaltung, die als Schaltungseingänge gekennzeichnet sind.

Dies ist die Länge der iter_input_vars() iterablen. Wenn dieser Wert ungleich Null ist, num_captured_vars null sein.

num_identifiers

Die Anzahl der klassischen Echtzeit-Variablen und -Strecken in der Schaltung.

Dies ist gleich num_vars() + num_stretches().

num_parameters

Die Anzahl der Parameterobjekte in der Schaltung.

num_qubits

Rückgabe der Anzahl der Qubits.

num_stretches

Die Anzahl der Abschnitte in der Schaltung.

Dies ist die Länge der iter_stretches() iterablen.

num_vars

Die Anzahl der klassischen Echtzeitvariablen in der Schaltung.

Dies ist die Länge der iter_vars() iterablen.


Neue Schaltkreise erstellen

Methode
Zusammenfassung
__init__()Standard-Konstruktor für anweisungsfreie Schaltungen.
copy()Erstellen Sie eine vollständige Kopie eines bestehenden Stromkreises.
copy_empty_like()Kopieren von Datenobjekten aus einem Schaltkreis in einen neuen Schaltkreis ohne weitere Anweisungen.
from_instructions()Ableitung der benötigten Datenobjekte aus einer Liste von Anweisungen.
from_qasm_file()Legacy-Schnittstelle zu qasm2.load().
from_qasm_str()Legacy-Schnittstelle zu qasm2.loads().

Der Standardkonstruktor (QuantumCircuit(...)) erzeugt eine Schaltung ohne Anfangsanweisungen. Die Argumente des Standardkonstruktors können verwendet werden, um den Schaltkreis mit Quanten- und klassischem Datenspeicher zu versehen und um einen Namen, eine globale Phase und beliebige Metadaten anzugeben. Alle diese Felder können später erweitert werden.

__init__

__init__(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())

GitHub

Standard-Konstruktor von QuantumCircuit.

Parameter

  • regs (Register |int |Sequence[Bit]) –

    Die Register, die in die Schaltung einbezogen werden sollen.

    • Wenn eine Liste von Register objekten, stellt die QuantumRegister und/oder ClassicalRegister objekte, die in die Schaltung aufgenommen werden sollen.

      Zum Beispiel:

      • QuantumCircuit(QuantumRegister(4))
      • QuantumCircuit(QuantumRegister(4), ClassicalRegister(3))
      • QuantumCircuit(QuantumRegister(4, 'qr0'), QuantumRegister(2, 'qr1'))
    • Wenn es sich um eine Liste von int handelt, die Anzahl der Qubits und/oder klassischen Bits, die in die Schaltung aufgenommen werden sollen. Es kann entweder ein einzelner int für die Anzahl der Quantenbits oder 2 ints für die Anzahl der Quantenbits bzw. der klassischen Bits sein.

      Zum Beispiel:

      • QuantumCircuit(4) # A QuantumCircuit with 4 qubits
      • QuantumCircuit(4, 3) # A QuantumCircuit with 4 qubits and 3 classical bits
    • Wenn eine Liste von Python-Listen mit Bit objekte, eine Sammlung von Bit s, die der Schaltung hinzugefügt werden soll.

  • name (str | None) – der Name des Quantenkreises. Ist dies nicht der Fall, wird eine automatisch generierte Zeichenfolge zugewiesen.

  • global_phase (ParameterExpression |float) – Die globale Phase der Schaltung in Radianten.

  • metadata (dict | None) – Beliebige Schlüsselwert-Metadaten, die mit dem Stromkreis verknüpft werden sollen. Diese werden als Freiformdaten in einem Diktat im metadata attribut gespeichert. Er wird nicht direkt in der Schaltung verwendet.

  • inputs (Iterable[Var]) – Variablen, die als input Laufzeitvariablen für diese Schaltung deklariert werden sollen. Dies sollten bereits vorhandene expr.Var Knoten sein, die Sie an anderer Stelle erstellt haben; falls Sie auch die Eingaben erstellen müssen, verwenden Sie QuantumCircuit.add_input(). Die in diesem Argument angegebenen Variablen werden direkt an add_input()… übergeben. Ein Schaltkreis kann nicht sowohl inputs als auch captureshaben.

  • captures (Iterable[Var |Stretch]) – alle Variablen, die dieser Gültigkeitsbereich von einem übergeordneten Gültigkeitsbereich übernehmen soll. Die hier angegebenen Variablen werden direkt an add_capture(). übergeben. Ein Schaltkreis kann nicht sowohl inputs als auch captureshaben.

  • declarations (Mapping[Var, Expr] | Iterable[tuple[Var, Expr]]) –

    alle Variablen, die diese Schaltung deklarieren und sofort initialisieren soll. Sie können diese Eingaben so anordnen, dass spätere Deklarationen von früheren abhängen (einschließlich Eingaben oder Erfassungen). Wenn Sie sich auf Werte verlassen müssen, die später zur Laufzeit berechnet werden, verwenden Sie add_var() an einer geeigneten Stelle in der Ausführung der Schaltung.

    Dieses Argument ist für die bequeme Initialisierung von Schaltkreisen gedacht, wenn Sie bereits eine Reihe von Variablen erstellt haben. Die hier verwendeten Variablen werden direkt an add_var()übergeben, die Sie direkt verwenden können, wenn Sie die Variable zum ersten Mal erstellen.

Erhöht

  • CircuitError - wenn der Name der Schaltung, falls angegeben, nicht gültig ist.
  • CircuitError - wenn sowohl inputs als auch captures angegeben sind.

Wenn Sie eine bestehende Schaltung haben, können Sie eine Kopie davon erstellen mit copy()erstellen, einschließlich aller Anweisungen. Dies ist nützlich, wenn Sie einen Teil der Schaltkreise beibehalten und einen anderen erweitern wollen, oder wenn Sie eine Version haben wollen, die Sie an Ort und Stelle ändern können, während die vorherige intakt bleibt.

copy

copy(name=None)

GitHub

Kopieren Sie die Schaltung.

Parameter

name (str) – name, der dem kopierten Schaltkreis gegeben werden soll. Wenn keine, bleibt der Name gleich.

Rückgabe

eine Deepcopy des aktuellen Schaltkreises mit dem angegebenen Namen

Rückgabetyp

QuantumCircuit

Wenn Sie hingegen eine Schaltung wünschen, die dieselben Datenobjekte (Bits, Register, Variablen usw.) enthält, jedoch ohne Befehle, können Sie verwenden copy_empty_like(). Das kommt häufig vor, wenn man eine neue Schicht einer Schaltung compose() aufbauen möchte, um diese dann mit auf die Rückseite aufzubringen, oder wenn man die Anweisungen einer Schaltung komplett neu schreiben möchte.

copy_empty_like

copy_empty_like(name=None, *, vars_mode='alike')

GitHub

Gibt eine Kopie von self mit der gleichen Struktur, aber leer, zurück.

Diese Struktur umfasst:

  • name und andere Metadaten
  • globale Phase
  • alle Qbits und Clbits, einschließlich der Register
  • die in der Schaltung definierten Echtzeitvariablen, die gemäß dem Argument des Schlüsselworts vars behandelt werden.
Achtung

Wenn der Schaltkreis lokale Variablendeklarationen enthält (die durch das Argument declarations zum Schaltkreiskonstruktor hinzugefügt wurden, oder durch add_var()), können diese in der Ausgabeschaltung nicht initialisiert sein. Sie müssen manuell Speicheranweisungen für sie hinzufügen (siehe Store und QuantumCircuit.store()), um sie zu initialisieren.

Parameter

  • name (str | None) – Name für den kopierten Stromkreis. Wenn keine, bleibt der Name gleich.

  • vars_mode (Literal['alike', 'captures', 'drop']) –

    Der Modus, in dem Echtzeitvariablen behandelt werden.

    gleich

    Die Variablen in der Ausgangsschaltung haben die gleiche Deklarationssemantik wie in der ursprünglichen Schaltung. So werden beispielsweise die Variablen input in der Quelle zu den Variablen input in der Ausgangsschaltung. Beachten Sie, dass dies dazu führt, dass die lokalen Variablen nicht initialisiert werden, da die Speicher nicht kopiert werden. Dies kann dazu führen, dass sich der Schaltkreis in einem für den Benutzer potenziell gefährlichen Zustand befindet, wenn er die Initialisierungsspeicher nicht neu hinzufügt.

    Erfassungen

    Alle Variablen werden in erfasste Variablen umgewandelt. Dies ist nützlich, wenn Sie eine neue Ebene für eine bestehende Schaltung erstellen, die Sie compose() auf die Basis zu übertragen, da compose() captures in die Basisschaltung einfügen kann (nicht aber andere Variablen).

    DROP

    Für die Ausgangsschaltung werden keine Variablen definiert.

Rückgabe

Eine leere Kopie von sich selbst.

Rückgabetyp

QuantumCircuit

In manchen Fällen ist es am zweckmäßigsten, eine Liste von CircuitInstructions unabhängig vom gesamten Schaltungskontext zu erstellen und anschließend daraus eine Schaltung aufzubauen. Der from_instructions() Konstruktor erfasst automatisch alle Qubit in den Anweisungen verwendeten - und Clbit -Instanzen und erstellt ein neues QuantumCircuit -Objekt, das über die richtigen Ressourcen und alle Anweisungen verfügt.

from_instructions

static from_instructions(instructions, *, qubits=(), clbits=(), name=None, global_phase=0, metadata=None)

GitHub

Erstelle eine Schaltung aus einer iterierbaren Struktur von CircuitInstructions.

Parameter

  • instructions (Iterable[CircuitInstruction |tuple[qiskit.circuit.Instruction] | tuple[qiskit.circuit.Instruction, Iterable[Qubit]] | tuple[qiskit.circuit.Instruction, Iterable[Qubit], Iterable[Clbit]]]) – Die Anweisungen zum Einbau in die Schaltung.
  • qubits (Iterable[Qubit]) – Alle Qubits, die der Schaltung hinzugefügt werden sollen. Dieses Argument kann z. B. verwendet werden, um eine bestimmte Reihenfolge der Qubits zu erzwingen.
  • clbits (Iterable[Clbit]) – Alle klassischen Bits, die der Schaltung hinzugefügt werden sollen. Dieses Argument kann z. B. verwendet werden, um eine bestimmte Reihenfolge der klassischen Bits zu erzwingen.
  • name (str | None) – Der Name des Stromkreises.
  • global_phase (ParameterValueType) – Die Gesamtphase des Stromkreises in Radiant.
  • metadata (dict | None) – Beliebige Schlüsselwert-Metadaten, die mit dem Stromkreis verknüpft werden sollen.

Rückgabe

Der Quantenschaltkreis.

Rückgabetyp

QuantumCircuit

QuantumCircuit hat auch noch zwei Konstruktormethoden, die als Legacy-Wrapper die Importer in qiskit.qasm2. Diese übernehmen automatisch die Kompatibilitätseinstellungen von load() und loads().

from_qasm_file

static from_qasm_file(path)

GitHub

Lesen eines OpenQASM 2.0 Programms aus einer Datei und Konvertierung in eine Instanz von QuantumCircuit.

Parameter

path (str |PathLike) – Pfad zur Datei für ein Programm unter „ OpenQASM 2“

Rückgabe

Das QuantumCircuit Objekt für die Eingabe OpenQASM 2.

Rückgabetyp

QuantumCircuit

Siehe auch

qasm2.load(): die vollständige Schnittstelle zum OpenQASM 2 Importer.

from_qasm_str

static from_qasm_str(qasm_str)

GitHub

Konvertiert eine Zeichenkette, die ein OpenQASM 2.0 Programm enthält, in ein QuantumCircuit.

Parameter

qasm_str (str) – Eine Zeichenfolge, die ein Programm OpenQASM 2.0 enthält.

Rückgabe

Das Objekt QuantumCircuit für die Eingabe OpenQASM 2

Rückgabetyp

QuantumCircuit

Siehe auch

qasm2.loads(): die vollständige Schnittstelle zum OpenQASM 2 Importer.


Datenobjekte auf Schaltkreisen

Hinzufügen von Datenobjekten

Methode
Fügt diese Art von Daten hinzu
add_bits()Qubits und Clbits.
add_register()QuantumRegister und ClassicalRegister.
add_var()Var knoten mit lokalem Geltungsbereich und Initialisierungen.
add_stretch()Stretch knoten mit lokalem Geltungsbereich.
add_input()Var knoten, die als Schaltkreiseingänge behandelt werden.
add_capture()Var oder Stretch knoten, die aus den enthaltenen Bereichen erfasst werden.
add_uninitialized_var()Var knoten mit lokalem Geltungsbereich und undefiniertem Zustand.

Normalerweise fügen Sie die meisten Datenobjekte (Qubit, Clbit, ClassicalRegister, usw.) dem Schaltkreis als Teil der Verwendung des __init__() standard-Konstruktor, oder copy_empty_like(). Es ist jedoch auch möglich, diese nachträglich hinzuzufügen. Typisierte klassische Daten, wie eigenständige Var knoten (siehe Klassische Echtzeitberechnungen ), können mit separaten Methoden sowohl konstruiert als auch hinzugefügt werden.

Neue registerlose Qubit und Clbit objekte werden hinzugefügt mit add_bits(). Diese Objekte dürfen nicht bereits in der Schaltung vorhanden sein. Sie können überprüfen, ob ein Bit bereits in der Schaltung vorhanden ist, indem Sie find_bit().

add_bits

add_bits(bits)

GitHub

Fügen Sie der Schaltung Bits hinzu.

Achtung

Wenn der Quantenkreis ein bestehendes layout attribut hat, erhöht das Hinzufügen eines Qubit nur die Anzahl der Qubits erhöhen. Das Layout wird dabei nicht aktualisiert.

Parameter

bits (Iterable[Bit])

Rückgabetyp

Keine

Register werden der Schaltung hinzugefügt mit add_register(). Bei dieser Methode ist es kein Fehler, wenn einige der Bits bereits in der Schaltung vorhanden sind. In diesem Fall wird das Register ein "Alias" für die Bits sein. Dies wird im Allgemeinen von Hardware-Backends nicht gut unterstützt; es ist wahrscheinlich am besten, sich nicht darauf zu verlassen. Die Register, in denen sich ein bestimmtes Bit befindet, sind Teil der Rückgabe von find_bit().

add_register

add_register(*regs)

GitHub

Register hinzufügen.

Achtung

Wenn der Quantenkreis ein bestehendes layout attribut hat, erhöht das Hinzufügen eines QuantumRegister nur die Anzahl der Qubits erhöhen. Das Layout wird dabei nicht aktualisiert.

Parameter

regs (Register |int |Sequence[Bit])

Rückgabetyp

Keine

Klassische, typisierte Echtzeitdaten werden auf dem Schaltkreis dargestellt durch Var knoten mit einem wohldefinierten Type. Es ist möglich, diese separat in einem Schaltkreis zu instanziieren (siehe Var.new()), aber es ist oft bequemer, Schaltkreismethoden zu verwenden, die automatisch die Typen und die Initialisierung der Ausdrücke für Sie verwalten. Die beiden gebräuchlichsten Methoden sind add_var() (lokal begrenzte Variablen) und add_input() (Eingänge in den Schaltkreis). Außerdem kann die Methode add_stretch() verwendet werden, um die Schaltung zu strecken.

add_var

add_var(name_or_var, /, initial)

GitHub

Fügen Sie dieser Schaltung eine klassische Variable mit automatischer Speicherung und Umfang hinzu.

Die Variable gilt als zu Beginn des Schaltkreises "deklariert", wird aber erst an dem Punkt des Schaltkreises initialisiert, an dem Sie diese Methode aufrufen, so dass sie von vorher definierten Variablen abhängen kann.

Parameter

  • name_or_var (str |Var) – entweder eine Zeichenfolge des Variablennamens oder eine vorhandene Instanz von Var zur Wiederverwendung. Variablen dürfen keine Namen überschatten, die bereits innerhalb des Schaltkreises verwendet werden.

  • initial (Any) –

    der Wert, mit dem diese Variable initialisiert werden soll. Wenn das erste Argument als Zeichenkette angegeben wurde, wird der Typ der resultierenden Variablen aus dem ursprünglichen Ausdruck abgeleitet; um dies manuell zu steuern, verwenden Sie entweder Var.new() um manuell eine neue Variable mit dem gewünschten Typ zu konstruieren, oder verwenden Sie expr.cast() um den Initialisierer auf den gewünschten Typ zu übertragen.

    Dies muss entweder ein Expr knoten sein oder ein Wert, der mit expr.lift in einen solchen umgewandelt werden kann.

Rückgabe

Die erstellte Variable. Wenn eine Var instanz angegeben wurde, wird genau dasselbe Objekt zurückgegeben.

Erhöht

CircuitError - wenn die Variable nicht erstellt werden kann, weil sie einen vorhandenen Bezeichner überschattet.

Rückgabetyp

Var

Beispiele

Definieren Sie eine neue Variable nur mit einem Namen und einem Initialisierungsausdruck:

from qiskit.circuit import QuantumCircuit

qc = QuantumCircuit(2)
my_var = qc.add_var("my_var", False)

Wiederverwendung einer Variablen, die möglicherweise aus einem verwandten Schaltkreis stammt oder anderweitig manuell konstruiert wurde, und Initialisierung mit einem komplizierteren Ausdruck:

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

GitHub

Registrieren Sie eine Variable als Eingang für die Schaltung.

Parameter

  • name_or_var (str |Var) – entweder einen Zeichenfolgennamen oder einen vorhandenen Var Knoten, der als Eingabevariable verwendet werden soll.
  • typ - wenn der Name als Zeichenkette angegeben wird, dann muss dies ein Type für die Variable verwendet werden. Wenn die Variable als existierende Variable angegeben wird Varangegeben wird, dann muss diese nicht angegeben werden und wird stattdessen aus dem Objekt selbst gelesen.
  • type_ (Type | None)

Rückgabe

die erstellte Variable oder die gleiche Variable, die übergeben wurde.

Erhöht

CircuitError - wenn die Variable nicht erstellt werden kann, weil sie eine bestehende Variable überschattet.

Rückgabetyp

Var

add_stretch

add_stretch(name_or_stretch)

GitHub

Deklariert eine neue Strecke, die auf diesen Stromkreis bezogen ist.

Parameter

name_or_stretch (str |Stretch) – entweder eine Zeichenfolge mit dem Namen des Stretch oder eine vorhandene Instanz von Stretch zur Wiederverwendung. Strecken dürfen keine Namen überschatten, die innerhalb der Rennstrecke bereits verwendet werden.

Rückgabe

Die geschaffene Strecke. Wenn eine Stretch instanz angegeben wurde, wird genau dasselbe Objekt zurückgegeben.

Erhöht

CircuitError - wenn der Abschnitt nicht erstellt werden kann, weil er einen bestehenden Bezeichner überschattet.

Rückgabetyp

Dehnung

Beispiele

Definieren und verwenden Sie eine neue Strecke, die nur einen Namen hat:

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)

Darüber hinaus gibt es zwei Methoden auf niedrigerer Ebene, die für die programmatische Erstellung von Schaltungen nützlich sein können. Wenn Sie interaktiv arbeiten, werden Sie diese höchstwahrscheinlich nicht benötigen; die meisten Verwendungen von add_uninitialized_var() sind Teil von copy_empty_like(), und die meisten Verwendungen von add_capture() ist es besser, die Schnittstelle für die Erstellung von Kontrollflüssen zu verwenden.

add_uninitialized_var

add_uninitialized_var(var, /)

GitHub

Fügen Sie eine Variable ohne Initialisierer hinzu.

In den meisten Fällen sollten Sie add_var() verwenden, um die Variable zu initialisieren. Um diese Funktion zu verwenden, müssen Sie bereits eine Var instanz besitzen, da die Verwendung der Funktion normalerweise nur in Kopierkontexten sinnvoll ist.

Achtung

Qiskit macht keine Aussagen darüber, wie eine nicht initialisierte Variable zur Laufzeit ausgewertet wird, und manche Hardware kann dies als Fehler zurückweisen.

Sie sollten diese Funktion mit Vorsicht behandeln und als ein Low-Level-Primitiv betrachten, das nur in speziellen Fällen des programmatischen Wiederaufbaus zweier gleicher Schaltungen nützlich ist.

Parameter

var (Var) – die hinzuzufügende Variable.

add_capture

add_capture(var: Var)

add_capture(stretch: Stretch)

GitHub

Fügen Sie der Schaltung einen Bezeichner hinzu, den sie von einem Bereich, in dem sie enthalten ist, erfassen soll.

Diese Methode erfordert eine Var oder Stretch knoten, um zu erzwingen, dass Sie ein Handle auf einen Bezeichner haben, weil Sie denselben Bezeichner mit demselben Objekt im äußeren Kreislauf deklarieren müssen.

Dies ist eine Low-Level-Methode, die nur dann wirklich nützlich ist, wenn Sie Kontrollflussoperationen manuell konstruieren. Normalerweise brauchen Sie diese Methode nicht aufzurufen, vorausgesetzt, Sie verwenden die Builder-Schnittstelle für Kontrollflussbereiche (with context-manager-Anweisungen für if_test() und die anderen Scoping-Konstrukte). Die Erstellerschnittstelle macht die inneren Bereiche automatisch in Ihrem Namen zu Schließungen, indem sie alle Bezeichner erfasst, die in ihnen verwendet werden.

Parameter

var (Union[expr.Var, expr.Stretch]) – die zu erfassende Variable oder der zu erfassende Abschnitt aus einem umschließenden Bereich.

Erhöht

CircuitError - wenn der Bezeichner nicht erstellt werden kann, weil er einen bestehenden Bezeichner überschattet.

Arbeiten mit Bits und Registern

Eine Bit Instanz ist für sich genommen lediglich ein eindeutiger Bezeichner, den Schaltkreise in ihrem jeweiligen Kontext verwenden können. Wenn Sie über eine Bit Instanz und einen Schaltkreis verfügen, können Sie mithilfe von die Kontexte find_bit() ermitteln, in denen das Bit vorkommt, beispielsweise seinen ganzzahligen Index im Schaltkreis und alle Register, in denen es enthalten ist.

find_bit

find_bit(bit)

GitHub

Suche nach Stellen in der Schaltung, die als Referenz für eine bestimmte Bit.

Insbesondere kann diese Funktion den ganzzahligen Index eines Qubits finden, der seinem Hardware-Index für eine transpilierte Schaltung entspricht.

Anmerkung

Der Schaltkreisindex von a AncillaQubit ist sein Index in qubits, nicht ancillas.

Parameter

bit (Bit) – Das zu lokalisierende Bit.

Rückgabe

Ein 2-Tupel. Das erste Element (index) enthält den Index, unter dem die Bit gefunden werden kann (entweder in qubits, clbits, je nach Typ). Das zweite Element (registers) ist eine Liste von (register, index) Paaren mit einem Eintrag für jedes Register in der Schaltung, die den Bit (und den Index in der Liste Register unter dem es zu finden ist).

Rückgabetyp

namedtuple (int, Liste[Tupel (Register, int )])

Erhöht

  • CircuitError - Wenn der gelieferte Bit von einem unbekannten Typ war.
  • CircuitError - Wenn die gelieferte Bit nicht auf dem Stromkreis gefunden werden konnte.

Beispiele

Schleife durch einen Schaltkreis, um die Qubit- und Clbit-Indizes jeder Operation zu erhalten:

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
]

In ähnlicher Weise können Sie einen Schaltkreis abfragen, um zu sehen, ob ihm bereits ein Register hinzugefügt wurde, indem Sie has_register().

has_register

has_register(register)

GitHub

Testen Sie, ob diese Schaltung das Register r hat.

Parameter

register (Register) – ein Quanten- oder klassisches Register.

Rückgabe

Wahr, wenn das Register in dieser Schaltung enthalten ist.

Rückgabetyp

bool

Arbeiten mit Kompilierzeitparametern

Siehe auch

Kompilierzeit-Parametrisierung

Eine ausführlichere Diskussion darüber, was Kompilierzeit-Parametrisierung ist und wie sie in das Datenmodell von Qiskit passt.

Im Gegensatz zu Bits, Registern und in Echtzeit typisierten klassischen Daten werden symbolische Parameter zur Kompilierzeit nicht manuell zu einer Schaltung hinzugefügt. Ihr Vorhandensein lässt sich daraus ableiten, dass sie in Operationen enthalten sind, die zu Schaltkreisen und der globalen Phase hinzugefügt werden. Eine geordnete Liste aller Parameter, die sich derzeit in einem Stromkreis befinden, finden Sie unter QuantumCircuit.parameters.

Die häufigste Operation mit Parameter Instanzen besteht darin, sie in symbolischen Operationen durch einen numerischen Wert oder einen anderen symbolischen Ausdruck zu ersetzen. Dies geschieht mit 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

GitHub

Weisen Sie den Parametern neue Parameter oder Werte zu.

Wird parameters als Wörterbuch übergeben, sollten die Schlüssel Instanzen im aktuellen Schaltkreis sein Parameter . Die Werte des Wörterbuchs können entweder numerische Werte oder neue Parameterobjekte sein.

Wird parameters als Liste oder Array übergeben, werden die Elemente den aktuellen Parametern in der Reihenfolge von parameters zugewiesen, die alphabetisch sortiert ist (unter Beibehaltung der Reihenfolge in ParameterVector den Objekten).

Die Werte können dem aktuellen Schaltkreisobjekt oder einer Kopie desselben zugewiesen werden.

Anmerkung

get_parameter()Wenn parameters als Abbildung angegeben wird, sind Schlüssel zulässig, die aus den Namen der Parameter bestehen; diese werden mithilfe von nachgeschlagen. Es ist auch möglich, dass Schlüssel Instanzen sind ParameterVector ; in diesem Fall sollte der Wert im Wörterbuch eine Folge von Werten sein, deren Länge der Länge des Vektors entspricht.

flat_input=FalseWenn Sie einen dieser Fälle verwenden, müssen Sie die Einstellung unverändert lassen; wenn Sie diese ändern, True wird der „Fast Path“ aktiviert, bei dem alle Schlüssel Instanzen sein Parameter müssen.

Parameter

  • parameters (Mapping[Parameter, ParameterExpression |float] | Iterable[ParameterExpression |float]) – Entweder ein Wörterbuch oder eine iterierbare Struktur, die die neuen Parameterwerte angibt.
  • inplace (bool) – Ist der Wert „False“, wird eine Kopie der Schaltung mit den gebundenen Parametern zurückgegeben. Wenn „True“, wird die Schaltungsinstanz selbst geändert.
  • {parameter: value}flat_input (bool) – Wenn True und parameters ein Abbildungstyp ist, wird davon ausgegangen, dass es sich genau um eine Abbildung von handelt. get_parameter()Standardmäßig (False) kann das Mapping auch Schlüssel enthalten ParameterVector , die auf eine entsprechende Folge von Werten verweisen; diese werden während des Mappings entpackt, oder Zeichenfolgen-Schlüssel, die mithilfe von in Parameter Instanzen umgewandelt werden.
  • strict (bool) – Falls in der Zuordnung FalseParameter angegeben sind, die in der Schaltung nicht verwendet werden, werden diese ignoriert. Wenn True (Standard), wird ein Fehler ausgelöst, der auf einen logischen Fehler hinweist.

Erhöht

  • CircuitError - Wenn parameters ein dict ist und Parameter enthält, die in der Schaltung nicht vorhanden sind.
  • ValueError - Wenn es sich bei den Parametern um eine Liste/ein Array handelt und die Länge nicht mit der Anzahl der freien Parameter in der Schaltung übereinstimmt.

Rückgabe

Eine Kopie des Schaltkreises mit gebundenen Parametern, wenn inplace falsch ist, sonst keine.

Rückgabetyp

QuantumCircuit | Keine

Beispiele

Erstellen Sie einen parametrisierten Schaltkreis und weisen Sie die Parameter an Ort und Stelle zu.

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')
Schaltplan, der durch den vorherigen Code ausgegeben wurde.Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Binden Sie die verstellten Werte per Liste und erhalten Sie eine Kopie der ursprünglichen Schaltung.

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')
Schaltplan, der durch den vorherigen Code ausgegeben wurde.Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Die Schaltung verfolgt die Parameter anhand Parameter der Instanzen selbst und lässt keine mehrfachen Parameter mit demselben Namen zu, um Probleme bei der Interoperabilität mit „ OpenQASM “ oder anderen externen Formaten zu vermeiden. Mit has_parameter() und get_parameter() können Sie die Schaltung nach einem Parameter mit dem angegebenen Zeichenfolgenamen abfragen.

has_parameter

has_parameter(name_or_param, /)

GitHub

Prüfen Sie, ob ein Parameterobjekt in diesem Stromkreis vorhanden ist.

Parameter

name_or_param (str |Parameter) – der Parameter bzw. der Name eines zu prüfenden Parameters. TrueWenn es sich um einen Parameter Knoten handelt, muss der Parameter genau dem angegebenen Wert entsprechen, damit diese Funktion den Wert zurückgibt.

Rückgabe

ob ein passender Parameter in dieser Schaltung zuweisbar ist.

Rückgabetyp

bool

Siehe auch

QuantumCircuit.get_parameter()

Rufe die Parameter Instanz anhand ihres Namens aus diesem Schaltkreis ab.

QuantumCircuit.has_var()

Parameterexpr.Var Eine ähnliche Methode wie diese, jedoch für Laufzeitvariablen anstelle von Kompilierungszeitvariablen.

get_parameter

get_parameter(name: str, default: T) → Parameter | T

get_parameter(name: str, default: builtin_types.EllipsisType = Ellipsis) → Parameter

GitHub

Abrufen eines Kompilierparameters, der in diesem Schaltkreisbereich über den Namen zugänglich ist.

Parameter

  • name (str) – der Name des abzurufenden Parameters.
  • default (Any) – Falls angegeben, wird dieser Wert zurückgegeben, wenn der Parameter nicht vorhanden ist. Wird dieser nicht angegeben, wird stattdessen KeyError ein ausgelöst.

Rückgabe

Der entsprechende Parameter.

Erhöht

KeyError - wenn kein Standardwert angegeben ist, der Parameter aber in der Schaltung nicht vorhanden ist.

Rückgabetyp

Parameter

Beispiele

Abrufen eines Parameters nach Namen aus einem Schaltkreis:

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_again

Ermittelt eine Variable aus einem Schaltkreis anhand ihres Namens und gibt einen Standardwert zurück, wenn sie nicht vorhanden ist:

assert qc.get_parameter("my_param", None) == my_param
assert qc.get_parameter("unknown_param", None) is None
Siehe auch

get_var()

Eine ähnliche Methode, jedoch für expr.Var Laufzeitvariablen anstelle von Parameter Kompilierungsparametern.

Arbeiten mit in Echtzeit eingegebenen klassischen Daten

Siehe auch

qiskit.circuit.classical

Dokumentation auf Modulebene über die Funktionsweise der Variablen-, Ausdrucks- und Typsysteme, die zu ihrer Darstellung verwendeten Objekte und die verfügbaren klassischen Operationen.

Klassische Echtzeit-Berechnungen

Eine Diskussion darüber, wie sich Echtzeitdaten in das gesamte qiskit.circuit datenmodell als Ganzes.

Hinzufügen von Datenobjekten

Die Methoden zum Hinzufügen neuer Var oder Stretch bezeichner zu einem Schaltkreis nach der Initialisierung.

Sie können Bezeichner abrufen, die mit einem Stromkreis verbunden sind (z. B. ein Var oder Stretch) nach Namen mit den Methoden get_var(), get_stretch(), oder get_identifier(). Sie können auch prüfen, ob ein Stromkreis einen bestimmten Bezeichner enthält, indem Sie has_var(), has_stretch(), oder has_identifier().

get_var

get_var(name: str, default: T) → Var | T

get_var(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var

GitHub

Ruft eine Variable ab, auf die in diesem Schaltkreisbereich über den Namen zugegriffen werden kann.

Parameter

  • name (str) – der Name der abzurufenden Variablen.
  • default (Any) – Falls angegeben, wird dieser Wert zurückgegeben, wenn die Variable nicht vorhanden ist. Wird dieser nicht angegeben, wird stattdessen KeyError ein ausgelöst.

Rückgabe

Die entsprechende Variable.

Erhöht

KeyError - wenn kein Standardwert angegeben ist, aber die Variable nicht existiert.

Beispiele

Abrufen einer Variablen nach Namen aus einem Schaltkreis:

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_again

Ermittelt eine Variable aus einem Schaltkreis anhand ihres Namens und gibt einen Standardwert zurück, wenn sie nicht vorhanden ist:

assert qc.get_var("my_var", None) == my_var
assert qc.get_var("unknown_variable", None) is None
Siehe auch

get_parameter()

Eine ähnliche Methode, allerdings für Parameter Kompilierzeitparameter anstelle von expr.Var Laufzeitvariablen.

get_stretch

get_stretch(name: str, default: T) → Stretch | T

get_stretch(name: str, default: builtin_types.EllipsisType = Ellipsis) → Stretch

GitHub

Ruft einen Abschnitt ab, der in diesem Schaltkreisbereich nach Namen zugänglich ist.

Parameter

  • name (str) – den Namen des Abschnitts, der abgerufen werden soll.
  • default (Any) – Falls angegeben, wird dieser Wert zurückgegeben, wenn die Variable nicht vorhanden ist. Wird dieser nicht angegeben, wird stattdessen KeyError ein ausgelöst.

Rückgabe

Die entsprechende Strecke.

Erhöht

KeyError - wenn kein Standardwert angegeben ist, aber die Variable nicht existiert.

Beispiele

Abrufen einer Strecke nach Namen aus einem Stromkreis:

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_again

Ermittelt eine Variable aus einem Schaltkreis anhand ihres Namens und gibt einen Standardwert zurück, wenn sie nicht vorhanden ist:

assert qc.get_stretch("my_stretch", None) == my_stretch
assert qc.get_stretch("unknown_stretch", None) is None

get_identifier

get_identifier(name: str, default: T) → Var | Stretch | T

get_identifier(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var | Stretch

GitHub

Abrufen eines Bezeichners, der in diesem Schaltkreisbereich über den Namen zugänglich ist.

Dazu gehören derzeit sowohl die klassischen Echtzeit-Variablen als auch die Dehnungen.

Parameter

  • name (str) – der Name des abzurufenden Bezeichners.
  • default (Any) – Falls angegeben, wird dieser Wert zurückgegeben, wenn die Variable nicht vorhanden ist. Wird dieser nicht angegeben, wird stattdessen KeyError ein ausgelöst.

Rückgabe

Die entsprechende Variable.

Erhöht

KeyError - wenn kein Standardwert angegeben ist, aber der Bezeichner nicht existiert.

Siehe auch

get_var()

Ruft einen Bezeichner ab, von dem bekannt ist, dass er eine expr.Var instanz ist.

get_stretch()

Ruft einen Bezeichner ab, von dem bekannt ist, dass er eine expr.Stretch instanz ist.

get_parameter()

Eine ähnliche Methode, allerdings für Parameter Kompilierzeitparameter anstelle von expr.Var Laufzeitvariablen.

has_var

has_var(name_or_var, /)

GitHub

Prüfen, ob eine Variable in diesem Bereich zugänglich ist.

Parameter

name_or_var (str |Var) – die Variable oder der Name einer zu überprüfenden Variable. Wenn es sich um einen expr.Var Knoten handelt, muss die Variable genau die angegebene sein, damit diese Funktion einen Wert zurückgibt True.

Rückgabe

ob eine passende Variable zugänglich ist.

Rückgabetyp

bool

Siehe auch

QuantumCircuit.get_var()

Rufen Sie die expr.Var instanz dieses Stromkreises anhand des Namens.

QuantumCircuit.has_parameter()

ParameterEine ähnliche Methode wie diese, jedoch für Variablen zur Kompilierungszeit anstelle von Laufzeitvariablen expr.Var .

has_stretch

has_stretch(name_or_stretch, /)

GitHub

Prüfen Sie, ob eine Strecke in diesem Bereich zugänglich ist.

Parameter

name_or_stretch (str |Stretch) – die Strecke oder der Name einer zu überprüfenden Strecke. Wenn es sich um einen expr.Stretch Knoten handelt, muss die Strecke genau die angegebene sein, damit diese Funktion einen Wert zurückgibt True.

Rückgabe

ob eine passende Strecke zugänglich ist.

Rückgabetyp

bool

Siehe auch

QuantumCircuit.get_stretch()

Rufen Sie die expr.Stretch instanz dieses Stromkreises anhand des Namens.

has_identifier

has_identifier(name_or_ident, /)

GitHub

Prüfen, ob ein Bezeichner in diesem Bereich zugänglich ist.

Parameter

name_or_ident (str |Var |Stretch) – die Instanz oder den Namen des zu überprüfenden Identifikators. Wenn es sich um einen expr.Var oder expr.Stretch Knoten handelt, muss die übereinstimmende Instanz genau die angegebene sein, damit diese Funktion zurückgibt True.

Rückgabe

ob ein passender Bezeichner zugänglich ist.

Rückgabetyp

bool

Siehe auch

QuantumCircuit.get_identifier()

Rufen Sie die expr.Var oder expr.Stretch instanz dieses Stromkreises nach Namen ab.

QuantumCircuit.has_var()

Dasselbe wie diese Methode, aber alles, was keine Laufzeitvariable expr.Var ist, wird ignoriert.

QuantumCircuit.has_stretch()

Dasselbe wie diese Methode, aber alles, was keine Laufzeitvariable expr.Stretch ist, wird ignoriert.

QuantumCircuit.has_parameter()

ParameterEine ähnliche Methode wie diese, jedoch für Variablen zur Kompilierungszeit anstelle von Laufzeitvariablen expr.Var .

Es gibt auch mehrere Iterator-Methoden, die Sie verwenden können, um den vollständigen Satz von Identifikatoren zu erhalten, die von einem Schaltkreis verfolgt werden. Mindestens eines von iter_input_vars() und iter_captured_vars() ist leer, da sich Inputs und Captures gegenseitig ausschließen. Alle Iteratoren haben entsprechende dynamische Eigenschaften auf QuantumCircuit die ihre Länge enthalten: num_vars, num_stretches, num_input_vars, num_captured_vars, num_captured_stretches, num_declared_vars, oder num_declared_stretches.

iter_vars

iter_vars()

GitHub

Ermittelt eine Iterable über alle klassischen Echtzeitvariablen, die in diesem Schaltkreis in Reichweite sind.

Diese Methode iteriert über alle Variablen im Geltungsbereich. Für detailliertere Iteratoren, siehe iter_declared_vars(), iter_input_vars() und iter_captured_vars().

Rückgabetyp

Iterable[* Var* ]

iter_stretches

iter_stretches()

GitHub

Ermittelt eine Iterable über alle in diesem Stromkreis vorhandenen Strecken.

Diese Methode iteriert über alle Strecken im Geltungsbereich. Für feinkörnigere Iteratoren siehe iter_declared_stretches() und iter_captured_stretches().

Rückgabetyp

Iterable[* Stretch* ]

iter_input_vars

iter_input_vars()

GitHub

Ermittelt eine Iterable über alle klassischen Echtzeitvariablen, die als Eingänge für diesen Schaltungsbereich deklariert sind. Dies schließt lokal deklarierte Variablen (siehe iter_declared_vars()) und erfasste Variablen (siehe iter_captured_vars()).

Rückgabetyp

Iterable[* Var* ]

iter_captured_vars

iter_captured_vars()

GitHub

Abrufen einer Iterable über alle klassischen Echtzeitvariablen, die von diesem Schaltkreisbereich erfasst werden, aus einem enthaltenen Bereich. Davon ausgenommen sind Eingabevariablen (siehe iter_input_vars()) und lokal deklarierte Variablen (siehe iter_declared_vars()).

Rückgabetyp

Iterable[* Var* ]

iter_captured_stretches

iter_captured_stretches()

GitHub

Abrufen einer Iterationskette über die von diesem Schaltkreisbereich erfassten Abschnitte aus einem enthaltenen Bereich. Dies schließt lokal deklarierte Strecken aus (siehe iter_declared_stretches()).

Rückgabetyp

Iterable[* Stretch* ]

iter_declared_vars

iter_declared_vars()

GitHub

Ermittelt eine Iterable über alle klassischen Echtzeitvariablen, die mit automatischer Speicherdauer in diesem Bereich deklariert sind. Dies schließt Eingabevariablen (siehe iter_input_vars()) und erfasste Variablen (siehe iter_captured_vars()).

Rückgabetyp

Iterable[* Var* ]

iter_declared_stretches

iter_declared_stretches()

GitHub

Ermittelt eine Iterable über alle in diesem Bereich deklarierten Dehnungen. Dies gilt nicht für erfasste Strecken (siehe iter_captured_stretches()).

Rückgabetyp

Iterable[* Stretch* ]


Hinzufügen von Operationen zu Schaltkreisen

Sie können alles, was die Operation Schnittstelle implementiert, mit einem einzigen Befehl zu einem Schaltkreis hinzufügen; allerdings werden die meisten Elemente, die Sie hinzufügen möchten, Instanzen von oder Gate sein Instruction .

Siehe auch

Operationen, Anweisungen und Gates

Die qiskit.circuit-dokumentation zu den verschiedenen Schnittstellen, die Qiskit zur Definition von Anweisungen auf Schaltungsebene verwendet.

Methoden zum Hinzufügen allgemeiner Operationen

Dies sind die Basismethoden, die das Hinzufügen beliebiger Objekte, einschließlich benutzerdefinierter Objekte, zu Schaltkreisen ermöglichen.

Methode
Verwendungszweck
append()Fügen Sie eine Anweisung als einzelnes Objekt in eine Schaltung ein.
_append()Dasselbe wie append(), aber eine Low-Level-Schnittstelle, die fast alle Fehlerprüfungen ausschließt.
compose()Inline-Befehle von einem Schaltkreis auf einen anderen übertragen.
tensor()Wie compose(), jedoch ausschließlich für die Verbindung von Schaltungen, die auf disjunkte Qubits wirken.

QuantumCircuit hat zwei Hauptmöglichkeiten, um weitere Operationen zu einem Schaltkreis hinzuzufügen. Die Wahl hängt davon ab, ob Sie Ihr Objekt als einzelne "Anweisung" hinzufügen wollen (append()), oder ob Sie die Anweisungen von zwei Schaltkreisen zusammenfügen wollen (compose()).

Ein einzelner Befehl oder eine einzelne Operation erscheint als einzelner Eintrag im data Schaltplan und als einzelnes Kästchen, wenn er in den Schaltplan-Visualisierungsprogrammen dargestellt wird (siehe draw()). Ein einzelner Befehl ist die „Einheit“, anhand derer ein Hardware-Backend definiert werden kann (siehe Target). definitionEin Instruction kann mit einem ausgestattet sein; dies ist eine Regel, auf die der Transpiler (siehe qiskit.transpiler) zurückgreifen kann, um ihn bei Bedarf für die Hardware zu zerlegen. Ein Operation , das nicht gleichzeitig ein Instruction ist, kann nur zerlegt werden, wenn dafür eine entsprechende Methode zur High-Level-Synthese registriert ist (siehe qiskit.transpiler.passes.synthesis.plugin).

InstructionEin „A“ QuantumCircuit allein ist kein einzelnes Element; es ist vielmehr komplizierter, da es im Allgemeinen ein vollständiges Programm mit typisierten klassischen Speichereingaben und -ausgaben sowie einem Kontrollfluss darstellen kann. Das Datenmodell von Qiskit (und der meisten Hardware) kennt noch nicht das Konzept wiederverwendbarer, aufrufbarer Unterprogramme mit virtuellen Quantenoperanden. to_instruction()to_gate()Man kann einfache Schaltkreise, die ausschließlich mit unitären Operationen auf Qubits wirken, mithilfe von in ein Gate umwandeln, und einfache Schaltkreise, die ausschließlich auf Qubits und Clbits wirken, mithilfe von in ein Instruction umwandeln.

append()GateWenn Sie ein Operation, Instruction, oder haben, fügen Sie es dem Schaltkreis hinzu und geben Sie dabei die Argumente „qubit“ und „clbit“ mit an.

append

append(instruction, qargs=None, cargs=None, *, copy=True)

GitHub

Fügen Sie eine oder mehrere Anweisungen an das Ende der Schaltung an und ändern Sie die Schaltung an Ort und Stelle.

InstructionDie qargs und cargs werden gemäß den Regeln der jeweiligen ausgeweitet und übertragen, und alle Nicht-SpezifiziererBit (wie beispielsweise ganzzahlige Indizes) werden in die entsprechenden Instanzen aufgelöst.

Wird ein CircuitInstruction angegeben, wird dieses entpackt, im Kontext dieser Schaltung überprüft und ein neues Objekt an die Schaltung angehängt. In diesem Fall dürfen Sie oder cargs nicht separat übergeben qargs .

Parameter

  • instruction (Operation |CircuitInstruction) –Instruction eine Instanz, die angehängt werden soll, oder ein CircuitInstruction mit seinem gesamten Kontext. Objekte, die implementieren to_instruction , werden ebenfalls unterstützt, doch wird im Allgemeinen die direkte Übergabe eines Instruction bevorzugt, da dadurch der Aufwand für wiederholte Konvertierungen vermieden wird.
  • qargs (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – Spezifizierer der Elemente Qubit, an die die Anweisung angehängt werden soll.
  • cargs (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]] | None) – Spezifizierer der Elemente Clbit, an die die Anweisung angehängt werden soll.
  • copy (bool) – wenn True (Standardeinstellung), dann wird die eingehende instruction kopiert, bevor sie dem Schaltkreis hinzugefügt wird, wenn sie symbolische Parameter enthält, so dass sie sicher geändert werden kann, ohne andere Schaltkreise zu beeinträchtigen, in denen sich dieselbe Anweisung befinden könnte. Wenn Sie sicher sind, dass diese Anweisung nicht in anderen Schaltungen vorkommt, können Sie diese False für einen kleinen Geschwindigkeitszuwachs einstellen.

Rückgabe

eine Übersicht über die CircuitInstructionS, die tatsächlich in den Schaltkreis eingefügt wurden.

Rückgabetyp

qiskit.circuit.InstructionSet

Erhöht

CircuitError – wenn die übergebene Operation keine Instanz von Instruction ist oder nicht durch Aufruf to_instruction von in eine solche umgewandelt werden kann.

append() führt eine umfangreiche Fehlerprüfung durch, um sicherzustellen, dass Sie nicht versehentlich das Datenmodell von QuantumCircuit. Wenn Sie einen Schaltkreis programmatisch aus bekannten, guten Daten erzeugen, können Sie einen Großteil dieser Fehlerprüfung umgehen, indem Sie den Fast-Path-Appender _append()verwenden, allerdings mit dem Risiko, dass der Aufrufer dafür verantwortlich ist, dass nur gültige Daten übergeben werden.

_append

_append(instruction: CircuitInstruction, *, _standard_gate: bool) → CircuitInstruction

_append(instruction: Operation, qargs: Sequence[Qubit], cargs: Sequence[Clbit]) → Operation

GitHub

Fügen Sie am Ende der Schaltung eine Anweisung an, die die Schaltung an Ort und Stelle verändert.

Achtung

Dies ist eine interne Schnellpfadfunktion, und es liegt in der Verantwortung des Aufrufers, sicherzustellen, dass alle Argumente gültig sind; es gibt hier keine Fehlerprüfung. Insbesondere gilt:

  • alle Qubits und Clbits müssen bereits in der Schaltung vorhanden sein, und es darf keine Duplikate in der Liste geben.
  • alle Anweisungen für Kontrollflussoperationen dürfen nur auf die im Schaltkreis vorhandenen Variablen wirken.
  • der Schaltkreis darf nicht in einem Kontext stehen, der den Kontrollfluss aufbaut.
Anmerkung

Diese Funktion kann von anderen Aufrufern verwendet werden als QuantumCircuit verwendet werden, wenn der Aufrufer sicher ist, dass alle Fehlerprüfungen, das Broadcasting und das Scoping bereits durchgeführt wurden und der einzige Verweis auf den Schaltkreis, an den die Anweisungen angehängt werden, innerhalb derselben Funktion liegt. Insbesondere ist es nicht sicher, die Funktion QuantumCircuit._append() auf einem Schaltkreis aufzurufen, der durch ein Funktionsargument empfangen wird. Der Grund dafür ist, dass QuantumCircuit._append() die Scoping-Konstrukte der Control-Flow-Builder-Schnittstelle nicht erkennen wird.

Parameter

  • unterricht -

    Eine vollständige, wohlgeformte CircuitInstruction Beschreibung des Vorgangs und seines Kontexts muss hinzugefügt werden.

    OperationIm Format zur Rückwärtskompatibilität kann dies ein bloßes sein; in diesem Fall qargs müssen und cargs explizit angegeben werden.

  • qargs – Veraltetes Argument für Qubits, an das das „bare“ Operation angehängt werden soll. Wird ignoriert, wenn das erste Argument in der bevorzugten CircuitInstruction Form vorliegt.

  • cargs – Veraltetes Argument für clbits, an das das „bare“ Operation angehängt werden soll. Wird ignoriert, wenn das erste Argument in der bevorzugten CircuitInstruction Form vorliegt.

  • _standard_gate (bool)

Rückgabe

ein Handle auf die soeben hinzugefügte Anweisung.

Rückgabetyp

CircuitInstruction

In anderen Fällen kann es sinnvoll sein, zwei Schaltkreise miteinander zu verbinden und die Anweisungen des einen Schaltkreises auf bestimmte Qubits und Clbits des anderen Schaltkreises anzuwenden. Dieser "Inlining"-Vorgang wird als compose() in Qiskit. compose() ist im Allgemeinen leistungsfähiger als ein to_instruction()-plus-append() kombination zum Verbinden zweier Schaltkreise, da sie auch typisierte klassische Daten miteinander verbinden kann und es ermöglicht, Schaltkreis-Kontrollflussoperationen mit einem anderen Schaltkreis zu verbinden.

Der Nachteil von compose() ist, dass es sich um eine komplexere Operation handelt, die mehr Umschreibungen des Operanden erfordern kann, und dass zwangsläufig Daten von einem Schaltkreisobjekt zu einem anderen verschoben werden müssen. Wenn Sie einen Schaltkreis für sich selbst aufbauen und rohe Leistung ein Hauptziel ist, sollten Sie in Erwägung ziehen, Ihren Basisschaltkreis weiterzugeben und verschiedene Teile Ihres Algorithmus direkt in den Basisschaltkreis schreiben zu lassen, anstatt einen temporären Schichtschaltkreis aufzubauen.

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

GitHub

Anwendung der Anweisungen eines Schaltkreises auf bestimmte Qubits und/oder Clbits eines anderen Schaltkreises.

Anmerkung

Standardmäßig wird dabei ein neues Schaltkreisobjekt erstellt, wobei self unberührt bleibt. Für die meisten Anwendungen dieser Funktion ist es weitaus effizienter, inplace=True einzustellen und die Basisschaltung an Ort und Stelle zu ändern.

Beim Umgang mit Echtzeitvariablen (expr.Var und expr.Stretch instanzen) gibt es zwei Hauptstrategien für die Verwendung von compose():

  1. Die Schaltung other wird als vollständig additiv behandelt, einschließlich ihrer Variablen. Die Variablen in other müssen sich vollständig von denen in self unterscheiden (verwenden Sie var_remap , um dabei zu helfen), und alle Variablen in other werden in der Ausgabe neu deklariert, wobei die Eingabe-/Erfassungs-/lokale Skalierung derjenigen in other entspricht. Dies ist in der Regel der Fall, wenn Sie zwei nicht zusammenhängende Stromkreise miteinander verbinden wollen.
  2. Die Schaltung other wurde als exakte Erweiterung von self erstellt, um an diese angehängt zu werden, einschließlich der Wirkung auf die bestehenden Variablen in ihren Zuständen am Ende von self. In diesem Fall sollte other erstellt werden, wobei alle Variablen, die inlined werden sollen, als "captures" deklariert werden, und dann können Sie inline_captures=True in dieser Methode verwenden, um sie zu verknüpfen. Das ist in der Regel das, was Sie wollen, wenn Sie eine Schaltung durch die Definition von Ebenen im laufenden Betrieb aufbauen oder eine Schaltung mit Ebenen aus sich selbst neu aufbauen. Sie könnten das Argument vars_mode="captures" für copy_empty_like() nützlich, um in diesem Fall die Basis jeder Ebene zu erstellen.

Parameter

  • other (qiskit.circuit.Instruction orQuantumCircuit) – (Teil-)Schaltkreis oder Befehl, sich selbst zu überlagern. QuantumCircuitWenn es kein a ist, kann es alles sein, was append akzeptiert wird.

  • qubits (list[Qubit|int]) – qubits von sich selbst zu komponieren.

  • clbits (list[Clbit|int]) – klumpen von sich selbst zu komponieren.

  • front (bool) – Wenn True, wird der vordere Aufbau durchgeführt. Dies ist bei Control-Flow-Builder-Kontextmanagern nicht möglich.

  • inplace (bool) – Wenn True, ändern Sie das Objekt. Andernfalls wird die zusammengesetzte Schaltung zurückgegeben.

  • copy (bool) – Wenn True (Standardeinstellung), dann wird die Eingabe als gemeinsam genutzt behandelt, und alle enthaltenen Anweisungen werden kopiert, falls sie in Zukunft geändert werden müssen. Sie können diesen Wert auf False setzen, wenn die Eingabe als Eigentum des Basisschaltkreises betrachtet werden soll, um unnötige Kopien zu vermeiden; in diesem Fall ist es nicht zulässig, danach other zu verwenden, und einige Anweisungen könnten an Ort und Stelle mutiert worden sein.

  • var_remap (Mapping) –

    mapping zu verwenden, um umzuschreiben expr.Var und expr.Stretch knoten in other umzuschreiben, da sie in self eingefügt werden. Dies kann dazu dienen, Namenskonflikte zu vermeiden.

    Sowohl Schlüssel als auch Werte können als Strings oder direkte Bezeichnerinstanzen angegeben werden. Wenn ein Schlüssel eine Zeichenkette ist, passt er auf jede Var oder Stretch mit demselben Namen. Wenn ein Wert eine Zeichenkette ist, wird jedes Mal, wenn ein neuer Schlüssel darauf passt, ein neuer Var oder Stretch mit dem richtigen Typ erstellt. Wenn ein Wert ein Varist, muss sein type genau mit dem der Variablen übereinstimmen, die er ersetzt.

  • inline_captures (bool) –

    wenn True, dann werden alle "erfassten" Identifikator-Knoten in other QuantumCircuit auf Bezeichner, die bereits in self deklariert sind (als beliebiger Eingabe-/Erfassungs-/lokaler Typ), und die Verwendungen in other gelten für die vorhandenen Bezeichner. Wenn Sie eine Ebene für eine bestehende Schaltung aufbauen wollen, die Sie mit compose()zu verwenden, könnte das Argument vars_mode="captures" für copy_empty_like() nützlich sein. Jede Neuzuordnung in vars_remap erfolgt vor der Auswertung dieser Variablen-Inlining.

    Wenn dies False ist (Standardeinstellung), dann müssen sich alle Bezeichner in other von denen in self unterscheiden, und es werden neue Deklarationen für sie vorgenommen.

  • wrap (bool) – Wenn True, wird die andere Schaltung in ein Gatter (oder eine Anweisung, je nachdem, ob sie nur unitäre Anweisungen enthält) umgewandelt, bevor sie mit self zusammengesetzt wird. Anstatt diese Option zu verwenden, ist es fast immer besser, dies selbst manuell zu kontrollieren, indem Sie to_instruction() oder to_gate()und rufen Sie dann append().

Rückgabe

die zusammengesetzte Schaltung (gibt None zurück, wenn inplace==True).

Rückgabetyp

QuantumCircuit

Erhöht

  • CircuitError - wenn keine korrekte Zuordnung zwischen den beiden Stromkreisen möglich ist, z. B. wenn other breiter ist als self.
  • CircuitError - wenn versucht wird, einen neuen Schaltkreis zu emittieren, während self einen teilweise aufgebauten Kontrollflusskontext aktiv hat, wie z. B. die Kontext-Manager-Formen von if_test(), for_loop() und while_loop().
  • CircuitError - wenn versucht wird, an der Vorderseite eines Schaltkreises zu komponieren, wenn ein Kontrollfluss-Builder-Block aktiv ist; es gibt keine klare Bedeutung für diese Aktion.

Beispiele

>>> 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 ═══════════════════════

Wenn Sie versuchen, zwei Schaltkreise zu verbinden, gilt dies für völlig unzusammenhängende Qubits und Clbits, tensor() ist ein praktischer Wrapper, um Bit-Objekte manuell hinzuzufügen und die compose().

tensor

tensor(other, inplace=False)

GitHub

Tensor self mit other.

Denken Sie daran, dass in der Little-Endian-Konvention die am weitesten links stehende Operation am Ende der Schaltung steht. Weitere Informationen finden Sie auch in der Dokumentation.

     ┌────────┐        ┌─────┐          ┌─────┐
q_0: ┤ bottom ├ ⊗ q_0: ┤ top ├  = q_0: ─┤ top ├──
     └────────┘        └─────┘         ┌┴─────┴─┐
                                  q_1: ┤ bottom ├
                                       └────────┘

Parameter

  • other (QuantumCircuit) – Der andere Stromkreis, mit dem dieser Stromkreis zu spannen ist.
  • inplace (bool) – Wenn True, ändern Sie das Objekt. Andernfalls geben Sie die zusammengesetzte Schaltung zurück.

Rückgabetyp

QuantumCircuit | Keine

Beispiele

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')
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Rückgabe

Der gespannte Stromkreis (gibt None zurück, wenn inplace=True).

Rückgabetyp

QuantumCircuit

Parameter

Einige Faustregeln:

  • _append()GateWenn Sie ein einzelnes Operation, Instruction oder haben, sollten Sie auf jeden Fall oder verwenden append() .
  • Wenn Sie eine QuantumCircuit die eine einzelne atomare Anweisung für eine größere Schaltung darstellt, die Sie wiederverwenden wollen, sollten Sie wahrscheinlich to_instruction() oder to_gate()aufrufen und dann das Ergebnis dieser Anweisung auf die Schaltung anwenden, indem Sie append().
  • Wenn Sie eine QuantumCircuit die eine größere "Schicht" einer anderen Schaltung darstellt oder typisierte klassische Variablen oder einen Kontrollfluss enthält, sollten Sie compose() verwenden, um sie in eine andere Schaltung einzubinden.
  • tensor() wird viel seltener gewünscht als entweder append() oder compose(). Intern ist es hauptsächlich ein Wrapper um add_bits() und compose().

Einige potenzielle Fallstricke, auf die Sie achten sollten:

  • Selbst wenn Sie bei der Schaltungserstellung eine benutzerdefinierte Instruction Funktion wiederverwenden, muss der Transpiler in der Regel jeden Aufruf dieser Funktion zunächst in ihre inneren Bestandteile „entfalten“, bevor er mit der Bearbeitung beginnen kann. Das sollte Sie jedoch nicht davon abhalten, das to_instruction()„-plus“-Musterappend() zu verwenden, da sich der Transpiler in dieser Hinsicht mit der Zeit verbessern wird.
  • compose() wird aus Gründen der Abwärtskompatibilität standardmäßig ein neuer Schaltkreis erzeugt. Dies ist teurer und in der Regel nicht das, was Sie wollen, daher sollten Sie inplace=True einstellen.
  • TrueSowohl append() als auch compose() (jedoch nicht _append()) verfügen über ein copy Schlüsselwortargument, dessen Standardwert ist. In diesen Fällen werden die eingehenden Operation Instanzen kopiert, wenn Qiskit feststellt, dass die Objekte veränderbar sind (z. B. bei der Übernahme von Gate-Parametern). Wenn Sie sicher sind, dass Sie die Objekte an anderer Stelle nicht erneut verwenden werden, sollten Sie die Option so einstellen copy=False , dass dieses Kopieren verhindert wird, was bei großen Objekten zu einer erheblichen Beschleunigung führen kann.

Methoden zum Hinzufügen von Standardanweisungen

Die QuantumCircuit Klasse verfügt über Hilfsmethoden, mit denen sich viele der Befehle und Gatter aus der Qiskit-Standardbibliothek in eine Schaltung einfügen lassen. Dies entspricht im Allgemeinen dem manuellen Erstellen einer Instanz des entsprechenden qiskit.circuit.library Objekts, die dann an übergeben append() wird, wobei die übrigen Argumente entsprechend in die Felder qargs cargs und eingefügt werden.

Die folgenden Methoden wenden spezielle nicht-unitäre Instruction Operationen auf den Schaltkreis an:

Bei diesen Methoden werden unkontrollierte unitäre Gate Instanzen auf die Schaltung angewendet:

ControlledGateDie folgenden Methoden gelten für Gate Instanzen, die gleichzeitig gesteuerte Gatter sind und somit direkte Unterklassen von sind:

Schließlich wenden diese Methoden bestimmte verallgemeinerte, mehrfach gesteuerte Gatter auf die Schaltung an, oft mit eifrigen Synthesen. Sie sind in Bezug auf das Basisgatter aufgeführt, das sie steuern, da ihr genauer Ausgang oft eine synthetisierte Version eines Gatters ist.

Der Rest dieses Abschnitts ist die API-Liste aller einzelnen Methoden; die Tabellen oben sind Zusammenfassungen, deren Links Sie an die richtige Stelle führen.

barrier

barrier(*qargs, label=None)

GitHub

Bewerben Sie sich unter Barrier. Wenn qargs leer ist, gilt es für alle Qubits in der Schaltung.

Parameter

  • qargs (QubitSpecifier) – Spezifikation für ein oder mehrere Qubit-Argumente.
  • label (str) – Die Bezeichnung der Schranke.

Rückgabe

griff zu den zusätzlichen Anweisungen.

Rückgabetyp

qiskit.circuit.InstructionSet

ccx

ccx(control_qubit1, control_qubit2, target_qubit, ctrl_state=None)

GitHub

Bewerben CCXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

ccz

ccz(control_qubit1, control_qubit2, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CCZGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

ch

ch(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CHGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

cp

cp(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CPhaseGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

crx

crx(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CRXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

cry

cry(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CRYGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

crz

crz(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CRZGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

cs

cs(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CSGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

csdg

csdg(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CSdgGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

cswap

cswap(control_qubit, target_qubit1, target_qubit2, label=None, ctrl_state=None)

GitHub

Bewerben CSwapGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

csx

csx(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CSXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

cu

cu(theta, phi, lam, gamma, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CUGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

cx

cx(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

cy

cy(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CYGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

  • control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die als Kontrollqubit(e) verwendete(n) Qubit(e).
  • target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die sich das Gatter bezieht.
  • label (str | None) – Die Beschriftung des Gatters in der Schaltung.
  • ctrl_state (str |int | None) – Der Kontrollstatus in dezimaler Form oder als Bitstring (z. B. '1'). Standardmäßig wird der Zustand "1" kontrolliert.

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

cz

cz(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Bewerben CZGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

  • control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die als Kontrollqubit(e) verwendete(n) Qubit(e).
  • target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die sich das Gatter bezieht.
  • label (str | None) – Die Beschriftung des Gatters in der Schaltung.
  • ctrl_state (str |int | None) – Der Kontrollstatus in dezimaler Form oder als Bitstring (z. B. '1'). Standardmäßig wird der Zustand "1" kontrolliert.

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

dcx

dcx(qubit1, qubit2)

GitHub

Bewerben DCXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

delay

delay(duration, qarg=None, unit=None)

GitHub

Bewerbung Delay. Wenn qarg None ist, gilt es für alle Qubits. Bei Anwendung auf mehrere Qubits werden Verzögerungen mit der gleichen Dauer erzeugt.

Parameter

  • duration (Object) – dauer der Verzögerung. Wenn es sich um einen Exprist, muss es sich um einen konstanten Ausdruck vom Typ Duration.
  • qarg (Object) – qubit-Argument, um diese Verzögerung anzuwenden.
  • unit (str | None) – einheit der Dauer, es sei denn, duration ist ein Expr ist; in diesem Fall muss sie nicht angegeben werden. Unterstützte Einheiten: 's', 'ms', 'us', 'ns', 'ps', und 'dt'. Standard ist 'dt', d.h. eine ganzzahlige Zeiteinheit, die vom Ziel-Backend abhängt.

Rückgabe

griff zu den zusätzlichen Anweisungen.

Rückgabetyp

qiskit.circuit.InstructionSet

Erhöht

CircuitError - wenn die Argumente ein schlechtes Format haben.

ecr

ecr(qubit1, qubit2)

GitHub

Bewerben ECRGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

h

h(qubit)

GitHub

Bewerben HGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

id

id(qubit)

GitHub

Bewerben IGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

initialize

initialize(params, qubits=None, normalize=False)

GitHub

Initialisierung der Qubits in einem bestimmten Zustand.

Die Initialisierung der Qubits erfolgt, indem die Qubits zunächst auf „ ∣0⟩|0\rangle “ zurückgesetzt werden und anschließend die Klasse aufgerufen StatePreparation wird, um die Qubits in einen bestimmten Zustand zu versetzen. Beide Schritte sind in der Initialize Anleitung enthalten.

Parameter

  • params (Statevector | Sequence[complex] | str |int) –

    Der Zustand, in den initialisiert werden soll, kann einer der folgenden sein

    • Zustandsvektor oder Vektor der komplexen Amplituden, auf den initialisiert werden soll.
    • Bezeichnungen der Basiszustände der Pauli-Eigenzustände Z, X, Y. Siehe Statevector.from_label(). Beachten Sie, dass die Reihenfolge der Bezeichnungen im Vergleich zum Index des betreffenden Qubits umgekehrt ist. Das Beispiel-Label '01' initialisiert das Qubit Null mit ∣1⟩|1\rangle und das Qubit Eins mit ∣0⟩|0\rangle.
    • Eine ganze Zahl, die als Bitmap verwendet wird und angibt, welche Qubits auf ∣1⟩|1\rangle initialisiert werden sollen. Beispiel: Wenn params auf 5 gesetzt wird, werden Qubit 0 und Qubit 2 auf ∣1⟩|1\rangle und Qubit 1 auf ∣0⟩|0\rangle initialisiert.
  • qubits (Sequence[QubitSpecifier] | None) – Qubits zu initialisieren. Bei None wird die Initialisierung auf alle Qubits in der Schaltung angewendet.

  • normalize (bool) – Ob ein Eingabefeld auf einen Einheitsvektor normalisiert werden soll.

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Beispiele

Bereiten Sie ein Qubit mit dem Zustand (∣0⟩−∣1⟩)/2(|0\rangle - |1\rangle) / \sqrt{2} vor.

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(1)
circuit.initialize([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()

Ausgabe:

     ┌──────────────────────────────┐
q_0: ┤ Initialize(0.70711,-0.70711) ├
     └──────────────────────────────┘

Initialisiere anhand einer Zeichenkette zwei Qubits im Zustand „ ∣10⟩|10\rangle “. Die Reihenfolge der Bezeichnungen ist im Vergleich zum Qubit-Index umgekehrt. Weitere Informationen zu Bezeichnungen für Grundzustände finden Sie in Statevector.from_label().

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.initialize('01', circuit.qubits)
circuit.draw()

Ausgabe:

     ┌──────────────────┐
q_0: ┤0                 ├
     │  Initialize(0,1) │
q_1: ┤1                 ├
     └──────────────────┘

Initialisierung von zwei Qubits aus einem Array komplexer Amplituden.

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

Ausgabe:

     ┌────────────────────────────────────┐
q_0: ┤0                                   ├
     │  Initialize(0,0.70711,-0.70711j,0) │
q_1: ┤1                                   ├
     └────────────────────────────────────┘

iswap

iswap(qubit1, qubit2)

GitHub

Bewerben iSwapGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

mcp

mcp(lam, control_qubits, target_qubit, ctrl_state=None)

GitHub

Bewerben MCPhaseGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

mcrx

mcrx(theta, q_controls, q_target, use_basis_gates=False)

GitHub

Mehrfach-gesteuertes X-Dreh-Gate anwenden

Parameter

mcry

mcry(theta, q_controls, q_target, q_ancillae=None, mode=None, use_basis_gates=False)

GitHub

Mehrfachgesteuertes Y-Drehungstor anwenden

Parameter

mcrz

mcrz(lam, q_controls, q_target, use_basis_gates=False)

GitHub

Mehrfachgesteuertes Z-Drehungstor anwenden

Parameter

mcx

mcx(control_qubits, target_qubit, ancilla_qubits=None, mode=None, ctrl_state=None)

GitHub

Bewerben MCXGate.

Das Gatter multi-cX kann mit verschiedenen Techniken implementiert werden, die eine unterschiedliche Anzahl von Ancilla-Qubits verwenden und eine unterschiedliche Schaltungstiefe aufweisen. Diese Modi sind:

  • 'noancilla': Benötigt 0 Ancilla-Qubits.
  • 'recursion': Erfordert 1 Ancilla-Qubit, wenn mehr als 4 Kontrollen verwendet werden, sonst 0.
  • 'v-chain': Benötigt 2 Ancillas weniger als die Anzahl der Kontrollqubits.
  • 'v-chain-dirty': Wie bei den sauberen Ancillas (aber der Kreislauf wird länger).

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Veraltet seit Version 2.1

qiskit.circuit.quantumcircuit.QuantumCircuit.mcx()das Argument mode ist ab Qiskit 2.1 veraltet. Sie wird frühestens 3 Monate nach dem Datum der Veröffentlichung entfernt. Fügen Sie stattdessen ein generisches MCXGate in die Schaltung ein und geben Sie die Synthesemethode über die hls_config in der Transpilierung an. Alternativ dazu sind spezifische Zerlegungen verfügbar unter https://qisk.it/mcx.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Erhöht

  • ValueError - wenn der angegebene Modus nicht bekannt ist oder wenn zu wenige Ancilla-Qubits übergeben werden.
  • AttributeError - wenn keine Ancilla-Qubits übergeben werden, aber welche benötigt werden.

Rückgabetyp

InstructionSet

measure

measure(qubit, cbit)

GitHub

Messen Sie ein Quantenbit (qubit) in der Z-Basis in ein klassisches Bit (cbit).

Wenn ein Quantenzustand gemessen wird, wird ein Qubit in der Berechnungsbasis (Pauli Z) entweder auf ∣0⟩\lvert 0 \rangle oder ∣1⟩\lvert 1 \rangle projiziert. Das klassische Bit cbit zeigt das Ergebnis dieser Projektion als 0 bzw. 1 an. Dieser Vorgang ist nicht umkehrbar.

Parameter

Rückgabe

griff zu den zusätzlichen Anweisungen.

Rückgabetyp

qiskit.circuit.InstructionSet

Erhöht

CircuitError - wenn die Argumente ein schlechtes Format haben.

Beispiele

In diesem Beispiel wird ein Qubit gemessen, und das Ergebnis dieser Messung wird im klassischen Bit gespeichert (in Diagrammen üblicherweise als Doppellinie dargestellt):

from qiskit import QuantumCircuit
circuit = QuantumCircuit(1, 1)
circuit.h(0)
circuit.measure(0, 0)
circuit.draw()
     ┌───┐┌─┐
  q: ┤ H ├┤M├
     └───┘└╥┘
c: 1/══════╩═
           0

Es ist möglich, measure mit Listen von qubits und cbits als Abkürzung für die Eins-zu-eins-Messung aufzurufen. Diese beiden Formen führen zu identischen Ergebnissen:

circuit = QuantumCircuit(2, 2)
circuit.measure([0,1], [0,1])
circuit = QuantumCircuit(2, 2)
circuit.measure(0, 0)
circuit.measure(1, 1)

Anstelle von Listen können Sie auch QuantumRegister und ClassicalRegister nach der gleichen Logik verwenden.

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
qreg = QuantumRegister(2, "qreg")
creg = ClassicalRegister(2, "creg")
circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg, creg)

Dies ist gleichbedeutend mit:

circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg[0], creg[0])
circuit.measure(qreg[1], creg[1])

ms

ms(theta, qubits)

GitHub

Bewerben MSGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

p

p(theta, qubit)

GitHub

Bewerben PhaseGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

pauli

pauli(pauli_string, qubits)

GitHub

Bewerben PauliGate.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

prepare_state

prepare_state(state, qubits=None, label=None, normalize=False)

GitHub

Bereiten Sie Qubits in einem bestimmten Zustand vor.

Diese Klasse implementiert eine zustandsvorbereitende Einheit. Im Gegensatz zu initialize() setzt es die Qubits nicht vorher zurück.

Parameter

  • state (Statevector | Sequence[complex] | str |int) –

    Der Zustand, in den initialisiert werden soll, kann einer der folgenden sein

    • Zustandsvektor oder Vektor der komplexen Amplituden, auf den initialisiert werden soll.
    • Bezeichnungen der Basiszustände der Pauli-Eigenzustände Z, X, Y. Siehe Statevector.from_label(). Beachten Sie, dass die Reihenfolge der Bezeichnungen im Vergleich zum Index des betreffenden Qubits umgekehrt ist. Die Beispielbezeichnung „01“ initialisiert das Qubit Null auf ∣1⟩|1\rangle und das Qubit Eins auf ∣0⟩|0\rangle.
    • Eine ganze Zahl, die als Bitmap verwendet wird und angibt, welche Qubits auf ∣1⟩|1\rangle initialisiert werden sollen. Beispiel: Wenn params auf 5 gesetzt wird, werden Qubit 0 und Qubit 2 auf ∣1⟩|1\rangle und Qubit 1 auf ∣0⟩|0\rangle initialisiert.
  • qubits (Sequence[QubitSpecifier] | None) – Qubits zu initialisieren. Bei None wird die Initialisierung auf alle Qubits in der Schaltung angewendet.

  • label (str | None) – Ein optionales Etikett für das Tor

  • normalize (bool) – Ob ein Eingabefeld auf einen Einheitsvektor normalisiert werden soll.

Rückgabe

Ein Handle zu der Anweisung, die gerade initialisiert wurde

Rückgabetyp

InstructionSet

Beispiele

Bereiten Sie ein Qubit mit dem Zustand (∣0⟩−∣1⟩)/2(|0\rangle - |1\rangle) / \sqrt{2} vor.

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

Ausgabe:

     ┌─────────────────────────────────────┐
q_0: ┤ State Preparation(0.70711,-0.70711) ├
     └─────────────────────────────────────┘

Bereite aus einer Zeichenkette zwei Qubits im Zustand ∣10⟩|10\rangle vor. Die Reihenfolge der Bezeichnungen ist im Vergleich zum Qubit-Index umgekehrt. Weitere Informationen zu Bezeichnungen für Grundzustände finden Sie in Statevector.from_label().

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.prepare_state('01', circuit.qubits)
circuit.draw()

Ausgabe:

     ┌─────────────────────────┐
q_0: ┤0                        ├
     │  State Preparation(0,1) │
q_1: ┤1                        ├
     └─────────────────────────┘

Initialisierung von zwei Qubits aus einem Array komplexer Amplituden

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

Ausgabe:

     ┌───────────────────────────────────────────┐
q_0: ┤0                                          ├
     │  State Preparation(0,0.70711,-0.70711j,0) │
q_1: ┤1                                          ├
     └───────────────────────────────────────────┘

r

r(theta, phi, qubit)

GitHub

Bewerben RGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

rcccx

rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit)

GitHub

Bewerben RC3XGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

rccx

rccx(control_qubit1, control_qubit2, target_qubit)

GitHub

Bewerben RCCXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

reset

reset(qubit)

GitHub

Setzen Sie das/die Quantenbit(s) auf ihren Standardzustand zurück.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Quantenbit(s) zurücksetzen.

Rückgabe

handle zu der hinzugefügten Anweisung.

Rückgabetyp

qiskit.circuit.InstructionSet

rv

rv(vx, vy, vz, qubit)

GitHub

Bewerben RVGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Drehung um eine beliebige Drehachse vv, wobei ∣v∣|v| der Drehwinkel in Radiant ist.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

rx

rx(theta, qubit, label=None)

GitHub

Bewerben RXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

rxx

rxx(theta, qubit1, qubit2)

GitHub

Bewerben RXXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

ry

ry(theta, qubit, label=None)

GitHub

Bewerben RYGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

ryy

ryy(theta, qubit1, qubit2)

GitHub

Bewerben RYYGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

rz

rz(phi, qubit)

GitHub

Bewerben RZGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

rzx

rzx(theta, qubit1, qubit2)

GitHub

Bewerben RZXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

rzz

rzz(theta, qubit1, qubit2)

GitHub

Bewerben RZZGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

s

s(qubit)

GitHub

Bewerben SGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

sdg

sdg(qubit)

GitHub

Bewerben SdgGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

store

store(lvalue, rvalue, /)

GitHub

Speichern Sie das Ergebnis des gegebenen klassischen Echtzeit-Ausdrucks rvalue an der durch lvalue definierten Speicherstelle.

Typischerweise ist lvalue ein Var knoten und rvalue wird ein Expr zu schreiben, aber alles, was expr.lift() zu einem Expr führen kann, ist an beiden Stellen zulässig und wird an ihnen aufgerufen.

Parameter

  • lvalue (Any) – ein gültiger Bezeichner für einen Speicherplatz in der Schaltung. Dies wird normalerweise ein Var knoten, aber Sie können auch auf Clbit oder ClassicalRegister speicherplätze schreiben, wenn Ihre Hardware dies unterstützt. Der Speicherplatz muss bereits in der Schaltung vorhanden sein.
  • rvalue (Any) – ein klassischer Echtzeit-Ausdruck, dessen Ergebnis an die angegebene Speicherstelle geschrieben werden soll.

Rückgabetyp

InstructionSet

Siehe auch

Store

Die zugrunde liegende Instruction Klasse, die diesen Vorgang repräsentiert.

add_var()

Erstellen Sie eine neue Variable in der Schaltung, die mit dieser Methode beschrieben werden kann.

swap

swap(qubit1, qubit2)

GitHub

Bewerben SwapGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

sx

sx(qubit)

GitHub

Bewerben SXGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

sxdg

sxdg(qubit)

GitHub

Bewerben SXdgGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

t

t(qubit)

GitHub

Bewerben TGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

tdg

tdg(qubit)

GitHub

Bewerben TdgGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

u

u(theta, phi, lam, qubit)

GitHub

Bewerben UGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

unitary

unitary(obj, qubits, label=None)

GitHub

Wenden Sie das von obj angegebene Unitary Gate auf qubits an.

Parameter

  • obj (np.ndarray | Gate | BaseOperator) – Einheitsoperator.
  • qubits (Sequence[QubitSpecifier]) – Die Schaltkreis-Qubits, auf die die Transformation angewendet werden soll.
  • label (str | None) – Einheitlicher Name für Backend [Standard: Keiner].

Rückgabe

Der Quantenschaltkreis.

Rückgabetyp

QuantumCircuit

Beispiel

Anwendung eines durch eine unitäre Matrix spezifizierten Gatters auf eine Quantenschaltung

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)

GitHub

Bewerben XGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

y

y(qubit)

GitHub

Bewerben YGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

z

z(qubit)

GitHub

Bewerben ZGate.

Die vollständige Matrixform dieses Gatters finden Sie in der zugrunde liegenden Gatterdokumentation.

Parameter

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Das/die Qubit(e), auf das/die das Gatter angewendet werden soll(en).

Rückgabe

Ein Handle zu den erstellten Anweisungen.

Rückgabetyp

InstructionSet

Hinzufügen von Kontrollfluss zu Schaltkreisen

Siehe auch

Kontrollfluss in Schaltkreisen

Diskussion darüber, wie Kontrollflussoperationen im Gesamtkontext dargestellt werden qiskit.circuit kontext.

QuantumCircuit verfügt über entsprechende Methoden für alle von Qiskit unterstützten Kontrollflussoperationen. Es gibt zwei Möglichkeiten, sie aufzurufen. ControlFlowOpDie erste ist eine sehr einfache Hilfsfunktion, die die Blockkörper der Anweisungen als QuantumCircuit Argumente entgegennimmt und einfach die entsprechenden Blöcke erstellt und anhängt.

Die zweite Form, deren Verwendung wir Ihnen für die Gestaltung des Kontrollflusses nachdrücklich empfehlen, wird als Builder-Schnittstelle bezeichnet. withHier verwenden die Methoden lediglich die Echtzeit-Diskriminante der Operation und geben Kontextmanager zurück, die Sie mithilfe von eingeben. Anschließend können Sie innerhalb dieser Blöcke reguläre QuantumCircuit Methoden verwenden, um die Kontrollfluss-Körper aufzubauen, und Qiskit verfolgt automatisch, welche Datenressourcen für die inneren Blöcke benötigt werden, und erstellt den vollständigen ControlFlowOp Code, sobald Sie die with Anweisung verlassen. Es ist weitaus einfacher und weniger fehleranfällig, den Programmablauf auf diese Weise programmgesteuert zu gestalten.

Bei der Verwendung der Control-Flow-Builder-Schnittstelle kann es vorkommen, dass ein Qubit in einen Block aufgenommen werden soll, obwohl es keine definierten Operationen hat. In diesem Fall können Sie die noop() methode.

QuantumCircuit.has_control_flow_op()Um zu überprüfen, ob ein Circuit ein ControlFlowOp enthält, kannst du die Hilfsmethode verwenden.

box

box(body_or_annotations=Ellipsis, /, qubits=None, clbits=None, *, label=None, duration=None, unit=None, annotations=Ellipsis)

GitHub

Erstellen Sie eine box von Operationen auf dieser Schaltung, die im größeren Kontext atomar behandelt werden.

Eine "Box" ist ein Kontrollflusskonstrukt, das bedingungslos eingegeben wird. Der Inhalt der Box verhält sich in gewisser Weise so, als wären der Anfang und das Ende der Box Schranken (siehe barrier()), mit der Ausnahme, dass es zulässig ist, Operationen "den ganzen Weg" durch die Box zu pendeln. Die Box ist auch ein expliziter Bereich für die Zwecke von Variablen, Strecken und Compilerübergängen.

Es gibt zwei Möglichkeiten, diese Funktion aufzurufen:

  • Übergebe eine QuantumCircuit Position und die qubits Elemente, clbits auf die sie wirkt. In diesem Formular wird ein BoxOp sofort erstellt und mit dem Schaltkreis als Hauptteil angehängt.
  • Verwendung in einer with -Anweisung ohne body, qubits oder clbits. Dies ist das "Builder-Interface-Formular", in dem Sie dann mit anderen QuantumCircuit methoden innerhalb des Bereichs Python with verwenden, um dem box Anweisungen hinzuzufügen. Dies ist die bevorzugte Form, die viel weniger fehleranfällig ist.

Beispiele

Verwendung der Builder-Schnittstelle, um zwei Boxen nacheinander hinzuzufügen. Die beiden Boxen in dieser Schaltung können gleichzeitig ausgeführt werden, und die zweite fügt ausdrücklich eine Datenflussabhängigkeit von Qubit 8 für die Dauer der Box ein, auch wenn das Qubit im Leerlauf ist.

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)

Unter Verwendung der expliziten Konstruktion von box. Dies erzeugt den gleichen Kreislauf wie oben und sollte einen Hinweis darauf geben, warum die vorherige Form für die interaktive Nutzung vorzuziehen ist.

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], [])

Parameter

  • body_or_annotations (QuantumCircuit |Iterable[Annotation]) – Das erste Positionsargument hat keinen Namen. Wird ein QuantumCircuit als Positionsparameter übergeben, wird es sofort als Inhalt der Box verwendet, und qubits sowie clbits müssen ebenfalls angegeben werden. Wird kein Argument angegeben oder wird eine iterierbare Menge von Annotation Objekten übergeben, wird die Kontextmanager-Variante dieser Methode ausgelöst.
  • qubits (Sequence[QubitSpecifier] | None) – die Qubits, auf die die BoxOp Operation in der expliziten Form angewendet werden soll.
  • clbits (Sequence[ClbitSpecifier] | None) – die Clbits, auf die die BoxOp Funktion in der expliziten Form angewendet werden soll.
  • label (str | None) – eine optionale Zeichenkettenbezeichnung für die Anweisung.
  • duration (None) – eine optionale explizite Dauer für das BoxOp. Bei der Terminierung von Passes wird der darin enthaltene Umfang so terminiert, dass er einer vorgegebenen Dauer entspricht, gegebenenfalls unter Einfügung von Verzögerungen.
  • unit (Literal['dt', 's', 'ms', 'us', 'ns', 'ps', 'expr'] | None) – die Einheit der duration.
  • annotations (Iterable[Annotation]) – alle Annotation Objekte, die die Schachtel enthalten soll. Wird diese Methode in Form eines Kontextmanagers verwendet, kann dieses Argument stattdessen als einziges Positionsargument übergeben werden.

break_loop

break_loop()

GitHub

Bewerben BreakLoopOp.

Achtung

while_loop()Wenn Sie die „Builder“-Formen des Kontextmanagers von if_test(), for_loop() oder verwenden, können Sie diese Methode nur innerhalb eines Schleifenkontexts aufrufen, da sonst die „Ressourcenbreite“ der Operation nicht ermittelt werden kann. if_else()Dies würde schnell zu ungültigen Schaltkreisen führen. Wenn Sie also versuchen, einen wiederverwendbaren Schleifenkörper (ohne Kontextmanager) zu erstellen, müssen Sie auch die Variante von if_test() und ohne Kontextmanager verwenden. Beachten Sie, dass sich die BreakLoopOp Anweisung über alle Ressourcen der sie umschließenden Schleife erstrecken muss, nicht nur über den unmittelbaren Gültigkeitsbereich.

Rückgabe

Ein Handle zu der erstellten Anweisung.

Erhöht

CircuitError - wenn diese Methode innerhalb eines Builder-Kontextes aufgerufen wurde, aber nicht in einer Schleife enthalten ist.

Rückgabetyp

InstructionSet

continue_loop

continue_loop()

GitHub

Bewerben ContinueLoopOp.

Achtung

while_loop()Wenn Sie die „Builder“-Formen des Kontextmanagers von if_test(), for_loop() oder verwenden, können Sie diese Methode nur innerhalb eines Schleifenkontexts aufrufen, da sonst die „Ressourcenbreite“ der Operation nicht ermittelt werden kann. if_else()Dies würde schnell zu ungültigen Schaltkreisen führen. Wenn Sie also versuchen, einen wiederverwendbaren Schleifenkörper (ohne Kontextmanager) zu erstellen, müssen Sie auch die Variante von if_test() und ohne Kontextmanager verwenden. Beachten Sie, dass sich die ContinueLoopOp Anweisung über alle Ressourcen der sie umschließenden Schleife erstrecken muss, nicht nur über den unmittelbaren Gültigkeitsbereich.

Rückgabe

Ein Handle zu der erstellten Anweisung.

Erhöht

CircuitError - wenn diese Methode innerhalb eines Builder-Kontextes aufgerufen wurde, aber nicht in einer Schleife enthalten ist.

Rückgabetyp

InstructionSet

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

GitHub

Erstellen Sie eine for -Schleife auf dieser Schaltung.

Es gibt zwei Möglichkeiten, diese Funktion aufzurufen. Wird die Funktion mit allen ihren Argumenten aufgerufen (mit der möglichen Ausnahme von label), erstellt sie ein ForLoopOp mit dem angegebenen body. Wenn body (und qubits und clbits) nicht übergeben werden, fungiert dies als Kontextmanager, der beim Eintritt eine Schleifenvariable bereitstellt (sofern keine angegeben wird; in diesem Fall wird die vorhandene wiederverwendet) und beim Ende des Gültigkeitsbereichs automatisch ein ForLoopOp erstellt. In dieser Form müssen Sie nicht den Überblick über die verwendeten Qubits oder Clbits behalten, da dies vom Scope für Sie übernommen wird.

Zum Beispiel:

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

Parameter

  • indexset (Iterable[int]) – Eine Sammlung ganzer Zahlen, über die eine Schleife laufen soll. Immer notwendig.

  • loop_parameter (Optional[Parameter|expr.Var]) –

    Der in body verwendete Parameter, dem die Werte aus indexset zugewiesen werden. Wird dieses Argument in der Context-Manager-Form nicht angegeben, wird Ihnen ein Schleifenparameter zugewiesen und als Wert der Anweisung with zurückgegeben. Dieser wird nur dann in den Kreislauf eingebunden, wenn er im Körper verwendet wird.

    Wenn dieses Argument in der manuellen Form dieser Methode None lautet, wird body für jedes der Elemente in indexset einmal wiederholt, ihre Werte werden jedoch ignoriert.

  • body (Optional[QuantumCircuit]) – Der Schleifenkörper, der wiederholt ausgeführt werden soll. Lassen Sie dies weg, um den Kontext-Manager-Modus zu verwenden.

  • qubits (Optional[Sequence[QubitSpecifier]]) – Die Schaltkreis-Qubits, über die der Schleifenkörper ausgeführt werden soll. Lassen Sie dies weg, um den Kontext-Manager-Modus zu verwenden.

  • clbits (Optional[Sequence[ClbitSpecifier]]) – Die Schaltkreisbits, über die der Schleifenkörper ausgeführt werden soll. Lassen Sie dies weg, um den Kontext-Manager-Modus zu verwenden.

  • label (Optional[str]) – Die String-Bezeichnung der Anweisung in der Schaltung.

Rückgabe

Je nach Aufrufsignatur entweder einen Kontextmanager zum Erstellen der for-Schleife (dieser wird am Ende des Blocks automatisch zum Schaltkreis hinzugefügt) oder ein InstructionSet Handle für die angehängte Schleifenoperation.

Rückgabetyp

InstructionSet oder ForLoopContext

Erhöht

CircuitError - wenn eine falsche Aufrufkonvention verwendet wird.

if_else

if_else(condition, true_body, false_body, qubits, clbits, label=None)

GitHub

Bewerben IfElseOp.

Anmerkung

Diese Methode hat kein zugehöriges Context-Manager-Formular, da es bereits von der if_test() methode behandelt wird. Sie können den else Teil davon mit etwas wie verwenden:

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)

Parameter

  • condition (tuple[ClassicalRegister, int] | tuple[Clbit, int] | tuple[Clbit, bool]) – Eine Bedingung, die bei der Ausführung der Schleife in Echtzeit ausgewertet wird und, falls sie wahr ist, die Auswertung von true_bodyauslöst. Kann entweder als Tupel eines angegeben werden, das auf Gleichheit ClassicalRegister mit einem gegebenen geprüft werden soll, intoder als Tupel eines, das entweder mit einem bool Clbit oder einem verglichen intwerden soll.
  • true_body (QuantumCircuit) – Der Schaltkreiskörper, der ausgeführt wird, wenn condition wahr ist.
  • false_body (QuantumCircuit) – Die Schaltung, die ausgeführt wird, wenn condition falsch ist.
  • qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Die Schaltkreis-Qubits, über die die if/else-Anweisung ausgeführt werden soll.
  • clbits (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]]) – Die Schaltkreiselemente, über die die if/else-Anweisung ausgeführt werden soll.
  • label (str | None) – Die String-Bezeichnung der Anweisung in der Schaltung.

Erhöht

CircuitError - Wenn die angegebene Bedingung auf Clbits außerhalb des umschließenden Stromkreises verweist.

Rückgabe

Ein Handle zu der erstellten Anweisung.

Rückgabetyp

InstructionSet

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

GitHub

Erstellen Sie eine if Anweisung für diese Schaltung.

Es gibt zwei Möglichkeiten, diese Funktion aufzurufen. Wird die Funktion mit allen ihren Argumenten aufgerufen (mit der möglichen Ausnahme von label), erstellt sie ein IfElseOp mit dem angegebenen true_body, und es erfolgt kein Verzweigungssprung für die false Bedingung (siehe auch die if_else() Methode). Werden true_body jedoch (und qubits und clbits) nicht übergeben, fungiert dies als Kontextmanager, der zum Erstellen von if -Anweisungen verwendet werden kann. Der Rückgabewert der with Anweisung ist ein verkettbarer Kontextmanager, mit dem nachfolgende else Blöcke erstellt werden können. In dieser Form müssen Sie nicht den Überblick über die verwendeten Qubits oder Clbits behalten, da dies vom Scope für Sie übernommen wird.

Zum Beispiel:

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)

Parameter

  • condition (Tuple[Union[ClassicalRegister, Clbit], int]) – Eine Bedingung, die während der Ausführung des Schaltkreises in Echtzeit ausgewertet wird und die, wenn sie wahr ist, die Auswertung von true_body auslöst. Kann entweder als Tupel eines ClassicalRegister angegeben werden, das auf Gleichheit mit einem gegebenen int getestet wird, oder als Tupel eines Clbit , das entweder mit einem bool oder einem int verglichen wird.
  • true_body (Optional[QuantumCircuit]) – Der Schaltkreiskörper, der ausgeführt wird, wenn condition wahr ist.
  • qubits (Optional[Sequence[QubitSpecifier]]) – Die Schaltkreis-Qubits, über die das if/else ausgeführt werden soll.
  • clbits (Optional[Sequence[ClbitSpecifier]]) – Die Schaltkreisbits, über die das if/else ausgeführt werden soll.
  • label (Optional[str]) – Die String-Bezeichnung der Anweisung in der Schaltung.

Rückgabe

Je nach Aufrufsignatur entweder einen Kontextmanager zum Erstellen des if Blocks (dieser wird am Ende des Blocks automatisch zum Schaltkreis hinzugefügt) oder ein InstructionSet Handle für die angehängte bedingte Operation.

Rückgabetyp

InstructionSet oder IfContext

Erhöht

  • CircuitError - Wenn die angegebene Bedingung auf Clbits außerhalb des umschließenden Stromkreises verweist.
  • CircuitError - wenn eine falsche Aufrufkonvention verwendet wird.

Rückgabe

Ein Handle zu der erstellten Anweisung.

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

GitHub

Erstellen Sie eine switch/case Struktur auf dieser Schaltung.

Es gibt zwei Möglichkeiten, diese Funktion aufzurufen. Wird die Funktion mit allen ihren Argumenten aufgerufen (mit der möglichen Ausnahme von label), erstellt sie ein SwitchCaseOp mit der angegebenen Fallstruktur. Wenn cases (und qubits und clbits) nicht übergeben werden, fungiert dies als Kontextmanager, der automatisch ein SwitchCaseOp erstellt, sobald der Geltungsbereich endet. In dieser Form müssen Sie nicht den Überblick über die verwendeten Qubits oder Clbits behalten, da dies vom Scope für Sie übernommen wird.

Beispielverwendung:

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)

Parameter

  • target (Union[ClassicalRegister, Clbit]) – Der klassische Wert zum Einschalten. Diese muss ganzzahlig sein.
  • cases (Iterable[Tuple[Any, QuantumCircuit]]) – Eine Folge von Fallbezeichnern. Jedes Tupel definiert einen Fallkörper (das zweite Element). Das erste Element des Tupels kann entweder ein einzelner Integer-Wert, der spezielle Wert CASE_DEFAULToder ein Tupel aus mehreren Integer-Werten sein. Jeder der ganzzahligen Werte wird der Reihe nach ausprobiert; die Kontrolle geht dann an den Körper über, der der ersten Übereinstimmung entspricht. CASE_DEFAULT entspricht allen möglichen Werten. In der Form des Kontext-Managers weglassen.
  • qubits (Sequence[Qubit]) – Die Schaltkreis-Qubits, über die alle Fallkörper ausgeführt werden. In der Form des Kontext-Managers weglassen.
  • clbits (Sequence[Clbit]) – Die Schaltkreisbits, über die alle Fallkörper ausgeführt werden. In der Form des Kontext-Managers weglassen.
  • label (Optional[str]) – Die String-Bezeichnung der Anweisung in der Schaltung.

Rückgabe

Bei Verwendung im Kontext-Manager-Modus sollte dies als with Ressource verwendet werden, die ein Objekt zurückgibt, das wiederholt eingegeben werden kann, um Fälle für die switch-Anweisung zu erzeugen. Wenn das vollständige Formular verwendet wird, wird ein Handle zu den erstellten Anweisungen zurückgegeben.

Rückgabetyp

InstructionSet oder SwitchCaseContext

Erhöht

CircuitError - wenn eine falsche Aufrufkonvention verwendet wird.

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

GitHub

Erstellen Sie eine while -Schleife auf dieser Schaltung.

Es gibt zwei Möglichkeiten, diese Funktion aufzurufen. Wenn es mit allen Argumenten (mit der möglichen Ausnahme von label) aufgerufen wird, wird es ein WhileLoopOp mit dem angegebenen body erstellen. Wenn body (und qubits und clbits) nicht übergeben werden, dann fungiert dies als Kontextmanager, der automatisch eine WhileLoopOp erstellt, wenn der Bereich beendet ist. In dieser Form müssen Sie die verwendeten Qubits oder Clbits nicht im Auge behalten, da der Bereich dies für Sie übernimmt.

Beispielverwendung:

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)

Parameter

  • condition (Tuple[Union[ClassicalRegister, Clbit], int]) – Eine Gleichheitsbedingung, die vor der Ausführung von body zu prüfen ist. Die linke Seite der Bedingung muss a ClassicalRegister oder a Clbitsein, und die rechte Seite muss eine ganze Zahl oder ein Boolescher Wert sein.
  • body (Optional[QuantumCircuit]) – Der Schleifenkörper, der wiederholt ausgeführt werden soll. Lassen Sie dies weg, um den Kontext-Manager-Modus zu verwenden.
  • qubits (Optional[Sequence[Qubit]]) – Die Schaltkreis-Qubits, über die der Schleifenkörper ausgeführt werden soll. Lassen Sie dies weg, um den Kontext-Manager-Modus zu verwenden.
  • clbits (Optional[Sequence[Clbit]]) – Die Schaltkreisbits, über die der Schleifenkörper ausgeführt werden soll. Lassen Sie dies weg, um den Kontext-Manager-Modus zu verwenden.
  • label (Optional[str]) – Die String-Bezeichnung der Anweisung in der Schaltung.

Rückgabe

Wenn sie im Kontextmanager-Modus verwendet wird, sollte sie als with Ressource verwendet werden, die beim Beenden den Blockinhalt und die Operanden ableitet. Wenn das vollständige Formular verwendet wird, wird ein Handle zu den erstellten Anweisungen zurückgegeben.

Rückgabetyp

InstructionSet oder WhileLoopContext

Erhöht

CircuitError - wenn eine falsche Aufrufkonvention verwendet wird.

noop

noop(*qargs)

GitHub

Markiert das/die angegebene(n) Qubit(s) als innerhalb des aktuellen Bereichs verwendet, ohne eine Operation hinzuzufügen.

Dies hat keine Auswirkungen (außer dem Auslösen einer Ausnahme bei ungültiger Eingabe), wenn der Aufruf im oberen Bereich einer QuantumCircuit. Innerhalb eines Kontrollfluss-Baukastens führt dies dazu, dass das Qubit vom Kontrollfluss-Block "verwendet" wird, wenn es nicht bereits verwendet wird, ohne dass zusätzliche Operationen darauf ausgeführt werden.

Zum Beispiel:

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)

Parameter

*qargs ( Qubit |* QuantumRegister* |* int* |* slice* |* Sequence** [ Qubit | int** ]* ) – variable Liste gültiger Qubit-Spezifizierer. Alles, was als Qubit oder als Gruppe von Qubits übergeben werden kann, ist hier für jedes Argument zulässig.

Erhöht

CircuitError - wenn ein angefordertes Qubit für die Schaltung nicht gültig ist.

has_control_flow_op

has_control_flow_op()

GitHub

Prüft, ob der Schaltkreis eine Instanz von ControlFlowOp unter seinen Operationen enthält.

Rückgabetyp

bool

Umwandlung von Schaltkreisen in andere Objekte

Wie im Abschnitt „Methoden zum Hinzufügen allgemeiner Operationen “ erläutert, können Sie eine Schaltung mithilfe von zwei Hilfsmethoden entweder in ein Instruction oder in ein Gate umwandeln.

to_instruction

to_instruction(parameter_map=None, label=None)

GitHub

Erstellen Sie aus dieser Schaltung ein Instruction .

Siehe auch

circuit_to_instruction()

Die treibende Kraft hinter dieser Methode.

Parameter

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – Bei parametrisierten Schaltkreisen eine Zuordnung von Parametern im Schaltkreis zu Parametern, die in der Anweisung verwendet werden sollen. Wenn „None“ angegeben ist, werden auch die vorhandenen Schaltungsparameter zur Parametrisierung der Anweisung herangezogen.
  • label (str | None) – Optionales Gate-Etikett.

Rückgabe

eine zusammengesetzte Anweisung, die diese Schaltung kapselt (kann sein

zersetzter Rücken).

Rückgabetyp

qiskit.circuit.Instruction

to_gate

to_gate(parameter_map=None, label=None)

GitHub

Erstellen Sie aus dieser Schaltung ein Gate . Die Schaltung darf ausschließlich auf Qubits einwirken und darf nur unitäre Operationen enthalten.

Siehe auch

circuit_to_gate()

Die treibende Kraft hinter dieser Methode.

Parameter

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – Bei parametrisierten Schaltungen eine Zuordnung von Parametern in der Schaltung zu den im Gatter zu verwendenden Parametern. In None diesem Fall werden auch die vorhandenen Schaltungsparameter das Gatter parametrisieren.
  • label (str | None) – Optionales Gate-Etikett.

Rückgabe

ein zusammengesetztes Gatter, das diese Schaltung kapselt (kann wieder zerlegt werden).

Rückgabetyp

Gate

Außerdem kannst du die gesamte Schaltung in die DAGCircuit folgende Darstellung umwandeln:

to_dag

to_dag(*, copy_operations=True)

GitHub

Wandle diesen Stromkreis in einen DAGCircuit… um.

Dies ist eine einfache Hülle um circuit_to_dag().

Parameter

copy_operations (bool) – ob die einzelnen Anweisungen tief kopiert werden sollen. Wenn auf gesetzt False, ist der Vorgang kostengünstiger, aber Mutationen der Anweisungen im DAG wirken sich auf die ursprüngliche Schaltung aus.

Rückgabe

ein DAG, der denselben Schaltkreis darstellt.

Rückgabetyp

qiskit.dagcircuit.DAGCircuit

Hilfsmethoden für Mutationen

Es gibt zwei übergeordnete Methoden unter QuantumCircuit um Messungen an das Ende eines Schaltkreises anzuhängen. Beachten Sie, dass diese standardmäßig auch ein zusätzliches Register hinzufügen.

measure_active

measure_active(inplace=True)

GitHub

Fügt die Messung zu allen nicht ruhenden Qubits hinzu. Erzeugt eine neue ClassicalRegister mit einer Größe, die der Anzahl der zu messenden nicht ruhenden Qubits entspricht.

Gibt einen neuen Stromkreis mit Messungen zurück, wenn inplace=False.

Parameter

inplace (bool) – Alle Messungen an Ort und Stelle oder Rückgabe eines neuen Stromkreises.

Rückgabe

Gibt die Schaltung mit Messungen zurück, wenn inplace = False.

Rückgabetyp

QuantumCircuit

measure_all

measure_all(inplace=True, add_bits=True)

GitHub

Fügt die Messung zu allen Qubits hinzu.

Standardmäßig werden neue klassische Bits in einem ClassicalRegister um diese Messungen zu speichern. Wenn add_bits=False, werden die Ergebnisse der Messungen stattdessen in den bereits vorhandenen klassischen Bits gespeichert, wobei das Qubit n in das klassische Bit n gemessen wird.

Gibt einen neuen Stromkreis mit Messungen zurück, wenn inplace=False.

Parameter

  • inplace (bool) – Alle Messungen an Ort und Stelle oder Rückgabe eines neuen Stromkreises.
  • add_bits (bool) – Ob neue Bits zum Speichern der Ergebnisse hinzugefügt werden sollen.

Rückgabe

Gibt die Schaltung mit Messungen zurück, wenn inplace=False.

Rückgabetyp

QuantumCircuit

Erhöht

CircuitError - wenn add_bits=False , aber nicht genügend klassische Bits vorhanden sind.

Auch auf QuantumCircuit gibt es zwei „subtraktive“ Methoden. RemoveFinalMeasurementsDies ist kein Anwendungsfall, für den QuantumCircuit konzipiert wurde; in der Regel sollten Sie einfach anstelle von clear() verwenden copy_empty_like() und als dessen Transpiler-Pass-Form ausführen remove_final_measurements() .

clear

clear()

GitHub

Löschen Sie alle Anweisungen in sich selbst.

Wenn Sie die Schaltkreise löschen, bleiben die Metadaten erhalten.

Siehe auch

copy_empty_like()

Eine Methode zur Herstellung eines neuen Schaltkreises ohne Befehle und mit der gleichen Verfolgung von Quanten- und klassischen Daten, ohne jedoch den ursprünglichen Schaltkreis zu verändern.

Rückgabetyp

Keine

remove_final_measurements

remove_final_measurements(inplace=True)

GitHub

Entfernt endgültige Messungen und Barrieren auf allen Qubits, falls vorhanden. Löscht die klassischen Register, die zum Speichern der Werte dieser Messungen verwendet wurden, die durch diesen Vorgang inaktiv werden, und löscht klassische Bits, auf die nur von entfernten Registern verwiesen wird oder die überhaupt nicht verwiesen werden, aber durch diesen Vorgang inaktiv geworden sind.

Messungen und Schranken gelten als endgültig, wenn auf sie keine weiteren Vorgänge folgen (abgesehen von anderen Messungen oder Schranken)

Anmerkung

Diese Methode hat ein recht komplexes Verhalten, insbesondere was die Entfernung von neu inaktiven klassischen Bits und Registern betrifft. Es ist viel effizienter, unnötige klassische Daten von vornherein zu vermeiden, als zu versuchen, sie später zu entfernen.

Siehe auch

RemoveFinalMeasurements

Ein Transpiler-Durchgang, der die endgültigen Messungen und Barrieren entfernt. Dabei werden die klassischen Daten nicht entfernt. Wenn dies Ihr Ziel ist, können Sie das mit anrufen:

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)

Parameter

inplace (bool) – Alle Messungen an Ort und Stelle entfernen oder neue Schaltung zurückgeben.

Rückgabe

Gibt die resultierende Schaltung zurück, wenn inplace=False, sonst Keine.

Rückgabetyp

QuantumCircuit


Verbindungseigenschaften

Einfache Schaltungsmetriken

Bei der Konstruktion von Quantenschaltungen gibt es mehrere Eigenschaften, die helfen, die "Größe" der Schaltungen und ihre Fähigkeit, auf einem verrauschten Quantengerät zu laufen, zu quantifizieren. Einige davon, wie die Anzahl der Qubits, sind einfach zu verstehen, während andere, wie die Tiefe und die Anzahl der Tensorkomponenten, ein wenig mehr Erklärung erfordern. Im Folgenden werden wir all diese Eigenschaften erläutern und in Vorbereitung auf das Verständnis, wie sich Schaltungen verändern, wenn sie auf realen Geräten laufen, die Bedingungen hervorheben, unter denen sie sich verändern.

Betrachten Sie die folgende Schaltung:

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')
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Aus dem Diagramm ist leicht zu erkennen, dass diese Schaltung 12 Qubits und eine Reihe von Hadamard-, CNOT-, X- und SWAP-Gattern hat. Doch wie lässt sich dies programmatisch quantifizieren? Da wir Ein-Qubit-Gatter auf alle Qubits gleichzeitig anwenden können, ist die Anzahl der Qubits in dieser Schaltung gleich der Anzahl der width() der Schaltung:

assert qc.width() == 12

Wir können auch einfach die Anzahl der Qubits direkt ermitteln, indem wir num_qubits:

assert qc.num_qubits == 12
Wichtig

Bei einer Quantenschaltung, die nur aus Qubits besteht, ist die Breite der Schaltung gleich der Anzahl der Qubits. Dies ist die Definition, die in der Quanteninformatik verwendet wird. Bei komplizierteren Schaltungen mit klassischen Registern und klassisch gesteuerten Gattern bricht diese Gleichwertigkeit jedoch zusammen. Daher werden wir von nun an die Anzahl der Qubits in einem Quantenschaltkreis nicht mehr als Breite bezeichnen.

Es ist auch einfach, die Anzahl und den Typ der Gatter in einer Schaltung zu ermitteln, indem man count_ops():

qc.count_ops()
OrderedDict([('cx', 8), ('h', 5), ('x', 3), ('swap', 3)])

Wir können auch nur die reine Anzahl der Operationen ermitteln, indem wir die Schaltungen berechnen size():

assert qc.size() == 19

count_ops

count_ops()

GitHub

Zählen Sie jede Betriebsart in der Schaltung.

Rückgabe

Eine Aufschlüsselung der Anzahl der einzelnen Vorgänge, sortiert nach Umfang.

Rückgabetyp

OrderedDict [ str, int ]

depth

depth(filter_function=<function QuantumCircuit.<lambda>>)

GitHub

Tiefe des Rücklaufs (d. h. Länge des kritischen Pfads).

Die Tiefe eines Quantenschaltkreises ist ein Maß dafür, wie viele "Schichten" von Quantengattern, die parallel ausgeführt werden, erforderlich sind, um die durch den Schaltkreis definierte Berechnung abzuschließen. Da die Implementierung von Quantengattern Zeit in Anspruch nimmt, entspricht die Tiefe eines Schaltkreises in etwa der Zeit, die der Quantencomputer zur Ausführung des Schaltkreises benötigt.

Achtung

Dieser Vorgang ist nicht gut definiert, wenn der Schaltkreis Kontrollflussoperationen enthält.

Parameter

filter_function (Callable[[CircuitInstruction], bool]) – Eine Funktion, die festlegt, welche Anweisungen zur Erhöhung der Tiefe zählen. Sollte als einzelne Positionsangabe ein CircuitInstruction. entgegennehmen. Anweisungen, zu denen die Funktion zurückkehrt False , werden bei der Berechnung der Schaltungstiefe ignoriert. Standardmäßig werden „Direktiven“ wie z. B. Barrier. herausgefiltert.

Rückgabe

Tiefe der Schaltung.

Rückgabetyp

int

Beispiele

Einfache Berechnung der Gesamtschaltkreistiefe:

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() == 2

Abänderung des vorherigen Beispiels, um nur die Tiefe von Multi-QuBit-Gattern zu berechnen:

assert qc.depth(lambda instr: len(instr.qubits) > 1) == 1

get_instructions

get_instructions(name)

GitHub

Holen Sie sich Anweisungen, die dem Namen entsprechen.

Parameter

name (str) – Der Name der abzurufenden Anweisung.

Rückgabe

liste von (Anweisung, qargs, cargs).

Rückgabetyp

liste (Tupel )

num_connected_components

num_connected_components(unitary_only=False)

GitHub

In wie viele nicht-verschränkte Teilkreise kann der Stromkreis zerlegt werden?

Parameter

unitary_only (bool) – Berechnen Sie nur den unitären Teil des Graphen.

Rückgabe

Anzahl der angeschlossenen Komponenten im Stromkreis.

Rückgabetyp

int

num_nonlocal_gates

num_nonlocal_gates()

GitHub

Rückgabe der Anzahl der nicht-lokalen Gatter (d.h. mit 2+ Qubits).

Auch bedingte nichtlokale Gates sind enthalten.

Rückgabetyp

int

num_tensor_factors

num_tensor_factors()

GitHub

Berechnet nur die Anzahl der Tensorfaktoren im unitären (Quanten-)Teil der Schaltung.

Hinweise

Dies dient der Abwärtskompatibilität und wird in einer zukünftigen Version von Qiskit entfernt werden. Sie sollten stattdessen num_unitary_factors aufrufen.

Rückgabetyp

int

num_unitary_factors

num_unitary_factors()

GitHub

Berechnet nur die Anzahl der Tensorfaktoren im unitären (Quanten-)Teil der Schaltung.

Rückgabetyp

int

size

size(filter_function=<function QuantumCircuit.<lambda>>)

GitHub

Gibt die Gesamtzahl der Anweisungen im Schaltkreis zurück.

Parameter

filter_function (callable) – eine Funktion zum Herausfiltern einiger Anweisungen. Sollte als Eingabe ein Tupel aus (Anweisung, Liste(Qubit), Liste(Clbit)) annehmen. Standardmäßig werden "Direktiven" wie "Barriere" oder "Snapshot" herausgefiltert.

Rückgabe

Gesamtzahl der Toroperationen.

Rückgabetyp

int

width

width()

GitHub

Rückgabe der Anzahl der Qubits plus Clbits im Schaltkreis.

Rückgabe

Breite des Stromkreises.

Rückgabetyp

int

Zugriff auf Terminplanungsinformationen

Wenn eine QuantumCircuit als Teil einer Transpilationspipeline geplant wurde, kann auf die Zeitinformationen für einzelne Qubits zugegriffen werden. Die Timing-Informationen für die gesamte Schaltung sind über die estimate_duration() methode und op_start_times attribut.

estimate_duration

estimate_duration(target, unit='s')

GitHub

Schätzen Sie die Dauer einer geplanten Schaltung

Diese Methode berechnet die geschätzte Dauer des Stromkreises, indem sie den Pfad mit der längsten Dauer im Stromkreis auf der Grundlage der von einem bestimmten Ziel vorgegebenen Dauern findet. Diese Methode funktioniert nur bei einfachen Schaltungen, die keinen Kontrollfluss oder andere klassische Vorwärtsoperationen aufweisen.

Parameter

  • target (Target) – Die Target Instanz, die die Laufzeiten der Befehle enthält, löst einen QiskitError Fehler aus, wenn für das Ziel bei einem der Befehle in der Schaltung keine Laufzeitdaten vorliegen. Dies sollte dasselbe Zielobjekt sein, das auch als Ziel für die Transpilierung verwendet wird.
  • unit (str) – Die Einheit, in der die Dauer zurückgegeben werden soll. Der Standardwert ist "s" für Sekunden, aber es kann auch ein unterstütztes SI-Präfix für Sekundenrückgaben sein. Wenn Sie z. B. "n" eingeben, erfolgt die Rückgabe in der Einheit Nanosekunden. Unterstützte Werte dieses Typs sind "f", "p", "n", "u", "µ", "m", "k", "M", "G", "T" und "P". Zusätzlich wird auch der Wert "dt" akzeptiert, um eine ganze Zahl in Einheiten von "dt" auszugeben. Damit dies funktioniert, muss "dt" in der target angegeben werden.

Rückgabe

Die geschätzte Dauer für die Ausführung eines einzelnen Schusses der Schaltung in der angegebenen Einheit.

Erhöht

QiskitError - Wenn der Schaltkreis nicht geplant ist oder andere Details enthält, die die Berechnung einer geschätzten Dauer verhindern (z. B. parametrisierte Verzögerung).

Rückgabetyp

int | float

qubit_duration

qubit_duration(*qubits)

GitHub

Gibt die Dauer zwischen der Start- und der Stoppzeit der ersten und der letzten Anweisung, ohne Verzögerungen, über die angegebenen Qubits zurück. Seine Zeiteinheit ist self.unit.

Parameter

*qubits ( Qubit | int ) – Qubits innerhalb self einschließen.

Rückgabe

Rückgabe der Dauer zwischen dem ersten Start- und dem letzten Stoppzeitpunkt von nicht verzögerten Anweisungen

Rückgabetyp

Gleitkomma

qubit_start_time

qubit_start_time(*qubits)

GitHub

Rückgabe der Startzeit der ersten Anweisung, ohne Verzögerungen, über die angegebenen Qubits. Seine Zeiteinheit ist self.unit.

0 zurückgeben, wenn es keine Anweisungen über Qubits gibt

Parameter

  • *qubits - einzubeziehende Qubits innerhalb von self . Für Qubits sind ganze Zahlen zulässig, die angeben
  • self.qubits. (indices of)

Rückgabe

Rückgabe der Startzeit des ersten Befehls, ohne Verzögerungen, über die Qubits

Erhöht

CircuitError - wenn self eine noch nicht eingeplante Schaltung ist.

Rückgabetyp

Gleitkomma

qubit_stop_time

qubit_stop_time(*qubits)

GitHub

Rückgabe der Stoppzeit der letzten Anweisung, ohne Verzögerungen, über die angegebenen Qubits. Seine Zeiteinheit ist self.unit.

0 zurückgeben, wenn es keine Anweisungen über Qubits gibt

Parameter

  • *qubits - einzubeziehende Qubits innerhalb von self . Für Qubits sind ganze Zahlen zulässig, die angeben
  • self.qubits. (indices of)

Rückgabe

Rückgabe der Stoppzeit des letzten Befehls, ohne Verzögerungen, über die Qubits

Erhöht

CircuitError - wenn self eine noch nicht eingeplante Schaltung ist.

Rückgabetyp

Gleitkomma


Abstrakte und physikalische Schaltungen

Schaltkreise sind eine relativ niedrige Abstraktionsebene von Quantenalgorithmen. Allerdings gibt es auch hier Unterschiede. Quantenprogrammierer möchten oft eine Vielzahl von Gatterfunktionen und Befehlen nutzen und arbeiten in einem System, in dem alle Qubits miteinander interagieren. Quantenhardware verfügt jedoch in der Regel nur über eine begrenzte Anzahl nativer Gatter, und nur bestimmte Paare von Hardware-Qubits können miteinander interagieren. Wir bezeichnen diese beiden Bereiche als „abstrakte Schaltungen“ bzw. „physikalische Schaltungen“.

Qiskit bietet zwei Möglichkeiten, einen Schaltkreis zu unterscheiden, der physisch sein soll. Dies ist eine unscharfe Prüfung aus historischen Gründen; ursprünglich hat Qiskit diese Unterscheidung überhaupt nicht gemacht (weshalb transpile() so genannt wird und nicht compile!). Am deutlichsten wird dies durch das layout attribut von Schaltkreisen; ist dieses Attribut gesetzt, so ist der Schaltkreis mit Sicherheit als physisch zu betrachten. Der ältere, eher implizite Weg sind die Metadaten der Qubit objekte und QuantumRegister instanzen im Schaltkreis. Eine Schaltung kann nur dann als physikalisch angesehen werden (nach mehreren Transpiler-Durchläufen), wenn sie genau ein Quantenregister enthält, das q heißt und alle Qubits der Schaltung in Indexreihenfolge besitzt. Auch dies ist aus historischen Gründen der Standard für die QuantumCircuit(int [, int]) Form des Standardkonstruktors.

Normalerweise erstellt man ein QuantumCircuit und bauen es im abstrakten Sinne auf (unabhängig von den Qubit-Metadaten). Sie rufen dann transpile() auf, um die Schaltung in eine hardwareunterstützte Schaltung zu kompilieren. In Fällen, in denen Sie jedoch von Anfang an eine hardwareeffiziente Schaltung schreiben wollen, können Sie die gesamte Kompilierungsinfrastruktur mit der ensure_physical() methode. Damit wird sichergestellt, dass unabhängig davon, wie Sie die anfänglichen Qubit-Metadaten definiert haben, alle Anforderungen erfüllt sind, damit der Schaltkreis als physikalisch angesehen werden kann, wobei die Qubit-Indizes den Hardware-Qubits zugeordnet werden.

Für eine umfassendere Kontrolle über die Auswahl einer virtuell-physikalischen Zuordnung und des Routings siehe die Layout- und Routing-Phasen <transpiler-preset-stage-routing> der voreingestellten Kompilierungspipelines.

ensure_physical

ensure_physical(num_qubits=None, *, apply_layout=True)

GitHub

Bringen Sie diese Schaltung in eine kanonische physikalische Form, mit der angegebenen Anzahl von Qubits, falls dies noch nicht geschehen ist.

Mehrere Qiskit-Transpiler-Passagen sind nur sinnvoll, wenn sie auf Schaltungen angewendet werden, die in Form von physikalischen Qubits definiert sind. Wenn Sie einen Schaltkreis manuell konstruiert haben, bei dem die Qubit-Indizes physikalischen Qubits entsprechen, verwenden Sie diese Funktion, um sicherzustellen, dass die Metadaten des Schaltkreises mit der kanonischen physikalischen Form übereinstimmen. Dies bedeutet, dass die Qubit-Daten durch ein einziges eigenes Register mit der Bezeichnung "q" ersetzt werden, und (optional) das layout feld der Schaltung, um diese physischen Qubits mit den ursprünglichen virtuellen Qubits zu verbinden.

Wenn die Schaltung noch kein Layout hat, ist diese Methode (mit apply_layout=True) gleichbedeutend mit der Anwendung der vollständigen trivialen Layout-Methode der voreingestellten Kompilierungspipeline.

Wenn der Schaltkreis bereits kanonisch physisch ist, passiert nichts. Diese Methode kann die Anzahl der Qubits in der Schaltung nicht ändern, wenn sie bereits eine layout menge hat.

Parameter

  • num_qubits (int | None) – wenn gegeben, den Stromkreis mit Hilfsmitteln bis zu dieser Größe erweitern. Die Ancillas sind immer die höchsten Qubit-Indizes der Schaltung. Wenn keine Angabe gemacht wird (Standardeinstellung), bleibt die Schaltung gleich breit. Diese Option kann nicht eingestellt werden, wenn der Stromkreis bereits als layout.
  • apply_layout (bool) – wenn true (Standardeinstellung), setzen Sie das layout attribut des Stromkreises entsprechend, so dass der Stromkreis so aussieht, als sei er mit dem "trivialen" Layout, einschließlich der Ancilla-Erweiterung, für ein Backend der Breite num_qubits angelegt worden. Dies hat keine Auswirkungen, wenn die Schaltung bereits eine layout.

Rückgabe

ob die Schaltung verändert wurde, um sie physisch zu machen.

Erhöht

  • ValueError - wenn num_qubits zu klein für die Schaltung ist.
  • CircuitError - wenn num_qubits so eingestellt ist, dass versucht wird, den Stromkreis zu erweitern, aber der Stromkreis bereits ein Layout hat.

Rückgabetyp

bool

estimate_fidelity

estimate_fidelity(target)

GitHub

Schätzen Sie die Genauigkeit einer physikalischen Schaltung.

Diese Funktion berechnet das Produkt der Fehlerraten für jedes Gatter in der Schaltung, um die Genauigkeit der Schaltung abzuschätzen:

..Mathematik::

Bezeichnung

geschätzte Schaltungsgenauigkeit

prod_ {g in text{gates}} bigl(1 - operatorname {error} (g)bigr)

wobei error⁡(g)\operatorname{error}(g) die Fehlerrate im Zielsystem für die Befehls gg en aus der Schaltung im Zielsystem ist. NoneWenn die Schaltung nicht physisch vorhanden ist, d. h. wenn ein Befehl in der Schaltung (wie z. B. „operation“ und „qargs“) im Ziel nicht gefunden wird, wird hier ein Wert zurückgegeben. Diese Methode dient nicht dazu, eine realistische Simulation der Ausführungsgenauigkeit auf echter Hardware zu berechnen. Es soll einen Überblick darüber geben, wie der Transpiler unter Berücksichtigung der Genauigkeit verschiedener Heuristiken bei seiner Ausführung funktionieren würde. In der Regel ist dies nur sinnvoll, um verschiedene Kompilierungsergebnisse miteinander zu vergleichen und so abzuschätzen, welches davon auf der Hardware eine bessere Ausführungsqualität liefern würde.

Parameter

target (Target) – Die Target Instanz, auf der die Schaltung ausgeführt wird und die dazu dient, die Fehlerraten für die Befehle in der Schaltung zu ermitteln.

Rückgabe

Die geschätzte Genauigkeit bei der Ausführung der Schaltung auf dem vorgegebenen Ziel. Falls ein Befehl in der Schaltung nicht im Ziel vorhanden ist

Erhöht

QiskitError – Falls der Ablauf irgendwelche Operationen zur Steuerung des Programmablaufs enthält.

Rückgabetyp

float | None


Anweisungsähnliche Methoden

QuantumCircuit enthält außerdem eine kleine Anzahl von Methoden, die im Detail sehr Instructionähnlich sind. Möglicherweise erzielen Sie eine bessere Integration und eine umfassendere API-Unterstützung, wenn Sie Ihren Schaltkreis zunächst entsprechend in ein Instruction (to_instruction()) oder Gate (to_gate()) umwandeln und anschließend die entsprechende Methode aufrufen.

control

control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)

GitHub

Geben Sie die kontrollierte Version dieser Schaltung zurück.

Die ursprüngliche Schaltung wird in ein Gatter umgewandelt, und die daraus resultierende Schaltung enthält die gesteuerte Version dieses Gatters. True``FalseDieses gesteuerte Gatter wird als ControlledGate implementiert, wenn annotated ist, und als AnnotatedOperation , wenn annotated ist.

Seit Version 2.3 veraltet

qiskit.circuit.quantumcircuit.QuantumCircuit.control()Das Argument annotated ist seit Qiskit 2.3 veraltet. Es wird in Qiskit 3.0 entfernt werden. Die Methode „ QuantumCircuit.control“ akzeptiert nicht mehr „annotated=None“. Die neue Standardeinstellung ist „annotated=True“, was das kontrollierte Gatter im neuen Quantenschaltkreis als „ AnnotatedOperation “ darstellt (es sei denn, es existiert bereits eine spezielle Klasse für kontrollierte Gatter). Sie können explizit annotated=False festlegen, um das bisherige Verhalten beizubehalten. Es wird jedoch empfohlen, annotated=True zu verwenden, da dadurch die Erstellung des kontrollierten Schaltkreises auf den Transpiler verschoben wird und darüber hinaus zusätzliche Optimierungen des kontrollierten Gates ermöglicht werden (was in der Regel zu Schaltkreisen höherer Qualität führt).

Parameter

  • num_ctrl_qubits (int) – Anzahl der hinzuzufügenden Steuerelemente. Der Standardwert ist 1.
  • label (str | None) – Ein optionales Label, um das gesteuerte Gate zur Visualisierung zu kennzeichnen. Der Standardwert ist None. Wird ignoriert, wenn das kontrollierte Gate als kommentierte Operation implementiert ist.
  • ctrl_state (str |int | None) – Der Steuerungsstatus des Gates, angegeben entweder als Ganzzahl oder als Bitstring (z. B. "110"). Wenn None, wird standardmäßig der Zustand „alle 2**num_ctrl_qubits - 1Einsen“ verwendet.
  • annotated (bool | None) – Gibt an, ob das gesteuerte Gate als gesteuertes Gate oder als kommentierte Operation implementiert werden soll.

Rückgabe

Die kontrollierte Version dieser Schaltung.

Rückgabetyp

QuantumCircuit

Erhöht

CircuitError - Wenn der Stromkreis eine nicht einheitliche Operation enthält und nicht kontrolliert werden kann.

inverse

inverse(annotated=False)

GitHub

Invertiere (nimm den Adjungierten) dieser Schaltung.

Dies geschieht durch rekursive Invertierung aller Gatter.

Parameter

annotated (bool) – gibt an, ob das inverse Gatter als kommentiertes Gatter implementiert werden kann.

Rückgabe

die invertierte Schaltung

Rückgabetyp

QuantumCircuit

Erhöht

CircuitError - wenn der Stromkreis nicht invertiert werden kann.

Beispiele

Eingabe:

     ┌───┐
q_0: ┤ H ├─────■──────
     └───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
          └──────────┘

Ausgabe:

                  ┌───┐
q_0: ──────■──────┤ H ├
     ┌─────┴─────┐└───┘
q_1: ┤ RX(-1.57) ├─────
     └───────────┘

power

power(power, matrix_power=False, annotated=False)

GitHub

Erhöhen Sie diese Schaltung auf die Potenz von power.

Wenn power eine positive ganze Zahl ist und sowohl matrix_power als auch annotated False sind, ruft diese Implementierung standardmäßig repeat auf. Andernfalls wird die Schaltung in ein Gatter umgewandelt, und es wird eine neue Schaltung zurückgegeben, die dieses Gatter in der angegebenen Potenz enthält. Das Gatter, das auf die angegebene Potenz erhöht wird, wird entweder als unitäres Gatter implementiert, wenn annotated gleich False ist, oder als kommentierte Operation, wenn annotated gleich True ist.

Parameter

  • power (float) – Die Macht, diese Schaltung zu erhöhen.
  • matrix_power (bool) – gibt an, ob das innere Leistungsgatter als unitäres Gatter implementiert werden kann.
  • annotated (bool) – gibt an, ob das innere Leistungstor als kommentierte Operation implementiert werden kann.

Erhöht

CircuitError - Wenn die Schaltung in ein unitäres Gatter umgewandelt werden muss, aber nicht unitär ist.

Rückgabe

Eine Schaltung, die diese Schaltung in der Potenz von power umsetzt.

Rückgabetyp

QuantumCircuit

repeat

repeat(reps, *, insert_barriers=False)

GitHub

Wiederholen Sie diesen Kreislauf reps mal.

Parameter

  • reps (int) – Wie oft diese Schaltung wiederholt werden soll.
  • insert_barriers (bool) – Ob Barrieren zwischen den Wiederholungen des Kreislaufs eingefügt werden sollen.

Rückgabe

Eine Schaltung mit reps Wiederholungen dieser Schaltung.

Rückgabetyp

QuantumCircuit

reverse_ops

reverse_ops()

GitHub

Kehren Sie die Schaltung um, indem Sie die Reihenfolge der Anweisungen umkehren.

Dies geschieht durch rekursive Umkehrung aller Anweisungen. Es wird kein Gatter invertiert (adjungiert).

Rückgabe

die umgekehrte Schaltung.

Rückgabetyp

QuantumCircuit

Beispiele

Eingabe:

     ┌───┐
q_0: ┤ H ├─────■──────
     └───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
          └──────────┘

Ausgabe:

                 ┌───┐
q_0: ─────■──────┤ H ├
     ┌────┴─────┐└───┘
q_1: ┤ RX(1.57) ├─────
     └──────────┘

Visualisierung

Qiskit enthält einige Zeichenwerkzeuge, mit denen Sie schnell ein Gefühl dafür bekommen, wie Ihre Schaltung aussehen könnte. Dieses Tooling ist in erster Linie für die Erstellung einer Matplotlib - oder textbasierten Zeichnung. Es gibt auch ein weniger leistungsfähiges LaTeX Backend zum Zeichnen, das aber nur für einfache Schaltungen gedacht ist und nicht so aktiv gepflegt wird.

Siehe auch

qiskit.visualization

Die primäre Dokumentation für alle Visualisierungswerkzeuge von 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)

GitHub

Zeichnen Sie den Quantenkreis. Verwenden Sie den Ausgabeparameter, um das Zeichenformat zu wählen:

text

ASCII-Kunst TextDrawing, die in der Konsole ausgegeben werden kann.

mpl

Bilder, deren Farben ausschließlich mit matplotlib in der Programmiersprache „ Python “ dargestellt wurden.

latex

Hochwertige Bilder, zusammengestellt über LaTeX.

Achtung

Instruction.labelDies ruft aufgrund der Funktionsweise bei beliebiger Benutzereingabe eine installierte Systemversion von pdflatex auf (beispielsweise um benutzerdefinierten Code in darzustellen) und sollte daher nur bei vertrauenswürdigen Eingaben verwendet werden.

latex_source

Unbearbeitete, nicht kompilierte Ausgabe von „ LaTeX “. Dies ist der Quellcode für das, was vom latex Zeichner gerendert wird.

Achtung

Die Unterstützung für Expr knoten in Bedingungen und SwitchCaseOp.target Feldern ist vorläufig und unvollständig. Die Schubladen text und mpl versuchen so gut wie möglich, Datenabhängigkeiten darzustellen, während die Schubladen LaTeX-based diese vollständig auslassen.

Parameter

  • output (str | None) – Wählen Sie die Ausgabemethode aus, die Sie für das Zeichnen des Stromkreises verwenden möchten. Gültige Auswahlmöglichkeiten sind text, mpl, latex, latex_source. Standardmäßig wird die Schublade text verwendet, es sei denn, in der Benutzerkonfigurationsdatei (in der Regel ~/.qiskit/settings.conf) ist ein anderes Backend als Standard festgelegt. Beispiel: circuit_drawer = latex. Wenn der Ausgabe-Kwarg gesetzt ist, wird dieses Backend immer anstelle des Standards in der Benutzerkonfigurationsdatei verwendet.

  • scale (float | None) – Maßstab des zu zeichnenden Bildes (verkleinern, wenn < 1.0). Wird nur von den Ausgängen mpl, latex und latex_source verwendet. Die Standardeinstellung ist 1.0.

  • filename (str | None) – Dateipfad, in dem das Bild gespeichert werden soll. Die Standardeinstellung ist None (Ergebnis wird nicht in einer Datei gespeichert).

  • style (dict |str | None) –

    Stilname, Dateiname der Stil-JSON-Datei oder ein Wörterbuch, das den Stil angibt.

    • Die unterstützten Stilnamen sind "iqp" (Standard), "iqp-dark", "clifford", "textbook" und "bw".
    • Bei Angabe einer JSON-Datei, z. B. my_style.json oder my_style (die Erweiterung .json kann weggelassen werden), versucht diese Funktion, das Stilwörterbuch von diesem Ort zu laden. Beachten Sie, dass die JSON-Datei die Visualisierungsspezifikationen vollständig enthalten muss. Die Datei wird in qiskit/visualization/circuit/styles, dem aktuellen Arbeitsverzeichnis und dem in ~/.qiskit/settings.conf angegebenen Ort gesucht.
    • Wenn es sich um ein Wörterbuch handelt, überschreibt jeder Eintrag die Standardkonfiguration. Wenn der "name" Schlüssel angegeben wird, richtet sich die Standardkonfiguration nach diesem Stil. Beispielsweise lädt {"name": "textbook", "subfontsize": 5} das "textbook" den Stil und setzt die Unterfontgröße (z. B. die Torwinkel) auf 5.
    • Bei None wird der Standardstil "iqp" verwendet oder, falls angegeben, der in ~/.qiskit/settings.conf angegebene Standardstil.
  • interactive (bool) – Bei der Einstellung True wird der Schaltkreis in einem neuen Fenster angezeigt (bei mpl hängt dies davon ab, ob das verwendete Matplotlib-Backend dies unterstützt). Beachten Sie, dass dies bei der Ausgabeart "Text" oder " latex_source " keine Auswirkungen hat und stillschweigend ignoriert wird. Die Standardeinstellung ist False.

  • reverse_bits (bool | None) – Bei der Einstellung True wird die Bitreihenfolge in den Registern für die Ausgangsvisualisierung umgekehrt. Der Standardwert ist False , es sei denn, in der Benutzerkonfigurationsdatei (normalerweise ~/.qiskit/settings.conf) ist ein anderer Wert eingestellt. Zum Beispiel circuit_reverse_bits = True.

  • plot_barriers (bool) – Aktivieren/Deaktivieren der Ziehsperren im Ausgangskreis. Der Standardwert ist True.

  • justify (str | None) – Die Optionen sind "left", "right" oder "none" (str). Wenn etwas anderes angegeben wird, wird stattdessen linksbündig verwendet. Sie gibt an, wo die Gatter in der Ausgangsschaltung platziert werden sollen, falls eine solche Möglichkeit besteht. none führt dazu, dass jedes Tor in eine eigene Spalte gestellt wird. Die Standardeinstellung ist left.

  • vertical_compression (str | None) – high, medium oder low. Sie führt die von der Textausgabe erzeugten Linien zusammen, so dass die Zeichnung weniger vertikalen Raum einnimmt. Die Voreinstellung ist medium. Wird nur von der Ausgabe text verwendet, ansonsten wird es ignoriert.

  • idle_wires (bool |str | None) – Leere Leitungen (Leitungen ohne Schaltelemente) in die Ausgabedarstellung einbeziehen (oder nicht). Die Zeichenfolge "auto" ist ebenfalls möglich; in diesem Fall werden nicht verwendete Leitungen angezeigt, es sei denn, dem Schaltkreis ist ein Layout zugeordnet. Standardmäßig gilt "auto" , sofern in der Benutzerkonfigurationsdatei (in der Regel ~/.qiskit/settings.conf) kein anderer Wert festgelegt ist. Zum Beispiel circuit_idle_wires = False.

  • with_layout (bool) – Enthalten Sie Layout-Informationen mit Beschriftungen auf dem physischen Layout. Der Standardwert ist True.

  • fold (int | None) – Legt die Seitennummerierung fest. Sie kann mit -1 deaktiviert werden. Unter text können Sie die Länge der Linien festlegen. Dies ist nützlich, wenn die Zeichnung nicht in die Konsole passt. Wenn keine (Standard), wird versucht, die Konsolenbreite mit shutil.get_terminal_size() zu erraten. Bei der Ausführung in Jupyter ist die Standardzeilenlänge jedoch auf 80 Zeichen festgelegt. In mpl ist dies die Anzahl der (visuellen) Schichten vor der Faltung. Vorgabe ist 25.

  • ax (Any | None) – Wird nur vom mpl-Backend verwendet. Ein optionales matplotlib.axes.Axes Objekt, das für die Visualisierungsausgabe verwendet werden soll. Wenn keine angegeben ist, wird eine neue matplotlib-Abbildung erstellt und verwendet. Darüber hinaus wird, sofern angegeben, keine Abbildung zurückgegeben, da diese redundant ist.

  • initial_state (bool) – Fügt ∣0⟩|0\rangle am Anfang der Qubit-Drähte und 00 zu den klassischen Drähten hinzu. Der Standardwert ist False.

  • cregbundle (bool | None) – Wenn auf True gesetzt, bündeln Sie die klassischen Register. Die Voreinstellung ist True, außer wenn output auf "text" gesetzt wird.

  • wire_order (list[int] | None) – Eine Liste ganzer Zahlen, die zur Neuordnung der Anzeige der Bits verwendet wird. Die Liste muss für jedes Bit einen Eintrag enthalten, wobei die Bits im Bereich von 0 bis (num_qubits + num_clbits) liegen müssen.

  • ControlFlowOpexpr_len (int) – Die Anzahl der Zeichen, die angezeigt werden sollen, wenn ein Expr als Bedingung in einem verwendet wird. Wird diese Zahl überschritten, wird die Zeichenfolge an dieser Stelle abgeschnitten und am Ende mit „…“ ergänzt.

  • measure_arrows (bool | None) – Wenn „True“, zeichne von jedem Taktfeld einen Pfeil hinunter zu dem klassischen Bit oder Register, in dem der Taktwert gespeichert ist. Wenn „False“, wird kein Pfeil gezeichnet, sondern stattdessen der Name des Bits oder Registers in das Taktfeld eingefügt. Standardmäßig gilt True , sofern in der Benutzerkonfigurationsdatei (in der Regel ~/.qiskit/settings.conf) kein anderer Wert festgelegt ist. Zum Beispiel circuit_measure_arrows = False.

  • barrier_label_len (int) – Die Anzahl der Zeichen, die für Barrier Beschriftungen im Ausgabekreis angezeigt werden sollen. Wird diese Zahl überschritten, wird die Zeichenfolge an dieser Stelle abgeschnitten und am Ende mit „…“ ergänzt.

Rückgabe

TextDrawing oder matplotlib.figure oder PIL.Image oder str:

  • TextDrawing (wenn output='text')

    Eine Zeichnung, die als Ascii-Art gedruckt werden kann.

  • matplotlib.figure.Figure (wenn output='mpl')

    Ein Matplotlib-Figur-Objekt für den Schaltplan.

  • PIL.Image (if output='latex')

    Eine speicherinterne Darstellung der Abbildung des Schaltplans.

  • str (wenn output='latex_source')

    Der LaTeX Quellcode zur Visualisierung des Schaltplans.

Erhöht

  • VisualizationError - wenn eine ungültige Ausgabemethode gewählt wird
  • ImportError - wenn die Ausgabemethoden nicht installierte Bibliotheken erfordern.

Beispiel

from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qc = QuantumCircuit(1, 1)
qc.h(0)
qc.measure(0, 0)
qc.draw(output='mpl', style={'backgroundcolor': '#EEEEEE'})
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Zusätzlich zum Kerntreiber draw() treiber gibt es zwei visualisierungsbezogene Hilfsmethoden, die vor allem nützlich sind, um schnell einige innere Anweisungen zu entpacken oder die Konventionen für die Qubit-Beschriftung in der Zeichnung umzukehren. Für allgemeinere Mutationen, einschließlich Basis-Gate-Rewriting, sollten Sie den Transpiler (qiskit.transpiler).

decompose

decompose(gates_to_decompose=None, reps=1)

GitHub

Rufen Sie einen Zerlegungsdurchgang für diese Schaltung auf, um eine Ebene zu zerlegen (flache Zerlegung).

Parameter

  • gates_to_decompose (str |type[Instruction] | Sequence[str |type[Instruction]] | None) – Optionale Teilmenge der Gatter, die zerlegt werden sollen. Es kann sich um einen Gate-Typ handeln, wie z. B. HGate, oder um einen Gate-Namen, wie z. B. „h“, oder um eine Gate-Bezeichnung, wie z. B. „My H Gate“, oder um eine Liste beliebiger Kombinationen dieser Elemente. Wird ein Gate-Name eingegeben, werden alle Gates mit diesem Namen zerlegt, unabhängig davon, ob die Gates mit Bezeichnungen versehen sind oder nicht. Standardmäßig werden alle Gatter im Schaltkreis berücksichtigt.
  • reps (int) – Optionale Anzahl von Zerlegungen des Stromkreises. Zum Beispiel ist reps=2 gleichbedeutend mit dem Aufruf von circuit.decompose().decompose().

Rückgabe

ein um eine Stufe zerlegter Stromkreis

Rückgabetyp

QuantumCircuit

reverse_bits

reverse_bits()

GitHub

Geben Sie eine Schaltung mit der umgekehrten Reihenfolge der Drähte zurück.

Die Schaltung wird "vertikal" umgedreht. Wenn eine Schaltung über mehrere Register definiert wird, hat die resultierende Schaltung die gleichen Register, aber in umgekehrter Reihenfolge.

Diese Methode ist nützlich, um eine in Little-Endian-Konvention geschriebene Schaltung in das Big-Endian-Äquivalent zu konvertieren und vice versa.

Rückgabe

die Schaltung mit umgekehrter Bitreihenfolge.

Rückgabetyp

QuantumCircuit

Beispiele

Eingabe:

     ┌───┐
a_0: ┤ H ├──■─────────────────
     └───┘┌─┴─┐
a_1: ─────┤ X ├──■────────────
          └───┘┌─┴─┐
a_2: ──────────┤ X ├──■───────
               └───┘┌─┴─┐
b_0: ───────────────┤ X ├──■──
                    └───┘┌─┴─┐
b_1: ────────────────────┤ X ├
                         └───┘

Ausgabe:

                         ┌───┐
b_0: ────────────────────┤ X ├
                    ┌───┐└─┬─┘
b_1: ───────────────┤ X ├──■──
               ┌───┐└─┬─┘
a_0: ──────────┤ X ├──■───────
          ┌───┐└─┬─┘
a_1: ─────┤ X ├──■────────────
     ┌───┐└─┬─┘
a_2: ┤ H ├──■─────────────────
     └───┘

Parameter

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.