OpenQASM 3
qiskit.qasm3
Qiskit bietet einige Werkzeuge für die Konvertierung zwischen OpenQASM 3 Repräsentationen von Quantenprogrammen, und der QuantumCircuit klasse. Diese werden in dem Maße weiterentwickelt, wie die Unterstützung von Qiskit für die dynamischen Schaltkreisfunktionen von OpenQASM 3 zunimmt.
Exportieren nach „ OpenQASM “ 3
Die High-Level-Funktionen sind einfach dump() und dumps()die jeweils in eine Datei (als Dateiname angegeben) und in eine Zeichenkette Python exportieren.
dump
qiskit.qasm3.dump(circuit, stream, **kwargs)
Serialisieren eines QuantumCircuit objekt als OpenQASM 3 stream to file-ähnliches Objekt.
Parameter
- circuit (QuantumCircuit) – Schaltung zur Serialisierung.
- stream (TextIOBase) – stream-ähnliches Objekt zum Auslesen der OpenQASM 3 Serialisierung
- **kwargs - Argumente für den
Exporterkonstrukteur.
Rückgabetyp
Keine
dumps
qiskit.qasm3.dumps(circuit, **kwargs)
Serialisieren Sie ein QuantumCircuit objekt in eine OpenQASM 3 Zeichenkette.
Parameter
- circuit (QuantumCircuit) – Schaltung zur Serialisierung.
- **kwargs - Argumente für den
Exporterkonstrukteur.
Rückgabe
Die OpenQASM 3 Serialisierung
Rückgabetyp
Diese beiden Exporter-Funktionen sind Einweg-Verpackungen um die Haupt Exporter klasse. Für komplexere Exportanforderungen, einschließlich der Ablage mehrerer Schaltkreise in einer einzigen Sitzung, kann es bequemer oder schneller sein, die vollständige Schnittstelle zu verwenden.
Exporteur
class qiskit.qasm3.Exporter(includes=('stdgates.inc', ), basis_gates=('U', ), disable_constants=False, alias_classical_registers=None, allow_aliasing=None, indent=' ', experimental=<ExperimentalFeatures: 0>, annotation_handlers=None, implicit_defcals=None)
Basen: object
QASM3 hauptklasse des Exporteurs.
Parameter
-
includes (Sequence[str]) –
die Dateinamen, die als Includes ausgegeben werden sollen.
AnmerkungGegenwärtig wird nur die Standardbibliotheksdatei
stdgates.incvom Exporteur richtig verstanden, d. h. er kennt die darin definierten Gates. Sie können weitere Includes angeben, müssen aber die Namen der von ihnen definierten Gates im Argumentbasis_gatesübergeben, damit der Exporter keine separategateDefinition ausgibt. -
basis_gates (Sequence[str]) – die grundlegend definierte Tormenge des Backends.
-
disable_constants (bool) – wenn
True, immer Fließkomma-Konstanten für numerische Parameterwerte ausgeben. WennFalse(Standardeinstellung), dann werden Werte, die nahe an Vielfachen von OpenQASM 3 Konstanten (pi,eulerundtau) liegen, stattdessen in Form dieser Konstanten ausgegeben, was die Genauigkeit der Ausgabe verbessern kann. -
alias_classical_registers (bool | None) –
Wenn
True, dann können Bits in mehr als einem Register enthalten sein. Wenn dies der Fall ist, werden die Register unter Verwendung von "Alias"-Definitionen ausgegeben, die von den Nutzern von OpenQASM 3 möglicherweise nicht gut unterstützt werden.Siehe auchParameter
allow_aliasingEin Wert für
allow_aliasinghat Vorrang vor einem hier angegebenen Wert und ersetzt diesen Parameter. -
allow_aliasing (bool | None) –
Wenn
True, dann können Bits in mehr als einem Register enthalten sein. Wenn dies der Fall ist, werden die Register unter Verwendung von "Alias"-Definitionen ausgegeben, die von den Nutzern von OpenQASM 3 möglicherweise nicht gut unterstützt werden. Die Standardeinstellung istFalseoder der Wert vonalias_classical_registers.Hinzugefügt in Version 0.25.0. -
indent (str) – die Einrückungszeichenfolge, die für jede Ebene innerhalb eines eingerückten Blocks zu verwenden ist. Kann auf eine leere Zeichenkette gesetzt werden, um die Einrückung zu deaktivieren.
-
experimental (ExperimentalFeatures) – alle experimentellen Funktionen, die während des Exports aktiviert werden sollen. Siehe
ExperimentalFeaturesfür weitere Einzelheiten. -
annotation_handlers (dict[str, OpenQASM3Serializer] | None) – eine Zuordnung von Namensräumen zu Annotations-Serialisierern. Wenn ein
AnnotationObjekt gefunden wird, wird zur Serialisierung der spezifischste Namensraum in dieser Zuordnung verwendet, der mit dem Attribut dernamespaceAnnotation übereinstimmt. -
implicit_defcals (dict[str, DefcalInstruction] | None) – Zuordnung von
Instruction.names zu einem zugehörigenDefcalInstructionObjekt. Alle Anweisungen, deren Schlüsselname in der Eingabekette vorkommt, sollten so ausgegeben werden, als ob einedefcalder angegebenenDefcalInstructionAnweisungen definiert wäre. Der Schlüsselname und dasDefcalInstruction.namemüssen nicht übereinstimmen. DerdefcalName darf nicht mit einem Schlüsselwort von „ OpenQASM 3“ kollidieren.
dump
dump(circuit, stream)
Konvertieren Sie die Schaltung in OpenQASM 3 und geben Sie das Ergebnis in eine Datei oder einen Textstrom aus.
dumps
dumps(circuit)
Konvertiert die Schaltung in OpenQASM 3 und gibt das Ergebnis als String zurück.
Alle diese Schnittstellen melden QASM3ExporterError bei einem Fehler.
QASM3ExporterError
exception qiskit.qasm3.QASM3ExporterError(*message)
Basen: QASM3Error
Bei der Ausführung des OpenQASM 3 Exporters ist ein Fehler aufgetreten.
Legen Sie die Fehlermeldung fest.
Experimentelle Features
Die Sprache OpenQASM 3 befindet sich noch in der Entwicklung, da sich die Hardwarefähigkeiten verbessern, so dass es keine endgültige Syntax gibt, die Qiskit zuverlässig ansprechen kann. Um die sich entwickelnde Sprache zu repräsentieren, werden wir manchmal Funktionen vor der formalen Standardisierung freigeben, die sich möglicherweise ändern müssen, wenn der Überprüfungsprozess in den OpenQASM 3 Design Committees fortschreitet. Standardmäßig unterstützen die Exporteure nur standardisierte Merkmale der Sprache. Um diese Frühveröffentlichungsfunktionen zu aktivieren, verwenden Sie das Schlüsselwortargument experimental von dump() und dumps(). Die verfügbaren Merkmalskennzeichen sind:
ExperimentalFeatures
class qiskit.qasm3.ExperimentalFeatures(*values)
Basen: Flag
Flaggen für experimentelle Funktionen, die der OpenQASM 3 Exporter unterstützt.
Diese sind experimentell und können sich noch ändern, da die OpenQASM 3-Spezifikation sie noch nicht formell akzeptiert hat und die Syntax daher noch nicht endgültig ist.
SWITCH_CASE_V1
Standardwert: 1
Unterstützung des Exports von switch-case-Anweisungen, wie vorgeschlagen von https://github.com/openqasm/openqasm/pull/463 bfa787aa3078 vorgeschlagen wurde.
Diese haben das Ausgabeformat:
switch (i) {
case 0:
case 1:
x $0;
break;
case 2: {
z $0;
}
break;
default: {
cx $0, $1;
}
break;
}Dies unterscheidet sich von der Syntax der Anweisung switch in der stabilisierten Form. Wenn dieses Flag nicht übergeben wird, gibt der Parser stattdessen die stabilisierte Syntax aus, was das obige Beispiel wie folgt wiedergeben würde:
switch (i) {
case 0, 1 {
x $0;
}
case 2 {
z $0;
}
default {
cx $0, $1;
}
}Wenn Sie mehrere experimentelle Funktionen aktivieren wollen, sollten Sie die Flags mit dem Operator | kombinieren, z. B. flag1 | flag2.
Zum Beispiel, um einen Export unter Verwendung der frühen Semantik der switch Unterstützung durchzuführen:
from qiskit import qasm3, QuantumCircuit, QuantumRegister, ClassicalRegister
# Build the circuit
qreg = QuantumRegister(3)
creg = ClassicalRegister(3)
qc = QuantumCircuit(qreg, creg)
with qc.switch(creg) as case:
with case(0):
qc.x(0)
with case(1, 2):
qc.x(1)
with case(case.DEFAULT):
qc.x(2)
# Export to an OpenQASM 3 string.
qasm_string = qasm3.dumps(qc, experimental=qasm3.ExperimentalFeatures.SWITCH_CASE_V1)Alle Funktionen, die durch die experimentellen Flaggen aktiviert werden, sind natürlich vergänglich. Wenn es notwendig wird, Flags zu entfernen, unterliegen sie der Standard-Abkündigungspolitik von Qiskit. Wir werden diese experimentellen Flaggen so lange wie möglich beibehalten.
Wir können jedoch keine Support-Fenster für Verbraucher von OpenQASM 3 Code garantieren, der mit diesen experimentellen Flags erzeugt wurde, wenn die OpenQASM 3 Sprachspezifikation den Vorschlag, auf dem das Flag basiert, ändert. Es ist möglich, dass jedes Tool, mit dem Sie OpenQASM 3-Code verwenden, der mit diesen Flags erstellt wurde, seine Unterstützung aktualisiert oder entfernt, während Qiskit das Flag weiterhin anbietet. Sie sollten sich nicht auf den resultierenden experimentellen OpenQASM 3 Code für die langfristige Speicherung von Programmen verlassen.
Importieren von OpenQASM 3
Derzeit werden nur zwei High-Level-Funktionen angeboten, da die Qiskit-Unterstützung für den Import von OpenQASM 3 noch in den Kinderschuhen steckt und sich die Implementierung voraussichtlich noch erheblich ändern wird. Die beiden Funktionen sind load() und loads(), die direkte Gegenstücke zu dump() und dumps()sind und ein Programm indirekt aus einer benannten Datei bzw. direkt aus einer angegebenen Zeichenkette laden.
Solange wir uns noch in der Erprobungsphase befinden, muss für die Nutzung beider Funktionen das Paket qiskit_qasm3_import installiert sein. Dies kann durch die Installation von Qiskit mit dem qasm3-import extra geschehen, z.B. durch:
pip install qiskit[qasm3-import]Wir gehen davon aus, dass diese Funktionalität irgendwann in Qiskit integriert wird und keinen optionalen Import mehr erfordert, aber wir haben noch keinen Zeitplan dafür.
load
qiskit.qasm3.load(filename, *, num_qubits=None, annotation_handlers=None)
Laden Sie ein OpenQASM 3 Programm aus der Datei filename.
Parameter
- filename (str) – den Dateinamen, aus dem das Programm geladen werden soll.
- num_qubits (int | None) – schlüsselwortargument, das die Anzahl der physischen/virtuellen Qubits angibt.
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – eine Zuordnung, deren Schlüssel (übergeordnete) Namespaces sind und deren Werte Serializer sind, die die untergeordneten Elemente dieser Namespaces verarbeiten können. Erfordert
qiskit_qasm3_import>=0.6.0.
Rückgabe
eine Schaltungsdarstellung des Programms OpenQASM 3.
Rückgabetyp
Erhöht
QASM3ImporterError - wenn die Datei OpenQASM 3 ungültig ist oder nicht durch eine der folgenden Dateien dargestellt werden kann QuantumCircuit.
Das Argument annotation_handlers . Dies erfordert qiskit_qasm3_import>=0.6.0.
loads
qiskit.qasm3.loads(program, *, num_qubits=None, annotation_handlers=None)
Lädt ein OpenQASM 3 Programm aus der angegebenen Zeichenkette.
Beispiele
Laden eines OpenQASM3 Strings in einen Quantenschaltkreis mit/ohne num_qubits Argument.
from qiskit import qasm3
# An OpenQASM 3 program that only uses 2 physical qubits.
prog = '''
OPENQASM 3.0;
include "stdgates.inc";
h $0;
cx $0, $1;
'''
# The importer can be supplied with the number of qubits in the target backend.
# so the result is full width.
qc = qasm3.loads(prog, num_qubits=5)
assert qc.num_qubits == 5Parameter
- program (str) – das Programm OpenQASM 3.
- num_qubits (int | None) – liefert die Anzahl der physischen/virtuellen Qubits.
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – eine Zuordnung, deren Schlüssel (übergeordnete) Namespaces sind und deren Werte Serializer sind, die die untergeordneten Elemente dieser Namespaces verarbeiten können. Erfordert
qiskit_qasm3_import>=0.6.0.
Rückgabe
eine Schaltungsdarstellung des Programms OpenQASM 3.
Rückgabetyp
Erhöht
- QASM3ImporterError - wenn die Datei OpenQASM 3 ungültig ist oder nicht durch eine der folgenden Dateien dargestellt werden kann
QuantumCircuit. - ValueError - wenn die Anzahl der Qubits in qasm3_ckt größer ist als num_qubits.
Das Argument annotation_handlers . Dies erfordert qiskit_qasm3_import>=0.6.0.
Diese beiden Funktionen erhöhen QASM3ImporterError bei Misserfolg.
QASM3ImporterError
exception qiskit.qasm3.QASM3ImporterError(*message)
Basen: QASM3Error
Während des OpenQASM 3 Importers wurde ein Fehler festgestellt.
Legen Sie die Fehlermeldung fest.
Wir können zum Beispiel ein Quantenprogramm mit OpenQASM 3 definieren und mit loads() um es direkt in ein QuantumCircuit:
import qiskit.qasm3
program = """
OPENQASM 3.0;
include "stdgates.inc";
input float[64] a;
qubit[3] q;
bit[2] mid;
bit[3] out;
let aliased = q[0:1];
gate my_gate(a) c, t {
gphase(a / 2);
ry(a) c;
cx c, t;
}
gate my_phase(a) c {
ctrl @ inv @ gphase(a) c;
}
my_gate(a * 2) aliased[0], q[{1, 2}][0];
measure q[0] -> mid[0];
measure q[1] -> mid[1];
while (mid == "00") {
reset q[0];
reset q[1];
my_gate(a) q[0], q[1];
my_phase(a - pi/2) q[1];
mid[0] = measure q[0];
mid[1] = measure q[1];
}
if (mid[0]) {
let inner_alias = q[{0, 1}];
reset inner_alias;
}
out = measure q;
"""
circuit = qiskit.qasm3.loads(program)
circuit.draw("mpl")
Experimentelle Importschnittstelle
Die oben genannten Importfunktionen stützen sich auf den ANTLR-basierten Referenzparser aus dem Projekt OpenQASM selbst, der eher als Sprachreferenz denn als leistungsfähiger Parser gedacht ist. Sie müssen die Erweiterung qiskit-qasm3-import installiert haben, um sie nutzen zu können.
Qiskit entwickelt einen nativen Parser, geschrieben in Rust, der als Teil des Qiskit-Kernpakets verfügbar ist. Dieser Parser befindet sich noch in einem frühen Versuchsstadium, so dass noch Funktionen fehlen und seine Schnittstelle verändert und erweitert wird, aber er ist in der Regel um Größenordnungen leistungsfähiger für die Teilmenge von OpenQASM 3, die er derzeit unterstützt, und seine Interna liefern bessere Fehlerdiagnosen bei Parsing-Fehlern.
Sie können die experimentelle Schnittstelle sofort verwenden, die ähnliche Funktionen wie die obige Hauptschnittstelle bietet:
load_experimental
qiskit.qasm3.load_experimental(pathlike_or_filelike, /, *, custom_gates=None, include_path=None)
Laden eines OpenQASM 3 Programms aus einer Quelldatei in eine QuantumCircuit.
Diese native Version des OpenQASM 3 Importers ist derzeit noch experimentell. Es ist normalerweise viel schneller als load(), hat aber einen eingeschränkten Funktionsumfang, der im Laufe der Zeit erweitert werden wird.
Parameter
- pathlike_or_filelike (str |os.PathLike |io.TextIOBase) – die Programmquelle. Dies kann entweder als Dateipfad oder als offenes Textstromobjekt angegeben werden. Wenn der Stream bereits geöffnet ist, wird er im Python -Speicher verbraucht, wohingegen Dateinamen im Rust-Speicher geöffnet und verbraucht werden; je nach Ihrem System und der standardmäßigen Pufferung der Streams kann es zu geringfügigen Leistungsunterschieden kommen.
- custom_gates (Iterable[CustomGate]) – Python konstruktoren, die für bestimmte benannte Gates zu verwenden sind. Falls nicht angegeben, verwendet Qiskit seine eigenen Standard-Bibliothekskonstruktoren für Gatter, die in der OpenQASM 3.0 Standard-Bibliotheksdatei
stdgates.incdefiniert sind. - include_path (Iterable[str]) – den Pfad, der bei der Auflösung der
includeAnweisungen zu suchen ist. Wenn dies nicht angegeben wird, sorgt Qiskit dafür, dass dies auf einen Ort verweist, der nurstdgates.incenthält. Die Pfade werden in der Reihenfolge ausprobiert.
Rückgabe
das konstruierte Schaltkreisobjekt.
Rückgabetyp
Erhöht
.QASM3ImporterError - wenn beim Parsen oder bei der semantischen Analyse ein Fehler aufgetreten ist. Im Falle eines Parsing-Fehlers werden die meisten Fehlermeldungen auf dem Terminal ausgegeben und zur besseren Lesbarkeit formatiert.
loads_experimental
qiskit.qasm3.loads_experimental(source, /, *, custom_gates=None, include_path=None)
Laden eines OpenQASM 3 Programms aus einem String in eine QuantumCircuit.
Diese native Version des OpenQASM 3 Importers ist derzeit noch experimentell. Es ist normalerweise viel schneller als loads(), hat aber einen eingeschränkten Funktionsumfang, der im Laufe der Zeit erweitert werden wird.
Parameter
- source (str) – die Programmquelle in einer Python Zeichenfolge.
- custom_gates (Iterable[CustomGate]) – Python konstruktoren, die für bestimmte benannte Gates zu verwenden sind. Falls nicht angegeben, verwendet Qiskit seine eigenen Standard-Bibliothekskonstruktoren für Gatter, die in der OpenQASM 3.0 Standard-Bibliotheksdatei
stdgates.incdefiniert sind. - include_path (Iterable[str]) – den Pfad, der bei der Auflösung der
includeAnweisungen zu suchen ist. Wenn dies nicht angegeben wird, sorgt Qiskit dafür, dass dies auf einen Ort verweist, der nurstdgates.incenthält. Die Pfade werden in der Reihenfolge ausprobiert.
Rückgabe
das konstruierte Schaltkreisobjekt.
Rückgabetyp
Erhöht
.QASM3ImporterError - wenn beim Parsen oder bei der semantischen Analyse ein Fehler aufgetreten ist. Im Falle eines Parsing-Fehlers werden die meisten Fehlermeldungen auf dem Terminal ausgegeben und zur besseren Lesbarkeit formatiert.
Diese beiden Funktionen sind beide experimentell, d.h. sie geben eine ExperimentalWarning bei Verwendung aus, und ihre Schnittstellen können sich innerhalb der Qiskit 1.x Versionsreihe noch ändern. Insbesondere kann der native Parser zur Standardversion von load() und loads(). Wenn Sie das Risiko der Verwendung der experimentellen Schnittstelle in Kauf nehmen wollen, können Sie die Warnung deaktivieren:
import warnings
from qiskit.exceptions import ExperimentalWarning
warnings.filterwarnings("ignore", category=ExperimentalWarning, module="qiskit.qasm3")Diese beiden Funktionen ermöglichen die Angabe von Include-Pfaden als Iterable von Pfaden und die Angabe von benutzerdefinierten Python Konstruktoren, die für bestimmte Gates verwendet werden sollen. Diese benutzerdefinierten Konstruktoren werden durch die Verwendung der CustomGate objekt:
CustomGate
class qiskit.qasm3.CustomGate(constructor, name, num_params, num_qubits)
Basen: object
Informationen aus dem Python -Raum darüber, wie ein Python -Raumobjekt zu konstruieren ist, um ein bestimmtes Tor zu repräsentieren, das deklariert werden könnte.
constructor
Ein aufrufbares Python-Objekt, das Winkel als Positionsargumente entgegennimmt num_params und ein Gate Objekt zurückgibt, das das Tor darstellt.
name
Der Name des Tores, wie er im Programm OpenQASM 3 erscheint. Dies ist nicht unbedingt identisch mit dem Namen, den Qiskit dem Tor gibt.
num_params
Die Anzahl der winkelähnlichen Parameter, die das Tor benötigt.
num_qubits
Die Anzahl der Qubits, auf die das Gate wirkt.
Wenn nicht angegeben custom_gates wird, versucht Qiskit, die Gate-Objekte seiner Standardbibliothek für die Gates zu verwenden, die in der Standardbibliotheksdatei „ OpenQASMstdgates.inc3“ definiert sind. Diese Gate-Sequenz steht auf diesem Modul zur Verfügung, falls Sie darauf aufbauen möchten:
qiskit.qasm3.STDGATES_INC_GATES
Ein Tupel von CustomGate objekten, die die Qiskit-Konstruktoren angeben, die für die Include-Datei stdgates.inc verwendet werden sollen.