Skip to main content
IBM Quantum Platform

Notas de la versión de Qiskit 0.13


0.13.0

Terra 0.10.0

Preludio

La versión 0.10.0 incluye varias novedades y correcciones de errores. El mayor cambio de esta versión es la adición de soporte inicial para el uso de Qiskit con trampas de iones.

Nuevas funciones

  • Se han introducido nuevos métodos en QuantumCircuit que permiten añadir o eliminar mediciones al final de un circuito.


    measure_all()

    Añade una operación barrier seguida de una operación measure a todos los qubits del circuito. Crea un ClassicalRegister de tamaño igual al número de qubits del circuito, que almacenan las medidas.


    measure_active()

    Añade una operación barrier seguida de una operación measure a todos los qubits activos del circuito. Un qubit está activo si tiene al menos otra operación actuando sobre él. Crea un ClassicalRegister de tamaño igual al número de qubits activos en el circuito, que almacenan las medidas.


    remove_final_measurements()

    Elimina todas las mediciones finales y anteriores barrier de un circuito. Una medición se considera "final" si no va seguida de ninguna otra operación, excluidas las barreras y otras mediciones. Una vez eliminadas las mediciones, si todos los bits clásicos de ClassicalRegister están inactivos (no tienen ninguna operación asociada), se elimina ClassicalRegister .

    Ejemplos:

    # Using measure_all()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_all()
    circuit.draw()
    
    # A ClassicalRegister with prefix measure was created.
    # It has 2 clbits because there are 2 qubits to measure
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├───
                 └───┘ ░ └╥┘┌─┐
         q_1: |0>──────░──╫─┤M├
                       ░  ║ └╥┘
    measure_0: 0 ═════════╩══╬═
    
    measure_1: 0 ════════════╩═
    
    
    # Using measure_active()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_active()
    circuit.draw()
    
    # This ClassicalRegister only has 1 clbit because only 1 qubit is active
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├
                 └───┘ ░ └╥┘
         q_1: |0>──────░──╫─
                       ░  ║
    measure_0: 0 ═════════╩═
    
    
    # Using remove_final_measurements()
    # Assuming circuit_all and circuit_active are the circuits from the measure_all and
    # measure_active examples above respectively
    
    circuit_all.remove_final_measurements()
    circuit_all.draw()
    # The ClassicalRegister is removed because, after the measurements were removed,
    # all of its clbits were idle
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
    
    
    circuit_active.remove_final_measurements()
    circuit_active.draw()
    # This will result in the same circuit
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
  • Se ha añadido soporte inicial para ejecutar experimentos en backends de trampas de iones.

  • Se han añadido una puerta Rxx (rxx) y una puerta global Mølmer-Sørensen (ms) al conjunto de puertas estándar.

  • Se han añadido al módulo quantum_info.synthesis un descomponedor de Cnot a Rxx/Rx/Ry cnot_rxx_decompose y un descomponedor de ángulos de Euler de qubit único OneQubitEulerDecomposer .

  • Se ha añadido un transpiler pass MSBasisDecomposer para desenrollar circuitos definidos sobre U3 y puertas Cnot en un circuito definido sobre Rxx,Ry y Rx. Este pase se incluirá en los gestores de pases predefinidos para los backends que incluyan la puerta 'rxx' en sus puertas base soportadas.

  • Los backends de qiskit.test.mock contienen ahora una instantánea de los datos reales de calibración del dispositivo. Se puede acceder a través del método properties() para cada backend. Esto se puede utilizar para probar cualquier código que dependa de las propiedades del backend, como los pases del transpilador adaptados al ruido o los modelos de ruido del dispositivo para la simulación. De este modo, el ciclo de pruebas y desarrollo será más rápido, sin necesidad de recurrir a backends activos.

  • Permite a la clase Resultado devolver resultados parciales. Si se carga un esquema de resultados válido que contiene algunos experimentos que tuvieron éxito y otros que fracasaron, esto permite acceder a los datos de los experimentos que tuvieron éxito, mientras que se lanza una excepción para los experimentos que fracasaron y se muestra el mensaje de error apropiado para los resultados que fracasaron.

  • Se ha añadido un kwarg ax a las siguientes funciones de visualización:

    • qiskit.visualization.plot_histogram
    • qiskit.visualization.plot_state_paulivec
    • qiskit.visualization.plot_state_qsphere
    • qiskit.visualization.circuit_drawer (mpl sólo backend)
    • qiskit.QuantumCircuit.draw (mpl sólo backend)

    Este kwarg se utiliza para pasar un objeto matplotlib.axes.Axes a las funciones de visualización. Esto permite integrar estas funciones de visualización en un flujo de trabajo de visualización más amplio. Además, si se especifica un kwarg ax, las funciones de visualización no devuelven nada.

  • Se ha añadido un kwarg ax_real y ax_imag a las siguientes funciones de visualización:

    • qiskit.visualization.plot_state_hinton
    • qiskit.visualization.plot_state_city

    Estos nuevos kargs funcionan igual que los kwargs recién añadidos ax para otras funciones de visualización. Sin embargo, estos gráficos utilizan dos ejes (uno para la componente real y otro para la componente imaginaria). Tener dos kwargs también proporciona la flexibilidad de generar sólo una visualización para uno de los componentes en lugar de hacer siempre ambos. Por ejemplo:

    from matplotlib import pyplot as plt
    from qiskit.visualization import plot_state_hinton
    
    ax = plt.gca()
    
    plot_state_hinton(psi, ax_real=ax)

    sólo generará un gráfico del componente real.

  • Ahora se puede editar un gestor de pases determinado con el nuevo método reemplazar. Este método permite sustituir una etapa concreta en un gestor de pases, lo que puede resultar útil cuando se trabaja con gestores de pases preestablecidos. Por ejemplo, vamos a editar el selector de diseño del gestor de pases utilizado en el nivel de optimización 0:

    from qiskit.transpiler.preset_passmanagers.level0 import level_0_pass_manager
    from qiskit.transpiler.transpile_config import TranspileConfig
    
    pass_manager = level_0_pass_manager(TranspileConfig(coupling_map=CouplingMap([[0,1]])))
    
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: TrivialLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    La selección de la disposición se establece en la etapa [1]. Sustituyámoslo por DenseLayout:

    from qiskit.transpiler.passes import DenseLayout
    
    pass_manager.replace(1, DenseLayout(coupling_map), condition=lambda property_set: not property_set['layout'])
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    Si desea sustituirlo sin ninguna condición, puede utilizar el método abreviado set-item:

    pass_manager[1] = DenseLayout(coupling_map)
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] FlowLinear: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller
  • Introducido un nuevo comando de pulso Delay que puede ser insertado en un pulso Schedule. Este comando acepta un duration y puede añadirse a cualquier Channel. No se pueden programar otros comandos en un canal durante un retardo.

    El retardo puede añadirse como cualquier otra orden de impulso. Por ejemplo:

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | sched
    
    # pad schedule
    padded_sched = pad(sched)
    
    assert padded_sched == ref_sched

    También se pueden pasar canales adicionales a rellenar y un tiempo hasta el que rellenar, por ejemplo:

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    dc1 = pulse.DriveChannel(1)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | delay(dc1) |  sched
    
    # pad schedule across both channels until up until the first time step
    padded_sched = pad(sched, channels=[dc0, dc1], until=1)
    
    assert padded_sched == ref_sched

Notas de actualización

  • Las asignaciones y modificaciones del atributo data de los objetos qiskit.QuantumCircuit se validan ahora siguiendo las mismas reglas utilizadas en toda la API QuantumCircuit . Esto se ha hecho para mejorar el rendimiento de la API de circuitos, ya que ahora podemos asumir que el atributo data tiene un formato conocido. Si antes modificabas manualmente el atributo data de un objeto de circuito puede que esto ya no funcione si tus modificaciones dieron como resultado una estructura de datos distinta a la lista de instrucciones con contexto en el formato [(instruction, qargs, cargs)]

  • El passmanager por defecto del transpilador para el nivel de optimización 2 utiliza ahora por defecto el mecanismo de selección de diseño DenseLayout en lugar de NoiseAdaptiveLayout. El pase Denselayout también se ha modificado para que sea sensible al ruido.

  • Se ha eliminado la clase obsoleta DeviceSpecification . En su lugar, debe utilizar la dirección PulseChannelSpec. Por ejemplo, puedes ejecutar algo como

    device = pulse.PulseChannelSpec.from_backend(backend)
    device.drives[0]    # for DeviceSpecification, this was device.q[0].drive
    device.memoryslots  # this was device.mem
  • Se ha eliminado el módulo obsoleto qiskit.pulse.ops . Utilice directamente los métodos Schedule y Instruction . Por ejemplo, en lugar de:

    ops.union(schedule_0, schedule_1)
    ops.union(instruction, schedule)  # etc

    En su lugar, por favor use:

    schedule_0.union(schedule_1)
    instruction.union(schedule)

    Este mismo patrón se aplica a otras funciones de ops : insert, shift, append, y flatten.

Notas sobre características en desuso

  • El uso de la propiedad control de qiskit.circuit.Instruction para el control clásico ha quedado obsoleto. En el futuro, esta propiedad se utilizará para el control cuántico. En cambio, las operaciones condicionadas clásicas se gestionarán mediante la propiedad condition de qiskit.circuit.Instruction.
  • El soporte para establecer parámetros qiskit.circuit.Instruction con un objeto de tipo qiskit.qasm.node.Node ha quedado obsoleto. Node que se utilizaron anteriormente como parámetros deben convertirse a un tipo compatible antes de inicializar un nuevo objeto Instruction o llamar al definidor Instruction.params . Los tipos admitidos son int, float, complex, str, qiskit.circuit.ParameterExpression o numpy.ndarray.
  • En la versión qiskit 0.9.0 la representación de los bits (tanto qubits como bits clásicos) pasó de ser tuplas de la forma (register, index) a ser instancias de las clases qiskit.circuit.Qubit y qiskit.circuit.Clbit. Por compatibilidad con versiones anteriores, la comparación de la igualdad entre una tupla heredada y las clases de bits se admitió cuando todo pasó de ser tuplas a ser objetos. Este soporte ha quedado obsoleto y se eliminará en el futuro. Todo debe utilizar las clases de bits en lugar de tuplas en adelante.
  • Cuando se utiliza la salida mpl para qiskit.QuantumCircuit.draw() o qiskit.visualization.circuit_drawer() y se utiliza el kwarg style , el paso de claves de diccionario no admitidas como parte del diccionario style` está ahora obsoleto. Si antes estos argumentos desconocidos se ignoraban silenciosamente, en el futuro, las claves no admitidas lanzarán una excepción.
  • El kwarg line length para el método qiskit.QuantumCircuit.draw() y la función qiskit.visualization.circuit_drawer() con el modo de salida de texto está obsoleto. Ha sido sustituido por el fold kwarg que se comportará de forma idéntica para el modo de salida texto (pero ahora también soporta el modo de salida mpl). line_length se eliminará en una futura versión, por lo que las llamadas deben actualizarse para utilizar fold en su lugar.
  • El campo fold del kwarg style dict para el método qiskit.QuantumCircuit.draw() y la función qiskit.visualization.circuit_drawer() ha quedado obsoleto. Ha sido sustituido por el fold kwarg en ambas funciones. Este kwarg se comporta de forma idéntica al campo del dict de estilo.

Corrección de errores

  • La estratificación de instrucciones que subyace en todos los tipos de dibujo de circuitos ha cambiado para abordar la justificación derecha/izquierda. En ocasiones, el resultado es topológicamente equivalente al renderizado en versiones anteriores, pero visualmente diferente. Soluciona el problema nº 2802
  • Añadir memory_slots a QobjExperimentHeader de pulso Qobj. Esto corrige un error en el formato de los datos de meas_level=2 resultados de los experimentos de pulso. Los estados cuánticos medidos se devuelven como una cadena de bits con relleno cero basada en el número establecido para memory_slots.
  • Corregida la visualización de la puerta rzz en el cajón de circuitos de látex para que coincida con la puerta cu1 y refleje la simetría en la puerta rzz. La corrección se basa en el comando cds del paquete qcircuit latex. Soluciona el problema nº 1957

Otras notas

  • matplotlib.figure.Figure devueltos por las funciones de visualización ya no están siempre cerrados por defecto. En su lugar, los objetos figura devueltos sólo se cierran si el backend matplotlib configurado es un backend jupyter en línea (ya sea configurado con %matplotlib inline o %matplotlib notebook). Los objetos de figura de salida se siguen cerrando con estos backends para evitar salidas duplicadas en los cuadernos jupyter (que es por lo que se añadió originalmente Figure.close() ).

Aer 0.3

Sin cambios

Ignis 0.2

Sin cambios

Aqua 0.6

Sin cambios

IBM Proveedor Q 0.3

Sin cambios

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