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.kmsintegrado en ahoraqiskit.synthesisgestionará 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
HighLevelSynthesisdel 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 adecuadaQiskitErroro una subclase de la misma.Se ha solucionado el problema n.º 15610.
-
La síntesis predeterminada de una puerta
UnitaryGate«when access»UnitaryGate.definitiony de una puerta «calling»UnitaryGate.control()para puertas que involucran más de dos qubits se basará internamente en laqs_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 lugarIsometrya la descomposición de. Aunque esto da lugar a una descomposición menos eficiente,qs_decomposition()servirá como alternativa cuandoqs_decomposition()falle. -
Se ha corregido un error por
ParameterExpression.sympify()el que, en determinadas combinaciones deParameter,ParameterExpressiony 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 conQuantumCircuit.ensure_physical()cuando existía un registro creado por el usuario llamado «ancilla». -
Se ha corregido
BreakLoopOpel hecho deContinueLoopOpque, en determinadas pasadas del transpilador, se consideraran erróneamente operaciones de flujo de control, lo que podía dar lugar a queAttributeErrorse generara un. Véase el n.º 15579. -
Corrige un error que provocaba
qpy.load()que se colgara en circuitos creados conSabreLayoutcuando 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()ydump()) 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()ydump()) ahora escapará correctamente los identificadores cuyo nombre comience con un dígito ASCII. -
Los métodos
SparsePauliOp.from_list()ySparsePauliOp.from_sparse_list()ahora deducen automáticamente el tipo de datos de los coeficientes si no se especifica eldtypeargumento.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
-
Se ha añadido la función
qk_target_instruction_supported()para comprobar la compatibilidad de cualquier puerta o instrucción con la instancia deQkTarget. Esta comprobación se lleva a cabo basándose en el nombre de la instrucción proporcionada, los qargs y los parámetros. -
Se ha añadido la función
qk_target_entry_set_name()para establecer el nombre de una entrada de destino ya existente. -
Se ha añadido una nueva función
qk_circuit_library_quantum_volume()para generar un circuito de modelo de volumen cuántico. -
Se han añadido formas de iterar y comprobar el mapa de puertas de un
QkTarget. Se han añadido los siguientes métodos:qk_target_op_num_properties()qk_target_op_index()qk_target_op_name()qk_target_op_qargs_index()qk_target_op_qargs()qk_target_op_props()
Y se añadió la siguiente representación:
QkInstructionProperties: para representar elInstructionProperties.
Ejemplo:
// Create Target with a mix of global and non-global gates. QkTarget *target = qk_target_new(2); // Create a CX entry QkTargetEntry *cx_entry = qk_target_entry_new(QkGate_CX); uint32_t qarg_samples[2][2] = { {0, 1}, {1, 0}, }; double props[2][2] = { {2.7022e-11, 0.00713}, {3.0577e-11, 0.00713} }; for (int i = 0; i < 2; i++) { qk_target_entry_add_property(cx_entry, qarg_samples[i], 2, props[i][0], props[i][1]); } qk_target_add_instruction(target, cx_entry); // Create an SX entry QkTargetEntry *sx_entry = qk_target_entry_new(QkGate_SX); for (int i = 0; i < 2; i++) { uint32_t qargs[1] = {i}; qk_target_entry_add_property(sx_entry, qargs, 1, 35.5e-9, 0.); } qk_target_add_instruction(target, sx_entry); // Create an H entry qk_target_add_instruction(target, qk_target_entry_new(QkGate_H)); // Get the size of the size_t target_length = qk_target_num_instructions(target); for (size_t op_idx = 0; op_idx < target_length; op_idx++) { // Allocate space for qargs and props uint32_t *qargs; uint32_t qargs_len; QkInstructionProperties props; // Retrieve the operation's name char *name = qk_target_op_name(target, op_idx); size_t num_props = qk_target_op_num_properties(target, op_idx); for (size_t props_idx = 0; props_idx < num_props; props_idx++) { // Populate qargs qk_target_op_qargs(target, op_idx, props_idx, &qargs, &qargs_len); // Populate properties qk_target_op_props(target, op_idx, props_idx, &props); } // Free the name string qk_str_free(name); } -
QkTargetahora ofrece a sus usuarios la posibilidad de recuperar operaciones directamente desde él. Se han añadido los siguientes métodos:Y se añadió la siguiente representación:
QkTargetOp: Para representar una operación en elQkTarget.
-
La API C ahora expone
QkParampara representar parámetros de puerta, incluyendo símbolos y expresiones parametrizadas. LaQkParaminterfaz en sí misma admite cálculos simbólicos, incluyendo operaciones aritméticas estándar y funciones trigonométricas. Por ejemplo:QkParam *x = qk_symbol_new("x"); // a symbol called "x" QkParam *y = qk_symbol_new("y"); // a symbol called "y" QkParam *val = qk_symbol_from_double(2.0); // the value 2.0 QkParam *out = qk_symbol_zero(); // to store the final expression // build 2 sin(x + y) qk_param_add(out, x, y); // out = x + y qk_param_sin(out, out); // out = sin(out) qk_param_mul(out, out, val); // out = out * 2 qk_param_free(x); qk_param_free(y); qk_param_free(val); qk_param_free(out); -
La API C ahora puede representar y manipular
DAGCircuitcomo el objeto opacoQkDag. Se han añadido las siguientes funciones en relación con el DAG:qk_dag_new()qk_dag_add_quantum_register()qk_dag_add_classical_register()qk_dag_free()qk_dag_copy_empty_like()qk_dag_num_qubits()qk_dag_num_clbits()qk_dag_num_op_nodes()qk_dag_node_type()qk_dag_qubit_in_node()qk_dag_qubit_out_node()qk_dag_clbit_in_node()qk_dag_clbit_out_node()qk_dag_wire_node_value()qk_dag_op_node_clbits()qk_dag_op_node_gate_op()qk_dag_op_node_kind()qk_dag_op_node_num_clbits()qk_dag_op_node_num_params()qk_dag_op_node_num_qubits()qk_dag_op_node_qubits()qk_dag_op_node_unitary()qk_dag_apply_barrier()qk_dag_apply_gate()qk_dag_apply_measure()qk_dag_apply_reset()qk_dag_apply_unitary()qk_dag_get_instruction()qk_dag_compose()qk_dag_topological_op_nodes()qk_dag_substitute_node_with_dag()qk_dag_predecessors()qk_dag_successors()
-
Se ha añadido la
QkDagNodeTypeenumeración para distinguir el tipo de un nodo DAG. Este es el tipo de retorno deqk_dag_node_type(). -
Se ha añadido la
QkOperationKindenumeración para distinguir los diferentes tipos de operaciones nativas. Este es el tipo de retorno deqk_dag_op_node_kind(). -
Se ha añadido
qk_circuit_copy_empty_like()para crear una copia del circuito indicado, como una réplica deQuantumCircuit.copy_empty_like(). -
Se han añadido nuevas enumeraciones para su uso con algunas funciones de circuito y API DAG para especificar los modos de copia:
-
Se ha añadido la
QkDagNeighborsestructura, que es el tipo de retorno deqk_dag_successors()yqk_dag_predecessors(), así como su función deqk_dag_neighbors_clear()liberación asociada. -
Se añade una nueva estructura,
QkNeighbors, que representa el grafo de acoplamiento de dos qubits implícito en unTarget. Se inicializa mediante la funciónqk_neighbors_from_target()«new», se borra conqk_neighbors_clear()«clear» y cuenta con una función auxiliarqk_neighbors_is_all_to_all(). -
Se han añadido las
qk_dag_to_circuit()funcionesqk_circuit_to_dag()y para permitir la conversión de DAG a circuito y de circuito a DAG, respectivamente. -
Las
qk_transpiler_pass_standalone_unitary_synthesis()qk_transpile()funciones y ahora permiten sintetizar objetos de 3 oUnitaryGatemás qubits en un circuito. En Qiskit 2.2 esto no era compatible, ya que el algoritmo de síntesisqs_decomposition()subyacente utilizado para la síntesis unitaria de 3 o más qubits estaba escrito anteriormente en Python; sin embargo, ahora que se ha portado a Rust, esta funcionalidad está disponible desde C. -
Se han añadido nuevas funciones para ejecutar etapas de transpilador a la API C. Estas funciones son:
Estas funciones se utilizan para ejecutar estas etapas desde el gestor de pasadas preestablecido en un
QkDagobjeto. El objetivo de estas funciones es permitir flujos de trabajo de transpilación componibles desde C cuando se combinan con pasadas de transpilador personalizadas. -
Se ha añadido una nueva función
qk_transpile_layout_generate_from_mapping()que sirve para generar un diseño personalizadoQkTranspileLayoutcon una disposición inicial definida a partir de una matriz de asignación. El objetivo de esta función es permitir la creación de un objeto de diseño para las pasadas del transpilador de diseños personalizados. -
Las dos formas de selección de diseño «perfecto» mediante el algoritmo de isomorfismo de subgrafos VF2 ahora están disponibles como pasadas de transpilador independientes en la API de C. Estas funciones son
Estas difieren en cómo se gestionan la direccionalidad y los conjuntos de puertas de las interacciones;
exactrequiere que las coincidencias admitan directamente todas las puertas de forma nativa, mientras queaverageespera que otras pasadas del transpilador descompongan las puertas en el conjunto admitido de un qubit o enlace determinado.Estas funciones utilizan una versión encapsulada de la configuración VF2 (
QkVF2LayoutConfiguration), que tiene métodos de configuración para cada una de las opciones. Esto incluye permitir el acceso a la nueva forma de dos límites delcall_limitargumento.
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 o , 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
PauliProductMeasurementpuede instanciar un a partir de unPauli, donde el Pauli puede incluir una fase de , pero no de ni de . 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 paracircuit_to_dag(). -
ParameterExpressionahora tiene unnum_parametersatributo que es igual a la longitud de suparametersconjunto, pero que se calcula con menos sobrecarga.
OpenQASM Características
- El exportador « OpenQASM
qasm2.dumps()2» ahora admite la generación de bloques sencillos deIfElseOpuna 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
SparseObservableobjetos cuando se utilizan como parámetros de otros objetos. En concreto, esto permite serializarPauliEvolutionGateobjetos 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 deOperator.from_circuit(). Esto permite instanciar directamente unStatevectoren 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 deClifford.compose()cuando se invocan confront=Truey unQuantumCircuitque contiene únicamente puertas de Clifford. Anteriormente, el circuito se incorporaba primero por completo a unCliffordobjeto y, a continuación, se combinaban los dos objetos. Ahora, la baseCliffordse 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 yaPauliLindbladMap.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», comois_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 comoCommutativeCancellationdeCommutativeInverseCancellation.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 faseUnitarySynthesisdel transpilador. Esta opción se aplica cuando se invoca el paso con un complemento de síntesis distinto del predeterminado, especificado mediante el argumentomethod.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. Cuandofallback_on_defaultse establece enTrue, el filtro invocaráDefaultUnitarySynthesisel 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 « » y de tipo « ».El complemento se activa mediante la fase
UnitarySynthesisdel transpilador cuando el parámetromethodse establece en"gridsynth". -
Al transpilar a la base Clifford+T, la etapa
UnitarySynthesisde 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
DefaultUnitarySynthesiscomplemento 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 paradag_to_circuit(). -
Se ha añadido una nueva pasada del
SubstitutePi4Rotationstranspilador que convierte las puertas de un solo qubitRZGateyRXGatelas puertasRYGatede rotación cuyos ángulos son múltiplos enteros de en conjuntos discretos de puertas deTdgGateClifford yTGate. Cabe señalar que los múltiplos impares de requieren una solaTGateyTdgGate, así como algunas puertas de Clifford, mientras que los múltiplos pares de , o lo que es lo mismo, los múltiplos enteros de , pueden expresarse utilizando únicamente puertas de Clifford. -
Se ha ampliado
LitinskiTransformationla 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 y ), 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 comoPauliEvolutionGatepuertas lógicas) y transforma las mediciones Z en mediciones de Pauli productivas (implementadas mediantePauliProductMeasurementinstrucciones). -
La fase de optimización del
OptimizeCliffordTtranspilador 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 (o ). 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_REGISTRYcon el registro predeterminado paraWrapAngles. Este nuevo atributo sustituye al anteriorWRAP_ANGLE_REGISTRY, por lo que recomendamos a los usuarios que utilicen el nuevo formato lo antes posible. -
Los
DAGCircuit.topological_op_nodes()métodosDAGCircuit.topological_nodes()y ahora admiten un argumentoreversebooleano. Cuando se establece enTrue, 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 medianteDAGCircuit.reverse_ops(). -
Ahora permite
CommutationCheckerrealizar comprobaciones de conmutación eficientes entre las puertas basadas enPauliGatePauli,PauliEvolutionGateyPauliProductMeasurementmediante 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, aCommutationChecker.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, cuyomax_num_qubitsvalorNonepredeterminado 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()ytranspile()ahora tienen enunitary_synthesis_methodcuenta el argumento al compilar en el conjunto de bases Clifford+T, lo que permite invocar complementos de síntesis unitaria personalizados. -
VF2LayoutyVF2PostLayoutahora 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_limitargumento deVF2LayoutyVF2PostLayoutpuede 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 elmax_trialsargumento, ahora que los diseños se evalúan sobre la marcha con una poda más agresiva.
Características diversas
- Se ha añadido la posibilidad de calcular el valor esperado de una variable
SparseObservablea partir de cadenas de bits muestreadas en la base Z mediante lasampled_expectation_value()función.
Notas de actualización
ConsolidateBlocksahora lee unaPropertySetclaveConsolidateBlocks_qubit_mapal 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ámetronameadicional 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 aQuantumCircuitoDAGCircuit. 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
Pythonalmacenados en unQuantumCircuito unDAGCircuit, debes reasignar la instrucción al circuito para que el espacio de Rust detecte los cambios. Por ejemplo, al añadir anotaciones a unBoxOpobjeto que ya se encuentra en un circuito, una pasada del transpilador debería asegurarse de utilizarDAGCircuit.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
ControlFlowOpinstrucciones comoBoxOp, 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
ControlFlowOpinstancias ya no registraránnamelosmetadatacampos. 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 unAnnotatedOperationcuando el argumentoannotatedse establece enTruey hay disponible una clase nativa de puerta controlada. Este cambio es coherente con el modo en que seannotatedutiliza 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
CZindividualmenteH,S,Sdg,U3Y,Z,SX,RX,RY,RZ,Swapy; - Puerta de
Zdoble control; - controladas arbitrariamente
Phase,CPhase,MCPhase,U1CU1,,MCU1yMCMTpuertas.
- Puertas controladas
-
El valor predeterminado del argumento
annotatedenQuantumCircuit.control()es ahoraNoneen lugar deFalse. Esto no afecta a los circuitos propiamente dichos, pero es coherente con el valor predeterminado queannotatedse utiliza en toda la biblioteca de circuitos.
Notas sobre la actualización de QPY
- La versión predeterminada de QPY (
QPY_VERSION) utilizada enqpy.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=3para la ejecución con coincidencia exacta deVF2PostLayouten 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
WrapAnglestranspilador es ahoraWrapAngles.DEFAULT_REGISTRY. La rutaWRAP_ANGLE_REGISTRYanterior, 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
VF2LayoutyVF2PostLayoutsigue siendo, en principio, la misma, elmax_trialsargumento ahora tiene mucho menos efecto como limitador de tiempo de ejecución, salvo cuando se establece en el valor1. 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 utilizarcall_limitcomo limitador determinista del tiempo de ejecución; dondemax_trialsmide las distribuciones completas encontradas,call_limitmide 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 utilizarqk_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 decall_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()yQuantumCircuit.control()admiten el argumento,annotatedque puede ser,True``FalseoNone. Actualmente, una puerta controlada se representa mediante una clase específica de puerta controlada cuando existe, independientemente del valor deannotated; por ejemplo, una versión con dos puertas controladas de unXGatees unCCXGate. Si no existe una clase específica para la puerta controlada, esta se representa como unControlledGatecuandoannotated=Falsey como unAnnotatedOperationcuandoannotated=True. El valorannotated=Nonepredeterminado se trata exactamente igual queFalse.En Qiskit 3.0, ya no permitiremos la configuración
annotated=Noney, en su lugar, cambiaremos el valor predeterminado aannotated=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=Falsepara conservar el comportamiento anterior.
Deprecaciones del transpilador
- Se ha dejado de utilizar el formato de serialización heredado que se empleaba en
SolovayKitaevDecomposition, el cual se basaba en la conversión a formato «pickle» de las aproximaciones básicas en forma de objeto Pythondict. El proceso de carga supone un posible riesgo para la seguridad y solo debe utilizarse con archivos de confianza. El nuevo formato de serialización evita esta vulnerabilidad. Las funciones para generar el formato heredado,generate_basic_approximations(), y cargarlo,SolovayKitaevDecomposition.load_basic_approximations()y en el inicializador deSolovayKitaevDecomposition, han quedado obsoletas. En su lugar, utilizaSolovayKitaevDecomposition.save_basic_approximations()para generar un formato que se pueda cargar de forma segura en el inicializador de la clase.
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__()enQuantumCircuitque no realizaba una copia profunda de los parámetros del circuito. Por lo tanto, modificar unBoxOpen un circuito copiado ya no afecta al circuito original. -
DAGCircuit.apply_operation_back(),apply_operation_back()y ahoracircuit_to_dag()añadirá nuevos bordes en un orden determinista. El comportamiento anterior podría provocar que ciertas pasadas del transpilador (comoSabreSwap) 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
Optimize1qGatesDecompositionse producía al inicializar el paso con unTargetque 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
BasisTranslatorpasada, en el que una puerta de múltiples qubits dentro de unControlFlowOpbloque 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
ConsolidateBlocksinstancia en varios circuitos, incluidas las llamadas atranspile()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
ConsolidateBlockstranspilador 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.gzarchivos abiertos mediante el módulo degzipla 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()yMCU1Gate.inverse()para conservar los estados de control de las puertas de control abierto al calcular sus inversas. -
ConsolidateBlocksAhora 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 heredadasrun_list``block_listPropertySeto. -
Optimize1qGatesDecompositionAhora generará unTranspilerErroren lugar de un error de pánico por falta de espacio en Rust al intentar ejecutarse en un circuito demasiado grande para elTarget. -
Se ha solucionado un problema relacionado con
picklela compatibilidad con elSabreSwapmétodo, en el que unaSabreSwapinstancia daba error al ser serializada tras la ejecución delSabreSwap.run()método. Se ha solucionado el problema n.º 15071. -
Las etapas de programación
ALAPScheduleAnalysisy ahoraASAPScheduleAnalysisgestionarán correctamente los circuitos que no contengan operaciones. Antes solían mostrar un mensajeTranspilerErrorerró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ámetrosrtolyatolproporcionados 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
UnitarySynthesisdel transpilador cuando se invoca con un complemento de síntesis no predeterminado (especificado mediantemethod) que admitebasis_gatespero notarget. Ahora, el paso transmite correctamente las puertas de base desde eltargetal 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
ControlFlowOpoperaciones directamente, o en el caso de circuitos tras la transpilación. -
Se ha corregido el problema con la serialización
PauliEvolutionGatemediante operadores de tipoSparseObservable, al utilizar la versión 17 de QPY. -
Se ha corregido una discrepancia en
QkTargetOpla que la longitud de la matriz almacenada en noQkTargetOp.paramscoincidía con el número indicado porQkTargetOp.num_params. Los parámetros comodín se representan ahora medianteNAN, y la longitud de la matriz será siempreQkTargetOp.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
Valuede tipoUintcon 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
HighLevelSynthesisinstrucció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 (
@) entreOperatoryStatevectoraplicará ahora el operador al estado y devolverá el resultadoStatevector. -
Se ha corregido un error en la fase
ElidePermutationsdel 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
SabreLayoutcon una conectividad disjunta en elTargety en un contexto de multiprocesamiento, al ejecutarPassManager.run()otranspile()con más de un circuito. En Linux, este es el comportamiento predeterminado al ejecutarPassManager.run()otranspile()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 argumentodecimalsde 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
PauliEvolutionGateSparseObservable«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 , por ejemplo:RZGate(math.pi/2)oRZZGate(math.pi/2). Anteriormente no se reconocían como puertas de Clifford, lo que provocaba un error. -
BasePassManagerYa 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»Falseu0otro valor falso, y soloNone«failure» indicará un error. -
QuantumCircuit.compose()Ahora reasignará correctamente cualquier variable y intervalo utilizados enDelaylas instrucciones cuando se especifique elvar_remapargumento.