Notas de la versión de Qiskit 0.7
0.7
En Qiskit 0.7 presentamos Qiskit Aer y lo combinamos con Qiskit Terra.
Terra 0.7
Nuevas funciones
Esta versión incluye varias funciones nuevas y muchas correcciones de errores. Con esta versión se declaran estables las interfaces de diagrama de circuito, histograma, vectores bloch y visualizaciones de estado. Además, esta versión incluye un orden de bits/endiancia definido y estandarizado en todos los aspectos de Qiskit. Todas ellas se declaran como interfaces estables en esta versión, en la que no se introducirán cambios de última hora, a menos que haya periodos de depreciación apropiados y prolongados que adviertan de los cambios que se avecinan.
También se han introducido las siguientes novedades:
- Un nuevo modo de salida de dibujo de circuitos artísticos ASCII
- Una nueva interfaz de dibujo de circuitos a partir de objetos
QuantumCircuitque permite llamar acircuit.draw()oprint(circuit)para representar un dibujo de circuitos - Un visualizador para dibujar la representación DAG de un circuito
- Un nuevo tipo de trazado de estado cuántico para diagramas de hinton en los trazados de estado locales basados en matplotlib
- 2 nuevos métodos constructores de la clase
QuantumCircuitfrom_qasm_str()yfrom_qasm_file()que permiten crear fácilmente un objeto circuito a partir de OpenQASM - Una nueva función
plot_bloch_multivector()para trazar vectores Bloch a partir de un vector de estado tensado o una matriz de densidad - Los resultados de las mediciones por disparo están disponibles en simuladores y dispositivos seleccionados. Se puede acceder a ellos estableciendo el kwarg
memoryenTrueal llamar acompile()oexecute()y, a continuación, accediendo mediante el métodoget_memory()en el objetoResult. - Un módulo
qiskit.quantum_infocon objetos Pauli renovados y métodos para trabajar con estados cuánticos - Nuevos pases transpilares para análisis y transformación de circuitos:
CommutationAnalysis,CommutationTransformation,CXCancellation,Decompose,Unroll,Optimize1QGates,CheckMap,CXDirection,BarrierBeforeFinalMeasurements - Nueva alternativa swapper pasa en el transpilador:
BasicSwap,LookaheadSwap,StochasticSwap - Infraestructura de transpilador más avanzada con soporte para pases de análisis, pases de transformación, un
property_setglobal para el gestor de pases y control de repetición hasta el final de los pases
Consideraciones acerca de la compatibilidad
Como parte de la versión 0.7, los siguientes elementos han quedado obsoletos y se eliminarán o cambiarán de forma incompatible con versiones anteriores en una versión futura. Aunque no son estrictamente necesarias, son cosas que hay que ajustar antes de la próxima versión para evitar cambios bruscos.
plot_circuit(),latex_circuit_drawer(),generate_latex_source(), ymatplotlib_circuit_drawer()de qiskit.tools.visualization son obsoletos. En su lugar debe utilizarse la funcióncircuit_drawer()del mismo módulo, existen opciones kwarg para reflejar la funcionalidad de todas las funciones obsoletas.- La salida actual por defecto de
circuit_drawer()(usando latex y recurriendo a python) está obsoleta y se cambiará para usar sólo la salidatextpor defecto en futuras versiones. - Las funciones
qiskit.wrapper.load_qasm_string()yqiskit.wrapper.load_qasm_file()están obsoletas y en su lugar deben utilizarse los métodos constructoresQuantumCircuit.from_qasm_str()yQuantumCircuit.from_qasm_file(). - Las claves
plot_barriersyreverse_bitsdel diccionario de kwargsstyleestán obsoletas, en su lugar deben utilizarse los kwargsqiskit.tools.visualization.circuit_drawer()plot_barriersyreverse_bits. - Las funciones
plot_state()yiplot_state()se han amortizado. En su lugar, se debe llamar a las funcionesplot_state_*()yiplot_state_*()para el método de visualización requerido. - El argumento
skip_transpilerha quedado obsoleto encompile()yexecute(). En su lugar, puede utilizar directamente elPassManager, basta con establecer elpass_managera un objetoPassManageren blanco conPassManager() - La función
transpile_dag()formatkwarg para emitir diferentes formatos de salida está obsoleta, en su lugar debe convertir el objeto de salida por defectoDAGCircuital formato deseado. - Los desenrolladores han quedado obsoletos, en adelante sólo se soportará el desenrollado de DAG a DAG.
Tenga en cuenta que en esta versión se han introducido algunos cambios incompatibles con versiones anteriores. Las siguientes notas contienen información sobre cómo adaptarse a estos cambios.
Cambios en los objetos Result
Como parte de la reescritura del objeto Resultados para que sea más consistente y una interfaz estable de cara al futuro, se han realizado algunos cambios en la forma de acceder a los datos almacenados en el objeto resultado. En primer lugar, el método get_data() ha pasado a llamarse simplemente data(). Este cambio va acompañado de un cambio en el formato de los datos devueltos por la función. Ahora devuelve los datos brutos de los backends en lugar de hacer ningún post-procesamiento. Por ejemplo, en versiones anteriores podías llamar a:
result = execute(circuit, backend).result()
unitary = result.get_data()['unitary']
print(unitary)y que devolvería la matriz unitaria como:
[[1+0j, 0+0.5j], [0-0.5j][-1+0j]]Pero ahora si llamas (con el método renombrado):
result.data()['unitary']devolverá algo como:
[[[1, 0], [0, -0.5]], [[0, -0.5], [-1, 0]]]Para obtener los resultados postprocesados en el mismo formato que antes del lanzamiento de 0.7 debe utilizar los métodos get_counts(), get_statevector(), y get_unitary() en el objeto resultante en lugar de get_data()['counts'], get_data()['statevector'], y get_data()['unitary'] respectivamente.
Además, se ha eliminado la compatibilidad con len() y la indexación en un objeto Result . En su lugar, debe tratar la salida de los métodos postprocesados en los objetos Resultado.
Además, se han eliminado los métodos get_snapshot() y get_snapshots() de la clase Result . En su lugar, puede acceder a las instantáneas mediante Result.data()['snapshots'].
Cambios en la visualización
El mayor cambio introducido en la visualización en la versión 0.7 es la eliminación de Matplotlib y otras dependencias de visualización de los requisitos del proyecto. Esto se hizo para simplificar los requisitos y la configuración necesarios para instalar Qiskit. Si planea utilizar cualquier visualización (incluyendo todas las magias de jupyter) excepto las salidas text, latex, y latex_source para el cajón de circuitos deberá asegurarse manualmente de que las dependencias de visualización están instaladas. Para ello, puedes aprovechar los requisitos opcionales del paquete Qiskit Terra:
pip install qiskit-terra[visualization]Aparte de esto, se han introducido cambios en varias de las interfaces como parte de la estabilización, lo que puede repercutir en el código existente. La primera es que ya no se acepta el kwarg basis en la función circuit_drawer() . Si ha utilizado circuit_drawer() para ajustar las puertas base utilizadas en el dibujo de un circuito, tendrá que hacerlo antes de llamar a circuit_drawer(). Por ejemplo:
from qiskit.tools import visualization
visualization.circuit_drawer(circuit, basis_gates='x,U,CX')tendrá que ajustarse para serlo:
from qiskit import BasicAer
from qiskit import transpiler
from qiskit.tools import visualization
backend = BasicAer.backend('qasm_simulator')
draw_circ = transpiler.transpile(circuit, backend, basis_gates='x,U,CX')
visualization.circuit_drawer(draw_circ)En adelante, la función circuit_drawer() será la única interfaz para el dibujo de circuitos en el módulo de visualización. Antes de la versión 0.7 existían otras funciones que, o bien utilizaban backends de salida diferentes, o bien cambiaban la salida para dibujar circuitos. Sin embargo, todas esas otras funciones han quedado obsoletas y esa funcionalidad se ha integrado como opciones en circuit_drawer().
Para las otras funciones de visualización, plot_histogram() y plot_state() también hay algunos cambios que hay que comprobar al actualizar. En primer lugar, la salida de estas funciones ha cambiado: en versiones anteriores, estas funciones mostraban interactivamente la visualización de la salida. Sin embargo, ahora devuelve un objeto matplotlib.Figure . Esto proporciona mucha más flexibilidad y opciones para interactuar con la visualización antes de guardarla o mostrarla. Para ello será necesario ajustar la forma en que se consumen estas funciones. Por ejemplo, antes de esta versión, cuando se llamaba:
plot_histogram(counts)
plot_state(rho)abriría nuevas ventanas (dependiendo del backend matplotlib) para mostrar la visualización. Sin embargo, a partir de 0.7 tendrá que llamar a show() en la salida para reflejar este comportamiento. Por ejemplo:
plot_histogram(counts).show()
plot_state(rho).show()o:
hist_fig = plot_histogram(counts)
state_fig = plot_state(rho)
hist_fig.show()
state_fig.show()Tenga en cuenta que esto es sólo para cuando se ejecuta fuera de Jupyter. No es necesario realizar ningún ajuste dentro de un entorno Jupyter porque los cuadernos Jupyter entienden de forma nativa cómo representar objetos matplotlib.Figure .
Sin embargo, devolver el objeto Figura proporciona flexibilidad adicional para tratar la salida. Por ejemplo, en lugar de limitarse a mostrar la figura, ahora puede guardarla directamente en un archivo aprovechando el método savefig() . Por ejemplo:
hist_fig = plot_histogram(counts)
state_fig = plot_state(rho)
hist_fig.savefig('histogram.png')
state_fig.savefig('state_plot.png')El otro aspecto clave que ha cambiado con estas funciones es cuando se ejecuta bajo jupyter. En la versión 0.6 plot_state() y plot_histogram() cuando se ejecutaba bajo jupyter el comportamiento por defecto era utilizar los gráficos interactivos Javascript si la librería Javascript alojada externamente para renderizar la visualización era accesible a través de la red. Si no, utilizaría simplemente la versión matplotlib. Sin embargo, en la versión 0.7 esto ya no es así, y en su lugar deben utilizarse funciones independientes para los gráficos interactivos, iplot_state() y iplot_histogram() . plot_state() y plot_histogram() utilizan siempre las versiones matplotlib.
Además, a partir de esta versión, la función plot_state() queda obsoleta en favor de la llamada a métodos individuales para cada método de trazado de un estado cuántico. Aunque la función plot_state() seguirá funcionando hasta el lanzamiento de 0.9, emitirá un aviso cada vez que se utilice. La cabecera HTTP
Qiskit Terra 0.6 | Qiskit Terra 0.7 + |
|---|---|
| plot_state(rho) | plot_state_city(rho) |
| plot_state(rho, method='ciudad') | plot_state_city(rho) |
| plot_state(rho, method='paulivec') | plot_state_paulivec(rho) |
| plot_state(rho, method='qsphere') | plot_state_qsphere(rho) |
| plot_state(rho, method='bloch') | plot_bloch_multivector(rho) |
| plot_state(rho, method='hinton') | plot_state\hinton(rho) |
Lo mismo ocurre con el equivalente interactivo en JS, iplot_state(). Los nombres de las funciones son todos iguales, sólo que con una i antepuesta para cada función. Por ejemplo, iplot_state(rho, method='paulivec') es iplot_state_paulivec(rho).
Cambios en los backends
Con las mejoras introducidas en la versión 0.7 hay algunas cosas relacionadas con los backends que hay que tener en cuenta al actualizar. El mayor cambio es la reestructuración de las instancias del proveedor en el espacio de nombres raíz qiskit` . El proveedor Aer no está instalado por defecto y requiere la instalación del paquete qiskit-aer . Este paquete contiene el nuevo simulador de alto rendimiento con todas las funciones. Si lo has instalado a través de pip install qiskit ya lo tendrás instalado. Los simuladores de Python están ahora disponibles en qiskit.BasicAer y los antiguos simuladores de C++ en qiskit.LegacySimulators. Esto también significa que ya no existe la opción implícita de recurrir a simuladores basados en Python cuando no se encuentran simuladores C++. Si pide un backend simulador local basado en C++, y no se puede encontrar una excepción se planteará en lugar de sólo utilizar el simulador de python en su lugar.
Además, se han eliminado las funciones de nivel superior register() y available_backends() , que anteriormente estaban obsoletas. Además, se han eliminado los métodos obsoletos backend.parameters() y backend.calibration() en favor de backend.properties(). Puede consultar la sección de notas de la versión 0.6 Trabajar con backends para obtener más detalles sobre estos cambios.
Las llamadas backend.jobs() y backend.retrieve_jobs() ya no devuelven resultados de esos trabajos. En su lugar, debe llamar al método result() en los objetos jobs devueltos.
Cambios en el compilador, el transpilador y los desenrolladores
Como parte de un esfuerzo por estabilizar las interfaces del compilador, se han producido varios cambios que deben tenerse en cuenta al utilizar las funciones del compilador. En primer lugar, es importante señalar que la función qiskit.transpiler.transpile() ahora toma un objeto QuantumCircuit (o una lista de ellos) y devuelve un objeto QuantumCircuit (o una lista de ellos). El procesamiento del DAG se realiza ahora internamente.
También puedes cambiar fácilmente entre circuitos, DAGs y Qobj ahora utilizando las funciones de qiskit.converters.
Aer 0.1
Nuevas funciones
Aer ofrece tres simuladores:
QasmSimulator: simular experimentos y devolver los resultados de las medicionesStatevectorSimulatordevuelven el vector de estado final para un circuito cuántico que actúa sobre el estado todo ceroUnitarySimulatordevuelven la matriz unitaria de un circuito cuántico
noise contiene funciones avanzadas de modelado del ruido para el QasmSimulator
NoiseModel,QuantumError,ReadoutErrorclases para simular un circuito cuántico Qiskit en presencia de erroreserrorssubmódulo que incluye funciones para generar objetosQuantumErrorpara los siguientes tipos de errores cuánticos: Kraus, unitario mixto, unitario coherente, Pauli, despolarizante, relajación térmica, amortiguación de amplitud, amortiguación de fase, amortiguación combinada de fase y amplituddevicesubmódulo para generar automáticamente un modelo de ruido basado en la direcciónBackendPropertiesde un dispositivo
utils módulo:
qobj_utilsproporciona funciones para modificar directamente un Qobj con el fin de insertar instrucciones especiales del simulador aún no soportadas a través de la API Terra de Qiskit.
Aqua 0.4
Nuevas funciones
-
API programáticas para algoritmos y componentes: ahora cada componente puede instanciarse e inicializarse mediante una única llamada al constructor (no vacía)
-
QuantumInstanceAPI para la disociación algoritmo/backend -QuantumInstanceencapsula un backend y su configuración -
Documentación actualizada y cuadernos Jupyter que ilustran las nuevas API programáticas
-
Paralelización transparente para optimizadores basados en gradientes
-
Funcionamiento con control múltiple (cnx)
-
Componente algorítmico enchufable
RandomDistribution -
Implementaciones concretas de
RandomDistribution:BernoulliDistribution,LogNormalDistribution,MultivariateDistribution,MultivariateNormalDistribution,MultivariateUniformDistribution,NormalDistribution,UniformDistribution, yUnivariateDistribution -
Implementaciones concretas de
UncertaintyProblem:FixedIncomeExpectedValue,EuropeanCallExpectedValue, yEuropeanCallDelta -
Algoritmo de estimación de la amplitud
-
Optimización Qiskit: Nuevos modelos de Ising para problemas de optimización cobertura exacta, empaquetamiento de conjuntos, cobertura de vértices, camarilla y partición de grafos
-
Qiskit AI:
- Nuevos mapas de funciones que amplían la interfaz enchufable
FeatureMap:PauliExpansionyPauliZExpansion - Mecanismo de serialización/deserialización del modelo de formación
- Nuevos mapas de funciones que amplían la interfaz enchufable
-
Qiskit Finanzas:
- Estimación de la amplitud para una variable aleatoria Bernoulli: ilustración de la estimación de la amplitud en un problema de qubit único
- Carga de múltiples distribuciones aleatorias univariantes y multivariantes
- Opción de compra europea: valor esperado y delta (utilizando distribuciones univariantes)
- Valoración de activos de renta fija: valor esperado (mediante distribuciones multivariantes)
-
La cadena Pauli de la clase
Operatorestá alineada con Terra 0.7. Ahora el orden de una cadena pauli de n-qubit esq_{n-1}...q{0}Así, los (de)serialier (save_to_dictyload_from_dict) en la claseOperatortambién se cambian para adoptar los cambios de la clasePauli.
Consideraciones acerca de la compatibilidad
HartreeFockcomponente de tipo enchufableInitialStatetrasladado a Qiskit ChemistryUCCSDcomponente de tipo enchufableVariationalFormtrasladado a Qiskit Chemistry