Notas de la versión de Qiskit 0.43
0.43.3
Terra 0.24.2
Preludio
Qiskit Terra 0.24.2 es una versión de corrección de errores, que aborda algunos problemas menores identificados desde la versión 0.24.1.
Notas de actualización
- La versión del formato QPY emitida por
dumpha aumentado a 8. Esta nueva versión del formato añade soporte para serializar el atributoQuantumCircuit.layoutatributo.
Corrección de errores
-
Corregida la deserialización de
DiagonalGateinstancias a través de QPY. Corregido #10364 -
Se ha corregido un problema con la función
qs_decomposition(), que realiza la descomposición cuántica de Shannon, cuando se llamaba a unitarios numéricos triviales que no se benefician de esta descomposición, se producía un error inesperado. Este error se ha corregido para que se detecten tales unitarios y se devuelva el circuito equivalente. Corregido #10036 -
Se ha solucionado un problema en la clase
BasicSwapque impedía que el métodoBasicSwap.run()funcionara si el argumento de la palabra clavefake_runse establecía enTrueal instanciar la clase. Corregido #10147 -
Se ha corregido un problema al copiar circuitos con el nuevo estilo
Clbits yQubits (bits sin registros) donde las referencias a estos bits desde el circuito contenedor podían romperse, causando problemas con la serialización y la visualización del circuito. Corregido #10409 -
El transpilador
CheckMapya no se producirá un error espurio al tratar con estructuras condicionales anidadas creadas por la interfaz del constructor de flujo de control. Ver #10394. -
Corregido un fallo del Pulse Builder cuando el contexto se inicializa con
BackendV2. -
Fijada la salida de pulso
measure()ymeasure_all()cuando las funciones se llaman con elBackendV2backend. -
Se han fijado las dimensiones de la matriz de densidad de salida de
DensityMatrix.partial_transpose()para que coincidan con las dimensiones de la matriz de densidad de entrada correspondiente. -
La importación de
qiskit.primitivesya no provocará advertencias de obsoleto derivadas del módulo obsoletoqiskit.opflowobsoleto. Estas advertencias habrían quedado ocultas para los usuarios por los filtros predeterminados de Python, pero activaron la importación ansiosa deopflowlo que significa que una importación posterior por parte de un usuario no activaría las advertencias. Corregido #10245 -
Se ha corregido la salida de OpenQASM 2 de
QuantumCircuit.qasm()cuando un objeto de puerta personalizado contenía una puerta con el mismo nombre. Idealmente esto no debería ocurrir para la mayoría de las puertas, pero las operaciones algorítmicas complejas como la claseGroverOperatorpodrían producir tales estructuras accidentalmente. Ver #10162. -
Se ha corregido una regresión en el cajón LaTeX de
QuantumCircuit.draw()cuando los archivos temporales se colocan en un sistema de archivos distinto del directorio de trabajo. Ver #10211. -
Se ha corregido un problema con
UnitarySynthesisal utilizar el parámetrotarget, por el que los circuitos con flujo de control no se asignaban correctamente al objetivo. -
Corregido error en
VQDdonderesult.optimal_valuesera una copia deresult.optimal_points. Ahora devuelve los valores correspondientes. Corregido #10263 -
Se han mejorado los mensajes de error devueltos cuando fallaba un intento de convertir una expresión totalmente ligada
ParameterExpressionen unfloatointconcreto fallaba, por ejemplo porque la expresión era naturalmente un número complejo. Corregido #9187 -
Fijo
floatconversiones paraParameterExpressionque tenían, en algún momento de su historia de construcción, un componente imaginario que posteriormente había sido anulado. Al utilizar Sympy como backend, estas conversiones normalmente ya habrían funcionado. Cuando se utilizaba Symengine como backend, estas conversiones a menudo fallaban con errores de tipo, a pesar de que el resultado había sido evaluado simbólicamente para ser real, yParameterExpression.is_real()verdadero. Corregido #10191 -
Corregida la
qpyserialización deQuantumCircuit.layoutatributo. Anteriormente, el atributolayoutal serializar un circuito en QPY. Corregido #10112
Aer 0.12.2
Preludio
Qiskit Aer 0.12.2 es el segundo parche de 0.12.0. Esto corrige algunos errores que se han descubierto desde el lanzamiento de 0.12.1.
Notas de actualización
-
Qiskit Aer ahora requiere la versión CUDA para simulador de GPU a 11.2 o superior. Anteriormente, CUDA 10.1 era la versión mínima compatible. Este cambio era necesario debido a los cambios en el ecosistema CUDA, incluido el soporte de cuQuantum. Para ayudar a los usuarios que trabajan con diferentes versiones de CUDA, ahora hay un paquete separado disponible para trabajar con CUDA 11:
qiskit-aer-gpu-cu11y el uso del paqueteqiskit-aer-gpuahora requiere CUDA 12. Si ya es usuario del paqueteqiskit-aer-gpuy desea utilizar CUDA 11 tendrá que ejecutar:pip uninstall qiskit-aer-gpu && pip install -U qiskit-aer-gpu-cu11para pasar de las versiones anteriores del paquete
qiskit-aer-gpucompatible con CUDA 10.x a la actualización al nuevo paquete compatible con CUDA 11. Si ya está ejecutando CUDA 12 localmente, puede actualizar el paqueteqiskit-aer-gpucon normalidad.
Corrección de errores
-
Si un circuito tiene condicionales y parámetros, el circuito no se simulaba correctamente porque los enlaces de parámetros de Aer utilizaban posiciones incorrectas para aplicar los parámetros. Esto se debe a una falta de consideración de las operaciones bfunc inyectadas por condicional. Con esta confirmación, los parámetros se establecen en las posiciones correctas teniendo en cuenta las operaciones bfun inyectadas.
-
Los parámetros de las fases globales no se establecían correctamente en #1814. https://github.com/Qiskit/qiskit-aer/pull/1814 Los valores de los parámetros de las fases globales se copiaban en un circuito de plantilla y no en los circuitos reales que se iban a simular. Esta confirmación copia correctamente los valores de los parámetros a los circuitos que se van a simular.
-
Los resultados de
backend.run()no eran serializables porque incluyenAerCircuits. Esta confirmación hace que los resultados sean serializables eliminandoAerCircuits de los metadatos. -
:meth:
QuantumCircuit.save_statevector()no funciona si el circuito se genera a partir del texto OpenQASM3 porque sus registros cuánticos tienen instancias qubit duplicadas. Con esta confirmación, :meth:QuantumCircuit.save_statevector()utiliza :data:QuantumCircuit.qubitspara obtener los qubits a guardar.
IBM Proveedor Q 0.20.2
No cambia.
0.43.2
Como recordatorio, la inclusión de Qiskit Aer en el paquete qiskit está obsoleta. La próxima versión menor de Qiskit Aer ( 0.13 ) no se incluirá en ninguna versión del paquete qiskit , y deberás comenzar inmediatamente a instalar Aer por separado mediante:
pip install qiskit-aere importarlo como:
import qiskit_aerA partir de Qiskit 0.44, el comando pip install qiskit ya no instalará Qiskit Aer, o el obsoleto IBM Q Provider que ya ha sido reemplazado por el nuevo IBM Provider.
Terra 0.24.1
No cambia
Aer 0.12.1
Preludio
Qiskit Aer 0.12.1 es la primera versión del parche para 0.12.0. Esto corrige algunos errores que se han descubierto desde el lanzamiento de 0.12.0.
Problemas conocidos
- Se ha corregido un error que devolvía valores de expectativa erróneos en
Estimatorcuandoabelian_grouping=True.
Notas de actualización
- Mejora del rendimiento cuando se pasan los mismos circuitos y múltiples parámetros a
Estimatorconapproximation=True.
Notas sobre características en desuso
- Las opciones de meth:~.AerSimulator.run necesitan utilizar tipos correctos.
Corrección de errores
-
Se ha corregido la regresión de rendimiento debida a la introducción de
AER::Config. Esta clase tiene muchos campos, pero se copia con frecuencia enAER::Transpile::CircuitOptimization. Originalmentejson_t(antigua clase para la configuración) también se copiaba con frecuencia pero tiene entradas en la mayoría de los casos y entonces esta sobrecarga de copia no es un problema. Con esta corrección,AER::Transpile::CircuitOptimizationno copiaAER::Config. -
Cuando las llamadas BLAS fallan, debido a que los hilos omp no manejan excepciones, Aer se bloquea sin ningún mensaje de error. Esta corrección es para que los hilos omp capturen las excepciones correctamente y luego las vuelvan a lanzar fuera de los bucles omp.
-
Anteriormente, los parámetros de las puertas no se validan en C++. Si los parámetros son más cortos de lo esperado (debido a la puerta personalizada), se lanzan fallos de segmentación. Esta confirmación añade la comprobación de si la longitud del parámetro es correcta. Esta confirmación corregirá los problemas notificados en #1612. https://github.com/Qiskit/qiskit-aer/issues/1612
-
Desde 0.12.0, los valores de los parámetros en los circuitos se sustituyen temporalmente por valores constantes y los valores de los parámetros se asignan en la biblioteca C++. Por lo tanto, si se especifica parameter\binds, el simulador devuelve resultados con los valores constnat como valores de parámetro. Con esta confirmación, Aer genera un error si no se especifica parameter_binds aunque los circuitos tengan parámetros.
-
Ya no se consultan los dispositivos y métodos disponibles al importar Aer.
-
Anteriormente
AerSimulatormodificaba los metadatos del circuito para mantener la coherencia entre la entrada y la salida de la simulación, con el efecto secundario de una visualización inesperada de los metadatos de la aplicación en la simulación. Esta solución evita el uso de metadatos de circuito para mantener la coherencia interna y proporciona siempre una vista coherente de los metadatos a la aplicación. -
Se ha corregido un error por el que la variación de metadatos en EstimatorResult era compleja y ahora devuelve float.
-
Corregido un fallo de compilación para compilar Qiskit Aer con soporte cuQuautum (AER_ENABLE_CUQUANTUM=true). Este cambio no afecta a la compilación de binarios para CPU y GPU normales.
-
Se ha corregido un error en
from_backend()que provocaba un error cuando el backend no tenía valores de T1 y T2 (es decir, Ninguno) para un qubit en sus propiedades de qubit. Esta confirmación actualizaNoiseModel.from_backend()ybasic_device_gate_errors()para que añadan una identidadQuantumError(es decir, efectivamente ningún error de relajación térmica) a un qubit sin valores T1 y T2 para todas las puertas que actúan sobre qubits, incluido el qubit. Corregidos #1779 y #1815. -
Se soluciona un problema: aunque el número de qubits se establezca mediante un mapa de acoplamiento o la configuración del dispositivo, cuando se configura el método de simulación, el número de qubits se sobrescribe de acuerdo con el método. Corregido #1769
-
Esta es una corrección para la configuración de la ruta de la biblioteca en CMakeLists.txt para cuQuantum SDK. Dado que la última versión de cuQuantum incluye bibliotecas para CUDA 11.x y 12.x, esta corrección utiliza la versión de CUDA devuelta por FindCUDA para la ruta de las bibliotecas de cuQuantum y cuTENSOR.
-
Esta es una corrección para las bibliotecas de enlace estático de cuQuantum cuando se construye con CUQUANTUM_STATIC=true.
-
No se ha habilitado la paralelización MPI ya que no hemos utilizado qobj. Esta corrección establece correctamente el número de procesos y el rango MPI.
-
AerCircuitse crea a partir de un circuito iterando sus operaciones y saltándose las instrucciones barrera. Sin embargo, saltarse las instrucciones de barrera hace que se produzcan posicionamientos erróneos de los enlaces de los parámetros. Esta corrección añadebarrier()y mantiene los parámetros correctos. -
Aer aún admite Qobj como argumento de
run(), aunque está obsoleto. Sin embargo, desde 0.12.0, siempre falla si no se especificarun_options. Esta corrección permite simular Qobj sinrun_options. -
Desde 0.12.0,
AerConfigse utiliza para la configuración de la simulación mientras se realiza una comprobación de tipos estricta para los argumentos de meth:~.AerSimulator.run. Esta confirmación añade la función de fundición si no se esperan los tipos de argumentos. -
:meth:
QuantumCircuit.initialize()con valor int no se procesaba correctamente como se informó en #1821 <https://github.com/Qiskit/qiskit-aer/issues/1821>. Esta confirmación permite dicha inicialización descomponiendo las instrucciones initialize. -
QuantumCircuitadmite la parametrización de su fase_global. Sin embargo, Aer no ha permitido dicha parametrización y ha fallado cuando el transpilador genera fases globales parametrizadas. Esta confirmación soporta la parametrización de global_phase y resuelve problemas relacionados con https://github.com/Qiskit/qiskit-aer/issues/1795, https://github.com/Qiskit/qiskit-aer/issues/1781 y https://github.com/Qiskit/qiskit-aer/issues/1798. -
Aer utilizará ahora
omp_set_max_active_levels()en lugar del obsoletoomp_set_nested()cuando se compile con versiones recientes de OpenMP.
IBM Proveedor Q 0.20.2
No cambia.
0.43.1
Terra 0.24.1
Preludio
Qiskit Terra 0.24.1 es el primer parche publicado en 0.24.0. Esto corrige algunos errores que se han descubierto desde el lanzamiento de 0.24.0.
Notas de actualización
- Cambiado
QuantumCircuit.assign_parameters()para vincular los valores enteros y flotantes asignados directamente a los parámetros de las instancias deInstructionen el circuito, en lugar de vincular los valores dentro de una instanciaParameterExpression. Este cambio debería tener poco impacto en el usuario, ya quefloat(QuantumCircuit.data[i].operation.params[j])sigue produciendo unfloat(y es la única forma de acceder al valor de un archivoParameterExpression). AdemásInstruction()ya pueden serfloatasí como aParameterExpressionpor lo que el código que trata con parámetros de instrucciones ya debería manejar ambos casos. La mayor probabilidad de impacto en el usuario está en el código que utilizaisinstancepara comprobar la existencia deParameterExpressiony se comporte de forma diferente en función del resultado. Además, qpy serializa el valor numérico en un boundParameterExpressioncon una precisión diferente a la defloat(véase también la nota de corrección de errores relacionada sobreQuantumCircuit.assign_parameters()).
Corrección de errores
-
Actualizado
plot_gate_map(),plot_error_map()yplot_circuit_layout()para soportar mapas de acoplamiento de 433 qubit heavy-hex. Esto permite acoplar visualizaciones de mapas para IBM Quantum 'sibm_seattlebackend. -
Se ha modificado la vinculación de valores numéricos con
QuantumCircuit.assign_parameters()para evitar un desajuste entre los valores de los parámetros de instrucción del circuito y las claves de parámetros correspondientes en el diccionario de calibración del circuito. Corregidos #9764 y #10166. Véase también la nota de actualización relativa aQuantumCircuit.assign_parameters(). -
Se ha corregido un error en
BlockCollapserpor el que se ignoraban los bits clásicos al colapsar un bloque de nodos. -
Se ha corregido un error en
replace_block_with_op()yreplace_block_with_op()que hacía que se ignoraran los bits clásicos. -
Se ha corregido un error en
QuantumCircuit.compose()por el que el atributoSwitchCaseOp.targetdel subcircuito no se asignaba correctamente a un registro del circuito base. -
Se ha corregido un error en
RZXCalibrationBuilderpor el que la llamada a calibración con parámetros erróneos se bloqueaba en lugar de lanzar una excepción. -
Se ha corregido un problema con el método
BooleanExpression.from_dimacs_file()donde el tipo de excepción que se producía cuando tweedledum no estaba instalado no era el esperadoMissingOptionalLibrary. Corregido #10079 -
El uso de
initial_layouten las llamadas atranspile()ya no dará error si el circuito contiene qubits que no están en ningún registro, o qubits que existen en más de un registro. Ver #10125. -
Corregida la descomposición de las puertas de rotación Z multicontroladas añadidas mediante
QuantumCircuit.mcrz(). Anteriormente, este método implementaba una puerta de fase multicontrolada, que tiene una diferencia de fase relativa a la rotación Z. Para obtener el comportamientoQuantumCircuit.mcrz()comportamiento, utiliceQuantumCircuit.mcp(). -
Se ha corregido un problema con el
PassManagerConfig.from_backend()al construir un objetoPassManagerConfiga partir de una instanciaBackendV1que no tenía definido un atributo de mapa de acoplamiento. Anteriormente, el constructor creaba incorrectamente un objetoCouplingMapcon 0 qubits en lugar de utilizarNone. Corregido #10171 -
Corrige un error introducido en Qiskit 0.24.0 por el que los ángulos de rotación numéricos ya no se sustituían por simbólicos antes de preparar la síntesis de dos qubits. Esto provocó una excepción porque las rutinas de síntesis requieren matrices numéricas.
-
Corrección de un error por el que la ejecución de
Optimize1qGatesDecompositionen paralelo se producía un error debido a que OneQubitGateErrorMap no era seleccionable. -
Corregir un error en el
VF2LayoutyVF2PostLayoutque no tenían en cuenta el componente de error de 1 qubit al evaluar un diseño potencial.
Aer 0.12.0
No cambia
IBM Proveedor Q 0.20.2
No cambia
0.43.0
Terra 0.24.0
Preludio
Se trata de una importante versión que incluye numerosas novedades y correcciones de errores.
Esta versión es la última con soporte para ejecutar Qiskit con Python 3.7. A partir de la próxima versión menor Python >= 3.8 será necesario para ejecutar Qiskit.
Lo más destacado de este comunicado:
QuantumInstance, OpFlow, y la obsolescencia del uso de algoritmos
Esta versión deja oficialmente obsoleta la clase QuantumInstance (y sus métodos y clases de ayuda asociados), el módulo qiskit.opflow y cualquier uso de los mismos en qiskit.algorithms. Esta desaprobación proviene de un largo hilo de trabajo que comenzó en Qiskit Terra 0.21.0 para refactorizar el módulo qiskit.algorithms para que se basara en el módulo computacional primitives. Existen guías de migración asociadas para que los usuarios existentes migren al nuevo flujo de trabajo:
QuantumInstanceguía de migración: https://qisk.it/qi \MigraciónOpflowguía de migración: https://qisk.it/opflow \Migración- Guía de migración de algoritmos: https://qisk.it/algo _migración
OpenQASM2 mejoras
Esta versión incluye una refactorización importante del soporte OpenQASM 2.0 en Qiskit. El primer cambio es la introducción de un nuevo analizador sintáctico para OpenQASM 2.0 en el módulo qiskit.qasm2 módulo. Este nuevo módulo sustituye al módulo qiskit.qasm existente. El nuevo analizador sintáctico es más explícito y correcto con respecto a la especificación del lenguaje. También está implementado en Rust y es significativamente más rápido que el analizador anterior. Junto con el nuevo analizador sintáctico, el exportador OpenQASM 2.0 se ha sometido a una importante refactorización que ha mejorado la corrección de la salida cuando se utiliza el método QuantumCircuit.qasm() para generar una salida QASM a partir de un objeto QuantumCircuit objeto.
Compatibilidad con transpiladores para dispositivos con conectividad disjunta
Ahora el transpilador permite seleccionar backends con conectividad disjunta. Anteriormente, el transpilador sólo admitía backends que estuvieran totalmente conectados (en los que existe una ruta para ejecutar operaciones entre todos los pares de qubits del backend). Ahora, si un backend tiene conectividad desconectada, el transpilador es capaz de razonar sobre cómo aplicar el diseño (Layout Stage ) y el enrutamiento (Routing Stage) para el backend. Si el circuito de entrada no puede ejecutarse en el hardware debido a la falta de conectividad entre los componentes conectados, se devolverá un error descriptivo.
Por ejemplo, el dispositivo Heron descrito en la hoja de ruta de hardware de IBM Quantum describe un futuro backend que contará con hardware de control compartido y comunicación clásica en tiempo real entre procesadores cuánticos independientes. Este soporte permite Target modelar con precisión este tipo de dispositivos futuros u otro hardware con limitaciones similares.
Funcionamiento del interruptor
Esta versión añade una nueva operación de flujo de control, la sentencia switch. Para ello se utiliza una nueva clase de operación SwitchCaseOp y el método QuantumCircuit.switch() método Esto permite conectar una entrada numérica (como un registro clásico o un bit) y ejecutar el circuito que corresponde al valor correspondiente.
Nuevas funciones
-
Añadidas las funciones
add_deprecation_to_docstring(),deprecate_arg()ydeprecate_func()al móduloqiskit.utilsmódulo.add_deprecation_to_docstring()reescribirá el docstring de la función para incluir una directiva de Sphinx.. deprecated::de modo que la desaprobación aparezca en los documentos y enhelp(). Los decoradores de desaprobación deqiskit.utilsllaman aadd_deprecation_to_docstring()ya lo hacen por ti; pero puedes llamarlo directamente si utilizas mecanismos diferentes para las deprecaciones.@deprecate_funcsustituye a@deprecate_functiony se utiliza para eliminar una función completa. Generará automáticamente la mayor parte de los mensajes de desaprobación.@deprecate_argsustituye a@deprecate_argumentsy se utiliza para desaprobar un argumento en una función. Generará un mensaje más útil que la función anterior. También es más flexible, por ejemplo, permite establecer unpredicatepara que sólo se desaprueben determinadas situaciones, como el uso de un valor o tipo de datos desaprobados.
Características del transpilador
-
Se ha añadido una forma alternativa de especificar en
HLSConfigla lista de métodos de síntesis utilizados para un objeto de alto nivel determinado. Como antes, un método de síntesis puede especificarse como una tupla formada por el nombre del método y argumentos adicionales. Además, un método de síntesis puede especificarse como una tupla formada por una instancia deHighLevelSynthesisPluginy argumentos adicionales. Además, cuando no hay argumentos adicionales, un método de síntesis puede especificarse simplemente por su nombre o por una instancia deHighLevelSynthesisPlugin. El siguiente ejemplo ilustra la nueva funcionalidad:from qiskit import QuantumCircuit from qiskit.circuit.library.generalized_gates import PermutationGate from qiskit.transpiler import PassManager from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis from qiskit.transpiler.passes.synthesis.high_level_synthesis import ACGSynthesisPermutation qc = QuantumCircuit(6) qc.append(PermutationGate([1, 2, 3, 0]), [1, 2, 3, 4]) # All of the ways to specify hls_config are equivalent hls_config = HLSConfig(permutation=[("acg", {})]) hls_config = HLSConfig(permutation=["acg"]) hls_config = HLSConfig(permutation=[(ACGSynthesisPermutation(), {})]) hls_config = HLSConfig(permutation=[ACGSynthesisPermutation()]) # The hls_config can then be passed as an argument to HighLevelSynthesis pm = PassManager(HighLevelSynthesis(hls_config=hls_config)) qc_synthesized = pm.run(qc) -
Se ha añadido soporte al objeto
CouplingMappara tener una conectividad disjunta. Anteriormente, unCouplingMapsólo podía construirse si el grafo era conexo. Esto permitirá utilizarCouplingMappara representar hardware con qubits disjuntos, como hardware con qubits en múltiples chips separados. -
Se ha añadido un nuevo método
CouplingMap.connected_components()que se utiliza para obtener una lista deCouplingMapsubgrafos componentes de unCouplingMap. Si el objetoCouplingMapobjeto está conectado, devolverá un únicoCouplingMapequivalente al original. -
Añadidas nuevas reglas a la
EquivalenceLibraryinstancia:qiskit.circuit.equivalence_library.SessionEquivalenceLibrary. Las nuevas normas añadidas son: -
Añadidos plugins de síntesis de alto nivel para
LinearFunctiony paraqiskit.quantum_info.Cliffordampliando el conjunto de métodos de síntesis que se pueden llamar desde elHighLevelSynthesistranspiler pass.Para
LinearFunctionlos plugins disponibles se enumeran a continuación:Nombre de pluginPlugin de síntesis de alto niveldefaultDefaultSynthesisLinearFunctionkmsKMSSynthesisLinearFunctionpmhPMHSynthesisLinearFunctionPara
qiskit.quantum_info.Cliffordlos plugins disponibles se enumeran a continuación:Nombre de pluginPlugin de síntesis de alto niveldefaultDefaultSynthesisCliffordagAGSynthesisCliffordbmBMSynthesisCliffordgreedyGreedySynthesisCliffordlayersLayerSynthesisCliffordlnnLayerLnnSynthesisCliffordConsulte la documentación
qiskit.synthesispara obtener más información sobre cada método.El siguiente ejemplo ilustra algunos de los nuevos plugins:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import LinearFunction from qiskit.quantum_info import Clifford from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis # Create a quantum circuit with one linear function and one clifford qc1 = QuantumCircuit(3) qc1.cx(0, 1) qc1.swap(0, 2) lin_fun = LinearFunction(qc1) qc2 = QuantumCircuit(3) qc2.h(0) qc2.cx(0, 2) cliff = Clifford(qc2) qc = QuantumCircuit(4) qc.append(lin_fun, [0, 1, 2]) qc.append(cliff, [1, 2, 3]) # Choose synthesis methods that adhere to linear-nearest-neighbour connectivity hls_config = HLSConfig(linear_function=["kms"], clifford=["lnn"]) # Synthesize qct = HighLevelSynthesis(hls_config)(qc) print(qct.decompose()) -
Añadido un nuevo pass transpiler,
MinimumPointque se utiliza principalmente como un pase para comprobar una condición de bucle en un archivoPassManager. Esta pasada rastreará el estado de los campos en el conjunto de propiedades a lo largo de sus ejecuciones pasadas y establecerá un campo booleano cuando se alcance un punto fijo sobre la profundidad de retroceso o seleccionando el valor mínimo encontrado si se alcanza la profundidad de retroceso. Se trata de una alternativa al métodoFixedPointque simplemente comprueba un valor fijo en un campo de conjunto de propiedades entre ejecuciones posteriores. -
Añadido un nuevo método,
swap_nodes()a la funciónDAGCircuitpara permitir el intercambio de nodos que están parcialmente conectados. Parcialmente conectado significa que los dos nodos comparten al menos una arista (que representa un qubit o clbit). Si los nodos no comparten ninguna arista aDAGCircuitError. -
Añade un nuevo algoritmo de síntesis
synth_cz_depth_line_mr()de un circuito CZ para la conectividad del vecino más próximo lineal (LNN) en profundidad de 2 qubits de 2n+2 utilizando puertas CX y de fase (S, Sdg o Z). El circuito sintetizado invierte el orden de los qubits. El algoritmo de síntesis se basa en el trabajo de Maslov y Roetteler ( https://arxiv.org/abs/1705.09176 ). -
Añadir un nuevo algoritmo de síntesis
synth_clifford_depth_lnn()de un circuito Clifford para la conectividad LNN en una profundidad de 2 qubits de 9n+4 (que todavía no es óptima), utilizando la síntesis Clifford por capas (synth_clifford_layers()),synth_cnot_depth_line_kms()para sintetizar la capa CX en profundidad 5n, ysynth_cz_depth_line_mr()para sintetizar cada una de las capas CZ en profundidad 2n+2. A este RP le seguirá otro RP basado en el reciente trabajo de Maslov y Yang ( https://arxiv.org/abs/2210.16195 ), que sintetiza las capas CX-CZ en profundidad 5n para la conectividad LNN y realiza una optimización adicional, y por lo tanto reduce la profundidad de un circuito Clifford a 7n-4 para la conectividad LNN. -
Las equivalencias entre las rotaciones Pauli controladas y las traslaciones a rotaciones de dos Pauli ya están disponibles en la biblioteca de equivalencias para las puertas estándar Qiskit. Esto permite, por ejemplo, traducir un
CRZGateaRZZGatemásRZGateo aCRYGatea un soloRZXGatemás puertas de qubit único:from qiskit.circuit import QuantumCircuit from qiskit.compiler import transpile angle = 0.123 circuit = QuantumCircuit(2) circuit.cry(angle, 0, 1) basis = ["id", "sx", "x", "rz", "rzx"] transpiled = transpile(circuit, basis_gates=basis) print(transpiled.draw()) -
Se ha añadido una nueva opción,
copy_operations, acircuit_to_dag()para permitir opcionalmente desactivar la copia profunda de las operaciones de la entradaQuantumCircuita la salidaQuantumCircuit. En los casos en que la entrada :class`~.QuantumCircuit` ya no se utiliza después de la conversión, esta copia en profundidad es una sobrecarga innecesaria, ya que las referencias compartidas no tendrían ningún efecto secundario potencial no deseado si la entradaQuantumCircuitse descarta. -
Se ha añadido una nueva opción,
copy_operations, adag_to_circuit()para permitir opcionalmente desactivar la copia profunda de las operaciones de la entradaDAGCircuita la salidaQuantumCircuit. En los casos en que la entradaDAGCircuitya no se utiliza después de la conversión, esta copia profunda es una sobrecarga innecesaria, ya que las referencias compartidas no tendrían ningún efecto secundario potencial no deseado si la entradaDAGCircuitse descarta. -
Se ha añadido una nueva función
passmanager_stage_plugins()al móduloqiskit.transpiler.preset_passmanagers.pluginmódulo. Esta función se utiliza para obtener una correspondencia entre los nombres de los plugins y su tipo de clase. Esto permite identificar y consultar cualquier documentación definida del plugin de la etapa de gestión de pases. Por ejemplo:>>> from qiskit.transpiler.preset_passmanagers.plugin import passmanager_stage_plugins >>> passmanager_stage_plugins('routing')['lookahead'].__class__ qiskit.transpiler.preset_passmanagers.builtin_plugins.LookaheadSwapPassManager >>> help(passmanager_stage_plugins('routing')['lookahead']) Help on BasicSwapPassManager in module qiskit.transpiler.preset_passmanagers.builtin_plugins object: class BasicSwapPassManager(qiskit.transpiler.preset_passmanagers.plugin.PassManagerStagePlugin) | Plugin class for routing stage with :class:`~.BasicSwap` ... -
El pase de transpilador
Errorahora también acepta entradas invocables para su parámetromsg. Si se utilizan estas llamadas de entrada se les pasará el atributoproperty_setdel pase y se espera que devuelvan una cadena que se utilizará para el mensaje de error cuando se ejecute el pase. Por ejemplo:from qiskit.transpiler.passes import Error def error_message(property_set): size = property_set["size'] return f"The circuit size is: {size}" error_pass = Error(error_message)Cuando se incluye
error_passen un gestor de pases, se producirá un error utilizando el mensaje"The circuit size is: n"dondenes el tamaño de circuito establecido en el conjunto de propiedades (normalmente de la ejecución anterior delSizepass). -
El método
build_coupling_map()tiene una nueva palabra clave como argumento,filter_idle_qubitsque cuando se establece enTrueeliminará cualquier qubits de la salidaCouplingMapque no admitan ninguna operación. -
El
GateDirectiontranspiler pass puede ahora manejar correctamenteSwapGateque pueden estar presentes en el circuito cuando se ejecuta en un circuito. En estos casos, si los argumentos del qubit de la puerta de intercambio están en la dirección no nativa de un borde, el paso invertirá el orden de los argumentos. -
En
RZXCalibrationBuilderyRZXCalibrationBuilderNoEchoutilizan ahora correctamente unECRGatepara la puerta de enredo si la puerta de enredo nativa del backend esECRGate. Anteriormente, los pases sólo funcionaban correctamente si la puerta de enredo eraCXGate. -
Se ha añadido un nuevo constructor para la clase
TargetclaseTarget.from_configuration()que permite construir un objetoTargeta partir de los distintos tipos de objetos para describir las restricciones de un backend (por ejemplo, puertas base,CouplingMap,BackendPropertiesetc.). Por ejemplo:target = Target.from_configuration( basis_gates=["u", "cx", "measure"], coupling_map=CouplingMap.from_line(25), )Esto construirá un objeto
Targetque tieneUGate,CXGateyMeasuredisponibles globalmente en 25 qubits que están conectados en una línea. -
Añadida una nueva función
synth_cnot_phase_aam()que se utiliza para sintetizar circuitos de fase cnot para arquitecturas all-to-all utilizando el método de Amy, Azimzadeh y Mosca. Esta función es idéntica a la disponible enqiskit.transpiler.synthesis.graysynth(), pero tiene un nombre más descriptivo y se sitúa de forma más lógica en el árbol de paquetes. Esta nueva función sustituye a la anterior, que probablemente quedará obsoleta en una futura versión. -
Los ajustes internos del algoritmo de enrutamiento en
SabreSwaputilizado en la transpilación de circuitos no dinámicos en todos los niveles de optimización distintos de cero, han acelerado el enrutamiento de circuitos muy grandes. Por ejemplo, el tiempo de trazado de un circuito depth-5QuantumVolumepara un mapa de acoplamiento pesado-hex de 1081 qubits se reduce aproximadamente a la mitad. -
El rendimiento en tiempo de ejecución del
Optimize1qGatesDecompositiontranspilador se ha mejorado considerablemente. Para ello, se reescribió todo el cálculo del pase en Rust y se redujo la cantidad de objetos intermedios creados como parte de la ejecución del pase. Esto también debería corresponder a una mejora similar en el rendimiento en tiempo de ejecución detranspile()con la palabra claveoptimization_leveldefinida como1,2o3. -
Añadir un nuevo método de síntesis
synth_stabilizer_layers()de un estado estabilizador en capas. Proporciona una descomposición similar a la síntesis descrita en el Lemma 8 de Bravyi y Maslov, ( arxiv:2003.09412 ) sin el subcircuito inicial libre de Hadamard que no afecta al estado estabilizador. -
Añade un nuevo método de síntesis
synth_stabilizer_lnn()de un estado estabilizador para conectividad lineal de vecino más cercano en profundidad de 2-qubit de 2n+2 y dos capas CX distintas, usando CX y puertas de fase (S, Sdg o Z). El algoritmo de síntesis se basa en el trabajo de Maslov y Roetteler ( https://arxiv.org/abs/1705.09176 ). -
El pase
SabreLayoutpass ahora admite la ejecución contra un objetivo con un archivoCouplingMap. Al apuntar a un acoplamiento disjunto, la entradaDAGCircuitse divide en sus componentes conectados de qubits virtuales, cada componente se asigna a los componentes conectados de la entradaCouplingMapa continuación, se ejecuta el diseño en cada componente conectado de forma aislada y, a continuación, se combinan y se devuelven todos los diseños. Tenga en cuenta que cuando se establece el argumentorouting_passel pase no admite la ejecución con conectividad disjunta. -
Los siguientes pases del transpilador de diseño y enrutamiento de los módulos
qiskit.transpiler.passesadmiten ahora la aceptación de un objetoTargetque se utiliza para modelar las restricciones de un backend de destino a través del primer argumento posicional (actualmente denominadocoupling_mapobackend_properties).La lista de pases con el nuevo soporte para
Targetson:CSPLayoutFullAncillaAllocationLayout2qDistanceNoiseAdaptiveLayoutSabreLayoutTrivialLayoutBasicSwapBIPMappingLayoutTransformationLookaheadSwapSabreSwapStochasticSwapCheckMap
-
La función de ayuda a la construcción del gestor de pases
generate_embed_passmanager()ahora también aceptará unTargetcomo único argumento posicional (actualmente denominadocoupling_map). Esto se puede utilizar para construir una incrustación de diseñoPassManagera partir de un objetoTargeten lugar de a partir de un objetoCouplingMap. -
Los siguientes pases del transpilador de diseño y enrutamiento de los módulos
qiskit.transpiler.passestienen un nuevo argumento de palabra clave,target, que recibe un objetoTargetque se utiliza para modelar las restricciones de un backend de destino. Si se especifica el argumento de la palabra clavetarget, se utilizará como fuente de verdad para cualquier restricción de hardware utilizada en el funcionamiento del pase del transpilador. Reemplazará a cualquier otro argumento para especificar restricciones de hardware, normalmente aquellos argumentos que toman un atributoCouplingMap,InstructionScheduleMapo una lista de puertas base. La lista de estos pases con el nuevo argumentotargetson: -
La función de ayuda a la construcción del gestor de pases
generate_scheduling()tiene un nuevo argumento de palabra clavetargetque se utiliza para especificar un objetoTargetpara modelar las restricciones del backend de destino para el que se está compilando al generar un nuevo archivoPassManager. Si se especifica, este nuevo argumento sustituirá al otro argumentoinst_map. -
El plugin
defaultutilizado por elUnitarySynthesistranspiler pass ahora elige síntesis unitarias de uno y dos qubits basándose en las tasas de error reportadas en el archivoTarget. En concreto, ejecuta todos los métodos de síntesis posibles admitidos por el plugin y elige la opción que produzca el error más bajo. Para una descomposición de un qubit, puede tener como objetivo la base Pauli (por ejemplo, RZ-RX-RZ o RZ-RY-RZ), la base unitaria genérica (por ejemplo, U) y algunas otras. Para una descomposición de dos qubits, puede dirigirse a cualquier base supercontrolada (por ejemplo, CNOT, iSWAP, B) o base controlada múltiple (por ejemplo, CZ, CH, ZZ^.5, ZX^.2, etc.). -
La interfaz para
UnitarySynthesisPlugintiene dos nuevas propiedades opcionalessupports_gate_lengths_by_qubitysupports_gate_errors_by_qubitque, cuando se definen, añaden los camposgate_lengths_by_qubitygate_errors_by_qubitrespectivamente a las opciones de entrada del métodorun()del complemento. Estos nuevos campos son una vista alternativa de los datos proporcionados porgate_lengthsygate_errors, pero en su lugar tienen la forma:{(qubits,): [Gate, length]}(dondeGatees la instancia deGatepara esa definición). Esto permite a los plugins razonar sobre el trabajo con puertas del mismo tipo pero que tienen diferentes parámetros establecidos. -
Añadido un nuevo pase transpiler,
UnrollForLoopsque se utiliza para desenrollar cualquierForLoopOpen un circuito. Esta pasada desenrolla los bucles for cuando es posible, si no hay buclesContinueLoopOpoBreakLoopOpdentro del cuerpo del bucle. Por ejemplo:from qiskit.transpiler.passes import UnrollForLoops from qiskit import QuantumCircuit unroll_pass = UnrollForLoops() qc = QuantumCircuit(1) # For loop over range 5 with qc.for_loop(range(5)) as i: qc.rx(i, 0) # Unroll loop into 5 rx gates unroll_pass(qc).draw("mpl")
-
Se ha añadido un nuevo parámetro
max_trialspara pasarVF2PostLayoutque, cuando se especifica, limita el número de diseños descubiertos y comparados al buscar el mejor diseño. Esto difiere de los parámetros existentescall_limitytime_limit(que se utilizan para limitar el número de visitas de estado realizadas por el algoritmo VF2 y el tiempo total empleado por passVF2PostLayoutrespectivamente) en que se utiliza para poner un límite superior al tiempo empleado en puntuar posibles diseños, lo que puede ser útil para dispositivos más grandes. -
El
CheckMaptranspiler pass tiene un nuevo argumento de palabra clave en su constructor,property_set_field. Este argumento puede utilizarse para especificar un campo en el conjunto de propiedades para almacenar los resultados del análisis. Anteriormente, sólo era posible almacenar el resultado en el campo"is_swap_mapped"(que es el predeterminado). Esto le permite almacenar el resultado de múltiples instancias del pase en unPassManageren diferentes campos.
Características de los circuitos
-
Añadida una nueva clase de puerta,
GlobalPhaseGateque puede utilizarse para añadir una fase global en la instanciaQuantumCircuitinstancia. -
Se ha añadido un nuevo atributo
layouta la claseQuantumCircuitclase. Este atributo suele rellenarse contranspile()oPassManager.run()(cuando la Etapa de diseño y la Etapa de enrutamiento se ejecutan en la fasePassManager) y contiene unTranspileLayoutque contiene la información sobre la permutación del circuito de entrada durantetranspile(). -
Se ha añadido un nuevo argumento,
var_order, al constructor de la clasePhaseOraclepara permitir establecer el orden en que se consideran las variables en la expresión lógica. Por ejemplo:from qiskit.tools.visualization import plot_histogram from qiskit.primitives import Sampler from qiskit.circuit.library import PhaseOracle from qiskit.algorithms import Grover, AmplificationProblem oracle = PhaseOracle('((A & C) | (B & D)) & ~(C & D)', var_order=['A', 'B', 'C', 'D']) problem = AmplificationProblem(oracle=oracle, is_good_state=oracle.evaluate_bitstring) grover = Grover(sampler=Sampler()) result = grover.amplify(problem) print(result.circuit_results[0]) -
Un nuevo analizador sintáctico OpenQASM 2 está disponible en
qiskit.qasm2. Esto tiene dos puntos de entradaqasm2.load()yqasm2.loads()para leer el código fuente de un archivo y de una cadena, respectivamente:import qiskit.qasm2 program = """ OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; h q[0]; cx q[0], q[1]; """ bell = qiskit.qasm2.loads(program)Este nuevo analizador sintáctico es aproximadamente 10x más rápido que los existentes en
QuantumCircuit.from_qasm_file()yQuantumCircuit.from_qasm_str()para archivos grandes, y también tiene menos sobrecarga en cada llamada. El nuevo analizador es más extensible, personalizable y, en general, también más seguro; no intentará generar objetos Qiskit personalizados cuando la definición en el archivo OpenQASM 2 choque con el objeto Qiskit, a diferencia del exportador actual. Consulte laqiskit.qasm2para más detalles y ejemplos. -
Mejorar la descomposición de rotaciones Pauli-X y Pauli-Y multicontroladas con
QuantumCircuit.mcrx()yQuantumCircuit.mcry on :math:`n()controles a puertas CX, para . Esta mejora se basa en arXiv:2302.06377. -
Qiskit ahora soporta la representación de
switchdeclaraciones, utilizando el nuevoSwitchCaseOpy el métodoQuantumCircuit.switch()método. Esto permite conectar una entrada numérica (como un registro clásico o un bit) y ejecutar el circuito que corresponde al valor correspondiente. Múltiples valores pueden apuntar al mismo circuito, yCASE_DEFAULTpuede utilizarse como etiqueta siempre coincidente.También puede utilizar una interfaz de construcción, similar a las otras construcciones de flujo de control para construir estas sentencias de conmutación:
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister qreg = QuantumRegister(2) creg = ClassicalRegister(2) qc = QuantumCircuit(qreg, creg) qc.h([0, 1]) qc.measure([0, 1], [0, 1]) with qc.switch(creg) as case: with case(0): # if the register is '00' qc.z(0) with case(1, 2): # if the register is '01' or '10' qc.cx(0, 1) with case(case.DEFAULT): # the default case qc.h(0)La sentencia
switchtiene soporte en toda la pila del compilador Qiskit; puedestranspile()que la contengan (si el backend anuncia su soporte para la construcción), y se serializará a QPY.La declaración
switchno es actualmente una característica de OpenQASM 3, pero está en fase de diseño y estudio, y se espera que se adopte en un futuro próximo. Qiskit Terra tiene soporte experimental para exportar esta declaración a la sintaxis OpenQASM 3 propuesta en el pull request enlazado, usando un feature flag experimental. Para exportar un circuito de enunciadoswitch(como el creado anteriormente) a OpenQASM 3 utilizando este soporte especulativo, haga lo siguiente:from qiskit import qasm3 qasm3.dumps(qc, experimental=qasm3.ExperimentalFeatures.SWITCH_CASE_V1)
Características de los algoritmos
-
Se ha añadido un nuevo atributo
eigenvalue_thresholda la claseAdaptVQEpara configurar un nuevo tipo de umbral para terminar el algoritmo una vez que el valor propio cambia menos de un valor establecido. -
Se ha añadido un nuevo atributo
gradient_thresholda la claseAdaptVQEque sustituirá al atributothresholden el futuro. Este nuevo atributo se comporta igual que el existentethresholdpero tiene un nombre más preciso, dada la introducción de opciones de umbral adicionales en la clase. -
Se ha añadido el atributo
EstimationProblem.has_good_stateque permite comprobar si unEstimationProblemtiene unEstimationProblem.is_good_stateo si es el predeterminado. Esto es útil para comprobaciones en estimadores de amplitud, comoAmplitudeEstimationque sólo admiten la implementación por defecto. -
Añade una bandera
locala la claseComputeUncomputeque permite calcular la fidelidad local, que se define promediando los proyectores de un solo qubit. -
Las clases de gradiente reorganizan ahora el resultado del gradiente según el orden de los parámetros de entrada.
Ejemplo:
from qiskit.algorithms.gradients import ParamShiftEstimatorGradient from qiskit.circuit import QuantumCircuit, Parameter from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp # Create a circuit with a parameter p = {i: Parameter(f'p{i}') for i in range(3)} qc = QuantumCircuit(1) qc.rx(p[0], 0) qc.ry(p[1], 0) qc.rz(p[2], 0) op = SparsePauliOp.from_list([("Z", 1)]) param_values = [0.1, 0.2, 0.3] # Create a gradient object estimator = Estimator() grad = ParamShiftEstimatorGradient(estimator) result = grad.run(qc, op, [param_values]).result() # would produce a gradient of the form [df/dp0, df/dp1, df/dp2] result = grad.run(qc, op, [param_values], parameters=[[p[2], p[0]]]).result() # would produce a gradient of the form [df/dp2, df/dp0] -
Se ha añadido soporte para manejar Hamiltonianos dependientes del tiempo (es decir, operadores parametrizados individualmente) a la clase
TrotterQRTEclase. Para facilitar el trabajo con esto, se ha añadido el atributonum_timestepsy un argumento de palabra clave coincidente al constructorTrotterQRTEpara controlar el número de pasos temporales en que se divide la evolución completa. -
Añadido soporte para evaluaciones observables en cada paso de tiempo durante la ejecución de la
TrotterQRTEclase. El atributoTimeEvolutionProblem.aux_operatorsse evalúa en cada paso temporal si el atributoProductFormula.repsdel argumento de entradaproduct_formulaen el constructor se establece en 1. -
Se han añadido extensiones al
VQDalgoritmo, que permiten pasar una lista de optimizadores y puntos iniciales para las distintas ejecuciones de minimización. Por ejemplo, elk-ésimo punto inicial yk-ésimo optimizador se utilizarán para la optimización delk-1-ésimo estado exicted.
Características de la información cuántica
-
Añadidos dos nuevos métodos constructores
Clifford.from_matrix()yClifford.from_operator()que crean un objetoClifforda partir de su matriz unitaria y su representación de operador, respectivamente. -
El constructor de
Cliffordahora puede tomar cualquier objeto puerta Clifford de hasta 3 qubits siempre que implemente un métodoto_matrix, incluyendo puertas parametrizadas comoRz(pi/2), que antes no eran convertibles. -
Añadidas nuevas funciones de utilidad:
commutator(),anti_commutator()ydouble_commutator()que se utilizan para calcular conmutadores para cualquier objeto que implemente la clase base abstractaLinearOpcomoQuantumChannel,SparsePauliOp, oScalarOp. -
Añadido el método
StabilizerState.equiv, que comprueba si los conjuntos generadores de dos estados estabilizadores generan el mismo grupo estabilizador. Por ejemplo, el grupo estabilizador del estado de Bell de dos qubits contiene los cuatro elementos y, por lo tanto, puede ser generado por , o . -
Añadido un nuevo método,
partial_transpose()al móduloqiskit.quantum_infodel móduloDensityMatrixdel módulo. Este método se utiliza para calcular la transposición parcial de una matriz de densidad, necesaria para detectar el entrelazamiento entre sistemas cuánticos bipartitos. -
Añadido un método
qiskit.quantum_info.Operator.apply_permutation()que precompone o postcompone un Operador con una Permutación. Este método funciona para qudits generales.He aquí un ejemplo para calcular que reordena los bits de Operator:
import numpy as np from qiskit.quantum_info.operators import Operator op = Operator(np.array(range(576)).reshape((24, 24)), input_dims=(2, 3, 4), output_dims=(2, 3, 4)) perm = [1, 2, 0] inv_perm = [2, 0, 1] conjugate_op = op.apply_permutation(inv_perm, front=True).apply_permutation(perm, front=False)El operador conjugado tiene dimensiones (4, 2, 3) x (4, 2, 3), lo que es consistente con la permutación que mueve el qutrit a la posición 0, el qubit a la posición 1, y el 4-qudit a la posición 2.
-
Admite de forma nativa la construcción de
SparsePauliOpobjetos conParameterExpressioncoeficientes, sin requerir la construcción explícita de una matriz de objetos. Ahora se admite lo siguiente:from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp x = Parameter("x") op = SparsePauliOp(["Z", "X"], coeffs=[1, x]) -
Se ha añadido el
SparsePauliOp.assign_parameters()método ySparsePauliOp.parameterspara asignar y consultar parámetros no enlazados dentro de un archivoSparsePauliOp. Esta función puede utilizarse, por ejemplo, como:from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp x = Parameter("x") op = SparsePauliOp(["Z", "X"], coeffs=[1, x]) # free_params will be: ParameterView([x]) free_params = op.parameters # assign the value 2 to the parameter x bound = op.assign_parameters([2])
Características de Pulse
-
Añadidas nuevas
SymbolicPulseclases a la biblioteca de pulsos (qiskit.pulse.library) Los nuevos pulsos en la biblioteca son:Estas nuevas clases son instancias de
ScalableSymbolicPulse. A excepción de la faseSawtooth, el comportamiento es idéntico al de la función generadora de forma de onda correspondiente (p. ej.sin()). La fase para la claseSawtoothse define de tal manera que una fase de se desplaza un ciclo completo. -
Añadido soporte a QPY (
qiskit.qpy) para trabajar con instancias pulseScheduleBlockcon referencias no asignadas, y preservar la estructura de datos para la referencia a subrutinas. Esta función permite a los usuarios serializar y deserializar una plantilla de programa de pulsos para tareas como la calibración de pulsos. Por ejemplo:from qiskit import pulse from qiskit import qpy with pulse.build() as schedule: pulse.reference("cr45p", "q0", "q1") pulse.reference("x", "q0") pulse.reference("cr45p", "q0", "q1") with open('template_ecr.qpy', 'wb') as fd: qpy.dump(schedule, fd) -
Se ha añadido un nuevo método
CalibrationEntry.user_provided()a las entradas de calibración. Se puede llamar a este método para comprobar si la entrada está definida por un usuario final o backend. -
Se ha añadido un nuevo método
Target.get_calibration()que proporciona un cómodo acceso a la calibración de una instrucción en unTargetobjeto Este método puede ser llamado con parámetros args y kwargs, y devuelve un programa de pulsos construido con parámetros cuando la calibración está planificada con parámetros.
Características de los proveedores
-
La clase
BackendV2Convertertiene un nuevo argumento de palabra clave,filter_faulty, en su constructor. Cuando este argumento se establece enTrue, la clase de conversor filtrará cualquier qubit u operación que aparezca como no operativa en la carga útilBackendPropertiescarga útil de la entradaBackendV1. Aunque no se utiliza mucho, un objetoBackendPropertiespermite anotar tanto qubits como puertas como no operativos. Anteriormente, si un backend había establecido esa bandera en cualquier qubits o puertas la salidaBackendV2instancia y suTargetincluían todas las operaciones, tanto si estaban operativas como si no. Aprovechando la nueva bandera se pueden filtrar estos qubits y puertas no operativos del archivoTarget. Cuando el indicador está activado, el backend de salida seguirá apareciendo con el ancho completo (por ejemplo, un backend de 24 qubits con 4 qubits listados como no operativos seguirá mostrando que tiene 24 qubits), pero los qubits defectuosos no tendrán ninguna operación listada como soportada en el archivoTarget. -
La clase
Optionsimplementa el protocoloMappingy el método__setitem__. Esto significa queOptionsofrecen ahora la misma interfaz que los diccionarios estándar, a excepción de los métodos de borrado (__delitem__, pop, clear). Las asignaciones de claves son validadas por los validadores, si hay alguno registrado.
Funciones de visualización
-
Añadida una nueva función,
staged_pass_manager_drawer(), que se utiliza para visualizar unaStagedPassManagerinstancia. Dibuja el gestor de pases completo con cada etapa representada como una caja exterior.Por ejemplo:
from qiskit.visualization import staged_pass_manager_drawer from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import FakeSherbrooke backend = FakeSherbrooke() pm = generate_preset_pass_manager(3, backend) staged_pass_manager_drawer(pm) -
El método
StagedPassManager.draw()método se ha actualizado para incluir la visualización de las etapas además del gestor general de pases. Las etapas están representadas por recuadros exteriores en la visualización. En versiones anteriores, las etapas no se incluían en la visualización. Por ejemplo:from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import FakeSherbrooke backend = FakeSherbrooke() pm = generate_preset_pass_manager(3, backend) pm.draw(pm) -
Se ha añadido un nuevo argumento de palabra clave,
figsize, a la funciónplot_bloch_multivector()función. Este argumento se puede utilizar para establecer un tamaño para las subparcelas individuales de la esfera de Bloch. Por ejemplo, si hay qubits yfigsizese fija en(w, h), entonces la anchura total de la figura se fija en , mientras que la altura total se fija en . -
Se ha añadido un nuevo argumento de palabra clave,
font_size, a la funciónplot_bloch_multivector()función. Este argumento puede utilizarse para controlar el tamaño de la fuente en la visualización de salida. -
Se han añadido dos nuevos argumentos de palabra clave,
title_font_sizeytitle_pad, a la funciónplot_bloch_multivector()función Estos argumentos pueden utilizarse para controlar el tamaño de fuente del título general y su relleno, respectivamente.
Notas de actualización
-
La versión mínima compatible de Rust (MSRV) ha pasado de 1.56.1 a 1.61.0. Si estás compilando Qiskit desde el código fuente, tendrás que asegurarte de que tienes al menos Rust 1.61.0 instalado para poder compilar Qiskit. Este cambio se ha realizado porque varias dependencias aguas arriba han aumentado sus MSRV.
-
Eliminado el uso de primitivas con el gestor de contexto y la inicialización con circuitos, (observables sólo para Estimator), y parámetros que fue obsoleto en la versión de Qiskit Terra 0.22.0 en octubre de 2022.
-
PrimitiveJob.submit()ya no se bloquea al finalizar la ejecución. Como resultado,Sampler.run(),BackendSampler.run(),Estimator.run()yBaseEstimator.run()no se bloquean hasta que se llama al métodoPrimitiveJob.result().
Notas sobre la actualización del transpilador
-
El número máximo de ensayos evaluados al buscar la mejor disposición utilizando
VF2LayoutyVF2PostLayoutestá ahora limitado enlevel_1_pass_manager(),level_2_pass_manager()ylevel_3_pass_manager()a2 500,25 000, y250 000, respectivamente. Previamente, se evaluaron todos los posibles trazados encontrados. Este cambio se hizo para evitar que la transpilación se colgara durante la puntuación de diseño para circuitos con muchos componentes conectados en dispositivos más grandes, lo que escala combinatorialmente ya que cada componente conectado se evaluaría en todas las posiciones posibles en el dispositivo. Para realizar una búsqueda completa como antes, ejecute manualmenteVF2PostLayoutsobre el circuito transpilado en modo estricto, especificando0paramax_trials. -
El atributo
conditionde la claseDAGDepNodeha sido eliminado. Se marcó como obsoleto en la versión 0.18 (07-2021). En su lugar, debe utilizar el atributoconditiondel atributooppara acceder a la condición de un nodo de operación. Para otros tipos de nodos no existe ninguna condición de acceso. -
El valor por defecto de
metadatatanto enDAGCircuityDAGDependencyse ha cambiado deNonea{}por compatibilidad con el atributometadatacorrespondiente deQuantumCircuit. -
Se ha actualizado el método
CouplingMap.__eq__`()para comprobar que las listas de aristas de los grafos subyacentes contienen los mismos elementos. En el supuesto de que los grafos subyacentes estén conectados, esta comprobación garantiza además que los grafos tengan el mismo número de nodos con las mismas etiquetas. Cualquier código que utiliceCouplingMap() == CouplingMap()para comprobar la igualdad de objetos debe actualizarse aCouplingMap() is CouplingMap(). -
Al ejecutar la función
transpile()con un backend basado enBackendV1o con un argumentoBackendPropertiesmediante la palabra clavebackend_propertiesque tenga qubits o puertas marcados como defectuosos, la función ya no intentará reasignar automáticamente los qubits basándose en esta información. El método por el quetranspile()intentaba hacer esta reasignación era fundamentalmente defectuoso y en la mayoría de los casos de este tipo de backend se produciría un error interno. En la práctica, muy pocos backends establecen los campos enBackendPropertiespara marcar un qubit o una puerta como defectuosos. Si confiaba en quetranspile()para hacer este re-mapeo por ti, ahora tendrás que hacerlo manualmente y pasar una entrada mapeada a los argumentoscoupling_mapybackend_propertiesque ha filtrado los qubits y puertas defectuosos y luego re-mapear manualmente la salida. -
El resultado de las transpilaciones para semillas fijas puede haber cambiado en comparación con versiones anteriores de Qiskit Terra. Esto se debe a ajustes internos en el algoritmo de enrutamiento utilizado por
SabreSwapySabreLayoutque son los pases por defecto de enrutamiento y diseño respectivamente, para hacerlos significativamente más rápidos para circuitos grandes.
Notas sobre la actualización de circuitos
- En
QuantumCircuitmetadatadevuelve siempre un diccionario y sólo puede definirse como un diccionario. Anteriormente, su valor por defecto eraNone, y podía fijarse manualmente enNoneo en un diccionario.
Notas sobre la actualización de algoritmos
- Los módulos obsoletos
factorizersylinear_solvers, que conteníanHHLyShorhan sido eliminados deqiskit.algorithms. Estas funcionalidades quedaron obsoletas en la versión 0.22.0 (publicada el 13 de octubre de 2022). En su lugar, puedes acceder al código a través del libro de texto Qiskit: Resolvedores lineales (HHL), Factorizadores (Shor)
Notas sobre la actualización de Pulse
Target.update_from_instruction_schedule_map()ya no muestraKeyErrorniValueErrorcuando faltan qubits en la instrucción de destino o no se proporcionainst_name_mappara la instrucción indefinida. En el primer caso, simplemente ignora la entradaInstructionScheduleMappara los qubits indefinidos. En este último caso, se extrae un mapeo de puertas de las puertas estándar de Qiskit y, por último, se define un objeto opaco personalizadoGatepersonalizado a partir del nombre del programa si no se encuentra ninguna asignación.
Notas de actualización para proveedores
-
El argumento obsoleto
max_creditsdeexecute(),assemble()y todas las configuraciones deQobj(p. ej.QasmQobjConfigyPulseQobjConfig). Este argumento se remonta a las primeras versiones de Qiskit, más vinculadas a la oferta de servicios de IBM Quantum. En aquel momento, el campomax_creditsformaba parte del "sistema de créditos" utilizado por la oferta de servicios de IBM Quantum. Sin embargo, ese sistema de créditos ya no se utiliza en los backends de IBM Quantum desde hace casi tres años y, además, Qiskit ya no está vinculado a la oferta de servicios de IBM Quantum (ni lo ha estado durante mucho tiempo). Si confía en esta opción de algún modo para un backend, tendrá que asegurarse de que su implementación deBackendV2exponga un campomax_creditsen su objetoOptionsobjeto. -
El atributo
nameen las clasesBackendV2basado en clases de backend falsas enqiskit.providers.fake_providerhan cambiado con respecto a versiones anteriores. Anteriormente, los nombres tenían un sufijo"_v2"para diferenciar la clase de laBackendV1versión. Este sufijo se ha eliminado, ya que podría dar lugar a incoherencias con otros datos instantáneos utilizados para construir el objeto backend.
Notas sobre características en desuso
- Los módulos
qiskit.opflow,qiskit.utils.backend_utils,qiskit.utils.mitigation,qiskit.utils.measurement_error_mitigation, claseqiskit.utils.QuantumInstancey los métodosfind_regs_by_name(),run_circuits()han quedado obsoletos y se eliminarán en una futura versión. UtilizandoQuantumInstancese sustituye porBaseSampler. Véase Migración Opflow. Véase QuantumInstance Migración.
Deprecaciones del transpilador
-
El pase de enrutamiento del transpilador,
BIPMapping, ha quedado obsoleto y se eliminará en una futura versión. Se ha sustituido por un paquete de complementos externo:qiskit-bip-mapper. Los detalles de este nuevo paquete pueden consultarse en el repositorio github del paquete:https://github.com/qiskit-community/qiskit-bip-mapper
El pase se convirtió en un paquete de plugins separado por dos razones, en primer lugar la dependencia de CPLEX hace que sea más difícil de usar y en segundo lugar el paquete de plugins se integra más limpiamente con
transpile(). -
La falta de ortografía
aquire_alignmenten la claseTargetse ha sustituido por la ortografía correctaacquire_alignment. Los antiguos argumentos del constructor aquire_alignment yTarget.aquire_alignmentestán obsoletos y serán eliminados en una futura versión. UtiliceTarget.acquire_alignmentpara obtener y establecer el valor de la restricción de alineación.
Circuitos obsoletos
- Ajuste del
QuantumCircuitmetadataaNoneha quedado obsoleto y dejará de estar disponible en futuras versiones. En su lugar, los usuarios deben establecerlo como un diccionario vacío si desean que no contenga datos.
Desuso de algoritmos
-
Todas las características siguientes están ahora obsoletas, después de haber estado pendientes de obsoleto desde 0.22.0. Más información en https://qisk.it/algo _migration.
-
Módulo
qiskit.algorithms.minimum_eigen_solversestá obsoleto y sustituido porqiskit.algorithms.minimum_eigensolvers. -
Módulo
qiskit.algorithms.eigen_solversestá obsoleto y sustituido porqiskit.algorithms.eigensolvers. -
El módulo
qiskit.algorithms.evolversha quedado obsoleto y ha sido sustituido porqiskit.algorithms.time_evolvers. -
Clase
qiskit.algorithms.TrotterQRTEes obsoleto y sustituido porqiskit.algorithms.time_evolvers.trotterization.TrotterQRTE. -
Utilizando
QuantumInstanceoBackendestá obsoleto y es sustituido porBaseSampleren las siguientes clases: -
Utilizando
QuantumInstanceoBackendoExpectationBaseestá obsoleto y es sustituido porBaseSampleren el siguiente método estático:get_fidelity() -
La función
eval_observables()es obsoleta y sustituida por la funciónestimate_observables().
-
Depreciación de la información cuántica
PauliTableyStabilizerTableson obsoletos y se eliminarán en una futura versión. En su lugar, debe utilizarse elPauliListdebe utilizarse. Con este cambio,table()ha quedado obsoleto, por lo que deberá operar directamente desdetableau()sin él.
Deprecaciones de Pulse
- Asignación de valores complejos a
ParameterExpressionen cualquier objeto Qiskit Pulse ahora plantea unPendingDeprecationWarning. Esto alineará el módulo Pulse con otros módulos en los que dicha asignación no era posible al principio. El caso típico de uso de parámetros complejos en el módulo era la biblioteca SymbolicPulse. A partir de Qiskit-Terra 0.23.0 todos los pulsos de la librería fueron convertidos de representación de amplitud compleja a representación real usando dos floats (amp,angle), como se usa en la claseScalableSymbolicPulse. Esto eliminó la necesidad de parámetros complejos. Cualquier uso de parámetros complejos (y en particular los pulsos personalizados) debe convertirse de forma similar para evitar el uso de parámetros complejos.
Corrección de errores
-
La clase
AmplitudeEstimationadvierte ahora correctamente si se pasa unEstimationProblemcon una propiedadis_good_stateestablecida se pasa como entrada, ya que no se admite y se ignora. Anteriormente, el algoritmo ignoraba silenciosamente esta opción, lo que daba lugar a resultados inesperados. -
QuantumCircuit.append()emitirá ahora correctamente un error si se le da un número incorrecto de bits clásicos para aplicar a una operación. Corrección #9385. -
En
BarrierBeforeFinalMeasurementsyMergeAdjacentBarrierstenían previamente un orden no determinista de sus instrucciones emitidasBarrieremitidas. Esto no cambiaba la semántica de los circuitos pero podía, en casos limitados en los que había barreras que no eran de ancho completo, hacer que pases posteriores del transpilador estocástico vieran un orden topológico diferente del circuito y, en consecuencia, tuvieran salidas diferentes para semillas fijas. Los pases se han hecho deterministas para evitarlo. -
El tipo de retorno de
run()será siempre el mismo que el de su primer argumento. Si se pasa un único circuito, se obtiene un único circuito; si se pasa una lista de circuitos, incluso de longitud 1, se obtiene una lista de circuitos. Ver #9798. -
Se ha corregido un error por el que
PauliOp.adjoint()no devolvía un valor correcto para Paulis con coeficientes complejos, comoPauliOp(Pauli("iX")). Corregido #9433. -
Se ha solucionado un problema con la función de cajón de circuitos
circuit_drawer()y el métodoQuantumCircuit.draw()cuando se mostraban parámetros de instrucción del tipoQuantumCircuitlo que provocaba un dibujo ilegible. Corregido #9908 -
Se ha solucionado un problema con la función de cajón de circuitos
circuit_drawer()y el métodoQuantumCircuit.draw()cuando se utilizaba el métodotexty el argumentovertical_compression="low", por el que se utilizaba un carácter incorrecto para la esquina superior derecha de los cuadros utilizados para representar las puertas del circuito. -
Se ha corregido un problema con el método
Gate.control()por el que anteriormente manejaba incorrectamente los tipos de entradastroNonepara el argumentoctrl_state. -
Se ha corregido un caso extremo en la construcción de instancias
Pauliuna cadena con una fase opcional y sin qubits es ahora una etiqueta válida, lo que hace que un operador sin qubits (comoPauli("-i")). Esto ya era posible cuando se utilizaban las formas de matriz, o rodajas vacías. Corregido #9720. -
Se ha corregido un problema al utilizar la macro
pulsemeasure()cuando se trabaja con un backend basado enBackendV2. Antes, al intentar utilizarqiskit.pulse.macros.measure()con un backend basado enBackendV2se producía un error. Corregido #9488 -
Se ha corregido un problema con la función
marginal_distribution()por el que se producía un error incorrecto cuando un diccionario de recuentos de entrada utilizaba un tipo numpy entero en lugar del tipo Python int. La función subyacente siempre manejaría los diferentes tipos correctamente, pero la comprobación del tipo de entrada antes lanzaba incorrectamente unTypeErroren este caso. -
Se ha corregido un error por el que
Parameter.is_real()no devolvíaNonecuando el parámetro no estaba vinculado. Corregido #8619. -
Los circuitos que contienen
C3SXGateOpenQASM 2.0 pueden ahora ser emitidos y leídos de nuevo de forma segura desde el exportador (QuantumCircuit.qasm()) y el analizador sintáctico (QuantumCircuit.from_qasm_str()). -
Se ha corregido un error en QPY (
qiskit.qpy) donde los circuitos que contienen puertas de claseMCXGate,MCXGrayCodeyMCXRecursive, yMCXVChainno se serializaban. Ver #9390. -
Corregidos los pases de ruta del transpilador
StochasticSwap,SabreSwap,LookaheadSwap, yBasicSwappara que siempre se produzca un errorTranspilerErrorcuando se llama a su respectivo método.run()si los pases se inicializaron concoupling_map=None. Anteriormente, estos pases lanzaban errores en este caso, pero todos eran causados por efectos secundarios y la excepción específica no era predecible. Corregido #7127 -
La configuración manual de un elemento en
QuantumCircuit.datapermitirá ahora correctamente que la operación sea cualquier objeto que implementeOperationy no sólo un objetocircuit.Instruction. Tenga en cuenta que cualquier mutación manual deQuantumCircuit.dataya que no suele ser más eficiente que crear un nuevo objeto circuito, puesto que comprobar las invariantes que rodean a los objetos parametrizados puede ser sorprendentemente caro. -
Se ha corregido un error al construir
DAGDependencydesde dentro delTemplateOptimizationque podía dar lugar a optimizaciones incorrectas. -
Se ha corregido un error en
TensoredOp.to_matrix()por el que el coeficiente global del operador se multiplicaba a la matriz final más de una vez. Ahora, el coeficiente global se aplica correclty, independientemente del número de operadores o estados tensados. Corregido #9398. -
Corregido el tratamiento de la fase global en el
UnrollCustomDefinitionssi la instrucción en cuestión tenía una fase global, pero ninguna instrucción en su campo de definición. -
Se han corregido las anotaciones de tipo de la función
transpile()función Ahora el tipo de retorno se reduce correctamente en función de si se ha pasado un solo circuito o una lista de circuitos. -
Se ha corregido un error por el que
IterativePhaseEstimationgeneraba un circuito erróneo, provocando el fallo del algoritmo en casos sencillos. Corregido #9280. -
Se ha corregido un error que permitía la emisión cuando se
PauliListse inicializaba a partir dePaulis o etiquetas. Por ejemplo, el códigoPauliList(["XXX", "Z"])ahora genera unValueErroren lugar de construir el equivalente dePauliList(["XXX", "ZZZ"]). -
El exportador OpenQASM 2 (
QuantumCircuit.qasm()) ya no emitirá definiciones duplicadas para las puertas que aparezcan en las definiciones de otras puertas. Véanse los números 7771, 8086, 8402, 8558 y 9805. -
El exportador de OpenQASM 2 (
QuantumCircuit.qasm()) manejará ahora definiciones múltiples y anidadas deUnitaryGate. Véanse los números 4623, 6712, 7772 y 8222. -
El exportador OpenQASM 2 (
QuantumCircuit.qasm()) mostrará ahora las definiciones de las puertas utilizadas sólo en las definiciones de otras puertas en el orden correcto. Ver #7769 y #7773. -
Las puertas estándar definidas por Qiskit, tales como
RZXGatetendrán ahora definiciones parametrizadas correctamente cuando se exporten utilizando el exportador OpenQASM 2 (QuantumCircuit.qasm()). Ver #7172. -
Los circuitos cuánticos de volumen (
QuantumVolume) son ahora compatibles con el exportador OpenQASM 2 (QuantumCircuit.qasm()). Véase #6466 y #7051. -
El exportador OpenQASM 2 ahora mostrará las puertas sin definición conocida con las declaraciones
opaque, en lugar de fallar. Ver #5036. -
Se ha corregido un problema que impedía el funcionamiento de
transpile()cuando se le pasaba una lista deCouplingMapse ha corregido. Ten en cuenta que pasar dicha lista de mapas de acoplamiento está obsoleto y no será posible a partir de Qiskit Terra 0.25. Corrige #9885. -
Antes de esta versión, el argumento
figsizedeplot_bloch_multivector()no era utilizado por la visualización, haciendo imposible cambiar su tamaño (por ejemplo, para reducirlo para estados de un solo qubit). Esta versión lo soluciona introduciendo un uso para el argumentofigsize. -
Se ha corregido un problema en
transpile()conoptimization_level=1(así como en los gestores de pases predefinidos devueltos porgenerate_preset_pass_manager()ylevel_1_pass_manager()) donde anteriormente si los argumentosrouting_methodylayout_methodno estaban establecidos y no había operaciones de flujo de control presentes en el circuito, entonces en los casos donde se requería enrutamiento elVF2PostLayouttranspiler pass no se ejecutaba. Esto es lo contrario de lo esperado, ya queVF2PostLayoutestá pensado para encontrar un diseño potencialmente mejor después de ejecutar una pasada heurística de diseño y enrutamiento. Corregido #9936 -
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. -
Se ha corregido un problema en los pases del tranpilador para los retardos de relleno, que no respetaba las restricciones del objetivo e insertaba retardos incluso para qubits que no admitían la instrucción
Delayinstrucción.PadDelayyPadDynamicalDecouplingse fijan de modo que no rellenen ningún tiempo de inactividad de los qubits tal que el objetivo no admita instruccionesDelaypara los qubits. También los pases de programación heredadosASAPScheduleyALAPSchedule, que rellenan internamente los retardos, se fijan del mismo modo. Además, se ha corregidotranspile()para que llame aPadDelaycon un objetotarget, de modo que funcione correctamente cuando se llame con la opciónscheduling_method. Corregido #9993 -
Se han corregido las anotaciones de tipo del método
QuantumCircuit.assign_parameters()para reflejar correctamente el cambio del tipo de retorno en función del valor del argumentoinplace. -
Se ha corregido un problema de escalado de rendimiento con el
VF2LayoutyVF2PostLayouten los gestores de pases preestablecidos ytranspile()que se producía al transpilar circuitos con muchos componentes conectados en dispositivos grandes. Ahora el transpilador pasa a establecer límites superiores en el número de diseños potenciales que se evaluarán. -
Se ha corregido un problema en la función
state_to_latex()que podía producir LaTeX no válidos debido al redondeo involuntario de los coeficientes. Esto también podría dar lugar a errores al llamar astate_drawer(). Corregido #9297.
Aer 0.12.0
No cambia
IBM Proveedor Q 0.20.2
No cambia