Notas de la versión de Qiskit 0.44
Historial de versiones
Esta es la última versión en la que qiskit era un "metapaquete", que contenía varios "elementos" diferentes. Lo que se denomina "Qiskit Terra" en estas notas de la versión (y en otras anteriores) es principalmente lo que ahora se llama simplemente "Qiskit".
Esta tabla registra las versiones del metapaquete y la versión de cada elemento heredado de Qiskit instalado:
Versión del metapaquete Qiskit | qiskit-terra | qiskit-aer | qiskit-ignis | qiskit-ibmq-provider | qiskit-aqua | Fecha de release |
|---|---|---|---|---|---|---|
| 0.44.1 | 0.25.1 | 2023-08-17 | ||||
| 0.44.0 | 0.25.0 | 2023-07-27 | ||||
| 0.43.3 | 0.24.2 | 0.12.2 | 0.20.2 | 2023-07-19 | ||
| 0.43.2 | 0.24.1 | 0.12.1 | 0.20.2 | 2023-06-28 | ||
| 0.43.1 | 0.24.1 | 0.12.0 | 0.20.2 | 2023-06-02 | ||
| 0.43.0 | 0.24.0 | 0.12.0 | 0.20.2 | 2023-05-04 | ||
| 0.42.1 | 0.23.3 | 0.12.0 | 0.20.2 | 2023-03-21 | ||
| 0.42.0 | 0.23.2 | 0.12.0 | 0.20.2 | 2023-03-10 | ||
| 0.41.1 | 0.23.2 | 0.11.2 | 0.20.1 | 2023-02-23 | ||
| 0.41.0 | 0.23.1 | 0.11.2 | 0.20.0 | 2023-01-31 | ||
| 0.40.0 | 0.23.0 | 0.11.2 | 0.19.2 | 2023-01-26 | ||
| 0.39.5 | 0.22.4 | 0.11.2 | 0.19.2 | 2023-01-17 | ||
| 0.39.4 | 0.22.3 | 0.11.2 | 0.19.2 | 2022-12-08 | ||
| 0.39.3 | 0.22.3 | 0.11.1 | 0.19.2 | 2022-11-25 | ||
| 0.39.2 | 0.22.2 | 0.11.1 | 0.19.2 | 2022-11-03 | ||
| 0.39.1 | 0.22.1 | 0.11.1 | 0.19.2 | 2022-11-02 | ||
| 0.39.0 | 0.22.0 | 0.11.0 | 0.19.2 | 2022-10-13 | ||
| 0.38.0 | 0.21.2 | 0.11.0 | 0.19.2 | 2022-09-14 | ||
| 0.37.2 | 0.21.2 | 0.10.4 | 0.19.2 | 2022-08-23 | ||
| 0.37.1 | 0.21.1 | 0.10.4 | 0.19.2 | 2022-07-28 | ||
| 0.37.0 | 0.21.0 | 0.10.4 | 0.19.2 | 2022-06-30 | ||
| 0.36.2 | 0.20.2 | 0.10.4 | 0.7.1 | 0.19.1 | 2022-05-18 | |
| 0.36.1 | 0.20.1 | 0.10.4 | 0.7.0 | 0.19.1 | 2022-04-21 | |
| 0.36.0 | 0.20.0 | 0.10.4 | 0.7.0 | 0.19.0 | 06-04-2022 | |
| 0.35.0 | 0.20.0 | 0.10.3 | 0.7.0 | 0.18.3 | 2022-03-31 | |
| 0.34.2 | 0.19.2 | 0.10.3 | 0.7.0 | 0.18.3 | 2022-02-09 | |
| 0.34.1 | 0.19.1 | 0.10.2 | 0.7.0 | 0.18.3 | 2022-01-05 | |
| 0.34.0 | 0.19.1 | 0.10.1 | 0.7.0 | 0.18.3 | 20-12-2021 | |
| 0.33.1 | 0.19.1 | 0.9.1 | 0.7.0 | 0.18.2 | 10-12-2021 | |
| 0.33.0 | 0.19.0 | 0.9.1 | 0.7.0 | 0.18.1 | 06-12-2021 | |
| 0.32.1 | 0.18.3 | 0.9.1 | 0.6.0 | 0.18.1 | 0.9.5 | 2021-11-22 |
| 0.32.0 | 0.18.3 | 0.9.1 | 0.6.0 | 0.18.0 | 0.9.5 | 2021-11-10 |
| 0.31.0 | 0.18.3 | 0.9.1 | 0.6.0 | 0.17.0 | 0.9.5 | 12-10-2021 |
| 0.30.1 | 0.18.3 | 0.9.0 | 0.6.0 | 0.16.0 | 0.9.5 | 2021-09-29 |
| 0.30.0 | 0.18.2 | 0.9.0 | 0.6.0 | 0.16.0 | 0.9.5 | 16-09-2021 |
| 0.29.1 | 0.18.2 | 0.8.2 | 0.6.0 | 0.16.0 | 0.9.5 | 10-09-2021 |
| 0.29.0 | 0.18.1 | 0.8.2 | 0.6.0 | 0.16.0 | 0.9.4 | 2021-08-02 |
| 0.28.0 | 0.18.0 | 0.8.2 | 0.6.0 | 0.15.0 | 0.9.4 | 13-07-2021 |
| 0.27.0 | 0.17.4 | 0.8.2 | 0.6.0 | 0.14.0 | 0.9.2 | 15-06-2021 |
| 0.26.2 | 0.17.4 | 0.8.2 | 0.6.0 | 0.13.1 | 0.9.1 | 2021-05-19 |
| 0.26.1 | 0.17.4 | 0.8.2 | 0.6.0 | 0.13.1 | 0.9.1 | 2021-05-18 |
| 0.26.0 | 0.17.3 | 0.8.2 | 0.6.0 | 0.13.1 | 0.9.1 | 2021-05-11 |
| 0.25.4 | 0.17.2 | 0.8.2 | 0.6.0 | 0.12.3 | 0.9.1 | 2021-05-05 |
| 0.25.3 | 0.17.1 | 0.8.2 | 0.6.0 | 0.12.3 | 0.9.1 | 2021-04-29 |
| 0.25.2 | 0.17.1 | 0.8.1 | 0.6.0 | 0.12.3 | 0.9.1 | 2021-04-21 |
| 0.25.1 | 0.17.1 | 0.8.1 | 0.6.0 | 0.12.2 | 0.9.1 | 2021-04-15 |
| 0.25.0 | 0.17.0 | 0.8.0 | 0.6.0 | 0.12.2 | 0.9.0 | 02-04-2021 |
| 0.24.1 | 0.16.4 | 0.7.6 | 0.5.2 | 0.12.2 | 0.8.2 | 24-03-2021 |
| 0.24.0 | 0.16.4 | 0.7.6 | 0.5.2 | 0.12.1 | 0.8.2 | 2021-03-04 |
| 0.23.6 | 0.16.4 | 0.7.5 | 0.5.2 | 0.11.1 | 0.8.2 | 2021-02-18 |
| 0.23.5 | 0.16.4 | 0.7.4 | 0.5.2 | 0.11.1 | 0.8.2 | 2021-02-08 |
| 0.23.4 | 0.16.3 | 0.7.3 | 0.5.1 | 0.11.1 | 0.8.1 | 2021-01-28 |
| 0.23.3 | 0.16.2 | 0.7.3 | 0.5.1 | 0.11.1 | 0.8.1 | 26-01-2021 |
| 0.23.2 | 0.16.1 | 0.7.2 | 0.5.1 | 0.11.1 | 0.8.1 | 2020-12-15 |
| 0.23.1 | 0.16.1 | 0.7.1 | 0.5.1 | 0.11.1 | 0.8.1 | 2020-11-12 |
| 0.23.0 | 0.16.0 | 0.7.0 | 0.5.0 | 0.11.0 | 0.8.0 | 2020-10-16 |
| 0.22.0 | 0.15.2 | 0.6.1 | 0.4.0 | 0.10.0 | 0.7.5 | 2020-10-05 |
| 0.21.0 | 0.15.2 | 0.6.1 | 0.4.0 | 0.9.0 | 0.7.5 | 2020-09-16 |
| 0.20.1 | 0.15.2 | 0.6.1 | 0.4.0 | 0.8.0 | 0.7.5 | 2020-09-08 |
| 0.20.0 | 0.15.1 | 0.6.1 | 0.4.0 | 0.8.0 | 0.7.5 | 2020-08-10 |
| 0.19.6 | 0.14.2 | 0.5.2 | 0.3.3 | 0.7.2 | 0.7.3 | 2020-06-25 |
| 0.19.5 | 0.14.2 | 0.5.2 | 0.3.2 | 0.7.2 | 0.7.3 | 2020-06-19 |
| 0.19.4 | 0.14.2 | 0.5.2 | 0.3.0 | 0.7.2 | 0.7.2 | 2020-06-16 |
| 0.19.3 | 0.14.1 | 0.5.2 | 0.3.0 | 0.7.2 | 0.7.1 | 02-06-2020 |
| 0.19.2 | 0.14.1 | 0.5.1 | 0.3.0 | 0.7.1 | 0.7.1 | 2020-05-14 |
| 0.19.1 | 0.14.1 | 0.5.1 | 0.3.0 | 0.7.0 | 0.7.0 | 2020-05-01 |
| 0.19.0 | 0.14.0 | 0.5.1 | 0.3.0 | 0.7.0 | 0.7.0 | 2020-04-30 |
| 0.18.3 | 0.13.0 | 0.5.1 | 0.3.0 | 0.6.1 | 0.6.6 | 2020-04-24 |
| 0.18.2 | 0.13.0 | 0.5.0 | 0.3.0 | 0.6.1 | 0.6.6 | 2020-04-23 |
| 0.18.1 | 0.13.0 | 0.5.0 | 0.3.0 | 0.6.0 | 0.6.6 | 20-04-2020 |
| 0.18.0 | 0.13.0 | 0.5.0 | 0.3.0 | 0.6.0 | 0.6.5 | 09-04-2020 |
| 0.17.0 | 0.12.0 | 0.4.1 | 0.2.0 | 0.6.0 | 0.6.5 | 2020-04-01 |
| 0.16.2 | 0.12.0 | 0.4.1 | 0.2.0 | 0.5.0 | 0.6.5 | 20-03-2020 |
| 0.16.1 | 0.12.0 | 0.4.1 | 0.2.0 | 0.5.0 | 0.6.4 | 2020-03-05 |
| 0.16.0 | 0.12.0 | 0.4.0 | 0.2.0 | 0.5.0 | 0.6.4 | 2020-02-27 |
| 0.15.0 | 0.12.0 | 0.4.0 | 0.2.0 | 0.4.6 | 0.6.4 | 6-2-2020 |
| 0.14.1 | 0.11.1 | 0.3.4 | 0.2.0 | 0.4.5 | 0.6.2 | 2020-01-07 |
| 0.14.0 | 0.11.0 | 0.3.4 | 0.2.0 | 0.4.4 | 0.6.1 | 10-12-2019 |
| 0.13.0 | 0.10.0 | 0.3.2 | 0.2.0 | 0.3.3 | 0.6.1 | 2019-10-17 |
| 0.12.2 | 0.9.1 | 0.3.0 | 0.2.0 | 0.3.3 | 0.6.0 | 2019-10-11 |
| 0.12.1 | 0.9.0 | 0.3.0 | 0.2.0 | 0.3.3 | 0.6.0 | 2019-09-30 |
| 0.12.0 | 0.9.0 | 0.3.0 | 0.2.0 | 0.3.2 | 0.6.0 | 22-05-2019 |
| 0.11.2 | 0.8.2 | 0.2.3 | 0.1.1 | 0.3.2 | 0.5.5 | 20-08-2019 |
| 0.11.1 | 0.8.2 | 0.2.3 | 0.1.1 | 0.3.1 | 0.5.3 | 2019-07-24 |
| 0.11.0 | 0.8.2 | 0.2.3 | 0.1.1 | 0.3.0 | 0.5.2 | 2019-07-15 |
| 0.10.5 | 0.8.2 | 0.2.1 | 0.1.1 | 0.2.2 | 0.5.2 | 2019-06-27 |
| 0.10.4 | 0.8.2 | 0.2.1 | 0.1.1 | 0.2.2 | 0.5.1 | 2019-06-17 |
| 0.10.3 | 0.8.1 | 0.2.1 | 0.1.1 | 0.2.2 | 0.5.1 | 2019-05-29 |
| 0.10.2 | 0.8.0 | 0.2.1 | 0.1.1 | 0.2.2 | 0.5.1 | 2019-05-24 |
| 0.10.1 | 0.8.0 | 0.2.0 | 0.1.1 | 0.2.2 | 0.5.0 | 2019-05-07 |
| 0.10.0 | 0.8.0 | 0.2.0 | 0.1.1 | 0.2.1 | 0.5.0 | 2019-05-06 |
| 0.9.0 | 0.8.0 | 0.2.0 | 0.1.1 | 0.1.1 | 0.5.0 | 2019-05-02 |
| 0.8.1 | 0.7.2 | 0.1.1 | 0.1.0 | 2019-05-01 | ||
| 0.8.0 | 0.7.1 | 0.1.1 | 0.1.0 | 2019-03-05 | ||
| 0.7.3 | >=0.7,<0.8 | >=0.1,<0.2 | 19-02-2019 | |||
| 0.7.2 | >=0.7,<0.8 | >=0.1,<0.2 | 2019-01-22 | |||
| 0.7.1 | >=0.7,<0.8 | >=0.1,<0.2 | 17-01-2019 | |||
| 0.7.0 | >=0.7,<0.8 | >=0.1,<0.2 | 2018-12-14 |
Para las versiones de los metapaquetes 0.7.0, 0.7.1 y 0.7.2 aún no se ha formalizado la estrategia de versionado de los metapaquetes.
0.44.1
Terra 0.25.1
Preludio
Qiskit Terra 0.25.1 es una versión de corrección de errores, que aborda algunos problemas identificados desde la versión 0.25.1.
Corrección de errores
-
Se ha corregido un error en la serialización QPY (
qiskit.qpy) por el que múltiples compuertas personalizadas controladas en un circuito podían dar lugar a un archivo QPY no válido que no se podía analizar. Corregido #9746. -
Arreglado #9363. etiquetando la síntesis sin registro en el orden que devuelve Tweedledum. Por ejemplo, compare este ejemplo antes y después del arreglo:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.classicalfunction import BooleanExpression boolean_exp = BooleanExpression.from_dimacs_file("simple_v3_c2.cnf") circuit = QuantumCircuit(boolean_exp.num_qubits) circuit.append(boolean_exp, range(boolean_exp.num_qubits)) circuit.draw("text") from qiskit.circuit.classicalfunction import classical_function from qiskit.circuit.classicalfunction.types import Int1 @classical_function def grover_oracle(a: Int1, b: Int1, c: Int1) -> Int1: return (a and b and not c) quantum_circuit = grover_oracle.synth(registerless=False) print(quantum_circuit.draw())Que imprimiría
Before After c: ──■── a: ──■── │ │ b: ──■── b: ──■── │ │ a: ──o── c: ──o── ┌─┴─┐ ┌─┴─┐ return: ┤ X ├ return: ┤ X ├ └───┘ └───┘ -
Se ha corregido
plot_state_paulivec(), que anteriormente amortiguaba los coeficientes de estado en un factor de , donde es el número de qubits. Ahora el gráfico de barras muestra correctamente los coeficientes como , donde es el estado a representar y itera sobre todos los posibles productos tensoriales de Paulis de un solo qubit. -
Los ángulos en el exportador OpenQASM 2 (
QuantumCircuit.qasm()) ahora siempre incluirán un punto decimal, por ejemplo en el caso de1.e-5. Así lo exige una interpretación estricta de la especificación floating-point-literal en OpenQASM 2. El analizador sintáctico OpenQASM 2 de Qiskit (qasm2.load()yloads()) es más permisivo por defecto, y permitirá1e-5sin el punto decimal a menos que esté en modostrict. -
El definidor de
SparsePauliOp.paulisahora rechazará correctamente los intentos de establecer el atributo con datos de forma incorrecta, en lugar de permitir silenciosamente que se cree un objeto no válido. Ver #10384. -
Se ha corregido una regresión de rendimiento en la función
SabreLayoutySabreSwapdel transpilador. Corregido #10650
0.44.0
Esta versión marca oficialmente el fin del soporte para el paquete Qiskit IBMQ Provider y la eliminación de Qiskit Aer del metapaquete Qiskit. Después de esta versión, el metapaquete sólo contiene Qiskit Terra, por lo que esta es la última versión en la que nos referiremos al metapaquete Qiskit y a Qiskit Terra como cosas separadas. A partir de la próxima versión Qiskit 0.45.0 el paquete Qiskit será simplemente lo que antes era Qiskit Terra y ya no habrá separación entre ellos.
Si todavía utilizas el paquete qiskit-ibmq-provider , ya no está disponible. Deberá seguir los enlaces a las guías de migración en el LÉEME del paquete sobre cómo cambiar a los nuevos paquetes de sustitución qiskit-ibm-provider, qiskit-ibm-runtime, y qiskit-ibm-experiment:
https://github.com/Qiskit/qiskit-ibmq-provider#migration-guides
El proyecto Qiskit Aer sigue activo y se mantiene en el futuro, sólo que ya no se incluye como parte del paquete qiskit . Para seguir utilizando qiskit-aer deberá instalar explícitamente qiskit-aer e importar el paquete de qiskit_aer.
Como esta es la última versión del metapaquete Qiskit los siguientes extras setuptools utilizados para instalar dependencias opcionales ya no funcionarán en la próxima versión Qiskit 0.45.0:
naturemachine-learningfinanceoptimizationexperiments
Si estás usando los extras para instalar algún paquete deberías migrar a usar los paquetes directamente en lugar de los extras. Por ejemplo, si antes utilizaba pip install qiskit[experiments] , deberá cambiar a pip install qiskit qiskit-experiments para instalar ambos paquetes. Del mismo modo, el extra all (lo que se instala a través de pip install "qiskit[all]") ya no incluirá estos paquetes en Qiskit 0.45.0.
Terra 0.25.0
Preludio
Los aspectos más destacados del lanzamiento de Qiskit Terra 0.25.0 son:
-
Las operaciones de flujo de control ahora se admiten a través del transpilador en todos los niveles de optimización, incluidos los niveles 2 y 3 (por ejemplo, llamar a
transpile()ogenerate_preset_pass_manager()con el argumentooptimization_levelespecificado como 2 o 3). -
Los campos
IfElseOp.condition,WhileLoopOp.conditionySwitchCaseOp.targetpueden ser ahora instancias del nuevo tipo de expresión clásica en tiempo de ejecuciónexpr.Expr. Es distinto deParameterExpressionporque se evalúa en tiempo de ejecución para los backends que admiten dichas operaciones.Estas nuevas expresiones tienen mucha más potencia que la antigua forma de dos tuplas para suministrar las condiciones clásicas. Por ejemplo, ahora se pueden representar restricciones de igualdad entre dos registros clásicos diferentes, o la "o" lógica de dos bits clásicos. Estos dos ejemplos quedarían así:
from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister from qiskit.circuit.classical import expr qr = QuantumRegister(4) cr1 = ClassicalRegister(2) cr2 = ClassicalRegister(2) qc = QuantumCircuit(qr, cr1, cr2) qc.h(0) qc.cx(0, 1) qc.h(2) qc.cx(2, 3) qc.measure([0, 1, 2, 3], [0, 1, 2, 3]) # If the two registers are equal to each other. with qc.if_test(expr.equal(cr1, cr2)): qc.x(0) # While either of two bits are set. with qc.while_loop(expr.logic_or(cr1[0], cr1[1])): qc.reset(0) qc.reset(1) qc.measure([0, 1], cr1)Para más ejemplos, consulte la documentación de
qiskit.circuit.classical.Esta característica es nueva tanto para Qiskit como para el hardware cuántico disponible con el que funciona Qiskit. Como las funciones aún están en fase de desarrollo, es probable que haya casos extremos inesperados que necesiten tiempo para resolverse. Si tienes algún problema relacionado con la compatibilidad o el uso de la expresión clásica, ponte en contacto con Qiskit o con tu proveedor de hardware.
En esta versión inicial, Qiskit ha añadido las operaciones:
bit_not()logic_not()bit_and()bit_or()bit_xor()logic_and()logic_or()equal()not_equal()less()less_equal()greater()greater_equal()
Pueden actuar sobre Python literales enteros y booleanos, o sobre
ClassicalRegisteryClbitinstancias.Todas estas expresiones clásicas son totalmente compatibles con la pila del transpilador Qiskit, con la serialización QPY (
qiskit.qpy) y para la exportación a OpenQASM 3 (qiskit.qasm3). La importación desde OpenQASM 3 se gestiona actualmente mediante un paquete independiente (que se vuelve a exponer a través deqiskit.qasm3), que esperamos se amplíe para adaptarse a las nuevas características de Qiskit. -
El módulo
qiskit.algorithmsha quedado obsoleto y se eliminará en una próxima versión. Ha sido sustituida por una nueva biblioteca independienteqiskit-algorithmsque puede encontrarse en PyPi o en Github aquí:https://github.com/qiskit-community/qiskit-algorithms
El módulo
qiskit.algorithmsseguirá funcionando como hasta ahora y se corregirán errores hasta su futura eliminación, pero el desarrollo activo de nuevas funciones se ha trasladado al nuevo paquete. Si depende deqiskit.algorithmsdebe actualizar sus requisitos de Python para incluir tambiénqiskit-algorithmsy actualizar las importaciones deqiskit.algorithmsaqiskit_algorithms. Tenga en cuenta que este nuevo paquete no incluye el código de algoritmos ya obsoletos, incluidos los algoritmos basados enopflowyQuantumInstance. Si aún no ha migrado de algoritmos basados enQuantumInstancea algoritmos basados en primitivas, debe seguir las directrices de migración de https://qisk.it/algo _migration. La decisión de migrar el móduloalgorithmsa un paquete independiente para aclarar el propósito de Qiskit y distinguir entre las herramientas y las bibliotecas creadas sobre él.
Qiskit Terra 0.25 ha abandonado el soporte para Python 3.7 siguiendo las advertencias de depreciación iniciadas en Qiskit Terra 0.23. Esto es coherente con Python 3.7’s final de su vida útil el 27 de junio de 2023. Para seguir utilizando Qiskit, debes actualizarte a una versión más reciente de Python.
Nuevas funciones
- En esta versión se han añadido las siguientes funciones.
Características del transpilador
-
Se han añadido dos nuevas opciones a
BlockCollector.La primera opción nueva
split_layerspermite dividir los bloques recogidos en subbloques sobre subconjuntos de qubits disjuntos, es decir, en subbloques depth-1.La segunda opción nueva
collect_from_backpermite recoger bloques con avidez a partir de las salidas del circuito. Esto es importante en combinación con los pases de programación ALAP, en los que es posible que prefiramos colocar puertas en los bloques más tardíos en lugar de en los más tempranos. -
Se han añadido las nuevas opciones
split_layersycollect_from_backaCollectLinearFunctionsyCollectCliffordspases del transpilador.Cuando
split_layerses True, los bloques recogidos se dividen en subbloques sobre subconjuntos de qubits disjuntos, es decir, en subbloques depth-1. Consulte el ejemplo siguiente:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import CollectLinearFunctions circuit = QuantumCircuit(5) circuit.cx(0, 2) circuit.cx(1, 4) circuit.cx(2, 0) circuit.cx(0, 3) circuit.swap(3, 2) circuit.swap(4, 1) # Collect all linear gates, without splitting into layers qct = CollectLinearFunctions(split_blocks=False, min_block_size=1, split_layers=False)(circuit) assert qct.count_ops()["linear_function"] == 1 # Collect all linear gates, with splitting into layers qct = CollectLinearFunctions(split_blocks=False, min_block_size=1, split_layers=True)(circuit) assert qct.count_ops()["linear_function"] == 4El circuito original es lineal. Al reunir puertas lineales sin dividir en capas, deberíamos acabar con una única función lineal. Sin embargo, al reunir las puertas lineales y dividirlas en capas, deberíamos acabar con 4 funciones lineales.
Cuando
collect_from_backes True, los bloques se recogen ávidamente desde las salidas hacia las entradas del circuito. Consulte el ejemplo siguiente:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import CollectLinearFunctions circuit = QuantumCircuit(3) circuit.cx(1, 2) circuit.cx(1, 0) circuit.h(2) circuit.swap(1, 2) # This combines the CX(1, 2) and CX(1, 0) gates into a single linear function qct = CollectLinearFunctions(collect_from_back=False)(circuit) # This combines the CX(1, 0) and SWAP(1, 2) gates into a single linear function qct = CollectLinearFunctions(collect_from_back=True)(circuit)El circuito original contiene una puerta Hadamard, de modo que la puerta CX(1, 0) puede combinarse con CX(1, 2) o con SWAP(1, 2), pero no con ambas. Cuando
collect_from_backes Falso, los bloques lineales se recogen ávidamente desde el principio del circuito, y así CX(1, 0) se combina con CX(1, 2). Cuandocollect_from_backes True, los bloques lineales se recogen ávidamente desde el final del circuito, y así CX(1, 0) se combina con SWAP(1, 2). -
Añadido
DAGCircuit.classical_predecessors()yDAGCircuit.classical_successors()una alternativa a la selección de hilos clásica que no requiere acceder directamente al grafo interno de un nodo DAG. El siguiente ejemplo ilustra la nueva funcionalidad:from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit.converters import circuit_to_dag from qiskit.circuit.library import RZGate q = QuantumRegister(3, 'q') c = ClassicalRegister(3, 'c') circ = QuantumCircuit(q, c) circ.h(q[0]) circ.cx(q[0], q[1]) circ.measure(q[0], c[0]) circ.rz(0.5, q[1]).c_if(c, 2) circ.measure(q[1], c[0]) dag = circuit_to_dag(circ) rz_node = dag.op_nodes(RZGate)[0] # Contains the "measure" on clbit 0, and the "wire start" nodes for clbits 1 and 2. classical_predecessors = list(dag.classical_predecessors(rz_node)) # Contains the "measure" on clbit 0, and the "wire end" nodes for clbits 1 and 2. classical_successors = list(dag.classical_successors(rz_node)) -
Soporte habilitado para
ControlFlowOpoperaciones en elCommutativeCancellationpaso. Anteriormente, los bloques de las operaciones de flujo de control se omitían en este paso. -
Soporte habilitado para
ControlFlowOpoperaciones en elConsolidateBlockspaso. -
Añadimos
DAGCircuit.quantum_causal_cone()para obtener el cono causal de un qubit en unDAGCircuit. El siguiente ejemplo muestra su uso correcto:from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit.circuit.library import CXGate, CZGate from qiskit.dagcircuit import DAGCircuit # Build a DAGCircuit dag = DAGCircuit() qreg = QuantumRegister(5) creg = ClassicalRegister(5) dag.add_qreg(qreg) dag.add_creg(creg) dag.apply_operation_back(CXGate(), qreg[[1, 2]], []) dag.apply_operation_back(CXGate(), qreg[[0, 3]], []) dag.apply_operation_back(CZGate(), qreg[[1, 4]], []) dag.apply_operation_back(CZGate(), qreg[[2, 4]], []) dag.apply_operation_back(CXGate(), qreg[[3, 4]], []) # Get the causal cone of qubit at index 0 result = dag.quantum_causal_cone(qreg[0]) -
Se ha añadido un nuevo método
find_bit()a la claseDAGCircuitque devuelve las posiciones de los bits de la claseQubitoClbitcomo una tupla del índice posicional del bit dentro del circuito y una lista de tuplas que localizan el bit en los registros del circuito. -
El transpilador incorporado
EquivalenceLibrary(qiskit.circuit.equivalence_library.SessionEquivalenceLibrary) se le han enseñado las relaciones circulares de Pauli , y . Esto debería hacer más fiable la transpilación a conjuntos de bases restringidos y potencialmente incompletos. Ver #10293 para más detalles. -
Las operaciones de flujo de control ahora se admiten a través del transpilador en todos los niveles de optimización, incluidos los niveles 2 y 3 (por ejemplo, llamar a
transpile()ogenerate_preset_pass_manager()con el argumentooptimization_level=3). -
DAGCircuit.substitute_node()ganó un argumento de palabra clavepropagate_conditionque es análogo al mismo argumento ensubstitute_node_with_dag(). Si se establece enFalse, se anula el comportamiento heredado de copiar una condición denodeen el nuevoopque lo sustituye.Esta opción se ignora para las operaciones generales de flujo de control, que nunca propagarán su condición, ni aceptarán una condición de otro nodo.
-
Se ha introducido un nuevo método
DAGCircuit.separable_circuits()que devuelve una lista de objetosDAGCircuituno por cada conjunto de qubits conectados que no tengan puertas que los conecten a otro conjunto.Cada instancia de
DAGCircuitdevuelto por este método contendrá el mismo número de clbits queself. Este método no devolveráDAGCircuitinstancias formadas únicamente por clbits. -
Se ha añadido el atributo
Target.concurrent_measurementsque representa una restricción de hardware de qubits medidos simultáneamente. Esta restricción se proporciona en forma de lista anidada, en la que cada elemento representa un grupo de qubits que deben medirse juntos. En un ejemplo[[0, 1], [2, 3, 4]]los qubits 0 y 1, y 2, 3 y 4 se miden juntos en el dispositivo. Esta restricción no bloquea la medición de un qubit individual, pero puede que tengas que considerar la alineación de las operaciones de medición para estos qubits cuando trabajes con el programador Qiskit Pulse y cuando crees nuevos pases del transpilador que tengan en cuenta el tiempo (es decir, pases que realicen la programación).
-
El pase del transpilador
SetLayoutpuede construirse ahora con una lista de enteros que representan los qubits físicos en los que se mapeará el circuito cuántico. Es decir, el primer qubit del circuito se asignará al qubit físico en la posición cero de la lista, y así sucesivamente. -
El transpilador incorporado
EquivalenceLibraryha enseñado más equivalencias de rotación Pauli entre las compuertas de un qubit , y , y entre las compuertas de dos qubits , y . Esto debería hacer más fiables las conversiones de bases sencillas, especialmente los circuitos que utilizan rotaciones . Ver #7332. -
Las operaciones de flujo de control son ahora compatibles con la familia Sabre de pases de transpilador, a saber, el pase de diseño
SabreLayouty el pase de enrutamientoSabreSwap. Funcióntranspile()los argumentos de la palabra clavelayout_methodyrouting_methodaceptan ahora la opción"sabre"para circuitos con flujo de control, que antes no se admitía.
Características de los circuitos
-
Los campos
IfElseOp.condition,WhileLoopOp.conditionySwitchCaseOp.targetpueden ser ahora instancias del nuevo tipo de expresión clásica en tiempo de ejecuciónexpr.Expr. Es distinto deParameterExpressionporque se evalúa en tiempo de ejecución para los backends que admiten dichas operaciones.Estas nuevas expresiones tienen mucha más potencia que la antigua forma de dos tuplas para suministrar las condiciones clásicas. Por ejemplo, ahora se pueden representar restricciones de igualdad entre dos registros clásicos diferentes, o la "o" lógica de dos bits clásicos. Estos dos ejemplos quedarían así:
from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister from qiskit.circuit.classical import expr qr = QuantumRegister(4) cr1 = ClassicalRegister(2) cr2 = ClassicalRegister(2) qc = QuantumCircuit(qr, cr1, cr2) qc.h(0) qc.cx(0, 1) qc.h(2) qc.cx(2, 3) qc.measure([0, 1, 2, 3], [0, 1, 2, 3]) # If the two registers are equal to each other. with qc.if_test(expr.equal(cr1, cr2)): qc.x(0) # While either of two bits are set. with qc.while_loop(expr.logic_or(cr1[0], cr1[1])): qc.reset(0) qc.reset(1) qc.measure([0, 1], cr1)Para más ejemplos, consulte la documentación de
qiskit.circuit.classical.Esta característica es nueva tanto para Qiskit como para el hardware cuántico disponible con el que funciona Qiskit. Como las funciones aún están en fase de desarrollo, es probable que haya casos extremos inesperados que necesiten tiempo para resolverse. Si tienes algún problema relacionado con la compatibilidad o el uso de la expresión clásica, ponte en contacto con Qiskit o con tu proveedor de hardware.
En esta versión inicial, Qiskit ha añadido las operaciones:
bit_not()logic_not()bit_and()bit_or()bit_xor()logic_and()logic_or()equal()not_equal()less()less_equal()greater()greater_equal()
Pueden actuar sobre Python literales enteros y booleanos, o sobre
ClassicalRegisteryClbitinstancias.Todas estas expresiones clásicas son totalmente compatibles con la pila del transpilador Qiskit, con la serialización QPY (
qiskit.qpy) y para la exportación a OpenQASM 3 (qiskit.qasm3). La importación desde OpenQASM 3 se gestiona actualmente mediante un paquete independiente (que se vuelve a exponer a través deqiskit.qasm3), que esperamos se amplíe para adaptarse a las nuevas características de Qiskit. -
Se han añadido herramientas para trabajar con las nuevas representaciones de expresiones en tiempo de ejecución clásicas. Se
ExprVisitorpara que los consumidores de estas expresiones puedan subclasificarlas. Dos utilidades basadas en esta estructuraiter_vars()ystructurally_equivalent()que producen respectivamente un iterador a través de los nodosVary comprueban si dos instanciasExprinstancias son estructuralmente iguales, hasta cierto mapeo de los nodosVarnodos contenidos. -
Se ha añadido la función
lift_legacy_condition()que se puede utilizar para convertir condiciones de estilo antiguo en nodos de estilo nuevoExprnuevos. Tenga en cuenta que estos nodos de expresión no están permitidos en los campos de estilo antiguoInstruction.conditionque van a ser sustituidos por métodos clásicos más avanzados comoIfElseOp. -
Se ha añadido soporte para tomar valores absolutos de
ParameterExpressions. Por ejemplo, ahora es posiblefrom qiskit.circuit import QuantumCircuit, Parameter x = Parameter("x") circuit = QuantumCircuit(1) circuit.rx(abs(x), 0) bound = circuit.bind_parameters({x: -1}) -
El rendimiento de
QuantumCircuit.assign_parameters()ybind_parameters()ha aumentado significativamente para circuitos grandes con estructuras típicas de los usos de las aplicaciones. Esto incluye la mayoría de los circuitos basados en laNLocalestructura, comoEfficientSU2. Ver #10282 para más detalles. -
El método
QuantumCircuit.assign_parameters()ha ganado dos nuevos argumentos clave:flat_inputystrict. Se trata de opciones avanzadas que se pueden utilizar para acelerar el método cuando se pasan las vinculaciones de parámetros como un diccionario;flat_input=Truees una garantía de que las claves del diccionario sólo contienenParameter(noParameterVectors), ystrict=Falsepermite que el diccionario contenga parámetros que no están presentes en el circuito. El uso de estas dos opciones puede reducir la sobrecarga de la normalización de la entrada en esta función. -
Añadido un nuevo argumento de palabra clave
flattenal constructor de las siguientes clases:Si este argumento se establece en
True, la subclaseQuantumCircuitsubclase generada no envolverá la implementación enGateoInstructionobjetos. Aunque esto no es óptimo para la visualización, suele mejorar mucho el rendimiento en tiempo de ejecución, especialmente conQuantumCircuit.bind_parameters()yQuantumCircuit.assign_parameters()que pueden ver una mejora substacial en el tiempo de ejecución con una salida aplanada en comparación con la salida anidada envuelta por defecto. -
Se ha añadido soporte para construir
LinearFunctions a partir de circuitos cuánticos más generales, que pueden contener:- Barreras (de tipo
Barrier) y retardos (Delay), que simplemente se ignoran - Permutaciones (de tipo
PermutationGate) - Otras funciones lineales
- Cliffords (de tipo
Clifford), cuando el Clifford representa una función lineal (y se lanza una excepciónCircuitErroren caso contrario) - Circuitos cuánticos anidados de esta forma
- Barreras (de tipo
-
Añadido el método
LinearFunction.__eq__(). Dos objetos de tipoLinearFunctionse consideran iguales cuando sus representaciones como matrices binarias invertibles son iguales. -
Añadido el método
LinearFunction.extend_with_identity()que permite extender una función lineal sobrekqubits a una función lineal sobren >= kqubits, especificando las nuevas posiciones de los qubits originales y rellenando con identidades los qubits restantes. -
Añadidos dos métodos para pretty-printing
LinearFunctionobjetos:LinearFunction.mat_str(), que devuelve la representación en cadena de la función lineal vista como una matriz con entradas 0/1, yLinearFunction.function_str()que devuelve la representación en cadena de la función lineal vista como una transformación lineal. -
Las instrucciones
StatePreparationyInitialize, y sus métodos de circuito asociadosQuantumCircuit.prepare_state()yinitialize()ganaron un argumento de palabra clavenormalize, que puede establecerse enTruepara normalizar automáticamente un array objetivo. Por defecto esFalse, que mantiene el comportamiento actual de lanzar una excepción cuando se recibe una entrada no normalizada.
Características de los algoritmos
- Se ha añadido la opción de pasar una llamada de retorno al
UMDAoptimizador, que permite realizar un seguimiento del número de evaluaciones de la función, los parámetros actuales y el mejor valor de función alcanzado.
OpenQASM Características
- Los exportadores de OpenQASM 3 (
qasm3.dump(),dumps()yExporter) tienen un nuevo argumentoallow_aliasing, que acabará sustituyendo al argumentoalias_classical_registers. Controla si se permite el aliasing para bits clásicos o qubits, en lugar de que la opción sólo esté disponible para bits clásicos.
Características de la información cuántica
-
Añadida una nueva función
negativity()que calcula la medida de entrelazamiento de negatividad de un estado cuántico. A continuación se ofrece un ejemplo de uso de la función anterior:from qiskit.quantum_info.states.densitymatrix import DensityMatrix from qiskit.quantum_info.states.statevector import Statevector from qiskit.quantum_info import negativity import numpy as np # Constructing a two-qubit bell state vector state = np.array([0, 1/np.sqrt(2), -1/np.sqrt(2), 0]) # Calculating negativity of statevector negv = negativity(Statevector(state), [1]) # Creating the Density Matrix (DM) rho = DensityMatrix.from_label("10+") # Calculating negativity of DM negv2 = negativity(rho, [0, 1]) -
Añadida la función
schmidt_decomposition(). Esta función funciona con las funcionesStatevectoryDensityMatrixpara estados puros bipartitos. -
Añade soporte para la multiplicación de
SparsePauliOpobjetos conParameterobjetos utilizando el operador *, por ejemplo:from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp param = Parameter("a") op = SparsePauliOp("X") param * op
Características de Pulse
-
Se ha ampliado la biblioteca
SymbolicPulsebiblioteca se amplió. Las nuevas funciones de pulso de la biblioteca son:Las nuevas funciones devuelven una instancia de
ScalableSymbolicPulse, y coinciden con la funcionalidad de las funciones correspondientes de la biblioteca de pulsos discretos, con la excepción deSquare()para la que una fase de se desplaza un ciclo completo (a diferencia de la función discretasquare()donde dicho desplazamiento era inducido por una fase de ). -
El método
filter()se activa en laScheduleBlockclase. Este método permite a los usuarios conservar sóloInstructionobjetos que pasen todos los filtros proporcionados. Como condiciones de filtro incorporadas, pulseChannelinstancia de subclase yInstructionse pueden especificar. Los callbacks definidos por el usuario que tomanInstructiona los filtros. -
El método
exclude()se activa en laScheduleBlockclase. Este método permite a los usuarios conservar sóloInstructionobjetos que no pasen al menos uno de todos los filtros proporcionados. Como condiciones de filtro incorporadas, pulseChannelinstancia de subclase yInstructionse pueden especificar. Los callbacks definidos por el usuario que tomanInstructiona los filtros. Este método es el complemento defilter(), por lo que siempre se cumple la siguiente condición:block.filter(*filters) + block.exclude(*filters) == blocken términos de instrucciones incluidas, dondeblockes unaScheduleBlockinstancia. -
Se ha añadido una nueva función
gaussian_square_echo()a la biblioteca de impulsos. El impulso devuelto se compone de tresGaussianSquarepulsos. Los dos primeros son impulsos de eco con una duración de la mitad de la duración total e implementan tonos giratorios. El tercer pulso es un tono de cancelación que dura toda la duración del pulso e implementa la corrección de rotaciones de qubits individuales. -
QPY admite los objetos
DiscriminatoryKernel. Esta función permite a los usuarios serializar y deserializar lasAcquireinstrucciones con estos objetos utilizando QPY.
Características de síntesis
-
Añadida una nueva función de síntesis
synth_cx_cz_depth_line_my()que produce la forma de circuito de un circuito CX seguido de un circuito CZ para conectividad de vecino más cercano lineal (LNN) en profundidad de 2 qubits de como máximo 5n, utilizando CX y puertas de fase (S, Sdg o Z). El algoritmo de síntesis se basa en el trabajo de Maslov y Yang, arXiv:2210.16195.El algoritmo acepta una matriz binaria invertible
mat_xque representa el circuito CX, una matriz binaria simétricamat_zque representa el circuito CZ, y devuelve un circuito cuántico con una profundidad de 2 qubits de como máximo 5n que calcula la composición de los circuitos CX y CZ. El siguiente ejemplo ilustra la nueva funcionalidad:import numpy as np from qiskit.synthesis.linear_phase import synth_cx_cz_depth_line_my mat_x = np.array([[0, 1], [1, 1]]) mat_z = np.array([[0, 1], [1, 0]]) qc = synth_cx_cz_depth_line_my(mat_x, mat_z)Esta función se utiliza ahora por defecto en el algoritmo de síntesis de Clifford
synth_clifford_depth_lnn()que optimiza la profundidad de 2 qubits para la conectividad LNN, mejorando la profundidad de 2 qubits de 9n+4 a 7n+2. El algoritmo de síntesis clifford puede utilizarse del siguiente modo:from qiskit.quantum_info import random_clifford from qiskit.synthesis import synth_clifford_depth_lnn cliff = random_clifford(3) qc = synth_clifford_depth_lnn(cliff)La síntesis anterior puede mejorarse aún más, como se describe en el artículo de Maslov y Yang, utilizando la optimización local entre capas de 2 qubits. Esta mejora se deja para trabajos posteriores.
Funciones de visualización
-
QuantumCircuit.draw()y la funcióncircuit_drawer()cuando se utiliza la opciónoutput='mpl'soportan ahora el dibujo de los bloques de circuitos anidados deControlFlowOpoperaciones, incluyendoif,else,while,for, yswitch/case. Los bloques de circuitos se envuelven con cajas para delimitar los circuitos. -
Se han suavizado algunas restricciones a la hora de utilizar
wire_orderen los cajones de los circuitos. Ahora,wire_orderpuede listar sólo qubits y, en ese caso, se puede utilizar concregbundle=True, ya que no afectará a los bits clásicos.from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(4, "q") cr = ClassicalRegister(4, "c") cr2 = ClassicalRegister(2, "ca") circuit = QuantumCircuit(qr, cr, cr2) circuit.h(0) circuit.h(3) circuit.x(1) circuit.x(3).c_if(cr, 10) circuit.draw('text', wire_order=[2, 3, 0, 1], cregbundle=True)q_2: ──────────── ┌───┐ ┌───┐ q_3: ┤ H ├─┤ X ├─ ├───┤ └─╥─┘ q_0: ┤ H ├───╫─── ├───┤ ║ q_1: ┤ X ├───╫─── └───┘┌──╨──┐ c: 4/═════╡ 0xa ╞ └─────┘ ca: 2/════════════
Herramientas Opciones
-
Un nuevo comprobador de importaciones perezosas,
HAS_PYGMENTSpara comprobar la presencia de la biblioteca de resaltado sintáctico Pygments. -
La magia
%qiskit_version_tabledeqiskit.tools.jupyterahora incluye todos los módulos importados conqiskiten su nombre.
Notas de actualización
-
Qiskit Terra 0.25 ha abandonado el soporte para Python 3.7 siguiendo las advertencias de depreciación iniciadas en Qiskit Terra 0.23. Esto es coherente con Python 3.7’s final de su vida útil el 27 de junio de 2023. Para seguir utilizando Qiskit, debes actualizarte a una versión más reciente de Python.
-
Qiskit Terra 0.25 ahora requiere la versison 0.13.0 de
rustworkx. -
Por defecto Qiskit construye sus extensiones compiladas usando la ABI Estable de Python con soporte hasta la versión más antigua de Python soportada por Qiskit (actualmente 3.8 ). Esto significa que, en el futuro, habrá una única rueda precompilada que se entregará en el momento del lanzamiento y que funcionará con todas las versiones de Qiskit compatibles con Python. No se espera ninguna diferencia de rendimiento en tiempo de ejecución utilizando la API limitada, por lo que ahora está activada por defecto para todas las compilaciones. Anteriormente, las extensiones compiladas se construían utilizando la API específica de la versión y sólo funcionaban con una única versión de Python. Este cambio se realizó para reducir el número de archivos de paquetes que tenemos que crear y publicar en cada versión. Al construir Qiskit desde el código fuente, no debería haber cambios necesarios en el proceso de construcción, excepto que las etiquetas por defecto en los nombres de archivo de salida serán diferentes para reflejar el uso de la API limitada.
Notas sobre la actualización del transpilador
-
Se elimina la posibilidad de pasar listas de valores de argumentos a la función
transpile()se ha eliminado. Esta funcionalidad quedó obsoleta en la versión 0.23.0. Aún puede pasar una lista de objetosQuantumCircuitcomo primer argumento posicional. Lo que se ha eliminado es la difusión de la lista de los otros argumentos a cada circuito en esa lista de entrada. La eliminación de esta funcionalidad era necesaria para reducir en gran medida la sobrecarga de la ejecución paralela para transpilar varios circuitos a la vez. Si está utilizando esta funcionalidad actualmente, puede llamar atranspile()varias veces. Por ejemplo, si antes hacías algo como:from qiskit.transpiler import CouplingMap from qiskit import QuantumCircuit from qiskit import transpile qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)] results = transpile([qc] * 6, coupling_map=cmaps)en su lugar, ahora debería ejecutar algo como
from qiskit.transpiler import CouplingMap from qiskit import QuantumCircuit from qiskit import transpile qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)] results = [transpile(qc, coupling_map=cm) for cm in cmap]También puede aprovechar
parallel_map()omultiprocessingde la biblioteca estándar Python si desea ejecutar esto en paralelo. -
La familia Sabre de pases transpilares (a saber
SabreLayoutySabreSwap) se utilizan ahora por defecto para todos los circuitos cuando se invoca al transpilador en el nivel de optimización 1 (por ejemplo, llamando atranspile()ogenerate_preset_pass_manager()con el argumentooptimization_level=1). Anteriormente, los circuitos con operaciones de flujo de control utilizabanDenseLayoutyStochasticSwapcon este perfil.
Notas sobre la actualización de circuitos
-
Los métodos del constructor OpenQASM 2 en
QuantumCircuit(from_qasm_str()yfrom_qasm_file()) se han cambiado para utilizar el analizador sintáctico basado en Rust añadido en Qiskit Terra 0.24. Esto debería acelerar considerablemente los tiempos de análisis (10 veces o más no es raro) y reducir masivamente el uso de memoria intermedia.Los métodos de
QuantumCircuitse mantienen con la misma interfaz por continuidad; la forma preferida de acceder al importador de OpenQASM 2 es utilizarqasm2.load()yqasm2.loads()que ofrecen una interfaz ampliada para controlar el análisis sintáctico y la construcción. -
Se ha eliminado el argumento obsoleto
circuit_cregsdel constructor de la claseInstructionSetha sido eliminado. Se eliminó en la versión 0.19.0. Si utiliza este argumento y construye manualmente un objetoInstructionSet(lo que debería ser bastante infrecuente, ya que se utiliza sobre todo internamente), debería pasar un callable al argumento de la palabra claveresource_requesteren su lugar. Por ejemplo:from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet from qiskit.circuit.exceptions import CircuitError def my_requester(bits, registers): bits_set = set(bits) bits_flat = tuple(bits) registers_set = set(registers) def requester(specifier): if isinstance(specifer, Clbit) and specifier in bits_set: return specifier if isinstance(specifer, ClassicalRegster) and specifier in register_set: return specifier if isinstance(specifier, int) and 0 <= specifier < len(bits_flat): return bits_flat[specifier] raise CircuitError(f"Unknown resource: {specifier}") return requester my_bits = [Clbit() for _ in [None]*5] my_registers = [ClassicalRegister(n) for n in range(3)] InstructionSet(resource_requester=my_requester(my_bits, my_registers))
OpenQASM Notas sobre la actualización
-
Los métodos del constructor OpenQASM 2 en
QuantumCircuit(from_qasm_str()yfrom_qasm_file()) se han cambiado para utilizar el analizador sintáctico basado en Rust añadido en Qiskit Terra 0.24. Esto debería acelerar considerablemente los tiempos de análisis (10 veces o más no es raro) y reducir masivamente el uso de memoria intermedia.Los métodos de
QuantumCircuitse mantienen con la misma interfaz por continuidad; la forma preferida de acceder al importador de OpenQASM 2 es utilizarqasm2.load()yqasm2.loads()que ofrecen una interfaz ampliada para controlar el análisis sintáctico y la construcción. -
Los exportadores de OpenQASM 3 (
qasm3.dump(),dumps()yExporter) utilizarán ahora menos definiciones de "alias de registro" en su salida. El circuito descrito no cambiará, pero ahora exportará preferentemente en términos de tipos directosbit,qubityqubit[n]en lugar de producir un registro_loose_bitsy aliasear más registros a partir de éste. Esto se hace para minimizar el número de funciones avanzadas de OpenQASM 3 en uso y para evitar introducir una estructura de matrices innecesaria en programas que no la necesitan.
Notas sobre la actualización de la información cuántica
Clifford.from_circuit()ya no intentará resolver instrucciones cuyosdefinitionsean mutuamente recursivas con algún otro objeto. Tales definiciones recursivas ya suponen una violación del orden estrictamente jerárquico que requiere el campodefinitiony el código no debería confiar en que esto sea posible. Si desea definir equivalencias que puedan tener ciclos (mutuos), utilice un parámetroEquivalenceLibrary.
Notas sobre la actualización de la visualización
-
En el objeto interno
~qiskit.visualization.circuit.matplotlib.MatplotlibDrawerse han eliminado los argumentoslayout,global_phase,qregsycregs. Originalmente estaban obsoletos en Qiskit Terra 0.20. Estos objetos se infieren simplemente a partir de la direccióncircuit.Se trata de una clase trabajadora interna de las rutinas de visualización. Es poco probable que tenga que cambiar nada de su código.
Herramientas Notas de actualización
- Se ha eliminado la ubicación de importación
qiskit.util, ya que había quedado obsoleta desde Qiskit Terra 0.17. Los usuarios deben utilizar la nueva ubicación de importación,qiskit.utils.
Notas sobre características en desuso
-
Las extensiones de los espacios de nombres
qiskityqiskit.providerspor parte de paquetes externos han quedado obsoletas y los puntos de enganche que las permitían se eliminarán en una futura versión. En el pasado, el proyecto Qiskit se componía de elementos que ampliaban un espacio de nombres compartido y estos puntos de enganche permitían hacerlo. Sin embargo, no se pretendía que estas interfaces fueran utilizadas nunca por otros paquetes. Ahora que el paquete general Qiskit ya no utiliza ese modelo de empaquetado, dejar la posibilidad de estas extensiones conlleva más riesgos que beneficios y, por lo tanto, se está obviando para su futura eliminación. Si mantienes un paquete que amplía el espacio de nombres de Qiskit (es decir, tus usuarios importan deqiskit.xoqiskit.providers.y) deberías pasar a utilizar un espacio de nombres independiente Python para tu paquete. No se generará ninguna advertencia como parte de esto porque no hay ningún método para inyectar una advertencia a nivel de paquete que sería necesaria para advertir a los paquetes externos de este cambio. -
El diccionario
qiskit.__qiskit_version__está obsoleto, ya que Qiskit se define con un único paquete (qiskit-terra). En el futuro,qiskit.__version__será el único punto para consultar la versión de Qiskit, como una cadena estándar.
Deprecaciones del transpilador
- La función
get_vf2_call_limitdisponible a través del móduloqiskit.transpiler.preset_passmanagers.commonha quedado obsoleta. Es probable que esto afecte a muy pocos usuarios, ya que esta función no se exportó explícitamente ni se documentó. Su funcionalidad ha sido sustituida y ampliada por una función del mismo módulo.
Circuitos obsoletos
- El método
qasm()y todos los métodos anulados de las subclases de :class:~qiskit.circuit.Instruction están obsoletos. No existe un sustituto para generar una cadena OpenQASM2 para una instrucción aislada, ya que normalmente un objeto de instrucción aislado tiene un contexto insuficiente para generar completamente una cadena OpenQASM2 válida. Si actualmente confía en este método, tendrá que recurrir al exportador OpenQASM2 :QuantumCircuit.qasm()para generar el OpenQASM2 para un objeto de circuito entero.
Desuso de algoritmos
-
El módulo
qiskit.algorithmsha quedado obsoleto y se eliminará en una próxima versión. Ha sido sustituida por una nueva biblioteca independienteqiskit-algorithmsque puede encontrarse en PyPi o en Github aquí:https://github.com/qiskit-community/qiskit-algorithms
El módulo
qiskit.algorithmsseguirá funcionando como hasta ahora y se corregirán errores hasta su futura eliminación, pero el desarrollo activo de nuevas funciones se ha trasladado al nuevo paquete. Si depende deqiskit.algorithmsdebe actualizar sus requisitos de Python para incluir tambiénqiskit-algorithmsy actualizar las importaciones deqiskit.algorithmsaqiskit_algorithms. Tenga en cuenta que este nuevo paquete no incluye el código de algoritmos ya obsoletos, incluidos los algoritmos basados enopflowyQuantumInstance. Si aún no ha migrado de algoritmos basados enQuantumInstancea algoritmos basados en primitivas, debe seguir las directrices de migración de https://qisk.it/algo _migration. La decisión de migrar el móduloalgorithmsa un paquete independiente para aclarar el propósito de Qiskit y distinguir entre las herramientas y las bibliotecas creadas sobre él.
Deprecaciones de Pulse
-
Inicialización de un
ScalableSymbolicPulsecon valor complejo paraamp. Este cambio también afecta a los siguientes pulsos de biblioteca:La inicialización de
ampcon un valor complejo también ha quedado obsoleta.En su lugar, utilice dos valores flotantes al especificar los parámetros
ampyangle, dondeamprepresenta la magnitud de la amplitud compleja y angle representa el ángulo de la amplitud compleja. es decir, la amplitud compleja viene dada por . -
La instrucción
Callha quedado obsoleta y se eliminará en futuras versiones. En su lugar, utilice la funcióncall()del móduloqiskit.pulse.builderdentro de un contexto de construcción activo.
Herramientas Características en desuso
-
La magia Jupyter
%circuit_library_infoy los objetos enqiskit.tools.jupyter.libraryque llama a su vez:circuit_data_tableproperties_widgetqasm_widgetcircuit_digram_widgetcircuit_library_widget
están obsoletos y se eliminarán en una futura versión. Estos objetos sólo estaban destinados a utilizarse en la compilación de la documentación. Ya no se utilizan allí, por lo que ya no reciben apoyo ni mantenimiento.
Problemas conocidos
- Los circuitos que contienen expresiones clásicas realizadas con el módulo
exprtodavía no son compatibles con los visualizadores de circuitos.
Corrección de errores
-
Se ha corregido un error en
Channelpor el que la validación del índice se realizaba de forma incorrecta y sólo generaba un error cuando el índice era tanto no entero como negativo, en lugar de cualquiera de los dos. -
Se ha solucionado un problema con la función
transpile()y todos los gestores de pases predefinidos generados mediantegenerate_preset_pass_manager()donde la salidaQuantumCircuitdel objetolayoutdel objeto de salida tenía un atributoTranspileLayout.final_layoutno válido. Esto ocurriría en escenarios en los que elVF2PostLayoutse ejecutaría y encontraría un diseño inicial alternativo con menores tasas de error. Al modificar el diseño inicial, el atributofinal_layoutnunca se actualizó para reflejar este cambio. Esto se ha corregido para quefinal_layoutrefleje siempre correctamente la permutación de salida provocada por la etapa de enrutamiento. Corregido #10457 -
El analizador OpenQASM 2 (
qasm2.load()yloads()) ejecutado en modostrictemitirá ahora correctamente un error si una sentenciabarrierno tiene argumentos. Cuando se ejecuta en el modo más permisivo (por defecto), una sentenciabarriersin argumento continuará causando una barrera en todos los qubits actualmente en el ámbito (los qubits a los que afecta una definición de puerta, o todos los qubits definidos por un programa, si la sentencia está en un cuerpo de puerta o en el ámbito global, respectivamente). -
El exportador OpenQASM 2 (
QuantumCircuit.qasm()) ya no intentará emitir sentenciasbarrierque no actúen sobre qubits. Tal declaración de barrera tampoco tiene efecto en Qiskit, pero no es válida OpenQASM 2. -
Qiskit puede representar instrucciones personalizadas que actúan sobre qubits cero, o sobre un número distinto de cero de bits clásicos. No se pueden exportar a OpenQASM 2, pero antes
QuantumCircuit.qasm()lo intentaba, y la salida no era válida OpenQASM 2. En su lugar, ahora se mostrará correctamente unQASM2ExportErrorcorrectamente. Ver #7351 y #10435. -
Se ha corregido un problema con el uso de
Targets sin acoplar mapas con elFullAncillaAllocationtranspiler pass. En este caso,FullAncillaAllocationañadirá ahora qubits ancilla para que el número de qubits en elDAGCircuitcoincida con el deTarget.num_qubits. -
DAGCircuit.substitute_node()ya no sobrescribirá silenciosamente una condición existente en el reemplazo dadoop. Sipropagate_conditionestá configurado comoTrue(el valor predeterminado), en su lugar se mostrará un mensajeDAGCircuitErroren su lugar. -
Un circuito parametrizado que contiene una puerta personalizada cuya definición tiene una fase global parametrizada puede ahora enlazar correctamente el parámetro en la fase global interna. Ver #10283 para más detalles.
-
Construcción de un
Statevectora partir de unQuantumCircuitque contenga operaciones de qubit cero ya no generará un error. Estas operaciones confieren una fase global al vector de estado resultante. -
La interfaz del constructor de flujo de control ahora incluirá correctamente
ClassicalRegisterrecursos de sentencias switch anidadas en sus ámbitos de circuito contenedor. Ver #10398. -
Se ha corregido un problema en
QuantumCircuit.decompose()por el que al pasar un nombre de circuito a la función que coincidía con un nombre de puerta compuesta no se descomponía la puerta si también tenía asignada una etiqueta. Corregido #9136 -
Se ha corregido un problema con
qiskit.visualization.plot_histogram()por el que la leyenda relativa no aparecía cuando el conjunto de datos dado tenía un valor cero en la primera posición. Ver #10158 para más detalles. -
Se ha corregido un fallo con el método
Target.update_from_instruction_schedule_map()desencadenado por elinst_mapdado que contiene unSchedulecon duraciones no asignadas. -
Cuando el parámetro
conditional=Truese especifica enrandom_circuit()las operaciones condicionales en el circuito resultante irán ahora precedidas de una medición completa a mitad de circuito. Correcciones #9016 -
Se han mejorado las anotaciones de tipo en el método
QuantumCircuit.assign_parameters()para reflejar el cambio en el tipo de retorno en función del argumentoinplace. -
Los métodos de construcción de circuitos OpenQASM 2 (
QuantumCircuit.from_qasm_str()yfrom_qasm_file()) ya no darán error al encontrar una definicióngateque contenga instruccionesUoCX. Ver #5536. -
Reducción de la sobrecarga del
ConsolidateBlocksrealizando operaciones matriciales en todos los bloques de dos qubits en lugar de crear una instancia deQuantumCircuity pasarlo a un bloqueOperator. El aumento de velocidad sólo será aplicable cuando se consoliden bloques de dos qubits. Todo lo que supere este valor seguirá siendo gestionado por la claseOperatorclase. Consulta el nº 8779 para más detalles. -
El exportador OpenQASM 3 (
qiskit.qasm3) ya no mostrará OpenQASM 3 inválido para instancias no unitariasInstructionsino que mostrará un mensajeQASM3ExporterErrorexplicando que aún no están soportadas. Esta función está prevista para una versión posterior de Qiskit, cuando haya más funciones de procesamiento clásico en toda la biblioteca. -
Soluciona el problema nº 10185.
-
Solucionado un problema con la función
state_to_latex(). Anteriormente, producía LaTeX no válidos con un redondeo involuntario de los coeficientes, lo que provocaba errores al llamar astate_drawer(). Corregido #9297.