OpenQASM 3
qiskit.qasm3
Qiskit proporciona algunas herramientas para convertir entre OpenQASM 3 representaciones de programas cuánticos, y la QuantumCircuit clase. Éstas seguirán evolucionando a medida que aumente la compatibilidad de Qiskit con las capacidades de circuito dinámico expresadas por OpenQASM 3.
Exportación a OpenQASM 3
Las funciones de alto nivel son simplemente dump() y dumps()que exportan respectivamente a un archivo (dado como nombre de archivo) y a una cadena Python.
dump
qiskit.qasm3.dump(circuit, stream, **kwargs)
Serializa un QuantumCircuit objeto como un flujo OpenQASM 3 a un objeto similar a un archivo.
Parámetros
- circuit (QuantumCircuit) – Circuito a serializar.
- stream (TextIOBase) – objeto tipo stream para volcar la serialización OpenQASM 3
- **kwargs - Argumentos para el constructor
Exporterconstructor.
Tipo de retorno
Ninguna
dumps
qiskit.qasm3.dumps(circuit, **kwargs)
Serializa un QuantumCircuit objeto en una cadena OpenQASM 3.
Parámetros
- circuit (QuantumCircuit) – Circuito a serializar.
- **kwargs - Argumentos para el constructor
Exporterconstructor.
Devuelve
La serialización OpenQASM 3
Tipo de retorno
Ambas funciones de exportación son envoltorios de un solo uso de la clase principal Exporter principal. Para necesidades de exportación más complejas, incluido el volcado de varios circuitos en una sola sesión, puede resultar más cómodo o rápido utilizar la interfaz completa.
Exportador
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 clase principal del exportador.
Parámetros
-
includes (Sequence[str]) –
los nombres de archivo que deben emitirse como includes.
NotaEn la actualidad, el exportador sólo entiende correctamente el archivo de la biblioteca estándar
stdgates.inc, en el sentido de que conoce las puertas que define. Puede especificar otros includes, pero necesitará pasar los nombres de las puertas que definen en el argumentobasis_gatespara evitar que el exportador genere una definicióngateseparada. -
basis_gates (Sequence[str]) – el conjunto de puertas básico definido del backend.
-
disable_constants (bool) – si
True, emite siempre constantes de coma flotante para los valores numéricos de los parámetros. SiFalse(por defecto), entonces los valores cercanos a múltiplos de OpenQASM 3 constantes (pi,euler, ytau) serán emitidos en términos de esas constantes en su lugar, mejorando potencialmente la precisión en la salida. -
alias_classical_registers (bool | None) –
Si
True, los bits pueden estar contenidos en más de un registro. Si es así, los registros se emitirán utilizando definiciones de "alias", que podrían no ser bien soportadas por los consumidores de OpenQASM 3.Consulte tambiénParámetro
allow_aliasingUn valor para
allow_aliasinganula cualquier valor dado aquí, y sustituye a este parámetro. -
allow_aliasing (bool | None) –
Si
True, los bits pueden estar contenidos en más de un registro. Si es así, los registros se emitirán utilizando definiciones de "alias", que podrían no ser bien soportadas por los consumidores de OpenQASM 3. Por defectoFalseo el valor dealias_classical_registers.Añadido en la versión 0.25.0. -
indent (str) – la cadena de sangría a utilizar para cada nivel dentro de un bloque sangrado. Puede establecerse como cadena vacía para desactivar la sangría.
-
experimental (ExperimentalFeatures) – las funciones experimentales que deben activarse durante la exportación. Consulte
ExperimentalFeaturespara más detalles. -
annotation_handlers (dict[str, OpenQASM3Serializer] | None) – una asignación de espacios de nombres a serializadores de anotaciones. Cuando se encuentra un objeto
Annotationel espacio de nombres más específico de esta asignación que coincida con el atributonamespacede la anotación. -
implicit_defcals (dict[str, DefcalInstruction] | None) – asignación de
Instruction.names a un objetoDefcalInstructionasociado. Todas las instrucciones con el nombre de clave en el circuito de entrada deben salir como si hubiera una sentenciadefcalcorrespondiente a laDefcalInstructiondada definida. No es necesario que el nombre de la clave yDefcalInstruction.namecoincidan. El nombredefcalno puede coincidir con una palabra clave OpenQASM 3.
dump
dump(circuit, stream)
Convierte el circuito a OpenQASM 3, volcando el resultado a un fichero o flujo de texto.
dumps
Todas estas interfaces levantarán QASM3ExporterError en caso de fallo.
QASM3ExporterError
exception qiskit.qasm3.QASM3ExporterError(*message)
Bases: QASM3Error
Se ha producido un error al ejecutar el exportador OpenQASM 3.
Configura el mensaje de error.
Características experimentales
El lenguaje OpenQASM 3 sigue evolucionando a medida que mejoran las capacidades del hardware, por lo que no existe una sintaxis final a la que Qiskit pueda dirigirse de forma fiable. Con el fin de representar la evolución del lenguaje, en ocasiones publicaremos características antes de su estandarización formal, lo que puede tener que cambiar a medida que avance el proceso de revisión en los comités de diseño de OpenQASM 3. Por defecto, los exportadores sólo admiten las características estandarizadas del idioma. Para activar estas funciones de versión anticipada, utilice el argumento experimental de la palabra clave dump() y dumps(). Las banderas de función disponibles son:
ExperimentalFeatures
class qiskit.qasm3.ExperimentalFeatures(*values)
Bases: Flag
Indicadores de funciones experimentales compatibles con el exportador de OpenQASM 3.
Son experimentales y están más expuestas a cambios, ya que la especificación OpenQASM 3 aún no las ha aceptado formalmente, por lo que es posible que la sintaxis no esté finalizada.
SWITCH_CASE_V1
Valor predeterminado: 1
Soportar la exportación de sentencias switch-case como se propone en https://github.com/openqasm/openqasm/pull/463 en el commit bfa787aa3078.
Estos tienen el formato de salida:
switch (i) {
case 0:
case 1:
x $0;
break;
case 2: {
z $0;
}
break;
default: {
cx $0, $1;
}
break;
}Esto difiere de la sintaxis de la declaración switch estabilizada. Si no se pasa esta opción, el analizador sintáctico utilizará en su lugar la sintaxis estabilizada, con lo que el ejemplo anterior quedaría como:
switch (i) {
case 0, 1 {
x $0;
}
case 2 {
z $0;
}
default {
cx $0, $1;
}
}Si desea activar varias funciones experimentales, debe combinar las banderas utilizando el operador | , como flag1 | flag2.
Por ejemplo, para realizar una exportación utilizando la semántica temprana del soporte 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)Todas las características habilitadas por las banderas experimentales son naturalmente transitorias. Si se hace necesario eliminar las banderas, estarán sujetas a la política estándar de depreciación de Qiskit. Dejaremos estas banderas experimentales durante el tiempo que sea razonable.
Sin embargo, no podemos garantizar ninguna ventana de soporte para los consumidores de código OpenQASM 3 generado utilizando estas banderas experimentales, si la especificación del lenguaje OpenQASM 3 cambia la propuesta en la que se basa la bandera. Es posible que cualquier herramienta que estés utilizando para consumir código OpenQASM 3 creado utilizando estas banderas actualice o elimine su soporte mientras Qiskit siga ofreciendo la bandera. No debe confiar en el código experimental OpenQASM 3 resultante para el almacenamiento a largo plazo de los programas.
Importación desde OpenQASM 3
Actualmente sólo se ofrecen dos funciones de alto nivel, ya que la compatibilidad de Qiskit con la importación desde OpenQASM 3 está en pañales, y se espera que la implementación cambie significativamente. Las dos funciones son load() y loads()que son homólogas directas de dump() y dumps()que cargan, respectivamente, un programa indirectamente a partir de un fichero con nombre y directamente a partir de una cadena dada.
Aunque aún nos encontramos en el periodo de lanzamiento exploratorio, para utilizar cualquiera de las dos funciones es necesario instalar el paquete qiskit_qasm3_import . Esto se puede hacer instalando Qiskit con el extra qasm3-import , como por:
pip install qiskit[qasm3-import]Esperamos que esta funcionalidad se integre finalmente en Qiskit y deje de requerir una importación opcional, pero aún no tenemos plazos para ello.
load
qiskit.qasm3.load(filename, *, num_qubits=None, annotation_handlers=None)
Cargue un programa OpenQASM 3 desde el archivo filename.
Parámetros
- filename (str) – el nombre de archivo desde el que cargar el programa.
- num_qubits (int | None) – que proporciona el número de qubits físicos/virtuales.
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – una correspondencia cuyas claves son espacios de nombres (principales) y cuyos valores son serializadores capaces de gestionar los elementos secundarios de dichos espacios de nombres. Requiere
qiskit_qasm3_import>=0.6.0.
Devuelve
una representación en circuito del programa OpenQASM 3.
Tipo de retorno
Eleva
QASM3ImporterError - si el archivo OpenQASM 3 no es válido, o no puede ser representado por un archivo QuantumCircuit.
El argumento annotation_handlers . Para ello es necesario qiskit_qasm3_import>=0.6.0.
loads
qiskit.qasm3.loads(program, *, num_qubits=None, annotation_handlers=None)
Carga un programa OpenQASM 3 a partir de la cadena dada.
Ejemplos
Carga una cadena OpenQASM3 en un circuito cuántico con/sin el argumento 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 == 5Parámetros
- program (str) – el programa OpenQASM 3.
- num_qubits (int | None) – proporciona el número de qubits físicos/virtuales.
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – una correspondencia cuyas claves son espacios de nombres (principales) y cuyos valores son serializadores capaces de gestionar los elementos secundarios de dichos espacios de nombres. Requiere
qiskit_qasm3_import>=0.6.0.
Devuelve
una representación en circuito del programa OpenQASM 3.
Tipo de retorno
Eleva
- QASM3ImporterError - si el archivo OpenQASM 3 no es válido, o no puede ser representado por un archivo
QuantumCircuit. - ValueError - si el número de qubits en qasm3_ckt es superior a num_qubits.
El argumento annotation_handlers . Para ello es necesario qiskit_qasm3_import>=0.6.0.
Ambas funciones se activan QASM3ImporterError en caso de fallo.
QASM3ImporterError
exception qiskit.qasm3.QASM3ImporterError(*message)
Bases: QASM3Error
Se ha producido un error en el importador de OpenQASM 3.
Configura el mensaje de error.
Por ejemplo, podemos definir un programa cuántico utilizando OpenQASM 3, y utilizar loads() para convertirlo directamente en un programa 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")
Interfaz de importación experimental
Las funciones de importación anteriores se basan en el analizador sintáctico de referencia basado en ANTLR del propio proyecto OpenQASM, que pretende ser más una referencia lingüística que un analizador sintáctico eficaz. Para utilizarlo, debe tener instalada la extensión qiskit-qasm3-import .
Qiskit está desarrollando un analizador sintáctico nativo, escrito en Rust, que está disponible como parte del paquete central de Qiskit. Este analizador sintáctico aún se encuentra en fase experimental, por lo que le faltan funciones y su interfaz está cambiando y ampliándose, pero suele ser mucho más eficaz para el subconjunto de OpenQASM 3 que admite actualmente, y sus funciones internas producen mejores diagnósticos de errores en los fallos de análisis sintáctico.
Puede utilizar inmediatamente la interfaz experimental, con funciones similares a las de la interfaz principal anterior:
load_experimental
qiskit.qasm3.load_experimental(pathlike_or_filelike, /, *, custom_gates=None, include_path=None)
Cargar un programa OpenQASM 3 desde un archivo fuente a un archivo QuantumCircuit.
Esta versión nativa del importador de OpenQASM 3 es actualmente experimental. Suele ser mucho más rápido que load()pero tiene un conjunto reducido de funciones, que se ampliará con el tiempo.
Parámetros
- pathlike_or_filelike (str |os.PathLike |io.TextIOBase) – la fuente del programa. Puede ser una ruta de archivo o un objeto de flujo de texto abierto. Si el flujo ya está abierto, se consume en el espacio Python, mientras que los nombres de archivo se abren y se consumen en el espacio Rust; puede haber características de rendimiento ligeramente diferentes, dependiendo de su sistema y de cómo se almacenan en búfer los flujos por defecto.
- custom_gates (Iterable[CustomGate]) – Python constructores a utilizar para determinadas puertas con nombre. Si no se proporciona, Qiskit utilizará sus propios constructores de la biblioteca estándar para las puertas definidas en el OpenQASM 3.0 archivo de la biblioteca estándar
stdgates.inc. - include_path (Iterable[str]) – la ruta que debe buscarse al resolver las sentencias
include. Si no se indica, Qiskit se encargará de que apunte a una ubicación que sólo contengastdgates.inc. Las rutas se intentan en el orden secuencial.
Devuelve
el objeto circuito construido.
Tipo de retorno
Eleva
.QASM3ImporterError - si se ha producido un error durante el análisis sintáctico o semántico. En caso de error de análisis sintáctico, la mayoría de los mensajes de error se imprimen en el terminal y se formatean, para una mejor legibilidad.
loads_experimental
qiskit.qasm3.loads_experimental(source, /, *, custom_gates=None, include_path=None)
Cargar un programa OpenQASM 3 desde una cadena a un archivo QuantumCircuit.
Esta versión nativa del importador de OpenQASM 3 es actualmente experimental. Suele ser mucho más rápido que loads()pero tiene un conjunto reducido de funciones, que se ampliará con el tiempo.
Parámetros
- source (str) – la fuente del programa en una cadena Python.
- custom_gates (Iterable[CustomGate]) – Python constructores a utilizar para determinadas puertas con nombre. Si no se proporciona, Qiskit utilizará sus propios constructores de la biblioteca estándar para las puertas definidas en el OpenQASM 3.0 archivo de la biblioteca estándar
stdgates.inc. - include_path (Iterable[str]) – la ruta que debe buscarse al resolver las sentencias
include. Si no se indica, Qiskit se encargará de que apunte a una ubicación que sólo contengastdgates.inc. Las rutas se intentan en el orden secuencial.
Devuelve
el objeto circuito construido.
Tipo de retorno
Eleva
.QASM3ImporterError - si se ha producido un error durante el análisis sintáctico o semántico. En caso de error de análisis sintáctico, la mayoría de los mensajes de error se imprimen en el terminal y se formatean, para una mejor legibilidad.
Estas dos funciones son experimentales, lo que significa que emiten un ExperimentalWarning al utilizarlas, y sus interfaces pueden estar sujetas a cambios dentro de la serie de versiones de Qiskit 1.x. En particular, el analizador sintáctico nativo puede promoverse para que sea la versión por defecto de load() y loads(). Si aceptas el riesgo de utilizar la interfaz experimental, puedes desactivar la advertencia:
import warnings
from qiskit.exceptions import ExperimentalWarning
warnings.filterwarnings("ignore", category=ExperimentalWarning, module="qiskit.qasm3")Estas dos funciones permiten especificar rutas de inclusión como un iterable de rutas, y especificar constructores personalizados Python a utilizar para puertas concretas. Estos constructores personalizados se especifican utilizando el parámetro CustomGate objeto:
CustomGate
class qiskit.qasm3.CustomGate(constructor, name, num_params, num_qubits)
Bases: object
Información recibida de Python space sobre cómo construir un objeto Python -space para representar una puerta determinada que podría declararse.
constructor
Un objeto invocable Python que toma los ángulos num_params como argumentos posicionales y devuelve un objeto Gate que representa la puerta.
name
El nombre de la puerta tal y como aparece en el programa OpenQASM 3. Esto no es necesariamente idéntico al nombre que Qiskit da a la puerta.
num_params
El número de parámetros angulares que requiere la puerta.
num_qubits
Número de qubits sobre los que actúa la puerta.
Si no custom_gates se especifica, Qiskit intentará utilizar los objetos de puerta de su biblioteca estándar para las puertas definidas en el archivo de la biblioteca estándar de OpenQASMstdgates.ince 3. Esta secuencia de puertas está disponible en este módulo, por si quieres ampliarla:
qiskit.qasm3.STDGATES_INC_GATES
Una tupla de objetos CustomGate que especifican los constructores Qiskit que se utilizarán para el archivo de inclusión stdgates.inc .