Skip to main content
IBM Quantum Platform

Notas de la versión de Qiskit 0.20


0.20.1

Terra 0.15.2

Corrección de errores

  • Al acceder al atributo definition de una instancia parametrizada Gate , el QuantumCircuit generado se había generado con un ParameterTable no válido, de forma que la lectura de QuantumCircuit.parameters o la llamada a QuantumCircuit.bind_parameters informaban incorrectamente de los parámetros no vinculados. Esto se ha resuelto.
  • SXGate().inverse() había devuelto anteriormente una puerta 'sx_dg' con una definition correcta pero to_matrix incorrecta. Se ha actualizado para que SXGate().inverse() devuelva un SXdgGate() y viceversa.
  • Instruction.inverse()cuando no es sobrescrito por una subclase, en algunos casos devuelve una instancia de Gate con un método to_matrix incorrecto. Se han eliminado los casos de métodos to_matrix incorrectos.
  • Para C3XGate con un angle distinto de cero, la inversión de la puerta a través de C3XGate.inverse() había generado previamente una puerta inversa incorrecta. Se ha corregido.
  • Los modos de MCXGate se 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 puerta MCXVChain provocaba un error.
  • Anteriormente, al crear una puerta de fase controlada múltiplemente a través de PhaseGate.control, se devolvía una puerta MCU1Gate . Esto se ha corregido para que se devuelva un MCPhaseGate .
  • Anteriormente, al intentar descomponer un circuito que contenía un MCPhaseGate se producía un error debido a una incoherencia en la definición del MCPhaseGate. Se ha corregido.
  • QuantumCircuit.compose y DAGCircuit.compose habían traducido incorrectamente, en algunos casos, puertas condicionales si el circuito de entrada contenía más de una ClassicalRegister. Esto se ha resuelto.
  • Se ha corregido un problema al crear un qiskit.result.Counts a partir de un diccionario de datos vacío. Esto creará un objeto Counts vacío. El método most_frequent() también se actualiza para lanzar una excepción más descriptiva cuando el objeto está vacío. Correcciones #5017
  • La ampliación de circuitos con registros diferentes actualizaba las propiedades qregs y cregs en consecuencia, pero no las listas qubits y clbits . 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étodo extend actualiza 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.DAGDependency para 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.converters para convertir de ida y vuelta a DAGDependency. Estas funciones son:

    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.passes El primero, UnrollCustomDefinitionsdesenrolla todas las instrucciones del circuito según su propiedad definition y se detiene al llegar a la dirección basis_gates especificada o a un conjunto de puertas de la propiedad EquivalenceLibrary. La segunda, BasisTranslatorutiliza el conjunto de conversiones en el EquivalenceLibrary para reescribir instrucciones de circuito en una base especificada.

  • Se ha añadido un nuevo argumento de palabra clave translation_method a transpile() 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:

    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 de dict y 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. A Counts objeto 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.DAGCircuit objetos, from_networkx(). Este método recibe un objeto networkx MultiDiGraph (en el formato devuelto por to_networkx()) y devuelve un nuevo objeto DAGCircuit objeto. 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_qubits en assemble() y execute(). Para los backends que soportan esta característica init_qubits se 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 en True , 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, cuando init_qubits se establece en False los 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_delay a qiskit.compiler.assemble(), qiskit.execute.execute(), y al constructor de PulseQobjtConfig.qiskit Este nuevo kwarg se utiliza para denotar el tiempo entre ejecuciones del programa. Debe elegirse de la lista de valores válidos establecida como rep_delays en el objeto PulseBackendConfiguration al que se puede acceder como backend.configuration().rep_delays).

    El kwarg rep_delay sólo funcionará en backends que permitan un tiempo de repetición dinámico. Esto también se indicará en el objeto PulseBackendConfiguration de un backend como atributo dynamic_reprate_enabled . Si dynamic_reprate_enabled es False entonces el valor rep_time especificado para qiskit.compiler.assemble()qiskit.execute.execute(), o el constructor de PulseQobjtConfig en lugar de rep_delay. rep_time sólo permite a los usuarios especificar la duración de un programa, y no el retardo entre programas.

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

  • El archivo backend_configuration_schema.json JSON Schema en mod:qiskit.schemas se ha actualizado para incluir rep_delay_range y default_rep_delay como 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 clase qiskit.circuit.QuantumCircuit clase. 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_phase en 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 QuantumCircuit tengan en cuenta la fase global. Por ejemplo. con el global_phase atributo el to_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 DAGCircuit para que se pueda seguir la fase global al convertir entre QuantumCircuit y DAGCircuit.

  • Dos nuevas clases, AncillaRegister y AncillaQubit se han añadido al módulo qiskit.circuit módulo. Son subclases de QuantumRegister y Qubit respectivamente 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ódulo QuantumCircuit. Este método devolverá una versión controlada del objeto QuantumCircuit con controles abiertos y cerrados. Hasta ahora, esta funcionalidad sólo era accesible a través de la clase Gate clase.

  • Se ha añadido un nuevo método repeat() a la clase QuantumCircuit clase. 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 clase QuantumCircuit clase. 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 clase qiskit.transpiler.Layout clase. Este método permite convertir dos Layout objetos en un mapa de qubits para componer dos circuitos.

  • Se ha añadido una nueva clase, ConfigurableFakeBackend, al módulo qiskit.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 clase qiskit.circuit.EquivalenceLibrary clase. 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, a qiskit.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ón SetPhase se fijará en π\pi radianes.

  • Se ha añadido una nueva instrucción de pulso ShiftFrequency a qiskit.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 comando ShiftFrequency tendrán la frecuencia de la envolvente a disminuida por 340MHz.

  • Se ha añadido un nuevo método conjugate() a la clase ParameterExpression clase. Esto permite llamar a numpy.conj() sin que se produzca un error. Puesto que un ParameterExpression es real, se devolverá a sí mismo. Este comportamiento es análogo al de Python floats/ints.

  • Se ha añadido una nueva clase PhaseEstimation se ha añadido a qiskit.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 ϕ\phi de un valor propio e2πiϕe^{2\pi i\phi} de un operador unitario UU, provisto del correspondiente estado propio psi|psi\rangle. Es decir

Uψ=e2πiϕψU|\psi\rangle = e^{2\pi i\phi} |\psi\rangle

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.visualization función plot_state_qsphere() tiene un nuevo kwarg show_state_labels que se utiliza para controlar si cada mancha de la visualización qsphere está etiquetada. Por defecto este kwarg está configurado en True y muestra los estados base junto a cada blob por defecto. Esta función puede desactivarse, volviendo al comportamiento anterior, configurando el kwarg show_state_labels en False.

  • La función qiskit.visualization función plot_state_qsphere() tiene un nuevo kwarg show_state_phases que se establece en False por defecto. Cuando se configura en True muestra la fase de cada estado base.

  • La función qiskit.visualization función plot_state_qsphere() tiene un nuevo kwarg use_degrees que se establece en False por defecto. Cuando se configura en True muestra la fase de cada estado base en grados, junto con el círculo de fase en la parte inferior derecha.

  • Una nueva clase, QuadraticForm en el módulo qiskit.circuit.library para implementar una forma cuadrática en variables binarias. El elemento de la biblioteca de circuitos implementa la operación

x0xQ(x)mod2m|x\rangle |0\rangle \mapsto |x\rangle |Q(x) \mod 2^m\rangle

para la forma cuadrática QQ y mm qubits de salida. El resultado está en la mm qubits de salida se codifica en complemento a dos. Si no se especifica mm, 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() y qiskit.quantum_info.DensityMatrix.expectation_value() métodos para calcular el valor de expectativa de un qiskit.quantum_info.Operator.

  • Para el seed kwarg en el constructor para qiskit.circuit.library.QuantumVolume ahora 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 integra QuantumVolume como parte de una función mayor con su propia generación de números aleatorios, por ejemplo, generando una secuencia de QuantumVolume circuitos.

  • El método QuantumCircuit método compose() tiene un nuevo kwarg front que 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, SabreLayout y SabreSwap para el trazado y enrutamiento se han añadido a qiskit.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ón transpile() ajustando el kwarg layout_method a 'sabre' y/o el routing_method a 'sabre' para utilizar SabreLayout y SabreSwap respectivamente.

  • Añadido el método replace() a la clase qiskit.pulse.Schedule que permite sustituir una instrucción de impulso por otra. Por ejemplo:

    .. code-block:: python

    from 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.library para las compuertas X\sqrt{X}, su adjunta X\sqrt{X}^\dagger, y controlada X\sqrt{X} como SXGate, SXdgGatey CSXGate. También pueden añadirse a un QuantumCircuit objeto mediante los botones sx(), sxdg()y csx() respectivamente.

  • Añadir soporte para Reset instrucciones para qiskit.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étodo seed() método.

  • Los métodos qiskit.circuit.ParameterExpression.subs() y qiskit.circuit.QuantumCircuit.assign_parameters() aceptan ahora ParameterExpression como 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étodo to_gate() tiene un nuevo kwarg label que se puede utilizar para establecer una etiqueta para el objeto de salida Gate del 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, PhaseGatey CPhaseGate con los correspondientes QuantumCircuit métodos u(), cu(), p()y cp(). La puerta UGate puerta es la puerta genérica de rotación de un qubit con 3 ángulos de Euler y la CUGate su versión controlada. CUGate tiene 4 parámetros para tener en cuenta una posible fase global de la puerta U. En PhaseGate y CPhaseGate son 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ón qiskit.visualization.circuit_drawer() y al método QuantumCircuit método draw(). Si se configura en True , los cregs se agruparán en una sola línea en las visualizaciones de circuitos de los cajones text y mpl . El valor predeterminado es True. 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ón qiskit.visualization.circuit_drawer() y al método QuantumCircuit método draw(). Si se configura en True , 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, MCXRecursivey MCXVChain) han cambiado sus propiedades name para describir con mayor precisión su implementación: mcx_gray mcx_recursive y mcx_vchain respectivamente. Anteriormente, estas puertas compartían el nombre mcx con MCXGatelo que provocaba que estas puertas se transpilaran y simularan incorrectamente.

  • Por defecto, los gestores de pases preestablecidos en qiskit.transpiler.preset_passmanagers utilizan UnrollCustomDefinitions y BasisTranslator para manejar el cambio de base en lugar del anterior por defecto Unroller. 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 kwarg translation_method en transpile() 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 clave equivalence_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 cregbundle kwarg para el qiskit.circuit.QuantumCircuit.draw() y la función qiskit.visualization.circuit_drawer() se ha cambiado a True. 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 cregbundle en False. 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)
  • Schedule trazando con qiskit.pulse.Schedule.draw() y qiskit.visualization.pulse_drawer() ya no mostrará la tabla de eventos por defecto. Puede volver a activarse configurando table kwarg en True.

  • El pase RemoveResetInZeroState se incluía anteriormente en el gestor de pases predefinidos level_0_pass_manager() que se utilizaba con las funciones optimization_level=0 para transpile() y execute() . Sin embargo, RemoveResetInZeroState es un pase de optimización y no debería haber sido incluido en el nivel de optimización 0 y fue eliminado. Si necesita ejecutar transpile() con RemoveResetInZeroState utilice un gestor de pases personalizado o optimization_level 1, 2 o 3.

  • El kwarg obsoleto line_length para la función qiskit.visualization.circuit_drawer() y el método qiskit.circuit.QuantumCircuit.draw() ha sido eliminado. Estaba obsoleta desde la versión 0.10.0. En su lugar, puede utilizar fold kwarg para ajustar la anchura del diagrama del circuito.

  • El modo de salida 'mpl' para el qiskit.circuit.QuantumCircuit.draw() y circuit_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_tokens para los archivos qiskit.qasm.Qasm y qiskit.qasm.QasmParser han sido eliminados. Estos métodos están obsoletos desde la versión 0.9.0. En su lugar, deben utilizarse los métodos qiskit.qasm.Qasm.generate_tokens() y qiskit.qasm.QasmParser.generate_tokens() .

  • El kwarg obsoleto channels_to_plot para qiskit.pulse.Schedule.draw()qiskit.pulse.Instruction.draw(), qiskit.visualization.pulse.matplotlib.ScheduleDrawer.draw y pulse_drawer() ha sido eliminado. El kwarg está obsoleto desde la versión 0.11.0 y ha sido sustituido por el kwarg channels , que funciona de forma idéntica y debería utilizarse en su lugar.

  • El atributo obsoleto circuit_instruction_map de la clase qiskit.providers.models.PulseDefaults ha sido eliminado. Este atributo está obsoleto desde la versión 0.12.0 y ha sido sustituido por el atributo instruction_schedule_map , que puede utilizarse en su lugar.

  • El método union de Schedule y Instruction están obsoletos desde la versión 0.12.0 y han sido eliminados. Utilice en su lugar los métodos qiskit.pulse.Schedule.insert() y qiskit.pulse.Instruction.meth() en lugar de los métodos kwarg``time=0``.

  • El argumento obsoleto scaling del método draw de Schedule y Instruction ha sido sustituido por scale desde la versión 0.12.0 y ahora ha sido eliminado. Utilice en su lugar la dirección scale kwarg.

  • El argumento obsoleto period de las funciones qiskit.pulse.library han sido sustituidos por freq desde la versión 0.13.0 y ahora se han eliminado. Utilice freq kwarg en lugar de period.

  • El módulo qiskit.pulse.commands que contenía las clases Commands quedó 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:

    Anterior
    Nuevo
    Command(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.qi quedaron obsoletas en la versión 0.12.0 y han sido eliminadas. En su lugar, utilice el módulo qiskit.quantum_info y los nuevos métodos y clases que tiene para trabajar con estados y operadores cuánticos.

  • Las funciones qiskit.quantum_info.basis_state y qiskit.quantum_info.projector están obsoletas a partir de Qiskit Terra 0.12.0 ya no existen. Utilice el qiskit.quantum_info.QuantumState y sus derivados qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix para 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_paulivec ahora 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.validation se han eliminado de terra. Puesto que ya no se utilizan para construir ningún objeto en terra.

  • Las clases del esquema marshmallow en qiskit.result se han eliminado porque ya no son utilizadas por la clase qiskit.result.Result clase.

  • La salida del método to_dict() de la clase qiskit.result.Result ya 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étodo to_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_slots y reg_slots de qiskit.pulse.instructions.Acquirey channel, mem_slot y reg_slot provocará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 networkx qiskit.dagcircuit.DAGCircuit se 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.pulse responsable de las transformaciones horario->horario ha pasado de llamarse reschedule.py a transforms.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 PassManager no permitía que las clases TransformationPass modificaran el PropertySet. Esta restricción se ha levantado por lo que una clase TransformationPass ahora tiene acceso de lectura y escritura tanto a la PropertySet y DAGCircuit durante run(). Este cambio se realizó para facilitar de forma más eficiente TransformationPass clases que tienen un estado interno que puede ser necesario para pases posteriores en el archivo PassManager. Sin este cambio habría sido necesario un segundo AnalysisPass redundante para recrear el estado interno, lo que podría añadir una sobrecarga significativa.

Notas sobre características en desuso

Corrección de errores

  • El método qiskit.circuit.QuantumCircuit método num_nonlocal_gates anteriormente incluía objetos multi-qubit qiskit.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 locales Gate no locales. Arreglos #4500

  • ControlledGate instancias con un conjunto ctrl_state en 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.QuantumRegister o qiskit.circuit.ClassicalRegister por índice cuando se usan tipos enteros de numpy <https://numpy.org/doc/stable/user/basics.types.html> __ antes lanzaba una excepción CircuitError . Esto se ha resuelto para que puedan utilizarse tipos numpy además del tipo int incorporado en Python. Corrige #3929.

  • Se ha corregido un error por el que sólo se utilizaba el primer qiskit.pulse.configuration.Kernel o qiskit.pulse.configuration.Discriminator para un qiskit.pulse.Acquire cuando había varias Adquisiciones al mismo tiempo en un qiskit.pulse.Schedule.

  • La unidad SI utilizada para construir objetos qiskit.pulse.SetFrequency está en Hz, pero cuando un objeto PulseQobjInstruction se crea a partir de una instancia de SetFrequency es 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 AttributeError que se plantean si la persona que llama intentó acceder a un atributo que sólo ControlledGate tienen. Esto se ha solucionado añadiendo un getter y setter para num_ctrl_qubits para validar que se está utilizando un valor válido. Correcciones #4576

  • Los controles abiertos se implementaron modificando un Gate objetos definition. 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 paso Unroller para que utilice la definición si encuentra una puerta controlada con los controles abiertos. Correcciones #4437

  • El argumento de la palabra clave insert_barriers en la clase ZZFeatureMap no 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étodo qiskit.circuit.QuantumCircuit método draw() y la función qiskit.visualization.circuit_drawer() no se escalaba correctamente cuando se establecía el kwarg scale . 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.Statevector y qiskit.quantum_info.DensityMatrix clases por circuitos por circuitos que contenían instrucciones Barrier lanzaban una excepción. Correcciones #4461

  • Anteriormente, cuando un QuantumCircuit contenía un Gate con una condición clásica, el transpilador fallaba a veces al utilizar optimization_level=3 en transpile() o execute() elevando un UnboundLocalError. Esto se ha solucionado actualizando el ConsolidateBlocks para 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étodo qiskit.circuit.QuantumCircuit.draw() método y qiskit.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 en True, los números de índice de la parte superior de la columna no se alineaban correctamente. Esto se ha solucionado.

  • Cuando se utiliza cregbunde=True con el backend de salida 'mpl' para el método qiskit.circuit.QuantumCircuit.draw() método y qiskit.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étodo qiskit.circuit.QuantumCircuit.draw() y la función qiskit.visualization.circuit_drawer() función CSwapGate y las puertas RZZGate las 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étodo qiskit.circuit.QuantumCircuit.draw() método y qiskit.visualization.circuit_drawer() las puertas controladas por la función creadas con el método to_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étodo qiskit.circuit.QuantumCircuit.draw() método y qiskit.visualization.circuit_drawer() las puertas de función con matrices como parámetros, como HamiltonianGate, ya no se muestran con un espacio excesivo a su alrededor. Correcciones #4352.

  • Cuando se utiliza el backend de salida 'mpl' para el método qiskit.circuit.QuantumCircuit.draw() método y qiskit.visualization.circuit_drawer() las puertas genéricas creadas instanciando directamente el método qiskit.circuit.Gate muestran ahora el color de fondo adecuado para la puerta. Corrige #4496.

  • Cuando se utiliza el backend de salida 'mpl' para el método qiskit.circuit.QuantumCircuit.draw() y la función qiskit.visualization.circuit_drawer() se ha corregido un error de AttributeError que se producía al utilizar Isometry o Initialize . Corrige #4439.

  • Cuando se utiliza el backend de salida 'mpl' para el método qiskit.circuit.QuantumCircuit.draw() método y qiskit.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étodo qiskit.circuit.QuantumCircuit.draw() y la función qiskit.visualization.circuit_drawer() si se establece el kwarg fold en -1, el circuito se mostrará correctamente sin pliegues. Correcciones #4506.

  • Los pulsos paramétricos de qiskit.pulse.library.discrete tienen ahora cero extremos de pulsos paramétricos por defecto. Los puntos finales se definen de tal manera que para una función f(x)f(x) entonces f(1)=f(duration+1)=0f(-1) = f(duration + 1) = 0. Correcciones #4317

Otras notas

  • La clase qiskit.result.Result que 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ón qiskit.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.QasmSimulator en los backends qiskit.providers.aer.StatevectorSimulator y qiskit.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.SnapshotExpectationValue
    • qiskit.providers.aer.extensions.SnapshotProbabilities
    • qiskit.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 QasmSimulator para 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, Phase y SetPhase instrucciones de pulso a la qiskit.providers.aer.PulseSimulator.

  • Mejorar el rendimiento de la qiskit.providers.aer.PulseSimulator mediante 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_options en la página qiskit.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.QasmSimulator y qiskit.providers.aer.StatevectorSimulator mediante 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_units kwarg a qiskit.providers.aer.noise.NoiseModel.from_device() para especificar gate_lengths personalizado 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 validate en el método qiskit.providers.aer.QasmSimualtor.run() para el objeto backend a True.

  • 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 contains y difference métodos basados en std::set::contains y std::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 actualizada Cliffordpara 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-Dihedral qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral fue 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ón qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() tiene un nuevo kwarg rand_seed que 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 kwarg seed que 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 actualizada Clifford y la clase CNOT-Dihedral actualizada qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral para 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 ImportError si se importara el módulo qiskit.ignis.measurement.discriminator.iq_discriminators . Ahora aparece correctamente en la lista de dependencias para que scikit-learn se instale con qiskit-ignis.
  • La función qiskit.ignis.verification.qv_circuits() utiliza ahora la clase de la biblioteca de circuitos QuantumVolume para 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_gates para la función qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() ha quedado obsoleto y se eliminará en una futura versión. Ha sido sustituido por interleaved_elem. Las funciones de ayuda qiskit.ignis.verification.randomized_benchmarking.BasicUtils, qiskit.ignis.verification.randomized_benchmarking.CliffordUtils y qiskit.ignis.verification.randomized_benchmarking.DihedralUtils han quedado obsoletas. Estas clases son sustituidas por qiskit.ignis.verification.randomized_benchmarking.RBgroup , que gestiona las operaciones de grupo necesarias para RB. La clase qiskit.ignis.verification.randomized_benchmarking.Clifford se sustituye por Clifford.

  • Los kwargs qr y cr para la función qiskit.ignis.verification.qv_circuits() han quedado obsoletos y se eliminarán en una futura versión. Estos kwargs se documentaron como utilizados para especificar un qiskit.circuit.QuantumRegister y qiskit.circuit.ClassicalRegister a 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_lists para la función qiskit.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 en qubit_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 de initial_layout en el transpilador y si un circuito ha sido incrustado con un conjunto de trazado. En lugar de eso, sólo tienes que ejecutar transpile() o execute() 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 QuadraticProgramConverter que es una clase abstracta para convertidores. Añadidos los métodos convert/interpret para los convertidores en lugar de encode/decode. Añadidos to_ising y from_ising a la clase QuadraticProgram . Movidos todos los parámetros de convert al constructor excepto name. Creado setter/getter para los parámetros del convertidor. Añadidos auto_define_penalty y interpret for``LinearEqualityToPenalty``. Ahora los mensajes de error de los convertidores son más informativos.
  • Añadido un optimizador SLSQP qiskit.optimization.algorithms.SlsqpOptimizer como 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 de CobylaOptimizer.
  • 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.
  • SummedOp realiza una comprobación de igualdad matemáticamente más correcta, en la que expresiones como X + X == 2*X y X + Z == Z + X se evalúan a True.

Notas sobre características en desuso

  • La clase optimizadora GSLS desaprobó el parámetro __init__ max_iter en favor de maxiter. La clase optimizadora SPSA desaprobó el parámetro __init__ max_trials en favor de maxiter. la función optimize_svm ha dejado obsoleto el parámetro max_iters en favor de maxiter. La clase ADMMParameters desaprobó el parámetro __init__ max_iter en favor de maxiter.
  • Las clases de conversión de ising qiskit.optimization.converters.QuadraticProgramToIsing y qiskit.optimization.converters.IsingToQuadraticProgram han quedado obsoletas y se eliminarán en una futura versión. En su lugar, deben utilizarse los métodos qiskit.optimization.QuadraticProgram to_ising() y from_ising() .
  • El método pprint_as_string para qiskit.optimization.QuadraticProgram ha quedado obsoleto y se eliminará en una futura versión. En su lugar, sólo debe ejecutar .pprint_as_string() en la salida de to_docplex()
  • El método prettyprint para qiskit.optimization.QuadraticProgram ha quedado obsoleto y se eliminará en una futura versión. En su lugar, sólo debe ejecutar .prettyprint() en la salida de to_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 CircuitStateFn no copiaban el valor de is_measurement y siempre fijaban is_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_fn se 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 ``CircuitSampler no trataba correctamente los coeficientes o los ignoraba por completo. E.g. la evaluación de ~StateFn(0 * (I + Z)) @ Plus no dio 0 o la normalización de ~StateFn(I) @ ((Plus + Minus) / sqrt(2)) omitió un factor de sqrt(2). Esto se ha solucionado.
  • OptimizationResult incluía algunos setters públicos y las variables de clase eran Optional. 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.solve cadenas de bits generadas en un resultado como str. Esta corrección cambió el resultado a List[float] como hacen los otros algoritmos. En la documentación de qiskit.optimization.algorithms faltaban 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 de x y variables coinciden 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 con OptimizationResult.variable_names y OptimizationResult.variables_dict en test_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), donde op es del tipo OperatorBase, a veces devuelve silenciosamente un valor sin sentido cuando el número de qubits en op y other no 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_circuit de VQE devolvía previamente el valor de la expectativa a evaluar como tipo OperatorBase. Esta funcionalidad se ha trasladado a construct_expectation y construct_circuit devuelve una lista de los circuitos que se evalúan para calcular el valor de la expectativa.

IBM Proveedor Q 0.8.0

Nuevas funciones

  • IBMQBackend ahora tiene un nuevo método reservations() que devuelve información de reserva para el backend, con filtrado opcional. Además, ahora puede utilizar provider.backends.my_reservations() para consultar sus propias reservas.
  • qiskit.providers.ibmq.job.IBMQJob.result() lanza una excepción IBMQJobFailureError si 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_version a IBMQJob y qiskit.result.Result objeto recuperado a través de qiskit.providers.ibmq.job.IBMQJob.result(). client_version es 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 opcional reservation_lookahead. Si se especifica o por defecto, un backend se considera no disponible si tiene reservas en los próximos n minutos, donde n es el valor de reservation_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.
  • ManagedResults dispone ahora de un nuevo método combine_results() que combina los resultados de todos los trabajos gestionados y devuelve un único Result único. Este objeto Result puede utilizarse, por ejemplo, en los métodos de ajuste de qiskit-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_time y estimated_complete_time en QueueInfo, devuelto por qiskit.providers.ibmq.job.IBMQJob.queue_info().
    • date en Result, devuelto por qiskit.providers.ibmq.job.IBMQJob.result().

    Además, se espera que el parámetro datetime para qiskit.providers.ibmq.IBMQBackend.properties() también esté en hora local a menos que tenga información sobre la zona horaria UTC.

  • websockets 8.0 o superior si se utiliza Python 3.7 o superior. websockets 7.0 seguirá utilizándose para Python 3.6 o inferior.

  • En Windows, la política de bucle de eventos se establece en WindowsSelectorEventLoopPolicy en lugar de utilizar la predeterminada WindowsProactorEventLoopPolicy. Esto soluciona el problema de que el método qiskit.providers.ibmq.job.IBMQJob.result() podía bloquearse en Windows. Correcciones #691

Notas sobre características en desuso

  • El uso de Qconfig.py para guardar las credenciales de IBM Quantum Experience está obsoleto y se eliminará en la próxima versión. Debería utilizar qiskitrc (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 ValueError al 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 objetos IBMQJob cuando el kwarg status se 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 instalar qiskit-ibmq-provider con una versión de qiskit-terra demasiado antigua. Correcciones #677
¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.