Notas de la versión de Qiskit 0.37
0.37.2
Terra 0.21.2
Preludio
Qiskit Terra 0.21.2 es principalmente una versión de corrección de errores, y también viene con varias páginas de documentación mejoradas.
Corrección de errores
-
aer_simulator_statevector_gpuahora se reconocerá correctamente como método statevector en alguna función cuando se utilicen los simuladores de GPU de Qiskit Aer enQuantumInstancey otros ejecutores de algoritmos. -
Corregido el
UCGate.inverse()que antes no invertía la fase global. -
QuantumCircuit.compose()funcionará ahora correctamente cuando se utilice con el argumentoinplace=Trueen contextos de creación de flujos de control. Antes, las instrucciones se añadían fuera del ámbito del flujo de control. Corregido #8433. -
Se ha corregido un error por el que una expresión
ParameterExpressionno se identificaba como real sisymengineestaba instalado y la expresión bound no era un1j. Por ejemplo:from qiskit.circuit import Parameter x = Parameter("x") expr = 1j * x bound = expr.bind({x: 2}) print(bound.is_real()) # used to be True, but is now False -
Corregida la serialización y deserialización QPY de
ControlledGatecon controles abiertos (es decir, aquellos cuyactrl_stateno es todos unos). Corregido #8549. -
Se han actualizado todos los backends falsos de
qiskit.providers.fake_provider.backendspara que devuelvan los objetos de canal de impulsos correspondientes con la llamada al método dedrive_channel(),measure_channel(),acquire_channel(),control_channel(). -
Arreglado el soporte para ejecutar
Z2Symmetries.taper()en problemas más grandes. Antes, el método requería una gran cantidad de memoria, lo que solía provocar fallos en los problemas de mayor envergadura. Como efecto secundario de esta corrección, el rendimiento ha mejorado significativamente.
Aer 0.10.4
No cambia
IBM Proveedor Q 0.19.2
No cambia
0.37.1
Terra 0.21.1
Corrección de errores
-
Se ha corregido un problema en el método
QuantumCircuit.decompose()cuando se pasaba una lista de clasesGatepara el argumentogates_to_decompose. Si alguna puerta del circuito tenía una etiqueta establecida, este argumento no se manejaba correctamente y provocaba que la descomposición de salida omitiera incorrectamente puertas explícitamente en la listagates_to_decompose. -
Arreglar
to_instruction()que antes intentaba crear unUnitaryGatesin exponenciar el operador a evolucionar. Dado que este operador no suele ser unitario, se produjo un error (y si el operador hubiera sido unitario por casualidad, no habría sido el resultado esperado).Ahora, al llamar correctamente a
to_instruction()produce correctamente una puerta que implementa la evolución temporal del operador que contiene:>>> from qiskit.opflow import EvolvedOp, X >>> op = EvolvedOp(0.5 * X) >>> op.to_instruction() Instruction( name='unitary', num_qubits=1, num_clbits=0, params=[array([[0.87758256+0.j, 0.-0.47942554j], [0.-0.47942554j, 0.87758256+0.j]])] ) -
Se ha corregido un problema con la función
marginal_distribution()cuando se introducía una matriz numpy como argumento enindices, la función producía un error. Corregido #8283 -
Anteriormente no era posible adosar un
CircuitStateFnque se ha construido a partir de aVectorStateFn. Esto se debe a que el vector de estado se ha convertido en un circuito con la instrucciónInitialize, que no es unitaria. Este problema se soluciona ahora utilizando en su lugar la instrucciónStatePreparationque se puede utilizar ya que se supone que el estado comienza en el estado todo 0.Por ejemplo, ahora podemos hacer:
from qiskit import QuantumCircuit from qiskit.opflow import StateFn left = StateFn([0, 1]) left_circuit = left.to_circuit_op().primitive right_circuit = QuantumCircuit(1) right_circuit.x(0) overlap = left_circuit.inverse().compose(right_circuit) # this line raised an error before! -
Se ha corregido un error en las clases
Optimizerpor el que al reconstruir una nueva instancia del optimizador a partir de una ya existente, se restablecían los valores predeterminados del optimizador anterior y del nuevosettingsrestablecía la configuración del optimizador nuevo y del anterior a los valores predeterminados. Esto provocaba un error si se enviaban objetosOptimizerse enviaban como entrada a programas Qiskit Runtime.Ahora los objetos del optimizador se reconstruyen correctamente:
>>> from qiskit.algorithms.optimizers import COBYLA >>> original = COBYLA(maxiter=1) >>> reconstructed = COBYLA(**original.settings) >>> reconstructed._options["maxiter"] 1 # used to be 1000! -
Se ha corregido un problema por el que el argumento
limit_amplitudeen un individuoSymbolicPulseoWaveformno se reflejaba correctamente en la validación de parámetros. Además, QPY scheduledump()se ha corregido para almacenar correctamente el valorlimit_amplitudevinculado a la instancia, en lugar de guardar la variable de clase global. -
Fijar la estructura de entrelazamiento por pares para
NLocalcircuitos. Esto provocó un error enZZFeatureMapdonde el uso deentanglement="pairwise"generaba un error. Ahora produce correctamente el mapa de características deseado:from qiskit.circuit.library import ZZFeatureMap encoding = ZZFeatureMap(4, entanglement="pairwise", reps=1) print(encoding.decompose().draw())Las huellas anteriores:
┌───┐┌─────────────┐ q_0: ┤ H ├┤ P(2.0*x[0]) ├──■────────────────────────────────────■──────────────────────────────────────────── ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(π - x[0])*(π - x[1])) ├┤ X ├──■────────────────────────────────────■── ├───┤├─────────────┤└───┘└──────────────────────────────┘└───┘┌─┴─┐┌──────────────────────────────┐┌─┴─┐ q_2: ┤ H ├┤ P(2.0*x[2]) ├──■────────────────────────────────────■──┤ X ├┤ P(2.0*(π - x[1])*(π - x[2])) ├┤ X ├ ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐└───┘└──────────────────────────────┘└───┘ q_3: ┤ H ├┤ P(2.0*x[3]) ├┤ X ├┤ P(2.0*(π - x[2])*(π - x[3])) ├┤ X ├────────────────────────────────────────── └───┘└─────────────┘└───┘└──────────────────────────────┘└───┘ -
Corregido un problema en el manejo de la fase global de la
UCGateclase.
Aer 0.10.4
No cambia
IBM Proveedor Q 0.19.2
No cambia
0.37.0
Esta versión marca oficialmente el fin del soporte para el proyecto Qiskit Ignis de Qiskit. Originalmente estaba obsoleto en la versión 0.33.0 y, como se documentó en esa versión, el paquete qiskit-ignis se ha eliminado del metapaquete Qiskit, lo que significa que en esa futura versión pip install qiskit ya no incluirá qiskit-ignis. Sin embargo, tenga en cuenta que, debido a las limitaciones del empaquetado de python, no podemos eliminar automáticamente una instalación preexistente de qiskit-ignis. Si está actualizando desde una versión anterior, se recomienda que desinstale manualmente Qiskit Ignis con pip uninstall qiskit-ignis o instale el metapaquete en un entorno python nuevo.
Qiskit Ignis ha sido sustituido por el proyecto Qiskit Experiments. Puedes consultar la guía de migración para más detalles sobre cómo cambiar de Qiskit Ignis a Qiskit Experiments.
Terra 0.21.0
Preludio
Los aspectos más destacados del lanzamiento de Qiskit 0.21.0 son:
- Soporte para la serialización de un pulso
ScheduleBlocka través deqiskit.qpy. El formato QPY se ha actualizado a la versión 5, que incluye una definición para incluir los horarios de pulso. Para ello, se ha introducido una nueva claseSymbolicPulseque permite definir formas de onda paramétricas mediante expresiones simbólicas.- Mejoras en el trabajo con gestores de pases predefinidos. Una nueva función
generate_preset_pass_manager()permite generar fácilmente un gestor de pases equivalente al quetranspile()utilizará internamente. Además, los gestores de pases predefinidos son ahora instancias deStagedPassManagerlo que facilita la modificación de las secciones.- Una refactorización de la estructura de datos interna del atributo
QuantumCircuit.dataatributo. Antes era una lista de tuplas de la forma(instruction, qubits, clbits)y ahora es una lista deCircuitInstructionobjetos. El acceso a los objetosCircuitInstructiones compatible con el acceso anterior basado en tuplas, aunque con un coste adicional en tiempo de ejecución.
Además, se ha mejorado el transpilador para obtener resultados de mayor calidad. Esto incluye la introducción de nuevos pases como VF2PostLayout y ToqmSwap.
Nuevas funciones
-
Añadida una nueva clase,
qiskit.transpiler.StagedPassManagerque es una subclasePassManagersubclase que tiene un pipeline con fases definidas para realizar la compilación de circuitos. Cada fase es unPassManagerobjeto que se ejecutará en un orden fijo. Por ejemplo:from qiskit.transpiler.passes import * from qiskit.transpiler import PassManager, StagedPassManager basis_gates = ['rx', 'ry', 'rxx'] init = PassManager([UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]) translate = PassManager([Collect2qBlocks(), ConsolidateBlocks(basis_gates=basis_gates), UnitarySynthesis(basis_gates)]) staged_pm = StagedPassManager(stages=['init', 'translation'], init=init, translation=translate) -
Añadidos los métodos
PauliList.group_commuting()ySparsePauliOp.group_commuting()que dividen estos operadores en sublistas en las que cada elemento conmuta con todos los demás. Por ejemplo:from qiskit.quantum_info import PauliList, SparsePauliOp groups = PauliList(["XX", "YY", "IZ", "ZZ"]).group_commuting() # 'groups' is [PauliList(['IZ', 'ZZ']), PauliList(['XX', 'YY'])] op = SparsePauliOp.from_list([("XX", 2), ("YY", 1), ("IZ", 2j), ("ZZ", 1j)]) groups = op.group_commuting() # 'groups' is [ # SparsePauliOp(['IZ', 'ZZ'], coeffs=[0.+2.j, 0.+1.j]), # SparsePauliOp(['XX', 'YY'], coeffs=[2.+0.j, 1.+0.j]), # ] -
Añadida una nueva función,
marginal_distribution()que se utiliza para marginar un diccionario de entrada de cadenas de bits a un número entero (comoCounts). Su funcionalidad es similar a la de la funciónmarginal_counts()con tres diferencias fundamentales. La primera es quemarginal_counts()funciona tanto con un diccionario de cuentas como con un objetoResultsmientras quemarginal_distribution()sólo funciona con un diccionario. La segunda es quemarginal_counts()no respeta el orden de los índices en su argumentoindicesmientras quemarginal_distribution()sí lo hace y permutará los bits de salida basándose en el orden deindices. La tercera diferencia es quemarginal_distribution()debería ser más rápido ya que su implementación está escrita en Rust y racionalizada para sólo marginar una entrada de diccionario. -
Añadido el operador binario
@(__matmul__) a las subclasesBaseOperatoren el móduloqiskit.quantum_infomódulo. Esto es una forma abreviada de llamar al métododotde las clases (A @ B == A.dot(B)). -
Se ha añadido un nuevo argumento opcional,
reps, aQuantumCircuit.decompose()que permite la descomposición repetida del circuito. Por ejemplo:from qiskit import QuantumCircuit circuit = QuantumCircuit(1) circuit.ry(0.5, 0) # Equivalent to circuit.decompose().decompose() circuit.decompose(reps=2) # decompose 2 times, but only RY gate 2 times and R gate 1 times circuit.decompose(gates_to_decompose=['ry','r'], reps=2) -
Añadida una nueva clase base de pulso
SymbolicPulse. Se trata de un sustituto del método convencionalParametricPulseque quedará obsoleto. En la nueva clase base, las funciones de envolvente de impulsos y validación de parámetros se representan mediante objetos de expresión simbólica. La nueva clase proporciona datos de impulsos autocontenidos y portátiles, ya que estas ecuaciones simbólicas pueden serializarse fácilmente a través de bibliotecas de cálculo simbólico. -
Añadido soporte para operadores no hermitianos en
AerPauliExpectation. Esto permite utilizar los rápidos cálculos de expectativas instantáneas de Aer en algoritmos comoQEOM. -
Añadido un nuevo estilo de dibujo de circuitos,
textbook, que utiliza el esquema de colores del libro de texto Qiskit. -
Un nuevo atributo
QuantumCircuit.op_start_timesse rellena cuando se ejecuta en el circuito uno de los pases de análisis de programación. Puede utilizarse, por ejemplo, para obtener la instrucción del circuito con el tiempo de instrucción:from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import FakeMontreal backend = FakeMontreal() qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qct = transpile( qc, backend, initial_layout=[0, 1], coupling_map=[[0, 1]], scheduling_method="alap" ) scheduled_insts = list(zip(qct.op_start_times, qct.data)) -
Se ha añadido un nuevo método
QuantumCircuit.clear()que se utiliza para eliminar todas las instrucciones de un archivoQuantumCircuit. -
Se ha añadido un nuevo método
QuantumCircuit.copy_empty_like()que se utiliza para obtener una copia borrada de unaQuantumCircuitinstancia. Esto es lógicamente equivalente aqc.copy().clear(), pero significativamente más rápido y más eficiente en memoria. Esto es útil cuando se necesita un nuevo circuito vacío con todos los mismos recursos (qubits, bits clásicos, metadatos, etc.) ya añadidos. -
El método
Target.instruction_supported()admite ahora dos nuevos argumentos de palabra clave,operation_classyparameters. Con estos argumentos, el métodoinstruction_supported()se puede utilizar ahora para comprobar que una operación específica con valores de parámetro son compatibles con un objetoTargetobjeto. Por ejemplo, si desea comprobar si un servidorTargetllamadotargetadmite la ejecución de unRXGatecon harías algo comofrom math import pi from qiskit.circuit.library import RXGate target.instruction_supported(operation_class=RXGate, parameters=[pi/2])que devolverá
Truesitargetadmite la ejecuciónRXGatecon yFalseen caso contrario. -
Añadido un algoritmo de evolución cuántica en tiempo real basado en la trotterización
qiskit.algorithms.TrotterQRTE. Se ajusta al nuevo marco de evolución cuántica del tiempo y hace uso delProductFormulayPauliEvolutionGateimplementaciones.from qiskit.algorithms import EvolutionProblem from qiskit.algorithms.evolvers.trotterization import TrotterQRTE from qiskit.opflow import X, Z, StateFn, SummedOp operator = SummedOp([X, Z]) initial_state = StateFn([1, 0]) time = 1 evolution_problem = EvolutionProblem(operator, time, initial_state) trotter_qrte = TrotterQRTE() evolution_result = trotter_qrte.evolve(evolution_problem) evolved_state_circuit = evolution_result.evolved_state -
Se ha añadido una nueva función
generate_preset_pass_manager()que puede utilizarse para generar rápidamente un objeto preestablecidoPassManagerque refleja elPassManagerutilizado internamente por la funcióntranspile()función. Por ejemplo:from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import FakeWashingtonV2 # Generate an optimization level 3 pass manager targeting FakeWashingtonV2 pass_manager = generate_preset_pass_manager(3, FakeWashingtonV2()) -
Añadida una nueva función
marginal_memory()que se utiliza para marginar matrices de memoria de disparo. Si se le proporciona la matriz de memoria de disparo y los índices de interés, la función devolverá una matriz de memoria de disparo maginizada. Esta función difiere del soporte de memoria del métodomarginal_counts()que sólo funciona en el campomemoryde un objetoResults. -
La interfaz de primitivas se ha ampliado para aceptar objetos además de índices como argumentos del método
__call__. El argumentoparameter_valuesahora puede ser opcional. -
El exportador OpenQASM 3 (
qiskit.qasm3) soporta ahora la exportación de circuitos con retardos explícitos, como desdeQuantumCircuit.delay(). -
Añadido un nuevo método de trazado y encaminamiento a
transpile()basado en el artículo "Time-optimal qubit mapping". Para utilizarlo, es necesario instalar el paquete opcional Qiskit TOQM. El kwargrouting_methoddetranspile()admite un valor adicional,'toqm'que se utiliza para habilitar la disposición y el enrutamiento a través de TOQM.Para instalar
qiskit-toqmjunto con Terra, ejecute:pip install qiskit-terra[toqm] -
Añadido un nuevo módulo
qiskit.quantum_info.synthesis.qsdpara aplicar la descomposición cuántica de Shannon a unitarios arbitrarios. Esta funcionalidad sustituye al anterior enfoque basado en isometrías en el pase por defecto del transpilador de síntesis unitaria, así como cuando se añaden unitarios a un circuito utilizando una funciónUnitaryGate.La descomposición cuántica de Shannon utiliza aproximadamente la mitad de puertas cnot que la implementación de isometría al descomponer matrices unitarias de más de dos qubits.
-
Las clases del módulo
quantum_infoque admiten la multiplicación escalar ahora pueden multiplicarse por un escalar desde la izquierda o la derecha. Antes, sólo aceptaban multiplicadores escalares de la izquierda. -
El pase del transpilador
LookaheadSwap(utilizado portranspile()cuandorouting_method="lookahead") ha experimentado algunas mejoras de rendimiento y ahora será aproximadamente tres veces más rápido. Esto es puramente ser más eficiente en sus cálculos, y no cambia la complejidad del algoritmo. En la mayoría de los casos, un algoritmo de enrutamiento más moderno comoSabreSwap(routing_method="sabre") será mucho más eficaz. -
Se han añadido nuevos pases de transpilador. El transpiler pass
Commuting2qGateRouterutiliza estrategias de intercambio para encaminar un bloque de puertas conmutadas al mapa de acoplamiento. De hecho, el enrutamiento es un problema difícil, pero es mucho más fácil cuando las puertas se conmutan como en las redes CZ. En QAOA también suelen encontrarse bloques de puertas de desplazamiento. Estos casos pueden tratarse mediante estrategias de intercambio que aplican un conjunto predefinido de capas de puertas SWAP. Además, el nuevo pase transpiladorFindCommutingPauliEvolutionsidentifica bloques de evoluciones Pauli hechos de términos conmutativos de dos qubits. Aquí, una estrategia de intercambio se especifica mediante la claseSwapStrategy. Las estrategias de intercambio deben adaptarse al mapa de acoplamiento e, idealmente, al circuito para obtener los mejores resultados. -
Introducido un nuevo optimizador en la biblioteca Qiskit, que añade soporte a la optimización de parámetros de algoritmos cuánticos variacionales. Se trata del Algoritmo de Distribución Marginal Univariante (UMDA), que es un tipo específico de los Algoritmos de Estimación de la Distribución. Por ejemplo:
from qiskit.opflow import X, Z, I from qiskit import Aer from qiskit.algorithms.optimizers import UMDA from qiskit.algorithms import QAOA from qiskit.utils import QuantumInstance H2_op = (-1.052373245772859 * I ^ I) + \ (0.39793742484318045 * I ^ Z) + \ (-0.39793742484318045 * Z ^ I) + \ (-0.01128010425623538 * Z ^ Z) + \ (0.18093119978423156 * X ^ X) p = 2 # Toy example: 2 layers with 2 parameters in each layer: 4 variables opt = UMDA(maxiter=100, size_gen=20) backend = Aer.get_backend('statevector_simulator') vqe = QAOA(opt, quantum_instance=QuantumInstance(backend=backend), reps=p) result = vqe.compute_minimum_eigenvalue(operator=H2_op) -
El constructor del
Unroll3qOrMoretranspiler pass tiene dos nuevos argumentos de palabra clave opcionales,targetybasis_gates. Estas opciones permiten especificar lasTargeto puertas base soportadas respectivamente para describir el backend de destino. Si alguna de las operaciones del circuito se encuentra entargetobasis_gates, no será desenrollada por el pase, ya que el dispositivo de destino tiene soporte nativo para la operación. -
La serialización QPY ha sido actualizada para soportar
ScheduleBlock. Ahora puede guardar el programa de pulso en binario y cargarlo más tarde:from qiskit import pulse, qpy with pulse.build() as schedule: pulse.play(pulse.Gaussian(160, 0.1, 40), pulse.DriveChannel(0)) with open('schedule.qpy', 'wb') as fd: qpy.dump(schedule, fd) with open('schedule.qpy', 'rb') as fd: new_schedule = qpy.load(fd)[0]Utiliza la interfaz QPY común a
QuantumCircuit. Véase SCHEDULE_BLOCK para más detalles sobre la estructura de datos. -
Añadido un nuevo pase de transpilador,
VF2PostLayout. Este paso es de un nuevo tipo para realizar una nueva fase/función en el proceso de compilación, posterior al diseño o posterior a la optimización de la selección de qubits. La idea detrás de este paso es que después de terminar el bucle de optimización en el transpilador sepamos cuáles serán los recuentos finales de puertas en cada qubit del circuito, de modo que podamos encontrar potencialmente un subconjunto de qubits de mejor rendimiento en un backend para ejecutar el circuito. El pase buscará un subgrafo isomórfico en el gráfico de conectividad del backend de destino y mirará la tasa de error completa del circuito completo en cualquier subgrafo encontrado y devolverá el diseño encontrado con la tasa de error más baja para el circuito.Este pase es similar al pase
VF2Layouty ambos utilizan internamente la misma implementación VF2 de retworkx. Sin embargo,VF2PostLayoutestá diseñado para ejecutarse después del diseño inicial, el enrutamiento, la traducción de bases y cualquier pase de optimización y sólo funcionará si ya se ha aplicado un diseño, el circuito ha sido enrutado y todas las puertas están en la base de destino. Esto es necesario para que, cuando se aplique un nuevo diseño, el circuito pueda seguir funcionando en el dispositivo de destino.VF2Layouten cambio, está diseñado para encontrar un trazado inicial perfecto y puede funcionar con cualquier circuito. -
El transpilador
ApplyLayouttranspiler pass ahora tiene soporte para actualizar un diseño en un circuito después de que un diseño se haya aplicado una vez antes. Si el campopost_layoutestá presente (además del campo obligatoriolayout) elproperty_setcuando se ejecute elApplyLayoutpass actualizará el diseño para aplicar el nuevo diseño. Esto devolverá unDAGCircuitcon los qubits en el nuevo orden físico y el conjunto de propiedadeslayoutse actualizará para que asigne los qubits virtuales del diseño original a los qubits físicos en el nuevo campopost_layout. -
Los gestores de pases preestablecidos generados por
level_1_pass_manager(),level_2_pass_manager()ylevel_3_pass_manager()que corresponden aoptimization_level1, 2 y 3 respectivamente en la funcióntranspile()ejecutan ahora el paseVF2PostLayoutpase después de ejecutar el pase de enrutamiento. Esto permite al transpilador encontrar potencialmente un conjunto diferente de qubits físicos en el backend de destino para ejecutar el circuito en el que tienen menores tasas de error. El paseVF2PostLayoutpass no se ejecutará si especifica manualmente un argumentolayout_method,routing_method, oinitial_layoutatranspile(). Si el paso puede encontrar un subconjunto de qubits de mejor rendimiento en el backend para ejecutar el circuito físico, ajustará la disposición del circuito para utilizar los qubits alternativos en su lugar. -
El algoritmo calcula iterativamente cada estado propio partiendo del estado base (que se calcula como en VQE) y optimizando una función de coste modificada que intenta calcular los estados propios que son ortogonales a los estados calculados en las iteraciones anteriores y tienen la energía más baja cuando se calculan sobre el ansatz. La interfaz implementada es muy similar a la de VQE y es de la forma:
from qiskit.algorithms import VQD from qiskit.utils import QuantumInstance from qiskit.circuit.library import TwoLocal from qiskit.algorithms.optimizers import COBYLA from qiskit import BasicAer from qiskit.opflow import I,Z,X h2_op = ( -1.052373245772859 * (I ^ I) + 0.39793742484318045 * (I ^ Z) - 0.39793742484318045 * (Z ^ I) - 0.01128010425623538 * (Z ^ Z) + 0.18093119978423156 * (X ^ X) ) vqd = VQD(k =2, ansatz = TwoLocal(rotation_blocks="ry", entanglement_blocks="cz"),optimizer = COBYLA(maxiter = 0), quantum_instance = QuantumInstance( BasicAer.get_backend("qasm_simulator"), shots = 2048) ) vqd_res = vqd.compute_eigenvalues(op)Este fragmento de código en particular genera 2 valores propios (tierra y 1er estado excitado) También se han implementado pruebas.
Notas de actualización
-
Las clases de pulso en
qiskit.pulse.libraryson ahora subclases deSymbolicPulseen lugar deParametricPulse. Las clases disponibles siguen siendoGaussian,GaussianSquare,DragyConstant.SymbolicPulsetiene plena compatibilidad con versiones anteriores, y no debería haber pérdida de funcionalidad. -
El tipo de datos de cada elemento de
QuantumCircuit.dataha cambiado. Solía ser una simple 3-tupla de unInstructionuna lista deQubity una lista deClbits, mientras que ahora es una instancia deCircuitInstruction.Los atributos de esta nueva clase son
operation,qubitsyclbitscorrespondientes a los elementos de la tupla anterior. Sin embargoqubitsyclbitsson ahora instancias detuple, nolists.Esta nueva clase se comportará exactamente igual que la antigua 3-tupla si se intenta acceder a su índice sus elementos, o iterar a través de ella. Esto incluye el lanzamiento del
qubitsyclbitsa listas. Esto es para ayudar a la compatibilidad con versiones anteriores. A partir de Qiskit Terra 0.21, esta ya no es la forma preferida de acceder a estos elementos. En su lugar, debe utilizar la forma de acceso a atributos descrita anteriormente.Esto se ha hecho para permitir futuros desarrollos de la
QuantumCircuitestructura de datos en Terra, sin romper constantemente la compatibilidad hacia atrás. Entre los avances previstos figuran los circuitos dinámicos parametrizados y una reducción general del uso de memoria de los circuitos profundos. -
La dependencia
python-constraint, que es utilizada únicamente por elCSPLayoutya no figura en la lista de requisitos del paquete Qiskit Terra. Esto se debe a que elCSPLayoutpass ya no se utiliza por defecto en ninguno de los gestores de pass predefinidos paratranspile(). Aunque el pase sigue disponible, si lo utilizas tendrás que instalar manualmentepython-contrainto cuando instalesqiskit-terrapuedes utilizar el extracsp-layout, por ejemplo:pip install "qiskit-terra[csp-layout]" -
La versión del formato QPY emitida por
qpy.dump()se ha aumentado a la versión 5. Esta nueva versión del formato es incompatible con las versiones anteriores y dará lugar a un error al intentar cargarlo con un deserializador que no sea capaz de manejar la versión 5 de QPY. Este cambio era necesario para fijar la compatibilidad con la representación adecuada de las puertas controladas y la representación de los estados de control no predeterminados. -
Las extensiones Rust compiladas de Qiskit Terra tienen ahora una versión Rust mínima soportada (MSRV) de 1.56.1. Esto significa que al compilar Qiskit Terra a partir del código fuente, la versión más antigua del compilador de Rust soportada es 1.56.1. Si utilizas una versión anterior del compilador de Rust, deberás actualizarla para poder seguir compilando Qiskit desde el código fuente. Este cambio era necesario ya que varias dependencias de la línea ascendente también han actualizado sus versiones mínimas compatibles.
-
La programación de circuitos ahora se ejecuta en paralelo cuando se proporciona más de un circuito a
schedule(). Consulte el nº 2695 para más detalles. -
Las clases anteriormente obsoletas
BaseBackend,BaseJob, yBaseProviderhan sido eliminadas. Originalmente estaban obsoletos en la versión 0.18.0. En lugar de estas clases debería utilizar las clases de interfaz de proveedores versionadas, siendo las últimasBackendV2,JobV1yProviderV1. -
Se ha eliminado el argumento
backend, anteriormente obsoleto, para el constructor delRZXCalibrationBuilderha sido eliminado. Originalmente fue obsoleto en la versión 0.19.0. En su lugar, debe consultar el objetoBackendel objetoinstruction_schedule_mapyqubit_channel_mappingy pasarlo directamente al constructor. Por ejemplo, con unBackendV1backend:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.providers.fake_provider import FakeMumbai backend = FakeMumbai() inst_map = backend.defaults().instruction_schedule_map channel_map = backend.configuration().qubit_channel_mapping cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, )o con un
BackendV2backend:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.providers.fake_provider import FakeMumbaiV2 backend = FakeMumbaiV2() inst_map = backend.instruction_schedule_map channel_map = {bit: backend.drive_channel(bit) for bit in range(backend.num_qubits)} cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, ) -
Se ha eliminado el límite de disparos de medición para el backend
BasicAer. -
En el caso de
DAGNode, se han eliminado los kwargs y atributos anteriormente obsoletostype,op,qargs,cargsywire. En un principio, estaban obsoletos en la versión 0.19.0. Sólo se puede acceder a los kwargs y atributosop,qargsycargsen instancias deDAGOpNode, y al kwarg y atributowireen instancias deDAGInNodeoDAGOutNode. -
Se ha eliminado la función obsoleta
pauli_group(). Originalmente estaba obsoleto en Qiskit Terra 0.17. -
Se han eliminado varios métodos obsoletos en
Paulique originalmente estaban obsoletos en Qiskit Terra 0.17. Estos fueron:sgn_prodUtilice
Pauli.compose()oPauli.dot()en su lugar.to_spmatrixUtilice
Pauli.to_matrix()con el argumentosparse=True.kronUtilice
Pauli.expand()pero tenga en cuenta que devuelve un nuevo objeto, en lugar de mutar el existente.update_zyupdate_xEstablezca directamente los atributos
zyxdel objeto.insert_paulisUtilice
Pauli.insert().append_paulisUtilice
Pauli.expand().delete_qubitsUtilice
Pauli.delete().pauli_singleConstruir la etiqueta manualmente y pasarla directamente al inicializador, como:
Pauli("I" * index + pauli_label + "I" * (num_qubits - index - len(pauli_label)))randomUtilice
quantum_info.random_pauli()en su lugar. -
Se ha eliminado el método
optimizede las clasesOptimizerque ha sido sustituido por el métodominimize()en sustitución directa. La única excepción esSPSAdonde la advertencia de desaprobación no se activó, por lo que el método se mantiene. -
Resultse ha modificado para que contenga siempre los atributosdate,status, yheader(fijado enNonesi no se especifica). -
Para Python 3.7 shared-memory38 es ahora una dependencia. Se añadió como dependencia de Python 3.7 para poder aprovechar las construcciones de memoria compartida de la biblioteca estándar de las versiones más recientes de Python. Si utiliza Python >= 3.8, no necesitará ninguna dependencia adicional.
-
Instructionlas etiquetas se comprueban ahora al crear la instrucción. -
La serialización QPY se ha actualizado para serializar
QuantumCircuitconQuantumCircuit.calibrations. A partir de la versión 5 de QPY, sólo las entradas de calibración deScheduleBlockpueden serializarse. -
La definición de
XXPlusYYGatese ha modificado. Consulte el nº 7969 para más detalles. -
Los gestores de pases preestablecidos generados por
level_1_pass_manager(),level_2_pass_manager()ylevel_3_pass_manager()y utilizados por el argumentotranspile()optimization_levelen 1, 2 y 3, respectivamente, ya no establecen un límite de tiempo estricto para elVF2Layoutpase del transpilador. Esto significa que el pase ya no dejará de intentar encontrar un trazado perfecto alternativo mejor hasta un límite de tiempo fijo ( 100ms para el nivel 1, 10 seg para el nivel 2 y 60 seg para el nivel 3), ya que hacer esto limitaba la reproducibilidad de la compilación cuando se disponía de un trazado perfecto. Esto significa que la salida al utilizar el pase podría ser diferente que antes, aunque en todos los casos sólo cambiaría si se puede encontrar un conjunto de qubits con menos ruido que la salida anterior. Si desea conservar el comportamiento anterior, puede crear una función personalizadaPassManagerque establezca el argumentotime_limiten el constructor para el paseVF2Layout.
Notas sobre características en desuso
-
La llamada a
timeline_drawer()con un circuito no programado ha quedado obsoleto. Todos los circuitos, incluso los que constan sólo de instrucciones de retardo, deben transpilarse con el argumento de palabra clavescheduling_methoddetranspile()set, para generar la información de programación que se almacena enQuantumCircuit.op_start_times. -
Las funciones de conversión NetworkX para
DAGCircuit.to_networkx()yfrom_networkx(), junto con el métodoDAGDependency.to_networkx()han quedado obsoletos y se eliminarán en una futura versión. Qiskit ha estado utilizando retworkx como su biblioteca de grafos desde la versión qiskit-terra 0.12.0, y desde entonces las funciones de conversión de networkx han sido con pérdidas. Se añadieron originalmente para que los usuarios pudieran aprovechar la funcionalidad de la biblioteca de algoritmos NetworkX’s que no está presente en retworkx. Desde entonces, retworkx ha madurado y ofrece más funcionalidades, y elDAGCircuitestá estrechamente acoplado a retworkx para su funcionamiento. Estos métodos de conversión tienen un valor limitado de cara al futuro, por lo que se eliminarán en una próxima versión. -
El acceso a varios toggles antiguos (
HAS_MATPLOTLIB,HAS_PDFTOCAIRO,HAS_PYLATEXyHAS_PIL) desde el móduloqiskit.visualizationestá obsoleto, y estas rutas de importación serán eliminadas en una futura versión de Qiskit Terra. En su lugar, se debería acceder a los mismos objetos a través deqiskit.utils.optionalsque contiene comprobadores para casi todas las dependencias opcionales de Terra. -
El módulo
qiskit.test.mockha quedado obsoleto. Las clases de falso backend y falso proveedor que antes estaban disponibles enqiskit.test.mockson accesibles enqiskit.providers.fake_providerdesde Terra 0.20.0. Este cambio representa un compromiso adecuado para dar soporte a las clases backend falsas como parte de Qiskit, mientras que antes sólo formaban parte del conjunto de pruebas internas, y se exponían a los usuarios como un efecto secundario. -
Los nombres de los argumentos cuando se llama a una función
EstimatoroSamplercomo función pasan de llamarsecircuit_indicesyobservable_indicesacircuitsyobservables. -
Los argumentos de palabra clave
qobj_idyqobj_headerpara la funciónexecute()han quedado obsoletos y se eliminarán en una futura versión. Desde la eliminación de la claseBaseBackendestos argumentos no tienen ningún efecto ya que ningún backend soporta la ejecución con un objetoQobjdirectamente y en su lugar sólo trabajan con objetosQuantumCircuitdirectamente. -
Los argumentos
x,zylabeldel inicializador dePauliestaban documentados como obsoletos en Qiskit Terra 0.17, pero un error impidió que se mostrara la advertencia esperada en tiempo de ejecución. La advertencia se mostrará ahora correctamente, y los argumentos se eliminarán en Qiskit Terra 0.23 o posterior. Un par dexyzdebe pasarse posicionalmente como una única tupla (Pauli((z, x))). Una cadenalabeldebe pasarse posicionalmente en el primer argumento (Pauli("XYZ")). -
El método
SPSA.optimize()está obsoleto en favor deSPSA.minimize()que puede utilizarse como sustituto directo. Tenga en cuenta que este método devuelve un objeto de resultado completo con más información que antes disponible. -
El argumento
circuitsdeqpy.dump()ha sido obsoleto y sustituido porprogramsya que ahora QPY soporta múltiples tipos de datos además de circuitos. -
AlignmentKind.to_dict()ha quedado obsoleto y será eliminado.
Corrección de errores
-
Se ha añadido una validación adicional a
DiagonalGatepara comprobar que el argumento tiene módulo uno. -
Los índices de qubits duplicados dados a
SparsePauliOp.from_sparse_list()provocarán un error, en lugar de sobrescribir silenciosamente los valores anteriores. Se puede acceder al comportamiento antiguo pasando el argumento de palabra clave nuevodo_checks=False. -
La visualización
timeline_drawer()visualización ya no desalineará las ranuras de registro clásicas. -
La validación de parámetros para
GaussianSquarees ahora coherente antes y después de la construcción. Consulte el nº 7882 para más detalles. -
El
BackendV2-basado en backends falsos en el móduloqiskit.providers.fake_providercomoFakeMontrealV2soportan ahora la operaciónDelayen sus atributostargetatributos. Anteriormente,QuantumCircuitlos objetos que contenían retardos no podían compilarse en estos backends. -
Se ha corregido un error en
TridiagonalToeplitz.eigs_bounds(), que provocaba que se devolvieran límites de valores propios incorrectos en algunos casos con valores propios negativos. Consulte el nº 7939 para más detalles. -
Se ha corregido un error por el que el cajón LaTeX statevector ignoraba el parámetro
max_size. -
Soporte fijo en el método
PassManagerConfig.from_backend()para construir un objetoPassManagerConfiga partir de unaBackendV2instancia. Anteriormente esto no se manejaba correctamente y fallaba cuando se ejecutaba con unBackendV2objeto. -
Corregido el soporte para la serialización (
qpy.dump()) y deserialización (qpy.load()) de un objetoQuantumCircuitque contiene objetosControlledGatepersonalizados. Anteriormente, se producía una excepciónqpy.load()al intentar reconstruir el archivo personalizadoControlledGate. Corregido #7999. -
Corregido el soporte para la serialización (
qpy.dump()) y deserialización (qpy.load()) de un objetoQuantumCircuitque contiene objetosMCPhaseGatepersonalizados. Anteriormente, se producía una excepciónqpy.load()al intentar reconstruir el archivoMCPhaseGate. -
Corregido el soporte para la serialización (
qpy.dump()) y deserialización (qpy.load()) de un objetoQuantumCircuitque contiene puertas controladas con un estado de control abierto. Antes, el estado de control abierto se perdía por el proceso de serialización y el circuito reconstruido. -
Fijo
QuantumCircuit.reverse_bits()con circuitos sin registroQubityClbit. Por ejemplo, ahora funcionará lo siguiente:from qiskit.circuit import QuantumCircuit, Qubit, Clbit qc = QuantumCircuit([Qubit(), Clbit()]) qc.h(0).c_if(qc.clbits[0], 0) qc.reverse_bits() -
Se ha corregido el atributo
ConfigurableFakeBackend.t2, que anteriormente se establecía incorrectamente en función del valor proporcionado ent1. -
Se ha solucionado un problema con
BackendV2-basado en clases backend falsas del móduloqiskit.providers.fake_providercomoFakeMontrealV2donde el valor del atributodt(y el atributoTarget.dtno se convertían correctamente a segundos. Esto causaría problemas al utilizar estos backends falsos con la programación. -
Se ha corregido un error en
plot_histogram()cuando el argumentonumber_to_keepera menor que el número de claves. El siguiente código ya no arrojará errores y estará correctamente alineado:from qiskit.visualization import plot_histogram data = {'00': 3, '01': 5, '11': 8, '10': 11} plot_histogram(data, number_to_keep=2) -
Mejora el rendimiento de la construcción y el trabajo con instancias parametrizadas
QuantumCircuitcon muchas puertas que comparten un número relativamente pequeño de parámetros. -
El exportador OpenQASM 3 (
qiskit.qasm3) ya no intentará producir definiciones para puertas no estándar en la opciónbasis_gates. -
Corregido el getter de
OptimizerResult.nitque antes devolvía el número de evaluaciones jacobianas en lugar del número de iteraciones. -
Se ha corregido un error en la representación de cadenas de
Resultque provocaba que los atributos se especificaran incorrectamente. -
Se ha solucionado un problema con
transpile()por el que, en algunos casos, al proporcionar una lista de cadenas de compuertas base con el argumento de la palabra clavebasis_gateso implícitamente a través de una entradaTargetmediante el argumento de palabra clavetargetno se interpretaba correctamente y daba lugar a que se utilizara un subconjunto de las compuertas de la lista para cada circuito. -
Se ha corregido un problema en el
UnitarySynthesisque provocaba un error cuando se especificaba un objetivoTargetque no tenía ninguna restricción de qubits en las operaciones (por ejemplo, en el caso de un objetivo de simulador ideal) se especificaba con el argumento de palabra clavetargetpara el constructor. -
El método
qiskit.result.marginal_counts()cuando se le pasa unResultdesde un backend pulse, fallaría, porque contiene una matriz de objetosExperimentResult, cada uno de los cuales tiene unQobjExperimentHeader, y esosExperimentHeaderscarecen de variables de instancia creg_sizes. SiResultprocede de un backend de simulador (por ejemplo, Aer), esa variable de instancia estaría allí. Arreglamosmarginal_countspara que omita la lógica que necesita creg_sizes si el campo no está presente, o no es None. -
El exportador OpenQASM 2 (
QuantumCircuit.qasm()) definirá ahora correctamente los parámetros de los qubits para las operacionesUnitaryGateque no afectan a todos los qubits sobre los que se definen. Corregido #8224. -
Se ha corregido un problema de reproducibilidad de la función
transpile()cuando se ejecutaba conoptimization_level1, 2 y 3. Anteriormente, en algunas condiciones, cuando había varios diseños perfectos (un diseño que no requiere ninguna puerta SWAP) disponibles, el diseño seleccionado y el circuito de salida podían variar independientemente de si se establecía el argumentoseed_transpiler.
Aer 0.10.4
No cambia
IBM Proveedor Q 0.19.2
Corrección de errores
- En la próxima versión de terra habrá una versión candidata etiquetada antes de la versión final. Sin embargo, el cambio de la cadena de versión para el paquete está bloqueado en el qiskit-ibmq-provider en este momento porque está tratando de analizar la versión y está asumiendo que no habrá sufijo prelease en la cadena de versión (ver #8200 para más detalles). PR #1135 corrige este parseo de versiones para usar la regex del proyecto pypa/packaging que maneja todas las versiones de paquetes PEP440 incluyendo sufijos de pre-lanzamiento. Esto permitirá a terra liberar una etiqueta 0.21.0rc1 sin romper el qiskit-ibmq-provider.
threading.currentThreadynotifyAllquedaron obsoletos en Python 3.10 (octubre de 2021) y se eliminarán en Python 3.12 (octubre de 2023). PR #1133 los sustituye porthreading.current_thread,notify_allañadido en Python 2.6 (octubre de 2008).