Notas de la versión de Qiskit SDK 2.0
2.0.3
Preludio
Qiskit v2.0.3 es una versión de corrección de errores para la serie de versiones menores v2.0.
Corrección de errores
-
ApplyLayoutmanejará ahora correctamente el caso de aplicar un qubit ceroLayout. Anteriormente, afirmaba que no se había establecido ningún diseño, incluso si el campo"layout"del archivoPropertySetera igual aLayout(). -
Se ha corregido un problema en el
ElidePermutationstranspiler pass, por el que la permutación de salida no se actualizaba correctamente en presencia dePermutationGateoperaciones. Esto daría lugar a un circuito de salida incorrecto y a una propiedadvirtual_permutation_layoutincorrecta en elproperty_setque se fija. Cuando se ejecuta como parte de unPassManageresto también daría como resultado unTranspileLayouten el circuito deQuantumCircuit.layouten el circuito de salida. -
Se ha corregido un error en el
HighLevelSynthesispass al desenrollar objetos anidados/personalizadosInstructionanidados/personalizados. Si elQuantumCircuitdevuelto porInstruction.definitionde un objeto personalizado contenía algún objetoClbitestos bits clásicos utilizarían incorrectamente el índice interno dentro del objetoInstruction.definitionQuantumCircuiten lugar de asignarlos al índice correspondiente en el directorio externoQuantumCircuit. -
Se ha corregido un error en la función
PauliEvolutionSynthesisDefaultyPauliEvolutionSynthesisRustiqque modificaba el atributo.synthesis del circuito original al establecerpreserve_order=False. Se ha restaurado el comportamiento de los plugins y ahora se conserva el circuito original a lo largo de todo el proceso de transpilación. -
Se ha corregido un problema de compatibilidad con la versión mínima compatible de rustworkx, 0.15. Con determinadas entradas los
VF2LayoutyVF2PostLayoututilizaban antes un método de rustworkx que se añadió en rustworkx 0.16.0 y que provocaba un error al utilizar una versión anterior de rustworkx que aparece como soportada. -
SabreLayoutySabreSwapya no entrará en pánico al aplicar el resultado del enrutamiento a un circuito que utiliceexpr.VaroStretchen un ámbito de flujo de control anidado. -
qiskit.circuit.library.quantum_volume()se actualizó para manejar unnumpy.random.Generatorcomo entrada para su argumentoseed. Anteriormente, un argumento generador de este tipo daba como resultadoTypeError.
2.0.2
Preludio
Qiskit v2.0.2 es una versión de corrección de errores para la serie de versiones menores v2.0.
Corrección de errores
-
Se ha corregido el atributo
namede la claseOrGatede forma que ahora se establezca en"or"para identificar de forma exclusiva esta puerta. Anteriormente estaba configurado incorrectamente en"and", lo que hacía imposible distinguirlo deAndGateo tener plugins de síntesis para sintetizar unOrGate. -
Se ha solucionado un problema en el
ConsolidateBlockspor el que fallaba la consolidación de algunos bloques si la puerta KAK seleccionada (directamente o a través del objetivo) era supercontrolada y noCXGate. Corregido #14413 -
Corregido un error en las funciones del circuito
evolved_operator_ansatz(),qaoa_ansatz()yhamiltonian_variational_ansatz()donde los parámetros tenían un componente complejo cero. Normalmente, esto no era un problema a menos que el parámetro se tradujera a SymPy utilizando el métodoParameterExpression.sympify()lo que provocaría un error.
2.0.1
Preludio
Qiskit v2.0.1 es una versión de corrección de errores menores para la serie de versiones v2.0.x.
Corrección de errores
-
Se ha corregido un error de visualización en el cajón de circuitos de texto por el que las operaciones de flujo de control posteriores a la transpilación podían tener su "corchete" de cierre representado verticalmente fuera de orden. Ver #14271 para más detalles.
-
Se ha corregido un error en el
UnitarySynthesisque ignoraba el parámetrosynth_gatesy sólo sintetizaba las puertasunitary. El pase ahora sintetiza correctamente todas las compuertas especificadas en el parámetrosynth_gates. Corregido #14343. -
Se ha añadido el soporte
reprque faltaba paraDuration. -
Añadido el soporte que faltaba para Python decapado de
Duration. Esto impedía la transpilación paralela de circuitos condelay()instrucciones que utilizan expresiones de duración. -
Se ha corregido un problema en el
HighLevelSynthesisque causaba que terminara erróneamente antes de tiempo en ciertos circuitos con operaciones de flujo de control. Corregido #14338 -
Fijada la construcción de circuitos instantáneos de tiempo polinómico cuántico (IQP) en
IQPy poriqp(). La implementación anterior utilizaba incorrectamente potencias de la puerta en lugar de potencias de la puerta . -
SabreLayoutpropagará ahora correctamente lasnameymetadatade un circuito cuando se ejecuta como una pasada conjunta de trazado y enrutamiento. -
Se ha corregido un problema en el plugin de síntesis unitaria
SolovayKitaevSynthesissíntesis unitaria, por el que la ejecución repetida del plugin con diferentes puertas base reutilizaba incorrectamente las puertas base de la primera ejecución. Este problema se debía a que se ignoraban las puertas base al almacenar en caché las aproximaciones básicas. -
Se ha corregido un problema en el
SolovayKitaevpor el que el pase podía bloquearse al encontrar una rotación de 180 grados en la recursión interna, que no se gestionaba correctamente. -
Se ha corregido un problema en el
SolovayKitaevpor el que la aproximación generada podía tener una fase que difería en del valor correcto. Esto se debe a la representación interna , que requiere una manipulación adicional para obtener el signo correcto de la matriz de la puerta qubit. Corregido #9552 -
Los circuitos que contienen retardos con tramos (véase
QuantumCircuit.add_stretch()) ahora pueden compilarse con éxito utilizando los gestores de pases preestablecidos (transpile()ygenerate_preset_pass_manager()) cuando el objetivo es un backend que tiene restricciones de alineación, por ejemplo IBM dispositivos Quantum Eagle comoibm_sherbrooke. -
La heurística del error de repliegue en
VF2LayoutyVF2PostLayoututilizada cuando no había tasas de error notificadas, podía asignar errores superiores a uno y tener efectos impredecibles en las puntuaciones de diseño resultantes.
2.0.0
Preludio
Nos complace lanzar Qiskit v2.0.0, con nuevas funciones que mejoran su rendimiento y capacidades. Entre las características más destacadas de Qiskit v2.0.0 se incluyen:
- La introducción de una API en C para construir e interactuar con
SparseObservableobjetos. Esta primera interfaz en lenguaje compilado representa un hito importante en la evolución de Qiskit y su alcance irá creciendo a lo largo de la serie de versiones v2.x. La iteración inicial de la API C es una función experimental, y puede haber cambios de última hora en la API en versiones menores siguiendo nuestra estrategia de versiones.- La adición de un nuevo
BoxOpop de flujo de control que se corresponde con el concepto de caja de OpenQASM 3 y permite agrupar series de instrucciones para su posterior procesamiento y programación personalizada. Este operador es útil para aplicaciones como el giro, el aprendizaje del ruido y la programación basada en el estiramiento, entre otras.- La capacidad de crear
stretchduraciones paraDelayinstrucciones, que permiten expresar relaciones entre instrucciones conscientes del tiempo. El nuevoStretchamplía el sistema de expresión clásico existente, lo que permite capturar la intención del diseño en tiempo de construcción del circuito y resolverla en tiempo de compilación. Consulte la documentación de OpenQASM para más detalles.- Síntesis mejorada cuando un
Targetcontiene puertas de base fraccionaria de dos qubits con soporte para ángulos arbitrarios comoRZXGateoRZZGatelo que reduce significativamente el número de puertas en los circuitos sintetizados.- Mejora del rendimiento en tiempo de ejecución, en particular durante la etapa de construcción del circuito, en la que el benchmarking muestra un aumento de la velocidad de 2x con respecto a Qiskit v1.3. Esta mejora se consigue mediante una combinación de contribuciones, entre ellas el aprovechamiento de representaciones nativas adicionales de Rust gate, como
UnitaryGatey la eliminación de elementos heredados del modelo de datos.
En consonancia con nuestra política de versiones semánticas, documentada en el momento de la publicación de v1.0.0, esta versión principal también incluye cambios en la API que no son compatibles con la serie de versiones v1.x. En particular, se han eliminado varios componentes obsoletos del modelo de datos Qiskit, como el método .c_if() , el módulo qobj , BackendV1, y qiskit.pulse, así como las implementaciones de referencias primitivas obsoletas V1. Puede consultar las secciones de notas de la versión de actualización para obtener más detalles sobre todas estas eliminaciones y cambios en la API. Las API eliminadas siguen siendo compatibles con la versión de Qiskit v1.4.x, que recibirá correcciones de errores durante otros seis meses y actualizaciones de seguridad durante un año.
Nuevas funciones
-
El soporte de la plataforma Linux aarch64 ha pasado a ser de nivel 1, como se documenta en:
/guías/install-qiskit#soporte-sistema-operativo
desde su anterior nivel de apoyo de nivel 2 en la serie de publicaciones v1.x.
-
Se ha introducido una nueva API en C para construir observables dispersos e interactuar con ellos. Aunque la superficie de la API en esta versión es bastante pequeña -cubriendo sólo la clase
SparseObservablerepresenta un hito importante en la evolución de Qiskit, ya que es la primera vez que el SDK expone una interfaz pública en C y sienta las bases para futuras ampliaciones de la interfaz C de Qiskit. Al tratarse de la primera interfaz pública en C, se trata de una función experimental y, si fuera necesario, la API podría cambiar en una versión menor.Encontrará información detallada sobre sintaxis e información adicional en la documentación de la API de C. Un ejemplo mínimo para construir el observable de 100 qubits
2 X0 Y1 Z2es:#include <complex.h> #include <qiskit.h> #include <stdint.h> #include <stdio.h> int main(int argc, char *argv[]) { // build a 100-qubit empty observable uint32_t num_qubits = 100; QkObs *obs = qk_obs_zero(num_qubits); // add the term 2 * (X0 Y1 Z2) to the observable complex double coeff = 2; QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z}; uint32_t indices[3] = {0, 1, 2}; QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits}; qk_obs_add_term(obs, &term); // print some properties printf("num_qubits: %u\n", qk_obs_num_qubits(obs)); printf("num_terms: %lu\n", qk_obs_num_terms(obs)); // free the memory allocated for the observable qk_obs_free(obs); return 0; }
Características de los circuitos
-
Añadida una nueva
get_control_flow_name_mapping()que devuelve una correspondencia entre los nombres de las operaciones de flujo de control de Qiskit y sus clases correspondientes.Ejemplo de uso:
from qiskit.circuit import get_control_flow_name_mapping ctrl_flow_name_map = get_control_flow_name_mapping() if_else_object = ctrl_flow_name_map["if_else"] print(if_else_object)<class 'qiskit.circuit.controlflow.if_else.IfElseOp'> -
Añadido un nuevo método de circuito,
QuantumCircuit.estimate_duration()para estimar la duración de un circuito programado después de la transpilación. La duración del circuito se estima encontrando el camino más largo en un circuito programado basándose en las duraciones proporcionadas por un determinadoTarget. Este método sólo funciona para circuitos sencillos que no contengan flujo de control u otras operaciones feed-forward clásicas.Utilice este método en lugar del atributo obsoleto
QuantumCircuit.durationsi necesita una estimación de la duración total del circuito.Ejemplo de uso:
from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2(num_qubits=3, seed=42) circ = QuantumCircuit(3) circ.cx(0, 1) circ.measure_all() circ.delay(1e15, 2) circuit_dt = transpile(circ, backend, scheduling_method="asap") duration = circuit_dt.estimate_duration(backend.target, unit="s") print("Estimated duration: ", duration) -
Añadidas dos nuevas clases
BitFlipOracleGateyPhaseOracleGate.BitFlipOracleGatese introdujo como alternativa a la síntesis directa deBooleanExpression, que se ha eliminado en Qiskit v2.0.PhaseOracleGatecomo alternativa aPhaseOracleya que este último quedará obsoleto en todas las versiones de v2.x. Ambas clases comparten la interfaz dePhaseOracleexcepto el métodoevaluate_bitstring, que ya no existe.BitFlipOracleGatesintetiza un oráculo de cambio de bit en lugar de un oráculo de cambio de fase, lo que significa que actúa sobre un qubit adicional y puede verse como la aplicación de una operación controlada-X, donde el control viene determinado por el valor de la expresión codificada por el oráculo.from qiskit import QuantumCircuit from qiskit.circuit.library.bit_flip_oracle import BitFlipOracleGate qc = QuantumCircuit(5) bool_expr = "(x0 & x1 | ~x2) & x4" oracle = BitFlipOracleGate(bool_expr) qc.compose(oracle, inplace=True) qc.draw('mpl') qc.decompose().draw('mpl')
from qiskit import QuantumCircuit from qiskit.circuit.library.phase_oracle import PhaseOracleGate qc = QuantumCircuit(5) bool_expr = "(x0 & x1 | ~x2) & x4" oracle = PhaseOracleGate(bool_expr) qc.compose(oracle, inplace=True) qc.draw('mpl') qc.decompose().draw('mpl')
-
Un nuevo flujo de control op,
BoxOpsu métodoQuantumCircuit.box()y el gestor de contexto asociados están ahora disponibles enqiskit.circuit.La forma normal de construir una caja es utilizar el
QuantumCircuit.box()gestor de contexto:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(5) with qc.box(): # This box "uses" qubits 0 and 1. qc.x(0) qc.z(1) # Boxes can be assigned a duration. with qc.box(duration=100, unit="ms"): # This box "uses" qubits 2, 3 and 4. # Qubit 4 undergoes no operations. qc.cx(2, 3) qc.noop(4)La "caja" Qiskit se corresponde casi directamente con el concepto de caja de OpenQASM 3.
Todos los qubits "utilizados" por la caja están sincronizados al inicio y al final de la caja. En otras palabras, la caja tiene la misma "duración" para cada qubit que utiliza, y los puntos de inicio están sincronizados. Otras operaciones en el mismo ámbito que la
BoxOpven la caja como atómica; es válido conmutar una operación más allá de una caja entera si la operación conmuta con la acción de la caja entera, pero generalmente no es válido mover una operación dentro o fuera de una caja.Los principales usos de una caja son agrupar una serie de instrucciones para su posterior procesamiento (como agrupar una capa parcial de puertas de dos qubits), y programar un bloque compuesto en un ámbito mientras se utiliza la programación relativa dentro del bloque (como el desacoplamiento dinámico de varios qubits en un grupo). El compilador de Qiskit todavía no tiene pases incorporados que agrupen instrucciones o programen instrucciones con un
BoxOp.El transpilador admite el enrutamiento y la disposición en presencia de cajas, y optimizará dentro de la caja (hasta el ajuste
optimization_level), pero aún no realiza optimizaciones en torno a la estructura atómica de las cajas. El cuadro de soporte de los cajones de circuitos basados en texto y Matplotlib. La exportación a QPY y a OpenQASM 3 está soportada, aunque OpenQASM 3 no tiene actualmente ninguna manera de designar qubits ociosos dentro de una caja (se espera que un cambio de especificación añada esto en un futuro próximo: ver la propuesta de característica relevante ). -
Se ha añadido un nuevo argumento
approximation_degreeaCommutationChecker.commute()yCommutationChecker.commute_nodes(). Este argumento permite establecer el umbral de aproximación para cuando las puertas se evalúan como conmutadas. Consulte el docstring deCommutationCheckerpara más información. -
Se ha añadido un nuevo método de circuito
QuantumCircuit.noop()que permite marcar explícitamente los qubits como utilizados en el ámbito de un constructor de flujo de control sin añadirles la operación correspondiente. -
El módulo clásico de expresiones en tiempo real
qiskit.circuit.classicalpuede ahora representar expresiones constantes. La claseExprtiene ahora un atributo booleanoconstque indica la constancia de la expresión. Esto nos permite imponer que las expresiones en determinados contextos deben poder evaluarse en tiempo de compilación.Todas las expresiones
Varse consideran no constantes, mientras que todas las expresionesValueson const.Una expresión compuesta únicamente por otras expresiones const también es const:
from qiskit.circuit.classical import expr assert expr.bit_and(5, 6).constUna expresión que contiene cualquier expresión no-const es no-const:
from qiskit.circuit.classical import expr, types assert not expr.bit_and(5, expr.Var.new("a", types.Uint(5)).const -
El módulo clásico de expresiones en tiempo real
qiskit.circuit.classicalpuede ahora representar duraciones utilizando el nuevo tipoDuration.El módulo
qiskit.circuittambién tiene una nueva claseDurationque puede utilizarse como valor literal en expresiones clásicas.La función
lift()se puede utilizar para crear una expresión de valor a partir de unaDurationinstancia:from qiskit.circuit import Duration from qiskit.circuit.classical import expr expr.lift(Duration.dt(1000)) # Value(Duration.dt(1000), Duration()) -
El módulo clásico de expresiones en tiempo real
qiskit.circuit.classicalpuede ahora representar valores de coma flotante de doble precisión IEEE-754 utilizando el nuevo tipoFloat.La función
lift()puede utilizarse para crear una expresión de valor a partir de un flotante Python :from qiskit.circuit.classical import expr expr.lift(5.0) # >>> Value(5.0, Float())Este tipo está pensado principalmente para su uso en expresiones relacionadas con la temporización (
durationystretch). No es compatible con operaciones bit a bit o lógicas, aunque puede utilizarse con éstas si primero se convierten explícitamente en otra cosa. -
Reducción del número de puertas de dos qubits al descomponer puertas unitarias de un solo qubit multicontroladas. Por ejemplo:
- En el caso de
YGateen 10 qubits, elCXGaterecuento se redujo en un 56%. - En el caso de
HGateen 10 qubits, elCXGaterecuento se redujo en un 56%. - Para multicontrol
SXGateySXdgGateen 10 qubits, elCXGaterecuento se redujo en un 80%. - En el caso de
UGateen 10 qubits, elCXGaterecuento se redujo en un 31%.
- En el caso de
-
El módulo clásico de expresiones en tiempo real
qiskit.circuit.classicalpuede ahora representar operaciones aritméticasadd(),sub(),mul()ydiv()sobre operandos numéricos y temporales.Por ejemplo:
from qiskit.circuit import QuantumCircuit, ClassicalRegister, Duration from qiskit.circuit.classical import expr # Subtract two integers cr = ClassicalRegister(4, "cr") qc = QuantumCircuit(cr) with qc.if_test(expr.equal(expr.sub(cr, 2), 3)): pass # Multiply a Duration by a Float with qc.if_test(expr.less(expr.mul(Duration.dt(200), 2.0), Duration.ns(500))): pass # Divide a Duration by a Duration to get a Float with qc.if_test(expr.greater(expr.div(Duration.dt(200), Duration.dt(400)), 0.5)): passPara más ejemplos, consulte la documentación sobre el módulo.
-
El constructor de
UCGatetiene ahora un nuevo argumento opcional,mux_simp, que toma un valor booleano que permite buscar las simplificaciones de Carvalho et al. Esta optimización está activada por defecto, identifica y elimina los controles innecesarios del multiplexor, reduciendo el número de puertas CX y la profundidad del circuito, especialmente en la preparación de estados separables conInitialize. -
La página
PauliEvolutionGateadmite ahora de forma nativaSparseObservables como entrada. Esto permite manejar eficientemente la evolución bajo proyectores, que se implementan como controles de una rotación de fase y requieren menos puertas que expandir explícitamente el proyector en términos de Paulis. Por ejemplo:from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparseObservable obs = SparseObservable("001") evo_proj = PauliEvolutionGate(obs, time=1) print(evo_proj.definition.draw()) -
Se ha añadido un nuevo nodo de expresión
Stretchse ha añadido al sistema de expresión clásico para representar variablesstretch. Para crear una nueva variablestretch, puede utilizarQuantumCircuit.add_stretch(). La expresión resultante es una expresión constante de tipoDurationque puede utilizarse como argumento dedurationde una funcióndelay().Por ejemplo, para garantizar que una secuencia de puertas entre dos barreras estará alineada a la izquierda, sea cual sea su duración real, puede hacer lo siguiente:
from qiskit import QuantumCircuit from numpy import pi qc = QuantumCircuit(5) qc.barrier() qc.cx(0, 1) qc.u(pi/4, 0, pi/2, 2) qc.cx(3, 4) a = qc.add_stretch("a") b = qc.add_stretch("b") c = qc.add_stretch("c") # Use the stretches as Delay duration. qc.delay(a, [0, 1]) qc.delay(b, 2) qc.delay(c, [3, 4]) qc.barrier()La expresión
Stretches muy similar a la expresiónVarutilizada para representar variables clásicas en un circuito, salvo que es constante y siempre es del tipoDuration. Puede utilizarse en otras expresiones (por ejemplo, puede multiplicarse por una constante numérica) yQuantumCircuitproporciona soporte completo para su ámbito (por ejemplo, puede ser capturado por o declarado dentro de un ámbito de flujo de control).Para más contexto y ejemplos, consulte la especificación del lenguaje OpenQASM 3.
-
Se ha añadido
Gateversiones de las puertas aritméticas de registro único que permiten al transpilador realizar optimizaciones de alto nivel en comparación con susQuantumCircuitvariantes. Estos son:ExactReciprocalGate(sustituyendoExactReciprocal)IntegerComparatorGate(sustituyendoIntegerComparator)LinearPauliRotationsGate(sustituyendoLinearPauliRotations)PiecewiseLinearPauliRotationsGate(sustituyendoPiecewiseLinearPauliRotations)PiecewiseChebyshevGate(sustituyendoPiecewiseChebyshev)PiecewisePolynomialPauliRotationsGate(sustituyendoPiecewisePolynomialPauliRotations)PolynomialPauliRotationsGate(sustituyendoPolynomialPauliRotations)LinearAmplitudeFunctionGate(sustituyendoLinearAmplitudeFunction)QuadraticFormGate(sustituyendoQuadraticForm)WeightedSumGate(sustituyendoWeightedAdder)
Características primitivas
- Se ha añadido un nuevo método
to_bool_array()a la claseBitArrayque devuelve la matriz de bits como una matriz booleana NumPy. El argumentoorderpuede utilizarse para especificar el formato de la matriz de salida.
Características de los proveedores
-
Se ha añadido la posibilidad de establecer la propiedad
dtdeGenericBackendV2en el inicializador de la clase con un nuevo argumentodt. Ejemplo de uso:from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2( num_qubits = 5, basis_gates = ["cx", "id", "rz", "sx", "x"], dt = 2.22*e-10, seed = 42 )
Características de la información cuántica
-
Se ha añadido un nuevo método
SparseObservable.to_sparse_list()para obtener una representación de lista dispersa de un ficheroSparseObservable. Por ejemplo:from qiskit.quantum_info import SparseObservable obs = SparseObservable.from_list([("+II", 1), ("-II", 1)]) print(obs.to_sparse_list()) # [("+", [2], 1), ("-", [2], 1)] -
Añadido un nuevo
SparseObservable.as_paulis()para expresar un observable disperso sólo en términos de Paulis, expandiendo todos los proyectores. Por ejemplo:from qiskit.quantum_info import SparseObservable obs = SparseObservable("+-") obs_paulis = obs.as_paulis() # 1/4 ( II + XI - IX - XX ) -
Qiskit v2.0.0 permite construir un
SparsePauliOpa partir de unSparseObservableutilizando el nuevo métodoSparsePauliOp.from_sparse_observable(). Es importante recordar queSparseObservablepueden representar eficientemente proyectores, que requieren un número exponencial de términos en el métodoSparsePauliOp. -
SparseObservableadmite ahora la composición de operadores mediante el métodocompose()de forma similar a otras clasesquantum_infoclases. Esto es análogo a la multiplicación de matrices, aunque el método es totalmente libre de matrices. -
SparseObservable.BitTermtiene un nuevo atributolabelque contiene la cadena de un solo carácter Python utilizada para representar el término en las etiquetas de cadena. -
El método
StabilizerState.expectation_value()puede ahora aceptar un operador de tipoSparsePauliOp.
Características de síntesis
-
Añadida una nueva
TwoQubitControlledUDecomposerque descompone cualquier unitario de dos qubits en términos de puertas fraccionarias de base de dos qubits, tales comoRZZGate(o puertas de dos qubits que son localmente equivalentes aRZZGatehasta puertas de un qubit).Por ejemplo:
from qiskit.circuit.library import RZZGate from qiskit.synthesis import TwoQubitControlledUDecomposer from qiskit.quantum_info import random_unitary unitary = random_unitary(4, seed=1) decomposer = TwoQubitControlledUDecomposer(RZZGate, euler_basis="ZXZ") circ = decomposer(unitary) circ.draw(output='mpl') -
El pase
synth_cnot_depth_line_kms()ha sido portado a Rust, con pruebas preliminares que apuntan a un factor de aceleración de 20x. -
El pase
synth_cx_cz_depth_line_my()ha sido portado a Rust, con pruebas preliminares que apuntan a un factor de aceleración de 70x. -
Funciones de síntesis añadidas
synth_integer_comparator_2s()ysynth_integer_comparator_greedy()para compilar puertas que implementan una comparación de enteros, como por ejemploIntegerComparatorGate. Los plugins de síntesis de alto nivel correspondientes sonIntComparatorSynthesis2syIntComparatorSynthesisNoAux. Para que el compilador seleccione la descomposición óptima en función de los qubits auxiliares disponibles, utiliceIntComparatorSynthesisDefault. -
Añadido
synth_weighted_sum_carry()para sintetizarWeightedSumGateobjetos. Este es actualmente el único método de síntesis disponible paraWeightedSumGatecon el correspondiente plugin de síntesis de alto nivelWeightedSumSynthesisDefault.
Características del transpilador
-
Se ha añadido soporte para trabajar con
Targetque contienen puertas de base de dos qubits que contienen ángulos arbitrarios, tales comoRZZGateal pasoConsolidateBlockstranspilador. El pase anterior no estimaba correctamente el número de puertas necesarias para una descomposición, lo que provocaba que no se consolidaran bloques en los queUnitarySynthesispodría optimizar potencialmente el bloque. Internamente, la estimación del número de puertas se realiza mediante la claseTwoQubitControlledUDecomposerclase.Por ejemplo:
from qiskit import QuantumCircuit from qiskit.transpiler import generate_preset_pass_manager from qiskit.transpiler.passes import ConsolidateBlocks qc = QuantumCircuit(2) qc.rzz(0.1, 0, 1) qc.rzz(0.2, 0, 1) # basis_gates contains fractional gate (rzz) consolidate_pass = ConsolidateBlocks(basis_gates=["rz", "rzz", "sx", "x", "rx"]) block = consolidate_pass(qc) # consolidate the circuit into a single unitary block block.draw(output='mpl') pm = generate_preset_pass_manager( optimization_level=2, basis_gates=["rz", "rzz", "sx", "x", "rx"] ) tqc = pm.run(qc) # synthesizing the circuit into basis gates tqc.draw(output='mpl') -
Se ha añadido soporte para puertas de base fraccionaria de dos qubits, tales como
RZZGatealUnitarySynthesistranspilador. La descomposición se realiza utilizando elTwoQubitControlledUDecomposery admite puertas de base estándar y personalizadas.Por ejemplo:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_unitary from qiskit.transpiler.passes import UnitarySynthesis from qiskit.converters import circuit_to_dag, dag_to_circuit unitary = random_unitary(4, seed=1) qc = QuantumCircuit(2) qc.append(unitary, [0, 1]) dag = circuit_to_dag(qc) # basis_gates contains fractional gate (rzz) circ = UnitarySynthesis(basis_gates=['rzz', 'rx', 'rz']).run(dag) dag_to_circuit(circ).draw(output='mpl') -
Añadido un nuevo pass transpiler,
LightConeque devuelve el cono de luz de un circuito cuando se mide un subconjunto de qubits o una cadena Pauli específica.Por ejemplo, para el siguiente circuito:
ejecutar el pase eliminaría las puertas que no afectan al resultado:
from qiskit.transpiler.passes.optimization.light_cone import LightCone from qiskit.transpiler.passmanager import PassManager from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(3,1) qc.h(range(3)) qc.cx(0,1) qc.cx(2,1) qc.h(range(3)) qc.measure(0,0) pm = PassManager([LightCone()]) new_circuit = pm.run(qc) new_circuit.draw("mpl")
-
Se ha añadido un nuevo argumento
max_block_widtha la claseBlockCollectory a las clasesCollectLinearFunctionsyCollectCliffordsdel transpilador. Este argumento permite restringir el número máximo de qubits sobre el que se define un bloque de nodos.Por ejemplo:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import CollectLinearFunctions qc = QuantumCircuit(5) qc.h(0) qc.cx(0, 1) qc.cx(1, 2) qc.cx(2, 3) qc.cx(3, 4) # Collects all CX-gates into a single block qc1 = CollectLinearFunctions()(qc) qc1.draw(output='mpl') # Collects CX-gates into two blocks of width 3 qc2 = CollectLinearFunctions(max_block_width=3)(qc) qc2.draw(output='mpl') -
Se ha añadido una nueva opción,
collect_from_back, alCollectMultiQBlockstranspiler pass. Cuando se ajusta aTrue, los bloques se recogen en sentido inverso, desde las salidas hacia las entradas del circuito. Los bloques siguen informando siguiendo el orden topológico normal. Esto da lugar a una flexibilidad adicional proporcionada por el paso, y a oportunidades de optimización adicionales cuando se combina con un método de resíntesis de circuitos. -
Se ha añadido un nuevo argumento
approximation_degreeaCommutationAnalysis. Este argumento permite establecer el umbral de aproximación para cuando las puertas se evalúan para conmutar. Consulte la documentación de la clase para obtener más información. -
Un nuevo pase transpiler,
ContractIdleWiresInControlFlowestá disponible enqiskit.transpiler.passes. Este paso elimina los qubits de los bloques de flujo de control si la semántica lo permite y si el qubit permanece inactivo durante toda la operación de flujo de control. Anteriormente, la etapa de enrutamiento de los gestores de pases preestablecidos podía eliminar qubits ociosos como efecto secundario involuntario del funcionamiento de los pases. Ahora, este comportamiento se gestiona correctamente como parte de un pase de optimización. -
Se ha añadido una nueva etapa de plugin de enrutamiento
"default". En Qiskit v2.0.0, se trata simplemente de un alias del anterior valor por defecto"sabre". El algoritmo por defecto subyacente puede cambiar en el transcurso de la serie de versiones de Qiskit v2.x para algunos o todos los objetivos, pero siempre se puede establecer explícitamenterouting_method="sabre"para mantener el comportamiento actual. -
Añadida una nueva etapa del plugin de traducción
"default". En Qiskit v2.0.0, se trata de un alias del anterior valor por defecto"translator". El algoritmo por defecto subyacente puede cambiar en el transcurso de la serie Qiskit 2.x para algunos o todos los objetivos, pero siempre se puede establecertranslation_method="translator"explícitamente para mantener el comportamiento actual. -
El pase del transpilador
HighLevelSynthesispass del transpilador sintetiza ahora objetos de tipoAnnotatedOperationa través de la interfaz del plugin. -
PassManager.run()ahora acepta un argumentoproperty_set, que puede establecerse en un objetoMapping-para proporcionar los valores iniciales de los parámetrosPropertySet. Puede utilizarse para reiniciar una compilación parcialmente aplicada o para reutilizar determinados análisis de una compilación anterior en un nuevo lugar. -
La programación pasa
PadDelayyPadDynamicalDecouplingtienen ahora nuevos argumentos en sus constructores:targetydurations. Se utilizan para especificar elTargetoInstructionDurationsrespectivamente. Para acceder a las duraciones de las instrucciones cuando se ejecuta el pase, se requiere uno de los argumentos. -
Se ha añadido un nuevo método
seconds_to_dt()a la claseTargetclase. Se utiliza para traducir una duración en segundos a un número de pasos temporales discretizados de la resolución temporal del sistema especificada en el atributoTarget.dtatributo. Esto suele ser útil para convertir elInstructionProperties.durationvalor a unidades dedt. -
El transpilador
Split2QUnitariestranspilador ha sido mejorado para manejar el caso en el que el unitario en consideración puede ser escrito como una puertaSwapGatey dos puertas de un solo qubit. En este caso, divide el unitario y también aplica el intercambio virtual, de forma similar a lo que se hace enElidePermutations. Esta funcionalidad se puede controlar con un nuevo argumento,split_swap, en el constructor de :class`.Split2QUnitaries`, que se puede utilizar para desactivar la división de puertas equivalentes de intercambio.
Herramientas Opciones
-
qiskit.utilsahora contiene utilidades para proporcionar un mejor control e inspección de Qiskit'smultiprocessingde Qiskit. En concreto, ahora se puede utilizarshould_run_in_parallel()para consultar siparallel_map()(y pasar gestores) lanzará subprocesos para entradas adecuadas, y utilizar el gestor de contextoshould_run_in_parallel.override()para anular temporalmente la mayor parte de la configuración del sistema y del usuario en torno a esta decisión.Una función adicional,
default_num_processes()lee el número máximo por defecto de subprocesos que Qiskit utilizará para el paralelismo basado en procesos. -
Una nueva variable de entorno,
QISKIT_IGNORE_USER_SETTINGS, controla ahora si se lee el archivo de configuración del usuario enimport qiskit. Si se establece en la cadenatrue, no se leerá el archivo de configuración. Esto resulta útil para aislar ciertas instancias de Qiskit del entorno del sistema, como por ejemplo para realizar pruebas.
Notas de actualización
-
Qiskit v2.0 ha dejado de ser compatible con Linux i686 y Windows de 32 bits. A partir de Qiskit v2.0.0, se requiere una plataforma de 64 bits para ejecutar Qiskit. Esto se ajusta a la tendencia de la comunidad científica Python y permite a Qiskit centrarse en la mejora del rendimiento de un hardware de computación cuántica cada vez más complejo.
Qiskit v1.4 seguirá siendo compatible con plataformas de 32 bits hasta el final de su vida útil (septiembre de 2025), pero a partir de esta versión 2.0.0, Qiskit dejará de publicar binarios precompilados para ellas, y no ofrece ninguna garantía de éxito de las compilaciones de código fuente en plataformas de 32 bits.
-
La versión mínima de Rust soportada para construir Qiskit desde el código fuente es ahora v1.79. Se ha aumentado desde v1.70, la versión mínima anterior de Rust soportada en la serie de versiones de Qiskit v1.x.
-
Qiskit Pulse se ha eliminado por completo en esta versión, tras su desaparición en Qiskit v1.3. Esto incluye todos los archivos del módulo de pulsos, la funcionalidad de visualización de pulsos, soporte para
ScheduleBlocky serialización y deserialización de puertas de pulsos en QPY, gestión de calibraciones enQuantumCircuit,TargetyDAGCircuity backends falsos basados en pulsos. Para más detalles sobre los componentes eliminados relacionados con el pulso, consulte las secciones correspondientes a continuación.Tenga en cuenta que la migración de Pulse a Qiskit Dynamics, como era el plan inicial tras la desaparición de Pulse, ha quedado en suspenso debido a las prioridades de desarrollo de Qiskit Dynamics. Los usuarios que deseen utilizar Qiskit Pulse como frontend de backends compatibles o en otros casos de uso pueden seguir utilizándolo en versiones de Qiskit anteriores a v2.0.0, que incluyen la funcionalidad Pulse.
-
Las funciones
sequenceyscheduledel módulocompilerhan sido eliminadas tras su desaparición en Qiskit v1.3. Confiaban en poder traducir los circuitos a componentes de impulsos utilizando definiciones de backend, una capacidad que ya no existe. Por esta razón se han eliminado sin que se haya propuesto ninguna alternativa. Tenga en cuenta que estas eliminaciones se refieren al paquete Pulse, que también se está eliminando en Qiskit 2.0.
Notas sobre la actualización de circuitos
-
BityRegisterasí como sus subclases, ya no se garantiza que sean comparables utilizando las comprobaciones deis, debido a las conversiones a y desde Python que pueden reasignar cada instancia expuesta a Python. -
BityRegister(y sus subclases) ya no pueden subclasificarse. Nunca se pretendió que este fuera un comportamiento soportado, y hacerlo causaría un comportamiento no especificado en Qiskit. Ya no es posible hacerlo como un detalle de implementación de las clases. -
Ya no es posible crear instancias de la base
BityRegisterbase. La instanciación directa de estas clases estaba claramente documentada como algo que no estaba soportado, y poder hacerlo era sólo un artefacto de implementación de la jerarquía de clases en versiones anteriores. A partir de Qiskit v2.0.0, ya no es posible hacerlo. -
El módulo
qiskit.circuit.classicalfunctionse ha eliminado tras su desaparición en Qiskit v1.4. Esto incluye la claseClassicalFunction, su función relacionadaclassical_functiony la claseBooleanExpression. Este cambio se ha realizado para eliminar la dependencia de la bibliotecatweedledum, que ya no es compatible con todas las plataformas y versiones de Python soportadas por Qiskit.ClassicalFunctionse utilizaba exclusivamente enPhaseOracleque se ha actualizado para aceptar únicamente expresiones en formatostring(véase la siguiente nota de la versión).BooleanExpressionha sido sustituida por la nuevaBitFlipOracleGateclase. -
La clase
PhaseOracleya no depende de la bibliotecatweedledum, puesto que la dependencia no se mantiene activamente. La interfaz se ha simplificado: ya no acepta el parámetrosynthesizer, y el parámetroexpressionsólo puede ser una cadena. El tipoClassicalFunctionanteriormente aceptado, obsoleto en Qiskit v1.4, ha sido eliminado en Qiskit v2.0.A pesar de estas mejoras, el uso estándar de la clase
PhaseOracleno ha cambiado:from qiskit.circuit.library.phase_oracle import PhaseOracle bool_expr = "(x0 & x1 | ~x2) & x4" oracle = PhaseOracle(bool_expr) oracle.draw('mpl')
Tenga en cuenta que este cambio puede afectar a la eficacia de la síntesis, pero era necesario para la compatibilidad con todas las plataformas y versiones de Python compatibles con Qiskit.
-
Actualizada la métrica utilizada para comprobar conmutaciones en
CommutationChecker. Se supone que dos puertas conmutan si la fidelidad media de la conmutación es superior a(1 - 1e-12). Este valor se elige para tener en cuenta los errores de redondeo en el cálculo de la fidelidad y por coherencia conRemoveIdentityEquivalentyTwoQubitWeylDecomposition. Consulte la documentación de la clase para obtener más información. -
El método
QuantumCircuit.measure_active()ha cambiado el nombre del registro clásico que crea, ya que el nombre anterior entraba en conflicto con una palabra reservada deOpenQASM. En lugar demeasure, ahora se llamameas, alineándose con el nombre de registro utilizado pormeasure_all(). -
El método
DAGCircuit.control_flow_op_nodes()se ha actualizado para que siempre devuelva una lista, aunque esté vacía. Anteriormente, devolvíaNonesi estaba vacía, y nunca devolvía una lista vacía, lo que requería un manejo especial. Si necesita comprobar explícitamente la vacuidad tanto en Qiskit v1.x como en v2.x, puede hacerlo:control_flow_nodes = dag.control_flow_op_nodes() if not control_flow_nodes: # There are no control-flow nodes. pass -
BlueprintCircuit.copy_empty_like()devuelve ahora unQuantumCircuitcon el mismo número de qubits y clbits, y los mismos metadatos que el circuito original, en lugar de unBlueprintCircuit. Este cambio soluciona un comportamiento inesperado en el que, al tratar con una copia "vacía" de un circuito de plano, se reconstruían los datos del circuito. Tenga en cuenta queBlueprintCircuit.copy()sigue devolviendo unBlueprintCircuit. AunqueBlueprintCircuitno es una clase pública, ya que es un tipo interno utilizado para construir entradas heredadas enqiskit.circuit.libraryesto afecta a sus subclases comoNLocalyZZFeatureMap. Consulte laqiskit.circuit.librarypara obtener una lista completa de las clases afectadas por este cambio. Corregido #13535 -
Se ha eliminado la función interna
qiskit.circuit.add_control.add_control. Esta función no formaba parte de la API pública, tenía que cumplir unas frágiles condiciones previas y era una fuente habitual de errores. Los usos deadd_control(SomeGate(...), ...)deberían cambiar aSomeGate(...).control(...)utilizandoGate.control()que es mucho más seguro. -
El método
ParameterExpression.sympify()puede ahora lanzar una excepciónMissingOptionalLibrarysisympyno está instalado. En las versiones de Qiskit v1.x, siempre se garantizaba la instalación desympy, pero a partir de v2.0.0, esto ya no es un requisito obligatorio y puede que sólo sea necesario si utilizas este método. Dado que esta funcionalidad requiere explícitamentesympy, debe asegurarse de que tienesympyinstalado para utilizar el método. -
El argumento
DAGNodedagha sido eliminado de la claseDAGNodey sus subclases:DAGOpNode,DAGOutNodeyDAGInNode.El parámetro
dagera un argumento opcional al construir estos objetos, pero no se utiliza y se ignora desde la versión v1.3, y está obsoleto desde la versión v1.4. -
Los siguientes
QuantumCircuitmétodos:castcbit_argument_conversioncls_instancescls_prefixqbit_argument_conversion
tras su desaparición en Qiskit 1.2. Estos métodos eran funciones de ayuda internas y nunca se pretendió que fueran API públicas. No se proporciona ninguna sustitución.
-
Los atributos obsoletos para
InstructionyGatedurationyunithan sido eliminados, por lo que ya no se pueden establecer los argumentosunitodurationpara ningunaqiskit.circuit.Instructiono subclase. Estos atributos estaban obsoletos en Qiskit v1.3.0 y se utilizaban para adjuntar una duración de ejecución personalizada y una unidad para esa duración a una instrucción individual. Sin embargo, la fuente de verdad de la duración de una puerta es elBackendV2Targetque contiene la duración de cada instrucción soportada en el backend. La duración de una instrucción no suele ser ajustable por el usuario y es una propiedad inmutable del backend. Si anteriormente utilizó esta función para experimentar con diferentes duraciones de puerta, puede mutar el campoInstructionProperties.durationen un campoTargetpara establecer una duración personalizada para una instrucción en un backend. (La unidad está siempre en segundos en elTarget.) -
El atributo obsoleto para
qiskit.circuit.InstructionyGate:conditionha sido eliminado. Esta funcionalidad ha sido sustituida por la claseIfElseOpque puede utilizarse para describir una condición clásica en un circuito. Este atributo quedó obsoleto en la versión v1.3.0. -
Los métodos obsoletos para
InstructionyGate:c_ifycondition_bitshan sido eliminados. Estos métodos quedaron obsoletos en la versión v1.3.0. Esta funcionalidad ha sido sustituida por la claseIfElseOpque puede utilizarse para describir una condición clásica en un circuito. Por ejemplo, un circuito que antes utilizabaInstruction.c_if()como:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, 2) qc.h(0) qc.x(0).c_if(0, 1) qc.z(1.c_if(1, 0) qc.measure(0, 0) qc.measure(1, 1)Se puede volver a escribir de esta manera:
qc = QuantumCircuit(2, 2) qc.h(0) with expected.if_test((expected.clbits[0], True)): qc.x(0) with expected.if_test((expected.clbits[1], False)): qc.z(1) qc.measure(0, 0) qc.measure(1, 1) -
Se ha eliminado el método obsoleto
InstructionSet.c_if. Este método quedó obsoleto en la versión 1.3.0. Esta funcionalidad ha sido sustituida por la claseIfElseOpque puede utilizarse para describir una condición clásica en un circuito. -
Como parte de la eliminación de Pulse en Qiskit v2.0.0, se ha eliminado la propiedad
calibrationsde la propiedadQuantumCircuit,DAGCircuityDAGDependencyy. Además, se ha eliminado el métodohas_calibration_forde los archivosQuantumCircuityDAGCircuityadd_calibrationde las clasesQuantumCircuit. -
Se ha retirado el módulo
qiskit.circuit.classicalfunction. Este módulo dependía de la bibliotecatweedledum, que no es compatible con las versiones más recientes de Python. Como alternativa, elPhaseOracleGateyBitFlipOracleGatepara generar circuitos a partir de expresiones booleanas. -
La representación interna de
UnitaryGatecuando se añade a unQuantumCircuitha cambiado. El objeto almacenado en el circuito ya no compartirá necesariamente una referencia común con el objeto añadido al circuito. Este comportamiento nunca estaba garantizado, y mutar el objetoUnitaryGatedirectamente o por referencia era siempre poco sólido y podía corromper el circuito, especialmente cuando se modificaba la matriz. Si necesitas mutar un elemento en el circuito (lo cual no es recomendable ya que es ineficiente y propenso a errores), haz algo como:from qiskit.circuit import QuantumCircuit from qiskit.quantum_info import random_unitary from qiskit.circuit.library import UnitaryGate import numpy as np qc = QuantumCircuit(2) qc.unitary(np.eye(2, dtype=complex)) new_op = UnitaryGate(random_unitary(2)) qc.data[0] = qc.data[0].replace(operation=new_op)Esto también se aplica a
DAGCircuitpero puede utilizarDAGCircuit.substitute_node()en su lugar. -
El atributo
CircuitInstruction.paramsde un archivoCircuitInstructionque contiene unUnitaryGatepara suoperationya no contendrá la matriz unitaria subyacente de la puerta. Esto se debe a que la representación interna de la puerta ya no trata el objeto matriz como un parámetro. Si necesita acceder a la matriz de la puerta, puede hacerlo a través de los botonesCircuitInstruction.matrixo el campoUnitaryGate.paramsdel campoCircuitInstruction.operation.
Notas sobre la actualización de primitivas
-
Como consecuencia de la eliminación del modelo
BackendV1, elBackendSamplerV2yBackendEstimatorV2ya no aceptan entradas de tipoBackendV1en su argumento de entradabackend. -
Se han eliminado las implementaciones primitivas de V1 y los alias de tipos no versionados de V1-exclusive, obsoletos en Qiskit v1.2. Estas interfaces han sido sustituidas por sus homólogas V2. La eliminación incluye las siguientes clases que implementan las interfaces V1 :
Estimatoren favor de su equivalente en V2,StatevectorEstimatorSampleren favor de su equivalente en V2,StatevectorSamplerBackendEstimatoren favor de su equivalente en V2,BackendEstimatorV2BackendSampleren favor de su equivalente en V2,BackendSamplerV2
Así como los siguientes alias de tipo no versionados:
BaseEstimatoralias deBaseEstimatorV1BaseSampleralias deBaseSamplerV1
Esta eliminación NO afecta a las definiciones de las interfaces abstractas
BaseEstimatorV1yBaseSamplerV1explícitamente versionadas ni a las clases de resultados y trabajos relacionadas, que se han mantenido para mantener la compatibilidad con versiones anteriores. Si utiliza un alias no versionado de V1-type comoBaseEstimator, puede sustituirlo directamente por el tipo versionado (BaseEstimatorV1).Además, se han eliminado las siguientes funciones de utilidad. Estas funciones sólo se utilizaban en las implementaciones de Primitive V1 :
init_circuitpara inicializar un circuito a partir de aStatevectorutiliceQuantumCircuit.initialize()en su lugar.init_observableutilice el constructor deSparsePauliOpen su lugar.final_measurement_mapping: utiliceQuantumCircuit.layout()ySparsePauliOp.apply_layout()para ajustar un operador para un diseño. En caso contrario, utilicemthree.utils.final_measurement_mapping. Consulte las funciones de Mthree Utility para obtener más información.
Notas de actualización para proveedores
-
El método
configurationdeBasicSimulatorha sido eliminado tras su desaparición en Qiskit v1.3. Este método devolvía una instancia deBackendConfiguration, una clase que formaba parte del flujo de trabajo descatalogado deBackendV1y que también se ha eliminado en Qiskit v2.0.0. Los elementos de configuración individuales se pueden recuperar ahora directamente desde el backend o desde la instancia contenidaTargetcontenida (backend.target). -
El método
run_experimentdeBasicSimulatorha sido eliminado. Este método tomaba una instancia de la claseQasmQobjExperimentcomo argumento de entrada, una clase que ha quedado obsoleta desde Qiskit v1.2 y que fue eliminada con el flujo de trabajoQobjen Qiskit v2.0.0. -
El modelo
BackendV1se ha eliminado tras su desaparición en Qiskit 1.2.0. Esto incluye la claseBackendV1, así como los módulos y utilidades relacionados, ya que han sido sustituidos por el modeloBackendV2modelo. La lista de elementos retirados incluye:-
BackendV1clase: el núcleo del modelo eliminado -
Todos los elementos de
qiskit/providers/models, ya que se utilizaron para representar componentes del modeloBackendV1:BackendConfigurationBackendPropertiesBackendStatusQasmBackendConfigurationPulseBackendConfigurationUchannelLOGateConfigPulseDefaultsPulseQobjDefCommandGatePropertiesNduvJobStatus: Esta clase ha sido sustituida por la más utilizadaJobStatusPulseDefaults
-
BackendV2Converterclase: se utiliza para convertir deBackendV1aBackendV2 -
convert_to_targetfunción: se utiliza para construir unaTargetinstancia a partir de componentes heredados deBackendV1(comoBackendConfigurationoBackendProperties) -
BackendPropertyErroryBackendConfigurationError: excepciones vinculadas a clases eliminadas
-
-
El backend
BasicSimulatorbackend ya no puede simular el flujo de control clásico. Sólo soportaba el uso de.c_if()/.conditionpara modelar el flujo de control, pero esta construcción ha sido eliminada del modelo de datos de Qiskit. -
Todas las clases falsas de backend basadas en el obsoleto
BackendV1han sido eliminadas del móduloproviders.fake_providermódulo. Estas clases están obsoletas desde Qiskit 1.2 y formaban parte del flujo de trabajo obsoleto deBackendV1. Su uso en las pruebas se ha sustituido por la claseGenericBackendV2que permite crear instancias personalizadas deBackendV2que implementan unBackendV2.run(). La supresión afecta:-
Clases base:
FakeBackendFakePulseBackendFakeQasmBackend
-
Falsos backends para pruebas especiales:
Fake1QFakeOpenPulse2QFakeOpenPulse3Q
-
Falsos backends heredados:
Fake5QV1Fake20QV1Fake7QPulseV1Fake27QPulseV1Fake127QPulseV1
-
-
Como parte de la eliminación de pulsaciones en Qiskit v2.0.0, se han eliminado los siguientes métodos:
qiskit.providers.BackendV2.instruction_schedule_mapqiskit.providers.BackendV2.drive_channelqiskit.providers.BackendV2.measure_channelqiskit.providers.BackendV2.acquire_channelqiskit.providers.BackendV2.control_channel
-
Como parte de la eliminación del pulso en Qiskit v2.0.0, el soporte de pulso ha sido eliminado de
GenericBackendV2. Esto incluye la posibilidad de inicializar el backend con calibraciones personalizadas (argumentocalibrate_instructions) y atributos de canal de impulsos (drive_channel,measure_channel,acquire_channel,control_channel). -
Eliminadas las clases base abstractas
ProvideryProviderV1, obsoletas desde Qiskit v1.1.0. La abstracción proporcionada por estas definiciones de interfaz no ofrecía un valor significativo, ya que sólo incluía los atributosname,backends, y un métodoget_backend().A rovider, como concepto, seguirá existiendo como una colección de backends. Si actualmente está implementando un proveedor, puede ajustar su código simplemente eliminando
ProviderV1como clase padre de su implementación.Como parte de este cambio, es probable que desee añadir una implementación de
get_backendpara la compatibilidad con versiones anteriores. Por ejemplo:def get_backend(self, name=None, **kwargs): backend = self.backends(name, **kwargs) if len(backends) > 1: raise QiskitBackendNotFoundError("More than one backend matches the criteria") if not backends: raise QiskitBackendNotFoundError("No backend matches the criteria") return backends[0]
Notas sobre la actualización de QPY
-
La función
qpy.load()puede ahora lanzar una excepciónMissingOptionalLibrarysi se pasa una carga útil QPY v10, v11, o v12 que utiliza expresiones simbólicassymengineysymengineno está instalada. También se lanza la excepción sisympyno está instalado para ninguna otra carga útil QPY anterior a v13. En las versiones de Qiskit v1.x, siempre se garantizaba la instalación desymengineysympy. Sin embargo, a partir de v2.x esto ya no es un requisito obligatorio y puede que sólo sea necesario si está deserializando un archivo QPY que se generó utilizandosymengine. El análisis sintáctico de estas cargas útiles QPY requieresymengineya que su uso forma parte de la especificación de formato para QPY v10, v11, y v12. Si la carga útil lo requiere, instalar una versión compatible desymengine(0.11.0o0.13.0) es la única opción. Del mismo modo, se utilizósympyparaParameterExpressioncodificación para todas las versiones QPY 1 - 12. -
La versión mínima de compatibilidad con QPY,
QPY_COMPATIBILITY_VERSIONha pasado de 10 (el requisito de la versión v1.x ) a 13. Esta versión controla la versión mínima de QPY que puede emitir la funciónqpy.dump()función. Esto significa queqpy.dump()sólo puede emitir QPY v13 y v14 en esta versión. QPY v13 sigue siendo compatible con Qiskit v1.3.x y v1.4.x, lo que significa que las cargas útiles generadas en Qiskit v2.x con QPY v13 pueden seguir cargándose con la serie de versiones Qiskit v1.x.Este cambio fue necesario porque las versiones 10 -12 de QPY requieren las librerías
sympyosymenginepara generar una serialización de objetosParameterExpressionobjetos, pero en Qiskit 2.x no se requiere ninguna de las dos bibliotecas para elParameterExpressionobjeto. -
Con la eliminación de pulse en Qiskit v2.0.0, el soporte para serializar programas
ScheduleBlocka través de la funciónqiskit.qpy.dump()ha sido eliminado. Los usuarios aún pueden cargar cargas útiles que contengan puertas de impulsos utilizando la funciónqiskit.qpy.load()sin embargo, serán tratadas como instrucciones personalizadas opacas. CargarScheduleBlockpayloads ya no está soportado y causará unaQpyErrorexcepción.
Notas sobre la actualización de Synthesis
-
El argumento invocable
atomic_evolutiondeProductFormula(y sus subclasesQDrift,LieTrotterySuzukiTrotter) tiene una nueva firma de función. La firma antigua tomaría algún operador de Pauli y coeficiente de tiempo y devolvería el circuito de evolución:def atomic_evolution(pauli_op: SparsePauliOp, time: float) -> QuantumCircuit: evol_circuit = QuantumCircuit(pauli_op.num_qubits) # append operators to circuit return evol_circuitLa nueva firma toma directamente un circuito existente y debe añadir a este circuito la evolución del Pauli proporcionado y del tiempo dado:
def atomic_evolution(evol_circuit: QuantumCircuit, pauli_op: SparsePauliOp, time: float): # append operators to circuit, in-place modificationEsta nueva aplicación mejora considerablemente el rendimiento.
Notas sobre la actualización del transpilador
-
Aumentado el umbral mínimo para cuando se asume que las puertas son la identidad en
RemoveIdentityEquivalentde épsilon máquina a1e-12para tener en cuenta los errores de redondeo en el cálculo de la fidelidad y por coherencia con las otras clases, comoCommutationAnalysisyTwoQubitWeylDecomposition. -
El nombre de la etapa del plugin de enrutamiento
defaultestá ahora reservado para el plugin integrado de Qiskit del mismo nombre. -
La etapa del complemento de enrutamiento predeterminado ahora es
"default". En Qiskit v2.0.0, se trata simplemente de un alias del anterior valor por defecto"sabre". El algoritmo predeterminado subyacente puede cambiar en el transcurso de la serie de versiones de Qiskit v2.x para algunos o todos los objetivos, pero siempre se puede establecer explícitamenterouting_method="sabre"para mantener el comportamiento actual. -
El nombre de etapa del plugin de traducción
defaultahora está reservado para el plugin integrado de Qiskit del mismo nombre. -
La etapa del complemento de traducción predeterminada ahora es
"default". En Qiskit 2.0, se trata simplemente de un alias del anterior valor por defecto"translator". El algoritmo por defecto subyacente puede cambiar en el transcurso de la serie Qiskit 2.x para algunos o todos los objetivos, pero siempre se puede establecertranslation_method="translator"explícitamente para mantener el comportamiento actual. -
Los pases de programación heredados
ASAPSchedule,ALAPSchedule,DynamicalDecoupling, yAlignMeasuresse han eliminado en favor de las alternativas actualizadasALAPScheduleAnalysis,ASAPScheduleAnalysis,PadDynamicalDecouplingyConstrainedReschedulerespectivamente. Estos fueron obsoletos en Qiskit v1.1 después de que el nuevo flujo de trabajo de programación sustituyera al anterior. -
En el caso de que no se especifique ni un
targetni un conjunto debasis_gates, elHighLevelSynthesistranspiler pass sintetiza circuitos con operaciones anotadas con menos capas de envolturas que antes (esto ocurre, por ejemplo, para el circuito producido pormultiplier_cumulative_h18()). -
El argumento de palabra clave
property_setestá ahora reservado enBasePassManager.run()y no se puede utilizar comokwargque se reenviará a la conversión de la subclase de la representación frontal a la representación interna. -
En Qiskit se han eliminado los siguientes usos obsoletos del objeto
BackendPropertiesen el proceso de transpilación 2.0:backend_propertiesargumento de entrada entranspile()backend_propertiesargumento de entrada enPassManagerConfigbackend_propertiesargumento de entrada engenerate_preset_pass_manager()backend_propertiesargumento de entrada engenerate_routing_passmanager()backend_propertiesargumento de entrada engenerate_translation_passmanager()backend_propertiesargumento de entradaTarget.from_configuration()
También se han actualizado los siguientes pases para que sólo acepten un
targeten lugar de:backend_propargumento de entrada enDenseLayoutpropertiesargumento de entrada enVF2Layoutpropertiesycoupling_mapargumentos de entrada enVF2PostLayoutbackend_propsargumento de entrada enUnitarySynthesis
La clase
BackendPropertiesha quedado obsoleta desde Qiskit v1.2, ya que formaba parte del flujo de trabajoBackendV1. Las propiedades específicas de las instrucciones, como los errores de puerta o las duraciones, pueden añadirse a unaTargeten el momento de su construcción mediante el métodoTarget.add_instruction()y se comunican a los pases del transpilador correspondientes a través del argumento de entradatarget. -
Como consecuencia de la eliminación del modelo
BackendV1, se han actualizado los tipos de entrada aceptados de los siguientes objetos del transpilador:- En
generate_preset_pass_manager()ytranspile()ya no aceptan entradas de tipoBackendV1en su argumento de entradabackend. - El método
Target.from_configuration()ya no acepta el argumentobackend_properties - Se ha eliminado el método
Target.target_to_backend_properties()
- En
-
El
ResetAfterMeasureSimplificationpass del transpilador utiliza ahora unIfElseOppara condicionar la ejecución delXGateen lugar de establecer un atributoconditionen la puerta. Esto se debe a que el atributoconditionha sido eliminado del modelo de datos de Qiskit. -
Se ha eliminado el paso de transpilador
ConvertConditionsToIfOps, que estaba obsoleto. El atributo subyacenteconditiondeInstructionse ha eliminado, por lo que este pase del transpilador ya no tenía nada a partir de lo que convertir. En su lugar, debe utilizar directamenteIfElseOppara condicionar clásicamente la ejecución de una operación. -
En
PadDelayyPadDynamicalDecouplingrequieren ahora un nuevo argumento cuando se construyen. Es necesario especificartargetodurationscon un carácterTargetoInstructionDurationsrespectivamente. Sin ellas, los pases no pueden determinar la duración de las instrucciones en el circuito y se equivocarán. Anteriormente, estos pases determinaban estos valores a partir del atributoduration, ahora eliminado, de los objetosInstructionobjetos. -
Se ha suprimido el pase de transpilador
AlignMeasures, anteriormente obsoleto. Este paso quedó obsoleto en Qiskit v1.1.0. En su lugar, debe utilizarse elConstrainedReschedulepass.ConstrainedReschedulerealiza la misma función y también admite la alineación con restricciones temporales adicionales. -
Al programar mediante
generate_preset_pass_manager()otranspile(), si se especifica el argumentoinstruction_durations, las duraciones se formatean comolist, y están en unidades dedt. También debe establecer el argumento de entradadtde la función de transpilación. -
Eliminado el atributo obsoleto
DAGNode.sort_key. Este atributo quedó obsoleto en la versión de Qiskit v1.4.0. Como la ordenación topológica lexicográfica se realiza internamente en Rust y el atributo sort key no se utilizaba, se eliminó este atributo para evitar la sobrecarga de la creación de nodos DAG. Si te has basado en la clave de ordenación, puedes reproducirla desde un nodo determinado utilizando algo comodef get_sort_key(node: DAGNode): if isinstance(node, (DAGInNode, DAGOutNode)): return str(node.wire) return ",".join( f"{dag.find_bit(q).index:04d}" for q in itertools.chain(node.qargs, node.cargs) ) -
Los siguientes
transpile()ygenerate_preset_pass_manager()argumentos de entrada, obsoletos desde Qiskit 1.3, han sido eliminados de la API:instruction_durationstiming_constraints
Además, la especificación de puertas base personalizadas a través del argumento
basisgate detranspile()ygenerate_preset_pass_manager(), también obsoleto en Qiskit 1.3, ya no está permitido, y se producirá unValueErroren estos casos.La información que antes se proporcionaba a través de éstos puede seguir especificándose mediante los argumentos
backendotarget. Puede construir una instancia de Target con duraciones de instrucción definidas haciendo:Target.from_configuration(..., instruction_durations=...)Para restricciones temporales específicas:
Target.from_configuration(..., timing_constraints=...)Y para las puertas base personalizadas, puede añadirlas manualmente al objetivo o utilizar
.from_configurationcon una asignación de nombres personalizada, por ejemplo:from qiskit.circuit.library import XGate from qiskit.transpiler.target import Target basis_gates = ["my_x", "cx"] custom_name_mapping = {"my_x": XGate()} target = Target.from_configuration( basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping ) -
En
transpile()ygenerate_preset_pass_manager()generan ahora unUserWarningcuando proporcionan uncoupling_mapy/obasis_gatesjunto con unbackend. En estos casos hay múltiples fuentes de verdad, las intenciones del usuario no siempre están claras y puede haber conflictos quegenerate_preset_pass_manager()pueden no saber cómo resolverse. La alternativa sugerida es definir un objetivo personalizado que combine las restricciones elegidas.Una de estas situaciones es la especificación de una puerta con 3 o más qubits en
backendobasis_gatesjunto con uncoupling_mappersonalizado. El mapa de acoplamiento no proporciona los detalles de conectividad necesarios para poder determinar la acción de la puerta. En estos casos,transpile()ygenerate_preset_pass_manager()plantean ahora unValueError. -
Como parte de la eliminación del pulso en Qiskit 2.0, se han eliminado todas las funciones relacionadas con el pulso y la calibración en el transpilador.
Se han eliminado los siguientes pases y funciones:
qiskit.transpiler.passes.PulseGatespasarqiskit.transpiler.passes.ValidatePulseGatespasarqiskit.transpiler.passes.RXCalibrationBuilderpasarqiskit.transpiler.passes.RZXCalibrationBuilderpasarqiskit.transpiler.passes.RZXCalibrationBuilderNoEchopasarqiskit.transpiler.passes.EchoRZXWeylDecompositionpasarqiskit.transpiler.passes.NoramlizeRXAnglepasarqiskit.transpiler.passes.rzx_templates()función
Se ha eliminado el argumento
inst_mapde los siguientes elementos:- En
generate_preset_pass_manager()ytranspile()funciones - El método
Target.from_configuration()método - El constructor de la
PassManagerConfigclase
Se ha eliminado el soporte de calibración:
calibrationse ha eliminado del constructorInstructionPropertiesy ya no es una propiedad de esa clase.- Los métodos
has_calibration,get_calibration,instruction_schedule_mapyupdate_from_instruction_schedule_maphan sido eliminados de la claseTargetclase.
-
Se ha eliminado el paso de transpilador
StochasticSwapobsoleto y su plugin de etapa de enrutamiento incorporado asociado "estocástico". Se marcaron como obsoletos en la versión de Qiskit v1.3.0. El pass ha sido sustituido por la claseSabreSwapque debe utilizarse en su lugar, ya que ofrece un mejor rendimiento y calidad de salida. Por ejemplo, si el pase se invocó previamente a través de la función transpile, como:from qiskit import transpile from qiskit.circuit import QuantumCircuit from qiskit.transpiler import CouplingMap from qiskit.providers.fake_provider import GenericBackendV2 qc = QuantumCircuit(4) qc.h(0) qc.cx(0, range(1, 4)) qc.measure_all() cmap = CouplingMap.from_heavy_hex(3) backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap) tqc = transpile( qc, routing_method="stochastic", layout_method="dense", seed_transpiler=12342, target=backend.target )esto debería sustituirse por:
tqc = transpile( qc, routing_method="sabre", layout_method="dense", seed_transpiler=12342, target=backend.target ) -
Se ha eliminado el pase
qiskit.transpiler.passes.CXCancellation. Se abandonó en favor de class:.InverseCancellation,, que es más genérico.CXCancellation()es totalmente equivalente semánticamente aInverseCancellation([CXGate()]). -
El
SolovayKitaevtranspiler pass ya no lanza una excepción en circuitos que contienen operaciones single-qubit sin un métodoto_matrix(como medidas, barreras y operaciones de flujo de control) u operaciones single-qubit parametrizadas, sino que las dejará sin cambios. -
Los plugins para la etapa de traslación de los gestores de pases predefinidos ahora deben respetar
Targetla direccionalidad de la puerta en su salida. Anteriormente,transpile()ygenerate_preset_pass_manager()generarían unPassManagerque contenía pases de arreglo si era necesario. Ahora debe incluirlas en su propio escenario personalizado, si su escenario no garantiza que respeta la direccionalidad.Puede utilizar el
GateDirectionpass para realizar los mismos arreglos que hacía Qiskit. Por ejemplo:from qiskit.transpiler import PassManager from qiskit.transpiler.passes import GateDirection from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin class YourTranslationPlugin(PassManagerStagePlugin): def pass_manager(self, pass_manager_config, optimization_level): pm = PassManager([ # ... whatever your current setup is ... ]) # Add the two-qubit directionality-fixing pass. pm.append(GateDirection( pass_manager_config.coupling_map, pass_manager_config.target, )) return pm -
Los gestores de pases preestablecidos ya no rellenan la etapa
pre_optimizationimplícita de su salidaStagedPassManager. Ahora puede asignar con seguridad su propioPassManagera este campo. Anteriormente sólo se podía añadir al archivoPassManager. -
El valor por defecto del argumento
generate_routing_passmanager()argumentoseed_transpilerha cambiado deNonea-1. Este cambio se hizo porque esta bandera sólo se utiliza para configurar elVF2PostLayouttranspiler pass, y para ese pass, la aleatorización normalmente degrada el rendimiento y no es deseable. Si confió en el valor predeterminado anterior, puede restaurar este comportamiento estableciendo explícitamente el argumentoseed_transpiler=None. Si ha establecido explícitamente un valor de semilla para este parámetro, no se produce ningún cambio en el comportamiento.
Notas sobre la actualización de la visualización
-
El parámetro
idle_wiresde todos los cajones de circuitos se ha ampliado con una nueva opción,"auto", que ahora es el comportamiento por defecto. Si aún así desea mostrar los cables sin instrucciones, configure explícitamenteidle_wires=True.Cuando se configura en
"auto", el comportamiento es el siguiente:- Si el circuito tiene un atributo
.layoutdefinido,idle_wiresse establece automáticamente enFalse(ocultando los cables inactivos) - De lo contrario,
idle_wirespermaneceTrue(mostrando todos los cables, como era el valor predeterminado anterior)
El siguiente ejemplo muestra un circuito sin esquema visualizado mediante
idle_wires="auto":qr_0: ──────── ┌───┐┌─┐ qr_1: ┤ H ├┤M├ └───┘└╥┘ cr_0: ══════╬═ ║ cr_1: ══════╩═Una vez que se aplica un diseño,
idle_wires="auto"estableceidle_wiresenFalse, ocultando los cables inactivos:┌───┐┌─┐ qr_1 -> 1 ┤ H ├┤M├ └───┘└╥┘ cr_1: ══════╩═Si desea visualizar todos los cables de un circuito trazado, configure
idle_wires=Trueexplícitamente:qr_0 -> 0 ──────── ┌───┐┌─┐ qr_1 -> 1 ┤ H ├┤M├ └───┘└╥┘ ancilla_0 -> 2 ──────╫─ ║ cr_0: ══════╬═ ║ cr_1: ══════╩═A medida que los ordenadores cuánticos escalan a más qubits, incluso los circuitos pequeños pueden producir grandes representaciones de circuitos tras la transpilación. El ajuste
"auto"ayuda a mejorar la legibilidad ocultando los cables innecesarios cuando es posible. - Si el circuito tiene un atributo
-
La función
array_to_latex()y el métodoOperator.draw()pueden ahora lanzar una excepciónMissingOptionalLibrarysi la bibliotecasympyno está instalada. En las versiones de Qiskit v1.x, siempre se garantizaba la instalación desymengineysympy, pero a partir de v2.0.0, esto ya no es un requisito obligatorio. La visualización LaTeX para una matriz depende de la bibliotecasympy, por lo que si utiliza esta funcionalidad, asegúrese de tener instaladasympy. -
Como consecuencia de la eliminación del modelo
BackendV1, laplot_gate_map(),plot_error_map()yplot_circuit_layout()ya no aceptan entradas de tipoBackendV1en su argumento de entradabackend. -
El cajón de línea de tiempo ahora requiere que se especifique el argumento
targetcuando se llama. Como las instrucciones ya no contienen atributos de duración, este argumento adicional es necesario para especificar las duraciones de todas las instrucciones compatibles. Sin el argumento, el cajón de la línea de tiempo no tiene acceso a esta información. -
Como parte de la eliminación de Pulso en Qiskit 2.0, se ha eliminado el soporte para el dibujo de pulso a través de
qiskit.visualization.pulse_drawer.
Herramientas Notas de actualización
-
Los decoradores
deprecate_functionydeprecate_arguments, obsoletos desde Qiskit v0.24 (mayo de 2023), se han eliminado en Qiskit v2.0.0. El actualdeprecate_func()sustituye a@deprecate_functiony la actualdeprecate_arg()sustituye a@deprecate_arguments. -
La función
assembley las capacidades relacionadas (contenidas en el móduloassembler) se han eliminado del código base tras su desaparición en Qiskit v1.2.assemblese utilizó para generar unQobjen el contexto del flujo de trabajo obsoletoBackendV1. La conversión ya no es necesaria, ya que el pipeline de transpilación y primitivas maneja directamente los circuitos cuánticos, dejando obsoleto elQobj.La eliminación incluye los siguientes componentes de la API pública:
qiskit.compiler.assemblefunciónqiskit.assembler.assemble_circuitsfunciónqiskit.assembler.assemble_schedulesfunciónqiskit.assembler.disassemblefunciónqiskit.assembler.RunConfigclase- Método de
qiskit.circuit.Instruction.assemble
-
La estructura
Qobjy las clases relacionadas, obsoletas en Qiskit v1.2.0, han sido eliminadas. Se introdujeron como parte del flujo de trabajo deBackendV1y ya no son necesarios para interactuar conBackendV2backends. Esta supresión afecta a las siguientes clases:QobjExperimentHeaderQobjHeaderQasmQobjQasmQobjInstructionQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQasmExperimentCalibrationsGateCalibrationPulseQobjPulseQobjInstructionPulseQobjExperimentConfigPulseQobjExperimentPulseQobjConfigQobjMeasurementOptionPulseLibraryItem
-
Las clases
MeasLevelyMeasReturnType, anteriormente definidas enqobj/utils.py, se han migrado aresult/models.pytras la supresión del móduloqobj. Estas clases no formaban parte de la API pública. La ruta de importación se ha actualizado de:from qiskit.qobj.utils import MeasLevel, MeasReturnTypea:from qiskit.result import MeasLevel, MeasReturnType. -
Se ha desactivado el uso de argumentos posicionales en el constructor de
Resultse ha desactivado. Por favor, establezca todos los argumentos utilizando la sintaxis kwarg, es decir:Result(backend_name="name", ....). Además, el argumentoqobj_idya no se utilizará en la construcción de losResultinternos. Todavía es posible establecerqobj_idcomo un kwarg genérico, que aterrizará en el campo de metadatos con los otros kwargs genéricos. -
Como parte de la eliminación de pulsaciones en Qiskit 2.0.0, se han eliminado las funciones
sequenceyschedule_circuitdeqiskit.schedulerjunto con la claseScheduleConfig. -
El módulo
qiskit.result.mitigationse ha eliminado tras su desaparición en Qiskit v1.3. La eliminación incluye las clasesLocalReadoutMitigatoryCorrelatedReadoutMitigator, así como las utilidades asociadas. No hay ruta alternativa en Qiskit, ya que su funcionalidad ha sido sustituida por el addon`mthree. <https://github.com/Qiskit/qiskit-addon-mthree> `__
Circuitos obsoletos
-
El atributo obsoleto
QuantumCircuit.durationno se ha eliminado en esta versión como se había previsto inicialmente. En su lugar, se eliminará como parte de la versión de Qiskit v3.0.0. Esta funcionalidad ha sido sustituida por el métodoQuantumCircuit.estimate_duration()que debe utilizarse en su lugar. -
La interfaz obsoleta de tipo tupla para
CircuitInstructionno se ha eliminado en esta versión como se había previsto inicialmente. En su lugar, se eliminará en Qiskit v3.0.0. En su lugar, utilice el botónoperation,qubitsyclbitsatributos con nombre. -
La clase de circuito Multiple-Control-Multiple-Target
MCMTha quedado obsoleta y ha sido sustituida porMCMTGateque es una subclase propia deGatesubclase. El uso de una puerta en lugar de un circuito permite al compilador razonar sobre el objeto a un mayor nivel de abstracción y permite aplicar múltiples plugins de síntesis.
Deprecaciones del transpilador
-
El atributo obsoleto
DAGCircuit.durationno se ha eliminado en esta versión como se había previsto inicialmente. En su lugar, se eliminará como parte de la versión de Qiskit v3.0.0. Esta funcionalidad ha sido sustituida por el métodoQuantumCircuit.estimate_duration()que debe utilizarse en su lugar. -
El argumento
propagate_conditiondeDAGCircuit.substitute_node()yDAGCircuit.substitute_node_with_dag()ha quedado obsoleto. Con la eliminación deInstruction.conditiondel modelo de datos de Qiskit, esta opción ha dejado de tener sentido. Si se fija ya no tiene ningún efecto. No se elimina de la firma para mantener la compatibilidad durante la migración de Qiskit 1.x -> 2.0. Esta opción se eliminará en Qiskit 3.0. -
La función
generate_pre_op_passmanager()está obsoleta. Ya no se utiliza en los gestores de pases preestablecidos de Qiskit, y su propósito es obsoleto; originalmente generaba una etapa de corrección para los plugins de traducción que no respetaban la direccionalidad ISA. Ahora se exige a las etapas de traducción que respeten la direccionalidad, por lo que la funcionalidad no es necesaria, y lo más probable es que no haya que sustituirla.
problemas de seguridad
- Se ha corregido una vulnerabilidad de seguridad en
qpy.load()al cargar cargas útiles que utilizansympypara serializarParameterExpressionobjetos y otras expresiones simbólicas. Esto incluye potencialmente cualquier carga útil QPY que utilice la versión QPY < 10, y opcionalmente 10, 11 y 12 dependiendo de la codificación simbólica utilizada en el paso de serialización (qpy.dump()).
Corrección de errores
-
Se ha corregido una incoherencia en el proceso de transpilación al manejar puertas cercanas a la identidad, donde estas puertas se evaluaban para conmutar con todo por
CommutationAnalysispero no se eliminaban conRemoveIdentityEquivalent. El problema subyacente fue causado porRemoveIdentityEquivalentyCommutationAnalysis(y, por extensión,CommutativeInverseCancellation) utilizando métricas diferentes. Ambos utilizan ahora la fidelidad media de la puerta y el mismo umbral para evaluar si una puerta debe tratarse como identidad (como una puerta de rotación con un ángulo muy pequeño). Consulte los docstrings de estas clases para obtener más información. Corregido #13547. -
Se ha corregido un error en
QuantumCircuit.assign_parameters()que se producía al asignar parámetros a compuertas estándar cuya definición ya se había activado. En este caso, los nuevos valores no se propagaban correctamente a las instancias de la puerta. Aunque el circuito en sí seguía compilándose como se esperaba, al inspeccionar las operaciones individuales seguía apareciendo el parámetro antiguo.Por ejemplo:
from qiskit.circuit.library import EfficientSU2 circuit = EfficientSU2(2, flatten=True) circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True) print(circuit.data[0].operation.params) # would print θ[0] instead of 1.25Corregido #13478.
-
Se ha corregido un error en
DAGCircuitque provocaba que los nodos de salidaVarse convirtieran en nodos de entrada durantedeepcopyy el decapado. -
Se ha corregido un error en la clase
Targetdonde al establecer un nuevo valor para el atributodty posteriormente llamar atarget.durations()no se mostraba el valor actualizado dedten el objeto devueltoInstructionDurationsdevuelto. Esto se soluciona ahora mediante una invalidación de la caché interna de duraciones de instrucciones de destino en el configuradordt. -
Se ha corregido un problema en el
BasisTranslatorpor el que la fase global del DAG no se actualizaba correctamente. Corregido #14074. -
Se ha corregido un error en el
HighLevelSynthesispor el que se sintetizaba cualquier instrucción para la que estuviera disponible un complemento de síntesis, independientemente de si la instrucción ya estaba soportada por el objetivo o formaba parte de la instrucción pasada explícitamentebasis_gates. Ahora se ha corregido este comportamiento, de modo que ya no se sintetizan estas instrucciones ya soportadas. -
El paso de transpilación
InverseCancellationtranspilación se ejecuta ahora dentro de bloques de flujo de control. Anteriormente, ignoraba los pares de puertas que podían cancelarse cuando se definían dentro de bloques clásicos. Consulte el nº 13437 para más detalles. -
Se ha corregido un error con las rotaciones multicontroladas en las que el ángulo de rotación era un
ParameterExpression. Al intentar la síntesis en este caso, se produciría un error que indicaría que la puerta no se puede sintetizar con un parámetro no enlazado. Este fallo afectaba a los métodos de circuito de rotación multicontroladaQuantumCircuit.mcrx(), :meth:.QuantumCircuit.mcry, yQuantumCircuit.mcrz()así como al llamar aRXGate.control(),RYGate.control()oRZGate.control()cuando el ángulo de rotación era unParameterExpression. Ahora, estos circuitos de rotación multicontrolada pueden sintetizarse sin dar lugar a error. -
Se ha corregido un error en QPY (
qiskit.qpy) por el que los circuitos que contenían puertas de claseMCMTGateno se serializaban. Ver #13965. -
Se ha corregido un error que provocaba que
Statevector.expectation_value()diera resultados incorrectos para el operador de identidad cuando el vector de estado no estaba normalizado. Corregido #13029 -
La conversión de un circuito cuántico a una puerta con
converters.circuit_to_instruction()ahora falla correctamente cuando el circuito dado contiene instrucciones de flujo de control. -
Llamar a un
AnalysisPasso aTransformationPasscomo una función (como enpass_ = MyPass(); pass_(qc)) respetará ahora cualquier requisito que pueda tener el pase. Por ejemplo, los pases de programación comoALAPScheduleAnalysisrequieren queTimeUnitConversionse ejecute antes que ellos. La ejecución del pase mediante unPassManagersiempre respetaba este requisito, pero hasta ahora no se respetaba al llamar al pase directamente. -
Cuando una
TranspilerErrorsubclase es lanzada por un pase dentro de una llamada aPassManger.run(), la excepción se propagará ahora sin pérdidas, en lugar de convertirse en una excepción encadenada con un tipo borrado. -
SabreSwapya no contraerá cables qubit ociosos fuera de los bloques de flujo de control durante el enrutamiento. En general, se trataba de una optimización válida, pero no de un efecto secundario esperado de un pase de ruta. Ahora puede utilizar elContractIdleWiresInControlFlowpass para realizar esta contracción. -
Corregido un no-determinismo por proceso en
SparsePauliOp.to_matrix. El orden exacto de las operaciones de coma flotante en la suma variaba antes por proceso, pero ahora será idéntico entre distintas invocaciones del mismo script. Ver #13413.