Notas de la versión de Qiskit 0.20
0.20.1
Terra 0.15.2
Corrección de errores
- Al acceder al atributo
definitionde una instancia parametrizadaGate, elQuantumCircuitgenerado se había generado con unParameterTableno válido, de forma que la lectura deQuantumCircuit.parameterso la llamada aQuantumCircuit.bind_parametersinformaban incorrectamente de los parámetros no vinculados. Esto se ha resuelto. SXGate().inverse()había devuelto anteriormente una puerta 'sx_dg' con unadefinitioncorrecta peroto_matrixincorrecta. Se ha actualizado para queSXGate().inverse()devuelva unSXdgGate()y viceversa.Instruction.inverse()cuando no es sobrescrito por una subclase, en algunos casos devuelve una instancia deGatecon un métodoto_matrixincorrecto. Se han eliminado los casos de métodosto_matrixincorrectos.- Para
C3XGatecon unangledistinto de cero, la inversión de la puerta a través deC3XGate.inverse()había generado previamente una puerta inversa incorrecta. Se ha corregido. - Los modos de
MCXGatese han actualizado para que devuelvan una puerta del mismo modo al llamar a.inverse(). Esto resuelve un problema por el que, en algunos casos, transpilar un circuito que contiene la inversa de una puertaMCXVChainprovocaba un error. - Anteriormente, al crear una puerta de fase controlada múltiplemente a través de
PhaseGate.control, se devolvía una puertaMCU1Gate. Esto se ha corregido para que se devuelva unMCPhaseGate. - Anteriormente, al intentar descomponer un circuito que contenía un
MCPhaseGatese producía un error debido a una incoherencia en la definición delMCPhaseGate. Se ha corregido. QuantumCircuit.composeyDAGCircuit.composehabían traducido incorrectamente, en algunos casos, puertas condicionales si el circuito de entrada contenía más de unaClassicalRegister. Esto se ha resuelto.- Se ha corregido un problema al crear un
qiskit.result.Countsa partir de un diccionario de datos vacío. Esto creará un objetoCountsvacío. El métodomost_frequent()también se actualiza para lanzar una excepción más descriptiva cuando el objeto está vacío. Correcciones #5017 - La ampliación de circuitos con registros diferentes actualizaba las propiedades
qregsycregsen consecuencia, pero no las listasqubitsyclbits. Como éstas ya no se generan a partir de los registros, sino que son listas almacenadas en caché, se produce una discrepancia de registros y bits. Esto se ha solucionado y el métodoextendactualiza explícitamente las listas de bits almacenadas en caché. - Corrección de errores de las implementaciones concretas del método meth:~qiskit.circuit.ControlledGate.inverse que no conservan el parámetro
ctrl_state. - Se ha corregido un error que provocaba que las programaciones de pulsos largos arrojaran un error de recursividad.
Aer 0.6.1
No cambia
Ignis 0.4.0
No cambia
Aqua 0.7.5
No cambia
IBM Proveedor Q 0.8.0
No cambia
0.20.0
Terra 0.15.1
Preludio
La versión 0.15.0 incluye varias novedades y correcciones de errores. Algunas de las novedades más destacadas son:
Esta versión incluye la introducción de la traducción de bases arbitrarias en el transpilador. Esto incluye la posibilidad de dirigirse directamente a una gama más amplia de conjuntos de bases de dispositivos, por ejemplo, backends que implementen puertas RZ, RY, RZ, CZ o iSwap.
La clase QuantumCircuit rastrea ahora la fase global. Esto significa que el control de un circuito que tiene fase global ahora añade correctamente una fase relativa, y las definiciones de la matriz de puerta son ahora exactas en lugar de iguales hasta una fase global.
Nuevas funciones
-
Una nueva clase DAG
qiskit.dagcircuit.DAGDependencypara representar la forma de dependencia de circuito, En este DAG, los nodos son operaciones (compuertas, medida, barrera, etc...) y las aristas corresponden a la no conmutación entre dos operaciones. -
Se añaden cuatro nuevas funciones a
qiskit.converterspara convertir de ida y vuelta aDAGDependency. Estas funciones son:circuit_to_dagdependency()para convertir de unQuantumCircuitobjeto a unDAGDependencyobjeto.dagdependency_to_circuit()para convertir de unDAGDependencyobjeto a unQuantumCircuitobjeto.dag_to_dagdependency()para convertir de unDAGCircuitobjeto a unDAGDependencyobjeto.dagdependency_to_dag()para convertir de unDAGDependencyobjeto a unDAGCircuitobjeto.
Por ejemplo:
from qiskit.converters.dagdependency_to_circuit import dagdependency_to_circuit from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit circuit_in = QuantumCircuit(2) circuit_in.h(qr[0]) circuit_in.h(qr[1]) dag_dependency = circuit_to_dagdependency(circuit_in) circuit_out = dagdepency_to_circuit(dag_dependency) -
Se han añadido dos nuevos pases de transpilador a
qiskit.transpiler.passesEl primero,UnrollCustomDefinitionsdesenrolla todas las instrucciones del circuito según su propiedaddefinitiony se detiene al llegar a la direcciónbasis_gatesespecificada o a un conjunto de puertas de la propiedadEquivalenceLibrary. La segunda,BasisTranslatorutiliza el conjunto de conversiones en elEquivalenceLibrarypara reescribir instrucciones de circuito en una base especificada. -
Se ha añadido un nuevo argumento de palabra clave
translation_methodatranspile()para permitir la selección del método que se utilizará para traducir los circuitos a las puertas de dispositivo disponibles. Por ejemplo,transpile(circ, backend, translation_method='translator'). Las opciones válidas son:'unroller'para utilizar elUnrollerpase'translator'para utilizar elBasisTranslatorpasar.'synthesis'para utilizar elUnitarySynthesispasar.
El valor predeterminado es
'translator'. -
Se ha añadido una nueva clase para manejar los datos de los resultados de los recuentos,
qiskit.result.Countsse ha añadido. Esta clase es una subclase dedicty se puede interactuar con ella como con cualquier otro diccionario. Sin embargo, incluye métodos y atributos de ayuda para tratar los resultados de los recuentos de los experimentos y también se encarga del postprocesamiento y el formateo de cadenas binarias en la inicialización del objeto. ACountsobjeto puede crearse pasando un diccionario de cuentas cuyas claves sean enteros, cadenas hexadecimales de la forma'0x4a', cadenas binarias de la forma'0b1101', una cadena de bits formateada a través de registros y ranuras de memoria (es decir,'00 10'), o una cadena dit. Por ejemplo:from qiskit.result import Counts counts = Counts({"0x0': 1, '0x1', 3, '0x2': 1020}) -
Se ha añadido un nuevo método para construir
qiskit.dagcircuit.DAGCircuitobjetos,from_networkx(). Este método recibe un objeto networkxMultiDiGraph(en el formato devuelto porto_networkx()) y devuelve un nuevo objetoDAGCircuitobjeto. La intención de esta función es permitir a los autores de pases de transpilador aprovechar la biblioteca de algoritmos de grafos de networkx si falta una función en la API de retworkx. Aunque, con suerte, en estos casos se abrirá una incidencia en el gestor de incidencias de retworkx (o incluso mejor se enviará un pull request). -
Se ha añadido un nuevo kwarg para
init_qubitsenassemble()yexecute(). Para los backends que soportan esta característicainit_qubitsse puede utilizar para controlar si el backend que ejecuta los circuitos inserta alguna secuencia de inicialización al comienzo de cada disparo. Por defecto, se establece enTrue, lo que significa que se puede suponer que todos los qubits están en el estado de tierra al comienzo de cada disparo. Sin embargo, cuandoinit_qubitsse establece enFalselos qubits no se inicializarán al comienzo de cada experimento y entre disparos. Tenga en cuenta que el backend que ejecuta los circuitos tiene que soportar esta característica para que esta bandera tenga algún efecto. -
Se ha añadido un nuevo kwarg
rep_delayaqiskit.compiler.assemble(),qiskit.execute.execute(), y al constructor dePulseQobjtConfig.qiskit Este nuevo kwarg se utiliza para denotar el tiempo entre ejecuciones del programa. Debe elegirse de la lista de valores válidos establecida comorep_delaysen el objetoPulseBackendConfigurational que se puede acceder comobackend.configuration().rep_delays).El kwarg
rep_delaysólo funcionará en backends que permitan un tiempo de repetición dinámico. Esto también se indicará en el objetoPulseBackendConfigurationde un backend como atributodynamic_reprate_enabled. Sidynamic_reprate_enabledesFalseentonces el valorrep_timeespecificado paraqiskit.compiler.assemble()qiskit.execute.execute(), o el constructor dePulseQobjtConfigen lugar derep_delay.rep_timesólo permite a los usuarios especificar la duración de un programa, y no el retardo entre programas. -
El archivo
qobj_schema.jsonJSON Schema enqiskit.schemasse ha actualizado para incluir elrep_delaycomo una propiedad de configuración opcional para qobjs de pulso. -
El archivo
backend_configuration_schema.jsonJSON Schema en mod:qiskit.schemas se ha actualizado para incluirrep_delay_rangeydefault_rep_delaycomo propiedades opcionales para una configuración de backend de pulso. -
Se ha añadido un nuevo atributo
global_phaseque se utiliza para el seguimiento de la fase global se ha añadido a la claseqiskit.circuit.QuantumCircuitclase. Por ejemplo:import math from qiskit import QuantumCircuit circ = QuantumCircuit(1, global_phase=math.pi) circ.u1(0)La fase global también puede modificarse o consultarse con
circ.global_phaseen el ejemplo anterior. En ambos casos, el ajuste se realiza en radianes. Si el circuito se convierte en una instrucción o puerta, la fase global se representa mediante dos rotaciones de un qubit en el primer qubit.Esto permite que otros métodos y funciones que consumen un objeto
QuantumCircuittengan en cuenta la fase global. Por ejemplo. con elglobal_phaseatributo elto_matrix()de una puerta puede ahora corresponder exactamente a sus descomposiciones en lugar de sólo hasta una fase global.También se ha añadido el mismo atributo a la clase
DAGCircuitpara que se pueda seguir la fase global al convertir entreQuantumCircuityDAGCircuit. -
Dos nuevas clases,
AncillaRegisteryAncillaQubitse han añadido al móduloqiskit.circuitmódulo. Son subclases deQuantumRegisteryQubitrespectivamente y permiten marcar qubits siendo ancillas. Esto permitirá reutilizar estos qubits en circuitos y algoritmos más grandes. -
Se ha añadido un nuevo método
control()se ha añadido al móduloQuantumCircuit. Este método devolverá una versión controlada del objetoQuantumCircuitcon controles abiertos y cerrados. Hasta ahora, esta funcionalidad sólo era accesible a través de la claseGateclase. -
Se ha añadido un nuevo método
repeat()a la claseQuantumCircuitclase. Devuelve un nuevo objeto circuito que contiene un número especificado de repeticiones del circuito original. Por ejemplo:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) repeated_qc = qc.repeat(3) repeated_qc.decompose().draw(output='mpl')Los parámetros se copian por referencia, lo que significa que si actualizas los parámetros en una instancia del circuito se actualizarán todas las repeticiones.
-
Se ha añadido un nuevo método
reverse_bits()a la claseQuantumCircuitclase. Este método invertirá el orden de los bits de un circuito (tanto los cuánticos como los clásicos). Puede utilizarse para cambiar un circuito de little-endian a big-endian y viceversa. -
Se ha añadido un nuevo método,
combine_into_edge_map()a la claseqiskit.transpiler.Layoutclase. Este método permite convertir dosLayoutobjetos en un mapa de qubits para componer dos circuitos. -
Se ha añadido una nueva clase,
ConfigurableFakeBackend, al móduloqiskit.test.mock.utils. Esta nueva clase permite la creación de backends simulados configurables para su uso en pruebas. Por ejemplo:from qiskit.test.mock.utils import ConfigurableFakeBackend backend = ConfigurableFakeBackend("Tashkent", n_qubits=100, version="0.0.1", basis_gates=['u1'], qubit_t1=99., qubit_t2=146., qubit_frequency=5., qubit_readout_error=0.01, single_qubit_gates=['u1'])creará un objeto backend con 100 qubits y todos los demás parámetros especificados en el constructor.
-
Se ha añadido un nuevo método
draw()a la claseqiskit.circuit.EquivalenceLibraryclase. Este método se puede utilizar para dibujar el contenido de una biblioteca de equivalencias, lo que puede ser útil para la depuración. Por ejemplo:from numpy import pi from qiskit.circuit import EquivalenceLibrary from qiskit.circuit import QuantumCircuit from qiskit.circuit import QuantumRegister from qiskit.circuit import Parameter from qiskit.circuit.library import HGate from qiskit.circuit.library import U2Gate from qiskit.circuit.library import U3Gate my_equiv_library = EquivalenceLibrary() q = QuantumRegister(1, 'q') def_h = QuantumCircuit(q) def_h.append(U2Gate(0, pi), [q[0]], []) my_equiv_library.add_equivalence(HGate(), def_h) theta = Parameter('theta') phi = Parameter('phi') lam = Parameter('lam') def_u2 = QuantumCircuit(q) def_u2.append(U3Gate(pi / 2, phi, lam), [q[0]], []) my_equiv_library.add_equivalence(U2Gate(phi, lam), def_u2) my_equiv_library.draw() -
Se ha añadido una nueva instrucción de fase,
SetPhase, aqiskit.pulse. Esta instrucción ajusta la fase de los pulsos subsiguientes a la fase especificada (en radianes. Por ejemplo:import numpy as np from qiskit.pulse import DriveChannel from qiskit.pulse import Schedule from qiskit.pulse import SetPhase sched = Schedule() sched += SetPhase(np.pi, DriveChannel(0))En este ejemplo, la fase de los pulsos aplicados a
DriveChannel(0)después de la instrucciónSetPhasese fijará en radianes. -
Se ha añadido una nueva instrucción de pulso
ShiftFrequencyaqiskit.pulse.instructions. Esta instrucción permite desplazar la frecuencia de un canal de su frecuencia establecida. Por ejemplo:from qiskit.pulse import DriveChannel from qiskit.pulse import Schedule from qiskit.pulse import ShiftFrequency sched = Schedule() sched += ShiftFrequency(-340e6, DriveChannel(0))En este ejemplo, todos los pulsos aplicados a
DriveChannel(0)después del comandoShiftFrequencytendrán la frecuencia de la envolvente a disminuida por 340MHz. -
Se ha añadido un nuevo método
conjugate()a la claseParameterExpressionclase. Esto permite llamar anumpy.conj()sin que se produzca un error. Puesto que unParameterExpressiones real, se devolverá a sí mismo. Este comportamiento es análogo al de Python floats/ints. -
Se ha añadido una nueva clase
PhaseEstimationse ha añadido aqiskit.circuit.library. Esta clase de biblioteca de circuitos es el circuito utilizado en la formulación original del algoritmo de estimación de fase en arXiv:quant-ph/9511026. La estimación de fase es la tarea de estimar la fase de un valor propio de un operador unitario , provisto del correspondiente estado propio . Es decir
Esta estimación (y por tanto este circuito) es una rutina central de varios algoritmos bien conocidos, como el algoritmo de Shor o la Estimación Cuántica de Amplitud.
-
La función
qiskit.visualizationfunciónplot_state_qsphere()tiene un nuevo kwargshow_state_labelsque se utiliza para controlar si cada mancha de la visualización qsphere está etiquetada. Por defecto este kwarg está configurado enTruey muestra los estados base junto a cada blob por defecto. Esta función puede desactivarse, volviendo al comportamiento anterior, configurando el kwargshow_state_labelsenFalse. -
La función
qiskit.visualizationfunciónplot_state_qsphere()tiene un nuevo kwargshow_state_phasesque se establece enFalsepor defecto. Cuando se configura enTruemuestra la fase de cada estado base. -
La función
qiskit.visualizationfunciónplot_state_qsphere()tiene un nuevo kwarguse_degreesque se establece enFalsepor defecto. Cuando se configura enTruemuestra la fase de cada estado base en grados, junto con el círculo de fase en la parte inferior derecha. -
Una nueva clase,
QuadraticFormen el móduloqiskit.circuit.librarypara implementar una forma cuadrática en variables binarias. El elemento de la biblioteca de circuitos implementa la operación
para la forma cuadrática y qubits de salida. El resultado está en la qubits de salida se codifica en complemento a dos. Si no se especifica , el circuito elegirá el número mínimo de qubits necesarios para representar el resultado sin aplicar una operación de módulo. La forma cuadrática se especifica utilizando una matriz para los términos cuadráticos, un vector para los términos lineales y un desplazamiento constante. Si todos los términos son enteros, el circuito implementa la forma cuadrática exactamente, de lo contrario es sólo una aproximación.
Por ejemplo:
import numpy as np
from qiskit.circuit.library import QuadraticForm
A = np.array([[1, 2], [-1, 0]])
b = np.array([3, -3])
c = -2
m = 4
quad_form_circuit = QuadraticForm(m, A, b, c)-
Añada
qiskit.quantum_info.Statevector.expectation_value()yqiskit.quantum_info.DensityMatrix.expectation_value()métodos para calcular el valor de expectativa de unqiskit.quantum_info.Operator. -
Para el
seedkwarg en el constructor paraqiskit.circuit.library.QuantumVolumeahora se pueden utilizar los objetos generadores aleatorios numpy. Anteriormente, sólo los números enteros eran una entrada válida. Esto resulta útil cuando se integraQuantumVolumecomo parte de una función mayor con su propia generación de números aleatorios, por ejemplo, generando una secuencia deQuantumVolumecircuitos. -
El método
QuantumCircuitmétodocompose()tiene un nuevo kwargfrontque puede utilizarse para anteponer el otro circuito al circuito de origen en lugar de añadirlo. Por ejemplo:from qiskit.circuit import QuantumCircuit circ1 = QuantumCircuit(2) circ2 = QuantumCircuit(2) circ2.h(0) circ1.cx(0, 1) circ1.compose(circ2, front=True).draw(output='mpl') -
Dos nuevos pases,
SabreLayoutySabreSwappara el trazado y enrutamiento se han añadido aqiskit.transpiler.passes. Estos nuevos pases se basan en el algoritmo presentado en Li et al., "Tackling the Qubit Mapping Problem for NISQ-Era Quantum Devices", ASPLOS 2019. También pueden seleccionarse al utilizar la funcióntranspile()ajustando el kwarglayout_methoda'sabre'y/o elrouting_methoda'sabre'para utilizarSabreLayoutySabreSwaprespectivamente. -
Añadido el método
replace()a la claseqiskit.pulse.Scheduleque permite sustituir una instrucción de impulso por otra. Por ejemplo:.. code-block:: pythonfrom qiskit import pulso
d0 = pulse.DriveChannel(0)
sched = pulse.Schedule ()
antiguo = pulse.Play ( pulse.Constant (100, 1.0 ), d0 ) nuevo = pulse.Play ( pulse.Constant (100, 0.1 ), d0 )
sched += antiguo
sched = sched.replace (antiguo, nuevo)
assert sched == pulse.Schedule (nuevo)
-
Se han añadido nuevas clases de compuertas a
qiskit.circuit.librarypara las compuertas , su adjunta , y controlada comoSXGate,SXdgGateyCSXGate. También pueden añadirse a unQuantumCircuitobjeto mediante los botonessx(),sxdg()ycsx()respectivamente. -
Añadir soporte para
Resetinstrucciones paraqiskit.quantum_info.Statevector.from_instruction(). Nótese que esto implica un muestreo RNG en la elección de la proyección al estado cero en el caso de que el qubit esté en un estado de superposición. La semilla para el muestreo puede establecerse mediante el métodoseed()método. -
Los métodos
qiskit.circuit.ParameterExpression.subs()yqiskit.circuit.QuantumCircuit.assign_parameters()aceptan ahoraParameterExpressioncomo valor objetivo a sustituir.Por ejemplo:
from qiskit.circuit import QuantumCircuit, Parameter p = Parameter('p') source = QuantumCircuit(1) source.rz(p, 0) x = Parameter('x') source.assign_parameters({p: x*x})┌──────────┐ q_0: ┤ Rz(x**2) ├ └──────────┘ -
El método
QuantumCircuit()métodoto_gate()tiene un nuevo kwarglabelque se puede utilizar para establecer una etiqueta para el objeto de salidaGatedel objeto. Por ejemplo:from qiskit.circuit import QuantumCircuit circuit_gate = QuantumCircuit(2) circuit_gate.h(0) circuit_gate.cx(0, 1) custom_gate = circuit_gate.to_gate(label='My Special Bell') new_circ = QuantumCircuit(2) new_circ.append(custom_gate, [0, 1], []) new_circ.draw(output='mpl') -
Añadido el
UGate,CUGate,PhaseGateyCPhaseGatecon los correspondientesQuantumCircuitmétodosu(),cu(),p()ycp(). La puertaUGatepuerta es la puerta genérica de rotación de un qubit con 3 ángulos de Euler y laCUGatesu versión controlada.CUGatetiene 4 parámetros para tener en cuenta una posible fase global de la puerta U. EnPhaseGateyCPhaseGateson la puerta de fase general en un ángulo arbitrario y su versión controlada. -
Se ha añadido un nuevo kwarg,
cregbundle, a la funciónqiskit.visualization.circuit_drawer()y al métodoQuantumCircuitmétododraw(). Si se configura enTrue, los cregs se agruparán en una sola línea en las visualizaciones de circuitos de los cajonestextympl. El valor predeterminado esTrue. Soluciona el problema nº 4290.Por ejemplo:
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', cregbundle=True) -
Se ha añadido un nuevo kwarg,
initial_state, a la funciónqiskit.visualization.circuit_drawer()y al métodoQuantumCircuitmétododraw(). Si se configura enTrue, el estado inicial se incluirá ahora en las visualizaciones de circuitos de todos los cajones. Soluciona el problema nº 4293.Por ejemplo:
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', initial_state=True) -
Ahora se mostrarán las etiquetas al utilizar el cajón "mpl". Existen dos tipos de etiquetas: las de puerta y las de control. Las etiquetas de las puertas sustituirán al nombre de la puerta en la pantalla. Las etiquetas de control se mostrarán encima o debajo de los controles de una puerta. Soluciona los problemas nº 3766 y nº 4580.
Por ejemplo:
from qiskit import QuantumCircuit from qiskit.circuit.library.standard_gates import YGate circuit = QuantumCircuit(2) circuit.append(YGate(label='A Y Gate').control(label='Y Control'), [0, 1]) circuit.draw(output='mpl')
Notas de actualización
-
Implementación de la puerta X multicontrolada (
MCXGrayCode,MCXRecursiveyMCXVChain) han cambiado sus propiedadesnamepara describir con mayor precisión su implementación:mcx_graymcx_recursiveymcx_vchainrespectivamente. Anteriormente, estas puertas compartían el nombremcxconMCXGatelo que provocaba que estas puertas se transpilaran y simularan incorrectamente. -
Por defecto, los gestores de pases preestablecidos en
qiskit.transpiler.preset_passmanagersutilizanUnrollCustomDefinitionsyBasisTranslatorpara manejar el cambio de base en lugar del anterior por defectoUnroller. Esto se hizo porque los nuevos pases son más flexibles y permiten apuntar a cualquier conjunto de bases, aunque el resultado puede diferir. Para utilizar el valor predeterminado anterior, puede establecer el kwargtranslation_methodentranspile()a'unroller'. -
Las funciones de conversión
qiskit.converters.circuit_to_gate()y :func` qiskit.converters.circuit_to_instruction\incluían automáticamente la puerta o instrucción generada enSessionEquivalenceLibrary. Estos convertidores aceptan ahora un argumento opcional de palabra claveequivalence_library` para especificar si las instancias convertidas deben registrarse y dónde. El comportamiento por defecto ha cambiado para no registrar la instancia convertida. -
El valor por defecto de la
cregbundlekwarg para elqiskit.circuit.QuantumCircuit.draw()y la funciónqiskit.visualization.circuit_drawer()se ha cambiado aTrue. Esto significa que, por defecto, los bits clásicos del esquema del circuito se agruparán ahora por defecto, por ejemplo:from qiskit.circuit import QuantumCircuit circ = QuantumCircuit(4) circ.x(0) circ.h(1) circ.measure_all() circ.draw(output='mpl')Si desea que el dibujo de su circuito mantenga el comportamiento anterior y muestre cada bit clásico en el diagrama, puede establecer el kwarg
cregbundleenFalse. Por ejemplo:from qiskit.circuit import QuantumCircuit circ = QuantumCircuit(4) circ.x(0) circ.h(1) circ.measure_all() circ.draw(output='mpl', cregbundle=False) -
Scheduletrazando conqiskit.pulse.Schedule.draw()yqiskit.visualization.pulse_drawer()ya no mostrará la tabla de eventos por defecto. Puede volver a activarse configurandotablekwarg enTrue. -
El pase
RemoveResetInZeroStatese incluía anteriormente en el gestor de pases predefinidoslevel_0_pass_manager()que se utilizaba con las funcionesoptimization_level=0paratranspile()yexecute(). Sin embargo,RemoveResetInZeroStatees un pase de optimización y no debería haber sido incluido en el nivel de optimización 0 y fue eliminado. Si necesita ejecutartranspile()conRemoveResetInZeroStateutilice un gestor de pases personalizado ooptimization_level1, 2 o 3. -
El kwarg obsoleto
line_lengthpara la funciónqiskit.visualization.circuit_drawer()y el métodoqiskit.circuit.QuantumCircuit.draw()ha sido eliminado. Estaba obsoleta desde la versión 0.10.0. En su lugar, puede utilizarfoldkwarg para ajustar la anchura del diagrama del circuito. -
El modo de salida
'mpl'para elqiskit.circuit.QuantumCircuit.draw()ycircuit_drawer()requiere ahora la instalación de la biblioteca pylatexenc. Esto ya era una dependencia opcional para la visualización, pero antes sólo se requería para el modo de salida'latex'. Ahora también es necesario para el cajón matplotlib porque es necesario para manejar correctamente el tamaño de las compuertas con las etiquetas mathtext de matplotlib para las compuertas. -
Se han suprimido los métodos obsoletos
get_tokenspara los archivosqiskit.qasm.Qasmyqiskit.qasm.QasmParserhan sido eliminados. Estos métodos están obsoletos desde la versión 0.9.0. En su lugar, deben utilizarse los métodosqiskit.qasm.Qasm.generate_tokens()yqiskit.qasm.QasmParser.generate_tokens(). -
El kwarg obsoleto
channels_to_plotparaqiskit.pulse.Schedule.draw()qiskit.pulse.Instruction.draw(),qiskit.visualization.pulse.matplotlib.ScheduleDrawer.drawypulse_drawer()ha sido eliminado. El kwarg está obsoleto desde la versión 0.11.0 y ha sido sustituido por el kwargchannels, que funciona de forma idéntica y debería utilizarse en su lugar. -
El atributo obsoleto
circuit_instruction_mapde la claseqiskit.providers.models.PulseDefaultsha sido eliminado. Este atributo está obsoleto desde la versión 0.12.0 y ha sido sustituido por el atributoinstruction_schedule_map, que puede utilizarse en su lugar. -
El método
uniondeScheduleyInstructionestán obsoletos desde la versión 0.12.0 y han sido eliminados. Utilice en su lugar los métodosqiskit.pulse.Schedule.insert()yqiskit.pulse.Instruction.meth()en lugar de los métodos kwarg``time=0``. -
El argumento obsoleto
scalingdel métododrawdeScheduleyInstructionha sido sustituido porscaledesde la versión 0.12.0 y ahora ha sido eliminado. Utilice en su lugar la direcciónscalekwarg. -
El argumento obsoleto
periodde las funcionesqiskit.pulse.libraryhan sido sustituidos porfreqdesde la versión 0.13.0 y ahora se han eliminado. Utilicefreqkwarg en lugar deperiod. -
El módulo
qiskit.pulse.commandsque contenía las clasesCommandsquedó obsoleto en la versión 0.13.0 y ahora se ha eliminado. Tendrá que actualizar su código Pulse si aún utilizaba comandos. Por ejemplo:AnteriorNuevoCommand(args)(channel)Instruction(args, channel)\ ``python Adquirir(duración)( AcquireChannel(0 )) ``` \ ``python Adquirir(duración, AcquireChannel(0 )) | ```python Delay(duration)(channel) ``` | ```python Delay(duration, channel) ``` | | ```python FrameChange(angle)(DriveChannel(0)) ``` | ```python # FrameChange was also renamed ShiftPhase(angle, DriveChannel(0)) ``` | | ```python Gaussian(...)(DriveChannel(0)) ``` | ```python # Pulses need to be `Play`d Play(Gaussian(...), DriveChannel(0)) ``` | -
Todas las clases y funciones del módulo
qiskit.tool.qiquedaron obsoletas en la versión 0.12.0 y han sido eliminadas. En su lugar, utilice el móduloqiskit.quantum_infoy los nuevos métodos y clases que tiene para trabajar con estados y operadores cuánticos. -
Las funciones
qiskit.quantum_info.basis_stateyqiskit.quantum_info.projectorestán obsoletas a partir de Qiskit Terra 0.12.0 ya no existen. Utilice elqiskit.quantum_info.QuantumStatey sus derivadosqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixpara trabajar con estados. -
Las funciones de trazado interactivo de
qiskit.visualization,iplot_bloch_multivector,iplot_state_city,iplot_state_qsphere,iplot_state_hinton,iplot_histogram,iplot_state_paulivecahora son sólo alias obsoletos para los equivalentes basados en matplotlib y ya no son interactivas. El código JS estático alojado en el que se basaban estas funciones se ha eliminado y ya no pueden funcionar. No era posible una depreciación normal porque el sitio del que dependían ya no existe. -
Los componentes de validación que utilizaban malvavisco de
qiskit.validationse han eliminado de terra. Puesto que ya no se utilizan para construir ningún objeto en terra. -
Las clases del esquema marshmallow en
qiskit.resultse han eliminado porque ya no son utilizadas por la claseqiskit.result.Resultclase. -
La salida del método
to_dict()de la claseqiskit.result.Resultya no está en un formato para la serialización directa de JSON. Dependiendo del contenido que contengan las instancias de estas clases puede haber tipos que el codificador JSON por defecto no sepa manejar, por ejemplo números complejos o matrices numpy. Si vas a serializar directamente en JSON la salida del métodoto_dict()debes asegurarte de que tu codificador JSON puede manejar estos tipos. -
La opción de adquirir varios qubits a la vez quedó obsoleta en la versión 0.12.0 y ahora se ha eliminado. En concreto, se han eliminado los argumentos init
mem_slotsyreg_slotsdeqiskit.pulse.instructions.Acquireychannel,mem_slotyreg_slotprovocarán un error si se proporciona una lista como entrada. -
Se ha eliminado el soporte para el uso de la variable de entorno
USE_RETWORKX, que se introdujo en la versión 0.13.0 para proporcionar una alternativa opcional a la implementación heredada basada en networkxqiskit.dagcircuit.DAGCircuitse ha eliminado. Esta bandera sólo pretendía proporcionar una válvula de alivio para los usuarios que se encontraron con un problema con la nueva aplicación para una versión durante la transición a retworkx. -
El módulo
qiskit.pulseresponsable de las transformaciones horario->horario ha pasado de llamarsereschedule.pyatransforms.py. La ruta de importación anterior ha quedado obsoleta. Para actualizar su código:from qiskit.pulse.rescheduler import <X>debería sustituirse por:
from qiskit.pulse.transforms import <X> -
En versiones anteriores a
PassManagerno permitía que las clasesTransformationPassmodificaran elPropertySet. Esta restricción se ha levantado por lo que una claseTransformationPassahora tiene acceso de lectura y escritura tanto a laPropertySetyDAGCircuitduranterun(). Este cambio se realizó para facilitar de forma más eficienteTransformationPassclases que tienen un estado interno que puede ser necesario para pases posteriores en el archivoPassManager. Sin este cambio habría sido necesario un segundoAnalysisPassredundante para recrear el estado interno, lo que podría añadir una sobrecarga significativa.
Notas sobre características en desuso
-
El nombre del primer parámetro posicional para las
qiskit.visualizationfuncionesplot_state_hinton(),plot_bloch_multivector(),plot_state_city(),plot_state_paulivec()yplot_state_qsphere()ha pasado de llamarserhoastate. Pasar el valor por nombre arhoestá obsoleto y se eliminará en una futura versión. En su lugar, debe pasar el argumento posicionalmente o utilizar el nuevo nombre de parámetrostate. -
El módulo
qiskit.pulse.pulse_libha quedado obsoleto y se eliminará en una próxima versión. Se ha cambiado el nombre aqiskit.pulse.libraryque debería utilizarse en su lugar. -
El método
qiskit.circuit.QuantumCircuitmirror()ha quedado obsoleto y se eliminará en una futura versión. 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. -
Los métodos
qubits()yclbits()deqiskit.dagcircuit.DAGCircuithan quedado obsoletos y se eliminarán en una futura versión. Se han sustituido por propiedades del mismo nombre,qiskit.dagcircuit.DAGCircuit.qubitsyqiskit.dagcircuit.DAGCircuit.clbits, y se almacenan en caché para que acceder a ellas sea mucho más rápido. -
El método
get_sample_pulsepara las clases derivadas deqiskit.pulse.library.ParametricPulse(por ejemploGaussianSquare) ha quedado obsoleto y se eliminará en una futura versión. Se ha sustituido por el métodoget_waveform(por ejemploget_waveform()) que debería comportarse de forma idéntica. -
El uso del argumento opcional
conditionenqiskit.dagcircuit.DAGNode,qiskit.dagcircuit.DAGCircuit.apply_operation_back()yqiskit.dagcircuit.DAGCircuit.apply_operation_front()ha quedado obsoleto y se eliminará en una futura versión. En su lugar, el conjuntocontrolenqiskit.circuit.Instructioninstancias que se añaden a unDAGCircuitdebe utilizarse. -
Los métodos de las clases
set_atolyset_rtolde las clasesqiskit.quantum_info.BaseOperatoryqiskit.quantum_info.QuantumState(y sus subclases comoOperatoryqiskit.quantum_info.DensityMatrix) están obsoletos y se eliminarán en una futura versión. En su lugar, el valor de los atributos.atoly.rtoldebe establecerse en la clase. Por ejemplo:from qiskit.quantum_info import ScalarOp ScalarOp.atol = 3e-5 op = ScalarOp(2) -
Las funciones de trazado interactivo de
qiskit.visualization,iplot_bloch_multivector,iplot_state_city,iplot_state_qsphere,iplot_state_hinton,iplot_histogram,iplot_state_paulivechan quedado obsoletas y se eliminarán en una futura versión. Las funciones equivalentes basadas en matplotlib deqiskit.visualization,plot_bloch_multivector(),plot_state_city(),plot_state_qsphere(),plot_state_hinton(),plot_state_histogram(), yplot_state_paulivec()en su lugar. -
Las propiedades
acquires,mem_slots, yreg_slotsde la instrucciónqiskit.pulse.instructions.Acquirehan quedado obsoletas y se eliminarán en una futura versión. No son más que duplicados dechannel,mem_slotyreg_slotrespectivamente, ahora que se ha eliminado la posibilidad de utilizar varios qubits en una única instrucciónAcquirese ha eliminado. -
La clase
SamplePulsedeqiskit.pulsese ha renombrado aWaveform.SamplePulseestá obsoleto y se eliminará en una futura versión. -
La clave del diccionario de estilo
cregbundleha quedado obsoleta y se eliminará en una futura versión. Se ha sustituido por el kwargcregbundleañadido a la funciónqiskit.visualization.circuit_drawer()y al métodoQuantumCircuitmétododraw().
Corrección de errores
-
El método
qiskit.circuit.QuantumCircuitmétodonum_nonlocal_gatesanteriormente incluía objetos multi-qubitqiskit.circuit.Instruction(por ejemplo,Barrier) en su recuento de puertas no locales. Esto se ha corregido para que sólo se cuenten los objetos no localesGateno locales. Arreglos #4500 -
ControlledGateinstancias con un conjuntoctrl_stateen algunos casos no se evaluaban como iguales, aunque las puertas comparadas fueran equivalentes. Esto se ha resuelto de manera que Fixes #4573 -
Cuando se accede a un bit desde un
qiskit.circuit.QuantumRegisteroqiskit.circuit.ClassicalRegisterpor índice cuando se usan tipos enteros de numpy <https://numpy.org/doc/stable/user/basics.types.html> __ antes lanzaba una excepciónCircuitError. Esto se ha resuelto para que puedan utilizarse tipos numpy además del tipointincorporado en Python. Corrige #3929. -
Se ha corregido un error por el que sólo se utilizaba el primer
qiskit.pulse.configuration.Kerneloqiskit.pulse.configuration.Discriminatorpara unqiskit.pulse.Acquirecuando había varias Adquisiciones al mismo tiempo en unqiskit.pulse.Schedule. -
La unidad SI utilizada para construir objetos
qiskit.pulse.SetFrequencyestá en Hz, pero cuando un objetoPulseQobjInstructionse crea a partir de una instancia deSetFrequencyes necesario convertirla a GHz. Esta conversión faltaba en versiones anteriores y se ha corregido. -
Antes era posible poner a cero el número de qubits de control, en cuyo caso se devolvería la operación original, potencialmente no controlada. Esto podría causar un
AttributeErrorque se plantean si la persona que llama intentó acceder a un atributo que sóloControlledGatetienen. Esto se ha solucionado añadiendo un getter y setter paranum_ctrl_qubitspara validar que se está utilizando un valor válido. Correcciones #4576 -
Los controles abiertos se implementaron modificando un
Gateobjetosdefinition. Sin embargo, cuando la puerta ya existe en el conjunto de bases, esta definición no se utilizaba, lo que provocaba que se enviaran circuitos incorrectos a un backend tras la transpilación. Esto se ha solucionado modificando el pasoUnrollerpara que utilice la definición si encuentra una puerta controlada con los controles abiertos. Correcciones #4437 -
El argumento de la palabra clave
insert_barriersen la claseZZFeatureMapno insertaba realmente barreras entre las capas de Hadamard y las capas de evolución. Se ha corregido para que las barreras se inserten correctamente. -
Se ha solucionado un problema por el que algunas puertas con tres o más qubits no se compilaban en algunos casos. Consulte #4577 <https://github.com/Qiskit/qiskit/issues/4577 para más detalles.
-
El backend de salida matplotlib (
'mpl') para el métodoqiskit.circuit.QuantumCircuitmétododraw()y la funciónqiskit.visualization.circuit_drawer()no se escalaba correctamente cuando se establecía el kwargscale. Las fuentes y el ancho de línea no se ajustaban al resto de la imagen. Esto se ha solucionado y ahora todos los elementos del diagrama del circuito se escalan correctamente. Por ejemplo:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.draw(output='mpl', scale=0.5)Correcciones #4179.
-
Corrige el problema por el que al inicializar o evolucionar
qiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixclases por circuitos por circuitos que contenían instruccionesBarrierlanzaban una excepción. Correcciones #4461 -
Anteriormente, cuando un
QuantumCircuitcontenía unGatecon una condición clásica, el transpilador fallaba a veces al utilizaroptimization_level=3entranspile()oexecute()elevando unUnboundLocalError. Esto se ha solucionado actualizando elConsolidateBlockspara tener en cuenta la condición clásica. Correcciones #4672. -
En algunas situaciones, los nombres largos de compuertas y registros se desbordaban o dejaban un espacio vacío excesivo a su alrededor cuando se utilizaba el backend de salida
'mpl'para el métodoqiskit.circuit.QuantumCircuit.draw()método yqiskit.visualization.circuit_drawer()función. Esto se ha solucionado utilizando anchos de texto correctos para una fuente proporcional. Correcciones #4611, #4605, #4545, #4497, #4449 y #3641. -
Al utilizar el backend de salida
style` kwarg on the :meth:`qiskit.circuit.QuantumCircuit.draw` or :func:`qiskit.visualization.circuit_drawer` with the ``'mpl'la clave del diccionario'showindex'establecida enTrue, los números de índice de la parte superior de la columna no se alineaban correctamente. Esto se ha solucionado. -
Cuando se utiliza
cregbunde=Truecon el backend de salida'mpl'para el métodoqiskit.circuit.QuantumCircuit.draw()método yqiskit.visualization.circuit_drawer()y midiendo en un segundo pliegue, la flecha de medición sobrescribiría el recuento creg. El recuento se desplazó a la izquierda para evitarlo. Correcciones #4148. -
Cuando se utiliza el backend de salida
'mpl'para el métodoqiskit.circuit.QuantumCircuit.draw()y la funciónqiskit.visualization.circuit_drawer()funciónCSwapGatey las puertasRZZGatelas puertas se muestran ahora con sus símbolos correspondientes en lugar de en un recuadro. -
Cuando se utiliza el backend de salida
'mpl'para el métodoqiskit.circuit.QuantumCircuit.draw()método yqiskit.visualization.circuit_drawer()las puertas controladas por la función creadas con el métodoto_gate()no estaban espaciadas correctamente y podían solaparse con otras puertas del circuito. Este problema se ha solucionado. -
Cuando se utiliza el backend de salida
'mpl'para el métodoqiskit.circuit.QuantumCircuit.draw()método yqiskit.visualization.circuit_drawer()las puertas de función con matrices como parámetros, comoHamiltonianGate, ya no se muestran con un espacio excesivo a su alrededor. Correcciones #4352. -
Cuando se utiliza el backend de salida
'mpl'para el métodoqiskit.circuit.QuantumCircuit.draw()método yqiskit.visualization.circuit_drawer()las puertas genéricas creadas instanciando directamente el métodoqiskit.circuit.Gatemuestran ahora el color de fondo adecuado para la puerta. Corrige #4496. -
Cuando se utiliza el backend de salida
'mpl'para el métodoqiskit.circuit.QuantumCircuit.draw()y la funciónqiskit.visualization.circuit_drawer()se ha corregido un error deAttributeErrorque se producía al utilizarIsometryoInitialize. Corrige #4439. -
Cuando se utiliza el backend de salida
'mpl'para el métodoqiskit.circuit.QuantumCircuit.draw()método yqiskit.visualization.circuit_drawer()algunas puertas con control de apertura no mostraban correctamente los controles de apertura. Esto se ha corregido para que los controles abiertos se muestren correctamente como círculos abiertos. Correcciones #4248. -
Cuando se utiliza el backend de salida
'mpl'para el métodoqiskit.circuit.QuantumCircuit.draw()y la funciónqiskit.visualization.circuit_drawer()si se establece el kwargfolden -1, el circuito se mostrará correctamente sin pliegues. Correcciones #4506. -
Los pulsos paramétricos de
qiskit.pulse.library.discretetienen ahora cero extremos de pulsos paramétricos por defecto. Los puntos finales se definen de tal manera que para una función entonces . Correcciones #4317
Otras notas
- La clase
qiskit.result.Resultque antes se construía utilizando la biblioteca marshmallow se ha refactorizado para que ya no dependa de marshmallow. Esta nueva implementación debería ser una transición fluida, pero es posible que algunos comportamientos específicos heredados anteriormente de marshmallow no funcionen. Si encuentra alguna incompatibilidad, no dude en consultarnos.
Aer 0.6.1
Preludio
Esta versión de 0.6.0 incluye numerosas mejoras de rendimiento para todos los simuladores del proveedor Aer y cambios significativos en el sistema de compilación cuando se compila desde el código fuente. Los principales cambios son la compatibilidad con la vectorización SIMD, la aproximación en el método de estado del producto de matrices mediante el truncamiento de la dimensión de enlace, un cálculo más eficiente del valor de la expectativa de Pauli y una eficiencia muy mejorada en la conversión Python de objetos de resultado C++. El sistema de compilación se actualizó para utilizar el Conan para gestionar las dependencias comunes de C++ al compilar desde el código fuente.
Nuevas funciones
-
Añade soporte de instantáneas de matrices de densidad a los métodos "statevector" y "statevector_gpu" de QasmSimulator.
-
Permitir instantáneas de matrices de densidad en qubits específicos, no sólo en todos los qubits. Esto calcula la traza parcial del estado sobre los qubits restantes.
-
Añade soporte de instantáneas de valor de expectativa de Pauli al método de simulación "density_matrix" de
qiskit.providers.aer.QasmSimulator. Añade instantáneas a los circuitos mediante la extensiónqiskit.providers.aer.extensions.SnapshotExpectationValue. -
Mejora considerablemente el rendimiento del algoritmo de instantánea del valor de la expectativa de Pauli para los métodos de simulación "vector de estado", "vector de estado_gpu", "matriz de densidad" y "matriz de densidad_gpu" de
qiskit.providers.aer.QasmSimulator. -
Active la optimización del circuito de fusión de puertas desde
qiskit.providers.aer.QasmSimulatoren los backendsqiskit.providers.aer.StatevectorSimulatoryqiskit.providers.aer.UnitarySimulator. -
Mejorar el rendimiento de los datos medios de las instantáneas en los resultados del simulador. Esto afecta a la probabilidad, al valor de la expectativa de Pauli y a las instantáneas de la matriz de densidad utilizando las siguientes extensiones:
qiskit.providers.aer.extensions.SnapshotExpectationValueqiskit.providers.aer.extensions.SnapshotProbabilitiesqiskit.providers.aer.extensions.SnapshotDensityMatrix
-
Añadir el constructor move y mejorar el uso de memoria de la clase matrix de C++ para minimizar las copias de matrices al mover la salida de los simuladores a los resultados.
-
Mejorar el rendimiento del simulador unitario.
-
Añadir aproximación al método de simulación "matrix_product_state" del
QasmSimulatorpara limitar la dimensión de enlace del MPS.Hay dos modos de aproximación. Ambos descartan los coeficientes Schmidt más pequeños siguiendo el algoritmo SVD. Hay dos parámetros que controlan el grado de aproximación:
"matrix_product_state_max_bond_dimension"(int): Establece un límite en el número de coeficientes Schmidt retenidos al final del algoritmo svd. Los coeficientes que superen este límite se descartarán. (Por defecto: Ninguno, es decir, no hay límite en la dimensión del enlace)."matrix_product_state_truncation_threshold"(doble): Descarta los coeficientes más pequeños para los que la suma de sus cuadrados sea menor que este umbral. (Por defecto: 1e-16 ). -
Mejorar el rendimiento del muestreo de medidas cuando se utiliza el método de simulación "matrix_product_state"
QasmSimulator. -
Añadir soporte para
Delay,PhaseySetPhaseinstrucciones de pulso a laqiskit.providers.aer.PulseSimulator. -
Mejorar el rendimiento de la
qiskit.providers.aer.PulseSimulatormediante el almacenamiento en caché de las llamadas a la función RHS -
Introducir métodos alternativos de resolución de ED, especificables a través de
backend_optionsen la páginaqiskit.providers.aer.PulseSimulator. -
Mejorar el rendimiento de las clases de resultados del simulador utilizando la semántica de movimiento y eliminando las copias innecesarias que se producían al combinar resultados de experimentos separados en el objeto de resultado final.
-
Mejorar considerablemente el rendimiento de la conversión pybind11 de los resultados del simulador utilizando la semántica de movimiento siempre que sea posible, y moviendo los resultados de vectores y matrices a matrices Numpy sin copias.
-
Cambiar el motor RNG para simuladores de 32-bit Mersenne twister a 64-bit Mersenne twister engine.
-
Mejora el rendimiento del método de simulación "vectorial de estados" de
qiskit.providers.aer.QasmSimulatoryqiskit.providers.aer.StatevectorSimulatormediante el uso de intrínsecos SIMD en sistemas que admiten el conjunto de instrucciones AVX2. AVX2 se detecta automáticamente y se activa en tiempo de ejecución.
Notas de actualización
-
Cambia el sistema de compilación para utilizar el gestor de paquetes Conan. Esta herramienta se encargará de la mayoría de las dependencias que necesita el código fuente C++. La conexión a Internet puede ser necesaria para la primera compilación o cuando se añaden o actualizan dependencias, con el fin de descargar los paquetes necesarios si no están en su repositorio local de Conan.
Al construir la versión independiente de qiskit-aer debe instalar conan primero con:
pip install conan -
Cambia el modo en que se gestionan los pases de transpilación en las clases Controlador de C++, de modo que cada pase debe llamarse explícitamente. Esto permite una mayor personalización sobre cuándo se debe llamar a cada pase y con qué parámetros. En particular, esto permite establecer diferentes parámetros para el paso de optimización de la fusión de puertas en función del método de simulación QasmController.
-
Añadir
gate_length_unitskwarg aqiskit.providers.aer.noise.NoiseModel.from_device()para especificargate_lengthspersonalizado en la función de modelo de ruido del dispositivo para manejar las conversiones de unidades para el código interno. -
Añade la puerta Y controlada ("cy") al conjunto de puertas compatibles con los métodos del simulador Estabilizador.
-
Para el backend de Aer, la validación jsonschema de los objetos qobj de entrada de terra es ahora opcional en lugar de estar activada por defecto. Si desea habilitar la validación jsonschema de qobj establezca el kwarg
validateen el métodoqiskit.providers.aer.QasmSimualtor.run()para el objeto backend aTrue. -
Añade un objeto OpSet a la clase State del simulador base para permitir una validación más sencilla de las instrucciones, puertas e instantáneas soportadas por los simuladores.
-
Refactorizar la clase OpSet. Movido OpSet a un archivo de cabecera separado y añadir
containsydifferencemétodos basados enstd::set::containsystd::algorithm::set_difference. Sustituyen a las instrucciones de invalidación y validación eliminadas de OpSet,, pero con el orden invertido. Devuelve una lista de otros ops no en opset actual en lugar de instrucciones opset no en el otro. -
Mejora el modo en que se comprueba la optimización del muestreo de mediciones. La parte costosa de esta operación se realiza ahora una vez durante la construcción del circuito en lugar de múltiples veces durante la simulación para cuando se comprueban los requisitos de memoria, el método de simulación y la ejecución final.
Corrección de errores
-
Eliminar "extended_stabilizer" de los métodos de simulación seleccionados automáticamente. Esto es necesario ya que el método del estabilizador extendido no es exacto y puede dar resultados incorrectos para ciertos circuitos a menos que el usuario sepa cómo optimizar sus parámetros de configuración.
El método automático ahora sólo selecciona entre los métodos "estabilizador", "matriz_densidad" y "vector_estado". Si se ejecuta un circuito que no sea Clifford y que sea demasiado grande para el método statevector, se lanzará una excepción sugiriendo que intente utilizar explícitamente los métodos "extended_stabilizer" o "matrix\product_state" en su lugar.
-
Desactiva la fusión de puertas para el método de simulación del estado del producto matricial, ya que estaba causando problemas con resultados incorrectos en algunos casos.
-
Se corrige un error que provocaba una evaluación incorrecta de los canales en
qiskit.providers.aer.PulseSimulator. -
Corrección de varios errores menores en casos extremos de análisis hamiltoniano en la clase
qiskit.providers.aer.pulse.system_models.hamiltonian_model.HamiltonianModel.
Ignis 0.4.0
Preludio
El principal cambio realizado en esta versión es una refactorización del código de Randomized Benchmarking para integrar la clase Clifford actualizada de Terra y mejorar la clase CNOT-Dihedral qiskit.quantum_info.Clifford de Terra y mejorar la clase CNOT-Diédrica.
Nuevas funciones
- La función
qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()se ha refactorizado para utilizar la clase Clifford actualizadaCliffordpara permitir una evaluación comparativa aleatoria (RB) eficiente en secuencias Clifford con más de 2 qubits. Además, el código de la clase CNOT-Dihedralqiskit.ignis.verification.randomized_benchmarking.CNOTDihedralfue refactorizado para hacerlo más eficiente, mediante el uso de matrices numpy, así como no usar archivos pickle pre-generados almacenando todos los elementos del grupo 2-qubit. La funciónqiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()tiene un nuevo kwargrand_seedque puede utilizarse para especificar una semilla para el generador de números aleatorios utilizado para generar los circuitos RB. Esto puede ser útil para tener un circuito reproducible. - La función
qiskit.ignis.verification.qv_circuits()tiene un nuevo kwargseedque puede utilizarse para especificar una semilla para el generador de números aleatorios utilizado para generar los circuitos de Quantum Volume. Esto puede ser útil para tener un circuito reproducible.
Notas de actualización
- La función
qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()utiliza ahora la clase Clifford actualizadaCliffordy la clase CNOT-Dihedral actualizadaqiskit.ignis.verification.randomized_benchmarking.CNOTDihedralpara construir su salida en lugar de utilizar tablas de grupo pregeneradas para los elementos de grupo Clifford y CNOT-Dihedral, que se almacenaban en archivos pickle. Esto puede dar lugar a sutiles diferencias con respecto a la salida de la versión anterior. - Se ha añadido un nuevo requisito scikit-learn a la lista de requisitos. Esta dependencia se añadió en la versión 0.3.0, pero no se expuso correctamente como tal en dicha versión. Esto daría lugar a un
ImportErrorsi se importara el móduloqiskit.ignis.measurement.discriminator.iq_discriminators. Ahora aparece correctamente en la lista de dependencias para quescikit-learnse instale con qiskit-ignis. - La función
qiskit.ignis.verification.qv_circuits()utiliza ahora la clase de la biblioteca de circuitosQuantumVolumepara construir su salida en lugar de construir el circuito desde cero. Esto puede dar lugar a sutiles diferencias con respecto a la salida de la versión anterior. - Los adaptadores de tomografía ahora también pueden obtener una lista de objetos Resultado en lugar de un único Resultado, como se solicitó en el problema nº 320.
Notas sobre características en desuso
-
El kwarg
interleaved_gatespara la funciónqiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()ha quedado obsoleto y se eliminará en una futura versión. Ha sido sustituido porinterleaved_elem. Las funciones de ayudaqiskit.ignis.verification.randomized_benchmarking.BasicUtils,qiskit.ignis.verification.randomized_benchmarking.CliffordUtilsyqiskit.ignis.verification.randomized_benchmarking.DihedralUtilshan quedado obsoletas. Estas clases son sustituidas porqiskit.ignis.verification.randomized_benchmarking.RBgroup, que gestiona las operaciones de grupo necesarias para RB. La claseqiskit.ignis.verification.randomized_benchmarking.Cliffordse sustituye porClifford. -
Los kwargs
qrycrpara la funciónqiskit.ignis.verification.qv_circuits()han quedado obsoletos y se eliminarán en una futura versión. Estos kwargs se documentaron como utilizados para especificar unqiskit.circuit.QuantumRegisteryqiskit.circuit.ClassicalRegistera utilizar en los circuitos generados de Quantum Volume en lugar de crear otros nuevos. Sin embargo, los parámetros nunca se respetaban realmente y siempre se creaba un nuevo Registro independientemente de que estuvieran fijados o no. Este comportamiento no ha cambiado y estos kwargs siguen sin tener ningún efecto, pero se han dejado obsoletos antes de eliminarlos para evitar un cambio brusco para los usuarios que puedan haber estado configurando cualquiera de ellos. -
El soporte para pasar subconjuntos de qubits como una lista en el parámetro
qubit_listspara la funciónqiskit.ignis.verification.qv_circuits()ha quedado obsoleto y se eliminará en una futura versión. En el pasado se utilizaba para especificar un diseño para ejecutar el circuito en un dispositivo. En otras palabras, si tuvieras un dispositivo de 5 qubits y quisieras ejecutar un circuito QV de 2 qubits en los qubits 1, 3 y 4 de ese dispositivo. Pasarías[1, 3, 4]como una de las listas enqubit_lists, lo que generaría un circuito virtual de 5 qubits y tendría qv aplicado a los qubits 1, 3 y 4 en ese circuito virtual. Sin embargo, esta funcionalidad no es necesaria y se solapa con el concepto deinitial_layouten el transpilador y si un circuito ha sido incrustado con un conjunto de trazado. En lugar de eso, sólo tienes que ejecutartranspile()oexecute()con el diseño inicial configurado para hacer esto. Por ejemplo, ejecutando el ejemplo anterior se convertiría en:from qiskit import execute from qiskit.ignis.verification import qv_circuits initial_layout = [1, 3, 4] qv_circs, _ = qv_circuits([list(range3)]) execute(qv_circuits, initial_layout=initial_layout)
Corrección de errores
- Corrección de un error en la posición de los impulsos de medición insertados por py:func:qiskit.ignis.characterization.calibrations.pulse_schedules.drag_schedules. Correcciones #465
Aqua 0.7.5
Nuevas funciones
- Eliminada la dependencia blanda de CPLEX en ADMMOptimizer. Ahora los optimizadores por defecto utilizados por ADMMOptimizer son MinimumEigenOptimizer para problemas QUBO y SlsqpOptimizer como optimizador continuo. Puede seguir utilizando CplexOptimizer como optimizador para ADMMOptimizer, pero debe establecerse explícitamente.
- ¡Nuevo Yahoo! proveedor de financiación creado.
- Introducido
QuadraticProgramConverterque es una clase abstracta para convertidores. Añadidos los métodosconvert/interpretpara los convertidores en lugar deencode/decode. Añadidosto_isingyfrom_isinga la claseQuadraticProgram. Movidos todos los parámetros deconvertal constructor exceptoname. Creado setter/getter para los parámetros del convertidor. Añadidosauto_define_penaltyyinterpretfor``LinearEqualityToPenalty``. Ahora los mensajes de error de los convertidores son más informativos. - Añadido un optimizador SLSQP
qiskit.optimization.algorithms.SlsqpOptimizercomo envoltorio del correspondiente método de optimización SciPy. Se trata de un optimizador clásico, no depende de algoritmos cuánticos y puede utilizarse como sustituto deCobylaOptimizer. - El optimizador Cobyla se ha modificado para dar cabida a una función de arranque múltiple introducida en el optimizador SLSQP. Por defecto, el optimizador no se ejecuta en el modo de arranque múltiple.
SummedOprealiza una comprobación de igualdad matemáticamente más correcta, en la que expresiones comoX + X == 2*XyX + Z == Z + Xse evalúan aTrue.
Notas sobre características en desuso
- La clase optimizadora GSLS desaprobó el parámetro
__init__max_iteren favor demaxiter. La clase optimizadora SPSA desaprobó el parámetro__init__max_trialsen favor demaxiter. la función optimize_svm ha dejado obsoleto el parámetromax_itersen favor demaxiter. La clase ADMMParameters desaprobó el parámetro__init__max_iteren favor demaxiter. - Las clases de conversión de ising
qiskit.optimization.converters.QuadraticProgramToIsingyqiskit.optimization.converters.IsingToQuadraticProgramhan quedado obsoletas y se eliminarán en una futura versión. En su lugar, deben utilizarse los métodosqiskit.optimization.QuadraticProgramto_ising()yfrom_ising(). - El método
pprint_as_stringparaqiskit.optimization.QuadraticProgramha quedado obsoleto y se eliminará en una futura versión. En su lugar, sólo debe ejecutar.pprint_as_string()en la salida deto_docplex() - El método
prettyprintparaqiskit.optimization.QuadraticProgramha quedado obsoleto y se eliminará en una futura versión. En su lugar, sólo debe ejecutar.prettyprint()en la salida deto_docplex()
Corrección de errores
- Cambiado en la versión de python 3.8: En macOS, el método de inicio de spawn es ahora el predeterminado. El método de inicio de bifurcación debe considerarse inseguro, ya que puede provocar fallos en los subprocesos. Sin embargo P_BFGS no soporta spawn, por lo que volvemos a un solo proceso. Consulte el nº 1109 <https://github.com/qiskit-community/qiskit-aqua/issues/1109> para más detalles.
- Los parámetros de vinculación en
CircuitStateFnno copiaban el valor deis_measurementy siempre fijabanis_measurement=False. Esto se ha solucionado. - Anteriormente, SummedOp.to_matrix_op construía una lista MatrixOp’s (con matrices numpy) y luego las sumaba, devolviendo una única MatrixOp. Algunos algoritmos (por ejemplo vqe) requieren sumar miles de matrices, lo que agota la memoria al construir la lista de matrices. Con este cambio, no se construye ninguna lista. En su lugar, cada operando de la suma se convierte en una matriz, se suma a un acumulador y se descarta.
- El cambio de backends en VQE de statevector a qasm_simulator o dispositivo real provocaba un error debido a la reutilización incompatible de CircuitSampler. VQE fue cambiado para crear siempre un nuevo CircuitSampler y crear una nueva expectativa en caso de que no sea introducida por el usuario. Para más información, consulte la página #1153 <https://github.com/qiskit-community/qiskit-aqua/issues/1153>.
- Se han corregido los proveedores de finanzas Exchange y Wikipedia para que manejen correctamente los datos de Quandl. Si desea más información, consulte la página #775 <https://github.com/qiskit-community/qiskit-aqua/issues/775>. Se corrige un error de división por 0 en los cálculos del vector medio y la matriz de covarianza de los proveedores financieros. Consulte el número 781 en <https://github.com/qiskit-community/qiskit-aqua/issues/781> para obtener más información.
- La propiedad
ListOp.combo_fnse ha perdido en varias transformaciones, como la conversión a otro tipo de operador, el recorrido, la reducción o la multiplicación. Ahora este atributo se propaga al operador resultante. - La evaluación de algunas expresiones de operadores, como de
SummedOp``s and evaluations with the ``CircuitSamplerno trataba correctamente los coeficientes o los ignoraba por completo. E.g. la evaluación de~StateFn(0 * (I + Z)) @ Plusno dio 0 o la normalización de~StateFn(I) @ ((Plus + Minus) / sqrt(2))omitió un factor desqrt(2). Esto se ha solucionado. OptimizationResultincluía algunos setters públicos y las variables de clase eranOptional. Esta corrección hace que todas las variables de clase sean de sólo lectura para que mypy y pylint puedan comprobar los tipos más eficazmente.MinimumEigenOptimizer.solvecadenas de bits generadas en un resultado comostr. Esta corrección cambió el resultado aList[float]como hacen los otros algoritmos. En la documentación deqiskit.optimization.algorithmsfaltaban algunas clases públicas relacionadas con algoritmos de optimización. Esta corrección ha añadido todas estas clases al docstring. #1131 <https://github.com/qiskit-community/qiskit-aqua/issues/1131> para más detalles.OptimizationResult.__init__no ha comprobado si los tamaños dexyvariablescoinciden o no (deberían coincidir). Esta corrección ha añadido la comprobación para generar un error si no coinciden y corrige errores detectados por la comprobación. Esta corrección también añade pruebas unitarias que faltaban relacionadas conOptimizationResult.variable_namesyOptimizationResult.variables_dictentest_converters. #1167 <https://github.com/qiskit-community/qiskit-aqua/issues/1167> para más detalles.- Corrección de la vinculación de parámetros en
OperatorStateFn, que no vinculaba parámetros de la primitiva subyacente, sino sólo los coeficientes. op.eval(other), dondeopes del tipoOperatorBase, a veces devuelve silenciosamente un valor sin sentido cuando el número de qubits enopyotherno son iguales. Esta corrección resulta en un comportamiento correcto, que es lanzar un error en lugar de devolver un valor, porque la entrada en este caso no es válida.- El método
construct_circuitdeVQEdevolvía previamente el valor de la expectativa a evaluar como tipoOperatorBase. Esta funcionalidad se ha trasladado aconstruct_expectationyconstruct_circuitdevuelve una lista de los circuitos que se evalúan para calcular el valor de la expectativa.
IBM Proveedor Q 0.8.0
Nuevas funciones
IBMQBackendahora tiene un nuevo métodoreservations()que devuelve información de reserva para el backend, con filtrado opcional. Además, ahora puede utilizarprovider.backends.my_reservations()para consultar sus propias reservas.qiskit.providers.ibmq.job.IBMQJob.result()lanza una excepciónIBMQJobFailureErrorsi el trabajo ha fallado. El mensaje de excepción ahora contiene la razón por la que falló el trabajo, si todo el trabajo falló por una sola razón.- Se ha añadido un nuevo atributo
client_versionaIBMQJobyqiskit.result.Resultobjeto recuperado a través deqiskit.providers.ibmq.job.IBMQJob.result().client_versiones un diccionario cuya clave es el nombre y cuyo valor es la versión del cliente utilizada para enviar el trabajo, como Qiskit. - La función
least_busy()recibe ahora un nuevo parámetro opcionalreservation_lookahead. Si se especifica o por defecto, un backend se considera no disponible si tiene reservas en los próximosnminutos, dondenes el valor dereservation_lookahead. Por ejemplo, si se utiliza el valor predeterminado de 60, cualquier backend que tenga reservas en los próximos 60 minutos se considerará no disponible. ManagedResultsdispone ahora de un nuevo métodocombine_results()que combina los resultados de todos los trabajos gestionados y devuelve un únicoResultúnico. Este objetoResultpuede utilizarse, por ejemplo, en los métodos de ajuste deqiskit-ignis.
Notas de actualización
-
Las marcas de tiempo de los siguientes campos están ahora en hora local en lugar de UTC:
- Propiedades de backend devueltas por
qiskit.providers.ibmq.IBMQBackend.properties(). - Propiedades de backend devueltas por
qiskit.providers.ibmq.job.IBMQJob.properties(). estimated_start_timeyestimated_complete_timeenQueueInfo, devuelto porqiskit.providers.ibmq.job.IBMQJob.queue_info().dateenResult, devuelto porqiskit.providers.ibmq.job.IBMQJob.result().
Además, se espera que el parámetro
datetimeparaqiskit.providers.ibmq.IBMQBackend.properties()también esté en hora local a menos que tenga información sobre la zona horaria UTC. - Propiedades de backend devueltas por
-
websockets8.0 o superior si se utiliza Python 3.7 o superior.websockets7.0 seguirá utilizándose para Python 3.6 o inferior. -
En Windows, la política de bucle de eventos se establece en
WindowsSelectorEventLoopPolicyen lugar de utilizar la predeterminadaWindowsProactorEventLoopPolicy. Esto soluciona el problema de que el métodoqiskit.providers.ibmq.job.IBMQJob.result()podía bloquearse en Windows. Correcciones #691
Notas sobre características en desuso
- El uso de
Qconfig.pypara guardar las credenciales de IBM Quantum Experience está obsoleto y se eliminará en la próxima versión. Debería utilizarqiskitrc(por defecto) en su lugar.
Corrección de errores
- Corrige un problema por el que una llamada a
qiskit.providers.ibmq.IBMQBackend.jobs()puede colgarse si el número de trabajos devueltos es elevado. Correcciones #674 - Se corrige un problema que podía generar un mensaje
ValueErroral crear mapas de errores en Jupyter para backends que están desconectados. Correcciones nº 706 qiskit.providers.ibmq.IBMQBackend.jobs()devolverá ahora la lista correcta de objetosIBMQJobcuando el kwargstatusse establezca en'RUNNING'.- Los metadatos del paquete se han actualizado para reflejar correctamente la dependencia de
qiskit-terra>= 0.14.0. Esta dependencia se añadió implícitamente como parte de la versión 0.7.0, pero no se reflejó en los requisitos del paquete, por lo que antes era posible instalarqiskit-ibmq-providercon una versión deqiskit-terrademasiado antigua. Correcciones #677