Skip to main content
IBM Quantum Platform

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)

GitHub

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 Exporter konstrukteur.

Rückgabetyp

Keine

dumps

qiskit.qasm3.dumps(circuit, **kwargs)

GitHub

Serialisieren Sie ein QuantumCircuit objekt in eine OpenQASM 3 Zeichenkette.

Parameter

  • circuit (QuantumCircuit) – Schaltung zur Serialisierung.
  • **kwargs - Argumente für den Exporter konstrukteur.

Rückgabe

Die OpenQASM 3 Serialisierung

Rückgabetyp

str

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)

GitHub

Basen: object

QASM3 hauptklasse des Exporteurs.

Parameter

  • includes (Sequence[str]) –

    die Dateinamen, die als Includes ausgegeben werden sollen.

    Anmerkung

    Gegenwärtig wird nur die Standardbibliotheksdatei stdgates.inc vom 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 Argument basis_gates übergeben, damit der Exporter keine separate gate Definition 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. Wenn False (Standardeinstellung), dann werden Werte, die nahe an Vielfachen von OpenQASM 3 Konstanten (pi, euler und tau) 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 auch

    Parameter allow_aliasing

    Ein Wert für allow_aliasing hat 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 ist False oder der Wert von alias_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 ExperimentalFeatures für weitere Einzelheiten.

  • annotation_handlers (dict[str, OpenQASM3Serializer] | None) – eine Zuordnung von Namensräumen zu Annotations-Serialisierern. Wenn ein Annotation Objekt gefunden wird, wird zur Serialisierung der spezifischste Namensraum in dieser Zuordnung verwendet, der mit dem Attribut der namespace Annotation übereinstimmt.

  • implicit_defcals (dict[str, DefcalInstruction] | None) – Zuordnung von Instruction.names zu einem zugehörigen DefcalInstruction Objekt. Alle Anweisungen, deren Schlüsselname in der Eingabekette vorkommt, sollten so ausgegeben werden, als ob eine defcal der angegebenen DefcalInstruction Anweisungen definiert wäre. Der Schlüsselname und das DefcalInstruction.name müssen nicht übereinstimmen. Der defcal Name darf nicht mit einem Schlüsselwort von „ OpenQASM 3“ kollidieren.

dump

dump(circuit, stream)

GitHub

Konvertieren Sie die Schaltung in OpenQASM 3 und geben Sie das Ergebnis in eine Datei oder einen Textstrom aus.

dumps

dumps(circuit)

GitHub

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)

GitHub

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)

GitHub

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

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.

Anmerkung

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)

GitHub

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

QuantumCircuit

Erhöht

QASM3ImporterError - wenn die Datei OpenQASM 3 ungültig ist oder nicht durch eine der folgenden Dateien dargestellt werden kann QuantumCircuit.

Hinzugefügt in Version 2.1

Das Argument annotation_handlers . Dies erfordert qiskit_qasm3_import>=0.6.0.

loads

qiskit.qasm3.loads(program, *, num_qubits=None, annotation_handlers=None)

GitHub

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 == 5

Parameter

  • 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

QuantumCircuit

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.
Hinzugefügt in Version 2.1

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)

GitHub

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

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.

Achtung

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.inc definiert sind.
  • include_path (Iterable[str]) – den Pfad, der bei der Auflösung der include Anweisungen zu suchen ist. Wenn dies nicht angegeben wird, sorgt Qiskit dafür, dass dies auf einen Ort verweist, der nur stdgates.inc enthält. Die Pfade werden in der Reihenfolge ausprobiert.

Rückgabe

das konstruierte Schaltkreisobjekt.

Rückgabetyp

QuantumCircuit

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.

Achtung

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.inc definiert sind.
  • include_path (Iterable[str]) – den Pfad, der bei der Auflösung der include Anweisungen zu suchen ist. Wenn dies nicht angegeben wird, sorgt Qiskit dafür, dass dies auf einen Ort verweist, der nur stdgates.inc enthält. Die Pfade werden in der Reihenfolge ausprobiert.

Rückgabe

das konstruierte Schaltkreisobjekt.

Rückgabetyp

QuantumCircuit

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.

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