Skip to main content
IBM Quantum Platform

Notas de la versión de Qiskit 0.25


0.25.4

Terra 0.17.2

Preludio

Se trata de una versión de corrección de errores que soluciona varios problemas de la versión 0.17.1. Lo más importante es que esta versión corrige la compatibilidad de la clase QuantumInstance cuando se ejecuta en backends basados en la clase abstracta BackendV1 clase abstracta. Esto arregla todos los algoritmos y aplicaciones construidos en qiskit.algorithms o qiskit.opflow cuando se ejecutan en backends más recientes.

Corrección de errores

Aer 0.8.2

No cambia

Ignis 0.6.0

No cambia

Aqua 0.9.1

No cambia

IBM Proveedor Q 0.12.3

No cambia


0.25.3

Terra 0.17.1

No cambia

Aer 0.8.2

Problemas conocidos

  • Los SaveExpectationValue y SaveExpectationValueVariance han sido desactivados para el método extended_stabilizer de los QasmSimulator y AerSimulator debido a que devuelven el valor incorrecto para ciertos componentes del operador Pauli. Consulte #1227 <https://github.com/Qiskit/qiskit-aer/issues/1227> para obtener más información y ejemplos.

Corrección de errores

  • Se soluciona un problema de rendimiento relacionado con la configuración del atributo basis_gates . Anteriormente se producían efectos secundarios no deseados en la clase backend que podían hacer que el tiempo de ejecución de la simulación repetida aumentara de forma incremental. Consulte la página #1229 <https://github.com/Qiskit/qiskit-aer/issues/1229> para obtener más información y ejemplos.
  • Se corrige un error con la instrucción del simulador "multiplexer" por el que el orden de los qubits de destino y control se invertía con respecto al orden de la instrucción Qiskit.
  • Corrige un error introducido en 0.8.0 por el que las simulaciones de GPU asignaban memoria host innecesaria además de la memoria de GPU.
  • Corrige un error en el método del simulador stabilizer de los QasmSimulator y AerSimulator por el que el valor de la expectativa para los save_expectation_value y snapshot_expectation_value podía tener el signo equivocado para ciertos Y Pauli.

Ignis 0.6.0

No cambia

Aqua 0.9.1

No cambia

IBM Proveedor Q 0.12.3

No cambia


0.25.2

Terra 0.17.1

No cambia

Aer 0.8.1

No cambia

Ignis 0.6.0

No cambia

Aqua 0.9.1

No cambia

IBM Proveedor Q 0.12.3

Otras notas

  • El atributo qiskit.providers.ibmq.experiment.analysis_result.AnalysisResult fit es ahora opcional.

0.25.1

Terra 0.17.1

Preludio

Se trata de una versión de corrección de errores que soluciona varios problemas de la versión 0.17.0. Lo más importante es que esta versión corrige la construcción incorrecta del paquete sdist de la versión 0.17.0, que no era realmente compilable y bloqueaba la instalación en plataformas sin binarios precompilados disponibles.

Corrección de errores

  • Se ha corregido un problema por el que el atributo global_phase no se conservaba en el objeto de salida QuantumCircuit cuando se llamaba al método qiskit.circuit.QuantumCircuit.reverse_bits() era llamado. Por ejemplo:

    import math
    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(3, 2, global_phase=math.pi)
    qc.h(0)
    qc.s(1)
    qc.cx(0, 1)
    qc.measure(0, 1)
    qc.x(0)
    qc.y(1)
    
    reversed = qc.reverse_bits()
    print(reversed.global_phase)

    ahora imprimirá correctamente π\pi.

  • Se ha corregido un problema por el que el pase del transpilador Unroller no preservaba la fase global en caso de instrucciones anidadas con una regla en su definición. Corregido #6134

  • Se ha corregido un problema por el que el atributo parameter de un objeto ControlledGate construido a partir de UnitaryGate no se establecía en la matriz unitaria del objeto UnitaryGate . Anteriormente, control() construía una ControlledGate con el atributo parameter fijado en la versión controlada de la matriz UnitaryGate . Esto llevaría a una modificación de la parameter del objeto base UnitaryGate y las subsiguientes llamadas a inverse() se creaba la inversa de un UnitaryGate de doble control. Corregido #5750

  • Se ha solucionado un problema con los gestores de pases predefinidos level_0_pass_manager y level_1_pass_manager (que corresponden a optimization_level 0 y 1 para transpile()) donde en algunos casos producían circuitos que no estaban en la base solicitada.

  • Se ha corregido un error por el que al utilizar SPSA con calibración automática de la tasa de aprendizaje y la perturbación (es decir learning_rate y perturbation son None en el inicializador), almacena la calibración para todas las optimizaciones futuras. En cambio, la calibración debe hacerse para cada nueva función objetivo.

Aer 0.8.1

Corrección de errores

  • Se ha solucionado un problema con el uso del método matrix_product_state de los simuladores AerSimulator y QasmSimulator al ejecutar una simulación ruidosa con errores de Kraus. Anteriormente, el método de simulación de estado de producto matricial no propagaba los cambios a los qubits vecinos tras aplicar la matriz de Kraus. Se ha corregido para que el resultado de la simulación sea correcto. Corregido #1184 y #1205
  • Se ha solucionado un problema por el que la instrucción qiskit.extensions.Initialize desactivaba la optimización del muestreo de medidas para los métodos de simulación statevector y matrix_product_state de los simuladores AerSimulator y QasmSimulator , incluso cuando era la primera instrucción de circuito o se aplicaba a todos los qubits y, por tanto, era determinista. Corregido #1210
  • Se soluciona un problema con las instrucciones SaveStatevector y SnapshotStatevector cuando se utilizan con el método de simulación extended_stabilizer de los simuladores AerSimulator y QasmSimulator , que devolvían un vector de estado no normalizado. Corregido #1196
  • El método de simulación matrix_product_state ahora tiene soporte para su instrucción de estado previamente ausente, qiskit.providers.aer.library.SetMatrixProductState, que permite establecer el estado de una simulación en un circuito.

Ignis 0.6.0

No cambia

Aqua 0.9.1

IBM Proveedor Q 0.12.2

No cambia


0.25.0

Esta versión deja oficialmente obsoleto el proyecto Qiskit Aqua. En consecuencia, en una futura versión el paquete qiskit-aqua se eliminará del metapaquete Qiskit, lo que significa que en esa futura versión pip install qiskit ya no incluirá qiskit-aqua. Los módulos de aplicación que proporciona qiskit-aqua se han dividido en varios paquetes nuevos: qiskit-optimization, qiskit-nature, qiskit-machine-learning, y qiskit-finance. Estos paquetes pueden instalarse por sí solos (mediante el comando estándar pip install, por ejemplo pip install qiskit-nature) o con el resto del metapaquete Qiskit como extras opcionales (p. ej. pip install 'qiskit[finance,optimization]' o pip install 'qiskit[all]' Los algoritmos centrales y el flujo de operadores existen ahora como parte de qiskit-terra en qiskit.algorithms y qiskit.opflow. Dependiendo del uso que hagas de Aqua, deberás utilizar los paquetes de la aplicación o los nuevos módulos de Qiskit Terra. Para más detalles sobre cómo migrar desde Qiskit Aqua, puedes consultar la guía de migración.

Terra 0.17.0

Preludio

Qiskit Terra 0.17.0 incluye muchas funciones nuevas y correcciones de errores. La principal novedad de esta versión es la introducción de la función qiskit.algorithms y qiskit.opflow migrados y adaptados del proyecto qiskit.aqua .

Nuevas funciones

  • La función qiskit.pulse.call() ahora puede tomar un Parameter junto con una subrutina parametrizada. Esto permite asignar valores diferentes a los Parameter objetos para cada llamada de subrutina.

    Por ejemplo:

    from qiskit.circuit import Parameter
    from qiskit import pulse
    
    amp = Parameter('amp')
    
    with pulse.build() as subroutine:
        pulse.play(pulse.Gaussian(160, amp, 40), DriveChannel(0))
    
    with pulse.build() as main_prog:
        pulse.call(subroutine, amp=0.1)
        pulse.call(subroutine, amp=0.3)
  • El qiskit.providers.models.QasmBackendConfiguration tiene un nuevo campo processor_type que puede utilizarse opcionalmente para proporcionar información sobre el procesador de un backend de la forma: {"family": <str>, "revision": <str>, segment: <str>}. Por ejemplo: {"family": "Canary", "revision": "1.0", segment: "A"}.

  • Las clases qiskit.pulse.Scheduleqiskit.pulse.Instruction y qiskit.pulse.Channel tienen ahora una propiedad parameter que devolverá cualquier objeto Parameter utilizados en el objeto y un método is_parameterized() que devolverá True si se utiliza algún parámetro en el objeto.

    Por ejemplo:

    from qiskit.circuit import Parameter
    from qiskit import pulse
    
    shift = Parameter('alpha')
    
    schedule = pulse.Schedule()
    schedule += pulse.SetFrequency(shift, pulse.DriveChannel(0))
    
    assert schedule.is_parameterized() == True
    print(schedule.parameters)
  • Se ha añadido un PiecewiseChebyshev a la función qiskit.circuit.library para implementar una aproximación Chebyshev a trozos de una función de entrada. Para una función dada f(x)f(x) y un grado dd, esta clase implementa una aproximación Chebyshev polinómica a trozos en nn qubits a f(x)f(x) en los intervalos dados. Todos los polinomios de la aproximación son de grado dd.

    Por ejemplo:

    import numpy as np
    from qiskit import QuantumCircuit
    from qiskit.circuit.library.arithmetic.piecewise_chebyshev import PiecewiseChebyshev
    f_x, degree, breakpoints, num_state_qubits = lambda x: np.arcsin(1 / x), 2, [2, 4], 2
    pw_approximation = PiecewiseChebyshev(f_x, degree, breakpoints, num_state_qubits)
    pw_approximation._build()
    qc = QuantumCircuit(pw_approximation.num_qubits)
    qc.h(list(range(num_state_qubits)))
    qc.append(pw_approximation.to_instruction(), qc.qubits)
    qc.draw(output='mpl')
  • La clase BackendProperties tiene ahora un método readout_length() que devuelve la longitud de lectura [sec] del qubit dado.

  • Se ha añadido una nueva clase ScheduleBlockse ha añadido al módulo qiskit.pulse módulo. Esta clase proporciona una nueva representación de un programa de impulsos. Esta representación es la más adecuada para la sintaxis del constructor de impulsos y se basa en el orden relativo de las instrucciones.

    Esta representación toma alignment_context en lugar de especificar el tiempo de inicio t0 para cada instrucción. La hora de inicio de la instrucción se asigna implícitamente con la transformación especificada y la posición relativa de las instrucciones.

    El sitio ScheduleBlock permite la programación perezosa de instrucciones, lo que significa que podemos asignar parámetros arbitrarios a la duración de las instrucciones.

    Por ejemplo:

    from qiskit.pulse import ScheduleBlock, DriveChannel, Gaussian
    from qiskit.pulse.instructions import Play, Call
    from qiskit.pulse.transforms import AlignRight
    from qiskit.circuit import Parameter
    
    dur = Parameter('rabi_duration')
    
    block = ScheduleBlock(alignment_context=AlignRight())
    block += Play(Gaussian(dur, 0.1, dur/4), DriveChannel(0))
    block += Call(measure_sched)  # subroutine defined elsewhere

    este código define un experimento que explora la duración de un pulso gaussiano seguido de una medición measure_sched, es decir, un experimento Rabi. Puede reutilizar el objeto block para cada duración escaneada asignando un valor de duración objetivo.

  • Se ha añadido una nueva función array_to_latex() al módulo qiskit.visualization que puede utilizarse para representar y visualizar vectores y matrices con LaTeX.

    from qiskit.visualization import array_to_latex
    from numpy import sqrt, exp, pi
    mat = [[0, exp(pi*.75j)],
           [1/sqrt(8), 0.875]]
    array_to_latex(mat)
  • En Statevector y DensityMatrix tienen ahora métodos draw() que permiten dibujar objetos como matrices de texto, objetos IPython Latex, fuentes Latex, esferas Q, esferas Bloch y gráficos Hinton. Por defecto, el tipo de salida es el equivalente a la salida de __repr__ , pero este valor predeterminado se puede cambiar en un archivo de configuración de usuario estableciendo la opción state_drawer . Por ejemplo:

    from qiskit.quantum_info import DensityMatrix
    dm = DensityMatrix.from_label('r0')
    dm.draw('latex')
    from qiskit.quantum_info import Statevector
    sv = Statevector.from_label('+r')
    sv.draw('qsphere')

    Además, el método draw() se utiliza ahora para la visualización en ipython de estas clases, por lo que si cambia el tipo de salida por defecto en un archivo de configuración de usuario, entonces cuando aparezca un método Statevector o un objeto DensityMatrix en un cuaderno jupyter se utilizará ese tipo de salida para el objeto.

  • Pulso qiskit.pulse.Instruction objetos y objetos de pulso paramétrico (por ejemplo Gaussian ahora soportan el uso de Parameter y ParameterExpression para el parámetro duration . Por ejemplo:

    from qiskit.circuit import Parameter
    from qiskit.pulse import Gaussian
    
    dur = Parameter('x_pulse_duration')
    double_dur = dur * 2
    rx_pulse = Gaussian(dur, 0.1, dur/4)
    double_rx_pulse = Gaussian(double_dir, 0.1, dur/4)

    Observe que, aunque podemos crear una instrucción con un parámetro duration , la adición de una instrucción con un parámetro no enlazado duration a un programa sólo es posible mediante la representación recién introducida ScheduleBlock. Consulte la sección de notas de la versión sobre problemas conocidos para obtener más información.

  • El método run() método para el QasmSimulatorPy, StatevectorSimulatorPyy UnitarySimulatorPy toma ahora un QuantumCircuit (o una lista de objetos QuantumCircuit como entrada. El objeto QasmQobj sigue siendo compatible por ahora, pero será obsoleto en una futura versión.

    Para ver un ejemplo de cómo utilizarlo, consulte:

    from qiskit import transpile, QuantumCircuit
    
    from qiskit.providers.basicaer import BasicAer
    
    backend = BasicAer.get_backend('qasm_simulator')
    
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.measure_all()
    
    tqc = transpile(circuit, backend)
    result = backend.run(tqc, shots=4096).result()
  • El CommutativeCancellation transpiler pass tiene un nuevo kwarg opcional en el constructor basis_gates, que toma una lista de nombres de puertas base para el backend de destino. Cuando se especifica, el pase sólo utilizará las puertas en el kwarg basis_gates . Anteriormente, el pase sustituía automáticamente las puertas consecutivas que conmutan con ZGate por la U1Gate incondicionalmente. El kwarg basis_gates le permite especificar qué puertas de rotación z están presentes en la base de destino para evitar esto.

  • Los constructores de la Bit y subclases, Qubit, Clbity AncillaQubitse han actualizado para que sus dos parámetros, register y index , sean opcionales. Esto permite crear objetos de bits independientes de un registro.

  • Se ha añadido una nueva clase BooleanExpressionse ha añadido al módulo qiskit.circuit.classicalfunction módulo. Esta clase permite crear un oráculo a partir de una expresión booleana Python. Por ejemplo:

    from qiskit.circuit import BooleanExpression, QuantumCircuit
    
    expression = BooleanExpression('~x & (y | z)')
    circuit = QuantumCircuit(4)
    circuit.append(expression, [0, 1, 2, 3])
    circuit.draw('mpl')
    circuit.decompose().draw('mpl')

    El sitio BooleanExpression también incluye un método from_dimacs_file()que permite cargar fórmulas descritas en el formato DIMACS-CNF. Por ejemplo:

    from qiskit.circuit import BooleanExpression, QuantumCircuit
    
    boolean_exp = BooleanExpression.from_dimacs_file("simple_v3_c2.cnf")
    circuit = QuantumCircuit(boolean_exp.num_qubits)
    circuit.append(boolean_exp, range(boolean_exp.num_qubits))
    circuit.draw('text')
         ┌───────────────────┐
    q_0:0
         │                   │
    q_1:1
         │  SIMPLE_V3_C2.CNF │
    q_2:2
         │                   │
    q_3:3
         └───────────────────┘
    circuit.decompose().draw('text')
    q_0: ──o────o────────────
           │    │
    q_1: ──■────o────■───────
           │    │    │
    q_2: ──■────┼────o────■──
         ┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐
    q_3: ┤ X ├┤ X ├┤ X ├┤ X ├
         └───┘└───┘└───┘└───┘
  • Se ha añadido una nueva clase, PhaseOracleque se ha añadido al módulo qiskit.circuit.library módulo. Esta clase permite construir circuitos de oráculo de fase a partir de Python expresiones booleanas.

    from qiskit.circuit.library.phase_oracle import PhaseOracle
    
    oracle = PhaseOracle('x1 & x2 & (not x3)')
    oracle.draw('mpl')

    Estos oráculos de fase pueden utilizarse como parte de un algoritmo más amplio, por ejemplo con qiskit.algorithms.AmplificationProblem:

    from qiskit.algorithms import AmplificationProblem, Grover
    from qiskit import BasicAer
    
    backend = BasicAer.get_backend('qasm_simulator')
    
    problem = AmplificationProblem(oracle, is_good_state=oracle.evaluate_bitstring)
    grover = Grover(quantum_instance=backend)
    result = grover.amplify(problem)
    result.top_measurement

    La clase PhaseOracle también incluye un método from_dimacs_file() que permite construir un oráculo de fase a partir de un fichero que describe una fórmula en formato DIMACS-CNF.

    from qiskit.circuit.library.phase_oracle import PhaseOracle
    
    oracle = PhaseOracle.from_dimacs_file("simple_v3_c2.cnf")
    oracle.draw('text')
    state_0: ─o───────o──────────────
              │ ┌───┐ │ ┌───┐
    state_1: ─■─┤ X ├─■─┤ X ├─■──────
              │ └───┘   └───┘ │ ┌───┐
    state_2: ─■───────────────o─┤ Z ├
                                └───┘
  • Todos los pases del transpilador (es decir, cualquier instancia de BasePass) son ahora directamente invocables. Llamar a un pass proporciona una interfaz conveniente para ejecutar el pass en un QuantumCircuit objeto.

    Por ejemplo, la ejecución de una sola pasada de transformación, como BasisTranslatorse puede hacer con

    from qiskit import QuantumCircuit
    from qiskit.transpiler.passes import BasisTranslator
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    
    circuit = QuantumCircuit(1)
    circuit.h(0)
    
    pass_instance = BasisTranslator(sel, ['rx', 'rz', 'cx'])
    result = pass_instance(circuit)
    result.draw(output='mpl')

    Al ejecutar un pase de análisis, es necesario añadir como parámetro un conjunto de propiedades (como dict o como PropertySet) que puede modificarse "in situ". Por ejemplo:

    from qiskit import QuantumCircuit
    from qiskit.transpiler.passes import Depth
    
    circuit = QuantumCircuit(1)
    circuit.h(0)
    
    property_set = {}
    pass_instance = Depth()
    pass_instance(circuit, property_set)
    print(property_set)
  • La clase QasmQobjConfig tiene ahora un kwarg opcional para meas_level y meas_return. Estos campos pueden utilizarse para generar QasmQobj cargas de trabajo que admitan meas_level=1 (datos con kernel) para trabajos de circuito (anteriormente esto sólo se exponía para PulseQobj objetos). La función assemble() se ha actualizado para establecer este campo en los objetos QasmQobj objetos que genera.

  • Se ha añadido un nuevo tensor() a la clase QuantumCircuit clase. Este método permite tensar otro circuito con un circuito existente. Este método funciona de forma análoga a qiskit.quantum_info.Operator.tensor() y es coherente con la convención little-endian de Qiskit.

    Por ejemplo:

    from qiskit import QuantumCircuit
    top = QuantumCircuit(1)
    top.x(0);
    bottom = QuantumCircuit(2)
    bottom.cry(0.2, 0, 1);
    bottom.tensor(top).draw(output='mpl')
  • La clase qiskit.circuit.QuantumCircuit admite ahora metadatos arbitrarios de forma libre con el atributo metadata atributo. Un usuario (o programa construido sobre QuantumCircuit) puede adjuntar metadatos a un circuito para utilizarlos en su seguimiento. Por ejemplo:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2, user_metadata_field_1='my_metadata',
                        user_metadata_field_2='my_other_value')

    o:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.metadata = {'user_metadata_field_1': 'my_metadata',
                   'user_metadata_field_2': 'my_other_value'}

    Estos metadatos no se utilizarán para influir en la ejecución del circuito, sino que sólo se utilizan para el seguimiento del circuito durante la vida útil del objeto. El atributo metadata persistirá entre cualquier transformación de circuito, incluyendo transpile() y assemble(). La expectativa es que los proveedores asocien los metadatos al resultado que devuelven, de modo que los usuarios puedan filtrar los resultados en función de los metadatos del circuito del mismo modo que pueden hacerlo actualmente con QuantumCircuit.name.

  • Añadir una nueva clase de operador CNOTDihedral al módulo qiskit.quantum_info módulo. Esta clase se utiliza para representar el grupo CNOT-Diédrico, que está generado por las puertas cuánticas CXGate, TGatey XGate.

  • Añade un operador binario & (__and__) a las subclases BaseOperator (por ejemplo qiskit.quantum_info.Operator) en el módulo qiskit.quantum_info módulo. Esto es una forma abreviada de llamar a las clases compose() (es decir, A & B == A.compose(B)).

    Por ejemplo:

    import qiskit.quantum_info as qi
    
    qi.Pauli('X') & qi.Pauli('Y')
  • Añade un operador binario & (__and__) a qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix clases. Esto es una forma abreviada de llamar a las clases evolve() (es decir, psi & U == psi.evolve(U)).

    Por ejemplo:

    import qiskit.quantum_info as qi
    
    qi.Statevector.from_label('0') & qi.Pauli('X')
  • Una nueva puerta de 2 qubits, ECRGatela resonancia cruzada eco (ECR), se ha añadido al módulo qiskit.circuit.library junto con el método correspondiente, ecr() para la QuantumCircuit clase. La puerta ECR son dos pulsos CR(π4)CR(\frac{π}{4}) con un XGate entre ellos para el eco. Esta puerta es localmente equivalente a una CXGate (puede convertirse en una CNOT con pre- o post-rotación local). Es la puerta nativa en el hardware actual de IBM y compilar a ella permite que las pre-/post-rotaciones se fusionen con el resto del circuito.

  • Se ha añadido un nuevo kwarg approximation_degree a la función transpile() para permitir la compilación aproximada. Los valores válidos van de 0 a 1, y mayor significa menor aproximación. Se trata de un dial heurístico para experimentar con aproximaciones de circuitos. La interpretación concreta de este número se deja a cada pasada, que puede utilizarlo para realizar alguna versión aproximada de la pasada. Algunos ejemplos concretos son los UnitarySynthesis pase o los o traductores a conjuntos de compuertas discretas. Si un pase no admite esta opción, implica una transformación exacta.

  • Dos nuevos passess transpiler, GateDirection y qiskit.transpiler.passes.CheckGateDirectionse han añadido al módulo qiskit.transpiler.passes módulo. Estos nuevos pases están pensados como sustitutos más generales de CXDirection y CheckCXDirection (ambos obsoletos, véanse las notas de obsoletos para más detalles) que realizan la misma función pero funcionan con otras puertas además de con sólo CXGate.

  • Cuando se ejecuta en Windows, la ejecución en paralelo con la función parallel_map() (sigue desactivada por defecto). Para ello, puede establecer parallel = True en un archivo de configuración de usuario, o establecer la variable de entorno QISKIT_PARALLEL en TRUE (esto también afectará a transpile() y assemble() que utilizan parallel_map() internamente). Es importante tener en cuenta que cuando se habilita el paralelismo en Windows hay limitaciones sobre cómo Python lanza procesos para Windows, ver la sección de Problemas Conocidos más abajo para más detalles sobre las limitaciones con la ejecución paralela en Windows.

  • Se ha añadido una nueva función hellinger_distance()para calcular la distancia de Hellinger entre dos distribuciones de recuentos qiskit.quantum_info módulo.

  • La función decompose_clifford() del módulo qiskit.quantum_info (que utiliza internamente el método qiskit.quantum_info.Clifford.to_circuit() tiene un nuevo kwarg method que permite seleccionar el método de síntesis utilizado, ya sea estableciéndolo en 'AG' o 'greedy'. Por defecto, para más de tres qubits se establece en 'greedy' , que utiliza una rutina de compilación codiciosa no óptima para la síntesis de elementos Clifford, de Bravyi et. al., que suele ofrecer un mejor coste CX que el método Aaronson-Gottesman utilizado anteriormente (para más de dos qubits). Puede utilizar method kwarg para volver al método Aaronson-Gottesman anterior por defecto configurando method='AG'.

  • La clase Initialize del módulo qiskit.extensions puede construirse ahora utilizando un número entero. Los bits '1' del entero insertarán un Reset y un XGate en el circuito del qubit correspondiente. Esto se hará utilizando la convención estándar little-endian es qiskit, es decir, el bit más a la derecha del número entero se establecerá qubit 0. Por ejemplo, si se establece el parámetro en Initialize igual a 5 , los qubits 0 y 2 tendrán el valor 1.

    from qiskit.extensions import Initialize
    
    initialize = Initialize(13)
    initialize.definition.draw('mpl')
  • La clase Initialize del módulo qiskit.extensions permite ahora construir directamente a partir de una etiqueta Pauli (de forma análoga al método qiskit.quantum_info.Statevector.from_label() ). La etiqueta Pauli se refiere a los estados base de los estados propios de Pauli Z, X, Y. Estas etiquetas utilizan la notación estándar little-endian de Qiskit, por ejemplo una etiqueta de '01' inicializaría el qubit 0 a 1|1\rangle y el qubit 1 a 0|0\rangle.

    from qiskit.extensions import Initialize
    
    initialize = Initialize("10+-lr")
    initialize.definition.draw('mpl')
  • El kwarg, template_list, para el constructor del qiskit.transpiler.passes.TemplateOptimization transpiler pass ahora admite la recepción de una lista tanto de QuantumCircuit y DAGDependency objetos. Anteriormente, sólo se aceptaban QuantumCircuit (que se convertían internamente en objetos DAGDependency objetos) en la lista de entrada.

  • Se ha introducido un nuevo transpiler pass, qiskit.transpiler.passes.RZXCalibrationBuildercapaz de generar calibraciones y añadirlas a un circuito cuántico. Este paso toma los objetos calibrados CXGate y crea las calibraciones para qiskit.circuit.library.RZXGate objetos con un ángulo de rotación arbitrario. Los horarios se crean estirando y comprimiendo los pulsos GaussianSquare de las puertas de resonancia de eco cruzado.

  • Se añaden nuevos circuitos de plantilla para utilizar qiskit.circuit.library.RZXGate se añaden al módulo qiskit.circuit.library (por ejemplo rzx_yz). Esto permite emparejar el TemplateOptimization pass con el qiskit.transpiler.passes.RZXCalibrationBuilder pass para encontrar y sustituir automáticamente secuencias de compuertas, como CNOT - P(theta) - CNOT, por circuitos más eficientes basados qiskit.circuit.library.RZXGate con una calibración.

  • El tipo de salida de matplotlib para los valores circuit_drawer() y el método draw() de la clase QuantumCircuit admiten ahora archivos de configuración para establecer el estilo de visualización. En versiones anteriores, existía una funcionalidad básica que permitía a los usuarios pasar un kwarg style que tomaba un dict para personalizar los colores y otras características de visualización del cajón mpl . Esto se ha ampliado ahora para que estos diccionarios se puedan cargar desde archivos JSON directamente sin necesidad de pasar un diccionario. Esto permite a los usuarios crear nuevos archivos de estilo y utilizar ese estilo para las visualizaciones pasando el nombre del archivo de estilo como una cadena al kwarg style .

    Para aprovechar esta función, debe establecer la opción circuit_mpl_style_path en un archivo de configuración de usuario. Esta opción se debe establecer en la ruta que desea qiskit para buscar archivos JSON estilo. Si se especifican varias entradas de ruta, deben ir separadas por :. Por ejemplo, si se define circuit_mpl_style_path = ~/.qiskit:~/user_styles en un archivo de configuración de usuario, se buscarán archivos JSON tanto en ~/.qiskit como en ~/user_styles.

  • Se ha añadido un nuevo kwarg, format_marginal a la función marginal_counts() que cuando se establece en True formatea la salida de recuentos según el cregs del circuito y los índices que faltan se representan con un _. Por ejemplo:

    from qiskit import QuantumCircuit, execute, BasicAer, result
    from qiskit.result.utils import marginal_counts
    qc = QuantumCircuit(5, 5)
    qc.x(0)
    qc.measure(0, 0)
    
    result = execute(qc, BasicAer.get_backend('qasm_simulator')).result()
    print(marginal_counts(result.get_counts(), [0, 2, 4], format_marginal=True))
  • Mejora del rendimiento de qiskit.quantum_info.Statevector.expectation_value() y qiskit.quantum_info.DensityMatrix.expectation_value() cuando el operador del argumento es un Pauli o SparsePauliOp operador.

  • El archivo de configuración de usuario tiene 2 nuevas opciones de configuración, num_processes y parallel, que se utilizan para controlar el comportamiento predeterminado de parallel_map(). La opción parallel es un booleano que se utiliza para dictar si parallel_map() se ejecutará en múltiples procesos o no. Si se establece en False las llamadas a parallel_map() se ejecutarán en serie, mientras que si se establece en True se habilitará la ejecución en paralelo. La opción num_processes toma un número entero que establece cuántas CPUs utilizar cuando se ejecuta en paralelo. Por defecto, utilizará el número de núcleos de CPU de un sistema.

  • Hay 2 nuevas variables de entorno, QISKIT_PARALLEL y QISKIT_NUM_PROCS, que se pueden utilizar para controlar el comportamiento por defecto de parallel_map(). La opción QISKIT_PARALLEL se puede establecer en TRUE (cualquier mayúscula) para establecer por defecto que se ejecute en múltiples procesos cuando parallel_map() es llamado. Si se establece en cualquier otro valor parallel_map() se ejecutará en serie. QISKIT_NUM_PROCS toma un número entero (por ejemplo QISKIT_NUM_PROCS=5) que se utilizará como número por defecto de procesos a ejecutar. Ambos tendrán prioridad sobre la opción equivalente establecida en el archivo de configuración del usuario.

  • Se ha añadido un nuevo método gradient()a la clase ParameterExpression clase. Este método se utiliza para evaluar el gradiente de un ParameterExpression objeto.

  • El método __eq__ (es decir, lo que se llama cuando se utiliza el operador == ) para el operador ParameterExpression permite ahora la comparación con un valor numérico. Anteriormente, sólo era posible comparar dos instancias de ParameterExpression con ==. Por ejemplo:

    from qiskit.circuit import Parameter
    
    x = Parameter("x")
    y = x + 2
    y = y.assign(x, -1)
    
    assert y == 1
  • La clase PauliFeatureMap en el módulo qiskit.circuit.library permite ahora ajustar el factor de rotación, α\alpha, ya sea mediante el atributo kwarg alpha en el constructor o mediante el atributo alpha después de la creación. Anteriormente, este valor estaba fijado en 2.0. El ajuste de este atributo permite un mejor control de los límites de decisión y proporciona flexibilidad adicional en el manejo de las características de entrada sin necesidad de escalarlas explícitamente en el conjunto de datos.

  • Una nueva Gate clase, PauliGatese ha añadido el módulo qiskit.circuit.library y el método correspondiente pauli()a la clase QuantumCircuit clase. Esta nueva clase de compuerta permite aplicar varias compuertas pauli individuales a distintos qubits a la vez. Esto es útil sobre todo para los simuladores, que pueden utilizar esta nueva puerta para implementar de forma más eficiente múltiples puertas Pauli simultáneas.

  • Mejore el qiskit.quantum_info.Pauli operador. Esta clase representa ahora un elemento del grupo de Pauli completo de N-qubit incluyendo coeficientes complejos. Ahora admite los métodos de la API de operador compose(), dot(), tensor() etc, donde componer y punto se definen con respecto al grupo de Pauli completo.

    Esta clase también permite la conversión a y desde la representación de cadena de Pauli por conveniencia.

    Por ejemplo

    from qiskit.quantum_info import Pauli
    
    P1 = Pauli('XYZ')
    P2 = Pauli('YZX')
    P1.dot(P2)

    Los Pauli también pueden añadirse directamente a QuantumCircuit objetos

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import Pauli
    
    circ = QuantumCircuit(3)
    circ.append(Pauli('XYZ'), [0, 1, 2])
    circ.draw(output='mpl')

    Otros métodos permiten calcular cuándo dos Pauli conmutan (utilizando el método commutes() ) o anticonmutación (utilizando el método anticommutes() ), y calcular el Pauli resultante de la conjugación de Clifford P=C.P.CP^\prime = C.P.C^\dagger utilizando el método evolve() método.

    Consulte la documentación de la API de la clase Pauli para más información.

  • Se ha añadido una nueva función random_pauli()para generar un elemento aleatorio del grupo de Pauli de N-qubit se ha añadido al módulo qiskit.quantum_info módulo.

  • Se ha añadido una nueva clase PiecewisePolynomialPauliRotationsse ha añadido al módulo qiskit.circuit.library módulo. Este elemento de la librería de circuitos se utiliza para mapear una función polinómica a trozos, f(x)f(x), que se define a través de puntos de ruptura y coeficientes, sobre amplitudes de qubits. Los puntos de ruptura (x0,...,xJ)(x_0, ..., x_J) son un subconjunto de [0,2n1][0, 2^n-1], donde nn es el número de qubits de estado. Los coeficientes correspondientes [aj,1,...,aj,d][a_{j,1},...,a_{j,d}], donde dd es el grado más alto entre todos los polinomios. Entonces f(x)f(x) se define como:

f(x)={0,x<x0i=0i=daj,ixi,xjx<xj+1\begin{split}f(x) = \begin{cases} 0, x < x_0 \\ \sum_{i=0}^{i=d}a_{j,i} x^i, x_j \leq x < x_{j+1} \end{cases}\end{split}

donde asumimos implícitamente xJ+1=2nx_{J+1} = 2^n. Y el mapeo aplicado a las amplitudes viene dado por

Fx0=cos(pj(x))x0+sin(pj(x))x1F|x\rangle |0\rangle = \cos(p_j(x))|x\rangle |0\rangle + \sin(p_j(x))|x\rangle |1\rangle

Este mapeo se basa en rotaciones Y de Pauli controladas y se construye utilizando el método PolynomialPauliRotations.

  • Se ha introducido un nuevo módulo qiskit.algorithms nuevo. Este módulo contiene una funcionalidad equivalente a la proporcionada anteriormente por el módulo qiskit.aqua.algorithms (que ahora está obsoleto) y proporciona los bloques de construcción para construir algoritmos cuánticos. Para más detalles sobre la migración de qiskit-aqua a este nuevo módulo, consulte la guía de migración.

  • Se ha introducido un nuevo módulo qiskit.opflow nuevo. Este módulo contiene una funcionalidad equivalente a la proporcionada anteriormente por el módulo qiskit.aqua.operators (que ahora está obsoleto) y proporciona los operadores y funciones de estado que se utilizan para construir algoritmos cuánticos. Para más detalles sobre la migración de qiskit-aqua a este nuevo módulo, consulte la guía de migración.

  • Esta es la primera versión que incluye ruedas binarias precompiladas para los sistemas Linux aarch64. Si estás ejecutando un sistema compatible con manylinux2014 aarch64 Linux ahora hay ruedas precompiladas disponibles en PyPI, ya no es necesario compilar desde el código fuente para instalar qiskit-terra.

  • La función qiskit.quantum_info.process_fidelity() puede utilizarse ahora con un canal de destino no unitario. En este caso el valor devuelto equivale al qiskit.quantum_info.state_fidelity() de las matrices qiskit.quantum_info.Choi de los canales.

    Tenga en cuenta que los qiskit.quantum_info.average_gate_fidelity() y qiskit.quantum_info.gate_error() requieren que el canal de destino sea unitario y lanzarán una excepción si no lo es.

  • Añadida una nueva función de creación de impulsos, qiskit.pulse.macro(). Esto permite decorar las funciones normales de Python como macros. Esto permite utilizar funciones de creación de impulsos dentro de la función decorada. La macro del constructor puede llamarse desde un contexto de construcción de impulsos, lo que permite reutilizar el código.

    Por ejemplo:

    from qiskit import pulse
    
    @pulse.macro
    def measure(qubit: int):
        pulse.play(pulse.GaussianSquare(16384, 256, 15872),
                   pulse.MeasureChannel(qubit))
        mem_slot = pulse.MemorySlot(0)
        pulse.acquire(16384, pulse.AcquireChannel(0), mem_slot)
        return mem_slot
    
    with pulse.build(backend=backend) as sched:
        mem_slot = measure(0)
        print(f"Qubit measured into {mem_slot}")
    
    sched.draw()
  • Se ha añadido una nueva clase PauliTwoDesignque implementa una forma particular de circuito de qiskit.circuit.library que implementa una forma particular de un circuito de 2 diseños de https://arxiv.org/pdf/1803.11173.pdf Por ejemplo, este circuito puede tener el siguiente aspecto

    from qiskit.circuit.library import PauliTwoDesign
    circuit = PauliTwoDesign(4, reps=2, seed=5, insert_barriers=True)
    circuit.decompose().draw(output='mpl')
  • Ya está disponible un nuevo cajón de pulsos qiskit.visualization.pulse_v2.draw() (cuyo alias es qiskit.visualization.pulse_drawer_v2). Este nuevo cajón de pulsos admite múltiples funciones nuevas no presentes en el cajón de pulsos original (pulse_drawer()).

    • Truncado de instrucciones de impulso largas.
    • Visualización de pulsos paramétricos.
    • Nuevas hojas de estilo IQXStandard, IQXSimple, IQXDebugging.
    • Visualización de la información del sistema (frecuencia del canal, etc.) especificando qiskit.providers.Backend objetos para su visualización.
    • Especificación de objetos axis para el trazado, a fin de permitir una mayor extensión de los trazados generados, es decir, para manipulaciones de publicación.

    Las nuevas hojas de estilo pueden tomar funciones callback que modifiquen dinámicamente la apariencia de la imagen de salida, por ejemplo, reensamblando una colección de canales, mostrando detalles de instrucciones, actualizando la apariencia de las envolventes de pulsos, etc. Puede crear funciones de devolución de llamada personalizadas e introducirlas en una instancia de hoja de estilo para modificar el aspecto de la figura sin modificar el código del cajón. Para más detalles, consulte la documentación del módulo de cajón de pulsos.

    Tenga en cuenta que ahora el guardado de archivos se delega en Matplotlib. Para guardar archivos de imagen, es necesario llamar al método savefig con el objeto devuelto Figure .

  • Añade un método reverse_qargs() al método qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix clases. Este método invierte el orden de los subsistemas en los estados y es equivalente al qiskit.circuit.QuantumCircuit.reverse_bits() para estados N-qubit. Por ejemplo:

    from qiskit.circuit.library import QFT
    from qiskit.quantum_info import Statevector
    
    circ = QFT(3)
    
    state1 = Statevector.from_instruction(circ)
    state2 = Statevector.from_instruction(circ.reverse_bits())
    
    state1.reverse_qargs() == state2
  • Añade un método reverse_qargs() método a la clase qiskit.quantum_info.Operator clase. Este método invierte el orden de los subsistemas en el operador y es equivalente al método qiskit.circuit.QuantumCircuit.reverse_bits() para operadores N-qubit. Por ejemplo:

    from qiskit.circuit.library import QFT
    from qiskit.quantum_info import Operator
    
    circ = QFT(3)
    
    op1 = Operator(circ)
    op2 = Operator(circ.reverse_bits())
    
    op1.reverse_qargs() == op2
  • El método de salida latex para la función qiskit.visualization.circuit_drawer() y el método draw() utilizarán ahora una etiqueta definida por el usuario en las puertas de la visualización de salida. Por ejemplo:

    import math
    
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.rx(math.pi/2, 0, label='My Special Rotation')
    
    qc.draw(output='latex')
  • El kwarg routing_method para la función transpile() acepta ahora una nueva opción, 'none'. En routing_method='none' no se ejecutará ninguna pasada de enrutamiento como parte de la transpilación. Si el circuito no se ajusta al mapa de acoplamiento se producirá una TranspilerError se producirá una excepción.

  • Se ha añadido una nueva clase de puerta RVGatese ha añadido al módulo qiskit.circuit.library junto con el correspondiente método QuantumCircuit método rv(). La RVGate es una puerta de rotación general, similar a UGatepero en lugar de especificar ángulos de Euler se especifican los tres componentes de un vector de rotación donde la dirección del vector especifica el eje de rotación y la magnitud especifica el ángulo de rotación sobre el eje en radianes. Por ejemplo:

    import math
    
    import np
    
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(1)
    theta = math.pi / 5
    phi = math.pi / 3
    # RGate axis:
    axis = np.array([math.cos(phi), math.sin(phi)])
    rotation_vector = theta * axis
    qc.rv(*rotation_vector, 0)
  • Sin consolidar Parameter utilizados en un objeto QuantumCircuit se ordenarán por nombre. Esto tendrá efecto para los parámetros devueltos por el atributo parameters atributo. Además, el qiskit.circuit.QuantumCircuit.bind_parameters() y qiskit.circuit.QuantumCircuit.assign_parameters() pueden ahora recibir una lista de valores a que se vincularán/asignarán a los parámetros en orden de nombre. Antes, estos métodos sólo aceptaban un diccionario de parámetros y valores. Por ejemplo:

    from qiskit.circuit import QuantumCircuit, Parameter
    
    circuit = QuantumCircuit(1)
    circuit.rx(Parameter('x'), 0)
    circuit.ry(Parameter('y'), 0)
    
    print(circuit.parameters)
    
    bound = circuit.bind_parameters([1, 2])
    bound.draw(output='mpl')
  • Los constructores de los módulos qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix pueden tomar ahora un objeto QuantumCircuit para construir un objeto Statevector y DensityMatrix a partir de ese circuito, suponiendo que los qubits están inicializados en 0|0\rangle. Por ejemplo:

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import Statevector
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    
    statevector = Statevector(qc)
    statevector.draw(output='latex')
  • Las nuevas clases de backend falso están disponibles en qiskit.test.mock. Estos incluyen versiones simuladas de ibmq_casablanca, ibmq_sydney, ibmq_mumbai, ibmq_lima, ibmq_belem, ibmq_quito. Al igual que los demás backends falsos, incluyen instantáneas de los datos de calibración (por ejemplo, backend.defaults()) y los datos de error (es decir, backend.properties()) tomados del sistema real, y pueden utilizarse para pruebas locales, compilación y simulación.

Problemas conocidos

  • Al intentar añadir un objeto qiskit.pulse.Instruction con un parámetro duration (es decir, el valor de duration es un objeto no vinculado Parameter o ParameterExpression ) a un objeto qiskit.pulse.Schedule no es compatible. El intento de hacerlo dará lugar a UnassignedDurationError PulseError se produzca. Se trata de una limitación del modo en que se evalúan actualmente las restricciones de solapamiento de Instruction . Esto es posible gracias a ScheduleBlocken el que las restricciones de solapamiento se evalúan justo antes de la ejecución.

  • En sistemas Windows cuando la ejecución paralela está habilitada para parallel_map() el paralelismo puede no funcionar cuando se llama desde un script que se ejecuta fuera de un bloque if __name__ == '__main__': . Esto se debe a la forma en que Python lanza procesos paralelos en Windows. RuntimeError AttributeError Si los scripts que llaman a parallel_map() (incluyendo funciones que usan parallel_map() internamente como transpile()) con Windows y el paralelismo activado, puede intentar incrustar las llamadas a los scripts dentro de if __name__ == '__main__': para solucionar el problema. Por ejemplo:

    from qiskit import QuantumCircuit, QiskitError
    from qiskit import execute, Aer
    
    qc1 = QuantumCircuit(2, 2)
    qc1.h(0)
    qc1.cx(0, 1)
    qc1.measure([0,1], [0,1])
    # making another circuit: superpositions
    qc2 = QuantumCircuit(2, 2)
    qc2.h([0,1])
    qc2.measure([0,1], [0,1])
    execute([qc1, qc2], Aer.get_backend('qasm_simulator'))

    Se debería cambiar a:

    from qiskit import QuantumCircuit, QiskitError
    from qiskit import execute, Aer
    
    def main():
        qc1 = QuantumCircuit(2, 2)
        qc1.h(0)
        qc1.cx(0, 1)
        qc1.measure([0,1], [0,1])
        # making another circuit: superpositions
        qc2 = QuantumCircuit(2, 2)
        qc2.h([0,1])
        qc2.measure([0,1], [0,1])
        execute([qc1, qc2], Aer.get_backend('qasm_simulator'))
    
    if __name__ == '__main__':
        main()

    si se encuentra algún error con el paralelismo en Windows.

Notas de actualización

  • Los gestores de pases preestablecidos level_1_pass_manager, level_2_pass_managery level_3_pass_manager (que se utilizan para optimization_level 1, 2, y 3 en los archivos transpile() y execute() ) utilizan ahora incondicionalmente el pase Optimize1qGatesDecomposition para la optimización de la puerta de 1 qubit. Anteriormente, estos gestores de pases utilizaban el Optimize1qGates pass si las puertas base contenían u1, u2, o u3. Si desea seguir utilizando el antiguo Optimize1qGates tendrás que construir un PassManager con el pase.

  • Tras la transpilación de un QuantumCircuitel atributo global_phase atributo de circuito de salida ya no puede devolverse de forma simplificada, si la fase global es un ParameterExpression.

    Por ejemplo:

    qc = QuantumCircuit(1)
    theta = Parameter('theta')
    
    qc.rz(theta, 0)
    qc.rz(-theta, 0)
    
    print(transpile(qc, basis_gates=['p']).global_phase)

    antes devolvía 0, pero ahora devolverá -0.5*theta + 0.5*theta. Este cambio era necesario para evitar una gran penalización de rendimiento en tiempo de ejecución, ya que la simplificación de expresiones simbólicas puede ser bastante lenta, especialmente si hay muchos ParameterExpression objetos en un circuito.

  • Los objetos de trabajo BasicAerJob devueltos por los backends de BasicAer son ahora instancias síncronas de JobV1. Esto significa que las llamadas a la función run() se bloquearán hasta que la simulación termine de ejecutarse. Si quieres restaurar el comportamiento asíncrono anterior, tendrás que envolver el archivo run() con algo que se ejecute en un hilo o proceso independiente como futures.ThreadPoolExecutor o futures.ProcessPoolExecutor.

  • La opción allow_sample_measuring para el simulador BasicAer QasmSimulatorPy ha cambiado de False por defecto a True. Esto se hizo para reflejar mejor el comportamiento real por defecto del simulador, que utilizaría la medición de muestras si el circuito de entrada lo soportaba (incluso si no estaba activado). Si está ejecutando un circuito que no admite la medición de muestras (es decir, tiene operaciones Reset o si hay operaciones después de una medición en un qubit) debe asegurarse de establecer explícitamente esta opción en False cuando llame a run().

  • El transpilador CommutativeCancellation transpiler pass conoce ahora las puertas de la base de destino, lo que significa que sólo utilizará puertas en la base especificada. Anteriormente, el pase sustituía incondicionalmente las puertas consecutivas que conmutan con ZGate por la puerta U1Gate. Sin embargo, ahora que el pase es consciente de la base y tiene un kwarg, basis_gates, para especificar la base de destino hay un cambio potencial en el comportamiento si no se establece el kwarg. Si no se utiliza el kwarg basis_gates y no hay puertas de rotación z variable en el circuito, no se producirá ninguna cancelación conmutativa.

  • Register (que es la clase padre de QuantumRegister y ClassicalRegister y Bit (que es la clase padre de Qubit y Clbit) son ahora inmutables. En versiones anteriores era posible ajustar el valor de a size o name de un objeto Register y los atributos index o register de un objeto Bit objeto después de su creación inicial. Sin embargo, esto llevaría a un comportamiento insano que corrompería la estructura del contenedor que depende de un hash (como un dict) ya que estos atributos son tratados como propiedades inmutables de un registro o bit (ver #4705 para más detalles). Para evitar este comportamiento erróneo, los atributos de a Register y Bit ya no se pueden establecer después de la creación inicial. Si anteriormente ajustaba los objetos en tiempo de ejecución, ahora tendrá que crear un nuevo objeto Register o Bit con los nuevos valores.

  • El método DAGCircuit.__eq__ (que es utilizado por el operador == ), que se utiliza para comprobar la igualdad estructural de DAGCircuit y QuantumCircuit incluirá ahora el método global_phase y calibrations en los campos en los que se comprueba la igualdad. Esto significa que circuitos que habrían sido evaluados como iguales en versiones anteriores pueden dejar de serlo si global_phase o calibrations difieren entre los circuitos. Por ejemplo, en versiones anteriores, esto devolvía True:

    import math
    
    from qiskit import QuantumCircuit
    
    qc1 = QuantumCircuit(1)
    qc1.x(0)
    
    qc2 = QuantumCircuit(1, global_phase=math.pi)
    qc2.x(0)
    
    print(qc2 == qc1)

    Sin embargo, como el atributo global_phase de los circuitos es diferente, ahora devolverá False.

  • Los métodos qubits() y clbits() de la clase DAGCircuit que quedaron obsoletos en la versión de 0.15.0 Terra, han sido eliminados. En su lugar, debe utilizar los atributos qubits y clbits de la clase DAGCircuit de la clase Por ejemplo, si estuvieras corriendo:

    from qiskit.dagcircuit import DAGCircuit
    
    dag = DAGCircuit()
    qubits = dag.qubits()

    Eso sería reemplazado por:

    from qiskit.dagcircuit import DAGCircuit
    
    dag = DAGCircuit()
    qubits = dag.qubits
  • El PulseDefaults devueltos por los backends de pulso falso qiskit.test.mock.FakeOpenPulse2Q y qiskit.test.mock.FakeOpenPulse3Q se han actualizado para tener definiciones de secuencia de pulso más realistas. Si está utilizando estas clases backend falsas puede que necesite actualizar su uso debido a estos cambios.

  • El método de síntesis por defecto utilizado por la función decompose_clifford() del módulo quantum_info (que utiliza internamente el método qiskit.quantum_info.Clifford.to_circuit() ) para más de 3 qubits utiliza ahora una rutina de compilación codiciosa no óptima para la síntesis de elementos Clifford, de Bravyi et. al., que suele ofrecer un mejor coste CX que el antiguo por defecto. Si necesita volver al método Aaronson-Gottesman anterior, puede hacerlo configurando method='AG'.

  • El módulo anteriormente obsoleto qiskit.visualization.interactive, que fue obsoleto en la versión 0.15.0, ha sido eliminado. En su lugar, deberías utilizar las visualizaciones basadas en matplotlib:

    Función interactiva eliminada
    Función matplotlib equivalente
    iplot_bloch_multivectorqiskit.visualization.plot_bloch_multivector()
    iplot_state_cityqiskit.visualization.plot_state_city()
    iplot_state_qsphereqiskit.visualization.plot_state_qsphere()
    iplot_state_hintonqiskit.visualization.plot_state_hinton()
    iplot_histogramqiskit.visualization.plot_histogram()
    iplot_state_paulivecqiskit.visualization.plot_state_paulivec()
  • Los atributos de nivel superior qiskit.Aer y qiskit.IBMQ ahora se cargan lentamente. Esto significa que ahora los objetos siempre existirán y ya no se producirán advertencias en la importación si qiskit-aer o qiskit-ibmq-provider no están instalados (o no pueden ser encontrados por Python ). Si estaba comprobando la presencia de qiskit-aer o qiskit-ibmq-provider utilizando estos atributos de módulo y comparando explícitamente con None o buscando la ausencia del atributo, esto ya no funcionará porque ahora siempre están definidos como un objeto. En otras palabras corriendo algo como:

    try:
        from qiskit import Aer
    except ImportError:
        print("Aer not available")
    
    or::
    
    try:
        from qiskit import IBMQ
    except ImportError:
        print("IBMQ not available")

    ya no funcionará. En su lugar, para determinar si esos proveedores están presentes, puede utilizar explícitamente qiskit.providers.aer.Aer y qiskit.providers.ibmq.IBMQ:

    try:
        from qiskit.providers.aer import Aer
    except ImportError:
        print("Aer not available")
    
    try:
        from qiskit.providers.ibmq import IBMQ
    except ImportError:
        print("IBMQ not available")

    o consulte bool(qiskit.Aer) y bool(qiskit.IBMQ) en su lugar, por ejemplo:

    import qiskit
    
    if not qiskit.Aer:
        print("Aer not available")
    if not qiskit.IBMQ:
        print("IBMQ not available")

    Este cambio era necesario para evitar posibles problemas de ciclo de importación entre los paquetes qiskit y también para mejorar el tiempo de importación cuando no se utilizan Aer o IBMQ.

  • La opción suppress_packaging_warnings del archivo de configuración de usuario y la variable de entorno QISKIT_SUPPRESS_PACKAGING_WARNINGS ya no tienen ningún efecto y se ignorarán silenciosamente. Las advertencias que controlaba esta opción se han eliminado y ya no se emitirán en el momento de la importación desde el módulo qiskit .

  • El anteriormente obsoleto condition kwarg for qiskit.dagcircuit.DAGNode ha sido eliminado. Se eliminó en la versión 0.15.0. En su lugar, ahora debería establecer la condición clásica en el objeto Instruction que se pasa al constructor DAGNode al crear un nuevo nodo op .

  • Al crear una nueva clase Register (que es la clase padre de QuantumRegister y ClassicalRegister) o QuantumCircuit con un número de bits (por ejemplo, QuantumCircuit(2)), ahora es necesario que el número de bits se especifique como un número entero u otro tipo que sea convertible a números enteros inequívocos (por ejemplo, 2.0). Los valores no enteros provocarán ahora un error, ya que la intención en esos casos no estaba clara (no se pueden tener bits fraccionarios). Para obtener más información sobre por qué se cambió esto consulte: #4855

  • networkx ya no es un requisito para qiskit-terra. Todo el uso de networkx dentro de qiskit-terra ha sido eliminado con la excepción de 3 métodos:

    • qiskit.dagcircuit.DAGCircuit.to_networkx
    • qiskit.dagcircuit.DAGCircuit.from_networkx
    • qiskit.dagcircuit.DAGDependency.to_networkx

    Si utiliza cualquiera de estos métodos, deberá instalar manualmente networkx en su entorno para poder seguir utilizándolos.

  • Por defecto en macOS con Python >= 3.8 parallel_map() ya no se ejecutará en múltiples procesos. Este es un cambio respecto a versiones anteriores en las que el comportamiento por defecto era que parallel_map() lanzaba múltiples procesos. Este cambio se realizó porque con las versiones más recientes de macOS con Python 3.8 y 3.9 el multiprocesamiento no es fiable o añade una sobrecarga significativa debido al cambio en Python 3.8 para lanzar nuevos procesos con spawn en lugar de fork. Para volver a activar la ejecución en paralelo en macOS con Python >= 3.8 puede utilizar la opción del archivo de configuración de usuario parallel o establecer la variable de entorno QISKIT_PARALLEL en True.

  • El anteriormente obsoleto kwarg callback en el constructor de la clase PassManager ha sido eliminado. Este kwarg está obsoleto desde la versión 0.13.0 (9 de abril de 2020). En su lugar, puede pasar el kwarg callback al método qiskit.transpiler.PassManager.run() directamente. Por ejemplo, si estuvieras utilizando:

    from qiskit.circuit.random import random_circuit
    from qiskit.transpiler import PassManager
    
    qc = random_circuit(2, 2)
    
    def callback(**kwargs)
      print(kwargs['pass_'])
    
    pm = PassManager(callback=callback)
    pm.run(qc)

    puede sustituirse por:

    from qiskit.circuit.random import random_circuit
    from qiskit.transpiler import PassManager
    
    qc = random_circuit(2, 2)
    
    def callback(**kwargs)
      print(kwargs['pass_'])
    
    pm = PassManager()
    pm.run(qc, callback=callback)
  • Ya no es posible instanciar un canal base sin prefijo, como qiskit.pulse.Channel o qiskit.pulse.PulseChannel. Estas clases están diseñadas para clasificar tipos de diferentes clases de canales de cara al usuario, como qiskit.pulse.DriveChannel, pero no tienen una definición como recurso de destino. Si antes instanciaba directamente qiskit.pulse.Channel o qiskit.pulse.PulseChannel, esto ya no está permitido. Utilice la subclase adecuada.

  • Cuando los kwargs require_cp y/o require_tp de qiskit.quantum_info.process_fidelity(), qiskit.quantum_info.average_gate_fidelity(), qiskit.quantum_info.gate_error() son True, ahora sólo registrarán una advertencia en lugar del comportamiento anterior de lanzar una excepción QiskitError si el canal de entrada no es CP o TP respectivamente.

  • La clase QFT en el módulo qiskit.circuit.library calcula ahora la transformada de Fourier utilizando una representación little-endian de tensores, es decir, el estado 1|1\rangle mapea a 01+2..|0\rangle - |1\rangle + |2\rangle - .. asumiendo que la base computacional corresponde al orden de bits little-endian de los enteros. 0=000,1=001|0\rangle = |000\rangle, |1\rangle = |001\rangle etc. Esto se hizo para hacerlo más consistente con el resto de Qiskit, que utiliza una convención little-endian para el orden de bits. Si dependías del orden de bits anterior, puedes utilizar el método reverse_bits() para volver al comportamiento anterior. Por ejemplo:

    from qiskit.circuit.library import QFT
    
    qft = QFT(5).reverse_bits()
  • El atributo de módulo qiskit.__qiskit_version__ antes era un dict ahora devolverá un objeto Mapping personalizado de sólo lectura que comprueba la versión de los elementos qiskit en tiempo de ejecución en lugar de en tiempo de importación. Esto se hizo para acelerar la ruta de importación de qiskit y eliminar un posible ciclo de importación importando sólo los paquetes de elementos en tiempo de ejecución si se necesita la versión del paquete. Esto debería ser totalmente compatible con el dict volver anteriormente y para la mayoría de los casos de uso normal no habrá ninguna diferencia. Sin embargo, si algunas aplicaciones dependían de la mutación del contenido o de la comprobación explícita del tipo, puede que sea necesario actualizarlas para adaptarlas a este cambio.

  • El módulo qiskit.execute ha pasado a llamarse qiskit.execute_function. Esto era necesario para evitar un potente conflicto de nombres entre la función execute() que se reexporta como qiskit.execute. qiskit.execute la función en algunas situaciones podría entrar en conflicto con qiskit.execute el módulo que daría lugar a un error críptico porque Python estaba tratando qiskit.execute como el módulo cuando la intención era a la función o viceversa. El cambio de nombre del módulo era necesario para evitar este conflicto. Si está importando qiskit.execute para obtener el módulo (el uso típico era from qiskit.execute import execute) tendrá que actualizar esto para utilizar qiskit.execute_function en su lugar. qiskit.execute ahora siempre resolverá a la función.

  • Los módulos qiskit.compiler.transpile, qiskit.compiler.assemble, qiskit.compiler.schedule, y qiskit.compiler.sequence han pasado a llamarse qiskit.compiler.transpiler, qiskit.compiler.assembler, qiskit.compiler.scheduler, y qiskit.compiler.sequence respectivamente. Esto era necesario para evitar un potente conflicto de nombres entre los módulos y las rutas de las funciones reexportadas qiskit.compiler.transpile(), qiskit.compiler.assemble(), qiskit.compiler.schedule()y qiskit.compiler.sequence(). En algunas situaciones, este conflicto de nombres entre la ruta del módulo y la ruta de la función reexportada provocaría un error críptico porque Python estaba tratando una importación como el módulo cuando la intención era utilizar la función o viceversa. El cambio de nombre del módulo era necesario para evitar este conflicto. Si antes utilizabas las importaciones para obtener los módulos (el uso típico sería likefrom qiskit.compiler.transpile import transpile) tendrás que actualizarlo para utilizar las nuevas rutas de los módulos. qiskit.compiler.transpile(), qiskit.compiler.assemble(), qiskit.compiler.schedule()y qiskit.compiler.sequence() resolverán siempre a las funciones.

  • La clase qiskit.quantum_info.Quaternion se ha trasladado del submódulo qiskit.quantum_info.operator al submódulo qiskit.quantum_info.synthesis para reflejar mejor su finalidad. No es necesario realizar ningún cambio si se importa desde el módulo raíz qiskit.quantum_info pero si lo importas desde qiskit.quantum_info.operator tendrás que actualizar la ruta de importación.

  • Eliminado el método QuantumCircuit.mcmt , obsoleto desde el lanzamiento de Qiskit Terra 0.14.0 en abril de 2020. En lugar de utilizar el método, utilice la clase MCMT para construir una puerta multicontrol multiobjetivo y utilice la clase qiskit.circuit.QuantumCircuit.append() o qiskit.circuit.QuantumCircuit.compose() para añadirla a un circuito.

    Por ejemplo, puede sustituir:

    circuit.mcmt(ZGate(), [0, 1, 2], [3, 4])

    con:

    from qiskit.circuit.library import MCMT
    mcmt = MCMT(ZGate(), 3, 2)
    circuit.compose(mcmt, range(5))
  • Eliminado el método QuantumCircuit.diag_gate , obsoleto desde el lanzamiento de Qiskit Terra 0.14.0 en abril de 2020. En su lugar, utilice el diagonal() método QuantumCircuit.

  • Eliminado el método QuantumCircuit.ucy , obsoleto desde el lanzamiento de Qiskit Terra 0.14.0 en abril de 2020. En su lugar, utilice el ucry() método QuantumCircuit.

  • El método mirror() para qiskit.circuit.QuantumCircuit ha sido eliminado. Se eliminó en la versión 0.15.0. El método qiskit.circuit.QuantumCircuit.reverse_ops() ya que la duplicación podría confundirse con el intercambio de qubits de salida del circuito. El método reverse_ops() sólo invierte el orden de las puertas que se aplican en lugar de reflejarlas.

  • Se ha eliminado el soporte previamente obsoleto de pasar un float (para el kwarg scale como primer argumento posicional a la función qiskit.circuit.QuantumCircuit.draw() se ha eliminado. Se eliminó en la versión 0.12.0. El primer argumento posicional del método qiskit.circuit.QuantumCircuit.draw() es ahora output kwarg, que no acepta float. En su lugar, debería utilizar scale como un kwarg con nombre en lugar de utilizarlo posicionalmente.

    Por ejemplo, si antes llamaba a draw con:

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.draw(0.75, output='mpl')

    esto tendría que ser ahora:

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.draw(output='mpl', scale=0.75)

    o:

    qc.draw('mpl', scale=0.75)
  • Las funciones de Qiskit Pulse (qiskit.pulse) que quedaron obsoletas en la versión 0.15.0 (agosto de 2020) han sido eliminadas. El conjunto completo de cambios son:

    Módulo
    Anterior
    Nuevo
    qiskit.pulse.librarySamplePulseWaveform
    qiskit.pulse.libraryConstantPulseConstant
    (renombrar módulo)pulse.pulse_lib Móduloqiskit.pulse.library
    Clase
    Método antiguo
    Nuevo método
    ParametricPulseget_sample_pulseget_waveform
    InstructioncommandN/A. Se han unificado los Comandos y las Instrucciones. Utilice operands() para obtener información sobre los datos de la instrucción.
    Acquireacquires, mem_slots, reg_slotsacquire(), mem_slot(), reg_slot(). (La instrucción Acquire instrucción ya no se transmite a través de múltiples qubits)
  • El diccionario que antes se mantenía en DAGCircuit se ha eliminado. En su lugar, los bordes contienen ahora la instancia Bit instancia que se había incluido previamente en el diccionario como su campo 'wire' . Tenga en cuenta que el gráfico NetworkX devuelto por to_networkx() seguirá teniendo un diccionario para sus atributos de arista, pero el campo 'name' ya no se rellenará.

  • El atributo parameters de la clase QuantumCircuit ya no devuelve set. En su lugar, devuelve un objeto ParameterView que implementa todos los métodos que ofrece set (aunque obsoletos). Esto se hizo para apoyar un modelo que conserva los parámetros ordenados por nombre. Debe ser totalmente compatible con cualquier uso anterior de la dirección set devuelta por el atributo parameters excepto cuando se haya realizado una comprobación explícita del tipo de un conjunto.

  • Cuando se ejecuta transpile() en un QuantumCircuit con delay() las unidades se convertirán a dt si el valor de dt (tiempo de muestreo) es conocido por transpile()ya sea explícitamente mediante el kwarg dt o mediante el kwarg BackendConfiguration para un objeto Backend pasado a través del kwarg backend .

  • La interpretación de meas_map (que es un atributo de un PulseBackendConfiguration o como el kwarg correspondiente de meas_map en el objeto schedule(), assemble(), sequence()o execute() ) se ha actualizado para ajustarse mejor a las verdaderas limitaciones del hardware. El formato de estos datos es una lista de listas, donde los elementos de la lista interior son números enteros que especifican las etiquetas de los qubits. Por ejemplo:

    [[A, B, C], [D, E, F, G]]

    Anteriormente, la restricción meas_map se interpretaba de forma que si se adquiría un qubit (por ejemplo, A), todos los demás qubits que compartieran un subgrupo con ese qubit (B y C) tendrían que adquirirse al mismo tiempo y durante la misma duración. Esta restricción se ha relajado. Una adquisición no requiere más adquisiciones. (Si se adquiere A, no es necesario adquirir B y C) Por el contrario, los qubits del mismo grupo de medida no pueden adquirirse de forma parcialmente solapada - piense que meas_map especifica un recurso de adquisición compartido (si adquirimos A desde t=1000 hasta t=2000, no podemos adquirir B a partir de 1000<t<2000). Por ejemplo:

    # Good
    meas_map = [[0, 1]]
    # Acquire a subset of [0, 1]
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    
    # Acquire 0 and 1 together (same start time, same duration)
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    sched = sched.append(pulse.Acquire(10, acq_q1))
    
    # Acquire 0 and 1 disjointly
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    sched = sched.append(pulse.Acquire(10, acq_q1)) << 10
    
    # Acquisitions overlap, but 0 and 1 aren't in the same measurement
    # grouping
    meas_map = [[0], [1]]
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    sched = sched.append(pulse.Acquire(10, acq_q1)) << 1
    
    # Bad: 0 and 1 are in the same grouping, but acquisitions
    # partially overlap
    meas_map = [[0, 1]]
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    sched = sched.append(pulse.Acquire(10, acq_q1)) << 1

Notas sobre características en desuso

  • Se han añadido dos nuevos argumentos qiskit.dagcircuit.DAGNode.semantic_eq(), bit_indices1 y bit_indices2, que se espera que asignen las Bit de cada DAGNode a su índice en qubits o clbits lista de sus respectivos DAGCircuit. Durante el periodo de desaprobación, estos argumentos son opcionales y cuando no se especifican las correspondencias se construirán automáticamente basándose en las propiedades register y index de cada instancia Bit instancia. Sin embargo, en una futura versión, serán argumentos obligatorios y el usuario deberá proporcionar la asignación.

  • La página pulse funciones de constructor:

    • qiskit.pulse.call_circuit()
    • qiskit.pulse.call_schedule()

    están obsoletos y se eliminarán en una futura versión. Estas funciones están unificadas en qiskit.pulse.call() , que debería utilizarse en su lugar.

  • El método qiskit.pulse.Scheduleqiskit.pulse.Schedule.flatten() está obsoleto y se eliminará en una futura versión. En su lugar, puede utilizar la función qiskit.pulse.transforms.flatten() que realizará la misma operación.

  • La página assign_parameters() para las siguientes clases:

    y todas sus subclases están obsoletas y se eliminarán en una futura versión. Esta funcionalidad se ha subsumido ScheduleBlock que es la dirección futura para la construcción de programas de pulso parametrizados.

  • El atributo parameters para las siguientes clases:

    está obsoleto y se eliminará en una futura versión. Esta funcionalidad se ha subsumido ScheduleBlock que es la dirección futura para la construcción de programas de pulso parametrizados.

  • Python 3.6 ha quedado obsoleto y se eliminará en una próxima versión. Cuando se elimine la compatibilidad, deberá actualizar la versión de Python que esté utilizando a Python 3.7 o superior.

  • Dos métodos QuantumCircuit métodos combine() y extend() junto con sus correspondientes operadores Python + y += están obsoletos y serán eliminados en una futura versión. En su lugar, el QuantumCircuit método compose() debe ser utilizado. El método compose() método permite una mayor flexibilidad a la hora de componer dos circuitos que no tengan registros coincidentes. Sin embargo, no añade qubits/clbits automáticamente, a diferencia de los métodos obsoletos. Para añadir un circuito en nuevos qubits/clbits, se puede utilizar el método qiskit.circuit.QuantumCircuit.tensor() se puede utilizar el método Por ejemplo:

    from qiskit.circuit import QuantumRegister, QuantumCircuit
    
    a = QuantumRegister(2, 'a')
    circuit_a = QuantumCircuit(a)
    circuit_a.cx(0, 1)
    
    b = QuantumRegister(2, 'b')
    circuit_b = QuantumCircuit(b)
    circuit_b.cz(0, 1)
    
    # same as circuit_a + circuit_b (or combine)
    added_with_different_regs = circuit_b.tensor(circuit_a)
    
    # same as circuit_a + circuit_a (or combine)
    added_with_same_regs = circuit_a.compose(circuit_a)
    
    # same as circuit_a += circuit_b (or extend)
    circuit_a = circuit_b.tensor(circuit_a)
    
    # same as circuit_a += circuit_a (or extend)
    circuit_a.compose(circuit_a, inplace=True)
  • Soporte para pasar Qubit al kwarg qubits del método qiskit.transpiler.InstructionDurations.get() ha quedado obsoleto y se eliminará en una futura versión. En su lugar, debe llamar al método get() con los índices enteros de los qubits deseados.

  • El uso de @ (__matmul__) para invocar el método compose de las subclases de BaseOperator (por ejemplo Operator) está obsoleto y será eliminado en una futura versión. El método qiskit.quantum_info.Operator.compose() puede utilizarse directamente o también invocarse mediante el operador & (__and__).

  • Utilizando * (__mul__) para llamar al método dot() de las subclases de BaseOperator (por ejemplo qiskit.quantum_info.Operator) está obsoleto y se eliminará en una futura versión. En su lugar, puede llamar directamente al dot() directamente.

  • Utilizando @ (__matmul__) para invocar el evolve() del método qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix está obsoleto y será eliminado en una futura versión.. El método evolve puede utilizarse directamente o también invocarse mediante el operador & (__and__).

  • La clase qiskit.pulse.schedule.ParameterizedSchedule ha quedado obsoleta y se eliminará en una futura versión. En su lugar, puede parametrizar directamente los objetos pulse Schedule con un objeto Parameter por ejemplo:

    from qiskit.circuit import Parameter
    from qiskit.pulse import Schedule
    from qiskit.pulse import ShiftPhase, DriveChannel
    
    theta = Parameter('theta')
    target_schedule = Schedule()
    target_schedule.insert(0, ShiftPhase(theta, DriveChannel(0)), inplace=True)
  • La clase qiskit.pulse.ScheduleComponent del módulo qiskit.pulse ha quedado obsoleta y se eliminará en una próxima versión. Su uso debe sustituirse utilizando un qiskit.pulse.Schedule o directamente en qiskit.pulse.Instruction . Además, el propósito principal de la clase ScheduleComponent era como clase base común tanto para Schedule y Instruction para cualquier lugar que estuviera explícitamente comprobando el tipo o documentando la aceptación de una entrada ScheduleComponent debería actualizarse para aceptar Instruction o Schedule.

  • Los archivos de esquema JSON y el uso de las cargas útiles de la API IBMQ están obsoletos y se eliminarán en una futura versión. Esto incluye todo lo que se encuentra bajo el módulo qiskit.schemas y el módulo qiskit.validation . Esto también incluye los kwargs de validate para qiskit.qobj.QasmQobj.to_dict() y qiskit.qobj.QasmQobj.to_dict() junto con los validadores fastjsonschema a nivel de módulo en qiskit.qobj (que no generan advertencias de desaprobación). Los archivos de esquemas se han trasladado al repositorio Qiskit/ibmq-schemas y deben tratarse como las versiones canónicas de los esquemas de la API. En el futuro, sólo esos esquemas recibirán actualizaciones y se utilizarán como fuente de verdad para los esquemas. Si confiaba en los esquemas incluidos en qiskit-terra, debería actualizarlos para utilizar ese repositorio.

  • El módulo qiskit.util ha quedado obsoleto y se eliminará en una próxima versión. Ha sido sustituido por qiskit.utils que ofrece la misma funcionalidad y se ampliará en el futuro. Tenga en cuenta que no se emitirá ningún DeprecationWarning en relación con esta deprecación, ya que no era factible en Python 3.6.

  • El pase del transpilador CXDirection en el módulo qiskit.transpiler.passes ha quedado obsoleto y se eliminará en una futura versión. En su lugar, debe utilizarse GateDirection . Su comportamiento es idéntico al de CXDirection , salvo que ahora también admite la transformación de un circuito con ECRGate además de CXGate puertas.

  • El pase del transpilador CheckCXDirection en el módulo qiskit.transpiler.passes ha quedado obsoleto y se eliminará en una futura versión. En su lugar, debe utilizarse el pase CheckGateDirection . Se comporta de forma idéntica al CheckCXDirection excepto que ahora también soporta la comprobación de la dirección de todas las puertas de 2 qubits, no sólo de las puertas de CXGate puertas.

  • El método WeightedAddernum_ancilla_qubits() está obsoleto y se eliminará en una futura versión. Se ha sustituido por el atributo qiskit.circuit.library.WeightedAdder.num_ancillas que es coherente con las API de otras bibliotecas de circuitos.

  • Los siguientes métodos heredados de la clase qiskit.quantum_info.Pauli han quedado obsoletos. Véase la documentación del método para su sustitución en la clase Pauli actualizada.

    • from_label()
    • sgn_prod()
    • to_spmatrix()
    • kron()
    • update_z()
    • update_x()
    • insert_paulis()
    • append_paulis()
    • delete_qubits()
    • pauli_single()
    • random()
  • Utilizando un list o numpy.ndarray como argumento channel o target para el comando qiskit.quantum_info.process_fidelity(), qiskit.quantum_info.average_gate_fidelity(), qiskit.quantum_info.gate_error()y qiskit.quantum_info.diamond_norm() ha quedado obsoleto y no se admitirá en futuras versiones. En su lugar, las entradas deben ser un Gate o un objeto de la subclase BaseOperator (p. ej. Operator, Choietc.)

  • Acceso a las referencias de Qubit y Clbit a los registros que las contienen mediante las etiquetas register o index ha quedado obsoleta y se eliminará en una futura versión. En su lugar, Register los objetos pueden consultarse para encontrar los Bit objetos que contienen.

  • La funcionalidad actual de la función qiskit.visualization.pulse_drawer() está obsoleta y será sustituida por qiskit.visualization.pulse_drawer_v2() (que no es compatible con versiones anteriores) en una futura versión.

  • El uso de métodos heredados del tipo set en la salida del atributo parameters (que solía ser un set) de la clase QuantumCircuit están obsoletos y se eliminarán en una futura versión. Esto incluye los métodos de add(), difference(), difference_update(), discard(), intersection(), intersection_update(), issubset(), issuperset(), symmetric_difference(), symmetric_difference_update(), union(), update(), __isub__() (que es el operador -= ), y __ixor__() (que es el operador ^= ).

  • El nombre del primer (y único) argumento posicional del método qiskit.circuit.QuantumCircuit.bind_parameters() ha cambiado de value_dict a values. Pasar un argumento con el nombre values_dict está obsoleto y se eliminará en futuras versiones. Por ejemplo, si antes llamaba a bind_parameters() con una llamada como: bind_parameters(values_dict={}) esto es obsoleto y debe ser reemplazado por bind_parameters(values={}) o incluso mejor simplemente pasar el argumento posicionalmente bind_parameters({}).

  • El nombre del primer (y único) argumento posicional del método qiskit.circuit.QuantumCircuit.assign_parameters() ha cambiado de param_dict a parameters. Pasar un argumento con el nombre param_dict está obsoleto y se eliminará en futuras versiones. Por ejemplo, si antes llamaba a assign_parameters() con una llamada como: assign_parameters(param_dict={}) esto es obsoleto y debe ser reemplazado por assign_parameters(values={}) o incluso mejor simplemente pasar el argumento posicionalmente assign_parameters({}).

Corrección de errores

  • Se ha solucionado un problema por el que la función execute() lanzaba una excepción QiskitError excepción cuando se pasaba un ParameterVector para el kwarg parameter_bind . parámetro. Por ejemplo, ahora es posible llamar a algo como:

    execute(circuit, backend, parameter_binds=[{pv1: [...], pv2: [...]}])

    donde pv1 y pv2 son ParameterVector objetos. Corregido #5467

  • Se ha solucionado un problema con las etiquetas de los pulsos paramétricos en la clase PulseQobjInstruction no se establecían correctamente como en el caso de los pulsos muestreados. Esto también significa que los nombres de pulso PulseDefaults devuelto por un Backendcomo x90, x90m, etc, se establecerán correctamente. Corregido #5363

  • Se ha corregido un problema por el que los parámetros no vinculados sólo se producían en el atributo global_phase de un objeto QuantumCircuit no se mostraban en el atributo parameters y no se podían vincular. Corregido #5806

  • El atributo calibrations de los objetos QuantumCircuit se conservan ahora cuando se utilizan los métodos += (es decir, el método extend() ) y + (es decir, el método combine() ). Corregidos #5930 y #5908

  • El método name de la clase Register (que es la clase padre de QuantumRegister y ClassicalRegister) no comprobaba si la cadena asignada era un nombre de registro válido según la especificación OpenQASM. Anteriormente, esta comprobación sólo se realizaba cuando el nombre se especificaba en el constructor; ahora se ha corregido para que establecer el atributo name directamente con un valor no válido también genere una excepción. Corregido #5461

  • Se ha corregido un problema con la función qiskit.visualization.circuit_drawer() función y qiskit.circuit.QuantumCircuit.draw() cuando se visualizaba un QuantumCircuit con un Gate que tiene una condición clásica después de un Measure que utilizaba el mismo ClassicalRegisterera posible que el condicional Gate se visualizara a la izquierda del Measure. Corregido #5387

  • En el paso del transpilador qiskit.transpiler.passes.CSPLayout se observó un sesgo hacia los qubits de menor número. Este sesgo indeseable se ha corregido barajando los candidatos para aleatorizar los resultados. Además, el uso del CSPLayout pass en el preset_passmanagers (para los niveles 2 y 3) se ha ajustado para utilizar una semilla configurada si el kwarg seed_transpiler está configurado cuando se llama a transpile() se llama. Corregido #5990

  • Se ha corregido un error por el que el campo channels de un objeto PulseBackendConfiguration no se incluía en la salida del método qiskit.providers.models.PulseBackendConfiguration.to_dict método. Corregido #5579

  • Corregido el enredo de 'circular' en la clase qiskit.circuit.library.NLocal para el caso extremo en el que el circuito tiene el mismo tamaño que el bloque de entrelazamiento (por ejemplo, un circuito de dos qubits y puertas de entrelazamiento CZ). En este caso sólo debería haber una puerta de entrelazamiento, pero accidentalmente se añadió una segunda en la dirección inversa a la primera. Fijo qiskit-community/qiskit-aqua#1452

  • Se ha corregido la gestión de los puntos de interrupción en la clase PiecewisePolynomialPauliRotations en la clase qiskit.circuit.library. Ahora, para los intervalos n , se permiten los puntos de interrupción n+1 . Esto permite especificar otro intervalo final distinto de 2num qubits2^\text{num qubits}. Esto es importante porque desde el final del último intervalo hasta 2num qubits2^\text{num qubits} la función es la identidad.

  • Se ha corregido un problema en la clase qiskit.circuit.library.Permutation por el que algunas permutaciones no se generaban correctamente. Este problema también podría afectar a qiskit.circuit.library.QuantumVolume si se invocaba con classical_permutation=False`. Corregido #5812

  • Se ha solucionado un problema por el que la generación de la salida QASM con el método qasm() para un objeto QuantumCircuit que tiene un ControlledGate con un control abierto la salida sería como si todos los controles estuvieran cerrados independientemente del estado de control especificado. Esto daría lugar a la creación de un circuito diferente de from_qasm_str() al analizar el QASM generado.

    Esto se solucionó actualizando la salida QASM de qasm() definiendo una puerta compuesta que utiliza XGate para implementar los controles de apertura. La puerta compuesta se denomina <original_gate_name>_o<ctrl_state> donde o significa control abierto y ctrl_state es el valor entero del estado de control. Corregido #5443

  • Se ha corregido un problema por el que los objetos Parameter en un QuantumCircuit con parameter_binds en la función execute provocaba que todos los objetos QuantumCircuit tuvieran el mismo name, lo que significaba que los nombres de los resultados tampoco eran únicos. Esta corrección hace que bind_parameters() y assign_parameters() asignen un nombre de circuito único cuando inplace=False as:

    <base name>-<class instance no.>[-<pid name>]

    donde <base name> es el nombre proporcionado por el kwarg "nombre", de lo contrario, por defecto es "circuito". El número de instancia de la clase se incrementa cada vez que se genera una instancia de la clase. <pid name> si se llama fuera del proceso principal. Corregido #5185

  • Se ha corregido un problema con la función scheduler() por el que se producía una excepción si un circuito de entrada contenía un objeto no enlazado QuantumCircuit no enlazado. Corregido #5304

  • Se ha solucionado un problema en los qiskit.transpiler.passes.TemplateOptimization pases del transpilador por el que los circuitos de plantillas que contenían objetos no vinculados Parameter se bloqueaban en algunos casos si los parámetros no podían vincularse durante la comparación de plantillas. Ahora bien, si los Parameter objetos no pueden ser vinculados las plantillas con unbound Parameter son descartadas e ignoradas por el TemplateOptimization pasar. Corregido #5533

  • Se ha corregido un problema con la función qiskit.visualization.timeline_drawer() donde los bits clásicos se manejaban incorrectamente. Corregido #5361

  • Se ha corregido un problema en la función qiskit.visualization.circuit_drawer() y el método qiskit.circuit.QuantumCircuit.draw() método donde Delay en un objeto QuantumCircuit no se trataban correctamente como tiempo de inactividad. Así que cuando el idle_wires kwarg se fijó en False los cables con los Delay se seguirían mostrando. Esto se ha corregido para que los cables inactivos se eliminen de la visualización si sólo hay Delay objetos en un cable.

  • Anteriormente, cuando se proporcionaba la opción layout_method kwarg a la función transpile() función y el kwarg optimization_level se establecía en >= 2 para que el pase qiskit.transpiler.passes.CSPLayout se ejecutara, si CSPLayout encontraba una solución, el método de layout_method no se ejecutaba. Se ha corregido para que, si se especifica, se respete siempre la dirección layout_method . Corregido #5409

  • Cuando el argumento coupling_map=None (ya sea fijado explícitamente, fijado implícitamente como valor por defecto, o a través del kwarg backend ), el proceso de transpilación no estaba "incrustando" el circuito. Es decir, aunque se especificara initial_layout , los qubits virtuales no se asignaban a qubits físicos. Esto se ha corregido para que ahora la función qiskit.compiler.transpile() respeta el argumento initial_layout incrustando el circuito:

    from qiskit import QuantumCircuit, QuantumRegister
    from qiskit.compiler import transpile
    
    qr = QuantumRegister(2, name='qr')
    circ = QuantumCircuit(qr)
    circ.h(qr[0])
    circ.cx(qr[0], qr[1])
    
    transpile(circ, initial_layout=[1, 0]).draw(output='mpl')

    Si el initial_layout se refiere a más qubits que en el circuito, el proceso de transpiling ampliará el circuito con ancillas.

    from qiskit import QuantumCircuit, QuantumRegister
    from qiskit.compiler import transpile
    
    qr = QuantumRegister(2, name='qr')
    circ = QuantumCircuit(qr)
    circ.h(qr[0])
    circ.cx(qr[0], qr[1])
    
    transpile(circ, initial_layout=[4, 2], coupling_map=None).draw()

    Corregido #5345

  • Se ha añadido un nuevo kwarg, user_cost_dict , al constructor para el qiskit.transpiler.passes.TemplateOptimization transpiler pass. Esto permite a los usuarios proporcionar un diccionario de costes personalizado para las puertas al algoritmo de correspondencia de plantillas subyacente. Por ejemplo:

    from qiskit.transpiler.passes import TemplateOptimization
    
    cost_dict = {'id': 0, 'x': 1, 'y': 1, 'z': 1, 'h': 1, 't': 1}
    pass = TemplateOptimization(user_cost_dict=cost_dict)
  • Un problema al pasar el objeto Counts devuelto por get_counts() a marginal_counts() producía un objeto Counts con determinadas entradas. Correcciones #5424

  • Mejora de la asignación de qubits de ayuda en PolynomialPauliRotations y PiecewiseLinearPauliRotations lo que hace más eficiente la implementación de estos circuitos. Corregido #5320 y #5322

  • Fijar el uso de los qubits ayudantes asignados en el MCXGate en la WeightedAdder clase. Antes de esta corrección, se asignaban pero no se utilizaban. Corregido #5321

  • En varios casos, el método de salida latex para la qiskit.visualization.circuit_drawer() y el método draw() no mostraban correctamente el nombre de la puerta y, en otros casos, no incluían los parámetros de la puerta donde debían estar. Ahora los nombres de las puertas se mostrarán de la misma forma que se muestran con el método de salida mpl , y los parámetros se mostrarán para todas las puertas que los tengan. Además, algunas de las puertas no se mostraban de la forma correcta, por lo que se han corregido. Correcciones #5605, #4938 y #3765

  • Se ha solucionado un problema por el que, si se utilizaba el método qiskit.circuit.Instruction.to_instruction() en un subcircuito que contenía registros clásicos y ese Instruction se añadía a un objeto QuantumCircuit la salida de la función qiskit.visualization.circuit_drawer() y del método qiskit.circuit.QuantumCircuit.draw() mostraban en algunos casos el subcircuito a la izquierda de una medida cuando debería haberse mostrado a la derecha. Corregido #5947

  • Se ha corregido un problema con Delay en un QuantumCircuit donde qiskit.compiler.transpile() no se convertían las unidades del Delay a las unidades del Backendsi el backend kwarg se establece en transpile(). Esto podría dar lugar a un comportamiento incorrecto debido a un desajuste de la unidad, por ejemplo en ejecución:

    from qiskit import transpile, execute
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(1)
    qc.delay(100, [0], unit='us')
    
    qc = transpile(qc, backend)
    job = execute(qc, backend)

    anteriormente habría dado lugar a que el backend se retrasara 100 pasos de tiempo (cada uno de duración dt) en lugar de los esperados ( 100e-6 / dt). Esto se ha corregido para que la función qiskit.compiler.transpile() convierta correctamente las unidades.

Otras notas

  • Las instantáneas de todos los backends falsos/mock en qiskit.test.mock se han actualizado para reflejar los cambios recientes en los dispositivos. Esto incluye un cambio en el atributo basis_gates del atributo BackendConfiguration a ['cx', 'rz', 'sx', 'x', 'id'], la adición de una propiedad readout_length a las propiedades de qubit en la propiedad BackendPropertiesy la actualización de PulseDefaults para que todos los backends de mock soporten instancias basadas en pulsos paramétricos InstructionScheduleMap paramétricos.

Aer 0.8.0

Preludio

La versión 0.8 incluye varias novedades y correcciones de errores. Los aspectos más destacados de esta versión son: la introducción de un backend unificado AerSimulator para ejecutar simulaciones de circuitos utilizando cualquiera de los métodos de simulación admitidos; una biblioteca de instrucciones del simulador (qiskit.providers.aer.library) que incluye instrucciones personalizadas para guardar diversos tipos de datos del simulador; compatibilidad con MPI para ejecutar grandes simulaciones en un entorno informático distribuido.

Nuevas funciones

  • Python 3.9 en esta versión. Ahora puede ejecutar Qiskit Aer utilizando Python 3.9 sin necesidad de compilar desde el código fuente.

  • Añadir la bandera CMake DISABLE_CONAN (default=`OFF\``)s. Cuando se instala desde el código fuente, si se establece en ONse puede evitar el gestor de paquetes Conan para encontrar las bibliotecas que ya están instaladas en el sistema. Esto también está disponible como una variable de entornoDISABLE_CONAN`, que tiene prioridad sobre la bandera CMake. Este no es el procedimiento oficial para construir REA. Por lo tanto, el usuario es responsable de proporcionar todas las bibliotecas necesarias y los archivos correspondientes para que CMake pueda encontrarlos.

  • Esta versión incluye soporte para construir qiskit-aer con soporte MPI para ejecutar grandes simulaciones en un entorno informático distribuido. Consulte la guía de contribución para obtener instrucciones sobre la construcción y ejecución en un entorno MPI.

  • Ahora es posible compilar qiskit-aer con CUDA activado en Windows. Consulte la guía de contribución para obtener instrucciones sobre cómo compilar desde el código fuente con soporte para GPU.

  • Al compilar la extensión qiskit-aer Python desde el código fuente, es necesario preinstalar varias dependencias de compilación para permitir la compilación en C++. Para comodidad del usuario, al compilar la extensión, cualquiera de estas dependencias de compilación que faltara se instalaría automáticamente utilizando pip antes de los pasos normales de instalación de setuptools . Sin embargo, antes no era posible evitar esta instalación automática. Para resolver este problema se ha añadido una nueva variable de entorno DISABLE_DEPENDENCY_INSTALL . Si se establece en 1 o ON al compilar la extensión python desde el código fuente, se desactivará la instalación automática de estas dependencias de compilación que faltan.

  • Añade soporte para la puerta de Pauli N-qubit optimizada ( qiskit.circuit.library.PauliGate) a StatevectorSimulator, UnitarySimulator, y a los métodos de vector de estado y matriz de densidad de QasmSimulator y AerSimulator.

  • El método run() para los backends AerSimulator, QasmSimulator, StatevectorSimulator, y UnitarySimulator ahora toma un valor QuantumCircuit (o una lista de objetos QuantumCircuit objetos) como entrada. El objeto QasmQobj sigue siendo compatible por ahora, pero será obsoleto en una futura versión.

    Para ver un ejemplo de cómo utilizarlo, consulte:

    from qiskit import transpile, QuantumCircuit
    
    from qiskit.providers.aer import Aer
    
    backend = Aer.get_backend('aer_simulator')
    
    circuit = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    tqc = transpile(circuit, backend)
    result = backend.run(tqc, shots=4096).result()
  • El método run() para el backend PulseSimulator toma ahora un valor Schedule (o una lista de objetos Schedule objetos) como entrada. El objeto PulseQobj sigue siendo compatible por ahora, pero será obsoleto en una futura versión.

  • Añade el nuevo backend del simulador AerSimulator que admite los siguientes métodos de simulación

    • automatic
    • statevector
    • stabilizer
    • density_matrix
    • matrix_product_state
    • unitary
    • superop

    El método automático por defecto elegirá automáticamente un método de simulación por separado para cada circuito de ejecución basándose en las instrucciones del circuito y en el modelo de ruido (si existe). Se puede inicializar un simulador con un método específico utilizando la opción de método.

    La simulación en la GPU para los métodos de vectores de estado, matrices de densidad y unitarios puede activarse configurando la opción device='GPU' backend.

    Tenga en cuenta que los métodos unitary y superop no admiten mediciones, ya que simulan la matriz unitaria o la matriz de superoperadores del circuito de ejecución, por lo que debe utilizarse una de las nuevas instrucciones save_unitary(), save_superop() o save_state() para guardar el estado del simulador en los resultados devueltos. Del mismo modo, el estado de los demás métodos de simulación puede guardarse utilizando las instrucciones adecuadas. Consulte los documentos de la API qiskit.providers.aer.library para obtener más detalles.

    Tenga en cuenta que el simulador AerSimulator sustituye a los backends QasmSimulator, StatevectorSimulator y UnitarySimulator , que quedarán obsoletos en una futura versión.

  • Actualiza la clase AerProvider para incluir múltiples backends AerSimulator preconfigurados para todos los métodos de simulación y dispositivos de simulación disponibles. Se puede acceder a los nuevos backends a través de la interfaz del proveedor utilizando los nombres

    • "aer_simulator"
    • "aer_simulator_statevector"
    • "aer_simulator_stabilizer"
    • "aer_simulator_density_matrix"
    • "aer_simulator_matrix_product_state"
    • "aer_simulator_extended_stabilizer"
    • "aer_simulator_unitary"
    • "aer_simulator_superop"

    Además, si Aer se instaló con soporte de GPU en un sistema compatible, también estarán disponibles los siguientes backends de GPU

    • "aer_simulator_statevector_gpu"
    • "aer_simulator_density_matrix_gpu"
    • "aer_simulator_unitary_gpu"

    Por ejemplo:

    from qiskit import Aer
    
    # Get the GPU statevector simulator backend
    backend = Aer.get_backend('aer_simulator_statevector_gpu')
  • Se ha añadido un nuevo método norm estimation para realizar mediciones cuando se utiliza el método de simulación "extended_stabilizer" . Este método de estimación de la norma puede utilizarse pasando las siguientes opciones a los backends AerSimulator y QasmSimulator

    simulator = QasmSimulator(
        method='extended_stabilizer',
        extended_stabilizer_sampling_method='norm_estimation')

    El método de estimación de la norma es más lento que las opciones alternativas metropolis o resampled_metropolis , pero ofrece un mejor rendimiento en circuitos con distribuciones de salida dispersas. Para más información, consulte la documentación de QasmSimulator .

  • Añade instrucciones para guardar el estado del simulador en varios formatos. Estas instrucciones son

    • qiskit.providers.aer.library.SaveDensityMatrix
    • qiskit.providers.aer.library.SaveMatrixProductState
    • qiskit.providers.aer.library.SaveStabilizer
    • qiskit.providers.aer.library.SaveState
    • qiskit.providers.aer.library.SaveStatevector
    • qiskit.providers.aer.library.SaveStatevectorDict
    • qiskit.providers.aer.library.SaveUnitary

    Estas instrucciones pueden añadirse a un circuito cuántico utilizando los métodos de circuito save_density_matrix, save_matrix_product_state, save_stabilizer, save_state, save_statevector, save_statevector_dict, save_unitary que se añaden a QuantumCircuit al importar Aer.

    Consulte la documentación de la API qiskit.providers.aer.library para obtener información detallada sobre la compatibilidad de métodos para cada instrucción.

    Tenga en cuenta que las instrucciones de instantánea SnapshotStatevector, SnapshotDensityMatrix, SnapshotStabilizer siguen siendo compatibles, pero quedarán obsoletas en una futura versión.

  • Añade qiskit.providers.aer.library.SaveExpectationValue y qiskit.providers.aer.library.SaveExpectationValueVariance instrucciones de circuito cuántico para guardar el valor de la expectativa H=Tr[Hρ]\langle H\rangle = Tr[H\rho], o el valor de la expectativa y la varianza Var(H)=H2H2Var(H) = \langle H^2\rangle - \langle H\rangle^2, de un operador hermitiano HH para el estado del simulador ρ\rho. Estas instrucciones pueden añadirse a un circuito cuántico utilizando los métodos de circuito save_expectation_value y save_expectation_value_variance que se añade a QuantumCircuit al importar Aer.

    Tenga en cuenta que la instrucción snapshot SnapshotExpectationValue, todavía está soportada pero será obsoleta en una futura versión.

  • Añade qiskit.providers.aer.library.SaveProbabilities y qiskit.providers.aer.library.SaveProbabilitiesDict instrucción de circuito cuántico para guardar todas las probabilidades de resultado de medición para mediciones de base Z del estado simualtor. Estas instrucciones se pueden añadir a un circuito cuántico utilizando los métodos de circuito save_probabilities y save_probabilities_dict que se añade a QuantumCircuit al importar Aer.

    Tenga en cuenta que la instrucción snapshot SnapshotProbabilities, todavía está soportada pero será obsoleta en una futura versión.

  • Añade instrucciones de circuito qiskit.providers.aer.library.SaveAmplitudes y qiskit.providers.aer.library.SaveAmplitudesSquared para guardar amplitudes de vector de estado complejo seleccionado, o seleccionar probabilidades (amplitudes al cuadrado) para los métodos de simulación soportados. Estas instrucciones pueden añadirse a un circuito cuántico utilizando los métodos de circuito save_amplitudes y save_amplitudes_squared que se añade a QuantumCircuit al importar Aer.

  • Añade instrucciones para establecer el estado de los simuladores. Estas instrucciones deben definirse sobre el número total de qubits del circuito. Pueden aplicarse en cualquier punto de un circuito y sustituirán el estado del simulador por el especificado. Las instrucciones añadidas son

    • qiskit.providers.aer.library.SetDensityMatrix
    • qiskit.providers.aer.library.SetStabilizer
    • qiskit.providers.aer.library.SetStatevector
    • qiskit.providers.aer.library.SetUnitary

    Estas instrucciones pueden añadirse a un circuito cuántico utilizando los métodos de circuito set_density_matrix, set_stabilizer, set_statevector, set_unitary que se añaden a QuantumCircuit al importar Aer.

    Consulte la documentación de la API qiskit.providers.aer.library para obtener información detallada sobre la compatibilidad de métodos para cada instrucción.

  • Añadido soporte para puertas diagonales al método de simulación "matrix_product_state" .

  • Añadido soporte para la instrucción initialize al método de simulación "matrix_product_state" .

Problemas conocidos

  • Existe un problema conocido por el que la simulación de determinados circuitos con un modelo de ruido Kraus utilizando el método de simulación "matrix_product_state" puede hacer que el simulador se bloquee. Consulte el nº 306 para más información.

Notas de actualización

  • La versión mínima de Conan ha pasado a ser 1.31.2. Esto era necesario para solucionar un problema de compatibilidad con versiones más recientes de urllib3 (que es una dependencia de Conan). También añade compatibilidad nativa con AppleClang 12, lo que resulta útil para los usuarios con nuevos ordenadores Apple.

  • pybind11 la versión mínima requerida es 2.6 en lugar de 2.4. Esto es necesario para soportar la compilación habilitada para CUDA en Windows.

  • Se ha eliminado Cython como dependencia de compilación.

  • Eliminada la descomposición de compuertas x90 de los modelos de ruido que estaba obsoleta en qiskit-aer 0.7. Esta descomposición se realiza ahora utilizando puertas base de modelos de ruido regulares y el transpilador qiskit.

  • Las siguientes opciones del método de simulación "extended_stabilizer" han cambiado.

    • extended_stabilizer_measure_sampling: Esta opción ha sido sustituida por las opciones extended_stabilizer_sampling_method, que controla cómo simulamos la medición de qubits.
    • extended_stabilizer_mixing_time: Esta opción se ha renombrado como extended_stabilizer_metropolis_mixing_time para aclarar que sólo se aplica a los métodos de muestreo metropolis y resampled_metropolis .
    • extended_stabilizer_norm_estimation_samples: Esta opción ha pasado a llamarse extended_stabilizer_norm_estimation_default_samples.

    Se ha añadido una opción adicional, extended_stabilizer_norm_estimation_repetitions , que controla parte del comportamiento del método de muestreo de estimación de normas.

Notas sobre características en desuso

  • Python 3.6 ha quedado obsoleto y se eliminará en una próxima versión. Cuando se elimine la compatibilidad, deberá actualizar la versión de Python que esté utilizando a Python 3.7 o superior.

Corrección de errores

  • Se ha corregido un error de AerProvider por el que las opciones establecidas en los backends devueltos mediante set_options() se almacenaban en el proveedor y persistían en llamadas posteriores a get_backend() para el mismo backend. Ahora cada llamada a y backends() devuelve una nueva instancia del backend del simulador que se puede configurar.
  • Se corrige un error en el mensaje de error devuelto cuando un circuito contiene instrucciones de simulador no compatibles. Anteriormente, algunas instrucciones compatibles también aparecían en el mensaje de error junto con las instrucciones no compatibles.
  • Se soluciona un problema con la configuración de las puertas base de QasmSimulator cuando se utilizan juntas las opciones "method" y "noise_model" , y cuando se utilizan con un simulador construido con from_backend(). Ahora las puertas base listadas serán la intersección de las puertas soportadas por la configuración del backend, el método de simulación y las puertas base del modelo de ruido. Si la intersección de las puertas base del modelo de ruido y las puertas base del simulador está vacía, se registrará una advertencia.
  • Corregido error por el que la puerta "sx"` SXGate no aparecía como puerta soportada en el código C++, en StateOpSet de matrix_product_state.hp.
  • Se ha corregido un error por el que "csx", "cu2", "cu3" aparecían incorrectamente en la lista de puertas base admitidas para el método "density_matrix" de QasmSimulator.
  • Corrección de un error por el que los parámetros se pasaban incorrectamente entre funciones en matrix_product_state_internal.cpp, provocando una simulación errónea, así como alcanzar estados no válidos, lo que a su vez provocaba un bucle infinito.
  • Se corrige un error que provocaba que c_if no funcionara cuando la anchura del registro condicional era superior a 64. Ver #1077.
  • Corrige un error #1153 ) por el que el ruido en las puertas condicionales se aplicaba siempre independientemente de si la puerta condicional se aplicaba realmente basándose en el valor del registro clásico. Ahora el ruido en una puerta condicional sólo se aplicará en el caso en que se aplique la puerta condicional.
  • Corrige un error con OpenMP anidada bandera estaba siendo fijado a true cuando no debería ser.
  • Se corrige un error al aplicar el truncamiento en el método de estado del producto matricial de la QasmSimulator.
  • Solucionado el problema nº 1126 : error al informar de la medición de un único qubit. El error se producía al copiar el valor medido en la estructura de datos de salida.
  • En MPS, apply_kraus operaba directamente sobre los bits de entrada en los qubits de parámetros, en lugar de sobre los qubits internos. En el algoritmo MPS, los qubits están en constante movimiento, por lo que todas las operaciones deben aplicarse a los qubits internos.
  • Al invocar a MPS::sample_measure, necesitamos primero ordenar los qubits al ordenamiento por defecto porque así se asume en qasm_controller.This se hace invocando al método move_all_qubits_to_sorted_ordering. Era correcto en sample_measure_using_apply_measure, pero faltaba en sample_measure_using_probabilities.
  • Se corrige un error del método from_backend() de QasmSimulator que establecía el atributo local de la configuración en el valor del backend en lugar de establecerlo siempre en True.
  • Se corrige un error en from_backend() y from_backend() donde basis_gates se establecía incorrectamente para dispositivos IBMQ con puerta base establecida ['id', 'rz', 'sx', 'x', 'cx']. Ahora el modelo de ruido siempre tendrá las mismas puertas base que las puertas base del backend, independientemente de si esas instrucciones tienen errores en el modelo de ruido o no.
  • Se soluciona un problema por el que el método de simulación "extended_stabilizer" ampliado daba resultados incorrectos en circuitos cuánticos con distribuciones de salida dispersas. Consulte el nº 306 para obtener más información y ejemplos.

Ignis 0.6.0

Nuevas funciones

  • La función qiskit.ignis.mitigation.expval_meas_mitigator_circuits() se ha mejorado de modo que el número de circuitos generados por la función utilizada para la calibración por el método CTMP se reduce de O(n)O(n) a O(logn)O(\log{n}) (donde nn es el número de qubits).

Notas de actualización

  • La función qiskit.ignis.verification.randomized_benchmarking_seq() utiliza ahora la clase CNOTDihedral mejorada, qiskit.ignis.verification.CNOTDihedral, que permite realizar una evaluación comparativa aleatoria CNOT-Dihedral en más de dos qubits.
  • El paquete python retworkx es ahora un requisito para instalar qiskit-ignis. Sustituye al uso anterior de networkx (que ya no es un requisito) para obtener un mejor rendimiento.
  • La dependencia scikit-learn ya no es necesaria y ahora es un requisito opcional. Si está utilizando los discriminadores de medición IQ (IQDiscriminationFitter, LinearIQDiscriminationFitter, QuadraticIQDiscriminationFitter, o SklearnIQDiscriminator) ahora tendrá que instalar manualmente scikit-learn, ya sea ejecutando pip install scikit-learn o cuando también esté instalando qiskit-ignis con pip install qiskit-ignis[iq].

Corrección de errores

  • Se ha solucionado un problema en el método de valor de expectativa expectation_value(), para las clases de mitigación de errores TensoredExpvalMeasMitigator y CTMPExpvalMeasMitigator si no se especificaba el kwarg qubits se utilizaba incorrectamente el número total de qubits del mitigador, en lugar del número de bits clásicos del diccionario de recuento, lo que reducía considerablemente el rendimiento. Corregido #561
  • Corrige el método "auto" de TomographyFitter, StateTomographyFitter, y ProcessTomographyFitter para que sólo utilice "cvx" si CVXPY está instalado y se dispone de un solucionador SDP de terceros distinto de SCS. Esto se debe a que el solver SCS tiene menor precisión que otros métodos de solver y a menudo devuelve una matriz de densidad o matriz de Choi que no es completamente positiva y falla en la validación cuando se utiliza con el método qiskit.quantum_info.state_fidelity() o qiskit.quantum_info.process_fidelity() .

Aqua 0.9.0

Esta versión deja oficialmente obsoleto el proyecto Qiskit Aqua, en el futuro (no antes de 3 meses a partir de esta versión) el proyecto Aqua tendrá su versión final y será archivado. Toda la funcionalidad que qiskit-aqua proporciona ha sido migrada a nuevos paquetes o a otros paquetes qiskit. Los módulos de aplicación que proporciona qiskit-aqua se han dividido en varios paquetes nuevos: qiskit-optimization, qiskit-nature, qiskit-machine-learning, y qiskit-finance. Estos paquetes pueden instalarse por sí solos (mediante el comando estándar pip install, es decir, pip install qiskit-nature) o con el resto del metapaquete Qiskit como extras opcionales (es decir, pip install 'qiskit[finance,optimization]' o pip install 'qiskit[all]'. Los componentes básicos de los algoritmos y el flujo de operadores existen ahora como parte de qiskit-terra en qiskit.algorithms y qiskit.opflow. Dependiendo del uso que hagas de Aqua, deberás utilizar los paquetes de la aplicación o los nuevos módulos de Qiskit Terra.

Para más detalles sobre cómo migrar desde Qiskit Aqua, puedes consultar la guía de migración.

IBM Proveedor Q 0.12.2

No cambia

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.