Skip to main content
IBM Quantum Platform

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 MCXGrayCode creará ahora un C3XGate si num_ctrl_qubits es 3 y un C4XGate si num_ctrl_qubits es 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\ , si num_ctrl_bitses 1, se crea unCXGate, y si es 2, se crea unCCXGate` .

Corrección de errores

  • Pulso Delay se ensamblan ahora explícitamente como PulseQobjInstruction incluidas en la PulseQobj salida de assemble().

    Anteriormente, podíamos ignorar Delay en un archivo Schedule como parte de assemble() ya que el tiempo estaba explícito en los PulseQobj objetos. 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 BasisTranslator y Unroller pases, 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ía compensate_phase faltaba un factor de 2π2\pi en la fase añadida.

  • Fijar la fase global de la salida del QuantumCircuit método repeat(). 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 de repeat() 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 SparsePauliOp por 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 1H(P,Q)1-H(P,Q) a [1H(P,Q)2]2[1-H(P,Q)^2]^2 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, cuando qiskit.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 QasmSimulator cuando se utilizan juntas las opciones "method" y "noise_model" , y cuando se utilizan con un simulador construido con from_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() y from_backend() donde basis_gates se 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 en ONse 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 ABA - B donde BB era un Operator objeto. 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 AerProvider por el que las opciones establecidas en los backends devueltos mediante set_options() se almacenaban en el proveedor y persistían en llamadas posteriores a get_backend() para el mismo backend. Ahora cada llamada a y backends() 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"` SXGate no 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" de QasmSimulator.
  • 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" de TomographyFitter, StateTomographyFitter, y ProcessTomographyFitter para 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étodo qiskit.quantum_info.state_fidelity() o qiskit.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_state en QAOA tiene ahora una implementación diferente como resultado de una corrección de errores. La implementación anterior mezclaba erróneamente las initial_state proporcionadas 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ámetro initial_state proporcionado 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_symbol ha sido eliminado de la VarType en 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 transpile método llamando a su run método si existe.
  • Se ha corregido un error que mezclaba initial_state personalizado en QAOA con 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 cusom initial_state ya 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.Experiment tiene 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() y qiskit.providers.ibmq.experiment.ExperimentService.analysis_results() admiten ahora un parámetro limit que 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étodos qiskit.providers.ibmq.experiment.ExperimentService.experiments() y qiskit.providers.ibmq.experiment.ExperimentService.analysis_results() . Este limit tiene 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 CREATING si el envío del trabajo fallaba a mitad de camino.
  • Corrige el bucle infinito que se producía al pasar una instancia de IBMQRandomService a 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 la QuantumCircuit se ha ampliado mediante la clase transpiler, quantum_infoy assembler así 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 puerta GR y la puerta global Rz ( GRZ) que se define de forma similar a las puertas GR puertas. 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 QuantumCircuit en un QuantumRegister de 3 qubits y realizará un RGate de un ángulo θ=π3\theta = \frac{\pi}{3} alrededor de un eje en el plano xy de las esferas de Bloch que forme un ángulo de ϕ=2π3\phi = \frac{2\pi}{3} con el eje x en cada qubit.

  • Se ha añadido un nuevo esquema de colores, iqx, al backend mpl para el cajón de circuitos qiskit.visualization.circuit_drawer() y qiskit.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, iqx y bw.

    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 archivo settings.conf bajo el título [Default] , un usuario puede introducir circuit_mpl_style = iqx para seleccionar el esquema de color iqx .

    La segunda forma es añadir {'name': 'iqx'} al kwarg style al método QuantumCircuit.draw o a la función circuit_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 style kwarg para el cajón del circuito qiskit.visualization.circuit_drawer() y qiskit.circuit.QuantumCircuit.draw() el campo displaycolor con el backend mpl permite 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 campo gatetextcolor . Los colores de las puertas pueden establecerse en el dict style para cualquier número de tipos de puerta, desde uno hasta todo el dict displaycolor . 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_delay a la clase QasmQobj en 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 el BackendConfiguration método rep_delay_range(). Si no se proporciona un valor, se utilizará el valor predeterminado de backend, qiskit.providers.models.BackendConfiguration.default_rep_delay. rep_delay sólo funcionará en backends que permitan un tiempo de repetición dinámico. Esto se puede comprobar con la propiedad BackendConfiguration propiedad dynamic_reprate_enabled.

  • El archivo qobj_schema.json JSON Schema en qiskit.schemas se ha actualizado para incluir el rep_delay como una propiedad de configuración opcional para QASM Qobjs.

  • El archivo backend_configuration_schema.json JSON Schema en qiskit.schemas se ha actualizado para incluir dynamic_reprate_enabled, rep_delay_range y default_rep_delay como 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.TemplateOptimization se 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 circuitos TemplateOptimization.

    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 tipo PassManager.

  • 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 BackendV1 método run() puede tomar ahora un objeto QuantumCircuit o Schedule en lugar de objetos Qobj . 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 que qiskit.providers.JobV1 ahora 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 abstracta JobV1 .

  • Se ha añadido un nuevo kwarg, inplace, a la función qiskit.result.marginal_counts(). Este kwarg se utiliza para controlar si el contenido se margina en su lugar o se devuelve una nueva copia, para Result entrada de objetos. Este parámetro no tiene ningún efecto para una entrada dict u Counts objeto.

  • 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 tipo Int1 ) en QuantumCircuit objetos. 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=False en el método qiskit.circuit.classicalfunction.ClassicalFunction método synth() 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_ORACLE se 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 con pip install tweedledum.

  • Se ha añadido una nueva clase qiskit.circuit.Delay para representar una instrucción de retardo en un circuito. Un nuevo método delay() 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_method para qiskit.compiler.transpile() se ha añadido. Es necesario cuando se transpilan circuitos con retardos. Si se especifica scheduling_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 circuito Schedule para 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_path2

    Consulte las notas de la versión y la documentación de transpile() y sequence() para más detalles sobre la otra ruta.

  • Se ha añadido el GroverOperator a 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, GroverOperator crea 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 argumento state_in .

  • Los métodos InstructionScheduleMap métodos get() y pop() métodos toman ahora ParameterExpression instancias 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 un ParametrizedSchedule, las expresiones deben estar ligadas antes de que el propio programa sea ligado/llamado.

  • Se ha añadido una nueva clase LinearAmplitudeFunction a la biblioteca de circuitos (qiskit.circuit.library) para asignar funciones lineales (a trozos) a las amplitudes de los qubits,

Fx0=1f(x)x0+f(x)x1F|x\rangle |0\rangle = \sqrt{1 - f(x)}|x\rangle |0\rangle + \sqrt{f(x)}|x\rangle |1\rangle

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_output se ha añadido al módulo qiskit.tools.jupyter mó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 existente Optimize1qGates que utiliza la clase OneQubitEulerDecomposer para descomponer y simplificar una cadena de compuertas de un solo qubit. Este método es compatible con cualquier conjunto de bases, mientras que Optimize1qGates sólo funciona para u1, u2, y u3. Los gestores de pases por defecto para optimization_level 1, 2 y 3 se han actualizado para utilizar este nuevo pase si el conjunto de bases no incluye u1, u2 o u3.

  • El sitio OneQubitEulerDecomposer admite ahora dos nuevas bases, 'PSX' y 'U'. Se pueden especificar con el kwarg basis en el constructor. Esto descompondrá la matriz en un circuito utilizando PGate y SXGate para 'PSX', y UGate para 'U'.

  • Se ha añadido un nuevo método remove() a la clase qiskit.transpiler.PassManager clase. Este método permite eliminar un pase de una PassManager instancia. Funciona sobre índices, de forma similar a replace(). Por ejemplo, para eliminar el RemoveResetInZeroState del 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, CXCancellation

    El escenario [1] con RemoveResetInZeroState se puede quitar así:

    pass_manager.remove(1)
    pass_manager.draw()
    [0] FlowLinear: UnrollCustomDefinitions, BasisTranslator
    [1] DoWhile: Depth, FixedPoint, Optimize1qGates, CXCancellation
  • UniformDistribution NormalDistribution LogNormalDistribution Se 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 QuantumCircuit clase. Esto permite QuantumCircuit anular (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 hardware Gate en 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 QuantumCircuit método add_calibration() que toma una Schedule así 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 gate

    Anteriormente, 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 Schedule utilizando la función schedule() función

    La 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 PulseQobj se ha añadido a la función qiskit.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_type ha sido añadido a qiskit.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 kwarg coord_type se establece en 'spherical' la lista de parámetros que se toman son de la forma [r, theta,  phi] donde r es el radio, theta es la inclinación desde la dirección +z, y phi es 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 Schedule admiten ahora el uso de objetos ParameterExpression para 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ódulo qiskit.visualization mó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 params del constructor de la clase Gate y sus subclases. Antes, todos los Gate parámetros tenían que estar en un conjunto de tipos permitidos definidos en la Instruction clase. Ahora un nuevo método validate_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, UnitaryGate acepta un parámetro del tipo numpy.ndarray y define un método personalizado validate_parameter() que devuelve el parámetro si es un numpy.ndarray. Tiene prioridad sobre la función definida en su clase padre Gate. Si UnitaryGate se utilizara como padre para una nueva clase, se utilizaría este método validate_parameter a menos que la nueva clase hija defina su propio método.

  • Se han eliminado los métodos, argumentos y propiedades anteriormente obsoletos denominados n_qubits y numberofqubits . Se eliminaron en la versión 0.13.0. El conjunto completo de cambios son:

    Clase
    Anterior
    Nuevo
    QuantumCircuitn_qubitsnum_qubits
    Paulinumberofqubitsnum_qubits
    Función
    Viejo argumento
    Nuevo argumento
    qiskit.circuit.random.random_circuit()n_qubitsnum_qubits
    qiskit.circuit.library.MSGaten_qubitsnum_qubits
  • Insertar una instancia Gate en un circuito QuantumCircuit crea 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 parametrizado Gate en varios circuitos.

  • La función qiskit.result.marginal_counts() ahora, por defecto, no modifica el parámetro qiskit.result.Result parámetro de instancia. Anteriormente, el objeto Result se modificaba siempre in situ. Se ha añadido un nuevo kwarg inplace marginal_counts() que permite utilizar el comportamiento anterior cuando inplace=True está configurado.

  • La definición de U3Gate definición se ha cambiado para que sea en términos de la clase UGate clase. La clase UGate no 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 PulseBackendConfiguration en los atributos hamiltonian el campo vars se 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 DAGNode se ha eliminado. El uso de un diccionario para el primer argumento posicional quedó obsoleto en la versión 0.13.0. Para crear un objeto DAGNode debes 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*, y tgt*, que quedaron obsoletos en la versión 0.12.0, han sido eliminados. En su lugar, sólo qubit, control_qubit* y target_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 utilizarse qiskit.circuit.library puede utilizarse en su lugar. Además, todas las clases de puerta que estaban antes en qiskit.extensions.standard siguen siendo importables desde qiskit.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 y i() o id() en su lugar.

Notas sobre características en desuso

  • El uso de un numpy.ndarray para un parámetro en el kwarg params para el constructor de la Gate y 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 tipo parms para la clase Gate clase. Si tiene una clase de puerta personalizada que es una subclase de Gate directamente (o a través de un padre diferente en la jerarquía) que acepta un parámetro ndarray , debe definir un método personalizado validate_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_qubits propiedad del PiecewiseLinearPauliRotations y PolynomialPauliRotations ha quedado obsoleta y se eliminará en una futura versión. En su lugar debe utilizarse la propiedad num_ancillas debe utilizarse en su lugar. Esto se hizo para que fuera coherente con el QuantumCircuit método num_ancillas().

  • La clase qiskit.circuit.library.MSGate ha quedado obsoleta, pero seguirá existiendo para permitir la carga de trabajos antiguos. Se ha sustituido por la clase qiskit.circuit.library.GMS que debe utilizarse en su lugar.

  • El pase de transpilador MSBasisDecomposer ha quedado obsoleto y se eliminará en una futura versión. En su lugar, se puede utilizar qiskit.transpiler.passes.BasisTranslator puede utilizarse en su lugar.

  • Los métodos QuantumCircuitu1 , u2 y u3 han 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, U2Gate y U3Gate para permitir la carga de trabajos antiguos.

Corrección de errores

  • Los métodos de la clase Result métodos de la clase data(), get_memory(), get_counts(), get_unitary(), y get_statevector ` will now emit a warning when the ``experiment`() kwarg se especifica para intentar obtener resultados utilizando un QuantumCircuit o Schedule cuando el objeto Result contiene 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.QuantumCircuit método append() 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 parametrizado Gate en 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 kwargs backend y pass_manager . Esto se ha corregido para que tanto backend como pass_manager puedan utilizarse conjuntamente en las llamadas a execute(). Correcciones #5037
  • El método QuantumCircuit método unitary() se ha corregido para que acepte un único número entero como argumento de qarg (cuando se añade un unitario de 1 qubit). Los tipos permitidos para el argumento qargs son ahora int, Qubito una lista de enteros. Correcciones #4944
  • Anteriormente, la llamada a inverse() en un objeto BlueprintCircuit podía fallar si su propiedad de datos interna aún no estaba rellenada. Esto se ha corregido para que la llamada a inverse() rellene los datos internos antes de generar la inversa del circuito. Correcciones #5140
  • Se ha corregido un problema al crear un qiskit.result.Counts a partir de un diccionario de datos vacío. Esto creará un objeto Counts vacío. El método most_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_state de un UnitaryGate se aplicaba dos veces; una vez en la creación de la matriz para el unitario controlado y otra vez al llamar al método definition() de la clase qiskit.circuit.ControlledGate clase. Esto daría la impresión de que la configuración de ctrl_state no tiene ningún efecto.
  • Anteriormente, el ControlledGate método inverse() no conservaba el parámetro ctrl_state en algunos casos. Esto se ha corregido para que al llamar a inverse() conservará el valor ctrl_state en su salida.
  • Corregido un error en el backend de salida mpl del cajón de circuitos qiskit.circuit.QuantumCircuit.draw() y qiskit.visualization.circuit_drawer() que provocaba el fallo del cajón si el kwarg de style se 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() o from_qasm_str() fallaba si una puerta u, phase(p), sx, o sxdg estaba 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.Delay a las instrucciones StatevectorSimulator, UnitarySimulator, y QasmSimulator. 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.UGate a los métodos StatevectorSimulator, UnitarySimulator, y "statevector", "density_matrix", "matrix_product_state", y "extended_stabilizer" de QasmSimulator.

  • Añade soporte de puerta base para la puerta de fase qiskit.circuit.library.PhaseGate a los métodos StatevectorSimulator, StatevectorSimulator, UnitarySimulator, y "statevector", "density_matrix", "matrix_product_state", y "extended_stabilizer" de QasmSimulator.

  • Añade soporte de puerta base para la puerta de fase controlada qiskit.circuit.library.CPhaseGate a los métodos StatevectorSimulator, StatevectorSimulator, UnitarySimulator, y "statevector", "density_matrix", y "matrix_product_state" de QasmSimulator.

  • Añade soporte para la puerta de fase multicontrolada qiskit.circuit.library.MCPhaseGate a los métodos StatevectorSimulator, UnitarySimulator, y "statevector" del QasmSimulator.

  • Añade soporte para la puerta (X)\sqrt(X) qiskit.circuit.library.SXGate a StatevectorSimulator, UnitarySimulator, y QasmSimulator.

  • 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, RZXGate a los métodos StatevectorSimulator, UnitarySimulator, y "statevector" y "density_matrix" del QasmSimulator.

  • Añade compatibilidad con las puertas de rotación multicontroladas "mcr", "mcrx", "mcry", "mcrz" al método StatevectorSimulator, UnitarySimulator, y al método "statevector" de QasmSimulator.

  • 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.

    QasmSimulator y PulseSimulator también pueden configurarse desde un objeto backend IBMQBackend utilizando el método :meth:`~qiskit.providers.aer.QasmSimulator.from_backend. Para QasmSimulator , 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. En PulseSimulator , 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 como QasmSimulator(method='matrix_product_state').

    Una ventaja es que una instancia de PulseSimulator configurada 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, PulseSimulator se instanciará desde el backend FakeArmonk() . Todos los datos de configuración y por defecto se copian en la instancia del simulador, por lo que cuando se pasa como argumento a assemble, se comporta como si se hubiera suministrado el backend original (por ejemplo, los valores por defecto de FakeArmonk estarán presentes y serán utilizados por assemble).

    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 del QasmSimulator.

  • 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 QasmSimulator si 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 QauntumError en el método NoiseModel al "matrix_product_state" del QasmSimulator.

  • Añade soporte para la instrucción de instantánea de matriz de densidad qiskit.providers.aer.extensions.SnapshotDensityMatrix al método "matrix_product_state" del QasmSimulator.

  • 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" del QasmSimulator, 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 StatevectorSimulator al 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 StatevectorSimulator y QasmSimulator.

    Para el método "density_matrix" del QasmSimulator y para la fusión de puertas UnitarySimulator se aplicará a circuitos con más de 7 qubits.

    Los valores de umbral qubit personalizados pueden establecerse utilizando la opción fusion_threshold backend es decir backend.set_options(fusion_threshold=10)

  • Cambia la opción fusion_threshold backend 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 variance de 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 StatevectorSimulator que 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 StatevectorSimulator y UnitarySimulator. 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-Dihedral qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral tiene 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.CNOTDihedral contiene 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 clase qiskit.ignis.mitigation.ExpvalMeasMitigatorFitter . El ajustador devuelve un objeto mitigador que puede suministrarse como argumento a la función expectation_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.CTMPExpvalMeasMitigator utilizada 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.QVFitter plot_qv_data() ha sido actualizado para devolver un objeto matplotlib.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 amplio matplotlib .

  • Las barras de error de la figura elaborada con el método qiskit.ignis.verification.QVFitter qiskit.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, figsize al método qiskit.ignis.verification.QVFitter qiskit.ignis.verification.QVFitter.plot_qv_data(). Este kwarg toma una tupla de la forma (x, y) donde x y y son 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 el qiskit.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.CNOTDihedral para 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 QuantumCircuit como entradas para especificar los operadores A y Q. Este cambio va acompañado de la introducción de GroverOperator en 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 como

    import 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 α\alpha un número real en [0,1][0,1] que especifica la fracción de muestras mejor observadas que se utilizan para calcular la función objetivo. Obsérvese que si α=1\alpha = 1, CVaR es equivalente a un valor de expectativa estándar. Del mismo modo, si α=0\alpha = 0, entonces CVaR corresponde a utilizar la mejor muestra observada. Los valores intermedios de α\alpha 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 Eigensolver para 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 Driver que proporciona la información relevante sobre la molécula, un Transformation 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. Las páginas 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).

  • 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 OrbitalOptimizationVQE como 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, GaussianConditionalIndependenceModel y EuropeanCallExpectedValue a qiskit.finance.applications.

  • Marco de gradientes. qiskit.operators.gradients Dado 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 dψ(θ)O(ω)ψ(θ)/dωd⟨ψ(θ)|O(ω)|ψ(θ)〉/ dω resp. dψ(θ)O(ω)ψ(θ)/dθd⟨ψ(θ)|O(ω)|ψ(θ)〉/ dθ resp. dψ(θ)iiψ(θ)/dθd⟨ψ(θ)|i〉⟨i|ψ(θ)〉/ dθ.

    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 d2ψ(θ)O(ω)ψ(θ)/dω2d^2⟨ψ(θ)|O(ω)|ψ(θ)〉/ dω^2 resp. d2ψ(θ)O(ω)ψ(θ)/dθ2d^2⟨ψ(θ)|O(ω)|ψ(θ)〉/ dθ^2 resp. d2ψ(θ)O(ω)ψ(θ)/dθdωd^2⟨ψ(θ)|O(ω)|ψ(θ)〉/ dθdω resp. d2ψ(θ)iiψ(θ)/dθ2d^2⟨ψ(θ)|i〉⟨i|ψ(θ)〉/ dθ^2.

    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ámetros Hessian().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 [QFI]kl=Re[kψlψkψψ〉〈ψlψ]4[QFI]kl= Re[〈∂kψ|∂lψ〉−〈∂kψ|ψ〉〈ψ|∂lψ〉] * 4.

    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) QFI1dψ(θ)O(ω)ψ(θ)/dθQFI^-1 d⟨ψ(θ)|O(ω)|ψ(θ)〉/ dθ. 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 transformations para 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 es fermionic_transformation Introduce en los algoritmos ground_state_solvers para el cálculo de las propiedades del estado fundamental. El cálculo se puede hacer utilizando un MinimumEigensolver o utilizando AdaptVQE Introduce chemistry/results donde el eigenstate_resultado y el electronic_structure_resultado también se utilizan para los algoritmos. Introduce las fábricas de eigensolvers mínimos minimum_eigensolver_factories donde se pueden inicializar eigensolvers mínimos específicos de química Introduce la optimización orbital vqe oovqe como solver de estado base para aplicaciones de química

  • Nuevas clases de resultados de algoritmos:

    Grover método _run() devuelve la clase GroverResult. AmplitudeEstimation método _run() devuelve la clase AmplitudeEstimationResult. IterativeAmplitudeEstimation método _run() devuelve la clase IterativeAmplitudeEstimationResult. MaximumLikelihoodAmplitudeEstimation método _run() devuelve la clase MaximumLikelihoodAmplitudeEstimationResult.

    Todas las nuevas clases de resultados son compatibles con el diccionario de resultados anterior.

  • Nuevas clases de resultados de Linear Solver:

    HHL método _run() devuelve la clase HHLResult. NumPyLSsolver método _run() devuelve la clase NumPyLSsolverResult.

    Todas las nuevas clases de resultados son compatibles con el diccionario de resultados anterior.

  • MinimumEigenOptimizationResult expone ahora las propiedades: samples y eigensolver_result. Este último se obtiene del algoritmo subyacente utilizado por el optimizador y es específico del algoritmo. RecursiveMinimumEigenOptimizer devuelve ahora una instancia de la clase de resultados RecursiveMinimumEigenOptimizationResult que, a su vez, puede contener resultados intermedios obtenidos de los algoritmos subyacentes. La clase de resultados dedicada expone las propiedades replacements y history que son específicas de este optimizador. La profundidad del historial se gestiona mediante el parámetro history del optimizador.

  • GroverOptimizer ahora devuelve una instancia de GroverOptimizationResult y esta clase de resultado expone las propiedades operation_counts, n_input_qubits, y n_output_qubits directamente. Estas propiedades ya no están disponibles en el diccionario raw_results .

  • SlsqpOptimizer devuelve ahora una instancia de SlsqpOptimizationResult y esta clase de resultado expone propiedades adicionales específicas de la implementación de SLSQP.

  • Admite la introducción de objetos QuantumCircuit como circuitos generadores en QuantumGenerator.

  • 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 eval sobre objetos de función de estado sin argumento, lo que devuelve la representación VectorStateFn de la función de estado. Este comportamiento es coherente con OperatorBase.eval, que devuelve la representación MatrixOp , si no se pasa ningún argumento.

  • Añade max_iterations a la clase VQEAdapt para 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_objective de los algoritmos de estimación de la amplitud ha pasado a llamarse objective_qubits.

  • TransformationType

  • QubitMappingType

  • Deprecate the CircuitFactory y tipos derivados. La CircuitFactory se ha introducido como clase temporal cuando a la QuantumCircuit le 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.QuadraticProgramToIsing y qiskit.optimization.converters.IsingToQuadraticProgram han quedado obsoletas y se eliminarán en una futura versión. En su lugar, deben utilizarse los métodos qiskit.optimization.QuadraticProgram to_ising() y from_ising() .

  • Deprecate the WeightedSumOperator que ha sido portado a la librería de circuitos como WeightedAdder en qiskit.circuit.library.

  • Core Hamiltonian queda obsoleta en favor de la clase FermionicTransformation Chemistry Operator queda obsoleta en favor de la clase tranformations minimum_eigen_solvers/vqe_adapt queda también obsoleta y se traslada como una implementación de la interfaz ground_state_solver applications/molecular_ground_state_energy queda obsoleta en favor de la clase ground_state_solver

  • Optimizer.SupportLevel enum anidado se sustituye por OptimizerSupportLevel y se ha eliminado Optimizer.SupportLevel . Utilice, por ejemplo, OptimizerSupportLevel.required en lugar de Optimizer.SupportLevel.required.

  • Deprecate the UnivariateVariationalDistribution and MultivariateVariationalDistribution as input to the QuantumGenerator. En su lugar, se pueden utilizar objetos planos de QuantumCircuit .

  • 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_iter en favor de maxiter. La clase optimizadora SPSA desaprobó el parámetro __init__ max_trials en favor de maxiter. la función optimize_svm ha dejado obsoleto el parámetro max_iters en favor de maxiter. La clase ADMMParameters desaprobó el parámetro __init__ max_iter en favor de maxiter.

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_measurement se 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, websockets 7.0 se utilizaba para Python 3.6. Con esta versión, se requiere websockets 8.0 o superior para todas las versiones de Python. Los requisitos del paquete se han actualizado para reflejarlo.
¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.