Notas de la versión de Qiskit 0.25
0.25.4
Terra 0.17.2
Preludio
Se trata de una versión de corrección de errores que soluciona varios problemas de la versión 0.17.1. Lo más importante es que esta versión corrige la compatibilidad de la clase QuantumInstance cuando se ejecuta en backends basados en la clase abstracta BackendV1 clase abstracta. Esto arregla todos los algoritmos y aplicaciones construidos en qiskit.algorithms o qiskit.opflow cuando se ejecutan en backends más recientes.
Corrección de errores
- Se ha corregido un problema con el
BasisTranslatorque, en algunos casos, traducía las puertas que ya estaban en la base de destino. Esto podría dar lugar tanto a un mayor tiempo de ejecución como a resultados menos óptimos. Corregido #6085 - Se ha corregido un problema en
SPSAcuando el optimizador se inicializaba con una función de devolución de llamada a través del kwargcallbackque podía provocar un error. - Se ha corregido un problema en el
qiskit.quantum_info.Statevector.expectation_value()yqiskit.quantum_info.DensityMatrix.expectation_value`methods where the ``qargs`()se ignoraba si el operador era unPaulioSparsePauliOpobjeto operador. Corregido #6303 - Se ha corregido un problema en el método
qiskit.quantum_info.Pauli.evolve()que podía dar lugar a que se devolviera el Pauli incorrecto cuando se evolucionaba mediante un métodoCZGate,CYGateo unaSwapGatepuerta. - Se ha corregido un problema en el método
qiskit.opflow.SparseVectorStateFn.to_dict_fn(), que anteriormente tenía como máximo una entrada para el estado todo cero debido a un error de índice. - Se ha corregido un problema en el método
qiskit.opflow.SparseVectorStateFn.equals()para que devuelva correctamenteTrueoFalseen lugar de una comparación de vectores dispersos de los elementos individuales. - Corrige un problema en el
StatevectoryDensityMatrixmétodos de probabilidadqiskit.quantum_info.Statevector.probabilities(),qiskit.quantum_info.Statevector.probabilities_dict(),qiskit.quantum_info.DensityMatrix.probabilities(),qiskit.quantum_info.DensityMatrix.probabilities_dict()donde las probabilidades devueltas podrían tener un orden incorrecto para ciertos valores delqargskwarg. Corregido #6320 - Se ha solucionado un problema por el que la clase
TaperedPauliSumOpno soportaba la multiplicación conParameterExpressiony tampoco tenía un métodoassign_parameters()necesario para trabajar con objetosParameterExpressionobjetos. Corregido #6127 - Se ha corregido la compatibilidad de la clase
QuantumInstancecuando se ejecuta en backends basados en la claseBackendV1clase abstracta. Corregido #6280
Aer 0.8.2
No cambia
Ignis 0.6.0
No cambia
Aqua 0.9.1
No cambia
IBM Proveedor Q 0.12.3
No cambia
0.25.3
Terra 0.17.1
No cambia
Aer 0.8.2
Problemas conocidos
- Los
SaveExpectationValueySaveExpectationValueVariancehan sido desactivados para el método extended_stabilizer de losQasmSimulatoryAerSimulatordebido a que devuelven el valor incorrecto para ciertos componentes del operador Pauli. Consulte #1227 <https://github.com/Qiskit/qiskit-aer/issues/1227> para obtener más información y ejemplos.
Corrección de errores
- Se soluciona un problema de rendimiento relacionado con la configuración del atributo
basis_gates. Anteriormente se producían efectos secundarios no deseados en la clase backend que podían hacer que el tiempo de ejecución de la simulación repetida aumentara de forma incremental. Consulte la página #1229 <https://github.com/Qiskit/qiskit-aer/issues/1229> para obtener más información y ejemplos. - Se corrige un error con la instrucción del simulador
"multiplexer"por el que el orden de los qubits de destino y control se invertía con respecto al orden de la instrucción Qiskit. - Corrige un error introducido en 0.8.0 por el que las simulaciones de GPU asignaban memoria host innecesaria además de la memoria de GPU.
- Corrige un error en el método del simulador
stabilizerde losQasmSimulatoryAerSimulatorpor el que el valor de la expectativa para lossave_expectation_valueysnapshot_expectation_valuepodía tener el signo equivocado para ciertosYPauli.
Ignis 0.6.0
No cambia
Aqua 0.9.1
No cambia
IBM Proveedor Q 0.12.3
No cambia
0.25.2
Terra 0.17.1
No cambia
Aer 0.8.1
No cambia
Ignis 0.6.0
No cambia
Aqua 0.9.1
No cambia
IBM Proveedor Q 0.12.3
Otras notas
- El atributo
qiskit.providers.ibmq.experiment.analysis_result.AnalysisResultfites ahora opcional.
0.25.1
Terra 0.17.1
Preludio
Se trata de una versión de corrección de errores que soluciona varios problemas de la versión 0.17.0. Lo más importante es que esta versión corrige la construcción incorrecta del paquete sdist de la versión 0.17.0, que no era realmente compilable y bloqueaba la instalación en plataformas sin binarios precompilados disponibles.
Corrección de errores
-
Se ha corregido un problema por el que el atributo
global_phaseno se conservaba en el objeto de salidaQuantumCircuitcuando se llamaba al métodoqiskit.circuit.QuantumCircuit.reverse_bits()era llamado. Por ejemplo:import math from qiskit import QuantumCircuit qc = QuantumCircuit(3, 2, global_phase=math.pi) qc.h(0) qc.s(1) qc.cx(0, 1) qc.measure(0, 1) qc.x(0) qc.y(1) reversed = qc.reverse_bits() print(reversed.global_phase)ahora imprimirá correctamente .
-
Se ha corregido un problema por el que el pase del transpilador
Unrollerno preservaba la fase global en caso de instrucciones anidadas con una regla en su definición. Corregido #6134 -
Se ha corregido un problema por el que el atributo
parameterde un objetoControlledGateconstruido a partir deUnitaryGateno se establecía en la matriz unitaria del objetoUnitaryGate. Anteriormente,control()construía unaControlledGatecon el atributoparameterfijado en la versión controlada de la matrizUnitaryGate. Esto llevaría a una modificación de laparameterdel objeto baseUnitaryGatey las subsiguientes llamadas ainverse()se creaba la inversa de unUnitaryGatede doble control. Corregido #5750 -
Se ha solucionado un problema con los gestores de pases predefinidos
level_0_pass_managerylevel_1_pass_manager(que corresponden aoptimization_level0 y 1 paratranspile()) donde en algunos casos producían circuitos que no estaban en la base solicitada. -
Se ha corregido un error por el que al utilizar
SPSAcon calibración automática de la tasa de aprendizaje y la perturbación (es decirlearning_rateyperturbationsonNoneen el inicializador), almacena la calibración para todas las optimizaciones futuras. En cambio, la calibración debe hacerse para cada nueva función objetivo.
Aer 0.8.1
Corrección de errores
- Se ha solucionado un problema con el uso del método
matrix_product_statede los simuladoresAerSimulatoryQasmSimulatoral ejecutar una simulación ruidosa con errores de Kraus. Anteriormente, el método de simulación de estado de producto matricial no propagaba los cambios a los qubits vecinos tras aplicar la matriz de Kraus. Se ha corregido para que el resultado de la simulación sea correcto. Corregido #1184 y #1205 - Se ha solucionado un problema por el que la instrucción
qiskit.extensions.Initializedesactivaba la optimización del muestreo de medidas para los métodos de simulaciónstatevectorymatrix_product_statede los simuladoresAerSimulatoryQasmSimulator, incluso cuando era la primera instrucción de circuito o se aplicaba a todos los qubits y, por tanto, era determinista. Corregido #1210 - Se soluciona un problema con las instrucciones
SaveStatevectorySnapshotStatevectorcuando se utilizan con el método de simulaciónextended_stabilizerde los simuladoresAerSimulatoryQasmSimulator, que devolvían un vector de estado no normalizado. Corregido #1196 - El método de simulación
matrix_product_stateahora tiene soporte para su instrucción de estado previamente ausente,qiskit.providers.aer.library.SetMatrixProductState, que permite establecer el estado de una simulación en un circuito.
Ignis 0.6.0
No cambia
Aqua 0.9.1
IBM Proveedor Q 0.12.2
No cambia
0.25.0
Esta versión deja oficialmente obsoleto el proyecto Qiskit Aqua. En consecuencia, en una futura versión el paquete qiskit-aqua se eliminará del metapaquete Qiskit, lo que significa que en esa futura versión pip install qiskit ya no incluirá qiskit-aqua. Los módulos de aplicación que proporciona qiskit-aqua se han dividido en varios paquetes nuevos: qiskit-optimization, qiskit-nature, qiskit-machine-learning, y qiskit-finance. Estos paquetes pueden instalarse por sí solos (mediante el comando estándar pip install, por ejemplo pip install qiskit-nature) o con el resto del metapaquete Qiskit como extras opcionales (p. ej. pip install 'qiskit[finance,optimization]' o pip install 'qiskit[all]' Los algoritmos centrales y el flujo de operadores existen ahora como parte de qiskit-terra en qiskit.algorithms y qiskit.opflow. Dependiendo del uso que hagas de Aqua, deberás utilizar los paquetes de la aplicación o los nuevos módulos de Qiskit Terra. Para más detalles sobre cómo migrar desde Qiskit Aqua, puedes consultar la guía de migración.
Terra 0.17.0
Preludio
Qiskit Terra 0.17.0 incluye muchas funciones nuevas y correcciones de errores. La principal novedad de esta versión es la introducción de la función qiskit.algorithms y qiskit.opflow migrados y adaptados del proyecto qiskit.aqua .
Nuevas funciones
-
La función
qiskit.pulse.call()ahora puede tomar unParameterjunto con una subrutina parametrizada. Esto permite asignar valores diferentes a losParameterobjetos para cada llamada de subrutina.Por ejemplo:
from qiskit.circuit import Parameter from qiskit import pulse amp = Parameter('amp') with pulse.build() as subroutine: pulse.play(pulse.Gaussian(160, amp, 40), DriveChannel(0)) with pulse.build() as main_prog: pulse.call(subroutine, amp=0.1) pulse.call(subroutine, amp=0.3) -
El
qiskit.providers.models.QasmBackendConfigurationtiene un nuevo campoprocessor_typeque puede utilizarse opcionalmente para proporcionar información sobre el procesador de un backend de la forma:{"family": <str>, "revision": <str>, segment: <str>}. Por ejemplo:{"family": "Canary", "revision": "1.0", segment: "A"}. -
Las clases
qiskit.pulse.Scheduleqiskit.pulse.Instructionyqiskit.pulse.Channeltienen ahora una propiedadparameterque devolverá cualquier objetoParameterutilizados en el objeto y un métodois_parameterized()que devolveráTruesi se utiliza algún parámetro en el objeto.Por ejemplo:
from qiskit.circuit import Parameter from qiskit import pulse shift = Parameter('alpha') schedule = pulse.Schedule() schedule += pulse.SetFrequency(shift, pulse.DriveChannel(0)) assert schedule.is_parameterized() == True print(schedule.parameters) -
Se ha añadido un
PiecewiseChebysheva la funciónqiskit.circuit.librarypara implementar una aproximación Chebyshev a trozos de una función de entrada. Para una función dada y un grado , esta clase implementa una aproximación Chebyshev polinómica a trozos en qubits a en los intervalos dados. Todos los polinomios de la aproximación son de grado .Por ejemplo:
import numpy as np from qiskit import QuantumCircuit from qiskit.circuit.library.arithmetic.piecewise_chebyshev import PiecewiseChebyshev f_x, degree, breakpoints, num_state_qubits = lambda x: np.arcsin(1 / x), 2, [2, 4], 2 pw_approximation = PiecewiseChebyshev(f_x, degree, breakpoints, num_state_qubits) pw_approximation._build() qc = QuantumCircuit(pw_approximation.num_qubits) qc.h(list(range(num_state_qubits))) qc.append(pw_approximation.to_instruction(), qc.qubits) qc.draw(output='mpl') -
La clase
BackendPropertiestiene ahora un métodoreadout_length()que devuelve la longitud de lectura [sec] del qubit dado. -
Se ha añadido una nueva clase
ScheduleBlockse ha añadido al móduloqiskit.pulsemódulo. Esta clase proporciona una nueva representación de un programa de impulsos. Esta representación es la más adecuada para la sintaxis del constructor de impulsos y se basa en el orden relativo de las instrucciones.Esta representación toma
alignment_contexten lugar de especificar el tiempo de iniciot0para cada instrucción. La hora de inicio de la instrucción se asigna implícitamente con la transformación especificada y la posición relativa de las instrucciones.El sitio
ScheduleBlockpermite la programación perezosa de instrucciones, lo que significa que podemos asignar parámetros arbitrarios a la duración de las instrucciones.Por ejemplo:
from qiskit.pulse import ScheduleBlock, DriveChannel, Gaussian from qiskit.pulse.instructions import Play, Call from qiskit.pulse.transforms import AlignRight from qiskit.circuit import Parameter dur = Parameter('rabi_duration') block = ScheduleBlock(alignment_context=AlignRight()) block += Play(Gaussian(dur, 0.1, dur/4), DriveChannel(0)) block += Call(measure_sched) # subroutine defined elsewhereeste código define un experimento que explora la duración de un pulso gaussiano seguido de una medición
measure_sched, es decir, un experimento Rabi. Puede reutilizar el objetoblockpara cada duración escaneada asignando un valor de duración objetivo. -
Se ha añadido una nueva función
array_to_latex()al móduloqiskit.visualizationque puede utilizarse para representar y visualizar vectores y matrices con LaTeX.from qiskit.visualization import array_to_latex from numpy import sqrt, exp, pi mat = [[0, exp(pi*.75j)], [1/sqrt(8), 0.875]] array_to_latex(mat) -
En
StatevectoryDensityMatrixtienen ahora métodosdraw()que permiten dibujar objetos como matrices de texto, objetos IPython Latex, fuentes Latex, esferas Q, esferas Bloch y gráficos Hinton. Por defecto, el tipo de salida es el equivalente a la salida de__repr__, pero este valor predeterminado se puede cambiar en un archivo de configuración de usuario estableciendo la opciónstate_drawer. Por ejemplo:from qiskit.quantum_info import DensityMatrix dm = DensityMatrix.from_label('r0') dm.draw('latex')from qiskit.quantum_info import Statevector sv = Statevector.from_label('+r') sv.draw('qsphere')Además, el método
draw()se utiliza ahora para la visualización en ipython de estas clases, por lo que si cambia el tipo de salida por defecto en un archivo de configuración de usuario, entonces cuando aparezca un métodoStatevectoro un objetoDensityMatrixen un cuaderno jupyter se utilizará ese tipo de salida para el objeto. -
Pulso
qiskit.pulse.Instructionobjetos y objetos de pulso paramétrico (por ejemploGaussianahora soportan el uso deParameteryParameterExpressionpara el parámetroduration. Por ejemplo:from qiskit.circuit import Parameter from qiskit.pulse import Gaussian dur = Parameter('x_pulse_duration') double_dur = dur * 2 rx_pulse = Gaussian(dur, 0.1, dur/4) double_rx_pulse = Gaussian(double_dir, 0.1, dur/4)Observe que, aunque podemos crear una instrucción con un parámetro
duration, la adición de una instrucción con un parámetro no enlazadodurationa un programa sólo es posible mediante la representación recién introducidaScheduleBlock. Consulte la sección de notas de la versión sobre problemas conocidos para obtener más información. -
El método
run()método para elQasmSimulatorPy,StatevectorSimulatorPyyUnitarySimulatorPytoma ahora unQuantumCircuit(o una lista de objetosQuantumCircuitcomo entrada. El objetoQasmQobjsigue siendo compatible por ahora, pero será obsoleto en una futura versión.Para ver un ejemplo de cómo utilizarlo, consulte:
from qiskit import transpile, QuantumCircuit from qiskit.providers.basicaer import BasicAer backend = BasicAer.get_backend('qasm_simulator') circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() tqc = transpile(circuit, backend) result = backend.run(tqc, shots=4096).result() -
El
CommutativeCancellationtranspiler pass tiene un nuevo kwarg opcional en el constructorbasis_gates, que toma una lista de nombres de puertas base para el backend de destino. Cuando se especifica, el pase sólo utilizará las puertas en el kwargbasis_gates. Anteriormente, el pase sustituía automáticamente las puertas consecutivas que conmutan conZGatepor laU1Gateincondicionalmente. El kwargbasis_gatesle permite especificar qué puertas de rotación z están presentes en la base de destino para evitar esto. -
Los constructores de la
Bity subclases,Qubit,ClbityAncillaQubitse han actualizado para que sus dos parámetros,registeryindex, sean opcionales. Esto permite crear objetos de bits independientes de un registro. -
Se ha añadido una nueva clase
BooleanExpressionse ha añadido al móduloqiskit.circuit.classicalfunctionmódulo. Esta clase permite crear un oráculo a partir de una expresión booleana Python. Por ejemplo:from qiskit.circuit import BooleanExpression, QuantumCircuit expression = BooleanExpression('~x & (y | z)') circuit = QuantumCircuit(4) circuit.append(expression, [0, 1, 2, 3]) circuit.draw('mpl')circuit.decompose().draw('mpl')El sitio
BooleanExpressiontambién incluye un métodofrom_dimacs_file()que permite cargar fórmulas descritas en el formato DIMACS-CNF. Por ejemplo:from qiskit.circuit import BooleanExpression, QuantumCircuit boolean_exp = BooleanExpression.from_dimacs_file("simple_v3_c2.cnf") circuit = QuantumCircuit(boolean_exp.num_qubits) circuit.append(boolean_exp, range(boolean_exp.num_qubits)) circuit.draw('text')┌───────────────────┐ q_0: ┤0 ├ │ │ q_1: ┤1 ├ │ SIMPLE_V3_C2.CNF │ q_2: ┤2 ├ │ │ q_3: ┤3 ├ └───────────────────┘circuit.decompose().draw('text')q_0: ──o────o──────────── │ │ q_1: ──■────o────■─────── │ │ │ q_2: ──■────┼────o────■── ┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐ q_3: ┤ X ├┤ X ├┤ X ├┤ X ├ └───┘└───┘└───┘└───┘ -
Se ha añadido una nueva clase,
PhaseOracleque se ha añadido al móduloqiskit.circuit.librarymódulo. Esta clase permite construir circuitos de oráculo de fase a partir de Python expresiones booleanas.from qiskit.circuit.library.phase_oracle import PhaseOracle oracle = PhaseOracle('x1 & x2 & (not x3)') oracle.draw('mpl')Estos oráculos de fase pueden utilizarse como parte de un algoritmo más amplio, por ejemplo con
qiskit.algorithms.AmplificationProblem:from qiskit.algorithms import AmplificationProblem, Grover from qiskit import BasicAer backend = BasicAer.get_backend('qasm_simulator') problem = AmplificationProblem(oracle, is_good_state=oracle.evaluate_bitstring) grover = Grover(quantum_instance=backend) result = grover.amplify(problem) result.top_measurementLa clase
PhaseOracletambién incluye un métodofrom_dimacs_file()que permite construir un oráculo de fase a partir de un fichero que describe una fórmula en formato DIMACS-CNF.from qiskit.circuit.library.phase_oracle import PhaseOracle oracle = PhaseOracle.from_dimacs_file("simple_v3_c2.cnf") oracle.draw('text')state_0: ─o───────o────────────── │ ┌───┐ │ ┌───┐ state_1: ─■─┤ X ├─■─┤ X ├─■────── │ └───┘ └───┘ │ ┌───┐ state_2: ─■───────────────o─┤ Z ├ └───┘ -
Todos los pases del transpilador (es decir, cualquier instancia de
BasePass) son ahora directamente invocables. Llamar a un pass proporciona una interfaz conveniente para ejecutar el pass en unQuantumCircuitobjeto.Por ejemplo, la ejecución de una sola pasada de transformación, como
BasisTranslatorse puede hacer confrom qiskit import QuantumCircuit from qiskit.transpiler.passes import BasisTranslator from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel circuit = QuantumCircuit(1) circuit.h(0) pass_instance = BasisTranslator(sel, ['rx', 'rz', 'cx']) result = pass_instance(circuit) result.draw(output='mpl')Al ejecutar un pase de análisis, es necesario añadir como parámetro un conjunto de propiedades (como
dicto comoPropertySet) que puede modificarse "in situ". Por ejemplo:from qiskit import QuantumCircuit from qiskit.transpiler.passes import Depth circuit = QuantumCircuit(1) circuit.h(0) property_set = {} pass_instance = Depth() pass_instance(circuit, property_set) print(property_set) -
La clase
QasmQobjConfigtiene ahora un kwarg opcional parameas_levelymeas_return. Estos campos pueden utilizarse para generarQasmQobjcargas de trabajo que admitanmeas_level=1(datos con kernel) para trabajos de circuito (anteriormente esto sólo se exponía paraPulseQobjobjetos). La funciónassemble()se ha actualizado para establecer este campo en los objetosQasmQobjobjetos que genera. -
Se ha añadido un nuevo
tensor()a la claseQuantumCircuitclase. Este método permite tensar otro circuito con un circuito existente. Este método funciona de forma análoga aqiskit.quantum_info.Operator.tensor()y es coherente con la convención little-endian de Qiskit.Por ejemplo:
from qiskit import QuantumCircuit top = QuantumCircuit(1) top.x(0); bottom = QuantumCircuit(2) bottom.cry(0.2, 0, 1); bottom.tensor(top).draw(output='mpl') -
La clase
qiskit.circuit.QuantumCircuitadmite ahora metadatos arbitrarios de forma libre con el atributometadataatributo. Un usuario (o programa construido sobreQuantumCircuit) puede adjuntar metadatos a un circuito para utilizarlos en su seguimiento. Por ejemplo:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, user_metadata_field_1='my_metadata', user_metadata_field_2='my_other_value')o:
from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2) qc.metadata = {'user_metadata_field_1': 'my_metadata', 'user_metadata_field_2': 'my_other_value'}Estos metadatos no se utilizarán para influir en la ejecución del circuito, sino que sólo se utilizan para el seguimiento del circuito durante la vida útil del objeto. El atributo
metadatapersistirá entre cualquier transformación de circuito, incluyendotranspile()yassemble(). La expectativa es que los proveedores asocien los metadatos al resultado que devuelven, de modo que los usuarios puedan filtrar los resultados en función de los metadatos del circuito del mismo modo que pueden hacerlo actualmente conQuantumCircuit.name. -
Añadir una nueva clase de operador
CNOTDihedralal móduloqiskit.quantum_infomódulo. Esta clase se utiliza para representar el grupo CNOT-Diédrico, que está generado por las puertas cuánticasCXGate,TGateyXGate. -
Añade un operador binario
&(__and__) a las subclasesBaseOperator(por ejemploqiskit.quantum_info.Operator) en el móduloqiskit.quantum_infomódulo. Esto es una forma abreviada de llamar a las clasescompose()(es decir,A & B == A.compose(B)).Por ejemplo:
import qiskit.quantum_info as qi qi.Pauli('X') & qi.Pauli('Y') -
Añade un operador binario
&(__and__) aqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixclases. Esto es una forma abreviada de llamar a las clasesevolve()(es decir,psi & U == psi.evolve(U)).Por ejemplo:
import qiskit.quantum_info as qi qi.Statevector.from_label('0') & qi.Pauli('X') -
Una nueva puerta de 2 qubits,
ECRGatela resonancia cruzada eco (ECR), se ha añadido al móduloqiskit.circuit.libraryjunto con el método correspondiente,ecr()para laQuantumCircuitclase. La puerta ECR son dos pulsos con unXGateentre ellos para el eco. Esta puerta es localmente equivalente a unaCXGate(puede convertirse en una CNOT con pre- o post-rotación local). Es la puerta nativa en el hardware actual de IBM y compilar a ella permite que las pre-/post-rotaciones se fusionen con el resto del circuito. -
Se ha añadido un nuevo kwarg
approximation_degreea la funcióntranspile()para permitir la compilación aproximada. Los valores válidos van de 0 a 1, y mayor significa menor aproximación. Se trata de un dial heurístico para experimentar con aproximaciones de circuitos. La interpretación concreta de este número se deja a cada pasada, que puede utilizarlo para realizar alguna versión aproximada de la pasada. Algunos ejemplos concretos son losUnitarySynthesispase o los o traductores a conjuntos de compuertas discretas. Si un pase no admite esta opción, implica una transformación exacta. -
Dos nuevos passess transpiler,
GateDirectionyqiskit.transpiler.passes.CheckGateDirectionse han añadido al móduloqiskit.transpiler.passesmódulo. Estos nuevos pases están pensados como sustitutos más generales deCXDirectionyCheckCXDirection(ambos obsoletos, véanse las notas de obsoletos para más detalles) que realizan la misma función pero funcionan con otras puertas además de con sóloCXGate. -
Cuando se ejecuta en Windows, la ejecución en paralelo con la función
parallel_map()(sigue desactivada por defecto). Para ello, puede establecerparallel = Trueen un archivo de configuración de usuario, o establecer la variable de entornoQISKIT_PARALLELenTRUE(esto también afectará atranspile()yassemble()que utilizanparallel_map()internamente). Es importante tener en cuenta que cuando se habilita el paralelismo en Windows hay limitaciones sobre cómo Python lanza procesos para Windows, ver la sección de Problemas Conocidos más abajo para más detalles sobre las limitaciones con la ejecución paralela en Windows. -
Se ha añadido una nueva función
hellinger_distance()para calcular la distancia de Hellinger entre dos distribuciones de recuentosqiskit.quantum_infomódulo. -
La función
decompose_clifford()del móduloqiskit.quantum_info(que utiliza internamente el métodoqiskit.quantum_info.Clifford.to_circuit()tiene un nuevo kwargmethodque permite seleccionar el método de síntesis utilizado, ya sea estableciéndolo en'AG'o'greedy'. Por defecto, para más de tres qubits se establece en'greedy', que utiliza una rutina de compilación codiciosa no óptima para la síntesis de elementos Clifford, de Bravyi et. al., que suele ofrecer un mejor coste CX que el método Aaronson-Gottesman utilizado anteriormente (para más de dos qubits). Puede utilizarmethodkwarg para volver al método Aaronson-Gottesman anterior por defecto configurandomethod='AG'. -
La clase
Initializedel móduloqiskit.extensionspuede construirse ahora utilizando un número entero. Los bits '1' del entero insertarán unResety unXGateen el circuito del qubit correspondiente. Esto se hará utilizando la convención estándar little-endian es qiskit, es decir, el bit más a la derecha del número entero se establecerá qubit 0. Por ejemplo, si se establece el parámetro enInitializeigual a5, los qubits 0 y 2 tendrán el valor 1.from qiskit.extensions import Initialize initialize = Initialize(13) initialize.definition.draw('mpl') -
La clase
Initializedel móduloqiskit.extensionspermite ahora construir directamente a partir de una etiqueta Pauli (de forma análoga al métodoqiskit.quantum_info.Statevector.from_label()). La etiqueta Pauli se refiere a los estados base de los estados propios de Pauli Z, X, Y. Estas etiquetas utilizan la notación estándar little-endian de Qiskit, por ejemplo una etiqueta de'01'inicializaría el qubit 0 a y el qubit 1 a .from qiskit.extensions import Initialize initialize = Initialize("10+-lr") initialize.definition.draw('mpl') -
El kwarg,
template_list, para el constructor delqiskit.transpiler.passes.TemplateOptimizationtranspiler pass ahora admite la recepción de una lista tanto deQuantumCircuityDAGDependencyobjetos. Anteriormente, sólo se aceptabanQuantumCircuit(que se convertían internamente en objetosDAGDependencyobjetos) en la lista de entrada. -
Se ha introducido un nuevo transpiler pass,
qiskit.transpiler.passes.RZXCalibrationBuildercapaz de generar calibraciones y añadirlas a un circuito cuántico. Este paso toma los objetos calibradosCXGatey crea las calibraciones paraqiskit.circuit.library.RZXGateobjetos con un ángulo de rotación arbitrario. Los horarios se crean estirando y comprimiendo los pulsosGaussianSquarede las puertas de resonancia de eco cruzado. -
Se añaden nuevos circuitos de plantilla para utilizar
qiskit.circuit.library.RZXGatese añaden al móduloqiskit.circuit.library(por ejemplorzx_yz). Esto permite emparejar elTemplateOptimizationpass con elqiskit.transpiler.passes.RZXCalibrationBuilderpass para encontrar y sustituir automáticamente secuencias de compuertas, comoCNOT - P(theta) - CNOT, por circuitos más eficientes basadosqiskit.circuit.library.RZXGatecon una calibración. -
El tipo de salida de matplotlib para los valores
circuit_drawer()y el métododraw()de la claseQuantumCircuitadmiten ahora archivos de configuración para establecer el estilo de visualización. En versiones anteriores, existía una funcionalidad básica que permitía a los usuarios pasar un kwargstyleque tomaba undictpara personalizar los colores y otras características de visualización del cajónmpl. Esto se ha ampliado ahora para que estos diccionarios se puedan cargar desde archivos JSON directamente sin necesidad de pasar un diccionario. Esto permite a los usuarios crear nuevos archivos de estilo y utilizar ese estilo para las visualizaciones pasando el nombre del archivo de estilo como una cadena al kwargstyle.Para aprovechar esta función, debe establecer la opción
circuit_mpl_style_pathen un archivo de configuración de usuario. Esta opción se debe establecer en la ruta que desea qiskit para buscar archivos JSON estilo. Si se especifican varias entradas de ruta, deben ir separadas por:. Por ejemplo, si se definecircuit_mpl_style_path = ~/.qiskit:~/user_stylesen un archivo de configuración de usuario, se buscarán archivos JSON tanto en~/.qiskitcomo en~/user_styles. -
Se ha añadido un nuevo kwarg,
format_marginala la funciónmarginal_counts()que cuando se establece enTrueformatea la salida de recuentos según elcregsdel circuito y los índices que faltan se representan con un_. Por ejemplo:from qiskit import QuantumCircuit, execute, BasicAer, result from qiskit.result.utils import marginal_counts qc = QuantumCircuit(5, 5) qc.x(0) qc.measure(0, 0) result = execute(qc, BasicAer.get_backend('qasm_simulator')).result() print(marginal_counts(result.get_counts(), [0, 2, 4], format_marginal=True)) -
Mejora del rendimiento de
qiskit.quantum_info.Statevector.expectation_value()yqiskit.quantum_info.DensityMatrix.expectation_value()cuando el operador del argumento es unPaulioSparsePauliOpoperador. -
El archivo de configuración de usuario tiene 2 nuevas opciones de configuración,
num_processesyparallel, que se utilizan para controlar el comportamiento predeterminado deparallel_map(). La opciónparalleles un booleano que se utiliza para dictar siparallel_map()se ejecutará en múltiples procesos o no. Si se establece enFalselas llamadas aparallel_map()se ejecutarán en serie, mientras que si se establece enTruese habilitará la ejecución en paralelo. La opciónnum_processestoma un número entero que establece cuántas CPUs utilizar cuando se ejecuta en paralelo. Por defecto, utilizará el número de núcleos de CPU de un sistema. -
Hay 2 nuevas variables de entorno,
QISKIT_PARALLELyQISKIT_NUM_PROCS, que se pueden utilizar para controlar el comportamiento por defecto deparallel_map(). La opciónQISKIT_PARALLELse puede establecer enTRUE(cualquier mayúscula) para establecer por defecto que se ejecute en múltiples procesos cuandoparallel_map()es llamado. Si se establece en cualquier otro valorparallel_map()se ejecutará en serie.QISKIT_NUM_PROCStoma un número entero (por ejemploQISKIT_NUM_PROCS=5) que se utilizará como número por defecto de procesos a ejecutar. Ambos tendrán prioridad sobre la opción equivalente establecida en el archivo de configuración del usuario. -
Se ha añadido un nuevo método
gradient()a la claseParameterExpressionclase. Este método se utiliza para evaluar el gradiente de unParameterExpressionobjeto. -
El método
__eq__(es decir, lo que se llama cuando se utiliza el operador==) para el operadorParameterExpressionpermite ahora la comparación con un valor numérico. Anteriormente, sólo era posible comparar dos instancias deParameterExpressioncon==. Por ejemplo:from qiskit.circuit import Parameter x = Parameter("x") y = x + 2 y = y.assign(x, -1) assert y == 1 -
La clase
PauliFeatureMapen el móduloqiskit.circuit.librarypermite ahora ajustar el factor de rotación, , ya sea mediante el atributo kwargalphaen el constructor o mediante el atributoalphadespués de la creación. Anteriormente, este valor estaba fijado en2.0. El ajuste de este atributo permite un mejor control de los límites de decisión y proporciona flexibilidad adicional en el manejo de las características de entrada sin necesidad de escalarlas explícitamente en el conjunto de datos. -
Una nueva
Gateclase,PauliGatese ha añadido el móduloqiskit.circuit.libraryy el método correspondientepauli()a la claseQuantumCircuitclase. Esta nueva clase de compuerta permite aplicar varias compuertas pauli individuales a distintos qubits a la vez. Esto es útil sobre todo para los simuladores, que pueden utilizar esta nueva puerta para implementar de forma más eficiente múltiples puertas Pauli simultáneas. -
Mejore el
qiskit.quantum_info.Paulioperador. Esta clase representa ahora un elemento del grupo de Pauli completo de N-qubit incluyendo coeficientes complejos. Ahora admite los métodos de la API de operadorcompose(),dot(),tensor()etc, donde componer y punto se definen con respecto al grupo de Pauli completo.Esta clase también permite la conversión a y desde la representación de cadena de Pauli por conveniencia.
Por ejemplo
from qiskit.quantum_info import Pauli P1 = Pauli('XYZ') P2 = Pauli('YZX') P1.dot(P2)Los Pauli también pueden añadirse directamente a
QuantumCircuitobjetosfrom qiskit import QuantumCircuit from qiskit.quantum_info import Pauli circ = QuantumCircuit(3) circ.append(Pauli('XYZ'), [0, 1, 2]) circ.draw(output='mpl')Otros métodos permiten calcular cuándo dos Pauli conmutan (utilizando el método
commutes()) o anticonmutación (utilizando el métodoanticommutes()), y calcular el Pauli resultante de la conjugación de Clifford utilizando el métodoevolve()método.Consulte la documentación de la API de la clase
Paulipara más información. -
Se ha añadido una nueva función
random_pauli()para generar un elemento aleatorio del grupo de Pauli de N-qubit se ha añadido al móduloqiskit.quantum_infomódulo. -
Se ha añadido una nueva clase
PiecewisePolynomialPauliRotationsse ha añadido al móduloqiskit.circuit.librarymódulo. Este elemento de la librería de circuitos se utiliza para mapear una función polinómica a trozos, , que se define a través de puntos de ruptura y coeficientes, sobre amplitudes de qubits. Los puntos de ruptura son un subconjunto de , donde es el número de qubits de estado. Los coeficientes correspondientes , donde es el grado más alto entre todos los polinomios. Entonces se define como:
donde asumimos implícitamente . Y el mapeo aplicado a las amplitudes viene dado por
Este mapeo se basa en rotaciones Y de Pauli controladas y se construye utilizando el método PolynomialPauliRotations.
-
Se ha introducido un nuevo módulo
qiskit.algorithmsnuevo. Este módulo contiene una funcionalidad equivalente a la proporcionada anteriormente por el móduloqiskit.aqua.algorithms(que ahora está obsoleto) y proporciona los bloques de construcción para construir algoritmos cuánticos. Para más detalles sobre la migración deqiskit-aquaa este nuevo módulo, consulte la guía de migración. -
Se ha introducido un nuevo módulo
qiskit.opflownuevo. Este módulo contiene una funcionalidad equivalente a la proporcionada anteriormente por el móduloqiskit.aqua.operators(que ahora está obsoleto) y proporciona los operadores y funciones de estado que se utilizan para construir algoritmos cuánticos. Para más detalles sobre la migración deqiskit-aquaa este nuevo módulo, consulte la guía de migración. -
Esta es la primera versión que incluye ruedas binarias precompiladas para los sistemas Linux aarch64. Si estás ejecutando un sistema compatible con manylinux2014 aarch64 Linux ahora hay ruedas precompiladas disponibles en PyPI, ya no es necesario compilar desde el código fuente para instalar qiskit-terra.
-
La función
qiskit.quantum_info.process_fidelity()puede utilizarse ahora con un canal de destino no unitario. En este caso el valor devuelto equivale alqiskit.quantum_info.state_fidelity()de las matricesqiskit.quantum_info.Choide los canales.Tenga en cuenta que los
qiskit.quantum_info.average_gate_fidelity()yqiskit.quantum_info.gate_error()requieren que el canal de destino sea unitario y lanzarán una excepción si no lo es. -
Añadida una nueva función de creación de impulsos,
qiskit.pulse.macro(). Esto permite decorar las funciones normales de Python como macros. Esto permite utilizar funciones de creación de impulsos dentro de la función decorada. La macro del constructor puede llamarse desde un contexto de construcción de impulsos, lo que permite reutilizar el código.Por ejemplo:
from qiskit import pulse @pulse.macro def measure(qubit: int): pulse.play(pulse.GaussianSquare(16384, 256, 15872), pulse.MeasureChannel(qubit)) mem_slot = pulse.MemorySlot(0) pulse.acquire(16384, pulse.AcquireChannel(0), mem_slot) return mem_slot with pulse.build(backend=backend) as sched: mem_slot = measure(0) print(f"Qubit measured into {mem_slot}") sched.draw() -
Se ha añadido una nueva clase
PauliTwoDesignque implementa una forma particular de circuito deqiskit.circuit.libraryque implementa una forma particular de un circuito de 2 diseños de https://arxiv.org/pdf/1803.11173.pdf Por ejemplo, este circuito puede tener el siguiente aspectofrom qiskit.circuit.library import PauliTwoDesign circuit = PauliTwoDesign(4, reps=2, seed=5, insert_barriers=True) circuit.decompose().draw(output='mpl') -
Ya está disponible un nuevo cajón de pulsos
qiskit.visualization.pulse_v2.draw()(cuyo alias esqiskit.visualization.pulse_drawer_v2). Este nuevo cajón de pulsos admite múltiples funciones nuevas no presentes en el cajón de pulsos original (pulse_drawer()).- Truncado de instrucciones de impulso largas.
- Visualización de pulsos paramétricos.
- Nuevas hojas de estilo
IQXStandard,IQXSimple,IQXDebugging. - Visualización de la información del sistema (frecuencia del canal, etc.) especificando
qiskit.providers.Backendobjetos para su visualización. - Especificación de objetos
axispara el trazado, a fin de permitir una mayor extensión de los trazados generados, es decir, para manipulaciones de publicación.
Las nuevas hojas de estilo pueden tomar funciones callback que modifiquen dinámicamente la apariencia de la imagen de salida, por ejemplo, reensamblando una colección de canales, mostrando detalles de instrucciones, actualizando la apariencia de las envolventes de pulsos, etc. Puede crear funciones de devolución de llamada personalizadas e introducirlas en una instancia de hoja de estilo para modificar el aspecto de la figura sin modificar el código del cajón. Para más detalles, consulte la documentación del módulo de cajón de pulsos.
Tenga en cuenta que ahora el guardado de archivos se delega en Matplotlib. Para guardar archivos de imagen, es necesario llamar al método
savefigcon el objeto devueltoFigure. -
Añade un método
reverse_qargs()al métodoqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixclases. Este método invierte el orden de los subsistemas en los estados y es equivalente alqiskit.circuit.QuantumCircuit.reverse_bits()para estados N-qubit. Por ejemplo:from qiskit.circuit.library import QFT from qiskit.quantum_info import Statevector circ = QFT(3) state1 = Statevector.from_instruction(circ) state2 = Statevector.from_instruction(circ.reverse_bits()) state1.reverse_qargs() == state2 -
Añade un método
reverse_qargs()método a la claseqiskit.quantum_info.Operatorclase. Este método invierte el orden de los subsistemas en el operador y es equivalente al métodoqiskit.circuit.QuantumCircuit.reverse_bits()para operadores N-qubit. Por ejemplo:from qiskit.circuit.library import QFT from qiskit.quantum_info import Operator circ = QFT(3) op1 = Operator(circ) op2 = Operator(circ.reverse_bits()) op1.reverse_qargs() == op2 -
El método de salida
latexpara la funciónqiskit.visualization.circuit_drawer()y el métododraw()utilizarán ahora una etiqueta definida por el usuario en las puertas de la visualización de salida. Por ejemplo:import math from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2) qc.h(0) qc.rx(math.pi/2, 0, label='My Special Rotation') qc.draw(output='latex') -
El kwarg
routing_methodpara la funcióntranspile()acepta ahora una nueva opción,'none'. Enrouting_method='none'no se ejecutará ninguna pasada de enrutamiento como parte de la transpilación. Si el circuito no se ajusta al mapa de acoplamiento se producirá unaTranspilerErrorse producirá una excepción. -
Se ha añadido una nueva clase de puerta
RVGatese ha añadido al móduloqiskit.circuit.libraryjunto con el correspondiente métodoQuantumCircuitmétodorv(). LaRVGatees una puerta de rotación general, similar aUGatepero en lugar de especificar ángulos de Euler se especifican los tres componentes de un vector de rotación donde la dirección del vector especifica el eje de rotación y la magnitud especifica el ángulo de rotación sobre el eje en radianes. Por ejemplo:import math import np from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) theta = math.pi / 5 phi = math.pi / 3 # RGate axis: axis = np.array([math.cos(phi), math.sin(phi)]) rotation_vector = theta * axis qc.rv(*rotation_vector, 0) -
Sin consolidar
Parameterutilizados en un objetoQuantumCircuitse ordenarán por nombre. Esto tendrá efecto para los parámetros devueltos por el atributoparametersatributo. Además, elqiskit.circuit.QuantumCircuit.bind_parameters()yqiskit.circuit.QuantumCircuit.assign_parameters()pueden ahora recibir una lista de valores a que se vincularán/asignarán a los parámetros en orden de nombre. Antes, estos métodos sólo aceptaban un diccionario de parámetros y valores. Por ejemplo:from qiskit.circuit import QuantumCircuit, Parameter circuit = QuantumCircuit(1) circuit.rx(Parameter('x'), 0) circuit.ry(Parameter('y'), 0) print(circuit.parameters) bound = circuit.bind_parameters([1, 2]) bound.draw(output='mpl') -
Los constructores de los módulos
qiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixpueden tomar ahora un objetoQuantumCircuitpara construir un objetoStatevectoryDensityMatrixa partir de ese circuito, suponiendo que los qubits están inicializados en . Por ejemplo:from qiskit import QuantumCircuit from qiskit.quantum_info import Statevector qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) statevector = Statevector(qc) statevector.draw(output='latex') -
Las nuevas clases de backend falso están disponibles en
qiskit.test.mock. Estos incluyen versiones simuladas deibmq_casablanca,ibmq_sydney,ibmq_mumbai,ibmq_lima,ibmq_belem,ibmq_quito. Al igual que los demás backends falsos, incluyen instantáneas de los datos de calibración (por ejemplo,backend.defaults()) y los datos de error (es decir,backend.properties()) tomados del sistema real, y pueden utilizarse para pruebas locales, compilación y simulación.
Problemas conocidos
-
Al intentar añadir un objeto
qiskit.pulse.Instructioncon un parámetroduration(es decir, el valor dedurationes un objeto no vinculadoParameteroParameterExpression) a un objetoqiskit.pulse.Scheduleno es compatible. El intento de hacerlo dará lugar aUnassignedDurationErrorPulseErrorse produzca. Se trata de una limitación del modo en que se evalúan actualmente las restricciones de solapamiento deInstruction. Esto es posible gracias aScheduleBlocken el que las restricciones de solapamiento se evalúan justo antes de la ejecución. -
En sistemas Windows cuando la ejecución paralela está habilitada para
parallel_map()el paralelismo puede no funcionar cuando se llama desde un script que se ejecuta fuera de un bloqueif __name__ == '__main__':. Esto se debe a la forma en que Python lanza procesos paralelos en Windows.RuntimeErrorAttributeErrorSi los scripts que llaman aparallel_map()(incluyendo funciones que usanparallel_map()internamente comotranspile()) con Windows y el paralelismo activado, puede intentar incrustar las llamadas a los scripts dentro deif __name__ == '__main__':para solucionar el problema. Por ejemplo:from qiskit import QuantumCircuit, QiskitError from qiskit import execute, Aer qc1 = QuantumCircuit(2, 2) qc1.h(0) qc1.cx(0, 1) qc1.measure([0,1], [0,1]) # making another circuit: superpositions qc2 = QuantumCircuit(2, 2) qc2.h([0,1]) qc2.measure([0,1], [0,1]) execute([qc1, qc2], Aer.get_backend('qasm_simulator'))Se debería cambiar a:
from qiskit import QuantumCircuit, QiskitError from qiskit import execute, Aer def main(): qc1 = QuantumCircuit(2, 2) qc1.h(0) qc1.cx(0, 1) qc1.measure([0,1], [0,1]) # making another circuit: superpositions qc2 = QuantumCircuit(2, 2) qc2.h([0,1]) qc2.measure([0,1], [0,1]) execute([qc1, qc2], Aer.get_backend('qasm_simulator')) if __name__ == '__main__': main()si se encuentra algún error con el paralelismo en Windows.
Notas de actualización
-
Los gestores de pases preestablecidos
level_1_pass_manager,level_2_pass_managerylevel_3_pass_manager(que se utilizan paraoptimization_level1, 2, y 3 en los archivostranspile()yexecute()) utilizan ahora incondicionalmente el paseOptimize1qGatesDecompositionpara la optimización de la puerta de 1 qubit. Anteriormente, estos gestores de pases utilizaban elOptimize1qGatespass si las puertas base conteníanu1,u2, ou3. Si desea seguir utilizando el antiguoOptimize1qGatestendrás que construir unPassManagercon el pase. -
Tras la transpilación de un
QuantumCircuitel atributoglobal_phaseatributo de circuito de salida ya no puede devolverse de forma simplificada, si la fase global es unParameterExpression.Por ejemplo:
qc = QuantumCircuit(1) theta = Parameter('theta') qc.rz(theta, 0) qc.rz(-theta, 0) print(transpile(qc, basis_gates=['p']).global_phase)antes devolvía
0, pero ahora devolverá-0.5*theta + 0.5*theta. Este cambio era necesario para evitar una gran penalización de rendimiento en tiempo de ejecución, ya que la simplificación de expresiones simbólicas puede ser bastante lenta, especialmente si hay muchosParameterExpressionobjetos en un circuito. -
Los objetos de trabajo
BasicAerJobdevueltos por los backends de BasicAer son ahora instancias síncronas deJobV1. Esto significa que las llamadas a la funciónrun()se bloquearán hasta que la simulación termine de ejecutarse. Si quieres restaurar el comportamiento asíncrono anterior, tendrás que envolver el archivorun()con algo que se ejecute en un hilo o proceso independiente comofutures.ThreadPoolExecutorofutures.ProcessPoolExecutor. -
La opción
allow_sample_measuringpara el simulador BasicAerQasmSimulatorPyha cambiado deFalsepor defecto aTrue. Esto se hizo para reflejar mejor el comportamiento real por defecto del simulador, que utilizaría la medición de muestras si el circuito de entrada lo soportaba (incluso si no estaba activado). Si está ejecutando un circuito que no admite la medición de muestras (es decir, tiene operacionesReseto si hay operaciones después de una medición en un qubit) debe asegurarse de establecer explícitamente esta opción enFalsecuando llame arun(). -
El transpilador
CommutativeCancellationtranspiler pass conoce ahora las puertas de la base de destino, lo que significa que sólo utilizará puertas en la base especificada. Anteriormente, el pase sustituía incondicionalmente las puertas consecutivas que conmutan conZGatepor la puertaU1Gate. Sin embargo, ahora que el pase es consciente de la base y tiene un kwarg,basis_gates, para especificar la base de destino hay un cambio potencial en el comportamiento si no se establece el kwarg. Si no se utiliza el kwargbasis_gatesy no hay puertas de rotación z variable en el circuito, no se producirá ninguna cancelación conmutativa. -
Register(que es la clase padre deQuantumRegisteryClassicalRegisteryBit(que es la clase padre deQubityClbit) son ahora inmutables. En versiones anteriores era posible ajustar el valor de asizeonamede un objetoRegistery los atributosindexoregisterde un objetoBitobjeto después de su creación inicial. Sin embargo, esto llevaría a un comportamiento insano que corrompería la estructura del contenedor que depende de un hash (como un dict) ya que estos atributos son tratados como propiedades inmutables de un registro o bit (ver #4705 para más detalles). Para evitar este comportamiento erróneo, los atributos de aRegisteryBitya no se pueden establecer después de la creación inicial. Si anteriormente ajustaba los objetos en tiempo de ejecución, ahora tendrá que crear un nuevo objetoRegisteroBitcon los nuevos valores. -
El método
DAGCircuit.__eq__(que es utilizado por el operador==), que se utiliza para comprobar la igualdad estructural deDAGCircuityQuantumCircuitincluirá ahora el métodoglobal_phaseycalibrationsen los campos en los que se comprueba la igualdad. Esto significa que circuitos que habrían sido evaluados como iguales en versiones anteriores pueden dejar de serlo siglobal_phaseocalibrationsdifieren entre los circuitos. Por ejemplo, en versiones anteriores, esto devolvíaTrue:import math from qiskit import QuantumCircuit qc1 = QuantumCircuit(1) qc1.x(0) qc2 = QuantumCircuit(1, global_phase=math.pi) qc2.x(0) print(qc2 == qc1)Sin embargo, como el atributo
global_phasede los circuitos es diferente, ahora devolveráFalse. -
Los métodos
qubits()yclbits()de la claseDAGCircuitque quedaron obsoletos en la versión de 0.15.0 Terra, han sido eliminados. En su lugar, debe utilizar los atributosqubitsyclbitsde la claseDAGCircuitde la clase Por ejemplo, si estuvieras corriendo:from qiskit.dagcircuit import DAGCircuit dag = DAGCircuit() qubits = dag.qubits()Eso sería reemplazado por:
from qiskit.dagcircuit import DAGCircuit dag = DAGCircuit() qubits = dag.qubits -
El
PulseDefaultsdevueltos por los backends de pulso falsoqiskit.test.mock.FakeOpenPulse2Qyqiskit.test.mock.FakeOpenPulse3Qse han actualizado para tener definiciones de secuencia de pulso más realistas. Si está utilizando estas clases backend falsas puede que necesite actualizar su uso debido a estos cambios. -
El método de síntesis por defecto utilizado por la función
decompose_clifford()del móduloquantum_info(que utiliza internamente el métodoqiskit.quantum_info.Clifford.to_circuit()) para más de 3 qubits utiliza ahora una rutina de compilación codiciosa no óptima para la síntesis de elementos Clifford, de Bravyi et. al., que suele ofrecer un mejor coste CX que el antiguo por defecto. Si necesita volver al método Aaronson-Gottesman anterior, puede hacerlo configurandomethod='AG'. -
El módulo anteriormente obsoleto
qiskit.visualization.interactive, que fue obsoleto en la versión 0.15.0, ha sido eliminado. En su lugar, deberías utilizar las visualizaciones basadas en matplotlib:Función interactiva eliminadaFunción matplotlib equivalenteiplot_bloch_multivectorqiskit.visualization.plot_bloch_multivector()iplot_state_cityqiskit.visualization.plot_state_city()iplot_state_qsphereqiskit.visualization.plot_state_qsphere()iplot_state_hintonqiskit.visualization.plot_state_hinton()iplot_histogramqiskit.visualization.plot_histogram()iplot_state_paulivecqiskit.visualization.plot_state_paulivec() -
Los atributos de nivel superior
qiskit.Aeryqiskit.IBMQahora se cargan lentamente. Esto significa que ahora los objetos siempre existirán y ya no se producirán advertencias en la importación siqiskit-aeroqiskit-ibmq-providerno están instalados (o no pueden ser encontrados por Python ). Si estaba comprobando la presencia deqiskit-aeroqiskit-ibmq-providerutilizando estos atributos de módulo y comparando explícitamente conNoneo buscando la ausencia del atributo, esto ya no funcionará porque ahora siempre están definidos como un objeto. En otras palabras corriendo algo como:try: from qiskit import Aer except ImportError: print("Aer not available") or:: try: from qiskit import IBMQ except ImportError: print("IBMQ not available")ya no funcionará. En su lugar, para determinar si esos proveedores están presentes, puede utilizar explícitamente
qiskit.providers.aer.Aeryqiskit.providers.ibmq.IBMQ:try: from qiskit.providers.aer import Aer except ImportError: print("Aer not available") try: from qiskit.providers.ibmq import IBMQ except ImportError: print("IBMQ not available")o consulte
bool(qiskit.Aer)ybool(qiskit.IBMQ)en su lugar, por ejemplo:import qiskit if not qiskit.Aer: print("Aer not available") if not qiskit.IBMQ: print("IBMQ not available")Este cambio era necesario para evitar posibles problemas de ciclo de importación entre los paquetes qiskit y también para mejorar el tiempo de importación cuando no se utilizan Aer o IBMQ.
-
La opción
suppress_packaging_warningsdel archivo de configuración de usuario y la variable de entornoQISKIT_SUPPRESS_PACKAGING_WARNINGSya no tienen ningún efecto y se ignorarán silenciosamente. Las advertencias que controlaba esta opción se han eliminado y ya no se emitirán en el momento de la importación desde el móduloqiskit. -
El anteriormente obsoleto
conditionkwarg forqiskit.dagcircuit.DAGNodeha sido eliminado. Se eliminó en la versión 0.15.0. En su lugar, ahora debería establecer la condición clásica en el objetoInstructionque se pasa al constructorDAGNodeal crear un nuevo nodoop. -
Al crear una nueva clase
Register(que es la clase padre deQuantumRegisteryClassicalRegister) oQuantumCircuitcon un número de bits (por ejemplo,QuantumCircuit(2)), ahora es necesario que el número de bits se especifique como un número entero u otro tipo que sea convertible a números enteros inequívocos (por ejemplo,2.0). Los valores no enteros provocarán ahora un error, ya que la intención en esos casos no estaba clara (no se pueden tener bits fraccionarios). Para obtener más información sobre por qué se cambió esto consulte: #4855 -
networkx ya no es un requisito para qiskit-terra. Todo el uso de networkx dentro de qiskit-terra ha sido eliminado con la excepción de 3 métodos:
qiskit.dagcircuit.DAGCircuit.to_networkxqiskit.dagcircuit.DAGCircuit.from_networkxqiskit.dagcircuit.DAGDependency.to_networkx
Si utiliza cualquiera de estos métodos, deberá instalar manualmente networkx en su entorno para poder seguir utilizándolos.
-
Por defecto en macOS con Python >= 3.8
parallel_map()ya no se ejecutará en múltiples procesos. Este es un cambio respecto a versiones anteriores en las que el comportamiento por defecto era queparallel_map()lanzaba múltiples procesos. Este cambio se realizó porque con las versiones más recientes de macOS con Python 3.8 y 3.9 el multiprocesamiento no es fiable o añade una sobrecarga significativa debido al cambio en Python 3.8 para lanzar nuevos procesos conspawnen lugar defork. Para volver a activar la ejecución en paralelo en macOS con Python >= 3.8 puede utilizar la opción del archivo de configuración de usuarioparallelo establecer la variable de entornoQISKIT_PARALLELenTrue. -
El anteriormente obsoleto kwarg
callbacken el constructor de la clasePassManagerha sido eliminado. Este kwarg está obsoleto desde la versión 0.13.0 (9 de abril de 2020). En su lugar, puede pasar el kwargcallbackal métodoqiskit.transpiler.PassManager.run()directamente. Por ejemplo, si estuvieras utilizando:from qiskit.circuit.random import random_circuit from qiskit.transpiler import PassManager qc = random_circuit(2, 2) def callback(**kwargs) print(kwargs['pass_']) pm = PassManager(callback=callback) pm.run(qc)puede sustituirse por:
from qiskit.circuit.random import random_circuit from qiskit.transpiler import PassManager qc = random_circuit(2, 2) def callback(**kwargs) print(kwargs['pass_']) pm = PassManager() pm.run(qc, callback=callback) -
Ya no es posible instanciar un canal base sin prefijo, como
qiskit.pulse.Channeloqiskit.pulse.PulseChannel. Estas clases están diseñadas para clasificar tipos de diferentes clases de canales de cara al usuario, comoqiskit.pulse.DriveChannel, pero no tienen una definición como recurso de destino. Si antes instanciaba directamenteqiskit.pulse.Channeloqiskit.pulse.PulseChannel, esto ya no está permitido. Utilice la subclase adecuada. -
Cuando los kwargs
require_cpy/orequire_tpdeqiskit.quantum_info.process_fidelity(),qiskit.quantum_info.average_gate_fidelity(),qiskit.quantum_info.gate_error()sonTrue, ahora sólo registrarán una advertencia en lugar del comportamiento anterior de lanzar una excepciónQiskitErrorsi el canal de entrada no es CP o TP respectivamente. -
La clase
QFTen el móduloqiskit.circuit.librarycalcula ahora la transformada de Fourier utilizando una representación little-endian de tensores, es decir, el estado mapea a asumiendo que la base computacional corresponde al orden de bits little-endian de los enteros. etc. Esto se hizo para hacerlo más consistente con el resto de Qiskit, que utiliza una convención little-endian para el orden de bits. Si dependías del orden de bits anterior, puedes utilizar el métodoreverse_bits()para volver al comportamiento anterior. Por ejemplo:from qiskit.circuit.library import QFT qft = QFT(5).reverse_bits() -
El atributo de módulo
qiskit.__qiskit_version__antes era undictahora devolverá un objetoMappingpersonalizado de sólo lectura que comprueba la versión de los elementos qiskit en tiempo de ejecución en lugar de en tiempo de importación. Esto se hizo para acelerar la ruta de importación de qiskit y eliminar un posible ciclo de importación importando sólo los paquetes de elementos en tiempo de ejecución si se necesita la versión del paquete. Esto debería ser totalmente compatible con eldictvolver anteriormente y para la mayoría de los casos de uso normal no habrá ninguna diferencia. Sin embargo, si algunas aplicaciones dependían de la mutación del contenido o de la comprobación explícita del tipo, puede que sea necesario actualizarlas para adaptarlas a este cambio. -
El módulo
qiskit.executeha pasado a llamarseqiskit.execute_function. Esto era necesario para evitar un potente conflicto de nombres entre la funciónexecute()que se reexporta comoqiskit.execute.qiskit.executela función en algunas situaciones podría entrar en conflicto conqiskit.executeel módulo que daría lugar a un error críptico porque Python estaba tratandoqiskit.executecomo el módulo cuando la intención era a la función o viceversa. El cambio de nombre del módulo era necesario para evitar este conflicto. Si está importandoqiskit.executepara obtener el módulo (el uso típico erafrom qiskit.execute import execute) tendrá que actualizar esto para utilizarqiskit.execute_functionen su lugar.qiskit.executeahora siempre resolverá a la función. -
Los módulos
qiskit.compiler.transpile,qiskit.compiler.assemble,qiskit.compiler.schedule, yqiskit.compiler.sequencehan pasado a llamarseqiskit.compiler.transpiler,qiskit.compiler.assembler,qiskit.compiler.scheduler, yqiskit.compiler.sequencerespectivamente. Esto era necesario para evitar un potente conflicto de nombres entre los módulos y las rutas de las funciones reexportadasqiskit.compiler.transpile(),qiskit.compiler.assemble(),qiskit.compiler.schedule()yqiskit.compiler.sequence(). En algunas situaciones, este conflicto de nombres entre la ruta del módulo y la ruta de la función reexportada provocaría un error críptico porque Python estaba tratando una importación como el módulo cuando la intención era utilizar la función o viceversa. El cambio de nombre del módulo era necesario para evitar este conflicto. Si antes utilizabas las importaciones para obtener los módulos (el uso típico sería likefrom qiskit.compiler.transpile import transpile) tendrás que actualizarlo para utilizar las nuevas rutas de los módulos.qiskit.compiler.transpile(),qiskit.compiler.assemble(),qiskit.compiler.schedule()yqiskit.compiler.sequence()resolverán siempre a las funciones. -
La clase
qiskit.quantum_info.Quaternionse ha trasladado del submóduloqiskit.quantum_info.operatoral submóduloqiskit.quantum_info.synthesispara reflejar mejor su finalidad. No es necesario realizar ningún cambio si se importa desde el módulo raízqiskit.quantum_infopero si lo importas desdeqiskit.quantum_info.operatortendrás que actualizar la ruta de importación. -
Eliminado el método
QuantumCircuit.mcmt, obsoleto desde el lanzamiento de Qiskit Terra 0.14.0 en abril de 2020. En lugar de utilizar el método, utilice la claseMCMTpara construir una puerta multicontrol multiobjetivo y utilice la claseqiskit.circuit.QuantumCircuit.append()oqiskit.circuit.QuantumCircuit.compose()para añadirla a un circuito.Por ejemplo, puede sustituir:
circuit.mcmt(ZGate(), [0, 1, 2], [3, 4])con:
from qiskit.circuit.library import MCMT mcmt = MCMT(ZGate(), 3, 2) circuit.compose(mcmt, range(5)) -
Eliminado el método
QuantumCircuit.diag_gate, obsoleto desde el lanzamiento de Qiskit Terra 0.14.0 en abril de 2020. En su lugar, utilice eldiagonal()métodoQuantumCircuit. -
Eliminado el método
QuantumCircuit.ucy, obsoleto desde el lanzamiento de Qiskit Terra 0.14.0 en abril de 2020. En su lugar, utilice elucry()métodoQuantumCircuit. -
El método
mirror()paraqiskit.circuit.QuantumCircuitha sido eliminado. Se eliminó en la versión 0.15.0. El métodoqiskit.circuit.QuantumCircuit.reverse_ops()ya que la duplicación podría confundirse con el intercambio de qubits de salida del circuito. El métodoreverse_ops()sólo invierte el orden de las puertas que se aplican en lugar de reflejarlas. -
Se ha eliminado el soporte previamente obsoleto de pasar un float (para el kwarg
scalecomo primer argumento posicional a la funciónqiskit.circuit.QuantumCircuit.draw()se ha eliminado. Se eliminó en la versión 0.12.0. El primer argumento posicional del métodoqiskit.circuit.QuantumCircuit.draw()es ahoraoutputkwarg, que no acepta float. En su lugar, debería utilizarscalecomo un kwarg con nombre en lugar de utilizarlo posicionalmente.Por ejemplo, si antes llamaba a
drawcon:from qiskit import QuantumCircuit qc = QuantumCircuit(2) qc.draw(0.75, output='mpl')esto tendría que ser ahora:
from qiskit import QuantumCircuit qc = QuantumCircuit(2) qc.draw(output='mpl', scale=0.75)o:
qc.draw('mpl', scale=0.75) -
Las funciones de Qiskit Pulse (
qiskit.pulse) que quedaron obsoletas en la versión 0.15.0 (agosto de 2020) han sido eliminadas. El conjunto completo de cambios son:MóduloAnteriorNuevoqiskit.pulse.librarySamplePulseWaveformqiskit.pulse.libraryConstantPulseConstant(renombrar módulo) pulse.pulse_libMóduloqiskit.pulse.libraryClaseMétodo antiguoNuevo métodoParametricPulseget_sample_pulseget_waveformInstructioncommandN/A. Se han unificado los Comandos y las Instrucciones. Utilice operands()para obtener información sobre los datos de la instrucción.Acquireacquires,mem_slots,reg_slotsacquire(),mem_slot(),reg_slot(). (La instrucciónAcquireinstrucción ya no se transmite a través de múltiples qubits) -
El diccionario que antes se mantenía en
DAGCircuitse ha eliminado. En su lugar, los bordes contienen ahora la instanciaBitinstancia que se había incluido previamente en el diccionario como su campo'wire'. Tenga en cuenta que el gráfico NetworkX devuelto porto_networkx()seguirá teniendo un diccionario para sus atributos de arista, pero el campo'name'ya no se rellenará. -
El atributo
parametersde la claseQuantumCircuitya no devuelveset. En su lugar, devuelve un objetoParameterViewque implementa todos los métodos que ofreceset(aunque obsoletos). Esto se hizo para apoyar un modelo que conserva los parámetros ordenados por nombre. Debe ser totalmente compatible con cualquier uso anterior de la direcciónsetdevuelta por el atributoparametersexcepto cuando se haya realizado una comprobación explícita del tipo de un conjunto. -
Cuando se ejecuta
transpile()en unQuantumCircuitcondelay()las unidades se convertirán a dt si el valor de dt (tiempo de muestreo) es conocido portranspile()ya sea explícitamente mediante el kwargdto mediante el kwargBackendConfigurationpara un objetoBackendpasado a través del kwargbackend. -
La interpretación de
meas_map(que es un atributo de unPulseBackendConfigurationo como el kwarg correspondiente demeas_mapen el objetoschedule(),assemble(),sequence()oexecute()) se ha actualizado para ajustarse mejor a las verdaderas limitaciones del hardware. El formato de estos datos es una lista de listas, donde los elementos de la lista interior son números enteros que especifican las etiquetas de los qubits. Por ejemplo:[[A, B, C], [D, E, F, G]]Anteriormente, la restricción
meas_mapse interpretaba de forma que si se adquiría un qubit (por ejemplo, A), todos los demás qubits que compartieran un subgrupo con ese qubit (B y C) tendrían que adquirirse al mismo tiempo y durante la misma duración. Esta restricción se ha relajado. Una adquisición no requiere más adquisiciones. (Si se adquiere A, no es necesario adquirir B y C) Por el contrario, los qubits del mismo grupo de medida no pueden adquirirse de forma parcialmente solapada - piense quemeas_mapespecifica un recurso de adquisición compartido (si adquirimos A desdet=1000hastat=2000, no podemos adquirir B a partir de1000<t<2000). Por ejemplo:# Good meas_map = [[0, 1]] # Acquire a subset of [0, 1] sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) # Acquire 0 and 1 together (same start time, same duration) sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) # Acquire 0 and 1 disjointly sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) << 10 # Acquisitions overlap, but 0 and 1 aren't in the same measurement # grouping meas_map = [[0], [1]] sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) << 1 # Bad: 0 and 1 are in the same grouping, but acquisitions # partially overlap meas_map = [[0, 1]] sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) << 1
Notas sobre características en desuso
-
Se han añadido dos nuevos argumentos
qiskit.dagcircuit.DAGNode.semantic_eq(),bit_indices1ybit_indices2, que se espera que asignen lasBitde cadaDAGNodea su índice enqubitsoclbitslista de sus respectivosDAGCircuit. Durante el periodo de desaprobación, estos argumentos son opcionales y cuando no se especifican las correspondencias se construirán automáticamente basándose en las propiedadesregisteryindexde cada instanciaBitinstancia. Sin embargo, en una futura versión, serán argumentos obligatorios y el usuario deberá proporcionar la asignación. -
La página
pulsefunciones de constructor:qiskit.pulse.call_circuit()qiskit.pulse.call_schedule()
están obsoletos y se eliminarán en una futura versión. Estas funciones están unificadas en
qiskit.pulse.call(), que debería utilizarse en su lugar. -
El método
qiskit.pulse.Scheduleqiskit.pulse.Schedule.flatten()está obsoleto y se eliminará en una futura versión. En su lugar, puede utilizar la funciónqiskit.pulse.transforms.flatten()que realizará la misma operación. -
La página
assign_parameters()para las siguientes clases:qiskit.pulse.channels.Channel,qiskit.pulse.library.Pulse,qiskit.pulse.instructions.Instruction,
y todas sus subclases están obsoletas y se eliminarán en una futura versión. Esta funcionalidad se ha subsumido
ScheduleBlockque es la dirección futura para la construcción de programas de pulso parametrizados. -
El atributo
parameterspara las siguientes clases:está obsoleto y se eliminará en una futura versión. Esta funcionalidad se ha subsumido
ScheduleBlockque es la dirección futura para la construcción de programas de pulso parametrizados. -
Python 3.6 ha quedado obsoleto y se eliminará en una próxima versión. Cuando se elimine la compatibilidad, deberá actualizar la versión de Python que esté utilizando a Python 3.7 o superior.
-
Dos métodos
QuantumCircuitmétodoscombine()yextend()junto con sus correspondientes operadores Python+y+=están obsoletos y serán eliminados en una futura versión. En su lugar, elQuantumCircuitmétodocompose()debe ser utilizado. El métodocompose()método permite una mayor flexibilidad a la hora de componer dos circuitos que no tengan registros coincidentes. Sin embargo, no añade qubits/clbits automáticamente, a diferencia de los métodos obsoletos. Para añadir un circuito en nuevos qubits/clbits, se puede utilizar el métodoqiskit.circuit.QuantumCircuit.tensor()se puede utilizar el método Por ejemplo:from qiskit.circuit import QuantumRegister, QuantumCircuit a = QuantumRegister(2, 'a') circuit_a = QuantumCircuit(a) circuit_a.cx(0, 1) b = QuantumRegister(2, 'b') circuit_b = QuantumCircuit(b) circuit_b.cz(0, 1) # same as circuit_a + circuit_b (or combine) added_with_different_regs = circuit_b.tensor(circuit_a) # same as circuit_a + circuit_a (or combine) added_with_same_regs = circuit_a.compose(circuit_a) # same as circuit_a += circuit_b (or extend) circuit_a = circuit_b.tensor(circuit_a) # same as circuit_a += circuit_a (or extend) circuit_a.compose(circuit_a, inplace=True) -
Soporte para pasar
Qubital kwargqubitsdel métodoqiskit.transpiler.InstructionDurations.get()ha quedado obsoleto y se eliminará en una futura versión. En su lugar, debe llamar al métodoget()con los índices enteros de los qubits deseados. -
El uso de
@(__matmul__) para invocar el métodocomposede las subclases deBaseOperator(por ejemploOperator) está obsoleto y será eliminado en una futura versión. El métodoqiskit.quantum_info.Operator.compose()puede utilizarse directamente o también invocarse mediante el operador&(__and__). -
Utilizando
*(__mul__) para llamar al métododot()de las subclases deBaseOperator(por ejemploqiskit.quantum_info.Operator) está obsoleto y se eliminará en una futura versión. En su lugar, puede llamar directamente aldot()directamente. -
Utilizando
@(__matmul__) para invocar elevolve()del métodoqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixestá obsoleto y será eliminado en una futura versión.. El métodoevolvepuede utilizarse directamente o también invocarse mediante el operador&(__and__). -
La clase
qiskit.pulse.schedule.ParameterizedScheduleha quedado obsoleta y se eliminará en una futura versión. En su lugar, puede parametrizar directamente los objetos pulseSchedulecon un objetoParameterpor ejemplo:from qiskit.circuit import Parameter from qiskit.pulse import Schedule from qiskit.pulse import ShiftPhase, DriveChannel theta = Parameter('theta') target_schedule = Schedule() target_schedule.insert(0, ShiftPhase(theta, DriveChannel(0)), inplace=True) -
La clase
qiskit.pulse.ScheduleComponentdel móduloqiskit.pulseha quedado obsoleta y se eliminará en una próxima versión. Su uso debe sustituirse utilizando unqiskit.pulse.Scheduleo directamente enqiskit.pulse.Instruction. Además, el propósito principal de la claseScheduleComponentera como clase base común tanto paraScheduleyInstructionpara cualquier lugar que estuviera explícitamente comprobando el tipo o documentando la aceptación de una entradaScheduleComponentdebería actualizarse para aceptarInstructionoSchedule. -
Los archivos de esquema JSON y el uso de las cargas útiles de la API IBMQ están obsoletos y se eliminarán en una futura versión. Esto incluye todo lo que se encuentra bajo el módulo
qiskit.schemasy el móduloqiskit.validation. Esto también incluye los kwargs devalidateparaqiskit.qobj.QasmQobj.to_dict()yqiskit.qobj.QasmQobj.to_dict()junto con los validadores fastjsonschema a nivel de módulo enqiskit.qobj(que no generan advertencias de desaprobación). Los archivos de esquemas se han trasladado al repositorio Qiskit/ibmq-schemas y deben tratarse como las versiones canónicas de los esquemas de la API. En el futuro, sólo esos esquemas recibirán actualizaciones y se utilizarán como fuente de verdad para los esquemas. Si confiaba en los esquemas incluidos en qiskit-terra, debería actualizarlos para utilizar ese repositorio. -
El módulo
qiskit.utilha quedado obsoleto y se eliminará en una próxima versión. Ha sido sustituido porqiskit.utilsque ofrece la misma funcionalidad y se ampliará en el futuro. Tenga en cuenta que no se emitirá ningúnDeprecationWarningen relación con esta deprecación, ya que no era factible en Python 3.6. -
El pase del transpilador
CXDirectionen el móduloqiskit.transpiler.passesha quedado obsoleto y se eliminará en una futura versión. En su lugar, debe utilizarseGateDirection. Su comportamiento es idéntico al deCXDirection, salvo que ahora también admite la transformación de un circuito conECRGateademás deCXGatepuertas. -
El pase del transpilador
CheckCXDirectionen el móduloqiskit.transpiler.passesha quedado obsoleto y se eliminará en una futura versión. En su lugar, debe utilizarse el paseCheckGateDirection. Se comporta de forma idéntica alCheckCXDirectionexcepto que ahora también soporta la comprobación de la dirección de todas las puertas de 2 qubits, no sólo de las puertas deCXGatepuertas. -
El método
WeightedAddernum_ancilla_qubits()está obsoleto y se eliminará en una futura versión. Se ha sustituido por el atributoqiskit.circuit.library.WeightedAdder.num_ancillasque es coherente con las API de otras bibliotecas de circuitos. -
Los siguientes métodos heredados de la clase
qiskit.quantum_info.Paulihan quedado obsoletos. Véase la documentación del método para su sustitución en la clase Pauli actualizada.from_label()sgn_prod()to_spmatrix()kron()update_z()update_x()insert_paulis()append_paulis()delete_qubits()pauli_single()random()
-
Utilizando un
listonumpy.ndarraycomo argumentochannelotargetpara el comandoqiskit.quantum_info.process_fidelity(),qiskit.quantum_info.average_gate_fidelity(),qiskit.quantum_info.gate_error()yqiskit.quantum_info.diamond_norm()ha quedado obsoleto y no se admitirá en futuras versiones. En su lugar, las entradas deben ser unGateo un objeto de la subclaseBaseOperator(p. ej.Operator,Choietc.) -
Acceso a las referencias de
QubityClbita los registros que las contienen mediante las etiquetasregisteroindexha quedado obsoleta y se eliminará en una futura versión. En su lugar,Registerlos objetos pueden consultarse para encontrar losBitobjetos que contienen. -
La funcionalidad actual de la función
qiskit.visualization.pulse_drawer()está obsoleta y será sustituida porqiskit.visualization.pulse_drawer_v2()(que no es compatible con versiones anteriores) en una futura versión. -
El uso de métodos heredados del tipo
seten la salida del atributoparameters(que solía ser unset) de la claseQuantumCircuitestán obsoletos y se eliminarán en una futura versión. Esto incluye los métodos deadd(),difference(),difference_update(),discard(),intersection(),intersection_update(),issubset(),issuperset(),symmetric_difference(),symmetric_difference_update(),union(),update(),__isub__()(que es el operador-=), y__ixor__()(que es el operador^=). -
El nombre del primer (y único) argumento posicional del método
qiskit.circuit.QuantumCircuit.bind_parameters()ha cambiado devalue_dictavalues. Pasar un argumento con el nombrevalues_dictestá obsoleto y se eliminará en futuras versiones. Por ejemplo, si antes llamaba abind_parameters()con una llamada como:bind_parameters(values_dict={})esto es obsoleto y debe ser reemplazado porbind_parameters(values={})o incluso mejor simplemente pasar el argumento posicionalmentebind_parameters({}). -
El nombre del primer (y único) argumento posicional del método
qiskit.circuit.QuantumCircuit.assign_parameters()ha cambiado deparam_dictaparameters. Pasar un argumento con el nombreparam_dictestá obsoleto y se eliminará en futuras versiones. Por ejemplo, si antes llamaba aassign_parameters()con una llamada como:assign_parameters(param_dict={})esto es obsoleto y debe ser reemplazado porassign_parameters(values={})o incluso mejor simplemente pasar el argumento posicionalmenteassign_parameters({}).
Corrección de errores
-
Se ha solucionado un problema por el que la función
execute()lanzaba una excepciónQiskitErrorexcepción cuando se pasaba unParameterVectorpara el kwargparameter_bind. parámetro. Por ejemplo, ahora es posible llamar a algo como:execute(circuit, backend, parameter_binds=[{pv1: [...], pv2: [...]}])donde
pv1ypv2sonParameterVectorobjetos. Corregido #5467 -
Se ha solucionado un problema con las etiquetas de los pulsos paramétricos en la clase
PulseQobjInstructionno se establecían correctamente como en el caso de los pulsos muestreados. Esto también significa que los nombres de pulsoPulseDefaultsdevuelto por unBackendcomox90,x90m, etc, se establecerán correctamente. Corregido #5363 -
Se ha corregido un problema por el que los parámetros no vinculados sólo se producían en el atributo
global_phasede un objetoQuantumCircuitno se mostraban en el atributoparametersy no se podían vincular. Corregido #5806 -
El atributo
calibrationsde los objetosQuantumCircuitse conservan ahora cuando se utilizan los métodos+=(es decir, el métodoextend()) y+(es decir, el métodocombine()). Corregidos #5930 y #5908 -
El método
namede la claseRegister(que es la clase padre deQuantumRegisteryClassicalRegister) no comprobaba si la cadena asignada era un nombre de registro válido según la especificación OpenQASM. Anteriormente, esta comprobación sólo se realizaba cuando el nombre se especificaba en el constructor; ahora se ha corregido para que establecer el atributonamedirectamente con un valor no válido también genere una excepción. Corregido #5461 -
Se ha corregido un problema con la función
qiskit.visualization.circuit_drawer()función yqiskit.circuit.QuantumCircuit.draw()cuando se visualizaba unQuantumCircuitcon unGateque tiene una condición clásica después de unMeasureque utilizaba el mismoClassicalRegisterera posible que el condicionalGatese visualizara a la izquierda delMeasure. Corregido #5387 -
En el paso del transpilador
qiskit.transpiler.passes.CSPLayoutse observó un sesgo hacia los qubits de menor número. Este sesgo indeseable se ha corregido barajando los candidatos para aleatorizar los resultados. Además, el uso delCSPLayoutpass en elpreset_passmanagers(para los niveles 2 y 3) se ha ajustado para utilizar una semilla configurada si el kwargseed_transpilerestá configurado cuando se llama atranspile()se llama. Corregido #5990 -
Se ha corregido un error por el que el campo
channelsde un objetoPulseBackendConfigurationno se incluía en la salida del métodoqiskit.providers.models.PulseBackendConfiguration.to_dictmétodo. Corregido #5579 -
Corregido el enredo de
'circular'en la claseqiskit.circuit.library.NLocalpara el caso extremo en el que el circuito tiene el mismo tamaño que el bloque de entrelazamiento (por ejemplo, un circuito de dos qubits y puertas de entrelazamiento CZ). En este caso sólo debería haber una puerta de entrelazamiento, pero accidentalmente se añadió una segunda en la dirección inversa a la primera. Fijo qiskit-community/qiskit-aqua#1452 -
Se ha corregido la gestión de los puntos de interrupción en la clase
PiecewisePolynomialPauliRotationsen la claseqiskit.circuit.library. Ahora, para los intervalosn, se permiten los puntos de interrupciónn+1. Esto permite especificar otro intervalo final distinto de . Esto es importante porque desde el final del último intervalo hasta la función es la identidad. -
Se ha corregido un problema en la clase
qiskit.circuit.library.Permutationpor el que algunas permutaciones no se generaban correctamente. Este problema también podría afectar aqiskit.circuit.library.QuantumVolumesi se invocaba con classical_permutation=False`. Corregido #5812 -
Se ha solucionado un problema por el que la generación de la salida QASM con el método
qasm()para un objetoQuantumCircuitque tiene unControlledGatecon un control abierto la salida sería como si todos los controles estuvieran cerrados independientemente del estado de control especificado. Esto daría lugar a la creación de un circuito diferente defrom_qasm_str()al analizar el QASM generado.Esto se solucionó actualizando la salida QASM de
qasm()definiendo una puerta compuesta que utilizaXGatepara implementar los controles de apertura. La puerta compuesta se denomina<original_gate_name>_o<ctrl_state>dondeosignifica control abierto yctrl_statees el valor entero del estado de control. Corregido #5443 -
Se ha corregido un problema por el que los objetos
Parameteren unQuantumCircuitconparameter_bindsen la funciónexecuteprovocaba que todos los objetosQuantumCircuittuvieran el mismoname, lo que significaba que los nombres de los resultados tampoco eran únicos. Esta corrección hace quebind_parameters()yassign_parameters()asignen un nombre de circuito único cuandoinplace=Falseas:<base name>-<class instance no.>[-<pid name>]donde
<base name>es el nombre proporcionado por el kwarg "nombre", de lo contrario, por defecto es "circuito". El número de instancia de la clase se incrementa cada vez que se genera una instancia de la clase.<pid name>si se llama fuera del proceso principal. Corregido #5185 -
Se ha corregido un problema con la función
scheduler()por el que se producía una excepción si un circuito de entrada contenía un objeto no enlazadoQuantumCircuitno enlazado. Corregido #5304 -
Se ha solucionado un problema en los
qiskit.transpiler.passes.TemplateOptimizationpases del transpilador por el que los circuitos de plantillas que contenían objetos no vinculadosParameterse bloqueaban en algunos casos si los parámetros no podían vincularse durante la comparación de plantillas. Ahora bien, si losParameterobjetos no pueden ser vinculados las plantillas con unboundParameterson descartadas e ignoradas por elTemplateOptimizationpasar. Corregido #5533 -
Se ha corregido un problema con la función
qiskit.visualization.timeline_drawer()donde los bits clásicos se manejaban incorrectamente. Corregido #5361 -
Se ha corregido un problema en la función
qiskit.visualization.circuit_drawer()y el métodoqiskit.circuit.QuantumCircuit.draw()método dondeDelayen un objetoQuantumCircuitno se trataban correctamente como tiempo de inactividad. Así que cuando elidle_wireskwarg se fijó enFalselos cables con losDelayse seguirían mostrando. Esto se ha corregido para que los cables inactivos se eliminen de la visualización si sólo hayDelayobjetos en un cable. -
Anteriormente, cuando se proporcionaba la opción
layout_methodkwarg a la funcióntranspile()función y el kwargoptimization_levelse establecía en >= 2 para que el paseqiskit.transpiler.passes.CSPLayoutse ejecutara, siCSPLayoutencontraba una solución, el método delayout_methodno se ejecutaba. Se ha corregido para que, si se especifica, se respete siempre la direcciónlayout_method. Corregido #5409 -
Cuando el argumento
coupling_map=None(ya sea fijado explícitamente, fijado implícitamente como valor por defecto, o a través del kwargbackend), el proceso de transpilación no estaba "incrustando" el circuito. Es decir, aunque se especificarainitial_layout, los qubits virtuales no se asignaban a qubits físicos. Esto se ha corregido para que ahora la funciónqiskit.compiler.transpile()respeta el argumentoinitial_layoutincrustando el circuito:from qiskit import QuantumCircuit, QuantumRegister from qiskit.compiler import transpile qr = QuantumRegister(2, name='qr') circ = QuantumCircuit(qr) circ.h(qr[0]) circ.cx(qr[0], qr[1]) transpile(circ, initial_layout=[1, 0]).draw(output='mpl')Si el
initial_layoutse refiere a más qubits que en el circuito, el proceso de transpiling ampliará el circuito con ancillas.from qiskit import QuantumCircuit, QuantumRegister from qiskit.compiler import transpile qr = QuantumRegister(2, name='qr') circ = QuantumCircuit(qr) circ.h(qr[0]) circ.cx(qr[0], qr[1]) transpile(circ, initial_layout=[4, 2], coupling_map=None).draw()Corregido #5345
-
Se ha añadido un nuevo kwarg,
user_cost_dict, al constructor para elqiskit.transpiler.passes.TemplateOptimizationtranspiler pass. Esto permite a los usuarios proporcionar un diccionario de costes personalizado para las puertas al algoritmo de correspondencia de plantillas subyacente. Por ejemplo:from qiskit.transpiler.passes import TemplateOptimization cost_dict = {'id': 0, 'x': 1, 'y': 1, 'z': 1, 'h': 1, 't': 1} pass = TemplateOptimization(user_cost_dict=cost_dict) -
Un problema al pasar el objeto
Countsdevuelto porget_counts()amarginal_counts()producía un objetoCountscon determinadas entradas. Correcciones #5424 -
Mejora de la asignación de qubits de ayuda en
PolynomialPauliRotationsyPiecewiseLinearPauliRotationslo que hace más eficiente la implementación de estos circuitos. Corregido #5320 y #5322 -
Fijar el uso de los qubits ayudantes asignados en el
MCXGateen laWeightedAdderclase. Antes de esta corrección, se asignaban pero no se utilizaban. Corregido #5321 -
En varios casos, el método de salida
latexpara laqiskit.visualization.circuit_drawer()y el métododraw()no mostraban correctamente el nombre de la puerta y, en otros casos, no incluían los parámetros de la puerta donde debían estar. Ahora los nombres de las puertas se mostrarán de la misma forma que se muestran con el método de salidampl, y los parámetros se mostrarán para todas las puertas que los tengan. Además, algunas de las puertas no se mostraban de la forma correcta, por lo que se han corregido. Correcciones #5605, #4938 y #3765 -
Se ha solucionado un problema por el que, si se utilizaba el método
qiskit.circuit.Instruction.to_instruction()en un subcircuito que contenía registros clásicos y eseInstructionse añadía a un objetoQuantumCircuitla salida de la funciónqiskit.visualization.circuit_drawer()y del métodoqiskit.circuit.QuantumCircuit.draw()mostraban en algunos casos el subcircuito a la izquierda de una medida cuando debería haberse mostrado a la derecha. Corregido #5947 -
Se ha corregido un problema con
Delayen unQuantumCircuitdondeqiskit.compiler.transpile()no se convertían las unidades delDelaya las unidades delBackendsi elbackendkwarg se establece entranspile(). Esto podría dar lugar a un comportamiento incorrecto debido a un desajuste de la unidad, por ejemplo en ejecución:from qiskit import transpile, execute from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) qc.delay(100, [0], unit='us') qc = transpile(qc, backend) job = execute(qc, backend)anteriormente habría dado lugar a que el backend se retrasara 100 pasos de tiempo (cada uno de duración dt) en lugar de los esperados ( 100e-6 / dt). Esto se ha corregido para que la función
qiskit.compiler.transpile()convierta correctamente las unidades.
Otras notas
- Las instantáneas de todos los backends falsos/mock en
qiskit.test.mockse han actualizado para reflejar los cambios recientes en los dispositivos. Esto incluye un cambio en el atributobasis_gatesdel atributoBackendConfigurationa['cx', 'rz', 'sx', 'x', 'id'], la adición de una propiedadreadout_lengtha las propiedades de qubit en la propiedadBackendPropertiesy la actualización dePulseDefaultspara que todos los backends de mock soporten instancias basadas en pulsos paramétricosInstructionScheduleMapparamétricos.
Aer 0.8.0
Preludio
La versión 0.8 incluye varias novedades y correcciones de errores. Los aspectos más destacados de esta versión son: la introducción de un backend unificado AerSimulator para ejecutar simulaciones de circuitos utilizando cualquiera de los métodos de simulación admitidos; una biblioteca de instrucciones del simulador (qiskit.providers.aer.library) que incluye instrucciones personalizadas para guardar diversos tipos de datos del simulador; compatibilidad con MPI para ejecutar grandes simulaciones en un entorno informático distribuido.
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.
-
Añadir la bandera CMake
DISABLE_CONAN(default=`OFF\``)s. Cuando se instala desde el código fuente, si se establece enONse puede evitar el gestor de paquetes Conan para encontrar las bibliotecas que ya están instaladas en el sistema. Esto también está disponible como una variable de entornoDISABLE_CONAN`, que tiene prioridad sobre la bandera CMake. Este no es el procedimiento oficial para construir REA. Por lo tanto, el usuario es responsable de proporcionar todas las bibliotecas necesarias y los archivos correspondientes para que CMake pueda encontrarlos. -
Esta versión incluye soporte para construir qiskit-aer con soporte MPI para ejecutar grandes simulaciones en un entorno informático distribuido. Consulte la guía de contribución para obtener instrucciones sobre la construcción y ejecución en un entorno MPI.
-
Ahora es posible compilar qiskit-aer con CUDA activado en Windows. Consulte la guía de contribución para obtener instrucciones sobre cómo compilar desde el código fuente con soporte para GPU.
-
Al compilar la extensión qiskit-aer Python desde el código fuente, es necesario preinstalar varias dependencias de compilación para permitir la compilación en C++. Para comodidad del usuario, al compilar la extensión, cualquiera de estas dependencias de compilación que faltara se instalaría automáticamente utilizando
pipantes de los pasos normales de instalación desetuptools. Sin embargo, antes no era posible evitar esta instalación automática. Para resolver este problema se ha añadido una nueva variable de entornoDISABLE_DEPENDENCY_INSTALL. Si se establece en1oONal compilar la extensión python desde el código fuente, se desactivará la instalación automática de estas dependencias de compilación que faltan. -
Añade soporte para la puerta de Pauli N-qubit optimizada (
qiskit.circuit.library.PauliGate) aStatevectorSimulator,UnitarySimulator, y a los métodos de vector de estado y matriz de densidad deQasmSimulatoryAerSimulator. -
El método
run()para los backendsAerSimulator,QasmSimulator,StatevectorSimulator, yUnitarySimulatorahora toma un valorQuantumCircuit(o una lista de objetosQuantumCircuitobjetos) como entrada. El objetoQasmQobjsigue siendo compatible por ahora, pero será obsoleto en una futura versión.Para ver un ejemplo de cómo utilizarlo, consulte:
from qiskit import transpile, QuantumCircuit from qiskit.providers.aer import Aer backend = Aer.get_backend('aer_simulator') circuit = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() tqc = transpile(circuit, backend) result = backend.run(tqc, shots=4096).result() -
El método
run()para el backendPulseSimulatortoma ahora un valorSchedule(o una lista de objetosScheduleobjetos) como entrada. El objetoPulseQobjsigue siendo compatible por ahora, pero será obsoleto en una futura versión. -
Añade el nuevo backend del simulador
AerSimulatorque admite los siguientes métodos de simulaciónautomaticstatevectorstabilizerdensity_matrixmatrix_product_stateunitarysuperop
El método automático por defecto elegirá automáticamente un método de simulación por separado para cada circuito de ejecución basándose en las instrucciones del circuito y en el modelo de ruido (si existe). Se puede inicializar un simulador con un método específico utilizando la opción de método.
La simulación en la GPU para los métodos de vectores de estado, matrices de densidad y unitarios puede activarse configurando la opción
device='GPU'backend.Tenga en cuenta que los métodos
unitaryysuperopno admiten mediciones, ya que simulan la matriz unitaria o la matriz de superoperadores del circuito de ejecución, por lo que debe utilizarse una de las nuevas instruccionessave_unitary(),save_superop()osave_state()para guardar el estado del simulador en los resultados devueltos. Del mismo modo, el estado de los demás métodos de simulación puede guardarse utilizando las instrucciones adecuadas. Consulte los documentos de la APIqiskit.providers.aer.librarypara obtener más detalles.Tenga en cuenta que el simulador
AerSimulatorsustituye a los backendsQasmSimulator,StatevectorSimulatoryUnitarySimulator, que quedarán obsoletos en una futura versión. -
Actualiza la clase
AerProviderpara incluir múltiples backendsAerSimulatorpreconfigurados para todos los métodos de simulación y dispositivos de simulación disponibles. Se puede acceder a los nuevos backends a través de la interfaz del proveedor utilizando los nombres"aer_simulator""aer_simulator_statevector""aer_simulator_stabilizer""aer_simulator_density_matrix""aer_simulator_matrix_product_state""aer_simulator_extended_stabilizer""aer_simulator_unitary""aer_simulator_superop"
Además, si Aer se instaló con soporte de GPU en un sistema compatible, también estarán disponibles los siguientes backends de GPU
"aer_simulator_statevector_gpu""aer_simulator_density_matrix_gpu""aer_simulator_unitary_gpu"
Por ejemplo:
from qiskit import Aer # Get the GPU statevector simulator backend backend = Aer.get_backend('aer_simulator_statevector_gpu') -
Se ha añadido un nuevo método
norm estimationpara realizar mediciones cuando se utiliza el método de simulación"extended_stabilizer". Este método de estimación de la norma puede utilizarse pasando las siguientes opciones a los backendsAerSimulatoryQasmSimulatorsimulator = QasmSimulator( method='extended_stabilizer', extended_stabilizer_sampling_method='norm_estimation')El método de estimación de la norma es más lento que las opciones alternativas
metropolisoresampled_metropolis, pero ofrece un mejor rendimiento en circuitos con distribuciones de salida dispersas. Para más información, consulte la documentación deQasmSimulator. -
Añade instrucciones para guardar el estado del simulador en varios formatos. Estas instrucciones son
qiskit.providers.aer.library.SaveDensityMatrixqiskit.providers.aer.library.SaveMatrixProductStateqiskit.providers.aer.library.SaveStabilizerqiskit.providers.aer.library.SaveStateqiskit.providers.aer.library.SaveStatevectorqiskit.providers.aer.library.SaveStatevectorDictqiskit.providers.aer.library.SaveUnitary
Estas instrucciones pueden añadirse a un circuito cuántico utilizando los métodos de circuito
save_density_matrix,save_matrix_product_state,save_stabilizer,save_state,save_statevector,save_statevector_dict,save_unitaryque se añaden aQuantumCircuital importar Aer.Consulte la documentación de la API
qiskit.providers.aer.librarypara obtener información detallada sobre la compatibilidad de métodos para cada instrucción.Tenga en cuenta que las instrucciones de instantánea
SnapshotStatevector,SnapshotDensityMatrix,SnapshotStabilizersiguen siendo compatibles, pero quedarán obsoletas en una futura versión. -
Añade
qiskit.providers.aer.library.SaveExpectationValueyqiskit.providers.aer.library.SaveExpectationValueVarianceinstrucciones de circuito cuántico para guardar el valor de la expectativa , o el valor de la expectativa y la varianza , de un operador hermitiano para el estado del simulador . Estas instrucciones pueden añadirse a un circuito cuántico utilizando los métodos de circuitosave_expectation_valueysave_expectation_value_varianceque se añade aQuantumCircuital importar Aer.Tenga en cuenta que la instrucción snapshot
SnapshotExpectationValue, todavía está soportada pero será obsoleta en una futura versión. -
Añade
qiskit.providers.aer.library.SaveProbabilitiesyqiskit.providers.aer.library.SaveProbabilitiesDictinstrucción de circuito cuántico para guardar todas las probabilidades de resultado de medición para mediciones de base Z del estado simualtor. Estas instrucciones se pueden añadir a un circuito cuántico utilizando los métodos de circuitosave_probabilitiesysave_probabilities_dictque se añade aQuantumCircuital importar Aer.Tenga en cuenta que la instrucción snapshot
SnapshotProbabilities, todavía está soportada pero será obsoleta en una futura versión. -
Añade instrucciones de circuito
qiskit.providers.aer.library.SaveAmplitudesyqiskit.providers.aer.library.SaveAmplitudesSquaredpara guardar amplitudes de vector de estado complejo seleccionado, o seleccionar probabilidades (amplitudes al cuadrado) para los métodos de simulación soportados. Estas instrucciones pueden añadirse a un circuito cuántico utilizando los métodos de circuitosave_amplitudesysave_amplitudes_squaredque se añade aQuantumCircuital importar Aer. -
Añade instrucciones para establecer el estado de los simuladores. Estas instrucciones deben definirse sobre el número total de qubits del circuito. Pueden aplicarse en cualquier punto de un circuito y sustituirán el estado del simulador por el especificado. Las instrucciones añadidas son
qiskit.providers.aer.library.SetDensityMatrixqiskit.providers.aer.library.SetStabilizerqiskit.providers.aer.library.SetStatevectorqiskit.providers.aer.library.SetUnitary
Estas instrucciones pueden añadirse a un circuito cuántico utilizando los métodos de circuito
set_density_matrix,set_stabilizer,set_statevector,set_unitaryque se añaden aQuantumCircuital importar Aer.Consulte la documentación de la API
qiskit.providers.aer.librarypara obtener información detallada sobre la compatibilidad de métodos para cada instrucción. -
Añadido soporte para puertas diagonales al método de simulación
"matrix_product_state". -
Añadido soporte para la instrucción
initializeal método de simulación"matrix_product_state".
Problemas conocidos
- Existe un problema conocido por el que la simulación de determinados circuitos con un modelo de ruido Kraus utilizando el método de simulación
"matrix_product_state"puede hacer que el simulador se bloquee. Consulte el nº 306 para más información.
Notas de actualización
-
La versión mínima de Conan ha pasado a ser 1.31.2. Esto era necesario para solucionar un problema de compatibilidad con versiones más recientes de urllib3 (que es una dependencia de Conan). También añade compatibilidad nativa con AppleClang 12, lo que resulta útil para los usuarios con nuevos ordenadores Apple.
-
pybind11la versión mínima requerida es 2.6 en lugar de 2.4. Esto es necesario para soportar la compilación habilitada para CUDA en Windows. -
Se ha eliminado Cython como dependencia de compilación.
-
Eliminada la descomposición de compuertas x90 de los modelos de ruido que estaba obsoleta en qiskit-aer 0.7. Esta descomposición se realiza ahora utilizando puertas base de modelos de ruido regulares y el transpilador qiskit.
-
Las siguientes opciones del método de simulación
"extended_stabilizer"han cambiado.extended_stabilizer_measure_sampling: Esta opción ha sido sustituida por las opcionesextended_stabilizer_sampling_method, que controla cómo simulamos la medición de qubits.extended_stabilizer_mixing_time: Esta opción se ha renombrado comoextended_stabilizer_metropolis_mixing_timepara aclarar que sólo se aplica a los métodos de muestreometropolisyresampled_metropolis.extended_stabilizer_norm_estimation_samples: Esta opción ha pasado a llamarseextended_stabilizer_norm_estimation_default_samples.
Se ha añadido una opción adicional,
extended_stabilizer_norm_estimation_repetitions, que controla parte del comportamiento del método de muestreo de estimación de normas.
Notas sobre características en desuso
- Python 3.6 ha quedado obsoleto y se eliminará en una próxima versión. Cuando se elimine la compatibilidad, deberá actualizar la versión de Python que esté utilizando a Python 3.7 o superior.
Corrección de errores
- Se ha corregido un error de
AerProviderpor el que las opciones establecidas en los backends devueltos medianteset_options()se almacenaban en el proveedor y persistían en llamadas posteriores aget_backend()para el mismo backend. Ahora cada llamada a ybackends()devuelve una nueva instancia del backend del simulador que se puede configurar. - Se corrige un error en el mensaje de error devuelto cuando un circuito contiene instrucciones de simulador no compatibles. Anteriormente, algunas instrucciones compatibles también aparecían en el mensaje de error junto con las instrucciones no compatibles.
- Se soluciona un problema con la configuración de las puertas base de
QasmSimulatorcuando se utilizan juntas las opciones"method"y"noise_model", y cuando se utilizan con un simulador construido confrom_backend(). Ahora las puertas base listadas serán la intersección de las puertas soportadas por la configuración del backend, el método de simulación y las puertas base del modelo de ruido. Si la intersección de las puertas base del modelo de ruido y las puertas base del simulador está vacía, se registrará una advertencia. - Corregido error por el que la puerta
"sx"`SXGateno aparecía como puerta soportada en el código C++, enStateOpSetdematrix_product_state.hp. - Se ha corregido un error por el que
"csx","cu2","cu3"aparecían incorrectamente en la lista de puertas base admitidas para el método"density_matrix"deQasmSimulator. - Corrección de un error por el que los parámetros se pasaban incorrectamente entre funciones en
matrix_product_state_internal.cpp, provocando una simulación errónea, así como alcanzar estados no válidos, lo que a su vez provocaba un bucle infinito. - Se corrige un error que provocaba que
c_ifno funcionara cuando la anchura del registro condicional era superior a 64. Ver #1077. - Corrige un error #1153 ) por el que el ruido en las puertas condicionales se aplicaba siempre independientemente de si la puerta condicional se aplicaba realmente basándose en el valor del registro clásico. Ahora el ruido en una puerta condicional sólo se aplicará en el caso en que se aplique la puerta condicional.
- Corrige un error con OpenMP anidada bandera estaba siendo fijado a true cuando no debería ser.
- Se corrige un error al aplicar el truncamiento en el método de estado del producto matricial de la QasmSimulator.
- Solucionado el problema nº 1126 : error al informar de la medición de un único qubit. El error se producía al copiar el valor medido en la estructura de datos de salida.
- 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.
- Se corrige un error del método
from_backend()deQasmSimulatorque establecía el atributolocalde la configuración en el valor del backend en lugar de establecerlo siempre enTrue. - Se corrige un error en
from_backend()yfrom_backend()dondebasis_gatesse establecía incorrectamente para dispositivos IBMQ con puerta base establecida['id', 'rz', 'sx', 'x', 'cx']. Ahora el modelo de ruido siempre tendrá las mismas puertas base que las puertas base del backend, independientemente de si esas instrucciones tienen errores en el modelo de ruido o no. - Se soluciona un problema por el que el método de simulación "extended_stabilizer" ampliado daba resultados incorrectos en circuitos cuánticos con distribuciones de salida dispersas. Consulte el nº 306 para obtener más información y ejemplos.
Ignis 0.6.0
Nuevas funciones
- La función
qiskit.ignis.mitigation.expval_meas_mitigator_circuits()se ha mejorado de modo que el número de circuitos generados por la función utilizada para la calibración por el método CTMP se reduce de a (donde es el número de qubits).
Notas de actualización
- La función
qiskit.ignis.verification.randomized_benchmarking_seq()utiliza ahora la clase CNOTDihedral mejorada,qiskit.ignis.verification.CNOTDihedral, que permite realizar una evaluación comparativa aleatoria CNOT-Dihedral en más de dos qubits. - El paquete python
retworkxes ahora un requisito para instalar qiskit-ignis. Sustituye al uso anterior denetworkx(que ya no es un requisito) para obtener un mejor rendimiento. - La dependencia
scikit-learnya no es necesaria y ahora es un requisito opcional. Si está utilizando los discriminadores de medición IQ (IQDiscriminationFitter,LinearIQDiscriminationFitter,QuadraticIQDiscriminationFitter, oSklearnIQDiscriminator) ahora tendrá que instalar manualmente scikit-learn, ya sea ejecutandopip install scikit-learno cuando también esté instalando qiskit-ignis conpip install qiskit-ignis[iq].
Corrección de errores
- Se ha solucionado un problema en el método de valor de expectativa
expectation_value(), para las clases de mitigación de erroresTensoredExpvalMeasMitigatoryCTMPExpvalMeasMitigatorsi no se especificaba el kwargqubitsse utilizaba incorrectamente el número total de qubits del mitigador, en lugar del número de bits clásicos del diccionario de recuento, lo que reducía considerablemente el rendimiento. Corregido #561 - Corrige el método
"auto"deTomographyFitter,StateTomographyFitter, yProcessTomographyFitterpara que sólo utilice"cvx"si CVXPY está instalado y se dispone de un solucionador SDP de terceros distinto de SCS. Esto se debe a que el solver SCS tiene menor precisión que otros métodos de solver y a menudo devuelve una matriz de densidad o matriz de Choi que no es completamente positiva y falla en la validación cuando se utiliza con el métodoqiskit.quantum_info.state_fidelity()oqiskit.quantum_info.process_fidelity().
Aqua 0.9.0
Esta versión deja oficialmente obsoleto el proyecto Qiskit Aqua, en el futuro (no antes de 3 meses a partir de esta versión) el proyecto Aqua tendrá su versión final y será archivado. Toda la funcionalidad que qiskit-aqua proporciona ha sido migrada a nuevos paquetes o a otros paquetes qiskit. Los módulos de aplicación que proporciona qiskit-aqua se han dividido en varios paquetes nuevos: qiskit-optimization, qiskit-nature, qiskit-machine-learning, y qiskit-finance. Estos paquetes pueden instalarse por sí solos (mediante el comando estándar pip install, es decir, pip install qiskit-nature) o con el resto del metapaquete Qiskit como extras opcionales (es decir, pip install 'qiskit[finance,optimization]' o pip install 'qiskit[all]'. Los componentes básicos de los algoritmos y el flujo de operadores existen ahora como parte de qiskit-terra en qiskit.algorithms y qiskit.opflow. Dependiendo del uso que hagas de Aqua, deberás utilizar los paquetes de la aplicación o los nuevos módulos de Qiskit Terra.
Para más detalles sobre cómo migrar desde Qiskit Aqua, puedes consultar la guía de migración.
IBM Proveedor Q 0.12.2
No cambia