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
QuantumCircuitque permiten añadir o eliminar mediciones al final de un circuito.measure_all()Añade una operación
barrierseguida de una operaciónmeasurea todos los qubits del circuito. Crea unClassicalRegisterde tamaño igual al número de qubits del circuito, que almacenan las medidas.measure_active()Añade una operación
barrierseguida de una operaciónmeasurea todos los qubits activos del circuito. Un qubit está activo si tiene al menos otra operación actuando sobre él. Crea unClassicalRegisterde 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
barrierde 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 deClassicalRegisterestán inactivos (no tienen ninguna operación asociada), se eliminaClassicalRegister.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.synthesisun descomponedor de Cnot a Rxx/Rx/Rycnot_rxx_decomposey un descomponedor de ángulos de Euler de qubit únicoOneQubitEulerDecomposer. -
Se ha añadido un transpiler pass
MSBasisDecomposerpara 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.mockcontienen ahora una instantánea de los datos reales de calibración del dispositivo. Se puede acceder a través del métodoproperties()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
axa las siguientes funciones de visualización:qiskit.visualization.plot_histogramqiskit.visualization.plot_state_paulivecqiskit.visualization.plot_state_qsphereqiskit.visualization.circuit_drawer(mplsólo backend)qiskit.QuantumCircuit.draw(mplsólo backend)
Este kwarg se utiliza para pasar un objeto
matplotlib.axes.Axesa 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_realyax_imaga las siguientes funciones de visualización:qiskit.visualization.plot_state_hintonqiskit.visualization.plot_state_city
Estos nuevos kargs funcionan igual que los kwargs recién añadidos
axpara 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: UnrollerLa 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: UnrollerSi 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
Delayque puede ser insertado en un pulsoSchedule. Este comando acepta undurationy puede añadirse a cualquierChannel. 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_schedTambié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
datade los objetosqiskit.QuantumCircuitse validan ahora siguiendo las mismas reglas utilizadas en toda la APIQuantumCircuit. Esto se ha hecho para mejorar el rendimiento de la API de circuitos, ya que ahora podemos asumir que el atributodatatiene un formato conocido. Si antes modificabas manualmente el atributodatade 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
DenseLayouten lugar deNoiseAdaptiveLayout. El paseDenselayouttambién se ha modificado para que sea sensible al ruido. -
Se ha eliminado la clase obsoleta
DeviceSpecification. En su lugar, debe utilizar la direcciónPulseChannelSpec. Por ejemplo, puedes ejecutar algo comodevice = 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étodosScheduleyInstruction. Por ejemplo, en lugar de:ops.union(schedule_0, schedule_1) ops.union(instruction, schedule) # etcEn 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, yflatten.
Notas sobre características en desuso
- El uso de la propiedad
controldeqiskit.circuit.Instructionpara 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 propiedadconditiondeqiskit.circuit.Instruction. - El soporte para establecer parámetros
qiskit.circuit.Instructioncon un objeto de tipoqiskit.qasm.node.Nodeha quedado obsoleto.Nodeque se utilizaron anteriormente como parámetros deben convertirse a un tipo compatible antes de inicializar un nuevo objetoInstructiono llamar al definidorInstruction.params. Los tipos admitidos sonint,float,complex,str,qiskit.circuit.ParameterExpressiononumpy.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 clasesqiskit.circuit.Qubityqiskit.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
mplparaqiskit.QuantumCircuit.draw()oqiskit.visualization.circuit_drawer()y se utiliza el kwargstyle, el paso de claves de diccionario no admitidas como parte del diccionariostyle`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 lengthpara el métodoqiskit.QuantumCircuit.draw()y la funciónqiskit.visualization.circuit_drawer()con el modo de salida de texto está obsoleto. Ha sido sustituido por elfoldkwarg que se comportará de forma idéntica para el modo de salida texto (pero ahora también soporta el modo de salida mpl).line_lengthse eliminará en una futura versión, por lo que las llamadas deben actualizarse para utilizarfolden su lugar. - El campo
folddel kwargstyledict para el métodoqiskit.QuantumCircuit.draw()y la funciónqiskit.visualization.circuit_drawer()ha quedado obsoleto. Ha sido sustituido por elfoldkwarg 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_slotsaQobjExperimentHeaderde pulso Qobj. Esto corrige un error en el formato de los datos demeas_level=2resultados 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 paramemory_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.Figuredevueltos 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 inlineo%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ó originalmenteFigure.close()).
Aer 0.3
Sin cambios
Ignis 0.2
Sin cambios
Aqua 0.6
Sin cambios
IBM Proveedor Q 0.3
Sin cambios