OpenQASM 3
qiskit.qasm3
Qiskit fournit quelques outils pour convertir les représentations OpenQASM 3 des programmes quantiques, et la classe QuantumCircuit classe. Celles-ci continueront d'évoluer au fur et à mesure que le support de Qiskit pour les capacités de circuit dynamique exprimées par OpenQASM 3 augmentera.
Exportation vers OpenQASM 3
Les fonctions de haut niveau sont simplement dump() et dumps()qui exportent respectivement vers un fichier (donné comme nom de fichier) et vers une chaîne Python.
dump
qiskit.qasm3.dump(circuit, stream, **kwargs)
Sérialiser un objet QuantumCircuit un objet sous forme de flux OpenQASM 3 vers un objet de type fichier.
Paramètres
- circuit (QuantumCircuit) – Circuit à sérialiser.
- stream (TextIOBase) – objet de type flux pour déverser la sérialisation de OpenQASM 3
- **kwargs - Arguments pour le constructeur
Exporterconstructeur.
Type de retour
Aucun
dumps
qiskit.qasm3.dumps(circuit, **kwargs)
Sérialiser un objet QuantumCircuit objet dans une chaîne de caractères OpenQASM 3.
Paramètres
- circuit (QuantumCircuit) – Circuit à sérialiser.
- **kwargs - Arguments pour le constructeur
Exporterconstructeur.
Retours
La sérialisation de OpenQASM 3
Type de retour
Ces deux fonctions d'exportation sont des enveloppes à usage unique autour de la classe principale Exporter à usage unique. Pour des besoins d'exportation plus complexes, y compris le dumping de plusieurs circuits en une seule session, il peut être plus pratique ou plus rapide d'utiliser l'interface complète.
Exportateur
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)
Bases : object
QASM3 classe principale de l'exportateur.
Paramètres
-
includes (Sequence[str]) –
les noms de fichiers qui doivent être émis en tant qu'inclusions.
RemarqueActuellement, seul le fichier de la bibliothèque standard
stdgates.incest correctement compris par l'exportateur, en ce sens qu'il connaît les portes qu'il définit. Vous pouvez spécifier d'autres inclusions, mais vous devrez transmettre les noms des portes qu'elles définissent dans l'argumentbasis_gatespour éviter que l'exportateur ne produise une définition distincte degate. -
basis_gates (Sequence[str]) – l'ensemble de portes défini de base du backend.
-
disable_constants (bool) – si
True, émet toujours des constantes en virgule flottante pour les valeurs numériques des paramètres. SiFalse(valeur par défaut), les valeurs proches des multiples de OpenQASM 3 constantes (pi,euler, ettau) seront émises en termes de ces constantes à la place, ce qui peut améliorer la précision de la sortie. -
alias_classical_registers (bool | None) –
Si
True, les bits peuvent être contenus dans plus d'un registre. Si c'est le cas, les registres seront émis en utilisant des définitions "alias", qui pourraient ne pas être bien supportées par les utilisateurs de OpenQASM 3.Voir aussiParamètres
allow_aliasingUne valeur pour
allow_aliasingremplace toute valeur donnée ici et annule ce paramètre. -
allow_aliasing (bool | None) –
Si
True, les bits peuvent être contenus dans plus d'un registre. Si c'est le cas, les registres seront émis en utilisant des définitions "alias", qui pourraient ne pas être bien supportées par les utilisateurs de OpenQASM 3. La valeur par défaut estFalseou la valeur dealias_classical_registers.Ajouté dans la version 0.25.0. -
indent (str) – la chaîne d'indentation à utiliser pour chaque niveau d'un bloc indenté. Peut être défini comme une chaîne vide pour désactiver l'indentation.
-
experimental (ExperimentalFeatures) – les éventuelles fonctionnalités expérimentales à activer lors de l'exportation. Voir
ExperimentalFeaturespour plus de détails. -
annotation_handlers (dict[str, OpenQASM3Serializer] | None) – une mise en correspondance entre les espaces de noms et les sérialiseurs d'annotations. Lorsqu'un
Annotationobjet est détecté, l'espace de noms le plus spécifique de ce mappage qui correspond à l'attribut denamespacel'annotation sera utilisé pour le sérialiser. -
implicit_defcals (dict[str, DefcalInstruction] | None) – mise en correspondance de
Instruction.names avec un objet associéDefcalInstruction. Toutes les instructions dont le nom de clé figure dans le circuit d'entrée doivent être traitées comme s'il existait unedefcalinstruction correspondant à la clé donnéeDefcalInstruction. Il n'est pas nécessaire que le nom de la clé et leDefcalInstruction.namecorrespondent. Ledefcalnom ne doit pas entrer en conflit avec un mot-clé de l' OpenQASM e 3.
dump
dump(circuit, stream)
Convertissez le circuit en OpenQASM 3, en envoyant le résultat dans un fichier ou un flux de texte.
dumps
dumps(circuit)
Convertit le circuit en OpenQASM 3, en renvoyant le résultat sous forme de chaîne de caractères.
Toutes ces interfaces relèveront QASM3ExporterError en cas d'échec.
QASM3ExporterError
exception qiskit.qasm3.QASM3ExporterError(*message)
Bases : QASM3Error
Une erreur s'est produite lors de l'exécution de l'exportateur OpenQASM 3.
Définir le message d'erreur.
Fonctions expérimentales
Le langage OpenQASM 3 continue d'évoluer au fur et à mesure que les capacités matérielles s'améliorent, de sorte qu'il n'existe pas de syntaxe définitive que Qiskit puisse cibler de manière fiable. Afin de représenter l'évolution du langage, nous publierons parfois des fonctionnalités avant la normalisation formelle, qui pourraient devoir être modifiées au fur et à mesure de l'avancement du processus de révision au sein des comités de conception de OpenQASM 3. Par défaut, les exportateurs ne prennent en charge que les fonctionnalités standardisées de la langue. Pour activer ces fonctionnalités, utilisez le mot-clé experimental de la commande dump() et dumps(). Les indicateurs de caractéristiques disponibles sont les suivants :
ExperimentalFeatures
class qiskit.qasm3.ExperimentalFeatures(*values)
Bases : Flag
Indicateurs de fonctionnalités expérimentales prises en charge par l'exportateur OpenQASM 3.
Ils sont expérimentaux et sont plus susceptibles de changer, car la spécification OpenQASM 3 ne les a pas encore formellement acceptés, de sorte que la syntaxe peut ne pas être finalisée.
SWITCH_CASE_V1
Valeur par défaut : 1
Prise en charge de l'exportation des déclarations switch-case comme proposé par https://github.com/openqasm/openqasm/pull/463 au commit bfa787aa3078.
Ceux-ci ont le format de sortie :
switch (i) {
case 0:
case 1:
x $0;
break;
case 2: {
z $0;
}
break;
default: {
cx $0, $1;
}
break;
}Cela diffère de la syntaxe de la déclaration switch telle qu'elle a été stabilisée. Si ce drapeau n'est pas passé, l'analyseur syntaxique utilisera à la place la syntaxe stabilisée, ce qui rendrait le même exemple ci-dessus comme :
switch (i) {
case 0, 1 {
x $0;
}
case 2 {
z $0;
}
default {
cx $0, $1;
}
}Si vous souhaitez activer plusieurs fonctions expérimentales, vous devez combiner les drapeaux à l'aide de l'opérateur | , par exemple flag1 | flag2.
Par exemple, pour effectuer une exportation en utilisant la première sémantique du support switch :
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)Toutes les fonctions activées par les drapeaux expérimentaux sont naturellement transitoires. S'il s'avère nécessaire de supprimer les drapeaux, ils seront soumis à la politique de dépréciation standard de Qiskit. Nous laisserons ces drapeaux expérimentaux en place aussi longtemps qu'il sera raisonnable de le faire.
Cependant, nous ne pouvons garantir aucune fenêtre de support pour les consommateurs de code OpenQASM 3 généré à l'aide de ces drapeaux expérimentaux, si la spécification du langage OpenQASM 3 modifie la proposition sur laquelle le drapeau est basé. Il est possible que tout outil que vous utilisez pour consommer du code OpenQASM 3 créé à l'aide de ces drapeaux mette à jour ou supprime leur support alors que Qiskit continue à offrir le drapeau. Vous ne devez pas vous fier au code expérimental OpenQASM 3 résultant pour le stockage à long terme des programmes.
Importation depuis OpenQASM 3
Actuellement, seules deux fonctions de haut niveau sont proposées, car la prise en charge par Qiskit de l'importation à partir de OpenQASM 3 n'en est qu'à ses balbutiements, et la mise en œuvre devrait changer de manière significative. Les deux fonctions sont load() et loads()qui sont les contreparties directes de dump() et dumps()qui chargent respectivement un programme indirectement à partir d'un fichier nommé et directement à partir d'une chaîne de caractères donnée.
Bien que nous soyons encore dans la période exploratoire, pour utiliser l'une ou l'autre de ces fonctions, le paquet qiskit_qasm3_import doit être installé. Ceci peut être fait en installant Qiskit avec l'extra qasm3-import , comme par exemple :
pip install qiskit[qasm3-import]Nous espérons que cette fonctionnalité sera finalement intégrée à Qiskit et ne nécessitera plus d'importation facultative, mais nous ne disposons pas encore d'un calendrier à cet égard.
load
qiskit.qasm3.load(filename, *, num_qubits=None, annotation_handlers=None)
Charger un programme OpenQASM 3 à partir du fichier filename.
Paramètres
- filename (str) – le nom du fichier à partir duquel le programme doit être chargé.
- num_qubits (int | None) – qui fournit le nombre de qubits physiques/virtuels.
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – un mappage dont les clés sont des espaces de noms (parents) et dont les valeurs sont des sérialiseurs capables de gérer les éléments enfants de ces espaces de noms. Nécessite
qiskit_qasm3_import>=0.6.0.
Retours
une représentation du circuit du programme OpenQASM 3.
Type de retour
Augmentations
QASM3ImporterError - si le fichier OpenQASM 3 n'est pas valide ou ne peut être représenté par un fichier QuantumCircuit.
L'argument annotation_handlers . Pour ce faire, il faut se rendre sur le site qiskit_qasm3_import>=0.6.0.
loads
qiskit.qasm3.loads(program, *, num_qubits=None, annotation_handlers=None)
Charge un programme OpenQASM 3 à partir de la chaîne donnée.
Exemples
Chargement d'une chaîne OpenQASM3 dans un circuit quantique avec/sans l'argument num_qubits.
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 == 5Paramètres
- program (str) – le programme OpenQASM 3.
- num_qubits (int | None) – fournit le nombre de qubits physiques/virtuels.
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – un mappage dont les clés sont des espaces de noms (parents) et dont les valeurs sont des sérialiseurs capables de gérer les éléments enfants de ces espaces de noms. Nécessite
qiskit_qasm3_import>=0.6.0.
Retours
une représentation du circuit du programme OpenQASM 3.
Type de retour
Augmentations
- QASM3ImporterError - si le fichier OpenQASM 3 n'est pas valide ou ne peut être représenté par un fichier
QuantumCircuit. - ValueError - si le nombre de qubits dans qasm3_ckt est supérieur à num_qubits.
L'argument annotation_handlers . Pour ce faire, il faut se rendre sur le site qiskit_qasm3_import>=0.6.0.
Ces deux fonctions soulèvent QASM3ImporterError en cas d'échec.
QASM3ImporterError
exception qiskit.qasm3.QASM3ImporterError(*message)
Bases : QASM3Error
Une erreur s'est produite pendant l'importateur OpenQASM 3.
Définir le message d'erreur.
Par exemple, nous pouvons définir un programme quantique en utilisant OpenQASM 3, et utiliser loads() pour le convertir directement en un programme 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")
Interface d'importation expérimentale
Les fonctions d'importation présentées ci-dessus s'appuient sur l'analyseur de référence ANTLR du projet OpenQASM lui-même, qui est davantage conçu comme une référence linguistique que comme un analyseur performant. Vous devez avoir installé l'extension qiskit-qasm3-import pour l'utiliser.
Qiskit développe un analyseur natif, écrit en Rust, qui est disponible dans le paquetage de base de Qiskit. Cet analyseur en est encore à ses premiers stades expérimentaux, il lui manque donc des fonctionnalités et son interface est en train de changer et de s'étendre, mais il est généralement plus performant de plusieurs ordres de grandeur pour le sous-ensemble de OpenQASM 3 qu'il supporte actuellement, et ses internes produisent de meilleurs diagnostics d'erreur en cas d'échec de l'analyse.
Vous pouvez utiliser l'interface expérimentale immédiatement, avec des fonctions similaires à celles de l'interface principale ci-dessus :
load_experimental
qiskit.qasm3.load_experimental(pathlike_or_filelike, /, *, custom_gates=None, include_path=None)
Charger un programme OpenQASM 3 à partir d'un fichier source dans un fichier QuantumCircuit.
Cette version native de l'importateur OpenQASM 3 est actuellement expérimentale. Il est généralement beaucoup plus rapide que load()mais dispose d'un ensemble réduit de fonctionnalités prises en charge, qui s'étoffera au fil du temps.
Paramètres
- pathlike_or_filelike (str |os.PathLike |io.TextIOBase) – la source du programme. Il peut s'agir d'un chemin d'accès à un fichier ou d'un objet de flux de texte ouvert. Si le flux est déjà ouvert, il est consommé dans l'espace Python, alors que les noms de fichiers sont ouverts et consommés dans l'espace Rust; les performances peuvent être légèrement différentes selon votre système et la manière dont les flux sont mis en mémoire tampon par défaut.
- custom_gates (Iterable[CustomGate]) – Python les constructeurs à utiliser pour des portes nommées particulières. S'il n'est pas fourni, Qiskit utilisera ses propres constructeurs de bibliothèque standard pour les portes définies dans le fichier de bibliothèque standard OpenQASM 3.0
stdgates.inc. - include_path (Iterable[str]) – le chemin à rechercher lors de la résolution des déclarations
include. S'il n'est pas indiqué, Qiskit s'arrangera pour qu'il pointe vers un emplacement contenant uniquementstdgates.inc. Les chemins sont essayés dans l'ordre de la séquence.
Retours
l'objet circuit construit.
Type de retour
Augmentations
.QASM3ImporterError - si une erreur s'est produite lors de l'analyse syntaxique ou sémantique. Dans le cas d'une erreur d'analyse, la plupart des messages d'erreur sont imprimés sur le terminal et formatés, pour une meilleure lisibilité.
loads_experimental
qiskit.qasm3.loads_experimental(source, /, *, custom_gates=None, include_path=None)
Charger un programme OpenQASM 3 à partir d'une chaîne de caractères dans un fichier QuantumCircuit.
Cette version native de l'importateur OpenQASM 3 est actuellement expérimentale. Il est généralement beaucoup plus rapide que loads()mais dispose d'un ensemble réduit de fonctionnalités prises en charge, qui s'étoffera au fil du temps.
Paramètres
- source (str) – la source du programme dans une chaîne Python.
- custom_gates (Iterable[CustomGate]) – Python les constructeurs à utiliser pour des portes nommées particulières. S'il n'est pas fourni, Qiskit utilisera ses propres constructeurs de bibliothèque standard pour les portes définies dans le fichier de bibliothèque standard OpenQASM 3.0
stdgates.inc. - include_path (Iterable[str]) – le chemin à rechercher lors de la résolution des déclarations
include. S'il n'est pas indiqué, Qiskit s'arrangera pour qu'il pointe vers un emplacement contenant uniquementstdgates.inc. Les chemins sont essayés dans l'ordre de la séquence.
Retours
l'objet circuit construit.
Type de retour
Augmentations
.QASM3ImporterError - si une erreur s'est produite lors de l'analyse syntaxique ou sémantique. Dans le cas d'une erreur d'analyse, la plupart des messages d'erreur sont imprimés sur le terminal et formatés, pour une meilleure lisibilité.
Ces deux fonctions sont expérimentales, ce qui signifie qu'elles émettent un ExperimentalWarning sur l'utilisation, et leurs interfaces peuvent être modifiées dans la série de versions de Qiskit 1.x. En particulier, l'analyseur natif peut être promu au rang de version par défaut de load() et loads(). Si vous acceptez les risques liés à l'utilisation de l'interface expérimentale, vous pouvez désactiver l'avertissement en procédant comme suit :
import warnings
from qiskit.exceptions import ExperimentalWarning
warnings.filterwarnings("ignore", category=ExperimentalWarning, module="qiskit.qasm3")Ces deux fonctions permettent de spécifier des chemins d'inclusion sous la forme d'une table itérative de chemins et de spécifier des constructeurs Python personnalisés à utiliser pour des portes particulières. Ces constructeurs personnalisés sont spécifiés à l'aide de l'option CustomGate de l'objet :
CustomGate
class qiskit.qasm3.CustomGate(constructor, name, num_params, num_qubits)
Bases : object
Informations reçues de Python space sur la manière de construire un objet Python -space pour représenter une porte donnée qui pourrait être déclarée.
constructor
Un objet Python appelable qui prend num_params des angles comme arguments de position et renvoie un Gate objet représentant la porte.
name
Le nom de la porte tel qu'il apparaît dans le programme OpenQASM 3. Ce nom n'est pas nécessairement identique à celui que Qiskit donne à la porte.
num_params
Nombre de paramètres de type angle requis par la porte.
num_qubits
Le nombre de qubits sur lesquels la porte agit.
Si custom_gates n'est pas spécifié, Qiskit tentera d'utiliser les objets de porte de sa bibliothèque standard pour les portes définies dans le fichier de la bibliothèque standard « stdgates.incOpenQASM 3 ». Cette séquence de portes est disponible sur ce module, si vous souhaitez vous en servir comme base :
qiskit.qasm3.STDGATES_INC_GATES
Un tuple d'objets CustomGate spécifiant les constructeurs Qiskit à utiliser pour le fichier d'inclusion stdgates.inc .