Skip to main content
IBM Quantum Platform

Notas de la versión de Qiskit 0.37


0.37.2

Terra 0.21.2

Preludio

Qiskit Terra 0.21.2 es principalmente una versión de corrección de errores, y también viene con varias páginas de documentación mejoradas.

Corrección de errores

  • aer_simulator_statevector_gpu ahora se reconocerá correctamente como método statevector en alguna función cuando se utilicen los simuladores de GPU de Qiskit Aer en QuantumInstance y otros ejecutores de algoritmos.

  • Corregido el UCGate.inverse() que antes no invertía la fase global.

  • QuantumCircuit.compose() funcionará ahora correctamente cuando se utilice con el argumento inplace=True en contextos de creación de flujos de control. Antes, las instrucciones se añadían fuera del ámbito del flujo de control. Corregido #8433.

  • Se ha corregido un error por el que una expresión ParameterExpression no se identificaba como real si symengine estaba instalado y la expresión bound no era un 1j. Por ejemplo:

    from qiskit.circuit import Parameter
    
    x = Parameter("x")
    expr = 1j * x
    bound = expr.bind({x: 2})
    print(bound.is_real())  # used to be True, but is now False
  • Corregida la serialización y deserialización QPY de ControlledGate con controles abiertos (es decir, aquellos cuya ctrl_state no es todos unos). Corregido #8549.

  • Se han actualizado todos los backends falsos de qiskit.providers.fake_provider.backends para que devuelvan los objetos de canal de impulsos correspondientes con la llamada al método de drive_channel(), measure_channel(), acquire_channel(), control_channel().

  • Arreglado el soporte para ejecutar Z2Symmetries.taper() en problemas más grandes. Antes, el método requería una gran cantidad de memoria, lo que solía provocar fallos en los problemas de mayor envergadura. Como efecto secundario de esta corrección, el rendimiento ha mejorado significativamente.

Aer 0.10.4

No cambia

IBM Proveedor Q 0.19.2

No cambia


0.37.1

Terra 0.21.1

Corrección de errores

  • Se ha corregido un problema en el método QuantumCircuit.decompose() cuando se pasaba una lista de clases Gate para el argumento gates_to_decompose . Si alguna puerta del circuito tenía una etiqueta establecida, este argumento no se manejaba correctamente y provocaba que la descomposición de salida omitiera incorrectamente puertas explícitamente en la lista gates_to_decompose .

  • Arreglar to_instruction() que antes intentaba crear un UnitaryGate sin exponenciar el operador a evolucionar. Dado que este operador no suele ser unitario, se produjo un error (y si el operador hubiera sido unitario por casualidad, no habría sido el resultado esperado).

    Ahora, al llamar correctamente a to_instruction() produce correctamente una puerta que implementa la evolución temporal del operador que contiene:

    >>> from qiskit.opflow import EvolvedOp, X
    >>> op = EvolvedOp(0.5 * X)
    >>> op.to_instruction()
    Instruction(
        name='unitary', num_qubits=1, num_clbits=0,
        params=[array([[0.87758256+0.j, 0.-0.47942554j], [0.-0.47942554j, 0.87758256+0.j]])]
    )
  • Se ha corregido un problema con la función marginal_distribution() cuando se introducía una matriz numpy como argumento en indices , la función producía un error. Corregido #8283

  • Anteriormente no era posible adosar un CircuitStateFn que se ha construido a partir de a VectorStateFn. Esto se debe a que el vector de estado se ha convertido en un circuito con la instrucción Initialize , que no es unitaria. Este problema se soluciona ahora utilizando en su lugar la instrucción StatePreparation que se puede utilizar ya que se supone que el estado comienza en el estado todo 0.

    Por ejemplo, ahora podemos hacer:

    from qiskit import QuantumCircuit
    from qiskit.opflow import StateFn
    
    left = StateFn([0, 1])
    left_circuit = left.to_circuit_op().primitive
    
    right_circuit = QuantumCircuit(1)
    right_circuit.x(0)
    
    overlap = left_circuit.inverse().compose(right_circuit)  # this line raised an error before!
  • Se ha corregido un error en las clases Optimizer por el que al reconstruir una nueva instancia del optimizador a partir de una ya existente, se restablecían los valores predeterminados del optimizador anterior y del nuevo settings restablecía la configuración del optimizador nuevo y del anterior a los valores predeterminados. Esto provocaba un error si se enviaban objetos Optimizer se enviaban como entrada a programas Qiskit Runtime.

    Ahora los objetos del optimizador se reconstruyen correctamente:

    >>> from qiskit.algorithms.optimizers import COBYLA
    >>> original = COBYLA(maxiter=1)
    >>> reconstructed = COBYLA(**original.settings)
    >>> reconstructed._options["maxiter"]
    1  # used to be 1000!
  • Se ha corregido un problema por el que el argumento limit_amplitude en un individuo SymbolicPulse o Waveform no se reflejaba correctamente en la validación de parámetros. Además, QPY schedule dump() se ha corregido para almacenar correctamente el valor limit_amplitude vinculado a la instancia, en lugar de guardar la variable de clase global.

  • Fijar la estructura de entrelazamiento por pares para NLocal circuitos. Esto provocó un error en ZZFeatureMapdonde el uso de entanglement="pairwise" generaba un error. Ahora produce correctamente el mapa de características deseado:

    from qiskit.circuit.library import ZZFeatureMap
    encoding = ZZFeatureMap(4, entanglement="pairwise", reps=1)
    print(encoding.decompose().draw())

    Las huellas anteriores:

         ┌───┐┌─────────────┐
    q_0: ┤ H ├┤ P(2.0*x[0]) ├──■────────────────────────────────────■────────────────────────────────────────────
         ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐
    q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*- x[0])*- x[1])) ├┤ X ├──■────────────────────────────────────■──
         ├───┤├─────────────┤└───┘└──────────────────────────────┘└───┘┌─┴─┐┌──────────────────────────────┐┌─┴─┐
    q_2: ┤ H ├┤ P(2.0*x[2]) ├──■────────────────────────────────────■──┤ X ├┤ P(2.0*- x[1])*- x[2])) ├┤ X ├
         ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐└───┘└──────────────────────────────┘└───┘
    q_3: ┤ H ├┤ P(2.0*x[3]) ├┤ X ├┤ P(2.0*- x[2])*- x[3])) ├┤ X ├──────────────────────────────────────────
         └───┘└─────────────┘└───┘└──────────────────────────────┘└───┘
  • Corregido un problema en el manejo de la fase global de la UCGate clase.

Aer 0.10.4

No cambia

IBM Proveedor Q 0.19.2

No cambia


0.37.0

Esta versión marca oficialmente el fin del soporte para el proyecto Qiskit Ignis de Qiskit. Originalmente estaba obsoleto en la versión 0.33.0 y, como se documentó en esa versión, el paquete qiskit-ignis se ha eliminado del metapaquete Qiskit, lo que significa que en esa futura versión pip install qiskit ya no incluirá qiskit-ignis. Sin embargo, tenga en cuenta que, debido a las limitaciones del empaquetado de python, no podemos eliminar automáticamente una instalación preexistente de qiskit-ignis. Si está actualizando desde una versión anterior, se recomienda que desinstale manualmente Qiskit Ignis con pip uninstall qiskit-ignis o instale el metapaquete en un entorno python nuevo.

Qiskit Ignis ha sido sustituido por el proyecto Qiskit Experiments. Puedes consultar la guía de migración para más detalles sobre cómo cambiar de Qiskit Ignis a Qiskit Experiments.

Terra 0.21.0

Preludio

Los aspectos más destacados del lanzamiento de Qiskit 0.21.0 son:

  • Soporte para la serialización de un pulso ScheduleBlock a través de qiskit.qpy. El formato QPY se ha actualizado a la versión 5, que incluye una definición para incluir los horarios de pulso. Para ello, se ha introducido una nueva clase SymbolicPulse que permite definir formas de onda paramétricas mediante expresiones simbólicas.
  • Mejoras en el trabajo con gestores de pases predefinidos. Una nueva función generate_preset_pass_manager() permite generar fácilmente un gestor de pases equivalente al que transpile() utilizará internamente. Además, los gestores de pases predefinidos son ahora instancias de StagedPassManager lo que facilita la modificación de las secciones.
  • Una refactorización de la estructura de datos interna del atributo QuantumCircuit.data atributo. Antes era una lista de tuplas de la forma (instruction, qubits, clbits) y ahora es una lista de CircuitInstruction objetos. El acceso a los objetos CircuitInstruction es compatible con el acceso anterior basado en tuplas, aunque con un coste adicional en tiempo de ejecución.

Además, se ha mejorado el transpilador para obtener resultados de mayor calidad. Esto incluye la introducción de nuevos pases como VF2PostLayout y ToqmSwap.

Nuevas funciones

  • Añadida una nueva clase, qiskit.transpiler.StagedPassManagerque es una subclase PassManager subclase que tiene un pipeline con fases definidas para realizar la compilación de circuitos. Cada fase es un PassManager objeto que se ejecutará en un orden fijo. Por ejemplo:

    from qiskit.transpiler.passes import *
    from qiskit.transpiler import PassManager, StagedPassManager
    
    basis_gates = ['rx', 'ry', 'rxx']
    init = PassManager([UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()])
    translate = PassManager([Collect2qBlocks(),
                             ConsolidateBlocks(basis_gates=basis_gates),
                             UnitarySynthesis(basis_gates)])
    
    staged_pm = StagedPassManager(stages=['init', 'translation'], init=init, translation=translate)
  • Añadidos los métodos PauliList.group_commuting() y SparsePauliOp.group_commuting()que dividen estos operadores en sublistas en las que cada elemento conmuta con todos los demás. Por ejemplo:

    from qiskit.quantum_info import PauliList, SparsePauliOp
    
    groups = PauliList(["XX", "YY", "IZ", "ZZ"]).group_commuting()
    # 'groups' is [PauliList(['IZ', 'ZZ']), PauliList(['XX', 'YY'])]
    
    op = SparsePauliOp.from_list([("XX", 2), ("YY", 1), ("IZ", 2j), ("ZZ", 1j)])
    groups = op.group_commuting()
    # 'groups' is [
    #     SparsePauliOp(['IZ', 'ZZ'], coeffs=[0.+2.j, 0.+1.j]),
    #     SparsePauliOp(['XX', 'YY'], coeffs=[2.+0.j, 1.+0.j]),
    # ]
  • Añadida una nueva función, marginal_distribution()que se utiliza para marginar un diccionario de entrada de cadenas de bits a un número entero (como Counts). Su funcionalidad es similar a la de la función marginal_counts() con tres diferencias fundamentales. La primera es que marginal_counts() funciona tanto con un diccionario de cuentas como con un objeto Results mientras que marginal_distribution() sólo funciona con un diccionario. La segunda es que marginal_counts() no respeta el orden de los índices en su argumento indices mientras que marginal_distribution() sí lo hace y permutará los bits de salida basándose en el orden de indices . La tercera diferencia es que marginal_distribution() debería ser más rápido ya que su implementación está escrita en Rust y racionalizada para sólo marginar una entrada de diccionario.

  • Añadido el operador binario @ (__matmul__) a las subclases BaseOperator en el módulo qiskit.quantum_info módulo. Esto es una forma abreviada de llamar al método dot de las clases (A @ B == A.dot(B)).

  • Se ha añadido un nuevo argumento opcional, reps, a QuantumCircuit.decompose()que permite la descomposición repetida del circuito. Por ejemplo:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(1)
    circuit.ry(0.5, 0)
    
    # Equivalent to circuit.decompose().decompose()
    circuit.decompose(reps=2)
    
    # decompose 2 times, but only RY gate 2 times and R gate 1 times
    circuit.decompose(gates_to_decompose=['ry','r'], reps=2)
  • Añadida una nueva clase base de pulso SymbolicPulse. Se trata de un sustituto del método convencional ParametricPulseque quedará obsoleto. En la nueva clase base, las funciones de envolvente de impulsos y validación de parámetros se representan mediante objetos de expresión simbólica. La nueva clase proporciona datos de impulsos autocontenidos y portátiles, ya que estas ecuaciones simbólicas pueden serializarse fácilmente a través de bibliotecas de cálculo simbólico.

  • Añadido soporte para operadores no hermitianos en AerPauliExpectation. Esto permite utilizar los rápidos cálculos de expectativas instantáneas de Aer en algoritmos como QEOM.

  • Añadido un nuevo estilo de dibujo de circuitos, textbook, que utiliza el esquema de colores del libro de texto Qiskit.

  • Un nuevo atributo QuantumCircuit.op_start_times se rellena cuando se ejecuta en el circuito uno de los pases de análisis de programación. Puede utilizarse, por ejemplo, para obtener la instrucción del circuito con el tiempo de instrucción:

    from qiskit import QuantumCircuit, transpile
    from qiskit.providers.fake_provider import FakeMontreal
    
    backend = FakeMontreal()
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    
    qct = transpile(
        qc, backend, initial_layout=[0, 1], coupling_map=[[0, 1]], scheduling_method="alap"
    )
    scheduled_insts = list(zip(qct.op_start_times, qct.data))
  • Se ha añadido un nuevo método QuantumCircuit.clear() que se utiliza para eliminar todas las instrucciones de un archivo QuantumCircuit.

  • Se ha añadido un nuevo método QuantumCircuit.copy_empty_like() que se utiliza para obtener una copia borrada de una QuantumCircuit instancia. Esto es lógicamente equivalente a qc.copy().clear(), pero significativamente más rápido y más eficiente en memoria. Esto es útil cuando se necesita un nuevo circuito vacío con todos los mismos recursos (qubits, bits clásicos, metadatos, etc.) ya añadidos.

  • El método Target.instruction_supported() admite ahora dos nuevos argumentos de palabra clave, operation_class y parameters. Con estos argumentos, el método instruction_supported() se puede utilizar ahora para comprobar que una operación específica con valores de parámetro son compatibles con un objeto Target objeto. Por ejemplo, si desea comprobar si un servidor Target llamado target admite la ejecución de un RXGate con θ=π2\theta = \frac{\pi}{2} harías algo como

    from math import pi
    from qiskit.circuit.library import RXGate
    
    target.instruction_supported(operation_class=RXGate, parameters=[pi/2])

    que devolverá True si target admite la ejecución RXGate con θ=π2\theta = \frac{\pi}{2} y False en caso contrario.

  • Añadido un algoritmo de evolución cuántica en tiempo real basado en la trotterización qiskit.algorithms.TrotterQRTE. Se ajusta al nuevo marco de evolución cuántica del tiempo y hace uso del ProductFormula y PauliEvolutionGate implementaciones.

    from qiskit.algorithms import EvolutionProblem
    from qiskit.algorithms.evolvers.trotterization import TrotterQRTE
    from qiskit.opflow import X, Z, StateFn, SummedOp
    
    operator = SummedOp([X, Z])
    initial_state = StateFn([1, 0])
    time = 1
    evolution_problem = EvolutionProblem(operator, time, initial_state)
    
    trotter_qrte = TrotterQRTE()
    evolution_result = trotter_qrte.evolve(evolution_problem)
    evolved_state_circuit = evolution_result.evolved_state
  • Se ha añadido una nueva función generate_preset_pass_manager() que puede utilizarse para generar rápidamente un objeto preestablecido PassManager que refleja el PassManager utilizado internamente por la función transpile() función. Por ejemplo:

    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.providers.fake_provider import FakeWashingtonV2
    
    # Generate an optimization level 3 pass manager targeting FakeWashingtonV2
    pass_manager = generate_preset_pass_manager(3, FakeWashingtonV2())
  • Añadida una nueva función marginal_memory() que se utiliza para marginar matrices de memoria de disparo. Si se le proporciona la matriz de memoria de disparo y los índices de interés, la función devolverá una matriz de memoria de disparo maginizada. Esta función difiere del soporte de memoria del método marginal_counts() que sólo funciona en el campo memory de un objeto Results .

  • La interfaz de primitivas se ha ampliado para aceptar objetos además de índices como argumentos del método __call__ . El argumento parameter_values ahora puede ser opcional.

  • El exportador OpenQASM 3 (qiskit.qasm3) soporta ahora la exportación de circuitos con retardos explícitos, como desde QuantumCircuit.delay().

  • Añadido un nuevo método de trazado y encaminamiento a transpile() basado en el artículo "Time-optimal qubit mapping". Para utilizarlo, es necesario instalar el paquete opcional Qiskit TOQM. El kwarg routing_method de transpile() admite un valor adicional, 'toqm' que se utiliza para habilitar la disposición y el enrutamiento a través de TOQM.

    Para instalar qiskit-toqm junto con Terra, ejecute:

    pip install qiskit-terra[toqm]
  • Añadido un nuevo módulo qiskit.quantum_info.synthesis.qsd para aplicar la descomposición cuántica de Shannon a unitarios arbitrarios. Esta funcionalidad sustituye al anterior enfoque basado en isometrías en el pase por defecto del transpilador de síntesis unitaria, así como cuando se añaden unitarios a un circuito utilizando una función UnitaryGate.

    La descomposición cuántica de Shannon utiliza aproximadamente la mitad de puertas cnot que la implementación de isometría al descomponer matrices unitarias de más de dos qubits.

  • Las clases del módulo quantum_info que admiten la multiplicación escalar ahora pueden multiplicarse por un escalar desde la izquierda o la derecha. Antes, sólo aceptaban multiplicadores escalares de la izquierda.

  • El pase del transpilador LookaheadSwap (utilizado por transpile() cuando routing_method="lookahead") ha experimentado algunas mejoras de rendimiento y ahora será aproximadamente tres veces más rápido. Esto es puramente ser más eficiente en sus cálculos, y no cambia la complejidad del algoritmo. En la mayoría de los casos, un algoritmo de enrutamiento más moderno como SabreSwap (routing_method="sabre") será mucho más eficaz.

  • Se han añadido nuevos pases de transpilador. El transpiler pass Commuting2qGateRouter utiliza estrategias de intercambio para encaminar un bloque de puertas conmutadas al mapa de acoplamiento. De hecho, el enrutamiento es un problema difícil, pero es mucho más fácil cuando las puertas se conmutan como en las redes CZ. En QAOA también suelen encontrarse bloques de puertas de desplazamiento. Estos casos pueden tratarse mediante estrategias de intercambio que aplican un conjunto predefinido de capas de puertas SWAP. Además, el nuevo pase transpilador FindCommutingPauliEvolutions identifica bloques de evoluciones Pauli hechos de términos conmutativos de dos qubits. Aquí, una estrategia de intercambio se especifica mediante la clase SwapStrategy. Las estrategias de intercambio deben adaptarse al mapa de acoplamiento e, idealmente, al circuito para obtener los mejores resultados.

  • Introducido un nuevo optimizador en la biblioteca Qiskit, que añade soporte a la optimización de parámetros de algoritmos cuánticos variacionales. Se trata del Algoritmo de Distribución Marginal Univariante (UMDA), que es un tipo específico de los Algoritmos de Estimación de la Distribución. Por ejemplo:

    from qiskit.opflow import X, Z, I
    from qiskit import Aer
    from qiskit.algorithms.optimizers import UMDA
    from qiskit.algorithms import QAOA
    from qiskit.utils import QuantumInstance
    
    H2_op = (-1.052373245772859 * I ^ I) + \
            (0.39793742484318045 * I ^ Z) + \
            (-0.39793742484318045 * Z ^ I) + \
            (-0.01128010425623538 * Z ^ Z) + \
            (0.18093119978423156 * X ^ X)
    
    p = 2  # Toy example: 2 layers with 2 parameters in each layer: 4 variables
    
    opt = UMDA(maxiter=100, size_gen=20)
    backend = Aer.get_backend('statevector_simulator')
    vqe = QAOA(opt,
               quantum_instance=QuantumInstance(backend=backend),
               reps=p)
    
    result = vqe.compute_minimum_eigenvalue(operator=H2_op)
  • El constructor del Unroll3qOrMore transpiler pass tiene dos nuevos argumentos de palabra clave opcionales, target y basis_gates. Estas opciones permiten especificar las Target o puertas base soportadas respectivamente para describir el backend de destino. Si alguna de las operaciones del circuito se encuentra en target o basis_gates , no será desenrollada por el pase, ya que el dispositivo de destino tiene soporte nativo para la operación.

  • La serialización QPY ha sido actualizada para soportar ScheduleBlock. Ahora puede guardar el programa de pulso en binario y cargarlo más tarde:

    from qiskit import pulse, qpy
    
    with pulse.build() as schedule:
        pulse.play(pulse.Gaussian(160, 0.1, 40), pulse.DriveChannel(0))
    
    with open('schedule.qpy', 'wb') as fd:
        qpy.dump(schedule, fd)
    
    with open('schedule.qpy', 'rb') as fd:
        new_schedule = qpy.load(fd)[0]

    Utiliza la interfaz QPY común a QuantumCircuit. Véase SCHEDULE_BLOCK para más detalles sobre la estructura de datos.

  • Añadido un nuevo pase de transpilador, VF2PostLayout. Este paso es de un nuevo tipo para realizar una nueva fase/función en el proceso de compilación, posterior al diseño o posterior a la optimización de la selección de qubits. La idea detrás de este paso es que después de terminar el bucle de optimización en el transpilador sepamos cuáles serán los recuentos finales de puertas en cada qubit del circuito, de modo que podamos encontrar potencialmente un subconjunto de qubits de mejor rendimiento en un backend para ejecutar el circuito. El pase buscará un subgrafo isomórfico en el gráfico de conectividad del backend de destino y mirará la tasa de error completa del circuito completo en cualquier subgrafo encontrado y devolverá el diseño encontrado con la tasa de error más baja para el circuito.

    Este pase es similar al pase VF2Layout y ambos utilizan internamente la misma implementación VF2 de retworkx. Sin embargo, VF2PostLayout está diseñado para ejecutarse después del diseño inicial, el enrutamiento, la traducción de bases y cualquier pase de optimización y sólo funcionará si ya se ha aplicado un diseño, el circuito ha sido enrutado y todas las puertas están en la base de destino. Esto es necesario para que, cuando se aplique un nuevo diseño, el circuito pueda seguir funcionando en el dispositivo de destino. VF2Layout en cambio, está diseñado para encontrar un trazado inicial perfecto y puede funcionar con cualquier circuito.

  • El transpilador ApplyLayout transpiler pass ahora tiene soporte para actualizar un diseño en un circuito después de que un diseño se haya aplicado una vez antes. Si el campo post_layout está presente (además del campo obligatorio layout ) el property_set cuando se ejecute el ApplyLayout pass actualizará el diseño para aplicar el nuevo diseño. Esto devolverá un DAGCircuit con los qubits en el nuevo orden físico y el conjunto de propiedades layout se actualizará para que asigne los qubits virtuales del diseño original a los qubits físicos en el nuevo campo post_layout .

  • Los gestores de pases preestablecidos generados por level_1_pass_manager(), level_2_pass_manager()y level_3_pass_manager() que corresponden a optimization_level 1, 2 y 3 respectivamente en la función transpile() ejecutan ahora el pase VF2PostLayout pase después de ejecutar el pase de enrutamiento. Esto permite al transpilador encontrar potencialmente un conjunto diferente de qubits físicos en el backend de destino para ejecutar el circuito en el que tienen menores tasas de error. El pase VF2PostLayout pass no se ejecutará si especifica manualmente un argumento layout_method, routing_method, o initial_layout a transpile(). Si el paso puede encontrar un subconjunto de qubits de mejor rendimiento en el backend para ejecutar el circuito físico, ajustará la disposición del circuito para utilizar los qubits alternativos en su lugar.

  • El algoritmo calcula iterativamente cada estado propio partiendo del estado base (que se calcula como en VQE) y optimizando una función de coste modificada que intenta calcular los estados propios que son ortogonales a los estados calculados en las iteraciones anteriores y tienen la energía más baja cuando se calculan sobre el ansatz. La interfaz implementada es muy similar a la de VQE y es de la forma:

    from qiskit.algorithms import VQD
    from qiskit.utils import QuantumInstance
    from qiskit.circuit.library import TwoLocal
    from qiskit.algorithms.optimizers import COBYLA
    from qiskit import BasicAer
    from qiskit.opflow import I,Z,X
    
    h2_op = (
        -1.052373245772859 * (I ^ I)
        + 0.39793742484318045 * (I ^ Z)
        - 0.39793742484318045 * (Z ^ I)
        - 0.01128010425623538 * (Z ^ Z)
        + 0.18093119978423156 * (X ^ X)
    )
    
    vqd = VQD(k =2, ansatz = TwoLocal(rotation_blocks="ry", entanglement_blocks="cz"),optimizer = COBYLA(maxiter = 0), quantum_instance = QuantumInstance(
                BasicAer.get_backend("qasm_simulator"), shots = 2048)
            )
    vqd_res = vqd.compute_eigenvalues(op)

    Este fragmento de código en particular genera 2 valores propios (tierra y 1er estado excitado) También se han implementado pruebas.

Notas de actualización

  • Las clases de pulso en qiskit.pulse.library son ahora subclases de SymbolicPulse en lugar de ParametricPulse. Las clases disponibles siguen siendo Gaussian, GaussianSquare, Dragy Constant. SymbolicPulse tiene plena compatibilidad con versiones anteriores, y no debería haber pérdida de funcionalidad.

  • El tipo de datos de cada elemento de QuantumCircuit.data ha cambiado. Solía ser una simple 3-tupla de un Instructionuna lista de Qubity una lista de Clbits, mientras que ahora es una instancia de CircuitInstruction.

    Los atributos de esta nueva clase son operation, qubits y clbitscorrespondientes a los elementos de la tupla anterior. Sin embargo qubits y clbits son ahora instancias de tuple , no lists.

    Esta nueva clase se comportará exactamente igual que la antigua 3-tupla si se intenta acceder a su índice sus elementos, o iterar a través de ella. Esto incluye el lanzamiento del qubits y clbits a listas. Esto es para ayudar a la compatibilidad con versiones anteriores. A partir de Qiskit Terra 0.21, esta ya no es la forma preferida de acceder a estos elementos. En su lugar, debe utilizar la forma de acceso a atributos descrita anteriormente.

    Esto se ha hecho para permitir futuros desarrollos de la QuantumCircuit estructura de datos en Terra, sin romper constantemente la compatibilidad hacia atrás. Entre los avances previstos figuran los circuitos dinámicos parametrizados y una reducción general del uso de memoria de los circuitos profundos.

  • La dependencia python-constraint , que es utilizada únicamente por el CSPLayout ya no figura en la lista de requisitos del paquete Qiskit Terra. Esto se debe a que el CSPLayout pass ya no se utiliza por defecto en ninguno de los gestores de pass predefinidos para transpile(). Aunque el pase sigue disponible, si lo utilizas tendrás que instalar manualmente python-contraint o cuando instales qiskit-terra puedes utilizar el extra csp-layout , por ejemplo:

    pip install "qiskit-terra[csp-layout]"
  • La versión del formato QPY emitida por qpy.dump() se ha aumentado a la versión 5. Esta nueva versión del formato es incompatible con las versiones anteriores y dará lugar a un error al intentar cargarlo con un deserializador que no sea capaz de manejar la versión 5 de QPY. Este cambio era necesario para fijar la compatibilidad con la representación adecuada de las puertas controladas y la representación de los estados de control no predeterminados.

  • Las extensiones Rust compiladas de Qiskit Terra tienen ahora una versión Rust mínima soportada (MSRV) de 1.56.1. Esto significa que al compilar Qiskit Terra a partir del código fuente, la versión más antigua del compilador de Rust soportada es 1.56.1. Si utilizas una versión anterior del compilador de Rust, deberás actualizarla para poder seguir compilando Qiskit desde el código fuente. Este cambio era necesario ya que varias dependencias de la línea ascendente también han actualizado sus versiones mínimas compatibles.

  • La programación de circuitos ahora se ejecuta en paralelo cuando se proporciona más de un circuito a schedule(). Consulte el nº 2695 para más detalles.

  • Las clases anteriormente obsoletas BaseBackend, BaseJob, y BaseProvider han sido eliminadas. Originalmente estaban obsoletos en la versión 0.18.0. En lugar de estas clases debería utilizar las clases de interfaz de proveedores versionadas, siendo las últimas BackendV2, JobV1y ProviderV1.

  • Se ha eliminado el argumento backend , anteriormente obsoleto, para el constructor del RZXCalibrationBuilder ha sido eliminado. Originalmente fue obsoleto en la versión 0.19.0. En su lugar, debe consultar el objeto Backend el objeto instruction_schedule_map y qubit_channel_mapping y pasarlo directamente al constructor. Por ejemplo, con un BackendV1 backend:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.providers.fake_provider import FakeMumbai
    
    backend = FakeMumbai()
    inst_map = backend.defaults().instruction_schedule_map
    channel_map = backend.configuration().qubit_channel_mapping
    cal_pass = RZXCalibrationBuilder(
        instruction_schedule_map=inst_map,
        qubit_channel_mapping=channel_map,
    )

    o con un BackendV2 backend:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.providers.fake_provider import FakeMumbaiV2
    
    backend = FakeMumbaiV2()
    inst_map = backend.instruction_schedule_map
    channel_map = {bit: backend.drive_channel(bit) for bit in range(backend.num_qubits)}
    cal_pass = RZXCalibrationBuilder(
        instruction_schedule_map=inst_map,
        qubit_channel_mapping=channel_map,
    )
  • Se ha eliminado el límite de disparos de medición para el backend BasicAer .

  • En el caso de DAGNode, se han eliminado los kwargs y atributos anteriormente obsoletos type, op, qargs, cargs y wire . En un principio, estaban obsoletos en la versión 0.19.0. Sólo se puede acceder a los kwargs y atributos op, qargs y cargs en instancias de DAGOpNode, y al kwarg y atributo wire en instancias de DAGInNode o DAGOutNode.

  • Se ha eliminado la función obsoleta pauli_group() . Originalmente estaba obsoleto en Qiskit Terra 0.17.

  • Se han eliminado varios métodos obsoletos en Pauli que originalmente estaban obsoletos en Qiskit Terra 0.17. Estos fueron:


    sgn_prod

    Utilice Pauli.compose() o Pauli.dot() en su lugar.


    to_spmatrix

    Utilice Pauli.to_matrix() con el argumento sparse=True .


    kron

    Utilice Pauli.expand()pero tenga en cuenta que devuelve un nuevo objeto, en lugar de mutar el existente.


    update_z y update_x

    Establezca directamente los atributos z y x del objeto.


    insert_paulis

    Utilice Pauli.insert().


    append_paulis

    Utilice Pauli.expand().


    delete_qubits

    Utilice Pauli.delete().


    pauli_single

    Construir la etiqueta manualmente y pasarla directamente al inicializador, como:

    Pauli("I" * index + pauli_label + "I" * (num_qubits - index - len(pauli_label)))

    random

    Utilice quantum_info.random_pauli() en su lugar.

  • Se ha eliminado el método optimize de las clases Optimizer que ha sido sustituido por el método minimize() en sustitución directa. La única excepción es SPSAdonde la advertencia de desaprobación no se activó, por lo que el método se mantiene.

  • Result se ha modificado para que contenga siempre los atributos date, status, y header (fijado en None si no se especifica).

  • Para Python 3.7 shared-memory38 es ahora una dependencia. Se añadió como dependencia de Python 3.7 para poder aprovechar las construcciones de memoria compartida de la biblioteca estándar de las versiones más recientes de Python. Si utiliza Python >= 3.8, no necesitará ninguna dependencia adicional.

  • Instruction las etiquetas se comprueban ahora al crear la instrucción.

  • La serialización QPY se ha actualizado para serializar QuantumCircuit con QuantumCircuit.calibrations. A partir de la versión 5 de QPY, sólo las entradas de calibración de ScheduleBlock pueden serializarse.

  • La definición de XXPlusYYGate se ha modificado. Consulte el nº 7969 para más detalles.

  • Los gestores de pases preestablecidos generados por level_1_pass_manager(), level_2_pass_manager()y level_3_pass_manager() y utilizados por el argumento transpile()optimization_level en 1, 2 y 3, respectivamente, ya no establecen un límite de tiempo estricto para el VF2Layout pase del transpilador. Esto significa que el pase ya no dejará de intentar encontrar un trazado perfecto alternativo mejor hasta un límite de tiempo fijo ( 100ms para el nivel 1, 10 seg para el nivel 2 y 60 seg para el nivel 3), ya que hacer esto limitaba la reproducibilidad de la compilación cuando se disponía de un trazado perfecto. Esto significa que la salida al utilizar el pase podría ser diferente que antes, aunque en todos los casos sólo cambiaría si se puede encontrar un conjunto de qubits con menos ruido que la salida anterior. Si desea conservar el comportamiento anterior, puede crear una función personalizada PassManager que establezca el argumento time_limit en el constructor para el pase VF2Layout .

Notas sobre características en desuso

  • La llamada a timeline_drawer() con un circuito no programado ha quedado obsoleto. Todos los circuitos, incluso los que constan sólo de instrucciones de retardo, deben transpilarse con el argumento de palabra clave scheduling_method de transpile() set, para generar la información de programación que se almacena en QuantumCircuit.op_start_times.

  • Las funciones de conversión NetworkX para DAGCircuit.to_networkx() y from_networkx(), junto con el método DAGDependency.to_networkx() han quedado obsoletos y se eliminarán en una futura versión. Qiskit ha estado utilizando retworkx como su biblioteca de grafos desde la versión qiskit-terra 0.12.0, y desde entonces las funciones de conversión de networkx han sido con pérdidas. Se añadieron originalmente para que los usuarios pudieran aprovechar la funcionalidad de la biblioteca de algoritmos NetworkX’s que no está presente en retworkx. Desde entonces, retworkx ha madurado y ofrece más funcionalidades, y el DAGCircuit está estrechamente acoplado a retworkx para su funcionamiento. Estos métodos de conversión tienen un valor limitado de cara al futuro, por lo que se eliminarán en una próxima versión.

  • El acceso a varios toggles antiguos (HAS_MATPLOTLIB, HAS_PDFTOCAIRO, HAS_PYLATEX y HAS_PIL) desde el módulo qiskit.visualization está obsoleto, y estas rutas de importación serán eliminadas en una futura versión de Qiskit Terra. En su lugar, se debería acceder a los mismos objetos a través de qiskit.utils.optionalsque contiene comprobadores para casi todas las dependencias opcionales de Terra.

  • El módulo qiskit.test.mock ha quedado obsoleto. Las clases de falso backend y falso proveedor que antes estaban disponibles en qiskit.test.mock son accesibles en qiskit.providers.fake_provider desde Terra 0.20.0. Este cambio representa un compromiso adecuado para dar soporte a las clases backend falsas como parte de Qiskit, mientras que antes sólo formaban parte del conjunto de pruebas internas, y se exponían a los usuarios como un efecto secundario.

  • Los nombres de los argumentos cuando se llama a una función Estimator o Sampler como función pasan de llamarse circuit_indices y observable_indices a circuits y observables.

  • Los argumentos de palabra clave qobj_id y qobj_header para la función execute() han quedado obsoletos y se eliminarán en una futura versión. Desde la eliminación de la clase BaseBackend estos argumentos no tienen ningún efecto ya que ningún backend soporta la ejecución con un objeto Qobj directamente y en su lugar sólo trabajan con objetos QuantumCircuit directamente.

  • Los argumentos x, z y label del inicializador de Pauli estaban documentados como obsoletos en Qiskit Terra 0.17, pero un error impidió que se mostrara la advertencia esperada en tiempo de ejecución. La advertencia se mostrará ahora correctamente, y los argumentos se eliminarán en Qiskit Terra 0.23 o posterior. Un par de x y z debe pasarse posicionalmente como una única tupla (Pauli((z, x))). Una cadena label debe pasarse posicionalmente en el primer argumento (Pauli("XYZ")).

  • El método SPSA.optimize() está obsoleto en favor de SPSA.minimize()que puede utilizarse como sustituto directo. Tenga en cuenta que este método devuelve un objeto de resultado completo con más información que antes disponible.

  • El argumento circuits de qpy.dump() ha sido obsoleto y sustituido por programs ya que ahora QPY soporta múltiples tipos de datos además de circuitos.

  • AlignmentKind.to_dict() ha quedado obsoleto y será eliminado.

Corrección de errores

  • Se ha añadido una validación adicional a DiagonalGate para comprobar que el argumento tiene módulo uno.

  • Los índices de qubits duplicados dados a SparsePauliOp.from_sparse_list() provocarán un error, en lugar de sobrescribir silenciosamente los valores anteriores. Se puede acceder al comportamiento antiguo pasando el argumento de palabra clave nuevo do_checks=False.

  • La visualización timeline_drawer() visualización ya no desalineará las ranuras de registro clásicas.

  • La validación de parámetros para GaussianSquare es ahora coherente antes y después de la construcción. Consulte el nº 7882 para más detalles.

  • El BackendV2-basado en backends falsos en el módulo qiskit.providers.fake_provider como FakeMontrealV2soportan ahora la operación Delay en sus atributos target atributos. Anteriormente, QuantumCircuit los objetos que contenían retardos no podían compilarse en estos backends.

  • Se ha corregido un error en TridiagonalToeplitz.eigs_bounds(), que provocaba que se devolvieran límites de valores propios incorrectos en algunos casos con valores propios negativos. Consulte el nº 7939 para más detalles.

  • Se ha corregido un error por el que el cajón LaTeX statevector ignoraba el parámetro max_size .

  • Soporte fijo en el método PassManagerConfig.from_backend() para construir un objeto PassManagerConfig a partir de una BackendV2 instancia. Anteriormente esto no se manejaba correctamente y fallaba cuando se ejecutaba con un BackendV2 objeto.

  • Corregido el soporte para la serialización (qpy.dump()) y deserialización (qpy.load()) de un objeto QuantumCircuit que contiene objetos ControlledGate personalizados. Anteriormente, se producía una excepción qpy.load() al intentar reconstruir el archivo personalizado ControlledGate. Corregido #7999.

  • Corregido el soporte para la serialización (qpy.dump()) y deserialización (qpy.load()) de un objeto QuantumCircuit que contiene objetos MCPhaseGate personalizados. Anteriormente, se producía una excepción qpy.load() al intentar reconstruir el archivo MCPhaseGate.

  • Corregido el soporte para la serialización (qpy.dump()) y deserialización (qpy.load()) de un objeto QuantumCircuit que contiene puertas controladas con un estado de control abierto. Antes, el estado de control abierto se perdía por el proceso de serialización y el circuito reconstruido.

  • Fijo QuantumCircuit.reverse_bits() con circuitos sin registro Qubit y Clbit. Por ejemplo, ahora funcionará lo siguiente:

    from qiskit.circuit import QuantumCircuit, Qubit, Clbit
    
    qc = QuantumCircuit([Qubit(), Clbit()])
    qc.h(0).c_if(qc.clbits[0], 0)
    qc.reverse_bits()
  • Se ha corregido el atributo ConfigurableFakeBackend.t2 , que anteriormente se establecía incorrectamente en función del valor proporcionado en t1 .

  • Se ha solucionado un problema con BackendV2-basado en clases backend falsas del módulo qiskit.providers.fake_provider como FakeMontrealV2 donde el valor del atributo dt (y el atributo Target.dt no se convertían correctamente a segundos. Esto causaría problemas al utilizar estos backends falsos con la programación.

  • Se ha corregido un error en plot_histogram() cuando el argumento number_to_keep era menor que el número de claves. El siguiente código ya no arrojará errores y estará correctamente alineado:

    from qiskit.visualization import plot_histogram
    data = {'00': 3, '01': 5, '11': 8, '10': 11}
    plot_histogram(data, number_to_keep=2)
  • Mejora el rendimiento de la construcción y el trabajo con instancias parametrizadas QuantumCircuit con muchas puertas que comparten un número relativamente pequeño de parámetros.

  • El exportador OpenQASM 3 (qiskit.qasm3) ya no intentará producir definiciones para puertas no estándar en la opción basis_gates .

  • Corregido el getter de OptimizerResult.nitque antes devolvía el número de evaluaciones jacobianas en lugar del número de iteraciones.

  • Se ha corregido un error en la representación de cadenas de Result que provocaba que los atributos se especificaran incorrectamente.

  • Se ha solucionado un problema con transpile() por el que, en algunos casos, al proporcionar una lista de cadenas de compuertas base con el argumento de la palabra clave basis_gates o implícitamente a través de una entrada Target mediante el argumento de palabra clave target no se interpretaba correctamente y daba lugar a que se utilizara un subconjunto de las compuertas de la lista para cada circuito.

  • Se ha corregido un problema en el UnitarySynthesis que provocaba un error cuando se especificaba un objetivo Target que no tenía ninguna restricción de qubits en las operaciones (por ejemplo, en el caso de un objetivo de simulador ideal) se especificaba con el argumento de palabra clave target para el constructor.

  • El método qiskit.result.marginal_counts()cuando se le pasa un Result desde un backend pulse, fallaría, porque contiene una matriz de objetos ExperimentResult , cada uno de los cuales tiene un QobjExperimentHeader, y esos ExperimentHeaders carecen de variables de instancia creg_sizes. Si Result procede de un backend de simulador (por ejemplo, Aer), esa variable de instancia estaría allí. Arreglamos marginal_counts para que omita la lógica que necesita creg_sizes si el campo no está presente, o no es None.

  • El exportador OpenQASM 2 (QuantumCircuit.qasm()) definirá ahora correctamente los parámetros de los qubits para las operaciones UnitaryGate que no afectan a todos los qubits sobre los que se definen. Corregido #8224.

  • Se ha corregido un problema de reproducibilidad de la función transpile() cuando se ejecutaba con optimization_level 1, 2 y 3. Anteriormente, en algunas condiciones, cuando había varios diseños perfectos (un diseño que no requiere ninguna puerta SWAP) disponibles, el diseño seleccionado y el circuito de salida podían variar independientemente de si se establecía el argumento seed_transpiler .

Aer 0.10.4

No cambia

IBM Proveedor Q 0.19.2

Corrección de errores

  • En la próxima versión de terra habrá una versión candidata etiquetada antes de la versión final. Sin embargo, el cambio de la cadena de versión para el paquete está bloqueado en el qiskit-ibmq-provider en este momento porque está tratando de analizar la versión y está asumiendo que no habrá sufijo prelease en la cadena de versión (ver #8200 para más detalles). PR #1135 corrige este parseo de versiones para usar la regex del proyecto pypa/packaging que maneja todas las versiones de paquetes PEP440 incluyendo sufijos de pre-lanzamiento. Esto permitirá a terra liberar una etiqueta 0.21.0rc1 sin romper el qiskit-ibmq-provider.
  • threading.currentThread y notifyAll quedaron obsoletos en Python 3.10 (octubre de 2021) y se eliminarán en Python 3.12 (octubre de 2023). PR #1133 los sustituye por threading.current_thread, notify_all añadido en Python 2.6 (octubre de 2008).
¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.