Skip to main content
IBM Quantum Platform

Qiskit SDK 2.3 notas de la versión


2.3.1

Preludio

Qiskit v2.3.1 corrige varios errores detectados desde el lanzamiento de Qiskit v2.3.0.

Corrección de errores

  • El complemento de síntesis permutation.kms integrado en ahora qiskit.synthesis gestionará correctamente las permutaciones de longitud cero. Se ha solucionado el problema n.º 15550.

  • Fijo synth_clifford_depth_lnn() para Cliffords de un solo qubit. Véase el n.º 15780.

  • Se ha corregido un error en la fase HighLevelSynthesis del transpilador por el que los estados de los qubits no se actualizaban correctamente tras sintetizar una operación de forma recursiva. En algunos casos, esto podría dar lugar a que el paso genere circuitos incorrectos.

  • Se ha corregido un problema en la qs_decomposition() función por el que posibles errores de tolerancia en las rutinas internas de álgebra lineal provocaban un error grave, lo que hacía que el programa se colgara. Esto se ha corregido, de modo que en estas situaciones se genera en su lugar una excepción adecuada QiskitError o una subclase de la misma.

    Se ha solucionado el problema n.º 15610.

  • La síntesis predeterminada de una puerta UnitaryGate «when access» UnitaryGate.definition y de una puerta «calling» UnitaryGate.control() para puertas que involucran más de dos qubits se basará internamente en la qs_decomposition() función. En algunas situaciones, debido a la tolerancia inherente al sistema de coma flotante que se aplica en las rutinas de álgebra lineal de la descomposición iterativa de Shannon-Quantum, es posible que el cálculo no siempre se realice correctamente. Para evitar que estos atributos o métodos fallen, en tales situaciones se recurre en su lugar Isometry a la descomposición de. Aunque esto da lugar a una descomposición menos eficiente, qs_decomposition() servirá como alternativa cuando qs_decomposition() falle.

  • Se ha corregido un error por ParameterExpression.sympify() el que, en determinadas combinaciones de Parameter, ParameterExpression y valores numéricos, las operaciones aritméticas asimétricas (como ** o -) podían invertir el orden de los operandos. Véase el n.º 15642.

  • Se ha corregido un error qk_obs_term() al acceder a un término observable de identidad. Véase el n.º 15536.

  • Se ha corregido un error de visualización en plot_state_qsphere() el que los estados entrelazados simétricos (como los estados de Bell) se giraban arbitrariamente debido al ruido de coma flotante.

  • Corrigido QuantumCircuit.repeat() para circuitos con puertas parametrizadas.

    Véase el n.º 15645.

  • Corrige un error que provocaba qpy.load() que se colgara en circuitos creados con QuantumCircuit.ensure_physical() cuando existía un registro creado por el usuario llamado «ancilla».

  • Se ha corregido BreakLoopOp el hecho de ContinueLoopOp que, en determinadas pasadas del transpilador, se consideraran erróneamente operaciones de flujo de control, lo que podía dar lugar a que AttributeError se generara un. Véase el n.º 15579.

  • Corrige un error que provocaba qpy.load() que se colgara en circuitos creados con SabreLayout cuando existía un registro creado por el usuario llamado «ancilla».

  • La versión mínima requerida de NumPy ahora aparece correctamente como 1.21 (en lugar de 1.17 ). Este límite lleva vigente desde hace varias versiones debido al uso de numpy.typing.NDArray, que se introdujo en NumPy 1.21, por lo que Qiskit no se podría importar con versiones anteriores de NumPy.

  • El exportador de « OpenQASM » 3 (qasm3.dumps() y dump()) ahora escapará correctamente los caracteres Unicode de «número» que no sean dígitos ASCII, cuando se utilicen en identificadores. Anteriormente, los caracteres como los superíndices se mantenían en el resultado, lo cual no es válido en la versión 3 de OpenQASM.

  • El exportador de « OpenQASM 3» (qasm3.dumps() y dump()) ahora escapará correctamente los identificadores cuyo nombre comience con un dígito ASCII.

  • Los métodos SparsePauliOp.from_list() y SparsePauliOp.from_sparse_list() ahora deducen automáticamente el tipo de datos de los coeficientes si no se especifica el dtype argumento.

    Por ejemplo:

    from qiskit.quantum_info import SparsePauliOp
    from qiskit.circuit import Parameter
    
    theta = Parameter("theta")
    
    # Previously required manually setting dtype=object
    op_list = SparsePauliOp.from_list([("X", theta)])
    op_sparse = SparsePauliOp.from_sparse_list([("X", [0], theta)], num_qubits=1)

2.3.0

Preludio

Qiskit v2.3.0 es una nueva versión de la biblioteca de computación cuántica de Google ( Qiskit SDK ).

Esta nueva versión amplía considerablemente la API de C para la transpilación, lo que permite inspeccionar más elementos de Target (QkTarget) desde C y crear DAGCircuit y manipular (QkDag). Esto permite escribir pasadas de transpilador personalizadas al compilar con el objeto libqiskit independiente. La API de C incluye funciones específicas para cada etapa de la transpilación (por ejemplo, qk_transpile_stage_layout()), lo que facilita la incorporación de lógica personalizada en la transpilación sin tener que recrear todo el proceso manualmente.

También se ha mejorado el rendimiento y el conjunto de funciones de la transpilación a destinos tolerantes a fallos en fase temprana. Con la nueva PauliProductMeasurement instrucción, que representa una transformación proyectiva a una base de producto de Pauli, Qiskit ahora admite plenamente la transpilación de circuitos a una base de cálculo basada en Pauli utilizando el paso LitinskiTransformation existente. El nuevo método de síntesis unitaria, RossSelingerSynthesis, que se puede configurar en el transpilador mediante unitary_synthesis_method="gridsynth", permite utilizar el algoritmo de Ross-Selinger, asintóticamente óptimo, para la síntesis de Clifford+T de un solo qubit. Otras mejoras incluyen, por ejemplo, un mejor OptimizeCliffordT paso o el CommutativeOptimization paso, que tiene en cuenta las optimizaciones conmutativas de los circuitos basados en Pauli.

A nivel interno, la representación de ControlFlowOp los objetos ha pasado a ser nativa de Rust. Esta transformación aún no se ha completado; es posible que se observe una cierta disminución del rendimiento en Qiskit 2.3 en lo que respecta a las operaciones de flujo de control. Las versiones posteriores de Qiskit deberían ir más allá y resolver los problemas de rendimiento y API que llevan tiempo planteándose en torno a las operaciones de flujo de control.

Tenga en cuenta que, a partir de esta versión, Python 3.9 ya no es compatible debido a que ha superado su vida útil en octubre de 2025, y macOS en procesadores Intel se ha degradado a soporte de plataforma de nivel 2 debido a que Apple ha comenzado a retirar la plataforma. Se admiten todas las versiones de CPython a partir de 3.10. Consulte Compatibilidad con sistemas operativos para conocer los niveles de compatibilidad actuales de las diferentes plataformas.

Habrá más lanzamientos de funciones de Qiskit en la serie « 2.x »; no esperamos lanzar Qiskit 3.0 hasta mucho más adelante, en 2026, ya que actualmente no hay necesidad de realizar cambios importantes.

Características de la API C

Características de los circuitos

  • Se ha añadido una nueva clase de instrucción, PauliProductMeasurement, que representa una medición proyectiva conjunta sobre varios qubits, en la que la observable medida es un producto tensorial de operadores de Pauli. El resultado de esta medición es un único valor propio, ya sea +1+1 o 1-1, que indica el estado propio del producto de Pauli.

    Para obtener más información, consulte «A Game of Surface Codes: Large-Scale Quantum Computing with Lattice Surgery» (Un juego de códigos superficiales: computación cuántica a gran escala con cirugía de red), de Daniel Litinski.

    Se PauliProductMeasurement puede instanciar un a partir de un Pauli, donde el Pauli puede incluir una fase de 1-1, pero no de ii ni de i-i. La instrucción tiene el mismo número de qubits que el Pauli, además de un único bit clásico.

    Por ejemplo:

    from qiskit.circuit import QuantumCircuit
    from qiskit.quantum_info import Pauli
    from qiskit.circuit.library import PauliProductMeasurement
    
    ppm = PauliProductMeasurement(Pauli("XZ"))
    
    qc = QuantumCircuit(6, 2)
    qc.append(ppm, [4, 1], [1])
  • Un nuevo QuantumCircuit.to_dag() método ofrece ahora una cómoda envoltura para circuit_to_dag().

  • ParameterExpression ahora tiene un num_parameters atributo que es igual a la longitud de su parameters conjunto, pero que se calcula con menos sobrecarga.

OpenQASM Características

  • El exportador « OpenQASMqasm2.dumps()2» ahora admite la generación de bloques sencillos de IfElseOp una sola instrucción, siempre que la condición sea una simple comprobación de igualdad entre un registro y un entero. Esto se corresponde con lo que puede representar el lenguaje de la « OpenQASM e 2».

Características de QPY

  • La versión 17 de QPY incluye ahora formatos de serialización para SparseObservable objetos cuando se utilizan como parámetros de otros objetos. En concreto, esto permite serializar PauliEvolutionGate objetos que utilizan internamente este operador, y se actualiza la carga útil de la puerta de evolución.

Características de la información cuántica

  • Añadido Statevector.from_circuit() como réplica de Operator.from_circuit(). Esto permite instanciar directamente un Statevector en el espacio de los qubits virtuales, incluso en el caso de circuitos que se hayan transpuesto a un espacio de qubits físicos.

  • Se ha mejorado el rendimiento de Clifford.dot() y de Clifford.compose() cuando se invocan con front=True y un QuantumCircuit que contiene únicamente puertas de Clifford. Anteriormente, el circuito se incorporaba primero por completo a un Clifford objeto y, a continuación, se combinaban los dos objetos. Ahora, la base Clifford se actualiza de forma iterativa, lo que resulta considerablemente más rápido en el caso de circuitos pequeños.

  • Se ha añadido el PauliLindbladMap.parity_sample() método. Este método es muy similar al método ya PauliLindbladMap.signed_sample() existente; sin embargo, utiliza una convención de signos más coherente con el resto de Qiskit, por lo que es el método recomendado de ahora en adelante. Dispone de argumentos opcionales adicionales para aplicar escalas a las tasas al realizar el muestreo sin modificar la instancia.

  • Varias de las funciones quantum_info «predicadas», como is_identity_matrix(), se optimizaron para evitar asignaciones de matrices innecesarias.

Características de síntesis

  • Se ha añadido gridsynth_rz(), que construye un circuito cuántico de un solo qubit que aproxima una rotación RZ con un ángulo especificado. El algoritmo se describe en el artículo «Optimal ancilla-free Clifford+T approximation of z-rotations», de Neil J. Ross y Peter Selinger, y está implementado en https://github.com/qiskit-community/rsgridsynth.

  • Se ha añadido gridsynth_unitary(), que construye un circuito cuántico de un solo qubit que aproxima una matriz unitaria de un solo qubit dada. El algoritmo funciona descomponiendo la matriz unitaria en una rotación RZ, una rotación RX y otra rotación RZ, y aplicando el algoritmo de Ross-Selinger a cada una de las tres rotaciones.

  • El algoritmo general de síntesis unitaria se qs_decomposition() ha reescrito en Rust, lo que ha mejorado considerablemente el rendimiento en tiempo de ejecución de la función.

Características del transpilador

  • Se ha añadido una nueva pasada del transpilador, CommutativeOptimization, que realiza la cancelación y la fusión de puertas aprovechando las relaciones de conmutatividad. El pase unifica y amplía las funciones tanto de como CommutativeCancellation de CommutativeInverseCancellation.

    En concreto, el pase:

    • Cancela pares de puertas inversas, incluidos los pares que son inversos hasta una fase global (ajustando la fase global si es necesario).
    • Intenta fusionar puertas consecutivas cuando sea posible, por ejemplo, secuencias de puertas RZ, puertas RX, rotaciones de Pauli, etc.
  • Se ha añadido una nueva opción, fallback_on_default, a la fase UnitarySynthesis del transpilador. Esta opción se aplica cuando se invoca el paso con un complemento de síntesis distinto del predeterminado, especificado mediante el argumento method.

    Por defecto, se utiliza el complemento especificado para sintetizar cada operación unitaria del circuito (siempre que el complemento sea aplicable; por ejemplo, no se ejecutará si no admite el número de qubits sobre los que se define la operación unitaria). Si el complemento no puede sintetizar el operador unitario y devuelve None, el operador unitario original permanece sin cambios en el circuito. Cuando fallback_on_default se establece en True, el filtro invocará DefaultUnitarySynthesis el complemento en caso de que falle el método especificado.

    Esta función resulta especialmente útil cuando los complementos personalizados están diseñados para gestionar solo un subconjunto de todas las unidades: los usuarios pueden confiar en su lógica personalizada cuando sea aplicable y utilizar la síntesis predeterminada cuando no lo sea.

  • Se ha añadido un nuevo complemento de síntesis unitaria, RossSelingerSynthesis, que sintetiza puertas unitarias de un solo qubit utilizando el algoritmo de Ross-Selinger y genera un circuito cuántico de un solo qubit compuesto por puertas de Clifford, de tipo « TT » y de tipo « TT^\dagger ».

    El complemento se activa mediante la fase UnitarySynthesis del transpilador cuando el parámetro method se establece en "gridsynth".

  • Al transpilar a la base Clifford+T, la etapa UnitarySynthesis de transpilación utiliza ahora, de forma predeterminada, un algoritmo de síntesis Clifford+T para aproximar las operaciones unitarias de un solo qubit.

    Del mismo modo, el DefaultUnitarySynthesis complemento utiliza ahora el mismo algoritmo de síntesis Clifford+T para aproximar operadores unitarios de un solo qubit.

  • Un nuevo DAGCircuit.to_circuit() método ofrece ahora una cómoda envoltura para dag_to_circuit().

  • Se ha añadido una nueva pasada del SubstitutePi4Rotationstranspilador que convierte las puertas de un solo qubit RZGatey RXGate las puertas RYGate de rotación cuyos ángulos son múltiplos enteros de π/4\pi/4 en conjuntos discretos de puertas de TdgGate Clifford y TGate . Cabe señalar que los múltiplos impares de π/4\pi/4 requieren una sola TGate y TdgGate, así como algunas puertas de Clifford, mientras que los múltiplos pares de π/4\pi/4, o lo que es lo mismo, los múltiplos enteros de π/2\pi/2, pueden expresarse utilizando únicamente puertas de Clifford.

  • Se ha ampliado LitinskiTransformation la fase del transpilador para que admita medidas. Por lo tanto, la transformación se aplica ahora a un circuito que contiene puertas de rotación RZ de un solo qubit de tipo Clifford (incluidas TT y TT^\dagger ), así como mediciones Z estándar, y desplaza las puertas de Clifford al final del circuito. En el proceso, transforma las rotaciones RZ en rotaciones de Pauli productivas (implementadas como PauliEvolutionGate puertas lógicas) y transforma las mediciones Z en mediciones de Pauli productivas (implementadas mediante PauliProductMeasurement instrucciones).

  • La fase de optimización del OptimizeCliffordT transpilador se ha mejorado considerablemente y se ha reimplementado en Rust.

    Esta pasada realiza una optimización de mirilla en circuitos expresados utilizando el conjunto de puertas Clifford+T. Más concretamente, colapsa todas las cadenas de puertas de un solo qubit que contienen Clifford+T en un uso mínimo de TT (o TT^\dagger ). El paso se ejecuta en una cadena en un tiempo proporcional al número de puertas de la cadena.

  • Se ha añadido WrapAngles.DEFAULT_REGISTRY con el registro predeterminado para WrapAngles. Este nuevo atributo sustituye al anterior WRAP_ANGLE_REGISTRY, por lo que recomendamos a los usuarios que utilicen el nuevo formato lo antes posible.

  • Los DAGCircuit.topological_op_nodes() métodos DAGCircuit.topological_nodes() y ahora admiten un argumento reverse booleano. Cuando se establece en True, los métodos devuelven nodos en orden topológico inverso, desde las salidas del circuito hacia las entradas. Esto ofrece una forma directa y eficaz de recorrer un DAG hacia atrás sin la carga que supone invertir explícitamente la lista de nodos devuelta por las funciones, creando un nuevo DAG con la estructura invertida mediante DAGCircuit.reverse_ops().

  • Ahora permite CommutationChecker realizar comprobaciones de conmutación eficientes entre las puertas basadas en PauliGate Pauli, PauliEvolutionGate y PauliProductMeasurement mediante la comprobación de si los operadores de Pauli generadores conmutan. Esto permite realizar optimizaciones, en particular para circuitos en formato de cálculo basado en Pauli, expresados en términos de evoluciones de Pauli y mediciones de productos de Pauli. Cabe señalar que las conmutaciones entre estas puertas basadas en Pauli y otras puertas estándar aún no se gestionan con la misma eficiencia.

  • Se ha añadido un nuevo argumento, matrix_max_num_qubits, a CommutationChecker.commute(). Esto permite limitar el tamaño de las instrucciones para las que el verificador de conmutación puede calcular la representación matricial, cuyo coste es exponencialmente elevado. Este nuevo argumento permite distinguir entre el límite de tamaño de las instrucciones que se pueden procesar (configurado mediante, cuyo max_num_qubits valor None predeterminado es ahora, lo que significa que no hay límite) y el límite de tamaño de la matriz.

  • Las funciones generate_preset_pass_manager() y transpile() ahora tienen en unitary_synthesis_method cuenta el argumento al compilar en el conjunto de bases Clifford+T, lo que permite invocar complementos de síntesis unitaria personalizados.

  • VF2Layout y VF2PostLayout ahora registra las puntuaciones parciales de los diseños candidatos durante la búsqueda de isomorfismos de subgrafos. Esto no tiene ningún efecto significativo cuando no hay una disposición perfecta que encontrar, pero puede reducir drásticamente el coste de evaluar las disposiciones para elegir la mejor opción en casos de alta simetría.

  • El call_limit argumento de VF2Layout y VF2PostLayout puede ser ahora una tupla de dos elementos, en la que el primer elemento se utiliza antes de encontrar la primera coincidencia y, a continuación, el límite pasa a ser el segundo. Este es un limitador de tiempo de ejecución más fiable que el max_trials argumento, ahora que los diseños se evalúan sobre la marcha con una poda más agresiva.

Características diversas

Notas de actualización

  • ConsolidateBlocks ahora lee una PropertySet clave ConsolidateBlocks_qubit_map al entrar. Esta clave y su valor no son públicos y no deben ser leídos ni modificados por otras contraseñas.

Notas sobre la actualización de la API C

  • qk_target_entry_new_fixed() tiene un parámetro name adicional para establecer el nombre de la entrada de destino. Las entradas de ángulo fijo casi siempre requieren anular el nombre de la puerta estándar para que funcionen correctamente.

Notas sobre la actualización de circuitos

  • Los nombres de los circuitos producidos como definiciones de puertas de la biblioteca de circuitos estándar ahora se establecen en None. Anteriormente, estos circuitos tenían el mismo nombre que la puerta, lo que facilitaba mucho la construcción de puertas opacas con nombres que coincidían con una puerta estándar. Esto viola una suposición común en Qiskit, donde los nombres de las puertas estándar deben ser únicos.

  • La representación interna de ControlFlowOps ha cambiado al añadirlos a a QuantumCircuit o DAGCircuit. El objeto almacenado en el circuito y devuelto en un acceso posterior no será necesariamente la misma instancia que se añadió al circuito. Los usuarios no deben intentar modificar ningún objeto in situ una vez que se haya añadido a un circuito. Es probable que esto dañe el circuito, ya sea el flujo de control u otro elemento.

    Al igual que con todas las modificaciones in situ realizadas en objetos de tipo Python almacenados en un QuantumCircuit o un DAGCircuit, debes reasignar la instrucción al circuito para que el espacio de Rust detecte los cambios. Por ejemplo, al añadir anotaciones a un BoxOp objeto que ya se encuentra en un circuito, una pasada del transpilador debería asegurarse de utilizar DAGCircuit.substitute_node() para actualizar el objeto en el espacio de Rust:

    from qiskit.circuit import QuantumCircuit, Annotation
    
    class MyAnnotation(Annotation):
        namespace = "my"
    
    qc = QuantumCircuit(2)
    with qc.box():
        qc.cx(0, 1)
    dag = qc.to_dag()
    
    # Modifications to the box's annotations in-place require
    # writing back the information to Rust space.
    box_node = next(dag.topological_op_nodes())
    box_node.op.annotations.append(MyAnnotation())
    
    # Write back the operation.
    dag.substitute_node(box_node, box_node.op)
  • Se prevé que el rendimiento del transpilador, en presencia de ControlFlowOp instrucciones como BoxOp, empeore temporalmente en Qiskit 2.3, ya que estamos realizando la transición de la representación interna del flujo de control, pasando de la versión anterior centrada en Python a una nativa de Rust. Esperamos que el rendimiento vuelva a mejorar en una versión posterior de Qiskit y que esto nos permita resolver las deficiencias que desde hace tiempo presenta la API en las pasadas del transpilador que actúan sobre las operaciones de flujo de control.

  • Los bloques de ControlFlowOp instancias ya no registrarán name los metadata campos. Estos ya no se podían configurar mediante la interfaz del generador de flujo de control, y su existencia era un detalle de implementación involuntario, más que una API intencionada.

  • El método ya Gate.control() no devuelve un AnnotatedOperation cuando el argumento annotated se establece en True y hay disponible una clase nativa de puerta controlada. Este cambio es coherente con el modo en que se annotated utiliza el argumento en toda la biblioteca de circuitos estándar y permite descomposiciones más eficientes de las puertas con anotaciones de control. Las puertas afectadas son:

    • Puertas controladas CZ individualmente H, S, Sdg, U3 Y, Z, SX, RX, RY, RZ, Swap y;
    • Puerta de Z doble control;
    • controladas arbitrariamente Phase, CPhase, MCPhase, U1 CU1,, MCU1 y MCMT puertas.
  • El valor predeterminado del argumento annotated en QuantumCircuit.control() es ahora None en lugar de False. Esto no afecta a los circuitos propiamente dichos, pero es coherente con el valor predeterminado que annotated se utiliza en toda la biblioteca de circuitos.

Notas sobre la actualización de QPY

  • La versión predeterminada de QPY (QPY_VERSION) utilizada en qpy.dump() es ahora la 17.

Notas sobre la actualización de la información cuántica

  • Se ha mejorado el rendimiento de Statevector.expectation_value() los operadores de Pauli de identidad total utilizando la implementación optimizada para el caso general, en lugar de un atajo específico que no se adaptaba bien al número de qubits.

Notas sobre la actualización del transpilador

  • Se han reducido los límites máximos de llamadas y de intentos optimization_level=3 para la ejecución con coincidencia exacta de VF2PostLayout en con el fin de evitar tiempos de ejecución excesivos en los casos en que circuitos de prueba altamente simétricos se asignan a mapas de acoplamiento de gran tamaño.

  • La ubicación predeterminada para el registro del paso del WrapAngles transpilador es ahora WrapAngles.DEFAULT_REGISTRY. La ruta WRAP_ANGLE_REGISTRY anterior, con un anidamiento profundo, seguirá funcionando por motivos de compatibilidad con versiones anteriores, pero recomendamos a los paquetes derivados que utilicen la nueva ubicación. La ruta anterior era un descuido en Qiskit 2.2 y recorre módulos que nunca se pretendió que formaran parte de la API pública.

  • Aunque la interfaz de VF2Layout y VF2PostLayout sigue siendo, en principio, la misma, el max_trials argumento ahora tiene mucho menos efecto como limitador de tiempo de ejecución, salvo cuando se establece en el valor 1. Esto se debe a que, gracias al nuevo algoritmo de puntuación y poda sobre la marcha que utiliza internamente la clase, las distribuciones «completas» se encuentran con mucha menos frecuencia, y el recuento de «intentos» solo aumenta cuando se encuentra una nueva distribución que presenta una tasa de error mejor que la anterior. En su lugar, deberías utilizar call_limit como limitador determinista del tiempo de ejecución; donde max_trials mide las distribuciones completas encontradas, call_limit mide las extensiones de distribuciones parciales.

Notas varias sobre la actualización

  • La versión mínima compatible de Python es ahora 3.10, tras el fin de la vida útil de Python 3.9 en octubre de 2025 y las advertencias de obsolescencia en Qiskit desde la versión 2.1.

  • El soporte para macOS x86-64 (Intel) ha sido rebajado del nivel 1 al nivel 2. Qiskit seguirá proporcionando ruedas probadas y precompiladas para esta plataforma, pero las pruebas solo se realizarán en el momento del lanzamiento, en lugar de cada vez que se produzca un cambio. Esto podría provocar retrasos en el lanzamiento de las ruedas para esta plataforma.

    Este cambio se ha realizado porque Apple ha comenzado a retirar la plataforma y el equipo de Qiskit ya no dispone de los recursos de desarrollo ni de integración continua necesarios para continuar con el soporte de nivel 1. Solo podemos admitir macOS x86-64 mientras GitHub siga proporcionando ejecutores para ello, y esperamos que esta compatibilidad se elimine en la segunda mitad de 2027.

Descontinuaciones de la API C

  • La función qk_transpiler_pass_standalone_vf2_layout() está en desuso, ya que ahora los usuarios deben utilizar qk_transpiler_pass_standalone_vf2_layout_average(). El nuevo nombre de la función describe mejor la heurística de puntuación, y la API permite acceder de forma encapsulada a todo el nuevo objeto de configuración, incluida la forma de dos límites de call_limit.

    Esta obsolescencia no es totalmente necesaria para los usuarios, pero dado que la API C sigue siendo explícitamente inestable, la estamos utilizando como prueba para gestionar las obsolescencias y las advertencias específicas del compilador en la API C, antes de alcanzar garantías de estabilidad.

Circuitos obsoletos

  • Desde Qiskit 1.0, los métodos Gate.control() y QuantumCircuit.control() admiten el argumento, annotated que puede ser, True``False o None. Actualmente, una puerta controlada se representa mediante una clase específica de puerta controlada cuando existe, independientemente del valor de annotated; por ejemplo, una versión con dos puertas controladas de un XGate es un CCXGate. Si no existe una clase específica para la puerta controlada, esta se representa como un ControlledGate cuando annotated=False y como un AnnotatedOperation cuando annotated=True. El valor annotated=None predeterminado se trata exactamente igual que False.

    En Qiskit 3.0, ya no permitiremos la configuración annotated=None y, en su lugar, cambiaremos el valor predeterminado a annotated=True. Esto es recomendable, ya que aplaza la construcción del circuito controlado desde la construcción del circuito hasta el transpilador y permite optimizaciones adicionales de la puerta controlada, lo que suele dar lugar a circuitos de mayor calidad (especialmente en el caso de los circuitos jerárquicos).

    Sin embargo, aún podrá establecer explícitamente annotated=False para conservar el comportamiento anterior.

Deprecaciones del transpilador

Cambios en el sistema de compilación

  • Al compilar o empaquetar Qiskit desde el código fuente, la versión mínima requerida de setuptools es ahora 77.0 (lanzada en marzo de 2025). Esto es para dar soporte a las nuevas especificaciones de metadatos de licencia de PEP 639. Esta dependencia se especifica en los requisitos de compilación, por lo que no debería ser necesaria ninguna acción manual.

Corrección de errores

  • Corrige la implementación de __deepcopy__() en QuantumCircuit que no realizaba una copia profunda de los parámetros del circuito. Por lo tanto, modificar un BoxOp en un circuito copiado ya no afecta al circuito original.

  • DAGCircuit.apply_operation_back(), apply_operation_back() y ahora circuit_to_dag() añadirá nuevos bordes en un orden determinista. El comportamiento anterior podría provocar que ciertas pasadas del transpilador (como SabreSwap) recorrieran el DAG en un orden no determinista.

  • DAGCircuit.apply_operation_front() Ya no se pueden insertar bucles recursivos no válidos al gestionar nodos que incluyan condiciones clásicas.

  • Se ha corregido un problema que Optimize1qGatesDecomposition se producía al inicializar el paso con un Target que contiene puertas de tipo « 1q » con parámetros de ángulo fijos. Anteriormente, la pasada podía generar puertas fuera del objetivo, ya que no comprobaba que la puerta del objetivo admitiera valores de parámetros arbitrarios. Se ha solucionado el problema n.º 14743.

  • Se ha corregido un comportamiento incorrecto en la BasisTranslator pasada, en el que una puerta de múltiples qubits dentro de un ControlFlowOp bloque seguía los índices de qubits locales en lugar de utilizar los índices absolutos del circuito de origen.

  • Se ha corregido la reutilización de la misma ConsolidateBlocks instancia en varios circuitos, incluidas las llamadas a transpile() con más de un circuito y sin paralelización basada en procesos. Un error introducido en Qiskit 2.2.2 provocaba que el paso entrara en pánico o generara resultados no válidos si se reutilizaba la misma instancia en circuitos diferentes.

  • La fase del ConsolidateBlocks transpilador ahora evaluará correctamente si una puerta determinada es compatible con el hardware al realizar la recursión en las operaciones de flujo de control.

  • qpy.dump() Ahora permite escribir en .gz archivos abiertos mediante el módulo de gzip la biblioteca estándar con versiones de QPY 16 o superiores. Consulte el n.º 15157 para obtener más información.

  • Se han corregido los métodos MCPhaseGate.inverse() y MCU1Gate.inverse() para conservar los estados de control de las puertas de control abierto al calcular sus inversas.

  • ConsolidateBlocks Ahora devolverá una excepción de tipo « Python -space» en lugar de entrar en pánico cuando detecte un análisis no válido o desactualizado en las claves heredadas run_list``block_listPropertySet o.

  • Optimize1qGatesDecomposition Ahora generará un TranspilerError en lugar de un error de pánico por falta de espacio en Rust al intentar ejecutarse en un circuito demasiado grande para el Target.

  • Se ha solucionado un problema relacionado con pickle la compatibilidad con el SabreSwap método, en el que una SabreSwap instancia daba error al ser serializada tras la ejecución del SabreSwap.run() método. Se ha solucionado el problema n.º 15071.

  • Las etapas de programación ALAPScheduleAnalysis y ahora ASAPScheduleAnalysis gestionarán correctamente los circuitos que no contengan operaciones. Antes solían mostrar un mensaje TranspilerError erróneo que decía «No se han proporcionado duraciones». Se ha solucionado el problema n.º 15145.

  • Se ha corregido un problema por el que is_unitary() no se respetaban correctamente los valores de tolerancia de entrada al comprobar si un operador es unitario. Ahora el método utiliza correctamente los parámetros rtol y atol proporcionados al simplificar el operador y comprobar si es igual a la identidad. Esto soluciona el problema n.º 14107.

  • Se ha corregido un error en la pasada UnitarySynthesis del transpilador cuando se invoca con un complemento de síntesis no predeterminado (especificado mediante method) que admite basis_gates pero no target. Ahora, el paso transmite correctamente las puertas de base desde el target al complemento.

  • Se ha corregido un error en el editor de texto de circuitos que podía producirse cuando los bloques de circuitos dentro de operaciones de flujo de control se definían en registros distintos a los del circuito exterior. Esta situación podría darse, por ejemplo, al concatenar ControlFlowOp operaciones directamente, o en el caso de circuitos tras la transpilación.

  • Se ha corregido el problema con la serialización PauliEvolutionGate mediante operadores de tipo SparseObservable, al utilizar la versión 17 de QPY.

  • Se ha corregido una discrepancia en QkTargetOp la que la longitud de la matriz almacenada en no QkTargetOp.params coincidía con el número indicado por QkTargetOp.num_params. Los parámetros comodín se representan ahora mediante NAN, y la longitud de la matriz será siempre QkTargetOp.num_params. Este error solo se daba en 2.3.0rc1.

  • Se ha corregido un error de regresión en la representación clásica de expresiones Value de tipo Uint con una anchura superior a 64 bits. Anteriormente, el valor de las expresiones con estos tipos se convertía internamente, sin querer, a un valor de punto flotante de tipo «double», lo que provocaba una pérdida de precisión.

  • Ahora, la HighLevelSynthesis instrucción seleccionará correctamente la métrica de optimización en función del conjunto de bases: el recuento de puertas de dos qubits para las bases continuas y el recuento de T para las bases Clifford+T. Anteriormente, esta información no se transmitía correctamente, lo que daba lugar a recuentos de T inferiores a los esperados.

  • Se ha corregido el cajón de texto del circuito para que las instrucciones del circuito con cables clásicos se dibujen en capas separadas.

  • La multiplicación matricial (@) entre Operator y Statevector aplicará ahora el operador al estado y devolverá el resultado Statevector.

  • Se ha corregido un error en la fase ElidePermutations del transpilador que provocaba un bloqueo al procesar permutaciones de un solo qubit.

  • Se ha corregido un posible problema de interbloqueo al ejecutar pasadas de diseño, como SabreLayout con una conectividad disjunta en el Target y en un contexto de multiprocesamiento, al ejecutar PassManager.run() o transpile() con más de un circuito. En Linux, este es el comportamiento predeterminado al ejecutar PassManager.run() o transpile() con más de un circuito; en el resto de plataformas, es necesario activar manualmente el uso de un contexto de multiprocesamiento.

    Esto se debía a un problema subyacente en CPython detectado al python/cpython#84559 mezclar multiprocesamiento y multihilos. Normalmente, Qiskit evita mezclar los dos métodos de paralelismo, pero en el caso del manejo de grafos de conectividad disjuntos, esta protección faltaba en el código Rust multihilo.

  • El método ahora Statevector.to_dict() tendrá en cuenta su argumento decimals de palabra clave, que antes ignoraba.

  • Se ha solucionado un problema con la función timeline_drawer() de visualización por el que se producía un error al visualizar un circuito programado de un destino que contenía puertas parametrizadas con una duración definida.

  • Generación de etiquetas fijas para operadores PauliEvolutionGate SparseObservable «with». Ahora las etiquetas muestran los operadores de Pauli con índices de qubits (p. ej., "X0 X2") en lugar del formato de cadena concatenada (p. ej., "XX"), lo que mejora la claridad a la hora de distinguir entre los distintos operadores.

  • Pauli.evolve() Ahora gestiona correctamente los circuitos cuánticos que contienen determinadas puertas de rotación parametrizadas, cuando el ángulo es un múltiplo de π/2\pi/2, por ejemplo: RZGate(math.pi/2) o RZZGate(math.pi/2). Anteriormente no se reconocían como puertas de Clifford, lo que provocaba un error.

  • BasePassManager Ya no sustituye los resultados válidos pero que dan «falsy» de las pasadas por el programa de entrada original. Ahora se conservará un valor de retorno «pass» False u 0otro valor falso, y solo None «failure» indicará un error.

  • QuantumCircuit.compose() Ahora reasignará correctamente cualquier variable y intervalo utilizados en Delay las instrucciones cuando se especifique el var_remap argumento.

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