Skip to main content
IBM Quantum Platform

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 dump ha aumentado a 8. Esta nueva versión del formato añade soporte para serializar el atributo QuantumCircuit.layout atributo.

Corrección de errores

  • Corregida la deserialización de DiagonalGate instancias 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 BasicSwap que impedía que el método BasicSwap.run() funcionara si el argumento de la palabra clave fake_run se establecía en True al instanciar la clase. Corregido #10147

  • Se ha corregido un problema al copiar circuitos con el nuevo estilo Clbits y Qubits (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 CheckMap ya 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() y measure_all() cuando las funciones se llaman con el BackendV2 backend.

  • 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.primitives ya no provocará advertencias de obsoleto derivadas del módulo obsoleto qiskit.opflow obsoleto. Estas advertencias habrían quedado ocultas para los usuarios por los filtros predeterminados de Python, pero activaron la importación ansiosa de opflowlo 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 clase GroverOperator podrí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 UnitarySynthesis al utilizar el parámetro target , por el que los circuitos con flujo de control no se asignaban correctamente al objetivo.

  • Corregido error en VQD donde result.optimal_values era una copia de result.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 ParameterExpression en un float o int concreto fallaba, por ejemplo porque la expresión era naturalmente un número complejo. Corregido #9187

  • Fijo float conversiones para ParameterExpression que 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, y ParameterExpression.is_real() verdadero. Corregido #10191

  • Corregida la qpy serialización de QuantumCircuit.layout atributo. Anteriormente, el atributo layout al 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-cu11 y el uso del paquete qiskit-aer-gpu ahora requiere CUDA 12. Si ya es usuario del paquete qiskit-aer-gpu y desea utilizar CUDA 11 tendrá que ejecutar:

    pip uninstall qiskit-aer-gpu && pip install -U qiskit-aer-gpu-cu11

    para pasar de las versiones anteriores del paquete qiskit-aer-gpu compatible 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 paquete qiskit-aer-gpu con 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 incluyen AerCircuits. Esta confirmación hace que los resultados sean serializables eliminando AerCircuits 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.qubits para 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-aer

e importarlo como:

import qiskit_aer

A 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 Estimator cuando abelian_grouping=True.

Notas de actualización

  • Mejora del rendimiento cuando se pasan los mismos circuitos y múltiples parámetros a Estimator con approximation=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 en AER::Transpile::CircuitOptimization. Originalmente json_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::CircuitOptimization no copia AER::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 AerSimulator modificaba 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 actualiza NoiseModel.from_backend() y basic_device_gate_errors() para que añadan una identidad QuantumError (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.

  • AerCircuit se 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ñade barrier() 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 especifica run_options . Esta corrección permite simular Qobj sin run_options.

  • Desde 0.12.0, AerConfig se 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.

  • QuantumCircuit admite 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 obsoleto omp_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 de Instruction en el circuito, en lugar de vincular los valores dentro de una instancia ParameterExpression. Este cambio debería tener poco impacto en el usuario, ya que float(QuantumCircuit.data[i].operation.params[j]) sigue produciendo un float (y es la única forma de acceder al valor de un archivo ParameterExpression). Además Instruction() ya pueden ser float así como a ParameterExpressionpor 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 utiliza isinstance para comprobar la existencia de ParameterExpression y se comporte de forma diferente en función del resultado. Además, qpy serializa el valor numérico en un bound ParameterExpression con una precisión diferente a la de float (véase también la nota de corrección de errores relacionada sobre QuantumCircuit.assign_parameters()).

Corrección de errores

  • Actualizado plot_gate_map(), plot_error_map()y plot_circuit_layout() para soportar mapas de acoplamiento de 433 qubit heavy-hex. Esto permite acoplar visualizaciones de mapas para IBM Quantum 's ibm_seattle backend.

  • 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 a QuantumCircuit.assign_parameters().

  • Se ha corregido un error en BlockCollapser por el que se ignoraban los bits clásicos al colapsar un bloque de nodos.

  • Se ha corregido un error en replace_block_with_op() y replace_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 atributo SwitchCaseOp.target del subcircuito no se asignaba correctamente a un registro del circuito base.

  • Se ha corregido un error en RZXCalibrationBuilder por 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 esperado MissingOptionalLibrary. Corregido #10079

  • El uso de initial_layout en las llamadas a transpile() 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 comportamiento QuantumCircuit.mcrz() comportamiento, utilice QuantumCircuit.mcp().

  • Se ha corregido un problema con el PassManagerConfig.from_backend() al construir un objeto PassManagerConfig a partir de una instancia BackendV1 que no tenía definido un atributo de mapa de acoplamiento. Anteriormente, el constructor creaba incorrectamente un objeto CouplingMap con 0 qubits en lugar de utilizar None. 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 Optimize1qGatesDecomposition en paralelo se producía un error debido a que OneQubitGateErrorMap no era seleccionable.

  • Corregir un error en el VF2Layout y VF2PostLayout que 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:

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()y deprecate_func() al módulo qiskit.utils mó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 en help(). Los decoradores de desaprobación de qiskit.utils llaman a add_deprecation_to_docstring() ya lo hacen por ti; pero puedes llamarlo directamente si utilizas mecanismos diferentes para las deprecaciones.

    @deprecate_func sustituye a @deprecate_function y se utiliza para eliminar una función completa. Generará automáticamente la mayor parte de los mensajes de desaprobación.

    @deprecate_arg sustituye a @deprecate_arguments y 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 un predicate para 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 HLSConfig la 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 de HighLevelSynthesisPlugin y 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 de HighLevelSynthesisPlugin. 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 CouplingMap para tener una conectividad disjunta. Anteriormente, un CouplingMap sólo podía construirse si el grafo era conexo. Esto permitirá utilizar CouplingMap para 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 de CouplingMap subgrafos componentes de un CouplingMap. Si el objeto CouplingMap objeto está conectado, devolverá un único CouplingMap equivalente al original.

  • Añadidas nuevas reglas a la EquivalenceLibrary instancia: qiskit.circuit.equivalence_library.SessionEquivalenceLibrary. Las nuevas normas añadidas son:

  • Añadidos plugins de síntesis de alto nivel para LinearFunction y para qiskit.quantum_info.Cliffordampliando el conjunto de métodos de síntesis que se pueden llamar desde el HighLevelSynthesis transpiler pass.

    Para LinearFunction los plugins disponibles se enumeran a continuación:

    Nombre de plugin
    Plugin de síntesis de alto nivel
    defaultDefaultSynthesisLinearFunction
    kmsKMSSynthesisLinearFunction
    pmhPMHSynthesisLinearFunction

    Para qiskit.quantum_info.Clifford los plugins disponibles se enumeran a continuación:

    Nombre de plugin
    Plugin de síntesis de alto nivel
    defaultDefaultSynthesisClifford
    agAGSynthesisClifford
    bmBMSynthesisClifford
    greedyGreedySynthesisClifford
    layersLayerSynthesisClifford
    lnnLayerLnnSynthesisClifford

    Consulte la documentación qiskit.synthesis para 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, MinimumPoint que se utiliza principalmente como un pase para comprobar una condición de bucle en un archivo PassManager. 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étodo FixedPoint que 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ón DAGCircuit para 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 a DAGCircuitError .

  • 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, y synth_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 CRZGate a RZZGate más RZGate o a CRYGate a un solo RZXGate má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, a circuit_to_dag() para permitir opcionalmente desactivar la copia profunda de las operaciones de la entrada QuantumCircuit a la salida QuantumCircuit. 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 entrada QuantumCircuit se descarta.

  • Se ha añadido una nueva opción, copy_operations, a dag_to_circuit() para permitir opcionalmente desactivar la copia profunda de las operaciones de la entrada DAGCircuit a la salida QuantumCircuit. En los casos en que la entrada DAGCircuit ya 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 entrada DAGCircuit se descarta.

  • Se ha añadido una nueva función passmanager_stage_plugins() al módulo qiskit.transpiler.preset_passmanagers.plugin mó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 Error ahora también acepta entradas invocables para su parámetro msg . Si se utilizan estas llamadas de entrada se les pasará el atributo property_set del 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_pass en un gestor de pases, se producirá un error utilizando el mensaje "The circuit size is: n" donde n es el tamaño de circuito establecido en el conjunto de propiedades (normalmente de la ejecución anterior del Size pass).

  • El método build_coupling_map() tiene una nueva palabra clave como argumento, filter_idle_qubits que cuando se establece en True eliminará cualquier qubits de la salida CouplingMap que no admitan ninguna operación.

  • El GateDirection transpiler pass puede ahora manejar correctamente SwapGate que 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 RZXCalibrationBuilder y RZXCalibrationBuilderNoEcho utilizan ahora correctamente un ECRGate para la puerta de enredo si la puerta de enredo nativa del backend es ECRGate. Anteriormente, los pases sólo funcionaban correctamente si la puerta de enredo era CXGate.

  • Se ha añadido un nuevo constructor para la clase Target clase Target.from_configuration()que permite construir un objeto Target a 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 Target que tiene UGate, CXGatey Measure disponibles 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 en qiskit.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-5 QuantumVolume para un mapa de acoplamiento pesado-hex de 1081 qubits se reduce aproximadamente a la mitad.

  • El rendimiento en tiempo de ejecución del Optimize1qGatesDecomposition transpilador 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 de transpile() con la palabra clave optimization_level definida como 1, 2 o 3.

  • 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 SabreLayout pass ahora admite la ejecución contra un objetivo con un archivo CouplingMap. Al apuntar a un acoplamiento disjunto, la entrada DAGCircuit se divide en sus componentes conectados de qubits virtuales, cada componente se asigna a los componentes conectados de la entrada CouplingMapa 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 argumento routing_pass el 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.passes admiten ahora la aceptación de un objeto Target que se utiliza para modelar las restricciones de un backend de destino a través del primer argumento posicional (actualmente denominado coupling_map o backend_properties).

    La lista de pases con el nuevo soporte para Target son:

  • La función de ayuda a la construcción del gestor de pases generate_embed_passmanager() ahora también aceptará un Target como único argumento posicional (actualmente denominado coupling_map). Esto se puede utilizar para construir una incrustación de diseño PassManager a partir de un objeto Target en lugar de a partir de un objeto CouplingMap.

  • Los siguientes pases del transpilador de diseño y enrutamiento de los módulos qiskit.transpiler.passes tienen un nuevo argumento de palabra clave, target , que recibe un objeto Target que se utiliza para modelar las restricciones de un backend de destino. Si se especifica el argumento de la palabra clave target , 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 atributo CouplingMap, InstructionScheduleMap o una lista de puertas base. La lista de estos pases con el nuevo argumento target son:

  • La función de ayuda a la construcción del gestor de pases generate_scheduling() tiene un nuevo argumento de palabra clave target que se utiliza para especificar un objeto Target para modelar las restricciones del backend de destino para el que se está compilando al generar un nuevo archivo PassManager. Si se especifica, este nuevo argumento sustituirá al otro argumento inst_map.

  • El plugin default utilizado por el UnitarySynthesis transpiler pass ahora elige síntesis unitarias de uno y dos qubits basándose en las tasas de error reportadas en el archivo Target. 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 UnitarySynthesisPlugin tiene dos nuevas propiedades opcionales supports_gate_lengths_by_qubit y supports_gate_errors_by_qubit que, cuando se definen, añaden los campos gate_lengths_by_qubit y gate_errors_by_qubit respectivamente a las opciones de entrada del método run() del complemento. Estos nuevos campos son una vista alternativa de los datos proporcionados por gate_lengths y gate_errors , pero en su lugar tienen la forma: {(qubits,): [Gate, length]} (donde Gate es la instancia de Gate para 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 cualquier ForLoopOp en un circuito. Esta pasada desenrolla los bucles for cuando es posible, si no hay bucles ContinueLoopOp o BreakLoopOp dentro 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")
    _images/legacy_release_notes-1.png
  • Se ha añadido un nuevo parámetro max_trials para pasar VF2PostLayout que, 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 existentes call_limit y time_limit (que se utilizan para limitar el número de visitas de estado realizadas por el algoritmo VF2 y el tiempo total empleado por pass VF2PostLayoutrespectivamente) 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 CheckMap transpiler 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 un PassManager en 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 instancia QuantumCircuit instancia.

  • Se ha añadido un nuevo atributo layouta la clase QuantumCircuit clase. Este atributo suele rellenarse con transpile() o PassManager.run() (cuando la Etapa de diseño y la Etapa de enrutamiento se ejecutan en la fase PassManager) y contiene un TranspileLayout que contiene la información sobre la permutación del circuito de entrada durante transpile().

  • Se ha añadido un nuevo argumento, var_order, al constructor de la clase PhaseOracle para 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 entrada qasm2.load() y qasm2.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() y QuantumCircuit.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 la qiskit.qasm2 para más detalles y ejemplos.

  • Mejorar la descomposición de rotaciones Pauli-X y Pauli-Y multicontroladas con QuantumCircuit.mcrx() y QuantumCircuit.mcry on :math:`n() controles a 16n4016n - 40 puertas CX, para n4n \geq 4. Esta mejora se basa en arXiv:2302.06377.

  • Qiskit ahora soporta la representación de switch declaraciones, utilizando el nuevo 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. Múltiples valores pueden apuntar al mismo circuito, y CASE_DEFAULT puede 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 switch tiene soporte en toda la pila del compilador Qiskit; puedes transpile() que la contengan (si el backend anuncia su soporte para la construcción), y se serializará a QPY.

    La declaración switch no 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 enunciado switch (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_threshold a la clase AdaptVQE para 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_threshold a la clase AdaptVQE que sustituirá al atributo threshold en el futuro. Este nuevo atributo se comporta igual que el existente threshold pero 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_state que permite comprobar si un EstimationProblem tiene un EstimationProblem.is_good_state o si es el predeterminado. Esto es útil para comprobaciones en estimadores de amplitud, como AmplitudeEstimationque sólo admiten la implementación por defecto.

  • Añade una bandera local a la clase ComputeUncompute que 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 TrotterQRTE clase. Para facilitar el trabajo con esto, se ha añadido el atributo num_timesteps y un argumento de palabra clave coincidente al constructor TrotterQRTE para 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 TrotterQRTE clase. El atributo TimeEvolutionProblem.aux_operators se evalúa en cada paso temporal si el atributo ProductFormula.reps del argumento de entrada product_formula en el constructor se establece en 1.

  • Se han añadido extensiones al VQD algoritmo, que permiten pasar una lista de optimizadores y puntos iniciales para las distintas ejecuciones de minimización. Por ejemplo, el k-ésimo punto inicial y k-ésimo optimizador se utilizarán para la optimización del k-1-ésimo estado exicted.

Características de la información cuántica
  • Añadidos dos nuevos métodos constructores Clifford.from_matrix() y Clifford.from_operator()que crean un objeto Clifford a partir de su matriz unitaria y su representación de operador, respectivamente.

  • El constructor de Clifford ahora puede tomar cualquier objeto puerta Clifford de hasta 3 qubits siempre que implemente un método to_matrix , incluyendo puertas parametrizadas como Rz(pi/2), que antes no eran convertibles.

  • Añadidas nuevas funciones de utilidad: commutator(), anti_commutator()y double_commutator() que se utilizan para calcular conmutadores para cualquier objeto que implemente la clase base abstracta LinearOp como QuantumChannel, SparsePauliOp, o ScalarOp.

  • 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 {II,XX,YY,ZZ}\{II, XX, -YY, ZZ\} y, por lo tanto, puede ser generado por [XX,ZZ][XX, ZZ], [XX,YY][XX, -YY] o [YY,ZZ][-YY, ZZ].

  • Añadido un nuevo método, partial_transpose()al módulo qiskit.quantum_info del módulo DensityMatrix del 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 P.O.PP^\dagger.O.P 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 SparsePauliOp objetos con ParameterExpression coeficientes, 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 y SparsePauliOp.parameters para asignar y consultar parámetros no enlazados dentro de un archivo SparsePauliOp. 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 SymbolicPulse clases 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 fase Sawtooth , el comportamiento es idéntico al de la función generadora de forma de onda correspondiente (p. ej. sin()). La fase para la clase Sawtooth se define de tal manera que una fase de 2π2\pi se desplaza un ciclo completo.

  • Añadido soporte a QPY (qiskit.qpy) para trabajar con instancias pulse ScheduleBlock con 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 un Target objeto 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 BackendV2Converter tiene un nuevo argumento de palabra clave, filter_faulty, en su constructor. Cuando este argumento se establece en True , la clase de conversor filtrará cualquier qubit u operación que aparezca como no operativa en la carga útil BackendProperties carga útil de la entrada BackendV1. Aunque no se utiliza mucho, un objeto BackendProperties permite anotar tanto qubits como puertas como no operativos. Anteriormente, si un backend había establecido esa bandera en cualquier qubits o puertas la salida BackendV2 instancia y su Target incluí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 archivo Target. 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 archivo Target.

  • La clase Options implementa el protocolo Mapping y el método __setitem__ . Esto significa que Options ofrecen 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 una StagedPassManager instancia. 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ón plot_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 nn qubits y figsize se fija en (w, h), entonces la anchura total de la figura se fija en nwn \cdot w, mientras que la altura total se fija en hh.

  • Se ha añadido un nuevo argumento de palabra clave, font_size, a la función plot_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_size y title_pad, a la función plot_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() y BaseEstimator.run() no se bloquean hasta que se llama al método PrimitiveJob.result() .

Notas sobre la actualización del transpilador
  • El número máximo de ensayos evaluados al buscar la mejor disposición utilizando VF2Layout y VF2PostLayout está ahora limitado en level_1_pass_manager(), level_2_pass_manager()y level_3_pass_manager() a 2 500, 25 000, y 250 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 manualmente VF2PostLayout sobre el circuito transpilado en modo estricto, especificando 0 para max_trials.

  • El atributo condition de la clase DAGDepNode ha sido eliminado. Se marcó como obsoleto en la versión 0.18 (07-2021). En su lugar, debe utilizar el atributo condition del atributo op para 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 metadata tanto en DAGCircuit y DAGDependency se ha cambiado de None a {} por compatibilidad con el atributo metadata correspondiente de QuantumCircuit.

  • 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 utilice CouplingMap() == CouplingMap() para comprobar la igualdad de objetos debe actualizarse a CouplingMap() is CouplingMap().

  • Al ejecutar la función transpile() con un backend basado en BackendV1 o con un argumento BackendProperties mediante la palabra clave backend_properties que 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 que transpile() 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 en BackendProperties para marcar un qubit o una puerta como defectuosos. Si confiaba en que transpile() para hacer este re-mapeo por ti, ahora tendrás que hacerlo manualmente y pasar una entrada mapeada a los argumentos coupling_map y backend_properties que 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 SabreSwap y SabreLayoutque 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 QuantumCircuit metadata devuelve siempre un diccionario y sólo puede definirse como un diccionario. Anteriormente, su valor por defecto era None, y podía fijarse manualmente en None o en un diccionario.
Notas sobre la actualización de algoritmos
  • Los módulos obsoletos factorizers y linear_solvers, que contenían HHL y Shor han sido eliminados de qiskit.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 muestra KeyError ni ValueError cuando faltan qubits en la instrucción de destino o no se proporciona inst_name_map para la instrucción indefinida. En el primer caso, simplemente ignora la entrada InstructionScheduleMappara 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 personalizado Gate personalizado a partir del nombre del programa si no se encuentra ninguna asignación.
Notas de actualización para proveedores
  • El argumento obsoleto max_credits de execute(), assemble() y todas las configuraciones de Qobj (p. ej. QasmQobjConfig y PulseQobjConfig). 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 campo max_credits formaba 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 de BackendV2 exponga un campo max_credits en su objeto Options objeto.

  • El atributo name en las clases BackendV2 basado en clases de backend falsas en qiskit.providers.fake_provider han cambiado con respecto a versiones anteriores. Anteriormente, los nombres tenían un sufijo "_v2" para diferenciar la clase de la BackendV1 versió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

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_alignment en la clase Target se ha sustituido por la ortografía correcta acquire_alignment. Los antiguos argumentos del constructor aquire_alignment y Target.aquire_alignment están obsoletos y serán eliminados en una futura versión. Utilice Target.acquire_alignment para obtener y establecer el valor de la restricción de alineación.

Circuitos obsoletos
  • Ajuste del QuantumCircuit metadata a None ha 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
Depreciación de la información cuántica
  • PauliTable y StabilizerTable son obsoletos y se eliminarán en una futura versión. En su lugar, debe utilizarse el PauliList debe utilizarse. Con este cambio, table() ha quedado obsoleto, por lo que deberá operar directamente desde tableau() sin él.
Deprecaciones de Pulse
  • Asignación de valores complejos a ParameterExpression en cualquier objeto Qiskit Pulse ahora plantea un PendingDeprecationWarning. 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 clase ScalableSymbolicPulse . 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 AmplitudeEstimation advierte ahora correctamente si se pasa un EstimationProblem con una propiedad is_good_state establecida 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 BarrierBeforeFinalMeasurements y MergeAdjacentBarriers tenían previamente un orden no determinista de sus instrucciones emitidas Barrier emitidas. 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, como PauliOp(Pauli("iX")). Corregido #9433.

  • Se ha solucionado un problema con la función de cajón de circuitos circuit_drawer() y el método QuantumCircuit.draw() cuando se mostraban parámetros de instrucción del tipo QuantumCircuit lo 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étodo QuantumCircuit.draw() cuando se utilizaba el método text y el argumento vertical_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 entrada str o None para el argumento ctrl_state .

  • Se ha corregido un caso extremo en la construcción de instancias Pauli una cadena con una fase opcional y sin qubits es ahora una etiqueta válida, lo que hace que un operador sin qubits (como Pauli("-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 en BackendV2 . Antes, al intentar utilizar qiskit.pulse.macros.measure() con un backend basado en BackendV2 se 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 un TypeError en este caso.

  • Se ha corregido un error por el que Parameter.is_real() no devolvía None cuando 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 clase MCXGate, MCXGrayCodey MCXRecursive, y MCXVChain no se serializaban. Ver #9390.

  • Corregidos los pases de ruta del transpilador StochasticSwap, SabreSwap, LookaheadSwap, y BasicSwap para que siempre se produzca un error TranspilerError cuando se llama a su respectivo método .run() si los pases se inicializaron con coupling_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.data permitirá ahora correctamente que la operación sea cualquier objeto que implemente Operationy no sólo un objeto circuit.Instruction. Tenga en cuenta que cualquier mutación manual de QuantumCircuit.data ya 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 DAGDependency desde dentro del TemplateOptimization que 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 UnrollCustomDefinitions si 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 IterativePhaseEstimation generaba 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 PauliList se inicializaba a partir de Paulis o etiquetas. Por ejemplo, el código PauliList(["XXX", "Z"]) ahora genera un ValueError en lugar de construir el equivalente de PauliList(["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 de UnitaryGate. 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 de CouplingMap se 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 figsize de plot_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 argumento figsize .

  • Se ha corregido un problema en transpile() con optimization_level=1 (así como en los gestores de pases predefinidos devueltos por generate_preset_pass_manager() y level_1_pass_manager()) donde anteriormente si los argumentos routing_method y layout_method no estaban establecidos y no había operaciones de flujo de control presentes en el circuito, entonces en los casos donde se requería enrutamiento el VF2PostLayout transpiler pass no se ejecutaba. Esto es lo contrario de lo esperado, ya que VF2PostLayout está 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 Statevector a partir de un QuantumCircuit que 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 Delay instrucción. PadDelay y PadDynamicalDecoupling se fijan de modo que no rellenen ningún tiempo de inactividad de los qubits tal que el objetivo no admita instrucciones Delay para los qubits. También los pases de programación heredados ASAPSchedule y ALAPSchedule, que rellenan internamente los retardos, se fijan del mismo modo. Además, se ha corregido transpile() para que llame a PadDelay con un objeto target , de modo que funcione correctamente cuando se llame con la opción scheduling_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 argumento inplace .

  • Se ha corregido un problema de escalado de rendimiento con el VF2Layout y VF2PostLayout en los gestores de pases preestablecidos y transpile()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 a state_drawer() . Corregido #9297.

Aer 0.12.0

No cambia

IBM Proveedor Q 0.20.2

No cambia

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.