Notas de la versión de Qiskit 0.23
0.23.6
Terra 0.16.4
No cambia
Aer 0.7.5
Preludio
Esta versión es una corrección de errores que corrige la compatibilidad de los paquetes binarios precompilados con las versiones de numpy < 1.20.0. La versión anterior 0.7.4 estaba construyendo los binarios de una manera que requeriría numpy 1.20.0 que se ha resuelto ahora, por lo que los paquetes binarios rueda precompilados funcionará con cualquier versión compatible numpy.
Ignis 0.5.2
No cambia
Aqua 0.8.2
No cambia
IBM Proveedor Q 0.11.1
No cambia
0.23.5
Terra 0.16.4
Preludio
Esta versión es una corrección de errores que corrige principalmente la compatibilidad con numpy 1.20.0. Esta versión de numpy desaprobó sus alias locales para los tipos numéricos de Python (np.int -> int, np.float -> float, etc.) y el uso de estos alias en Qiskit dio lugar a la emisión de un gran número de advertencias de desaprobación. Esta versión corrige esto para que puedas ejecutar Qiskit con numpy 1.20.0 sin esas advertencias de desaprobación.
Aer 0.7.4
Corrección de errores
Corrige la compatibilidad con numpy 1.20.0. Esta versión de numpy desaprobó sus alias locales para los tipos numéricos de Python (np.int -> int, np.float -> float, etc.) y el uso de estos alias en Qiskit Aer dio lugar a la emisión de un gran número de advertencias de desaprobación. Esta versión corrige esto para que puedas ejecutar Qiskit Aer con numpy 1.20.0 sin esas advertencias de desaprobación.
Ignis 0.5.2
Preludio
Esta versión es una corrección de errores que corrige principalmente la compatibilidad con numpy 1.20.0. También es la primera versión que incluye compatibilidad con Python 3.9. Las versiones anteriores (incluidas 0.5.0 y 0.5.1 ) funcionaban con Python 3.9 pero no lo indicaban en los metadatos del paquete, y no se habían realizado pruebas upstream para esas versiones. Esta versión lo corrige y se ha probado en Python 3.9 (además de 3.6, 3.7, y 3.8 ).
Corrección de errores
- networkx aparece ahora explícitamente como dependencia. Anteriormente era una dependencia implícita, ya que era necesaria para el módulo
qiskit.ignis.verification.topological_codes, pero no aparecía correctamente como una dependencia, ya que qiskit-terra también requiere networkx y también es una dependencia de ignis, por lo que siempre se instalaría en la práctica. Sin embargo, es necesario listarlo como requisito para futuras versiones de qiskit-terra que no requieran networkx. También es importante listar correctamente las dependencias de ignis por si en el futuro hubiera alguna incompatibilidad entre requisitos de versiones.
Aqua 0.8.2
IBM Proveedor Q 0.11.1
No cambia
0.23.4
Terra 0.16.3
Corrección de errores
- Se ha corregido un problema introducido en 0.16.2 que provocaba errores al ejecutar
transpile()en un circuito con una serie de puertas de 1 qubit y una instrucción no puerta que sólo opera en un qubit (por ejemplo,Reset). Correcciones #5736
Aer 0.7.3
No cambia
Ignis 0.5.1
No cambia
Aqua 0.8.1
No cambia
IBM Proveedor Q 0.11.1
No cambia
0.23.3
Terra 0.16.2
Nuevas funciones
- Python 3.9 en esta versión. Ya puedes ejecutar Qiskit Terra utilizando Python 3.9.
Notas de actualización
- La clase
MCXGrayCodecreará ahora unC3XGatesinum_ctrl_qubitses 3 y unC4XGatesinum_ctrl_qubitses 4. Esto se añade a la funcionalidad anterior en la que para cualquiera de los modos de la :clase:' qiskit.library.standard_gates.x.MCXGate\, sinum_ctrl_bitses 1, se crea unCXGate, y si es 2, se crea unCCXGate` .
Corrección de errores
-
Pulso
Delayse ensamblan ahora explícitamente comoPulseQobjInstructionincluidas en laPulseQobjsalida deassemble().Anteriormente, podíamos ignorar
Delayen un archivoSchedulecomo parte deassemble()ya que el tiempo estaba explícito en losPulseQobjobjetos. Pero, ahora con las puertas de impulsos, hay situaciones en las que podemos programar SÓLO un retardo, y no incluir el retardo en sí eliminaría el retardo. -
Los circuitos con calibraciones de puerta personalizadas ahora se pueden programar con el transpilador sin proporcionar explícitamente las duraciones de cada calibración de circuito.
-
En
BasisTranslatoryUnrollerpases, en algunos casos, no habían preservado la fase global del circuito bajo transpilación. Esto se ha solucionado. -
Se ha corregido un error en
qiskit.pulse.builder.frequency_offset()en el que cuando se establecíacompensate_phasefaltaba un factor de en la fase añadida. -
Fijar la fase global de la salida del
QuantumCircuitmétodorepeat(). Si un circuito con fase global se añade a otro circuito, la fase global no se propaga. Los simuladores se basan en esto, ya que de lo contrario la fase se aplica varias veces. Esto establece la fase global derepeat()a 0 antes de añadir el circuito repetido en lugar de multiplicar la fase existente por el número de repeticiones. -
Se corrige un error en
SparsePauliOppor el que la multiplicación por ciertos tipos escalares Numpy no construidos en Python devolvía valores incorrectos. Correcciones #5408 -
La definición de la fidelidad de Hellinger de se ha corregido de la definición anterior de a para que sea igual a la fidelidad de estado cuántico de P, Q como matrices de densidad diagonal.
-
Reducir el número de compuertas CX en la descomposición de la compuerta X controlada por 3,
C3XGate. Compilado y optimizado en la base U CX, ahora sólo se utilizan 14 puertas CX y 16 U en lugar de 20 y 22, respectivamente. -
Soluciona el problema por el que el uso del widget de backend Jupyter o
qiskit.tools.backend_monitor()fallaba si las puertas base del backend no incluían las tradicionales u1, u2, y u3. -
Cuando se ejecuta
qiskit.compiler.transpile()en una lista de circuitos con un solo elemento, la función solía devolver un circuito en lugar de una lista. Ahora, cuandoqiskit.compiler.transpile()se llama con una lista, devolverá una lista incluso si esa lista tiene un solo elemento. Ver #5260.from qiskit import * qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() transpiled = transpile([qc]) print(type(transpiled), len(transpiled))<class 'list'> 1
Aer 0.7.3
Nuevas funciones
- Python 3.9 en esta versión. Ahora puede ejecutar Qiskit Aer utilizando Python 3.9 sin necesidad de compilar desde el código fuente.
Corrección de errores
- Se soluciona un problema con la configuración de las puertas base de
QasmSimulatorcuando se utilizan juntas las opciones"method"y"noise_model", y cuando se utilizan con un simulador construido confrom_backend(). Ahora las puertas base listadas serán la intersección de las puertas soportadas por la configuración del backend, el método de simulación y las puertas base del modelo de ruido. Si la intersección de las puertas base del modelo de ruido y las puertas base del simulador está vacía, se registrará una advertencia. - Se corrige un error que provocaba que c_if no funcionara cuando la anchura del registro condicional era superior a 64. Ver #1077.
- Se corrige un error en
from_backend()yfrom_backend()dondebasis_gatesse establecía incorrectamente para dispositivos IBMQ con puerta base establecida['id', 'rz', 'sx', 'x', 'cx']. Ahora el modelo de ruido siempre tendrá las mismas puertas base que las puertas base del backend, independientemente de si esas instrucciones tienen errores en el modelo de ruido o no. - Se corrige un error al aplicar el truncamiento en el método de estado del producto matricial de la QasmSimulator.
Ignis 0.5.1
No cambia
Aqua 0.8.1
No cambia
IBM Proveedor Q 0.11.1
No cambia
0.23.2
Terra 0.16.1
No cambia
Aer 0.7.2
Nuevas funciones
- Añadir la bandera CMake
DISABLE_CONAN(default=`OFF\``)s. Cuando se instala desde el código fuente, si se establece enONse puede evitar el gestor de paquetes Conan para encontrar las bibliotecas que ya están instaladas en el sistema. Esto también está disponible como una variable de entornoDISABLE_CONAN`, que tiene prioridad sobre la bandera CMake. Este no es el procedimiento oficial para construir REA. Por lo tanto, el usuario es responsable de proporcionar todas las bibliotecas necesarias y los archivos correspondientes para que CMake pueda encontrarlos.
Corrección de errores
- Corrige un error con OpenMP anidada bandera estaba siendo fijado a true cuando no debería ser.
Ignis 0.5.1
No cambia
Aqua 0.8.1
No cambia
IBM Proveedor Q 0.11.1
No cambia
0.23.1
Terra 0.16.1
Corrección de errores
- Se ha corregido un problema por el que se producía un error en la ejecución de circuitos válidos construidos con retardos.
- La definición QASM de ‘c4x’ en qelib1.inc se ha corregido para que coincida con la definición de la biblioteca estándar para C4XGate.
- Corrige un error en la resta de canales cuánticos donde era un
Operatorobjeto. Se estaba aplicando la negación a la matriz en la representación del operador, lo que no es equivalente a la negación en la representación del canal cuántico. - Cambia la forma en que
_evolve_instruction()accede a los qubits para manejar el caso de una instrucción con múltiples registros.
Aer 0.7.1
Notas de actualización
- La versión mínima de cmake para compilar qiskit-aer ha aumentado de 3.6 a 3.8. Este cambio fue necesario para permitir la fijación de versiones de GPU que admiten la ejecución en CPUs x86_64 que carecen de instrucciones AVX2.
Corrección de errores
- qiskit-aer con soporte para GPU funcionará ahora en sistemas con CPUs x86_64 que carezcan de instrucciones AVX2. Anteriormente, el paquete GPU sólo se ejecutaba si las instrucciones AVX2 estaban disponibles. Correcciones #1023
- Se ha corregido un error de
AerProviderpor el que las opciones establecidas en los backends devueltos medianteset_options()se almacenaban en el proveedor y persistían en llamadas posteriores aget_backend()para el mismo backend. Ahora cada llamada a ybackends()devuelve una nueva instancia del backend del simulador que se puede configurar. - Se corrige un error en el mensaje de error devuelto cuando un circuito contiene instrucciones de simulador no compatibles. Anteriormente, algunas instrucciones compatibles también aparecían en el mensaje de error junto con las instrucciones no compatibles.
- Corregido error por el que la puerta "sx"`
SXGateno aparecía como puerta soportada en el código C++, en StateOpSet de matrix_product_state.hp. - Se ha corregido un error por el que
"csx","cu2","cu3"aparecían incorrectamente en la lista de puertas base admitidas para el método"density_matrix"deQasmSimulator. - En MPS, apply_kraus operaba directamente sobre los bits de entrada en los qubits de parámetros, en lugar de sobre los qubits internos. En el algoritmo MPS, los qubits están en constante movimiento, por lo que todas las operaciones deben aplicarse a los qubits internos.
- Al invocar a MPS::sample_measure, necesitamos primero ordenar los qubits al ordenamiento por defecto porque así se asume en qasm_controller.This se hace invocando al método move_all_qubits_to_sorted_ordering. Era correcto en sample_measure_using_apply_measure, pero faltaba en sample_measure_using_probabilities.
Ignis 0.5.1
Corrección de errores
- Corrige el método
"auto"deTomographyFitter,StateTomographyFitter, yProcessTomographyFitterpara que sólo utilice"cvx"si CVXPY está instalado y se dispone de un solucionador SDP de terceros distinto de SCS. Esto se debe a que el solver SCS tiene menor precisión que otros métodos de solver y a menudo devuelve una matriz de densidad o matriz de Choi que no es completamente positiva y falla la validación cuando se utiliza con el métodoqiskit.quantum_info.state_fidelity()oqiskit.quantum_info.process_fidelity().
Aqua 0.8.1
0.8.1
Nuevas funciones
- Se ha añadido un nuevo algoritmo: la superficie de energía potencial de Born Openheimer para el cálculo de la superficie de energía potencial a lo largo de diferentes grados de libertad de la molécula. El algoritmo se denomina
BOPESSampler. Además, ofrece funciones de ajuste de la superficie de energía potencial a una función analítica de detalles predefinidos potentials.some.
Problemas críticos
- Tenga en cuenta que el parámetro
initial_stateenQAOAtiene ahora una implementación diferente como resultado de una corrección de errores. La implementación anterior mezclaba erróneamente lasinitial_stateproporcionadas por el usuario con las puertas Hadamard. El problema ya está solucionado. No es necesario prestar atención si su código no hace uso del parámetroinitial_stateproporcionado por el usuario.
Corrección de errores
- el método optimize_svm de qp_solver a veces fallaba, dando lugar a un error como este ValueError: cannot reshape array of size 1 into shape (200,1) Esto soluciona el problema añadiendo un parámetro de norma L2, lambda2, que por defecto es 0.001 pero que puede cambiarse a través del algoritmo QSVM, según sea necesario, para facilitar la convergencia.
- Un método
one_letter_symbolha sido eliminado de laVarTypeen la última versión de DOCplex haciendo Aqua incompatible con esta versión. Por ello, en lugar de utilizar este método, se ha introducido una comprobación explícita de los tipos de las variables en el módulo de optimización Aqua. - :meth`~qiskit.aqua.operators.state_fns.DictStateFn.sample()`` sólo podía manejar amplitudes reales, pero se ha arreglado para manejar amplitudes complejas. #1311 <https://github.com/qiskit-community/qiskit-aqua/issues/1311> para más detalles.
- La clase Trotter no usaba el argumento reps en el constructor. #1317 <https://github.com/qiskit-community/qiskit-aqua/issues/1317> para más detalles.
- Lanza un AquaError si :class`qiskit.aqua.operators.converters.CircuitSampler` muestra un operador vacío. #1321 <https://github.com/qiskit-community/qiskit-aqua/issues/1321> para más detalles.
to_opflow()devuelve un operador correcto cuando los coeficientes son números complejos. #1381 <https://github.com/qiskit-community/qiskit-aqua/issues/1381> para más detalles.- Permita que los simuladores backend validen la compatibilidad con NoiseModel en lugar de restringirse a Aer únicamente en QuantumInstance.
- Manejar correctamente PassManager en QuantumInstance
transpilemétodo llamando a surunmétodo si existe. - Se ha corregido un error que mezclaba
initial_statepersonalizado enQAOAcon las puertas Hadamard. Esto no cambia la funcionalidad de QAOA si no initial_state es proporcionada por el usuario. Debe prestarse atención si su implementación utiliza QAOA con el parámetro cusominitial_stateya que los resultados de la optimización podrían diferir. - Antes, al configurar seed_simulator=0 en QuantumInstance no se fijaba ninguna semilla. Esto sólo afectaba al valor 0. Esto se ha solucionado.
IBM Proveedor Q 0.11.1
Nuevas funciones
qiskit.providers.ibmq.experiment.Experimenttiene ahora tres atributos adicionales, hub, grupo y proyecto, que identifican al proveedor utilizado para crear el experimento.- Los métodos
qiskit.providers.ibmq.experiment.ExperimentService.experiments()yqiskit.providers.ibmq.experiment.ExperimentService.analysis_results()admiten ahora un parámetrolimitque permite limitar el número de experimentos y resultados de análisis devueltos.
Notas de actualización
- Un nuevo parámetro,
limit, es ahora el primer parámetro de los métodosqiskit.providers.ibmq.experiment.ExperimentService.experiments()yqiskit.providers.ibmq.experiment.ExperimentService.analysis_results(). Estelimittiene un valor por defecto de 10, lo que significa que por defecto sólo se devolverán 10 experimentos y resultados de análisis.
Corrección de errores
- Soluciona el problema por el que un trabajo podía quedar en el estado
CREATINGsi el envío del trabajo fallaba a mitad de camino. - Corrige el bucle infinito que se producía al pasar una instancia de
IBMQRandomServicea un proceso hijo.
0.23.0
Terra 0.16.0
Preludio
La versión 0.16.0 incluye varias novedades y correcciones de errores. Las principales características de esta versión son las siguientes:
- Introducción de circuitos programados, en los que los retardos pueden utilizarse para controlar la temporización y la alineación de las operaciones en el circuito.
- Compilación de circuitos cuánticos a partir de funciones clásicas, como los oráculos.
- Capacidad para compilar y optimizar rotaciones de qubits individuales sobre diferentes bases de Euler, así como la base fase + raíz cuadrada(X) (es decir,
['p', 'sx']), que sustituirá a la antigua base IBM Quantum de['u1', 'u2', 'u3']. - Seguimiento de
global_phase()en laQuantumCircuitse ha ampliado mediante la clasetranspiler,quantum_infoyassemblerasí como en los simuladores BasicAer y Aer. Las simulaciones unitarias y de vectores de estado devolverán ahora matrices unitarias y vectores de estado globales con corrección de fase.
También es de especial importancia para esta versión que Python 3.5 ya no es compatible. Si está utilizando Qiskit Terra con Python 3.5, la versión 0.15.2 es la última que funcionará.
Nuevas funciones
-
Se han añadido puertas R globales a
qiskit.circuit.library. Esto incluye la puerta R global (GR), Rx global (GRX) y la puerta global Ry (GRY) que se derivan de la puertaGRy la puerta global Rz (GRZ) que se define de forma similar a las puertasGRpuertas. Las puertas R globales se definen en un número de qubits simultáneamente, y actúan como una suma directa de puertas R en cada qubit.Por ejemplo:
from qiskit import QuantumCircuit, QuantumRegister import numpy as np num_qubits = 3 qr = QuantumRegister(num_qubits) qc = QuantumCircuit(qr) qc.compose(GR(num_qubits, theta=np.pi/3, phi=2*np.pi/3), inplace=True)creará un
QuantumCircuiten unQuantumRegisterde 3 qubits y realizará unRGatede un ángulo alrededor de un eje en el plano xy de las esferas de Bloch que forme un ángulo de con el eje x en cada qubit. -
Se ha añadido un nuevo esquema de colores,
iqx, al backendmplpara el cajón de circuitosqiskit.visualization.circuit_drawer()yqiskit.circuit.QuantumCircuit.draw(). Utiliza el mismo esquema de colores que el Circuit Composer del sitio web IBM Quantum Experience. Ahora hay 3 esquemas de color disponibles:default,iqxybw.Hay dos formas de seleccionar una combinación de colores. La primera es utilizar un archivo de configuración del usuario, por defecto en el directorio
~/.qiskit, en el archivosettings.confbajo el título[Default], un usuario puede introducircircuit_mpl_style = iqxpara seleccionar el esquema de coloriqx.La segunda forma es añadir
{'name': 'iqx'}al kwargstyleal métodoQuantumCircuit.drawo a la funcióncircuit_drawer. La segunda forma anulará la configuración del archivo settings.conf. Por ejemplo:from qiskit.circuit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() circuit.draw('mpl', style={'name': 'iqx'}) -
En el
stylekwarg para el cajón del circuitoqiskit.visualization.circuit_drawer()yqiskit.circuit.QuantumCircuit.draw()el campodisplaycolorcon el backendmplpermite ahora introducir tanto el color de la puerta como el color del texto para cada tipo de puerta en el formulario(gate_color, text_color). Esto permite utilizar colores de puerta claros y oscuros con colores de texto contrastados. Los usuarios aún pueden establecer sólo el color de la puerta, en cuyo caso se utilizará el campogatetextcolor. Los colores de las puertas pueden establecerse en el dictstylepara cualquier número de tipos de puerta, desde uno hasta todo el dictdisplaycolor. Por ejemplo:from qiskit.circuit import QuantumCircuit circuit = QuantumCircuit(1) circuit.h(0) style_dict = {'displaycolor': {'h': ('#FA74A6', '#000000')}} circuit.draw('mpl', style=style_dict)or
style_dict = {'displaycolor': {'h': '#FA74A6'}} circuit.draw('mpl', style=style_dict) -
Se añaden dos contextos de alineación al generador de impulsos (
qiskit.pulse.builder) para facilitar la escritura de una secuencia de pulsos repetida con retardos.qiskit.pulse.builder.align_equispaced()inserta retardos de longitud equivalente entre las programaciones de impulsos dentro del contexto.qiskit.pulse.builder.align_func()ofrece un control más avanzado de la posición del pulso. Este contexto toma una llamada que calcula una coordenada fraccional del pulso i-ésimo y alinea los pulsos dentro del contexto. Esto facilita la codificación del desacoplamiento dinámico.
-
Se ha añadido un parámetro
rep_delaya la claseQasmQobjen la configuración de ejecución,QasmQobjConfig. Este parámetro se utiliza para indicar el tiempo entre ejecuciones del programa. Debe elegirse entre el rango de backend dado por elBackendConfigurationmétodorep_delay_range(). Si no se proporciona un valor, se utilizará el valor predeterminado de backend,qiskit.providers.models.BackendConfiguration.default_rep_delay.rep_delaysólo funcionará en backends que permitan un tiempo de repetición dinámico. Esto se puede comprobar con la propiedadBackendConfigurationpropiedaddynamic_reprate_enabled. -
El archivo
qobj_schema.jsonJSON Schema enqiskit.schemasse ha actualizado para incluir elrep_delaycomo una propiedad de configuración opcional para QASM Qobjs. -
El archivo
backend_configuration_schema.jsonJSON Schema enqiskit.schemasse ha actualizado para incluirdynamic_reprate_enabled,rep_delay_rangeydefault_rep_delaycomo propiedades opcionales para una carga útil de configuración de backend QASM. -
Se ha añadido un nuevo pase de optimización
qiskit.transpiler.passes.TemplateOptimizationse ha añadido al transpilador. Este paso aplica un algoritmo de comparación de plantillas descrito en arXiv:1909.05270 que sustituye todas las coincidencias máximas compatibles del circuito.Para implementar este nuevo pase de transpilador se añadió un nuevo módulo,
template_circuits, a la biblioteca de circuitos (qiskit.circuit.library). Este nuevo módulo contiene todas las plantillas de circuitos Toffoli utilizadas en la biblioteca de circuitosTemplateOptimization.Este nuevo pase no está incluido actualmente en los gestores de pases predefinidos (
qiskit.transpiler.preset_passmanagers), para utilizarlo tendrá que crear un pase personalizado de tipoPassManager. -
Se ha añadido una nueva versión de la interfaz de proveedores. Esta nueva interfaz, que puede encontrarse en
qiskit.providersproporciona un nuevo mecanismo de control de versiones que permitirá realizar cambios en la interfaz de forma compatible a lo largo del tiempo. La nueva interfaz debería facilitar la migración de los proveedores existentes, ya que es prácticamente idéntica salvo por el versionado explícito.Además de tener clases abstractas explícitamente versionadas, los cambios clave de la nueva interfaz son que el método
BackendV1métodorun()puede tomar ahora un objetoQuantumCircuitoScheduleen lugar de objetosQobj. Además, ahora las opciones forman parte de una clase de backend para que los usuarios puedan configurar las opciones en tiempo de ejecución cuando trabajan con un circuito. El último cambio es queqiskit.providers.JobV1ahora puede ser síncrono o asíncrono, la configuración exacta y el método para configurar esto depende del proveedor, pero hay puntos de enganche de interfaz para hacer explícito bajo qué modelo de ejecución se está ejecutando un trabajo en la clase abstractaJobV1. -
Se ha añadido un nuevo kwarg,
inplace, a la funciónqiskit.result.marginal_counts(). Este kwarg se utiliza para controlar si el contenido se margina en su lugar o se devuelve una nueva copia, paraResultentrada de objetos. Este parámetro no tiene ningún efecto para una entradadictuCountsobjeto. -
Se ha añadido una versión inicial de un compilador de funciones clásico,
qiskit.circuit.classicalfunction. Esto permite compilar funciones python tipadas (que de momento sólo operan con bits del tipoInt1) enQuantumCircuitobjetos. Por ejemplo:from qiskit.circuit import classical_function, Int1 @classical_function def grover_oracle(a: Int1, b: Int1, c: Int1, d: Int1) -> Int1: x = not a and b y = d and not c z = not x or y return z quantum_circuit = grover_oracle.synth() quantum_circuit.draw()El parámetro
registerless=Falseen el métodoqiskit.circuit.classicalfunction.ClassicalFunctionmétodosynth()crea un circuito con registros que hacen referencia a los nombres de los parámetros. Por ejemplo:quantum_circuit = grover_oracle.synth(registerless=False) quantum_circuit.draw()Una función clásica decorada puede utilizarse del mismo modo que cualquier otra puerta cuántica al añadirla a un circuito.
circuit = QuantumCircuit(5) circuit.append(grover_oracle, range(5)) circuit.draw()La puerta
GROVER_ORACLEse sintetiza cuando se requiere su descomposición.circuit.decompose().draw()Esta función requiere
tweedledum, una biblioteca para sintetizar circuitos cuánticos, que puede instalarse mediante pip conpip install tweedledum. -
Se ha añadido una nueva clase
qiskit.circuit.Delaypara representar una instrucción de retardo en un circuito. Un nuevo métododelay()para añadir fácilmente retardos a los circuitos. Esto permite describir experimentos sensibles a la temporización (por ejemplo, el experimento T1/T2 ) en el nivel de circuito.from qiskit import QuantumCircuit qc = QuantumCircuit(1, 1) qc.delay(500, 0, unit='ns') qc.measure(0, 0) qc.draw() -
Se ha añadido un nuevo argumento
scheduling_methodparaqiskit.compiler.transpile()se ha añadido. Es necesario cuando se transpilan circuitos con retardos. Si se especificascheduling_method, el transpilador devuelve un circuito programado tal que todos los tiempos muertos en él se rellenan con retardos (es decir, el tiempo de inicio de cada instrucción se determina de forma única). Esto permite ver el aspecto de las instrucciones programadas (puertas) en el nivel del circuito.from qiskit import QuantumCircuit, transpile from qiskit.test.mock.backends import FakeAthens qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) scheduled_circuit = transpile(qc, backend=FakeAthens(), scheduling_method="alap") print("Duration in dt:", scheduled_circuit.duration) scheduled_circuit.draw(idle_wires=False)Véase también
timeline_drawer()para una mejor visualización de los circuitos programados. -
También se ha añadido una nueva función
qiskit.compiler.sequence()para que podamos convertir un circuito programado en un circuitoSchedulepara hacerlo ejecutable en un backend habilitado para pulsos.from qiskit.compiler import sequence sched = sequence(scheduled_circuit, pulse_enabled_backend) -
El sitio
schedule()se ha actualizado para que pueda programar circuitos con retrasos. Ahora hay dos caminos para programar un circuito con retardo:qc = QuantumCircuit(1, 1) qc.h(0) qc.delay(500, 0, unit='ns') qc.h(0) qc.measure(0, 0) sched_path1 = schedule(qc.decompose(), backend) sched_path2 = sequence(transpile(qc, backend, scheduling_method='alap'), backend) assert pad(sched_path1) == sched_path2Consulte las notas de la versión y la documentación de
transpile()ysequence()para más detalles sobre la otra ruta. -
Se ha añadido el
GroverOperatora la biblioteca de circuitos (qiskit.circuit.library) para construir el operador Grover utilizado en el algoritmo de búsqueda de Grover y en la Amplificación/Estimación Cuántica de Amplitud. Provisto de un oráculo en forma de circuito,GroverOperatorcrea el operador Grover de libro de texto. Para generalizar esto para la amplificación de amplitud y utilizar un operador genérico en lugar de puertas Hadamard como preparación de estado, se puede utilizar el argumentostate_in. -
Los métodos
InstructionScheduleMapmétodosget()ypop()métodos toman ahoraParameterExpressioninstancias además de valores numéricos para los parámetros del generador de horarios. Si el generador es una función, las expresiones pueden vincularse antes o dentro de la llamada a la función. Si el generador es unParametrizedSchedule, las expresiones deben estar ligadas antes de que el propio programa sea ligado/llamado. -
Se ha añadido una nueva clase
LinearAmplitudeFunctiona la biblioteca de circuitos (qiskit.circuit.library) para asignar funciones lineales (a trozos) a las amplitudes de los qubits,
El mapeo se basa en una rotación Y de Pauli controlada y una aproximación de Taylor, como se describe en https://arxiv.org/abs/1806.06893. Este circuito puede utilizarse para calcular valores de expectativa de funciones lineales utilizando el algoritmo de estimación de amplitud cuántica.
-
El nuevo jupyter magic
monospaced_outputse ha añadido al móduloqiskit.tools.jupytermódulo. Esta magia establece la fuente de salida del cuaderno Jupyter en "Courier New", siempre que sea posible. Cuando se utiliza este fuentes devuelve dibujos de circuitos de texto que están mejor alineados.import qiskit.tools.jupyter %monospaced_output -
Se ha añadido un nuevo transpiler pass,
Optimize1qGatesDecomposition. Este pase de transpilador es una alternativa al existenteOptimize1qGatesque utiliza la claseOneQubitEulerDecomposerpara descomponer y simplificar una cadena de compuertas de un solo qubit. Este método es compatible con cualquier conjunto de bases, mientras queOptimize1qGatessólo funciona para u1, u2, y u3. Los gestores de pases por defecto paraoptimization_level1, 2 y 3 se han actualizado para utilizar este nuevo pase si el conjunto de bases no incluye u1, u2 o u3. -
El sitio
OneQubitEulerDecomposeradmite ahora dos nuevas bases,'PSX'y'U'. Se pueden especificar con el kwargbasisen el constructor. Esto descompondrá la matriz en un circuito utilizandoPGateySXGatepara'PSX', yUGatepara'U'. -
Se ha añadido un nuevo método
remove()a la claseqiskit.transpiler.PassManagerclase. Este método permite eliminar un pase de unaPassManagerinstancia. Funciona sobre índices, de forma similar areplace(). Por ejemplo, para eliminar elRemoveResetInZeroStatedel gestor de pases utilizado en el nivel de optimización 1:from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.transpiler.passmanager_config import PassManagerConfig pm = level_1_pass_manager(PassManagerConfig()) pm.draw()[0] FlowLinear: UnrollCustomDefinitions, BasisTranslator [1] FlowLinear: RemoveResetInZeroState [2] DoWhile: Depth, FixedPoint, Optimize1qGates, CXCancellationEl escenario
[1]conRemoveResetInZeroStatese puede quitar así:pass_manager.remove(1) pass_manager.draw()[0] FlowLinear: UnrollCustomDefinitions, BasisTranslator [1] DoWhile: Depth, FixedPoint, Optimize1qGates, CXCancellation -
UniformDistributionNormalDistributionLogNormalDistributionSe añadieron a la biblioteca de circuitos (qiskit.circuit.library). Las distribuciones normal y log-normal soportan distribuciones univariantes y multivariantes. Estos circuitos son fundamentales para aplicaciones en finanzas en las que se utiliza la estimación cuántica de amplitud. -
Se ha añadido a la clase
QuantumCircuitclase. Esto permiteQuantumCircuitanular (para compuertas básicas) o especificar (para compuertas estándar y personalizadas) una definición de una operación en términos de señales ordenadas en el tiempo a través de canales de hardwareGateen términos de señales ordenadas en el tiempo a través de canales de hardware. En otras palabras, permite la opción de proporcionar calibraciones de puerta personalizadas a nivel de pulso.Los circuitos se construyen exactamente igual que antes. Por ejemplo:
from qiskit import pulse from qiskit.circuit import QuantumCircuit, Gate class RxGate(Gate): def __init__(self, theta): super().__init__('rxtheta', 1, [theta]) circ = QuantumCircuit(1) circ.h(0) circ.append(RxGate(3.14), [0])A continuación, se puede registrar la calibración de la puerta mediante el método
QuantumCircuitmétodoadd_calibration()que toma unaScheduleasí como los qubits y parámetros para los que se define:# Define the gate implementation as a schedule with pulse.build() as custom_h_schedule: pulse.play(pulse.library.Drag(...), pulse.DriveChannel(0)) with pulse.build() as q1_x180: pulse.play(pulse.library.Gaussian(...), pulse.DriveChannel(1)) # Register the schedule to the gate circ.add_calibration('h', [0], custom_h_schedule) # or gate.name string to register circ.add_calibration(RxGate(3.14), [0], q1_x180) # Can accept gateAnteriormente, esta funcionalidad sólo podía utilizarse a través de Programaciones de Pulso completas. Además, ahora los circuitos pueden enviarse a los backends con sus definiciones personalizadas (dependiendo de la compatibilidad del backend).
Los circuitos con puertas de impulsos todavía se pueden bajar a un
Scheduleutilizando la funciónschedule()funciónLa puerta calibrada también se puede transpilar utilizando el proceso de transpilación habitual:
transpiled_circuit = transpile(circ, backend)El circuito transpilado dejará las compuertas calibradas en el mismo qubit que el circuito original y no las desenrollará a las compuertas base.
-
Se ha añadido soporte para el desmontaje de
PulseQobjse ha añadido a la funciónqiskit.assembler.disassemble()función Por ejemplo:from qiskit import pulse from qiskit.assembler.disassemble import disassemble from qiskit.compiler.assemble import assemble from qiskit.test.mock import FakeOpenPulse2Q backend = FakeOpenPulse2Q() d0 = pulse.DriveChannel(0) d1 = pulse.DriveChannel(1) with pulse.build(backend) as sched: with pulse.align_right(): pulse.play(pulse.library.Constant(10, 1.0), d0) pulse.shift_phase(3.11, d0) pulse.measure_all() qobj = assemble(sched, backend=backend, shots=512) scheds, run_config, header = disassemble(qobj) -
Un nuevo kwarg,
coord_typeha sido añadido aqiskit.visualization.plot_bloch_vector(). Este kwarg permite cambiar el sistema de coordenadas utilizado para el parámetro de entrada que describe el posicionamiento del vector en la esfera de Bloch en la visualización generada. Hay 2 valores admitidos para este nuevo kwarg,'cartesian'(el valor por defecto) y'spherical'. Si el kwargcoord_typese establece en'spherical'la lista de parámetros que se toman son de la forma[r, theta, phi]donderes el radio,thetaes la inclinación desde la dirección +z, yphies el acimut desde la dirección +x. Por ejemplo:from numpy import pi from qiskit.visualization import plot_bloch_vector x = 0 y = 0 z = 1 r = 1 theta = pi phi = 0 # Cartesian coordinates, where (x,y,z) are cartesian coordinates # for bloch vector plot_bloch_vector([x,y,z])plot_bloch_vector([x,y,z], coord_type="cartesian") # Same as line above# Spherical coordinates, where (r,theta,phi) are spherical coordinates # for bloch vector plot_bloch_vector([r, theta, phi], coord_type="spherical") -
Pulso
Scheduleadmiten ahora el uso de objetosParameterExpressionpara los parámetros.Por ejemplo:
from qiskit.circuit import Parameter from qiskit import pulse alpha = Parameter('⍺') phi = Parameter('ϕ') qubit = Parameter('q') amp = Parameter('amp') schedule = pulse.Schedule() schedule += SetFrequency(alpha, DriveChannel(qubit)) schedule += ShiftPhase(phi, DriveChannel(qubit)) schedule += Play(Gaussian(duration=128, sigma=4, amp=amp), DriveChannel(qubit)) schedule += ShiftPhase(-phi, DriveChannel(qubit))La asignación de parámetros se realiza mediante el método
assign_parameters()método:schedule.assign_parameters({alpha: 4.5e9, phi: 1.57, qubit: 0, amp: 0.2})Las expresiones y la asignación parcial también funcionan, como por ejemplo:
beta = Parameter('b') schedule += SetFrequency(alpha + beta, DriveChannel(0)) schedule.assign_parameters({alpha: 4.5e9}) schedule.assign_parameters({beta: phi / 6.28}) -
Se ha añadido una nueva función de visualización
timeline_drawer()al móduloqiskit.visualizationmódulo.Por ejemplo:
from qiskit.visualization import timeline_drawer from qiskit import QuantumCircuit, transpile from qiskit.test.mock import FakeAthens qc = QuantumCircuit(2) qc.h(0) qc.cx(0,1) timeline_drawer(transpile(qc, FakeAthens(), scheduling_method='alap'))
Notas de actualización
-
Se ha modificado la comprobación de tipo para el kwarg
paramsdel constructor de la claseGatey sus subclases. Antes, todos losGateparámetros tenían que estar en un conjunto de tipos permitidos definidos en laInstructionclase. Ahora un nuevo métodovalidate_parameter()se utiliza para determinar si un tipo de parámetro es válido o no. La definición de este método en una subclase tendrá prioridad sobre su padre. Por ejemplo,UnitaryGateacepta un parámetro del tiponumpy.ndarrayy define un método personalizadovalidate_parameter()que devuelve el parámetro si es unnumpy.ndarray. Tiene prioridad sobre la función definida en su clase padreGate. SiUnitaryGatese utilizara como padre para una nueva clase, se utilizaría este métodovalidate_parametera menos que la nueva clase hija defina su propio método. -
Se han eliminado los métodos, argumentos y propiedades anteriormente obsoletos denominados
n_qubitsynumberofqubits. Se eliminaron en la versión 0.13.0. El conjunto completo de cambios son:ClaseAnteriorNuevoQuantumCircuitn_qubitsnum_qubitsPaulinumberofqubitsnum_qubitsFunciónViejo argumentoNuevo argumentoqiskit.circuit.random.random_circuit()n_qubitsnum_qubitsqiskit.circuit.library.MSGaten_qubitsnum_qubits -
Insertar una instancia
Gateen un circuitoQuantumCircuitcrea ahora una copia de esa puerta que se utiliza en el circuito. Si se realizan cambios en la instancia insertada en el circuito, ya no se reflejarán en la puerta del circuito. Este cambio se ha realizado para solucionar un problema al insertar un único objeto parametrizadoGateen varios circuitos. -
La función
qiskit.result.marginal_counts()ahora, por defecto, no modifica el parámetroqiskit.result.Resultparámetro de instancia. Anteriormente, el objetoResultse modificaba siempre in situ. Se ha añadido un nuevo kwarginplacemarginal_counts()que permite utilizar el comportamiento anterior cuandoinplace=Trueestá configurado. -
La definición de
U3Gatedefinición se ha cambiado para que sea en términos de la claseUGateclase. La claseUGateno tiene definición. Por tanto, ya no es posible desenrollar cada circuito en términos de U3 y CX. En cambio, U y CX pueden utilizarse para cada circuito. -
Se ha eliminado el soporte obsoleto para ejecutar Qiskit Terra con Python 3.5. Para utilizar Qiskit Terra a partir de esta versión necesitarás utilizar al menos Python 3.6. Si utiliza Python 3.5 la última versión que funcionará es Qiskit Terra 0.15.2.
-
En los
PulseBackendConfigurationen los atributoshamiltonianel campovarsse devuelve ahora en una unidad de Hz en lugar de la utilizada anteriormente de GHz. Este cambio se ha realizado para mantener la coherencia con las unidades utilizadas con los demás atributos de la clase. -
Se ha eliminado el soporte anteriormente obsoleto para pasar un diccionario como primer argumento posicional al constructor
DAGNodese ha eliminado. El uso de un diccionario para el primer argumento posicional quedó obsoleto en la versión 0.13.0. Para crear un objetoDAGNodedebes pasar directamente los atributos como kwargs en el constructor. -
Los argumentos de palabra clave para los métodos de puerta de circuito (por ejemplo:
qiskit.circuit.QuantumCircuit.cx)q,ctl*, ytgt*, que quedaron obsoletos en la versión 0.12.0, han sido eliminados. En su lugar, sóloqubit,control_qubit*ytarget_qubit*pueden utilizarse como argumentos con nombre para estos métodos. -
Se ha eliminado el módulo anteriormente obsoleto
qiskit.extensions.standard. Este módulo está obsoleto desde la versión 0.14.0. En su lugar, puede utilizarseqiskit.circuit.librarypuede utilizarse en su lugar. Además, todas las clases de puerta que estaban antes enqiskit.extensions.standardsiguen siendo importables desdeqiskit.extensions. -
Se han eliminado las puertas anteriormente obsoletas del módulo
qiskit.extensions.quantum_initializer:DiagGate, UCG`,UCPauliRotGate,UCRot,UCRXGate,UCX,UCRYGate,UCY,UCRZGate,UCZ. Todos ellos quedaron obsoletos en la versión 0.14.0 y tienen alternativas disponibles en la biblioteca de circuitos (qiskit.circuit.library). -
El método
qiskit.circuit.QuantumCircuitiden()ha sido eliminado. Esta opción quedó obsoleta en la versión 0.13.0 yi()oid()en su lugar.
Notas sobre características en desuso
-
El uso de un
numpy.ndarraypara un parámetro en el kwargparamspara el constructor de laGatey subclases ha quedado obsoleto y se eliminará en futuras versiones. Esto se hizo como parte de la refactorización de cómo se maneja la comprobación de tipoparmspara la claseGateclase. Si tiene una clase de puerta personalizada que es una subclase deGatedirectamente (o a través de un padre diferente en la jerarquía) que acepta un parámetrondarray, debe definir un método personalizadovalidate_parameter()para tu clase que devuelva el tipo de parámetro permitido. Por ejemplo:def validate_parameter(self, parameter): """Custom gate parameter has to be an ndarray.""" if isinstance(parameter, numpy.ndarray): return parameter else: raise CircuitError("invalid param type {0} in gate " "{1}".format(type(parameter), self.name)) -
La propiedad
num_ancilla_qubitspropiedad delPiecewiseLinearPauliRotationsyPolynomialPauliRotationsha quedado obsoleta y se eliminará en una futura versión. En su lugar debe utilizarse la propiedadnum_ancillasdebe utilizarse en su lugar. Esto se hizo para que fuera coherente con elQuantumCircuitmétodonum_ancillas(). -
La clase
qiskit.circuit.library.MSGateha quedado obsoleta, pero seguirá existiendo para permitir la carga de trabajos antiguos. Se ha sustituido por la claseqiskit.circuit.library.GMSque debe utilizarse en su lugar. -
El pase de transpilador
MSBasisDecomposerha quedado obsoleto y se eliminará en una futura versión. En su lugar, se puede utilizarqiskit.transpiler.passes.BasisTranslatorpuede utilizarse en su lugar. -
Los métodos
QuantumCircuitu1,u2yu3han quedado obsoletos. En su lugar, pueden utilizarse los siguientes sustitutos.u1(theta) = p(theta) = u(0, 0, theta) u2(phi, lam) = u(pi/2, phi, lam) = p(pi/2 + phi) sx p(pi/2 lam) u3(theta, phi, lam) = u(theta, phi, lam) = p(phi + pi) sx p(theta + pi) sx p(lam)Las propias clases de puerta,
U1Gate,U2GateyU3Gatepara permitir la carga de trabajos antiguos.
Corrección de errores
- Los métodos de la clase
Resultmétodos de la clasedata(),get_memory(),get_counts(),get_unitary(), yget_statevector ` will now emit a warning when the ``experiment`()kwarg se especifica para intentar obtener resultados utilizando unQuantumCircuitoSchedulecuando el objetoResultcontiene más de una entrada que coincide con el nombre de la instancia. Tenga en cuenta que sólo se devolverá la primera entrada que coincida con este nombre. Correcciones #3207 - El método
qiskit.circuit.QuantumCircuitmétodoappend()puede utilizarse ahora para insertar una instancia de puerta parametrizada en múltiples circuitos. Esto soluciona un problema anterior en el que la inserción de un único objeto parametrizadoGateen varios circuitos provocaba fallos cuando un circuito tenía un parámetro asignado. Correcciones #4697 - Anteriormente, la función
qiskit.execute.execute()no permitía especificar al mismo tiempo los kwargsbackendypass_manager. Esto se ha corregido para que tantobackendcomopass_managerpuedan utilizarse conjuntamente en las llamadas aexecute(). Correcciones #5037 - El método
QuantumCircuitmétodounitary()se ha corregido para que acepte un único número entero como argumento deqarg(cuando se añade un unitario de 1 qubit). Los tipos permitidos para el argumentoqargsson ahoraint,Qubito una lista de enteros. Correcciones #4944 - Anteriormente, la llamada a
inverse()en un objetoBlueprintCircuitpodía fallar si su propiedad de datos interna aún no estaba rellenada. Esto se ha corregido para que la llamada ainverse()rellene los datos internos antes de generar la inversa del circuito. Correcciones #5140 - Se ha corregido un problema al crear un
qiskit.result.Countsa partir de un diccionario de datos vacío. Esto creará un objetoCountsvacío. El métodomost_frequent()también se actualiza para lanzar una excepción más descriptiva cuando el objeto está vacío. Correcciones #5017 - Corrige un error por el que la configuración de
ctrl_statede unUnitaryGatese aplicaba dos veces; una vez en la creación de la matriz para el unitario controlado y otra vez al llamar al métododefinition()de la claseqiskit.circuit.ControlledGateclase. Esto daría la impresión de que la configuración dectrl_stateno tiene ningún efecto. - Anteriormente, el
ControlledGatemétodoinverse()no conservaba el parámetroctrl_stateen algunos casos. Esto se ha corregido para que al llamar ainverse()conservará el valorctrl_stateen su salida. - Corregido un error en el backend de salida
mpldel cajón de circuitosqiskit.circuit.QuantumCircuit.draw()yqiskit.visualization.circuit_drawer()que provocaba el fallo del cajón si el kwarg destylese establecía en una cadena. El comportamiento correcto sería tratar esa cadena como una ruta a un archivo JSON que contiene la hoja de estilo para la visualización. Esto se ha corregido, y aparecen advertencias si no se puede cargar el archivo JSON de la hoja de estilo. - Se ha corregido un error que se producía al cargar un archivo QASM mediante
from_qasm_file()ofrom_qasm_str()fallaba si una puertau,phase(p),sx, osxdgestaba presente en el archivo QASM. Correcciones #5156 - Se ha corregido un error que podía provocar la asignación incorrecta de registros al desenrollar/descomponer una puerta definida con una sola operación de 2 qubits.
Aer 0.7.0
Preludio
Esta versión de 0.7.0 incluye numerosas mejoras de rendimiento y mejoras significativas de la interfaz del simulador, y abandona la compatibilidad con Python 3.5. Los principales cambios en la interfaz son los backends de simulador configurables y la construcción de simuladores preconfigurados a partir de backends IBMQ. También se ha ampliado la compatibilidad con el modelo de ruido y las puertas base para la mayoría de las puertas estándar de la biblioteca de circuitos Qiskit, incluida la compatibilidad con puertas de rotación de 1 y 2 qubits. Las mejoras de rendimiento incluyen la incorporación de soporte SIMD a los métodos de simulación de matrices de densidad y unitarios, la reducción de la memoria utilizada y la mejora del rendimiento de los circuitos que utilizan instantáneas de vectores de estado y matrices de densidad, y la incorporación de soporte para instrucciones Kraus a la optimización de circuitos de fusión de puertas para mejorar enormemente el rendimiento de las simulaciones de vectores de estado ruidosos.
Nuevas funciones
-
Añade soporte de puerta base para la instrucción
qiskit.circuit.Delaya las instruccionesStatevectorSimulator,UnitarySimulator, yQasmSimulator. Tenga en cuenta que esta puerta se trata como una puerta de identidad durante la simulación y el parámetro de longitud de retardo se ignora. -
Añade soporte de puerta base para la puerta single-qubit
qiskit.circuit.library.UGatea los métodosStatevectorSimulator,UnitarySimulator, y"statevector","density_matrix","matrix_product_state", y"extended_stabilizer"deQasmSimulator. -
Añade soporte de puerta base para la puerta de fase
qiskit.circuit.library.PhaseGatea los métodosStatevectorSimulator,StatevectorSimulator,UnitarySimulator, y"statevector","density_matrix","matrix_product_state", y"extended_stabilizer"deQasmSimulator. -
Añade soporte de puerta base para la puerta de fase controlada
qiskit.circuit.library.CPhaseGatea los métodosStatevectorSimulator,StatevectorSimulator,UnitarySimulator, y"statevector","density_matrix", y"matrix_product_state"deQasmSimulator. -
Añade soporte para la puerta de fase multicontrolada
qiskit.circuit.library.MCPhaseGatea los métodosStatevectorSimulator,UnitarySimulator, y"statevector"delQasmSimulator. -
Añade soporte para la puerta
qiskit.circuit.library.SXGateaStatevectorSimulator,UnitarySimulator, yQasmSimulator. -
Añade soporte para puertas de rotación de la biblioteca de circuitos Qiskit de 1 y 2 qubits
RXGate,RYGate,RZGate,RGate,RXXGate,RYYGate,RZZGate,RZXGatea los métodosStatevectorSimulator,UnitarySimulator, y"statevector"y"density_matrix"delQasmSimulator. -
Añade compatibilidad con las puertas de rotación multicontroladas
"mcr","mcrx","mcry","mcrz"al métodoStatevectorSimulator,UnitarySimulator, y al método"statevector"deQasmSimulator. -
Hacer configurables los backends del simulador. Esto permite establecer opciones persistentes como el método de simulación y el modelo de ruido para cada objeto backend del simulador.
QasmSimulatoryPulseSimulatortambién pueden configurarse desde un objeto backendIBMQBackendutilizando el método :meth:`~qiskit.providers.aer.QasmSimulator.from_backend. ParaQasmSimulator, esto configurará el mapa de acoplamiento, las puertas base y el modelo básico de ruido del dispositivo basándose en la configuración y las propiedades del backend. EnPulseSimulator, el modelo y los valores predeterminados del sistema se configurarán automáticamente a partir de la configuración, las propiedades y los valores predeterminados del backend.Por ejemplo, un backend simulador de matriz de densidad ruidosa puede construirse como
QasmSimulator(method='density_matrix', noise_model=noise_model), o un simulador de estado producto de matriz ideal comoQasmSimulator(method='matrix_product_state').Una ventaja es que una instancia de
PulseSimulatorconfigurada a partir de un backend sirve mejor como sustituto del backend original, lo que facilita el intercambio entre un simulador y un backend real, por ejemplo, cuando se prueba código en un simulador antes de utilizar un backend real. Por ejemplo, en el siguiente bloque de código,PulseSimulatorse instanciará desde el backendFakeArmonk(). Todos los datos de configuración y por defecto se copian en la instancia del simulador, por lo que cuando se pasa como argumento aassemble, se comporta como si se hubiera suministrado el backend original (por ejemplo, los valores por defecto deFakeArmonkestarán presentes y serán utilizados porassemble).armonk_sim = qiskit.providers.aer.PulseSimulator.from_backend(FakeArmonk()) pulse_qobj = assemble(schedules, backend=armonk_sim) armonk_sim.run(pulse_qobj)Aunque el ejemplo anterior es pequeño, el comportamiento demostrado de "sustitución directa" debería mejorar enormemente la usabilidad en flujos de trabajo más complicados, por ejemplo, cuando los experimentos de calibración se construyen utilizando atributos de backend.
-
Añade soporte para la fase global qobj a los métodos
StatevectorSimulator,UnitarySimulator, y statevector delQasmSimulator. -
Mejora el rendimiento general de la simulación de vectores de estado ruidosos añadiendo un método Kraus a la optimización del circuito de fusión de puertas que permite aplicar la fusión de puertas a simulaciones de vectores de estado ruidosos con ruido Kraus general.
-
Utiliza la semántica de movimiento para las instantáneas del vector de estado y de la matriz de densidad para los métodos "vector_estado" y "matriz_densidad" de
QasmSimulatorsi son la instrucción final de un circuito. Esto reduce el uso de memoria del simulador mejora el rendimiento al evitar copiar un array grande en los resultados. -
Añade soporte para errores generales de la puerta Kraus
QauntumErroren el métodoNoiseModelal"matrix_product_state"delQasmSimulator. -
Añade soporte para la instrucción de instantánea de matriz de densidad
qiskit.providers.aer.extensions.SnapshotDensityMatrixal método"matrix_product_state"delQasmSimulator. -
Amplía la vectorización SIMD del método de simulación de vectores de estado a los métodos de simulación de matrices unitarias, matrices de superoperadores y matrices de densidad. Esto supone apenas un aumento del rendimiento 2x simulación general utilizando el
UnitarySimulator, el método"density_matrix"delQasmSimulator, la fusión de puertas y la simulación de ruido. -
Añade una clase vectorial personalizada al código C++ que tiene una mejor integración con Pybind11. Esto reduce los requisitos de memoria de
StatevectorSimulatoral evitar una copia de memoria durante la vinculación a Python del estado final del simulador.
Notas de actualización
-
El REA utiliza ahora Lapack para realizar algunos cálculos relacionados con matrices. Utiliza la biblioteca Lapack incluida en OpenBlas (ya disponible en Linux y en las dsitribuciones típicas de Macos OpenBlas; la versión para Windows se distribuye con AER) o con el framework accelerate de MacOS.
-
Se ha eliminado el soporte obsoleto para ejecutar qiskit-aer con Python 3.5. Para utilizar qiskit-aer >= 0.7.0 ahora necesitarás al menos Python 3.6. Si está utilizando Python 3.5 la última versión que funcionará es qiskit-aer 0.6.x.
-
Actualiza los umbrales por defecto de la fusión de puertas para que ésta se aplique a circuitos con más de 14 qubits para simulaciones de vectores de estado en
StatevectorSimulatoryQasmSimulator.Para el método
"density_matrix"delQasmSimulatory para la fusión de puertasUnitarySimulatorse aplicará a circuitos con más de 7 qubits.Los valores de umbral qubit personalizados pueden establecerse utilizando la opción
fusion_thresholdbackend es decirbackend.set_options(fusion_threshold=10) -
Cambia la opción
fusion_thresholdbackend para aplicar la fusión cuando el número de qubits está por encima del umbral, no igual o por encima del umbral, para coincidir con el comportamiento del parámetro OpenMP qubit threshold.
Notas sobre características en desuso
qiskit.providers.aer.noise.NoiseModel.set_x90_single_qubit_gates()ha quedado obsoleto, ya que el transpilador qiskit ha añadido el desenrollado a puertas base personalizadas. La forma correcta de utilizar un modelo de ruido basado en X90 es definir el ruido en la puerta Sqrt(X)"sx"o"rx"y una de las puertas de fase single-qubit"u1","rx", o"p"en el modelo de ruido.- El kwarg
variancede las instrucciones Snapshot ha quedado obsoleto. Esta función calculaba la varianza de la muestra en la instantánea debida al muestreo del modelo de ruido, no la varianza debida a las estadísticas de medición, por lo que a menudo se utilizaba incorrectamente. Si es necesario modelar la varianza del ruido, deben utilizarse instantáneas de un solo disparo para que la varianza pueda calcularse manualmente en el postprocesado.
Corrección de errores
- Se corrige un error en
StatevectorSimulatorque provocaba que se ejecutara siempre como CPU con doble precisión sin soporte de SIMD/AVX2 incluso en sistemas con AVX2, o cuando se especificaba precisión única o el método GPU en las opciones del backend. - Se corrigen algunos bucles for en código C++ que iteraban sobre copias en lugar de referencias de elementos contenedores.
- Corrige un error por el que los datos de las instantáneas siempre se copiaban de C++ a Python en lugar de moverse cuando era posible. Esto reducirá a la mitad el uso de memoria y mejorará el tiempo de simulación cuando se utilicen grandes instantáneas de vectores de estado o matrices de densidad.
- Corregir State::snapshot_pauli_expval para que devuelva el valor correcto de la expectativa Y en el simulador del estabilizador. Consulte el número 895 de <https://github.com/Qiskit/qiskit-aer/issues/895> para obtener más información.
- Las envolturas controller_execute se han ajustado para que sean functores (objetos) en lugar de funciones libres. Entre otras cosas, esto permite utilizarlos en las llamadas a multiprocessing.pool.map.
- Añade comprobaciones de memoria disponible faltante para
StatevectorSimulatoryUnitarySimulator. Esto lanza una excepción si la memoria requerida para simular el número de qubits en un circuito excede la memoria disponible del sistema.
Ignis 0.5.0
Preludio
Esta versión incluye un nuevo módulo para mitigar los errores de medición del valor de expectativa, una función mejorada de trazado de gráficos para experimentos de volumen cuántico, varias correcciones de errores y compatibilidad con Python 3.5.
Nuevas funciones
-
La función
qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()permite una entrada opcional de objetos de puerta como interleaved_elem. Además, la clase CNOT-Dihedralqiskit.ignis.verification.randomized_benchmarking.CNOTDihedraltiene un nuevo método to_instruction, y el método from_circuit existente tiene una entrada opcional de una Instrucción (además de QuantumCircuit ). -
El sitio
qiskit.ignis.verification.randomized_benchmarking.CNOTDihedralcontiene ahora las siguientes novedades. Inicialización a partir de varios tipos de objetos: CNOTDihedral, ScalarOp, QuantumCircuit, Instrucción y Pauli. Conversión a una matriz utilizando to\matrix y a un operador utilizando to\operator. Métodos de producto tensorial tensor y expandir. Cálculo del adjunto, conjugado y transpuesto utilizando los métodos de conjugado, conjugado y transpuesto. Verificar que un elemento es CNOTDiédrico utilizando el método is_cnotdihedral. El método de descomposición to\circuit de un elemento CNOTDihedral en un circuito se amplió para permitir cualquier número de qubits, basándose en la función decompose\cnotdihedral\general. -
Añade la mitigación del error de medición del valor de expectativa al módulo de mitigación. Esto permite utilizar la matriz de asignación completa de N-qubit, la matriz de asignación tensada de un solo qubit o la mitigación de errores de medición del proceso de Markov de tiempo continuo (CTMP) [1] al calcular los valores de expectativa de los operadores diagonales a partir de diccionarios de recuentos. Los valores esperados se calculan utilizando la función
qiskit.ignis.mitigation.expectation_value().Los circuitos de calibración para calibrar un mitigador de errores de medición se generan utilizando la función
qiskit.ignis.mitigation.expval_meas_mitigator_circuits(), y el resultado se ajusta utilizando la claseqiskit.ignis.mitigation.ExpvalMeasMitigatorFitter. El ajustador devuelve un objeto mitigador que puede suministrarse como argumento a la funciónexpectation_value()para aplicar la mitigación.[1] S. Bravyi, S. Sheldon, A. Kandala, D. C. Mckay, J. M. Gambetta,
Mitigating measurement errors in multi-qubit experiments, arXiv:2006.14044 [quant-ph].
Ejemplo:
El siguiente ejemplo muestra la calibración de un mitigador de errores de medición del valor de expectativa de 5 qubits utilizando el método
'tensored'.from qiskit import execute from qiskit.test.mock import FakeVigo import qiskit.ignis.mitigation as mit backend = FakeVigo() num_qubits = backend.configuration().num_qubits # Generate calibration circuits circuits, metadata = mit.expval_meas_mitigator_circuits( num_qubits, method='tensored') result = execute(circuits, backend, shots=8192).result() # Fit mitigator mitigator = mit.ExpvalMeasMitigatorFitter(result, metadata).fit() # Plot fitted N-qubit assignment matrix mitigator.plot_assignment_matrix()A continuación se muestra cómo utilizar el mitigador anterior para aplicar la mitigación del error de medición a los cálculos del valor de expectativa
from qiskit import QuantumCircuit # Test Circuit with expectation value -1. qc = QuantumCircuit(num_qubits) qc.x(range(num_qubits)) qc.measure_all() # Execute shots = 8192 seed_simulator = 1999 result = execute(qc, backend, shots=8192, seed_simulator=1999).result() counts = result.get_counts(0) # Expectation value of Z^N without mitigation expval_nomit, error_nomit = mit.expectation_value(counts) print('Expval (no mitigation): {:.2f} \u00B1 {:.2f}'.format( expval_nomit, error_nomit)) # Expectation value of Z^N with mitigation expval_mit, error_mit = mit.expectation_value(counts, meas_mitigator=mitigator) print('Expval (with mitigation): {:.2f} \u00B1 {:.2f}'.format( expval_mit, error_mit)) -
Añade Numba como dependencia opcional. Numba se utiliza para aumentar significativamente el rendimiento de la clase
qiskit.ignis.mitigation.CTMPExpvalMeasMitigatorutilizada para mitigar el error de medición del valor de expectativa con el método CTMP. -
Añade dos métodos a
qiskit.ignis.verification.quantum_volume.QVFitter.qiskit.ignis.verification.quantum_volume.QVFitter.calc_z_value()calcular el valor z en una distribución normal estándar utilizando la media y la desviación estándar sigma. Si sigma = 0, emite una advertencia y asigna un valor pequeño ( 1e-10 ) a sigma para que el código siga ejecutándose.qiskit.ignis.verification.quantum_volume.QVFitter.calc_confidence_level()para calcular el nivel de confianza mediante el valor z.
-
Guarde el nivel de confianza incluso cuando hmean < 2/3 en
qiskit.ignis.verification.quantum_volume.QVFitter.qv_success(). -
Añada explicaciones sobre cómo calcular estadísticas basadas en la distribución binomial en
qiskit.ignis.verification.quantum_volume.QVFitter.calc_statistics(). -
El método
qiskit.ignis.verification.QVFitterplot_qv_data()ha sido actualizado para devolver un objetomatplotlib.Figure. Antes no devolvía nada. Al devolver una figura, se facilita la integración de las visualizaciones en un flujo de trabajo más ampliomatplotlib. -
Las barras de error de la figura elaborada con el método
qiskit.ignis.verification.QVFitterqiskit.ignis.verification.QVFitter.plot_qv_data()se han actualizado para representar intervalos de confianza de dos sigmas. Anteriormente, las barras de error representan intervalos de confianza de un sigma. El criterio de éxito de la evaluación comparativa de Quantum Volume requiere una probabilidad de salida pesada > 2/3 con una confianza unilateral de dos sigmas ( ~97.7 %). Cambiar las barras de error para representar intervalos de confianza de dos sigmas permite identificar fácilmente el éxito en la figura. -
Se ha añadido un nuevo kwarg,
figsizeal métodoqiskit.ignis.verification.QVFitterqiskit.ignis.verification.QVFitter.plot_qv_data(). Este kwarg toma una tupla de la forma(x, y)dondexyyson la dimensión en pulgadas para hacer el gráfico generado. -
Se ha añadido el método
qiskit.ignis.verification.quantum_volume.QVFitter.plot_hop_accumulative()para trazar la probabilidad de salida pesada (HOP) frente al número de ensayos de forma similar a la Figura 2a del documento Quantum Volume 64 ( arXiv:2008.08571 ). Las HOP de los ensayos individuales se representan como dispersiones y las HOP acumuladas se representan en línea roja. Los intervalos de confianza de dos sigmas se representan como áreas sombreadas y el umbral de éxito de 2/3 se representa como línea discontinua. -
Se ha añadido el método
qiskit.ignis.verification.quantum_volume.QVFitter.plot_qv_trial()para trazar ensayos individuales, aprovechando elqiskit.visualization.plot_histogram()de Qiskit Terra. Los recuentos de cadenas de bits se representan como histogramas superpuestos para los valores ideales (hueco) y experimentales (relleno). La probabilidad de salida pesada experimental se muestra en la leyenda. La mediana de probabilidad se representa con una línea discontinua roja.
Notas de actualización
- Se ha eliminado el soporte obsoleto para ejecutar qiskit-ignis con Python 3.5. Para utilizar qiskit-ignis >= 0.5.0 ahora necesitarás al menos Python 3.6. Si utilizas Python 3.5 la última versión que funcionará es qiskit-ignis 0.4.x.
Corrección de errores
- Corrección de un error en la clase
qiskit.ignis.verification.randomized_benchmarking.CNOTDihedralpara elementos con más de 5 quits. - Fije el umbral de nivel de confianza para
qiskit.ignis.verification.quantum_volume.QVFitter.qv_success()en 0.977 correspondiente a z = 2, tal y como se define en el Algoritmo 1 del documento QV. - Corrección de un error en
qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()que provocaba que todos los subsistemas con el mismo tamaño en el rb_pattern dado tuvieran las mismas puertas cuando se daba un parámetro 'rand_seed' a la función.
Aqua 0.8.0
Preludio
Esta versión introduce una interfaz para ejecutar los métodos disponibles para los problemas bosónicos. En particular, hemos introducido una interfaz completa para realizar cálculos de estructuras vibrónicas.
Esta versión introduce una interfaz para el cálculo de estados excitados. Ahora es más fácil para el usuario crear un cálculo general de estados excitados. Este cálculo se basa en un Driver que proporciona la información relevante sobre la molécula, una Transformación que proporciona la información sobre el mapeo del problema en un Hamiltoniano qubit, y finalmente un Solver. El Solver es la forma específica en que se realiza el cálculo de los estados excitados (el algoritmo). Esta estructura sigue la de los cálculos del estado básico. Los resultados se modifican para tomar listas de valores de expectativas en lugar de uno solo. El QEOM y NumpyEigensolver se adaptan a la nueva estructura. Se introduce una fábrica para ejecutar un eigensolver numpy con un filtro específico (para apuntar a estados de simetrías específicas).
El cálculo de la expectativa VQE con Aer qasm_simulator ahora tiene por defecto un cálculo que tiene el comportamiento de ruido de disparo esperado.
Nuevas funciones
-
Se ha introducido una opción warm_start que debe utilizarse cuando el ajuste de otras opciones no ayuda. Cuando esta opción está activada, primero se resuelve un problema relajado (todas las variables son continuas) y la solución se utiliza para inicializar el estado del optimizador antes de que comience el proceso iterativo en el método de resolución.
-
Los algoritmos de estimación de la amplitud utilizan ahora los objetos
QuantumCircuitcomo entradas para especificar los operadores A y Q. Este cambio va acompañado de la introducción deGroverOperatoren la biblioteca de circuitos, que permite una construcción intuitiva y rápida de diferentes operadores Q. Por ejemplo, un experimento Bernoulli puede construirse ahora comoimport numpy as np from qiskit import QuantumCircuit from qiskit.aqua.algorithms import AmplitudeEstimation probability = 0.5 angle = 2 * np.sqrt(np.arcsin(probability)) a_operator = QuantumCircuit(1) a_operator.ry(angle, 0) # construct directly q_operator = QuantumCircuit(1) q_operator.ry(2 * angle, 0) # construct via Grover operator from qiskit.circuit.library import GroverOperator oracle = QuantumCircuit(1) oracle.z(0) # good state = the qubit is in state |1> q_operator = GroverOperator(oracle, state_preparation=a_operator) # use default construction in QAE q_operator = None ae = AmplitudeEstimation(a_operator, q_operator) -
Añadir la posibilidad de calcular valores de expectativa de Valor en Riesgo Condicional ( CVaR ).
Dada una observable diagonal H, que a menudo corresponde a la función objetivo de un problema de optimización, a menudo no estamos tan interesados en minimizar la energía media de nuestras medidas observadas. En este contexto, nos damos por satisfechos si al menos algunas de nuestras mediciones alcanzan una energía baja. (Nótese que no es el caso de los problemas de química).
Para ello, se podría considerar la posibilidad de utilizar la mejor muestra observada como función de coste durante la optimización variacional. El problema es que esto puede dar lugar a una superficie de optimización no lisa. Para resolver este problema, podemos suavizar la superficie de optimización utilizando no sólo la mejor muestra observada, sino promediando alguna fracción de las mejores muestras observadas. Esto es exactamente lo que consigue el estimador CVaR [1].
Sea un número real en que especifica la fracción de muestras mejor observadas que se utilizan para calcular la función objetivo. Obsérvese que si , CVaR es equivalente a un valor de expectativa estándar. Del mismo modo, si , entonces CVaR corresponde a utilizar la mejor muestra observada. Los valores intermedios de interpolan entre estas dos funciones objetivo.
La funcionalidad para utilizar CVaR se incluye en el flujo de operadores a través de una nueva subclase de OperatorStateFn denominada CVaRMeasurement. Este nuevo objeto StateFn se instancia de la misma manera que un OperatorMeasurement con la excepción de que también acepta un parámetro alfa y que automáticamente impone que el atributo is_measurement sea True. Obsérvese que no está claro qué representaría una CVaRStateFn si no fuera una medida.
Ejemplos:
qc = QuantumCircuit(1) qc.h(0) op = CVaRMeasurement(Z, alpha=0.5) @ CircuitStateFn(primitive=qc, coeff=1.0) result = op.eval()Del mismo modo, un operador correspondiente a un valor de expectativa estándar puede convertirse en una expectativa CVaR utilizando el convertidor CVaRExpectation.
Ejemplos:
qc = QuantumCircuit(1) qc.h(0) op = ~StateFn(Z) @ CircuitStateFn(primitive=qc, coeff=1.0) cvar_expecation = CVaRExpectation(alpha=0.1).convert(op) result = cvar_expecation.eval()Para más información sobre esta técnica y sus resultados empíricos, véase [el punto 1].
Referencias:
[1] : Barkoutsos, P. K., Nannicini, G., Robert, A., Tavernelli, I., y Woerner, S.,
"Mejora de la optimización variacional cuántica mediante CVaR” arXiv:1907.04769
-
Nueva interfaz
Eigensolverpara algoritmos Eigensolver. -
Se ha añadido al módulo de química una interfaz para el cálculo de estados excitados. Ahora es más fácil para el usuario crear un cálculo general de estados excitados. Este cálculo se basa en un
Driverque proporciona la información relevante sobre la molécula, unTransformationque proporciona la información sobre el mapeo del problema en un Hamiltoniano qubit, y finalmente un Solver. El Solver es la forma específica en que se realiza el cálculo de los estados excitados (el algoritmo). Esta estructura sigue la de los cálculos del estado básico. Los resultados se modifican para tomar listas de valores de expectativas en lugar de uno solo. Las páginasQEOMyNumpyEigensolverse adaptan a la nueva estructura. Se introduce una fábrica para ejecutar un eigensolver numpy con un filtro específico (para apuntar a estados de simetrías específicas). -
Además de los flujos de trabajo para la resolución de problemas fermiónicos, se han añadido interfaces para el cálculo de estados excitados y básicos bosónicos. En particular, hemos introducido una interfaz completa para realizar cálculos de estructuras vibrónicas.
-
Se ha añadido
OrbitalOptimizationVQEcomo nuevo solucionador del estado fundamental en el módulo de química. Este solver permite la optimización simultánea de los parámetros variacionales y de los orbitales de la molécula. El algoritmo se presenta en Sokolov et al., The Journal of Chemical Physics 152 (12). -
Se ha añadido un nuevo algoritmo: la superficie de energía potencial de Born Openheimer para el cálculo de la superficie de energía potencial a lo largo de diferentes grados de libertad de la molécula. El algoritmo se denomina
BOPESSampler. Además, ofrece funciones de ajuste de la superficie de energía potencial a una función analítica de potenciales predefinidos. -
Se ha añadido una comprobación de viabilidad de la solución obtenida a todos los optimizadores de la pila de optimización. Esto se ha implementado añadiendo dos nuevos métodos a
QuadraticProgram: *get_feasibility_info(self, x: Union[List[float], np.ndarray])acepta una matriz y devuelve si esta solución es factible y una lista de variables violadas (límites violados) y una lista de restricciones violadas. *is_feasible(self, x: Union[List[float], np.ndarray])acepta una matriz y devuelve si esta solución es factible o no. -
Añade versiones basadas en circuitos de
FixedIncomeExpectedValue,EuropeanCallDelta,GaussianConditionalIndependenceModelyEuropeanCallExpectedValueaqiskit.finance.applications. -
Marco de gradientes.
qiskit.operators.gradientsDado un operador que representa un estado cuántico resp. un valor de expectativa, el marco del gradiente permite la evaluación de gradientes, gradientes naturales, hessianos, así como la información cuántica de Fisher.Supongamos un estado cuántico parametrizado |ψ(θ)〉 = V(θ)|ψ〉 con estado de entrada |ψ〉 y Ansatz parametrizado V(θ), y un Operador O(ω).
Gradientes: Queremos calcular resp. resp. .
El último caso corresponde al gradiente w.r.t. las probabilidades de muestreo de |ψ(θ). Estos gradientes pueden calcularse con diferentes métodos, a saber, un desplazamiento de parámetros, una combinación lineal de unitarios y un método de diferencias finitas.
Ejemplos:
x = Parameter('x') ham = x * X a = Parameter('a') q = QuantumRegister(1) qc = QuantumCircuit(q) qc.h(q) qc.p(params[0], q[0]) op = ~StateFn(ham) @ CircuitStateFn(primitive=qc, coeff=1.) value_dict = {x: 0.1, a: np.pi / 4} ham_grad = Gradient(grad_method='param_shift').convert(operator=op, params=[x]) ham_grad.assign_parameters(value_dict).eval() state_grad = Gradient(grad_method='lin_comb').convert(operator=op, params=[a]) state_grad.assign_parameters(value_dict).eval() prob_grad = Gradient(grad_method='fin_diff').convert(operator=CircuitStateFn(primitive=qc, coeff=1.), params=[a]) prob_grad.assign_parameters(value_dict).eval()Hessianos: Queremos calcular resp. resp. resp. .
El último caso corresponde al hessiano w.r.t. las probabilidades de muestreo de |ψ(θ). Al igual que los gradientes de primer orden, los hessianos pueden evaluarse con distintos métodos, es decir, un desplazamiento de parámetros, una combinación lineal de unitarios y un método de diferencias finitas. Dada una tupla de parámetros
Hessian().convert(op, param_tuple)devuelve el valor de la derivada de segundo orden. Si se da una lista de parámetrosHessian().convert(op, param_list)devuelve el hessiano completo para todos los parámetros dados según el orden de parámetros dado.QFI: La información cuántica de Fisher QFI es un tensor métrico representativo de la capacidad de representación de un estado cuántico parametrizado |ψ(θ)〉 = V(θ)|ψ〉 generado por un estado de entrada |ψ〉 y un Ansatz parametrizado V(θ). Las entradas del QFI para un estado puro se leen .
Al igual que para los tipos de derivadas anteriores, el QFI puede calcularse utilizando diferentes métodos: una representación completa basada en una combinación lineal de implementación de unitarias, una representación bloque-diagonal y una diagonal basada en un método de superposición.
Ejemplos:
q = QuantumRegister(1) qc = QuantumCircuit(q) qc.h(q) qc.p(params[0], q[0]) op = ~StateFn(ham) @ CircuitStateFn(primitive=qc, coeff=1.) value_dict = {x: 0.1, a: np.pi / 4} qfi = QFI('lin_comb_full').convert(operator=CircuitStateFn(primitive=qc, coeff=1.), params=[a]) qfi.assign_parameters(value_dict).eval()La combinación del QFI y el gradiente da lugar a una forma especial de gradiente, a saber
NaturalGradients: El gradiente natural es un método de gradiente especial que reescala un gradiente w.r.t. un parámetro de estado con la inversa de la correspondiente Información Cuántica de Fisher (QFI) . De este modo, podemos elegir un gradiente, así como un método QFI y un método de regularización que se utiliza junto con un solucionador de mínimos cuadrados en lugar de la inversión exacta de la QFI:
Ejemplos:
op = ~StateFn(ham) @ CircuitStateFn(primitive=qc, coeff=1.) nat_grad = NaturalGradient(grad_method='lin_comb, qfi_method='lin_comb_full', \ regularization='ridge').convert(operator=op, params=params)El marco de gradientes también es compatible con los optimizadores de qiskit.aqua.components.optimizers. Las clases derivadas vienen con una función gradient_wrapper() que devuelve la llamada correspondiente.
-
Introduce
transformationspara la transformación fermiónica y bosónica de una instancia de problema. Transforma el operador fermiónico en operador qubit. La clase correspondiente a la transformación esfermionic_transformationIntroduce en los algoritmosground_state_solverspara el cálculo de las propiedades del estado fundamental. El cálculo se puede hacer utilizando unMinimumEigensolvero utilizandoAdaptVQEIntroducechemistry/resultsdonde el eigenstate_resultado y el electronic_structure_resultado también se utilizan para los algoritmos. Introduce las fábricas de eigensolvers mínimosminimum_eigensolver_factoriesdonde se pueden inicializar eigensolvers mínimos específicos de química Introduce la optimización orbital vqeoovqecomo solver de estado base para aplicaciones de química -
Nuevas clases de resultados de algoritmos:
Grovermétodo_run()devuelve la claseGroverResult.AmplitudeEstimationmétodo_run()devuelve la claseAmplitudeEstimationResult.IterativeAmplitudeEstimationmétodo_run()devuelve la claseIterativeAmplitudeEstimationResult.MaximumLikelihoodAmplitudeEstimationmétodo_run()devuelve la claseMaximumLikelihoodAmplitudeEstimationResult.Todas las nuevas clases de resultados son compatibles con el diccionario de resultados anterior.
-
Nuevas clases de resultados de Linear Solver:
HHLmétodo_run()devuelve la claseHHLResult.NumPyLSsolvermétodo_run()devuelve la claseNumPyLSsolverResult.Todas las nuevas clases de resultados son compatibles con el diccionario de resultados anterior.
-
MinimumEigenOptimizationResultexpone ahora las propiedades:samplesyeigensolver_result. Este último se obtiene del algoritmo subyacente utilizado por el optimizador y es específico del algoritmo.RecursiveMinimumEigenOptimizerdevuelve ahora una instancia de la clase de resultadosRecursiveMinimumEigenOptimizationResultque, a su vez, puede contener resultados intermedios obtenidos de los algoritmos subyacentes. La clase de resultados dedicada expone las propiedadesreplacementsyhistoryque son específicas de este optimizador. La profundidad del historial se gestiona mediante el parámetrohistorydel optimizador. -
GroverOptimizerahora devuelve una instancia deGroverOptimizationResulty esta clase de resultado expone las propiedadesoperation_counts,n_input_qubits, yn_output_qubitsdirectamente. Estas propiedades ya no están disponibles en el diccionarioraw_results. -
SlsqpOptimizerdevuelve ahora una instancia deSlsqpOptimizationResulty esta clase de resultado expone propiedades adicionales específicas de la implementación de SLSQP. -
Admite la introducción de objetos
QuantumCircuitcomo circuitos generadores enQuantumGenerator. -
Elimina la restricción a vectores de entrada reales en CircuitStateFn.from_vector. El método llama a extensions.Initialize. Este último admite explícitamente (en la API y la documentación) vectores de entrada complejos. Así que esta restricción parece innecesaria.
-
AbelianGrouper simplificado utilizando un algoritmo de coloreado de grafos de retworkx. Es más rápido que el algoritmo de coloreado basado en numpy.
-
Permite llamar a
evalsobre objetos de función de estado sin argumento, lo que devuelve la representaciónVectorStateFnde la función de estado. Este comportamiento es coherente conOperatorBase.eval, que devuelve la representaciónMatrixOp, si no se pasa ningún argumento. -
Añade
max_iterationsa la claseVQEAdaptpara permitir limitar el número máximo de iteraciones realizadas por el algoritmo. -
El cálculo de la expectativa VQE con Aer qasm_simulator ahora tiene por defecto un cálculo que tiene el comportamiento de ruido de disparo esperado. El cálculo especial basado en instantáneas Aer, que es mucho más rápido, con la salida ideal similar al simulador de vector de estado, todavía se puede elegir, pero como antes Aqua 0.7 ahora ya no es por defecto, pero se puede elegir.
Notas de actualización
- Extensión del anterior optimizador clásico Analytic Quantum Gradient Descent (AQGD) con el AQGD con Epochs. Ahora AQGD realiza la optimización de descenso de gradiente con un término de momento, gradientes analíticos y un programa de longitud de paso personalizado añadido para puertas cuánticas parametrizadas. Los gradientes se calculan "analíticamente" utilizando el circuito cuántico al evaluar la función objetivo.
- Se ha eliminado el soporte obsoleto para ejecutar qiskit-aqua con Python 3.5. Para utilizar qiskit-aqua >= 0.8.0 ahora necesitarás al menos Python 3.6. Si utiliza Python 3.5 la última versión que funcionará es qiskit-aqua 0.7.x.
- Añadida retworkx como nueva dependencia.
Notas sobre características en desuso
-
El argumento
i_objectivede los algoritmos de estimación de la amplitud ha pasado a llamarseobjective_qubits. -
TransformationType
-
QubitMappingType
-
Deprecate the
CircuitFactoryy tipos derivados. LaCircuitFactoryse ha introducido como clase temporal cuando a laQuantumCircuitle faltaron algunas características necesarias para las aplicaciones en Aqua. Ahora que el circuito tiene toda la funcionalidad necesaria, se puede retirar la fábrica de circuitos. Las sustituciones se indican en el cuadro siguiente.Circuit factory class | Replacement ------------------------------------+----------------------------------------------- CircuitFactory | use QuantumCircuit | UncertaintyModel | - UnivariateDistribution | - MultivariateDistribution | - NormalDistribution | qiskit.circuit.library.NormalDistribution MultivariateNormalDistribution | qiskit.circuit.library.NormalDistribution LogNormalDistribution | qiskit.circuit.library.LogNormalDistribution MultivariateLogNormalDistribution | qiskit.circuit.library.LogNormalDistribution UniformDistribution | qiskit.circuit.library.UniformDistribution MultivariateUniformDistribution | qiskit.circuit.library.UniformDistribution UnivariateVariationalDistribution | use parameterized QuantumCircuit MultivariateVariationalDistribution | use parameterized QuantumCircuit | UncertaintyProblem | - UnivariateProblem | - MultivariateProblem | - UnivariatePiecewiseLinearObjective | qiskit.circuit.library.LinearAmplitudeFunction -
Las clases de conversión de ising
qiskit.optimization.converters.QuadraticProgramToIsingyqiskit.optimization.converters.IsingToQuadraticProgramhan quedado obsoletas y se eliminarán en una futura versión. En su lugar, deben utilizarse los métodosqiskit.optimization.QuadraticProgramto_ising()yfrom_ising(). -
Deprecate the
WeightedSumOperatorque ha sido portado a la librería de circuitos comoWeightedAdderenqiskit.circuit.library. -
Core Hamiltonianqueda obsoleta en favor de la claseFermionicTransformationChemistry Operatorqueda obsoleta en favor de la clasetranformationsminimum_eigen_solvers/vqe_adaptqueda también obsoleta y se traslada como una implementación de la interfaz ground_state_solverapplications/molecular_ground_state_energyqueda obsoleta en favor de la claseground_state_solver -
Optimizer.SupportLevelenum anidado se sustituye porOptimizerSupportLevely se ha eliminadoOptimizer.SupportLevel. Utilice, por ejemplo,OptimizerSupportLevel.requireden lugar deOptimizer.SupportLevel.required. -
Deprecate the
UnivariateVariationalDistributionandMultivariateVariationalDistributionas input to theQuantumGenerator. En su lugar, se pueden utilizar objetos planos deQuantumCircuit. -
Las opciones fast y use_nx de AbelianGrouper.group_subops se eliminarán en futuras versiones.
-
La clase optimizadora GSLS desaprobó el parámetro
__init__max_iteren favor demaxiter. La clase optimizadora SPSA desaprobó el parámetro__init__max_trialsen favor demaxiter. la función optimize_svm ha dejado obsoleto el parámetromax_itersen favor demaxiter. La clase ADMMParameters desaprobó el parámetro__init__max_iteren favor demaxiter.
Corrección de errores
- La lista de excitación UCCSD, que comprende excitaciones simples y dobles, no se generaba correctamente cuando se proporcionaba explícitamente un espacio activo a UCSSD a través de los parámetros active_(un)occupied.
- Para los algoritmos de estimación de amplitud, definimos el número de consultas al oráculo como el número de veces que se aplica el operador Q/operador Grover. Esto incluye el número de disparos. Este factor se ha incluido en el MLAE y el IQAE, pero faltaba en el QAE "estándar".
- Arreglar CircuitSampler.convert, para que la propiedad
is_measurementse propague a StateFns convertida. - Corregir doble cálculo de coeficientes en :meth`~qiskit.aqua.operators.VectorStateFn.to_circuit_op`.
- Al llamar a PauliTrotterEvolution.convert en un operador que incluye un término que es un múltiplo escalar de la identidad se obtenía un circuito incorrecto, que ignoraba el coeficiente escalar. Esta corrección incluye el efecto del coeficiente en la propiedad global_phase del circuito.
- Hacer que ListOp.num_qubits compruebe que todos los operadores de la lista tienen el mismo num_qubits Anteriormente, se devolvía el número de qubits del primer operador de ListOp. Con este cambio, se realiza una comprobación adicional de que todos los demás operadores también tienen el mismo número de qubits.
- Haga que PauliOp.exp_i() genere la matriz correcta con los siguientes cambios. 1) Anteriormente había un error en la fase de un factor de 2. 2) La fase global se ignoraba al convertir el circuito a una matriz. Ahora utilizamos qiskit.quantum_info.Operator, que suele ser útil para convertir un circuito en una matriz unitaria, cuando es posible.
- Corrige la detección de ciclicidad como bug reportado en https://github.com/qiskit-community/qiskit-aqua/issues/1184.
IBM Proveedor Q 0.11.0
Notas de actualización
- Se ha eliminado el soporte obsoleto para ejecutar qiskit-ibmq-provider con Python 3.5. Para utilizar qiskit-ibmq-provider >= 0.11.0 ahora necesitará al menos Python 3.6. Si está utilizando Python 3.5 la última versión que funcionará es qiskit-ibmq-provider 0.10.x.
- Antes de esta versión,
websockets7.0 se utilizaba para Python 3.6. Con esta versión, se requierewebsockets8.0 o superior para todas las versiones de Python. Los requisitos del paquete se han actualizado para reflejarlo.