Skip to main content
IBM Quantum Platform

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

  • ApplyLayout manejará ahora correctamente el caso de aplicar un qubit cero Layout. Anteriormente, afirmaba que no se había establecido ningún diseño, incluso si el campo "layout" del archivo PropertySet era igual a Layout().

  • Se ha corregido un problema en el ElidePermutations transpiler pass, por el que la permutación de salida no se actualizaba correctamente en presencia de PermutationGate operaciones. Esto daría lugar a un circuito de salida incorrecto y a una propiedad virtual_permutation_layout incorrecta en el property_set que se fija. Cuando se ejecuta como parte de un PassManager esto también daría como resultado un TranspileLayout en el circuito de QuantumCircuit.layout en el circuito de salida.

  • Se ha corregido un error en el HighLevelSynthesis pass al desenrollar objetos anidados/personalizados Instruction anidados/personalizados. Si el QuantumCircuit devuelto por Instruction.definition de un objeto personalizado contenía algún objeto Clbit estos bits clásicos utilizarían incorrectamente el índice interno dentro del objeto Instruction.definition QuantumCircuit en lugar de asignarlos al índice correspondiente en el directorio externo QuantumCircuit.

  • Se ha corregido un error en la función PauliEvolutionSynthesisDefault y PauliEvolutionSynthesisRustiq que modificaba el atributo.synthesis del circuito original al establecer preserve_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 VF2Layout y VF2PostLayout utilizaban 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.

  • SabreLayout y SabreSwap ya no entrará en pánico al aplicar el resultado del enrutamiento a un circuito que utilice expr.Var o Stretch en un ámbito de flujo de control anidado.

  • qiskit.circuit.library.quantum_volume() se actualizó para manejar un numpy.random.Generator como entrada para su argumento seed . Anteriormente, un argumento generador de este tipo daba como resultado TypeError.


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 name de la clase OrGate de 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 de AndGate o tener plugins de síntesis para sintetizar un OrGate.

  • Se ha solucionado un problema en el ConsolidateBlocks por el que fallaba la consolidación de algunos bloques si la puerta KAK seleccionada (directamente o a través del objetivo) era supercontrolada y no CXGate. Corregido #14413

  • Corregido un error en las funciones del circuito evolved_operator_ansatz(), qaoa_ansatz() y hamiltonian_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étodo ParameterExpression.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 UnitarySynthesis que ignoraba el parámetro synth_gates y sólo sintetizaba las puertas unitary . El pase ahora sintetiza correctamente todas las compuertas especificadas en el parámetro synth_gates . Corregido #14343.

  • Se ha añadido el soporte repr que faltaba para Duration.

  • Añadido el soporte que faltaba para Python decapado de Duration. Esto impedía la transpilación paralela de circuitos con delay() instrucciones que utilizan expresiones de duración.

  • Se ha corregido un problema en el HighLevelSynthesis que 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 IQP y por iqp(). La implementación anterior utilizaba incorrectamente potencias de la puerta T\sqrt{T} en lugar de potencias de la puerta TT.

  • SabreLayout propagará ahora correctamente las name y metadata de 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 SolovayKitaevSynthesis sí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 SolovayKitaev por 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 SolovayKitaev por el que la aproximación generada podía tener una fase que difería en π\pi del valor correcto. Esto se debe a la representación interna SO(3)SO(3), 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() y generate_preset_pass_manager()) cuando el objetivo es un backend que tiene restricciones de alineación, por ejemplo IBM dispositivos Quantum Eagle como ibm_sherbrooke.

  • La heurística del error de repliegue en VF2Layout y VF2PostLayoututilizada 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 SparseObservable objetos. 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 BoxOp op 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 stretch duraciones para Delay instrucciones, que permiten expresar relaciones entre instrucciones conscientes del tiempo. El nuevo Stretch amplí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 Target contiene puertas de base fraccionaria de dos qubits con soporte para ángulos arbitrarios como RZXGate o RZZGatelo 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 SparseObservable representa 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 Z2 es:

    #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 determinado Target. 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.duration si 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 BitFlipOracleGate y PhaseOracleGate. BitFlipOracleGate se introdujo como alternativa a la síntesis directa de BooleanExpression, que se ha eliminado en Qiskit v2.0. PhaseOracleGate como alternativa a PhaseOracleya que este último quedará obsoleto en todas las versiones de v2.x. Ambas clases comparten la interfaz de PhaseOracleexcepto el método evaluate_bitstring , que ya no existe.

    BitFlipOracleGate sintetiza 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')
    _images/release_notes-1_00.png _images/release_notes-1_01.png
    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')
    _images/release_notes-2_00.png _images/release_notes-2_01.png
  • Un nuevo flujo de control op, BoxOpsu método QuantumCircuit.box() y el gestor de contexto asociados están ahora disponibles en qiskit.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 BoxOp ven 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_degree a CommutationChecker.commute() y CommutationChecker.commute_nodes(). Este argumento permite establecer el umbral de aproximación para cuando las puertas se evalúan como conmutadas. Consulte el docstring de CommutationChecker para 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.classical puede ahora representar expresiones constantes. La clase Expr tiene ahora un atributo booleano const que 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 Var se consideran no constantes, mientras que todas las expresiones Value son 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).const

    Una 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.classical puede ahora representar duraciones utilizando el nuevo tipo Duration.

    El módulo qiskit.circuit también tiene una nueva clase Duration que 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 una Duration instancia:

    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.classical puede ahora representar valores de coma flotante de doble precisión IEEE-754 utilizando el nuevo tipo Float.

    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 (duration y stretch). 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 YGate en 10 qubits, el CXGate recuento se redujo en un 56%.
    • En el caso de HGate en 10 qubits, el CXGate recuento se redujo en un 56%.
    • Para multicontrol SXGate y SXdgGate en 10 qubits, el CXGate recuento se redujo en un 80%.
    • En el caso de UGate en 10 qubits, el CXGate recuento se redujo en un 31%.
  • El módulo clásico de expresiones en tiempo real qiskit.circuit.classical puede ahora representar operaciones aritméticas add(), sub(), mul()y div() 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)):
        pass

    Para más ejemplos, consulte la documentación sobre el módulo.

  • El constructor de UCGate tiene 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 con Initialize.

  • La página PauliEvolutionGate admite ahora de forma nativa SparseObservables 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 Stretch se ha añadido al sistema de expresión clásico para representar variables stretch . Para crear una nueva variable stretch , puede utilizar QuantumCircuit.add_stretch(). La expresión resultante es una expresión constante de tipo Durationque puede utilizarse como argumento de duration de una función delay().

    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 Stretch es muy similar a la expresión Var utilizada para representar variables clásicas en un circuito, salvo que es constante y siempre es del tipo Duration. Puede utilizarse en otras expresiones (por ejemplo, puede multiplicarse por una constante numérica) y QuantumCircuit proporciona 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 Gate versiones de las puertas aritméticas de registro único que permiten al transpilador realizar optimizaciones de alto nivel en comparación con sus QuantumCircuit variantes. Estos son:

Características primitivas

  • Se ha añadido un nuevo método to_bool_array() a la clase BitArray que devuelve la matriz de bits como una matriz booleana NumPy. El argumento order puede 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 dt de GenericBackendV2 en el inicializador de la clase con un nuevo argumento dt . 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 fichero SparseObservable. 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 SparsePauliOp a partir de un SparseObservable utilizando el nuevo método SparsePauliOp.from_sparse_observable(). Es importante recordar que SparseObservable pueden representar eficientemente proyectores, que requieren un número exponencial de términos en el método SparsePauliOp.

  • SparseObservable admite ahora la composición de operadores mediante el método compose() de forma similar a otras clases quantum_info clases. Esto es análogo a la multiplicación de matrices, aunque el método es totalmente libre de matrices.

  • SparseObservable.BitTerm tiene un nuevo atributo labelque 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 tipo SparsePauliOp.

Características de síntesis

Características del transpilador

  • Se ha añadido soporte para trabajar con Target que contienen puertas de base de dos qubits que contienen ángulos arbitrarios, tales como RZZGateal paso ConsolidateBlocks transpilador. 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 que UnitarySynthesis podría optimizar potencialmente el bloque. Internamente, la estimación del número de puertas se realiza mediante la clase TwoQubitControlledUDecomposer clase.

    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 RZZGateal UnitarySynthesis transpilador. La descomposición se realiza utilizando el TwoQubitControlledUDecomposery 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:

    _images/release_notes-3.png

    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")
    _images/release_notes-4.png
  • Se ha añadido un nuevo argumento max_block_width a la clase BlockCollector y a las clases CollectLinearFunctions y CollectCliffords del 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, al CollectMultiQBlocks transpiler pass. Cuando se ajusta a True, 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_degree a CommutationAnalysis. 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 en qiskit.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ícitamente routing_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 establecer translation_method="translator" explícitamente para mantener el comportamiento actual.

  • El pase del transpilador HighLevelSynthesis pass del transpilador sintetiza ahora objetos de tipo AnnotatedOperation a través de la interfaz del plugin.

  • PassManager.run() ahora acepta un argumento property_set , que puede establecerse en un objeto Mapping-para proporcionar los valores iniciales de los parámetros PropertySet. 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 PadDelay y PadDynamicalDecoupling tienen ahora nuevos argumentos en sus constructores: target y durations. Se utilizan para especificar el Target o InstructionDurations respectivamente. 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 clase Target clase. 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 atributo Target.dt atributo. Esto suele ser útil para convertir el InstructionProperties.duration valor a unidades de dt.

  • El transpilador Split2QUnitaries transpilador ha sido mejorado para manejar el caso en el que el unitario en consideración puede ser escrito como una puerta SwapGate y 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 en ElidePermutations. 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.utils ahora contiene utilidades para proporcionar un mejor control e inspección de Qiskit's multiprocessing de Qiskit. En concreto, ahora se puede utilizar should_run_in_parallel() para consultar si parallel_map() (y pasar gestores) lanzará subprocesos para entradas adecuadas, y utilizar el gestor de contexto should_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 en import qiskit. Si se establece en la cadena true, 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 ScheduleBlock y serialización y deserialización de puertas de pulsos en QPY, gestión de calibraciones en QuantumCircuit, Target y DAGCircuity 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 sequence y schedule del módulo compiler han 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

  • Bit y Register así como sus subclases, ya no se garantiza que sean comparables utilizando las comprobaciones de is , debido a las conversiones a y desde Python que pueden reasignar cada instancia expuesta a Python.

  • Bit y Register (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 Bit y Register base. 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.classicalfunction se ha eliminado tras su desaparición en Qiskit v1.4. Esto incluye la clase ClassicalFunction , su función relacionada classical_function y la clase BooleanExpression . Este cambio se ha realizado para eliminar la dependencia de la biblioteca tweedledum , que ya no es compatible con todas las plataformas y versiones de Python soportadas por Qiskit. ClassicalFunction se utilizaba exclusivamente en PhaseOracleque se ha actualizado para aceptar únicamente expresiones en formato string (véase la siguiente nota de la versión). BooleanExpression ha sido sustituida por la nueva BitFlipOracleGate clase.

  • La clase PhaseOracle ya no depende de la biblioteca tweedledum , puesto que la dependencia no se mantiene activamente. La interfaz se ha simplificado: ya no acepta el parámetro synthesizer , y el parámetro expression sólo puede ser una cadena. El tipo ClassicalFunction anteriormente 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 PhaseOracle no ha cambiado:

    from qiskit.circuit.library.phase_oracle import PhaseOracle
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = PhaseOracle(bool_expr)
    oracle.draw('mpl')
    _images/release_notes-5.png

    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 con RemoveIdentityEquivalent y TwoQubitWeylDecomposition. 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 de OpenQASM . En lugar de measure, ahora se llama meas, alineándose con el nombre de registro utilizado por measure_all().

  • El método DAGCircuit.control_flow_op_nodes() se ha actualizado para que siempre devuelva una lista, aunque esté vacía. Anteriormente, devolvía None si 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 un QuantumCircuit con el mismo número de qubits y clbits, y los mismos metadatos que el circuito original, en lugar de un BlueprintCircuit. 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 que BlueprintCircuit.copy() sigue devolviendo un BlueprintCircuit. Aunque BlueprintCircuit no es una clase pública, ya que es un tipo interno utilizado para construir entradas heredadas en qiskit.circuit.library esto afecta a sus subclases como NLocal y ZZFeatureMap. Consulte la qiskit.circuit.library para 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 de add_control(SomeGate(...), ...) deberían cambiar a SomeGate(...).control(...) utilizando Gate.control() que es mucho más seguro.

  • El método ParameterExpression.sympify() puede ahora lanzar una excepción MissingOptionalLibrary si sympy no está instalado. En las versiones de Qiskit v1.x, siempre se garantizaba la instalación de sympy , 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ícitamente sympy , debe asegurarse de que tiene sympy instalado para utilizar el método.

  • El argumento DAGNode dag ha sido eliminado de la clase DAGNode y sus subclases: DAGOpNode, DAGOutNodey DAGInNode.

    El parámetro dag era 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 QuantumCircuit métodos:

    • cast
    • cbit_argument_conversion
    • cls_instances
    • cls_prefix
    • qbit_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 Instruction y Gateduration y unit han sido eliminados, por lo que ya no se pueden establecer los argumentos unit o duration para ninguna qiskit.circuit.Instruction o 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 el BackendV2 Targetque 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 campo InstructionProperties.duration en un campo Target para establecer una duración personalizada para una instrucción en un backend. (La unidad está siempre en segundos en el Target.)

  • El atributo obsoleto para qiskit.circuit.Instruction y Gate: condition ha sido eliminado. Esta funcionalidad ha sido sustituida por la clase IfElseOp que 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 Instruction y Gate: c_if y condition_bits han sido eliminados. Estos métodos quedaron obsoletos en la versión v1.3.0. Esta funcionalidad ha sido sustituida por la clase IfElseOp que puede utilizarse para describir una condición clásica en un circuito. Por ejemplo, un circuito que antes utilizaba Instruction.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 clase IfElseOp que 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 calibrations de la propiedad QuantumCircuit, DAGCircuit y DAGDependency y. Además, se ha eliminado el método has_calibration_for de los archivos QuantumCircuit y DAGCircuit y add_calibration de las clases QuantumCircuit.

  • Se ha retirado el módulo qiskit.circuit.classicalfunction . Este módulo dependía de la biblioteca tweedledum , que no es compatible con las versiones más recientes de Python. Como alternativa, el PhaseOracleGate y BitFlipOracleGate para generar circuitos a partir de expresiones booleanas.

  • La representación interna de UnitaryGate cuando se añade a un QuantumCircuit ha 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 objeto UnitaryGate directamente 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 utilizar DAGCircuit.substitute_node() en su lugar.

  • El atributo CircuitInstruction.params de un archivo CircuitInstruction que contiene un UnitaryGate para su operation ya 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 botones CircuitInstruction.matrix o el campo UnitaryGate.params del campo CircuitInstruction.operation.

Notas sobre la actualización de primitivas

  • Como consecuencia de la eliminación del modelo BackendV1 , el BackendSamplerV2 y BackendEstimatorV2 ya no aceptan entradas de tipo BackendV1 en su argumento de entrada backend .

  • 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 :

    Así como los siguientes alias de tipo no versionados:

    Esta eliminación NO afecta a las definiciones de las interfaces abstractas BaseEstimatorV1 y BaseSamplerV1 explí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 como BaseEstimator, 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 :

Notas de actualización para proveedores

  • El método configuration de BasicSimulator ha sido eliminado tras su desaparición en Qiskit v1.3. Este método devolvía una instancia de BackendConfiguration , una clase que formaba parte del flujo de trabajo descatalogado de BackendV1 y 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 contenida Target contenida (backend.target).

  • El método run_experiment de BasicSimulator ha sido eliminado. Este método tomaba una instancia de la clase QasmQobjExperiment como argumento de entrada, una clase que ha quedado obsoleta desde Qiskit v1.2 y que fue eliminada con el flujo de trabajo Qobj en Qiskit v2.0.0.

  • El modelo BackendV1 se ha eliminado tras su desaparición en Qiskit 1.2.0. Esto incluye la clase BackendV1 , así como los módulos y utilidades relacionados, ya que han sido sustituidos por el modelo BackendV2 modelo. La lista de elementos retirados incluye:

    • BackendV1 clase: el núcleo del modelo eliminado

    • Todos los elementos de qiskit/providers/models, ya que se utilizaron para representar componentes del modelo BackendV1 :

      • BackendConfiguration
      • BackendProperties
      • BackendStatus
      • QasmBackendConfiguration
      • PulseBackendConfiguration
      • UchannelLO
      • GateConfig
      • PulseDefaults
      • PulseQobjDef
      • Command
      • GateProperties
      • Nduv
      • JobStatus: Esta clase ha sido sustituida por la más utilizada JobStatus
      • PulseDefaults
    • BackendV2Converter clase: se utiliza para convertir de BackendV1 a BackendV2

    • convert_to_target función: se utiliza para construir una Target instancia a partir de componentes heredados de BackendV1 (como BackendConfiguration o BackendProperties)

    • BackendPropertyError y BackendConfigurationError: excepciones vinculadas a clases eliminadas

  • El backend BasicSimulator backend ya no puede simular el flujo de control clásico. Sólo soportaba el uso de .c_if()/.condition para 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 BackendV1 han sido eliminadas del módulo providers.fake_provider módulo. Estas clases están obsoletas desde Qiskit 1.2 y formaban parte del flujo de trabajo obsoleto de BackendV1 . Su uso en las pruebas se ha sustituido por la clase GenericBackendV2 que permite crear instancias personalizadas de BackendV2 que implementan un BackendV2.run(). La supresión afecta:

    • Clases base:

      • FakeBackend
      • FakePulseBackend
      • FakeQasmBackend
    • Falsos backends para pruebas especiales:

      • Fake1Q
      • FakeOpenPulse2Q
      • FakeOpenPulse3Q
    • Falsos backends heredados:

      • Fake5QV1
      • Fake20QV1
      • Fake7QPulseV1
      • Fake27QPulseV1
      • Fake127QPulseV1
  • 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_map
    • qiskit.providers.BackendV2.drive_channel
    • qiskit.providers.BackendV2.measure_channel
    • qiskit.providers.BackendV2.acquire_channel
    • qiskit.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 Provider y ProviderV1, 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 atributos name, backends, y un método get_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 ProviderV1 como clase padre de su implementación.

    Como parte de este cambio, es probable que desee añadir una implementación de get_backend para 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ón MissingOptionalLibrary si se pasa una carga útil QPY v10, v11, o v12 que utiliza expresiones simbólicas symengine y symengine no está instalada. También se lanza la excepción si sympy no está instalado para ninguna otra carga útil QPY anterior a v13. En las versiones de Qiskit v1.x, siempre se garantizaba la instalación de symengine y sympy . 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ó utilizando symengine. El análisis sintáctico de estas cargas útiles QPY requiere symengine ya 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 de symengine (0.11.0 o 0.13.0) es la única opción. Del mismo modo, se utilizó sympy para ParameterExpression codificació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ón qpy.dump() función. Esto significa que qpy.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 sympy o symengine para generar una serialización de objetos ParameterExpression objetos, pero en Qiskit 2.x no se requiere ninguna de las dos bibliotecas para el ParameterExpression objeto.

  • Con la eliminación de pulse en Qiskit v2.0.0, el soporte para serializar programas ScheduleBlock a través de la función qiskit.qpy.dump() ha sido eliminado. Los usuarios aún pueden cargar cargas útiles que contengan puertas de impulsos utilizando la función qiskit.qpy.load() sin embargo, serán tratadas como instrucciones personalizadas opacas. Cargar ScheduleBlock payloads ya no está soportado y causará una QpyError excepción.

Notas sobre la actualización de Synthesis

  • El argumento invocable atomic_evolution de ProductFormula (y sus subclases QDrift, LieTrottery SuzukiTrotter ) 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_circuit

    La 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 modification

    Esta 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 RemoveIdentityEquivalent de épsilon máquina a 1e-12 para tener en cuenta los errores de redondeo en el cálculo de la fidelidad y por coherencia con las otras clases, como CommutationAnalysis y TwoQubitWeylDecomposition.

  • El nombre de la etapa del plugin de enrutamiento default está 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ícitamente routing_method="sabre" para mantener el comportamiento actual.

  • El nombre de etapa del plugin de traducción default ahora 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 establecer translation_method="translator" explícitamente para mantener el comportamiento actual.

  • Los pases de programación heredados ASAPSchedule, ALAPSchedule, DynamicalDecoupling, y AlignMeasures se han eliminado en favor de las alternativas actualizadas ALAPScheduleAnalysis, ASAPScheduleAnalysis, PadDynamicalDecouplingy ConstrainedReschedule respectivamente. 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 target ni un conjunto de basis_gates , el HighLevelSynthesis transpiler pass sintetiza circuitos con operaciones anotadas con menos capas de envolturas que antes (esto ocurre, por ejemplo, para el circuito producido por multiplier_cumulative_h18()).

  • El argumento de palabra clave property_set está ahora reservado en BasePassManager.run()y no se puede utilizar como kwarg que 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 BackendProperties en el proceso de transpilación 2.0:

    También se han actualizado los siguientes pases para que sólo acepten un target en lugar de:

    La clase BackendProperties ha quedado obsoleta desde Qiskit v1.2, ya que formaba parte del flujo de trabajo BackendV1 . Las propiedades específicas de las instrucciones, como los errores de puerta o las duraciones, pueden añadirse a una Target en el momento de su construcción mediante el método Target.add_instruction() y se comunican a los pases del transpilador correspondientes a través del argumento de entrada target .

  • Como consecuencia de la eliminación del modelo BackendV1 , se han actualizado los tipos de entrada aceptados de los siguientes objetos del transpilador:

  • El ResetAfterMeasureSimplification pass del transpilador utiliza ahora un IfElseOp para condicionar la ejecución del XGate en lugar de establecer un atributo condition en la puerta. Esto se debe a que el atributo condition ha sido eliminado del modelo de datos de Qiskit.

  • Se ha eliminado el paso de transpilador ConvertConditionsToIfOps , que estaba obsoleto. El atributo subyacente condition de Instruction se 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 directamente IfElseOp para condicionar clásicamente la ejecución de una operación.

  • En PadDelay y PadDynamicalDecoupling requieren ahora un nuevo argumento cuando se construyen. Es necesario especificar target o durations con un carácter Target o InstructionDurations respectivamente. 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 atributo duration , ahora eliminado, de los objetos Instruction objetos.

  • Se ha suprimido el pase de transpilador AlignMeasures , anteriormente obsoleto. Este paso quedó obsoleto en Qiskit v1.1.0. En su lugar, debe utilizarse el ConstrainedReschedule pass. ConstrainedReschedule realiza la misma función y también admite la alineación con restricciones temporales adicionales.

  • Al programar mediante generate_preset_pass_manager() o transpile(), si se especifica el argumento instruction_durations , las duraciones se formatean como list, y están en unidades de dt. También debe establecer el argumento de entrada dt de 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 como

    def 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() y generate_preset_pass_manager() argumentos de entrada, obsoletos desde Qiskit 1.3, han sido eliminados de la API:

    • instruction_durations
    • timing_constraints

    Además, la especificación de puertas base personalizadas a través del argumento basis gate de transpile() y generate_preset_pass_manager(), también obsoleto en Qiskit 1.3, ya no está permitido, y se producirá un ValueError en estos casos.

    La información que antes se proporcionaba a través de éstos puede seguir especificándose mediante los argumentos backend o target . 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_configuration con 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() y generate_preset_pass_manager() generan ahora un UserWarning cuando proporcionan un coupling_map y/o basis_gates junto con un backend. En estos casos hay múltiples fuentes de verdad, las intenciones del usuario no siempre están claras y puede haber conflictos que generate_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 backend o basis_gates junto con un coupling_map personalizado. El mapa de acoplamiento no proporciona los detalles de conectividad necesarios para poder determinar la acción de la puerta. En estos casos, transpile() y generate_preset_pass_manager() plantean ahora un ValueError.

  • 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.PulseGates pasar
    • qiskit.transpiler.passes.ValidatePulseGates pasar
    • qiskit.transpiler.passes.RXCalibrationBuilder pasar
    • qiskit.transpiler.passes.RZXCalibrationBuilder pasar
    • qiskit.transpiler.passes.RZXCalibrationBuilderNoEcho pasar
    • qiskit.transpiler.passes.EchoRZXWeylDecomposition pasar
    • qiskit.transpiler.passes.NoramlizeRXAngle pasar
    • qiskit.transpiler.passes.rzx_templates() función

    Se ha eliminado el argumento inst_map de los siguientes elementos:

    Se ha eliminado el soporte de calibración:

    • calibration se ha eliminado del constructor InstructionProperties y ya no es una propiedad de esa clase.
    • Los métodos has_calibration, get_calibration, instruction_schedule_map y update_from_instruction_schedule_map han sido eliminados de la clase Target clase.
  • Se ha eliminado el paso de transpilador StochasticSwap obsoleto 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 clase SabreSwap que 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 a InverseCancellation([CXGate()]).

  • El SolovayKitaev transpiler pass ya no lanza una excepción en circuitos que contienen operaciones single-qubit sin un método to_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 Target la direccionalidad de la puerta en su salida. Anteriormente, transpile() y generate_preset_pass_manager() generarían un PassManager que 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 GateDirection pass 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_optimization implícita de su salida StagedPassManager. Ahora puede asignar con seguridad su propio PassManager a este campo. Anteriormente sólo se podía añadir al archivo PassManager.

  • El valor por defecto del argumento generate_routing_passmanager() argumento seed_transpiler ha cambiado de None a -1. Este cambio se hizo porque esta bandera sólo se utiliza para configurar el VF2PostLayout transpiler 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 argumento seed_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_wires de 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ícitamente idle_wires=True.

    Cuando se configura en "auto", el comportamiento es el siguiente:

    • Si el circuito tiene un atributo .layout definido, idle_wires se establece automáticamente en False (ocultando los cables inactivos)
    • De lo contrario, idle_wires permanece True (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" establece idle_wires en False, ocultando los cables inactivos:

              ┌───┐┌─┐
    qr_1 -> 1 ┤ H ├┤M├
              └───┘└╥┘
        cr_1: ══════╩═

    Si desea visualizar todos los cables de un circuito trazado, configure idle_wires=True explí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.

  • La función array_to_latex() y el método Operator.draw() pueden ahora lanzar una excepción MissingOptionalLibrary si la biblioteca sympy no está instalada. En las versiones de Qiskit v1.x, siempre se garantizaba la instalación de symengine y sympy , pero a partir de v2.0.0, esto ya no es un requisito obligatorio. La visualización LaTeX para una matriz depende de la biblioteca sympy , por lo que si utiliza esta funcionalidad, asegúrese de tener instalada sympy .

  • Como consecuencia de la eliminación del modelo BackendV1 , la plot_gate_map(), plot_error_map() y plot_circuit_layout() ya no aceptan entradas de tipo BackendV1 en su argumento de entrada backend .

  • El cajón de línea de tiempo ahora requiere que se especifique el argumento target cuando 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_function y deprecate_arguments , obsoletos desde Qiskit v0.24 (mayo de 2023), se han eliminado en Qiskit v2.0.0. El actual deprecate_func() sustituye a @deprecate_function y la actual deprecate_arg() sustituye a @deprecate_arguments.

  • La función assemble y las capacidades relacionadas (contenidas en el módulo assembler ) se han eliminado del código base tras su desaparición en Qiskit v1.2. assemble se utilizó para generar un Qobj en el contexto del flujo de trabajo obsoleto BackendV1 . La conversión ya no es necesaria, ya que el pipeline de transpilación y primitivas maneja directamente los circuitos cuánticos, dejando obsoleto el Qobj .

    La eliminación incluye los siguientes componentes de la API pública:

    • qiskit.compiler.assemble función
    • qiskit.assembler.assemble_circuits función
    • qiskit.assembler.assemble_schedules función
    • qiskit.assembler.disassemble función
    • qiskit.assembler.RunConfig clase
    • Método de qiskit.circuit.Instruction.assemble
  • La estructura Qobj y las clases relacionadas, obsoletas en Qiskit v1.2.0, han sido eliminadas. Se introdujeron como parte del flujo de trabajo de BackendV1 y ya no son necesarios para interactuar con BackendV2 backends. Esta supresión afecta a las siguientes clases:

    • QobjExperimentHeader
    • QobjHeader
    • QasmQobj
    • QasmQobjInstruction
    • QasmQobjExperimentConfig
    • QasmQobjExperiment
    • QasmQobjConfig
    • QasmExperimentCalibrations
    • GateCalibration
    • PulseQobj
    • PulseQobjInstruction
    • PulseQobjExperimentConfig
    • PulseQobjExperiment
    • PulseQobjConfig
    • QobjMeasurementOption
    • PulseLibraryItem
  • Las clases MeasLevel y MeasReturnType , anteriormente definidas en qobj/utils.py, se han migrado a result/models.py tras la supresión del módulo qobj . 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, MeasReturnType a: from qiskit.result import MeasLevel, MeasReturnType.

  • Se ha desactivado el uso de argumentos posicionales en el constructor de Result se ha desactivado. Por favor, establezca todos los argumentos utilizando la sintaxis kwarg, es decir: Result(backend_name="name", ....). Además, el argumento qobj_id ya no se utilizará en la construcción de los Result internos. Todavía es posible establecer qobj_id como 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 sequence y schedule_circuit de qiskit.scheduler junto con la clase ScheduleConfig .

  • El módulo qiskit.result.mitigation se ha eliminado tras su desaparición en Qiskit v1.3. La eliminación incluye las clases LocalReadoutMitigator y CorrelatedReadoutMitigator , 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.duration no 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étodo QuantumCircuit.estimate_duration() que debe utilizarse en su lugar.

  • La interfaz obsoleta de tipo tupla para CircuitInstruction no 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ón operation, qubitsy clbits atributos con nombre.

  • La clase de circuito Multiple-Control-Multiple-Target MCMT ha quedado obsoleta y ha sido sustituida por MCMTGateque es una subclase propia de Gate subclase. 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.duration no 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étodo QuantumCircuit.estimate_duration() que debe utilizarse en su lugar.

  • El argumento propagate_condition de DAGCircuit.substitute_node() y DAGCircuit.substitute_node_with_dag() ha quedado obsoleto. Con la eliminación de Instruction.condition del 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 utilizan sympy para serializar ParameterExpression objetos 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 con RemoveIdentityEquivalent. El problema subyacente fue causado por RemoveIdentityEquivalent y CommutationAnalysis (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.25

    Corregido #13478.

  • Se ha corregido un error en DAGCircuit que provocaba que los nodos de salida Var se convirtieran en nodos de entrada durante deepcopy y el decapado.

  • Se ha corregido un error en la clase Target donde al establecer un nuevo valor para el atributo dt y posteriormente llamar a target.durations() no se mostraba el valor actualizado de dt en el objeto devuelto InstructionDurations devuelto. Esto se soluciona ahora mediante una invalidación de la caché interna de duraciones de instrucciones de destino en el configurador dt .

  • Se ha corregido un problema en el BasisTranslator por el que la fase global del DAG no se actualizaba correctamente. Corregido #14074.

  • Se ha corregido un error en el HighLevelSynthesis por 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ícitamente basis_gates. Ahora se ha corregido este comportamiento, de modo que ya no se sintetizan estas instrucciones ya soportadas.

  • El paso de transpilación InverseCancellation transpilació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 multicontrolada QuantumCircuit.mcrx(), :meth:.QuantumCircuit.mcry, y QuantumCircuit.mcrz()así como al llamar a RXGate.control(), RYGate.control()o RZGate.control() cuando el ángulo de rotación era un ParameterExpression. 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 clase MCMTGate no 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 AnalysisPass o a TransformationPass como una función (como en pass_ = MyPass(); pass_(qc)) respetará ahora cualquier requisito que pueda tener el pase. Por ejemplo, los pases de programación como ALAPScheduleAnalysis requieren que TimeUnitConversion se ejecute antes que ellos. La ejecución del pase mediante un PassManager siempre respetaba este requisito, pero hasta ahora no se respetaba al llamar al pase directamente.

  • Cuando una TranspilerError subclase es lanzada por un pase dentro de una llamada a PassManger.run(), la excepción se propagará ahora sin pérdidas, en lugar de convertirse en una excepción encadenada con un tipo borrado.

  • SabreSwap ya 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 el ContractIdleWiresInControlFlow pass 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.

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