Skip to main content
IBM Quantum Platform

Notas de la versión de Qiskit 0.18


0.18.3

Terra 0.13.0

Sin cambios

Aer 0.5.1

Notas de actualización

  • Cambia el modo en que se gestionan los pases de transpilación en las clases Controlador de C++, de modo que cada pase debe llamarse explícitamente. Esto permite una mayor personalización sobre cuándo se debe llamar a cada pase y con qué parámetros. En particular, esto permite establecer diferentes parámetros para el paso de optimización de la fusión de puertas en función del método de simulación QasmController.
  • Añadir gate_length_units kwarg a qiskit.providers.aer.noise.NoiseModel.from_device() para especificar gate_lengths personalizado en la función de modelo de ruido del dispositivo para manejar las conversiones de unidades para el código interno.
  • Añade la puerta Y controlada ("cy") al conjunto de puertas compatibles con los métodos del simulador Estabilizador.
  • Para el backend de Aer, la validación jsonschema de los objetos qobj de entrada de terra es ahora opcional en lugar de estar activada por defecto. Si desea habilitar la validación jsonschema de qobj establezca el kwarg validate en el método qiskit.providers.aer.QasmSimualtor.run() para el objeto backend a True.

Corrección de errores

  • Eliminar "extended_stabilizer" de los métodos de simulación seleccionados automáticamente. Esto es necesario ya que el método del estabilizador extendido no es exacto y puede dar resultados incorrectos para ciertos circuitos a menos que el usuario sepa cómo optimizar sus parámetros de configuración.

    El método automático ahora sólo selecciona entre los métodos "estabilizador", "matriz_densidad" y "vector_estado". Si se ejecuta un circuito que no sea Clifford y que sea demasiado grande para el método statevector, se lanzará una excepción sugiriendo que intente utilizar explícitamente los métodos "extended_stabilizer" o "matrix\product_state" en su lugar.

  • Corrige las clases Controlador para que se aplique primero el pase de transpilación ReduceBarrier. Esto evita que las instrucciones de barrera impidan el truncamiento de los qubits no utilizados si la única instrucción definida sobre ellos era una barrera.

  • Desactiva la fusión de puertas para el método de simulación del estado del producto matricial, ya que estaba causando problemas con resultados incorrectos en algunos casos.

  • Corrección de error en la conversión de unidades de tiempo de puerta para el modelo de ruido de dispositivo con errores de relajación térmica y errores de puerta. La probabilidad de error de despolarización se calculaba con el tiempo de puerta en microsegundos, mientras que para la relajación térmica se calculaba en nanosegundos. Esto hizo que no se aplicara ningún error de despolarización, ya que las unidades incorrectas harían que el dispositivo pareciera estar limitado por la coherencia.

  • Corrección de error en la composición incorrecta de QuantumErrors cuando los qubits de las instrucciones compuestas difieren.

  • Se soluciona un problema por el que se comprobaba que la puerta "diagonal" era unitaria con una tolerancia demasiado alta. Esto provocaba que las diagonales generadas a partir de funciones Numpy no pasaran a menudo la prueba.

  • Arreglar el paso de optimización del circuito remove-barrier para que se aplique antes de la trucación de qubits. Esto soluciona un problema por el que las barreras insertadas por el transpilador Terra a través de qubits inactivos impedían que se truncaran.

Ignis 0.3.0

Sin cambios

Aqua 0.6.6

Sin cambios

IBM Proveedor Q 0.6.1

Sin cambios


0.18.0

Terra 0.13.0

Preludio

La versión 0.13.0 incluye muchos cambios importantes. Algunas de las novedades más destacadas son:

Para el transpilador hemos cambiado la librería de grafos utilizada para construir la clase qiskit.dagcircuit.DAGCircuit que es la estructura de datos subyacente detrás de todas las operaciones para basarse en retworkx para mejorar considerablemente el rendimiento. La velocidad de transpilación de circuitos en la versión 0.13.0 debería ser significativamente más rápida que en versiones anteriores.

Se ha simplificado considerablemente el estilo de construcción de las instrucciones Pulse. Ahora, Command s está obsoleto y se admite un conjunto unificado de Instruction s.

El módulo qiskit.quantum_info incluye varias funciones nuevas para generar operadores aleatorios (como Cliffords y canales cuánticos) y para calcular la norma diamante de los canales cuánticos; actualizaciones de los módulos Statevector y DensityMatrix para calcular probabilidades de medida y medidas de muestreo; y varias clases nuevas basadas en la representación simpléctica de las matrices de Pauli. Estas nuevas clases incluyen los operadores Clifford (Clifford), matrices de N-qubit que son dispersas en la base de Pauli (SparsePauliOp), listas de Pauli (PauliTable) y listas de estabilizadores (StabilizerTable).

En esta versión también se ha mejorado considerablemente la documentación de Qiskit, incluida la documentación de los módulos qiskit.circuit, qiskit.pulse y qiskit.quantum_info y.

Además, se han actualizado los nombres de los QuantumCircuit para que sean más coherentes. Como consecuencia, varias clases y métodos han quedado obsoletos a medida que se adopta un esquema de nomenclatura más coherente.

Para más información sobre los cambios introducidos en esta versión, consulte las notas de la versión.

Nuevas funciones

  • Añadido un nuevo módulo de biblioteca de circuitos qiskit.circuit.library. Este será un lugar para los constructores de circuitos de uso común que se pueden utilizar como bloques de construcción para circuitos o aplicaciones más grandes.

  • La clase qiskit.providers.BaseJob tiene cuatro nuevos métodos:

    • done()
    • running()
    • cancelled()
    • in_final_state()

    Estos métodos se utilizan para comprobar si un trabajo se encuentra en un estado determinado.

  • Añade la capacidad de especificar el control condicionado a que un qubit esté en estado de masa. El estado de los qubits de control se representa mediante un número entero. Por ejemplo:

    from qiskit import QuantumCircuit
    from qiskit.extensions.standard import XGate
    
    qc = QuantumCircuit(4)
    cgate = XGate().control(3, ctrl_state=6)
    qc.append(cgate, [0, 1, 2, 3])

    Crea una puerta de cuatro qubits en la que el cuarto qubit se voltea si el primer qubit está en el estado de tierra y el segundo y tercer qubits están en el estado excitado. Si ctrl_state es None, por defecto, el control está condicionado a que todos los qubits de control estén excitados.

  • Un nuevo widget jupyter, %circuit_library_info ha sido añadido a qiskit.tools.jupyter. Este widget se utiliza para visualizar detalles sobre circuitos construidos a partir de la biblioteca de circuitos. Por ejemplo

    from qiskit.circuit.library import XOR
    import qiskit.tools.jupyter
    circuit = XOR(5, seed=42)
    %circuit_library_info circuit
  • Una nueva opción kwarg, formatted , ha sido añadida a qiskit.circuit.QuantumCircuit.qasm() . Cuando se establece en True el método imprimirá una versión de sintaxis resaltada (usando pygments) a stdout y devolverá None (que difiere del comportamiento normal de devolver el código QASM como una cadena).

  • Una nueva opción kwarg, filename , ha sido añadida a qiskit.circuit.QuantumCircuit.qasm(). Cuando se establece en una ruta, el método escribirá el código QASM en ese archivo. A continuación, seguirá emitiendo con normalidad.

  • Una nueva instrucción SetFrequency que permite a los usuarios cambiar la frecuencia de la PulseChannel. Esto se hace de la siguiente manera:

    from qiskit.pulse import Schedule
    from qiskit.pulse import SetFrequency
    
    sched = pulse.Schedule()
    sched += SetFrequency(5.5e9, DriveChannel(0))

    En este ejemplo, la frecuencia de todos los pulsos antes del comando SetFrequency será la frecuencia por defecto y todos los pulsos aplicados al canal de accionamiento cero después del comando SetFrequency serán a 5.5 GHz. Los usuarios de SetFrequency deben tener en cuenta las posibles limitaciones de hardware.

  • Se ha añadido un nuevo método assign_parameters() a la clase qiskit.circuit.QuantumCircuit clase. Este método acepta un diccionario de parámetros con objetos flotantes y Parámetros en un único diccionario. En otras palabras, este nuevo método le permite vincular flotantes, parámetros o ambos en un único diccionario.

    Además, mediante el uso de la inplace kwarg se puede especificar opcionalmente puede modificar el circuito original en su lugar. Por defecto está configurado como False y el método devolverá una copia del circuito original.

  • Se ha añadido un nuevo método num_nonlocal_gates() a la clase qiskit.circuit.QuantumCircuit clase. Este método devuelve el número de puertas de un circuito en el que intervienen 2 o más qubits. La aplicación de estas puertas es más costosa en términos de tiempo y errores.

  • El método qiskit.circuit.QuantumCircuit método iso() para añadir una puerta Isometry al circuito tiene un nuevo alias. Ahora puede llamar a qiskit.circuit.QuantumCircuit.isometry() además de llamar a iso.

  • Se ha añadido un atributo description a la clase CouplingMap para almacenar una breve descripción de los distintos mapas de acoplamiento (por ejemplo, completo, cuadriculado, lineal, etc.).

  • Se ha añadido un nuevo método compose() a la clase DAGCircuit para componer dos circuitos a través de sus DAG.

    dag_left.compose(dag_right, edge_map={right_qubit0: self.left_qubit1,
                                      right_qubit1: self.left_qubit4,
                                      right_clbit0: self.left_clbit1,
                                      right_clbit1: self.left_clbit0})
                ┌───┐                    ┌─────┐┌─┐
    lqr_1_0: ───┤ H ├───     rqr_0: ──■──┤ Tdg ├┤M├
                ├───┤               ┌─┴─┐└─┬─┬─┘└╥┘
    lqr_1_1: ───┤ X ├───     rqr_1: ┤ X ├──┤M├───╫─
             ┌──┴───┴──┐            └───┘  └╥┘   ║
    lqr_1_2:U1(0.1)+  rcr_0: ════════╬════╩═  =
             └─────────┘                    ║
    lqr_2_0: ─────■─────     rcr_1: ════════╩══════
                ┌─┴─┐
    lqr_2_1: ───┤ X ├───
                └───┘
    lcr_0:   ═══════════
    
    lcr_1:   ═══════════
    
                ┌───┐
    lqr_1_0: ───┤ H ├──────────────────
                ├───┤        ┌─────┐┌─┐
    lqr_1_1: ───┤ X ├─────■──┤ Tdg ├┤M├
             ┌──┴───┴──┐  │  └─────┘└╥┘
    lqr_1_2:U1(0.1) ├──┼──────────╫─
             └─────────┘  │          ║
    lqr_2_0: ─────■───────┼──────────╫─
                ┌─┴─┐   ┌─┴─┐  ┌─┐   ║
    lqr_2_1: ───┤ X ├───┤ X ├──┤M├───╫─
                └───┘   └───┘  └╥┘   ║
    lcr_0:   ═══════════════════╩════╬═
    
    lcr_1:   ════════════════════════╩═
  • Los backends simulados en qiskit.test.mock ahora tienen un método funcional run() que devolverá resultados similares a los dispositivos reales. Si qiskit-aer está instalado, se ejecutará una simulación con un modelo de ruido construido a partir de la instantánea del dispositivo en el falso backend. En caso contrario, qiskit.providers.basicaer.QasmSimulatorPy se utilizará para realizar una simulación ideal. Además, si se pasa un experimento de pulsos a run y qiskit-aer está instalado, se utilizará PulseSimulator para simular los horarios de pulsos.

  • El método qiskit.result.Result() método get_counts() devolverá ahora una lista de todos los recuentos disponibles cuando haya varios circuitos en un trabajo. Esto funciona cuando se llama a get_counts() sin argumentos.

    La principal consideración para esta función era dibujar todos los resultados de múltiples circuitos en el mismo histograma. Por ejemplo, ahora es posible hacer algo así:

    from qiskit import execute
    from qiskit import QuantumCircuit
    from qiskit.providers.basicaer import BasicAer
    from qiskit.visualization import plot_histogram
    
    sim = BasicAer.get_backend('qasm_simulator')
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    result = execute([qc, qc, qc], sim).result()
    
    plot_histogram(result.get_counts())
  • Se ha añadido un nuevo kwarg, initial_state , a la función qiskit.visualization.circuit_drawer() y al método QuantumCircuit método draw(). Si se establece en True , el estado inicial se incluirá en las visualizaciones de circuitos para todos los backends. Por ejemplo:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='mpl', initial_state=True)
  • Ahora es posible insertar un callable en un fichero qiskit.pulse.InstructionScheduleMap que devuelve un nuevo qiskit.pulse.Schedule cuando se llama con parámetros. Por ejemplo:

    def test_func(x):
       sched = Schedule()
       sched += pulse_lib.constant(int(x), amp_test)(DriveChannel(0))
       return sched
    
    inst_map = InstructionScheduleMap()
    inst_map.add('f', (0,), test_func)
    output_sched = inst_map.get('f', (0,), 10)
    assert output_sched.duration == 10
  • Dos nuevas clases de puertas, qiskit.extensions.iSwapGate y qiskit.extensions.DCXGate, junto con sus QuantumCircuit métodos iswap() y dcx() se han añadido a las extensiones estándar. Estas puertas, que son localmente equivalentes entre sí, pueden utilizarse para ejecutar interacciones XY concretas. Una breve motivación de estas puertas puede encontrarse en: arxiv.org/abs/quant-ph/0209035

  • La clase qiskit.providers.BaseJob tiene ahora un nuevo método wait_for_final_state() que sondea el estado del trabajo hasta que éste alcanza un estado final (como DONE o ERROR). Este método también toma un callback kwarg opcional que toma un Python callable que será llamado durante cada iteración del bucle de sondeo.

  • Los atributos search_width y search_depth del qiskit.transpiler.passes.LookaheadSwap pass son ahora configurables al inicializar el pass. Un espacio de búsqueda más amplio puede conducir a menudo a circuitos más optimizados, a costa de un mayor tiempo de ejecución.

  • El número de qubits en BackendConfiguration a través de la propiedad num_qubits. Antes sólo era accesible a través del atributo n_qubits .

  • Dos nuevos métodos, angles() y angles_and_phase()se han añadido a la clase qiskit.quantum_info.OneQubitEulerDecomposer clase. Estos métodos devolverán los parámetros relevantes sin validación, y al llamar al objeto OneQubitEulerDecomposer se realizará la síntesis completa con validación.

  • Se ha añadido una base de descomposición RR al qiskit.quantum_info.OneQubitEulerDecomposer para descomponer un 2x2 unitario arbitrario en un circuito de dos RGate .

  • Añade la posibilidad de establecer qargs a los objetos que son subclases de la clase abstracta BaseOperator . Esto se hace llamando al objeto op(qargs) (donde op es una clase de operador) y devolverá una copia superficial del objeto original con una propiedad qargs establecida. Cuando se utiliza un objeto de este tipo con la función compose() o dot() se utilizará el valor interno de qargs cuando no se utilice el método qargs kwarg. Esto permite, por ejemplo, la composición de subsistemas mediante operadores binarios:

    from qiskit.quantum_info import Operator
    
    init = Operator.from_label('III')
    x = Operator.from_label('X')
    h = Operator.from_label('H')
    init @ x([0]) @ h([1])
  • Añade qiskit.quantum_info.Clifford al módulo quantum_info. Este operador es una representación simpléctica eficiente un operador unitario N-qubit del grupo Clifford. Esta clase incluye un to_circuit() método de compilación en QuantumCircuit de compuertas Clifford con un número mínimo de compuertas CX para un máximo de 3 qubits. También proporciona compilación general para N > 3 qubits, pero este método no es óptimo en el número de puertas de dos qubits.

  • Añade qiskit.quantum_info.SparsePauliOp clase de operador. Se trata de una representación eficiente de una matriz N-qubit que es dispersa en la base Pauli y utiliza un qiskit.quantum_info.PauliTable y un vector de coeficientes complejos para su estructura de datos.

    Esta clase soporta gran parte de la misma funcionalidad de la clase qiskit.quantum_info.Operator de modo que SparsePauliOp objetos pueden ser tensados, compuestos, multiplicados escalarmente, sumados y restados.

    Las matrices u objetos Operator se pueden convertir en SparsePauliOp utilizando el método :class:`~qiskit.quantum_info.SparsePauliOp.from_operator. SparsePauliOp puede convertirse a una matriz csr_matrix dispersa o a una matriz Numpy densa utilizando el método to_matrix o a un objeto Operator mediante el método to_operator método.

    A SparsePauliOp puede iterarse en términos de sus componentes y coeficientes PauliTable , sus coeficientes y etiquetas de cadenas de Pauli utilizando el método label_iter() y los componentes (densos o dispersos) de la matriz mediante el método matrix_iter() método.

  • Añadir qiskit.quantum_info.diamond_norm() función para calcular la norma diamante (norma traza completamente acotada) de un canal cuántico. Esto puede utilizarse para calcular la distancia entre dos canales cuánticos utilizando diamond_norm(chan1 - chan2).

  • Se ha añadido una nueva clase qiskit.quantum_info.PauliTable . Se trata de una representación simpléctica eficiente de una lista de operadores de Pauli N-qubit. Algunas características de esta clase son:

    • PauliTable objetos pueden ser compuestos, y tensored que devolverá un objeto PauliTable con la combinación de la operación ( compose(), dot(), expand(), tensor()) entre cada elemento de la primera tabla, con cada elemento de la segunda tabla.
    • La suma de dos tablas actúa como concatenación de listas de los términos de cada tabla (+).
    • Las tablas de Pauli pueden ordenarse por orden lexicográfico (producto tensorial) o por pesos de Pauli (sort()).
    • Los elementos duplicados pueden contarse y eliminarse (unique()).
    • Se puede iterar sobre PauliTable en su representación nativa de matriz booleana simpléctica, como etiquetas de cadena Pauli (label_iter()), o como matriz Numpy densa o matrices CSR dispersas (matrix_iter()).
    • Comprobación de la conmutación entre elementos de la tabla de Pauli y otra tabla de Pauli (commutes()) o de Pauli (commutes_with_all())

    Consulte la documentación de la API de la clase qiskit.quantum_info.PauliTable para obtener más detalles.

  • Añade la clase qiskit.quantum_info.StabilizerTable . Se trata de una subclase de la clase qiskit.quantum_info.PauliTable que incluye un vector de fase booleano junto con la matriz de la tabla de Pauli. Representa una lista de operadores Estabilizadores que son operadores reales-Pauli con coeficiente +1 o -1. Dado que las matrices estabilizadoras son reales, la matriz de etiquetas "Y" se define como [[0, 1], [-1, 0]]. Consulte la documentación de la API para obtener información adicional.

  • Añade qiskit.quantum_info.pauli_basis() que devuelve una base Pauli de N-qubit como objeto qiskit.quantum_info.PauliTable . La ordenación de esta base puede ser por orden lexicográfico estándar (producto tensorial) o por el número de términos de Pauli no idénticos (peso).

  • Añade qiskit.quantum_info.ScalarOp clase de operador que representa un múltiplo escalar de un operador de identidad. Puede utilizarse para inicializar una identidad en subsistemas de dimensión arbitraria y se convertirá implícitamente en otras subclases de BaseOperator (como un qiskit.quantum_info.Operator o qiskit.quantum_info.SuperOp) cuando se componga con ellas o se añada a ellas.

    Ejemplo: Operador de identidad

    from qiskit.quantum_info import ScalarOp, Operator
    
    X = Operator.from_label('X')
    Z = Operator.from_label('Z')
    
    init = ScalarOp(2 ** 3)  # 3-qubit identity
    op = init @ X([0]) @ Z([1]) @ X([2])  # Op XZX
  • Se ha añadido un nuevo método reshape()se ha añadido a la clase qiskit.quantum_innfo.Operator que devuelve una copia superficial de una subclase de operador con dimensiones de entrada o salida de subsistema remodeladas. Las dimensiones combinadas de todos los subsistemas deben ser las mismas que las del operador original o se producirá una excepción.

  • Añade qiskit.quantum_info.random_clifford() para generar un qiskit.quantum_info.Clifford aleatorio.

  • Añadir qiskit.quantum_info.random_quantum_channel() para generar un canal cuántico aleatorio con un Choi-rango en la Stinespring representación.

  • Añada qiskit.quantum_info.random_hermitian() para generar un Hermitiano aleatorio Operator.

  • Añadir qiskit.quantum_info.random_statevector() para generar un Statevector.

  • Añade qiskit.quantum_info.random_pauli_table() para generar un qiskit.quantum_info.PauliTable aleatorio.

  • Añade qiskit.quantum_info.random_stabilizer_table() para generar un qiskit.quantum_info.StabilizerTable aleatorio.

  • Añadir un atributo num_qubits a qiskit.quantum_info.StateVector y qiskit.quantum_info.DensityMatrix clases. Devuelve el número de qubits para estados N-qubit y devuelve None para estados no qubit.

  • Añade to_dict() y to_dict() para convertir qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix objetos en el diccionario de notación Bra-Ket.

    Ejemplo

    from qiskit.quantum_info import Statevector
    
    state = Statevector.from_label('+0')
    print(state.to_dict())
    from qiskit.quantum_info import DensityMatrix
    
    state = DensityMatrix.from_label('+0')
    print(state.to_dict())
  • Añade probabilities() y probabilities() a qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix que devuelven una matriz de probabilidades de resultados de medición en la base de cálculo para los subsistemas especificados.

    Ejemplo

    from qiskit.quantum_info import Statevector
    
    state = Statevector.from_label('+0')
    print(state.probabilities())
    from qiskit.quantum_info import DensityMatrix
    
    state = DensityMatrix.from_label('+0')
    print(state.probabilities())
  • Añade probabilities_dict() y probabilities_dict() a qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix que devuelven una matriz de diccionario de estilo de recuento de probabilidades de resultados de medición en la base computacional para los subsistemas especificados.

    from qiskit.quantum_info import Statevector
    
    state = Statevector.from_label('+0')
    print(state.probabilities_dict())
    from qiskit.quantum_info import DensityMatrix
    
    state = DensityMatrix.from_label('+0')
    print(state.probabilities_dict())
  • Añada sample_counts() y sample_memory() a los métodos Statevector y DensityMatrix para muestrear los resultados de las mediciones en los subsistemas.

    Ejemplo:

    Generar un diccionario de recuentos a partir de un vector de estados

    from qiskit.quantum_info import Statevector
    
    psi = Statevector.from_label('+0')
    shots = 1024
    
    # Sample counts dictionary
    counts = psi.sample_counts(shots)
    print('Measure both:', counts)
    
    # Qubit-0
    counts0 = psi.sample_counts(shots, [0])
    print('Measure Qubit-0:', counts0)
    
    # Qubit-1
    counts1 = psi.sample_counts(shots, [1])
    print('Measure Qubit-1:', counts1)

    Devuelve la matriz de resultados de medición de cada muestra

    from qiskit.quantum_info import Statevector
    
    psi = Statevector.from_label('-1')
    shots = 10
    
    # Sample memory
    mem = psi.sample_memory(shots)
    print('Measure both:', mem)
    
    # Qubit-0
    mem0 = psi.sample_memory(shots, [0])
    print('Measure Qubit-0:', mem0)
    
    # Qubit-1
    mem1 = psi.sample_memory(shots, [1])
    print('Measure Qubit-1:', mem1)
  • Añade un método measure() al método qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix clases de estado cuántico. Esto permite muestrear un único resultado de medición de los subsistemas especificados y contraer el vector de estado al estado base computacional posterior a la medición. Por ejemplo

    from qiskit.quantum_info import Statevector
    
    psi = Statevector.from_label('+1')
    
    # Measure both qubits
    outcome, psi_meas = psi.measure()
    print("measure([0, 1]) outcome:", outcome, "Post-measurement state:")
    print(psi_meas)
    
    # Measure qubit-1 only
    outcome, psi_meas = psi.measure([1])
    print("measure([1]) outcome:", outcome, "Post-measurement state:")
    print(psi_meas)
  • Añade un método reset() al método qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix clases de estado cuántico. Esto permite restablecer algunos o todos los subsistemas al estado 0|0\rangle. Por ejemplo

    from qiskit.quantum_info import Statevector
    
    psi = Statevector.from_label('+1')
    
    # Reset both qubits
    psi_reset = psi.reset()
    print("Post reset state: ")
    print(psi_reset)
    
    # Reset qubit-1 only
    psi_reset = psi.reset([1])
    print("Post reset([1]) state: ")
    print(psi_reset)
  • Se ha añadido una nueva función de visualización qiskit.visualization.visualize_transition() para visualizar las transiciones de puerta de un solo qubit. Toma un único circuito qubit y devuelve una animación de las transiciones de estado de los qubits en una esfera de Bloch. Para utilizar esta función debe tener instaladas las dependencias para y configurado globalmente un matplotlib animtion writer. Puede consultar la documentación de matplotlib para obtener más detalles al respecto. Sin embargo, en el caso por defecto basta con asegurarse de que FFmpeg está instalado para utilizar esta función.

    Admite circuitos con las siguientes puertas:

    • HGate
    • XGate
    • YGate
    • ZGate
    • RXGate
    • RYGate
    • RZGate
    • SGate
    • SdgGate
    • TGate
    • TdgGate
    • U1Gate

    Por ejemplo:

    from qiskit.visualization import visualize_transition
    from qiskit import *
    
    qc = QuantumCircuit(1)
    qc.h(0)
    qc.ry(70,0)
    qc.rx(90,0)
    qc.rz(120,0)
    
    visualize_transition(qc, fpg=20, spg=1, trace=True)
  • execute() tiene un nuevo kwarg schedule_circuit. Mediante la configuración de schedule_circuit=True se permite la programación del circuito en un Schedule. Esto permite a los usuarios que construyen qiskit.circuit.QuantumCircuit objetos hacer uso de métodos personalizados del planificador, como los métodos as_late_as_possible y as_soon_as_possible . Por ejemplo:

    job = execute(qc, backend, schedule_circuit=True,
                  scheduling_method="as_late_as_possible")
  • Se puede establecer una nueva variable de entorno QISKIT_SUPPRESS_PACKAGING_WARNINGS a Y o y que suprimirá las advertencias sobre qiskit-aer y qiskit-ibmq-provider que no estén instalados en el momento de la importación. Esto es útil para los usuarios que sólo están ejecutando qiskit-terra (o simplemente no qiskit-aer y/o qiskit-ibmq-provider) y las advertencias no son una indicación de un potencial problema de empaquetado. Puede establecer la variable de entorno en N o n para asegurarse de que las advertencias se activan siempre, incluso si el archivo de configuración de usuario está configurado para desactivarlas.

  • Se ha añadido una nueva opción de archivo de configuración de usuario, suppress_packaging_warnings . Cuando se establece en true en su archivo de configuración de usuario como:

    [default]
    suppress_packaging_warnings = true

    suprimirá las advertencias de que qiskit-aer y qiskit-ibmq-provider no están instalados en el momento de la importación. Esto es útil para los usuarios que sólo están ejecutando qiskit-terra (o simplemente no qiskit-aer y/o qiskit-ibmq-provider) y las advertencias no son una indicación de un potencial problema de empaquetado. Si el archivo de configuración del usuario está configurado para desactivar las advertencias, esto se puede anular configurando QISKIT_SUPPRESS_PACKAGING_WARNINGS como N o n

  • qiskit.compiler.transpile() tiene dos nuevos kwargs, layout_method y routing_method. Permiten seleccionar un método concreto para la colocación y el encaminamiento de circuitos en arquitecturas con restricciones. Por ejemplo:

    transpile(circ, backend, layout_method='dense',
              routing_method='lookahead')

    ejecutará DenseLayout pase de diseño y LookaheadSwap enrutamiento.

  • Se ha simplificado considerablemente el estilo de construcción de las instrucciones Pulse.

    Con el estilo anterior, Command s se llamaba con canales para hacer un Instruction. El uso tanto de las órdenes como de las instrucciones fue un punto de confusión. Este era el estilo anterior:

    sched += Delay(5)(DriveChannel(0))
    sched += ShiftPhase(np.pi)(DriveChannel(0))
    sched += SamplePulse([1.0, ...])(DriveChannel(0))
    sched += Acquire(100)(AcquireChannel(0), MemorySlot(0))

    o, de forma equivalente (aunque menos utilizada):

    sched += DelayInstruction(Delay(5), DriveChannel(0))
    sched += ShiftPhaseInstruction(ShiftPhase(np.pi), DriveChannel(0))
    sched += PulseInstruction(SamplePulse([1.0, ...]), DriveChannel(0))
    sched += AcquireInstruction(Acquire(100), AcquireChannel(0),
                                MemorySlot(0))

    Ahora, en lugar de construir un comando y una instrucción, cada comando se ha migrado a una instrucción:

    sched += Delay(5, DriveChannel(0))
    sched += ShiftPhase(np.pi, DriveChannel(0))
    sched += Play(SamplePulse([1.0, ...]), DriveChannel(0))
    sched += SetFrequency(5.5, DriveChannel(0))  # New instruction!
    sched += Acquire(100, AcquireChannel(0), MemorySlot(0))
  • Ahora existe una instrucción Play que toma una descripción de una envolvente de pulso y un canal. Existe una nueva clase Pulse en pulse_lib de la que debería subclasificarse la descripción de la envolvente de impulsos.

    Por ejemplo:

    Play(SamplePulse([0.1]*10), DriveChannel(0))
    Play(ConstantPulse(duration=10, amp=0.1), DriveChannel(0))

Notas de actualización

  • El método qiskit.dagcircuit.DAGNodepop , obsoleto en la versión 0.9.0, ha sido eliminado. Si utiliza este método, puede aprovechar la sentencia del o la función delattr() de Python para realizar la misma tarea.

  • Se ha añadido un nuevo requisito opcional de visualización, pygments. Se utiliza para resaltar la sintaxis del código OpenQASM 2.0 en los widgets Jupyter y, opcionalmente, para el método qiskit.circuit.QuantumCircuit.qasm() método. Debe instalarse (ya sea con pip install pygments o pip install qiskit-terra[visualization]) antes de utilizar el widget %circuit_library_info en qiskit.tools.jupyter o el kwarg formatted en el método qasm() método.

  • La opción pulse buffer que se encuentra en qiskit.pulse.Channel y qiskit.pulse.Schedule estaba obsoleta en Terra 0.11.0 y ha sido eliminada. Para añadir un retardo en un canal o en una programación, especifíquelo explícitamente en su Programación con un Retardo:

    sched = Schedule()
    sched += Delay(5)(DriveChannel(0))
  • PulseChannelSpecque estaba obsoleto en Terra 0.11.0, ha sido eliminado. Utilice BackendConfiguration en su lugar:

    config = backend.configuration()
    drive_chan_0 = config.drives(0)
    acq_chan_0 = config.acquires(0)

    o, simplemente, haga referencia al canal directamente, como DriveChannel(index).

  • Una ruta de importación estaba obsoleta en Terra 0.10.0 y ahora se ha eliminado: para PulseChannel, DriveChannel, MeasureChannel, y ControlChannel, utilice from qiskit.pulse.channels import X en lugar de from qiskit.pulse.channels.pulse_channels import X.

  • El pase qiskit.transpiler.passes.CSPLayout (que se introdujo en la versión 0.11.0 ) se ha añadido al gestor de pases predefinidos para los niveles de optimización 2 y 3. Para el nivel 2, hay un límite de llamadas de 1.000 y un tiempo de espera de 10 segundos. Para el nivel 3, el límite de llamadas es de 10.000 y el tiempo de espera es de 1 minuto.

    Ahora que el pase está incluido en los gestores de pases predefinidos, el paquete python-constraint ya no es una dependencia opcional y se ha añadido a la lista de requisitos.

  • La clase TranspileConfig que se utilizaba anteriormente para establecer la configuración en tiempo de ejecución de una aplicación qiskit.transpiler.PassManager ha sido eliminada y sustituida por una nueva clase qiskit.transpile.PassManagerConfig. Esta nueva clase se ha estructurado para incluir únicamente la información necesaria para construir un PassManager. Los atributos de esta clase son:

    • initial_layout
    • basis_gates
    • coupling_map
    • backend_properties
    • seed_transpiler
  • La función transpile_circuit en qiskit.transpiler ha sido eliminada. Para transpilar un circuito con un PassManager debe utilizar el método run() del objeto :class:~qiskit.transpiler.PassManager`.

  • El método QuantumCircuit método draw() y qiskit.visualization.circuit_drawer() ya no incluirán el estado inicial incluido por defecto en las visualizaciones. Si desea conservar el estado inicial en la visualización de salida, debe configurar initial_state kwarg en True. Por ejemplo, corriendo:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='text')

    Esto ya no incluye el estado inicial. Si quieres conservarlo, puedes presentarte:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='text', initial_state=True)
  • qiskit.compiler.transpile() (y qiskit.execute.execute(), que utiliza transpile internamente) emitirá ahora un error cuando se establezca el kwarg pass_manager y se establezca un valor para otros kwargs que ya estén establecidos en un objeto instanciado PassManager instanciado. Anteriormente, estos kwargs conflictivos se ignoraban silenciosamente y se utilizaban los valores de la instancia PassManager . Por ejemplo:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.pass_manager_config import PassManagerConfig
    from qiskit.transpiler import preset_passmanagers
    from qiskit.compiler import transpile
    
    qc = QuantumCircuit(5)
    
    config = PassManagerConfig(basis_gates=['u3', 'cx'])
    pm = preset_passmanagers.level_0_pass_manager(config)
    transpile(qc, optimization_level=3, pass_manager=pm)

    dará lugar a un error, mientras que antes de esta versión se utilizaba el valor de pm y se ignoraba el valor del kwarg de optimization_level . Los kwargs de transpile a los que se aplica esto son:

    • optimization_level
    • basis_gates
    • coupling_map
    • seed_transpiler
    • backend_properties
    • initial_layout
    • layout_method
    • routing_method
    • backend
  • En Operator, Clifford, SparsePauliOp, PauliTable, StabilizerTable, las clases de operador tienen un método call añadido que les permite asignar un qargs al operador para su uso con el método compose(), dot(), evolve()y - .

  • El método de adición de la clase qiskit.quantum_info.Operatoracepta ahora un kwarg qarg para permitir la adición de un operador más pequeño a uno más grande asumiendo identidades en los otros subsistemas (igual que para qargs en compose() y dot() ). Esto permite añadir subsistemas utilizando el método de llamada como en el caso de la composición. Este soporte se añade a todas las subclases de BaseOperator (ScalarOp, Operator, QuantumChannel).

    Por ejemplo:

    from qiskit.quantum_info import Operator, ScalarOp
    
    ZZ = Operator.from_label('ZZ')
    
    # Initialize empty Hamiltonian
    n_qubits = 10
    ham = ScalarOp(2 ** n_qubits, coeff=0)
    
    # Add 2-body nearest neighbour terms
    for j in range(n_qubits - 1):
        ham = ham + ZZ([j, j+1])
  • La clase BaseOperator se ha actualizado para que la suma, la resta y la multiplicación escalar dejen de ser métodos abstractos. Esto significa que ya no es necesario implementarlos en las subclases si no están soportados. La clase base lanzará un NotImplementedError cuando los métodos no estén definidos.

  • La función qiskit.quantum_info.random_density_matrix() devolverá un objeto DensityMatrix aleatorio. En versiones anteriores devolvía un array numpy.

  • En qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix ya no copian la matriz de entrada si ya tiene el dtype correcto.

  • fastjsonschema se añade como dependencia. Se utiliza para una validación mucho más rápida de los diccionarios qobj con respecto al esquema JSON cuando se llama al método to_dict() en objetos qobj con el argumento de palabra clave validate establecido en True.

  • Las clases de construcción qobj en qiskit.qobj ya no se validarán contra el qobj jsonschema por defecto. Entre ellas se incluyen las siguientes clases:

    Si confías en esta validación o quieres validarlos contra el esquema qobj, puedes hacerlo configurando el kwarg validate a True en el método to_dict() de cualquiera de las clases Qobj de nivel superior QasmQobj o PulseQobj. Por ejemplo:

    que validará el diccionario de salida contra el Qobj jsonschema.

  • El diccionario de salida de qiskit.qobj.QasmQobj.to_dict() y qiskit.qobj.PulseQobj.to_dict() ya no está en un formato para serialización json directa, tal y como espera la API de IBMQ. Estos objetos Qobj son el formato actual que utilizamos para pasar experimentos a los proveedores/backends y, aunque tener un formato de diccionario que pudiera pasarse directamente a la API de IBMQ era moderadamente útil para qiskit-ibmq-provider, dificultaba las cosas para otros proveedores. Especialmente para los proveedores que envuelven simuladores locales. En el futuro, las definiciones de lo que se transmite entre proveedores y el formato de solicitud de la API IBMQ se desacoplarán aún más (de forma compatible con versiones anteriores), lo que debería aliviar la carga de escribir proveedores y backends.

    En la práctica, la única diferencia funcional entre la salida de estos métodos ahora y las versiones anteriores es que los números complejos se representan con el tipo complex y las matrices numpy ya no se convierten silenciosamente a lista. Si anteriormente llamaba a json.dumps() directamente sobre la salida de to_dict() , después de esta versión necesitará un codificador json personalizado para manejar estos casos. Por ejemplo:

    import json
    
    from qiskit.circuit import ParameterExpression
    from qiskit import qobj
    
    my_qasm = qobj.QasmQobj(
        qobj_id='12345',
        header=qobj.QobjHeader(),
        config=qobj.QasmQobjConfig(shots=1024, memory_slots=2,
                                   max_credits=10),
        experiments=[
            qobj.QasmQobjExperiment(instructions=[
                qobj.QasmQobjInstruction(name='u1', qubits=[1],
                                         params=[0.4]),
                qobj.QasmQobjInstruction(name='u2', qubits=[1],
                                         params=[0.4, 0.2])
            ])
        ]
    )
    qasm_dict = my_qasm.to_dict()
    
    class QobjEncoder(json.JSONEncoder):
        """A json encoder for pulse qobj"""
        def default(self, obj):
            # Convert numpy arrays:
            if hasattr(obj, 'tolist'):
                return obj.tolist()
            # Use Qobj complex json format:
            if isinstance(obj, complex):
                return (obj.real, obj.imag)
            if isinstance(obj, ParameterExpression):
                return float(obj)
            return json.JSONEncoder.default(self, obj)
    
    json_str = json.dumps(qasm_dict, cls=QobjEncoder)

    generará una cadena json de la misma manera que lo hacía json.dumps(my_qasm.to_dict()) en versiones anteriores.

  • CmdDef está obsoleto desde Terra 0.11.0 y ha sido eliminado. Siga utilizando InstructionScheduleMap en su lugar.

  • Los métodos cmds y cmd_qubits en InstructionScheduleMap han quedado obsoletos desde Terra 0.11.0 y han sido eliminados. Por favor, utilice instructions y qubits_with_instruction en su lugar.

  • PulseDefaults han informado de qubit_freq_est y meas_freq_est en Hz en lugar de en GHz desde que Terra publicó 0.11.0. Se ha eliminado una advertencia que notificaba este cambio.

  • Se ha eliminado el soporte previamente obsoleto (en la versión 0.11.0 ) para pasar parámetros de los tipos,, (nodo AST QASM y ) qiskit.circuit.Instruction de los tipos sympy.Basic, sympy.Expr, qiskit.qasm.node.node.Node (nodo QASM AST) y sympy.Matrix . Los tipos admitidos para los parámetros de instrucción son:

  • Las siguientes propiedades de BackendConfiguration:

    • dt
    • dtm
    • rep_time

    todas tienen unidades de segundos. Antes del lanzamiento 0.11.0, dt y dtm tenían unidades de nanosegundos. Antes de la versión 0.12.0, rep_time tenía unidades de microsegundos. Las advertencias que alertaban a los usuarios de estos cambios ya se han eliminado de BackendConfiguration.

  • Se ha añadido un nuevo requisito a la lista de requisitos, retworkx. Se trata de una biblioteca de grafos con licencia Apache 2.0 que tiene una API similar a la de networkx y se está utilizando para acelerar significativamente las qiskit.dagcircuit.DAGCircuit operaciones como parte del transpilador. Hay binarios publicados en PyPI para todas las plataformas soportadas por Qiskit Terra pero si estás usando una plataforma donde no hay binarios precompilados publicados consulta la documentación de retworkx para instrucciones sobre la instalación pip desde sdist.

    Si tiene algún problema con el transpilador o la clase DAGCircuit como parte de la transición, puede volver a la implementación anterior de networkx estableciendo la variable de entorno USE_RETWORKX en N. Esta opción se eliminará en la versión 0.14.0.

Notas sobre características en desuso

  • Pasar los datos al constructor de qiskit.dagcircuit.DAGNode como un diccionario arg data_dict está obsoleto y será eliminado en una futura versión. En su lugar, ahora debe pasar los campos como kwargs al constructor. Por ejemplo el comportamiento anterior de:

    from qiskit.dagcircuit import DAGNode
    
    data_dict = {
        'type': 'in',
        'name': 'q_0',
    }
    node = DAGNode(data_dict)

    debería ser ahora:

    from qiskit.dagcircuit import DAGNode
    
    node = DAGNode(type='in', name='q_0')
  • Se han actualizado los nombres de los objetos y métodos de las puertas para que sean más coherentes. Se han realizado los cambios siguientes:

    • Todas las puertas de Pauli tienen una sola letra mayúscula (I, X, Y, Z)
    • Las puertas de Pauli parametrizadas (es decir, las rotaciones) van precedidas de la letra mayúscula R (RX, RY, RZ)
    • Una versión controlada antepone la letra mayúscula C (CX, CRX, CCX)
    • Las puertas se denominan según su acción, no según sus nombres alternativos (CCX, no Toffoli)

    Los nombres antiguos han quedado obsoletos y se eliminarán en una próxima versión. Esta es una lista de los cambios mostrando la antigua y la nueva clase, el atributo nombre y los métodos. Si una nueva columna está en blanco, entonces no hay ningún cambio para eso.

    Clase antigua
    Clase nueva
    Nombre antiguo Atributo
    Nuevo atributo de nombre
    ToffoliGateCCXGateccxccx() y toffoli()
    CrxGateCRXGatecrxcrx()
    CryGateCRYGatecrycry()
    CrzGateCRZGatecrzcrz()
    FredkinGateCSwapGatecswapcswap() y fredkin()
    Cu1GateCU1Gatecu1cu1()
    Cu3GateCU3Gatecu3cu3()
    CnotGateCXGatecxcx() y cnot()
    CyGateCYGatecycy()
    CzGateCZGateczcz()
    DiagGateDiagonalGatediagdiagonaldiag_gatediagonal()
    IdGateIGateidideni() y id()
    Isometryisoisometryiso()isometry() y iso()
    UCGUCGatemultiplexerucguc()
    UCRotUCPauliRotGate
    UCXUCRXGateucrotXucrxucxucrx()
    UCYUCRYGateucrotyucryucyucry()
    UCZUCRZGateucrotzucrzuczucrz()
  • El kwarg period para la función square(), sawtooth(), y triangle() en qiskit.pulse.pulse_lib es ahora obsoleto y será eliminado en una futura versión. En su lugar, ahora debe utilizar el kwarg freq para ajustar la frecuencia.

  • Los métodos DAGCircuit.compose_back() y DAGCircuit.extend_back() están obsoletos y se eliminarán en una futura versión. En su lugar, debe utilizar el método qiskit.dagcircuit.DAGCircuit.compose() que es un método más general y más flexible que proporciona la misma funcionalidad.

  • El kwarg callback del constructor de la clase qiskit.transpiler.PassManager ha quedado obsoleto y se eliminará en una futura versión. En lugar de establecerlo a nivel de objeto durante la creación, ahora debería establecerse como un parámetro kwarg en el método qiskit.transpiler.PassManager.run() método.

  • Las palabras clave n_qubits y numberofqubits quedan obsoletas en Terra y se sustituyen por num_qubits. Los nombres antiguos se eliminarán en una próxima versión. A continuación se enumeran los objetos afectados por este cambio:

    Clase
    Método antiguo
    Nuevo método
    QuantumCircuitn_qubitsnum_qubits()
    Paulinumberofqubitsnum_qubits()
    Función
    Viejo argumento
    Nuevo argumento
    random_circuit()n_qubitsnum_qubits
    MSGaten_qubitnum_qubits
  • La función qiskit.quantum_info.synthesis.euler_angles_1q ha quedado obsoleta. Ha sido sustituida por la clase qiskit.quantum_info.OneQubitEulerDecomposer que ofrece la misma funcionalidad:

    OneQubitEulerDecomposer().angles(mat)
  • El kwarg pass_manager para el qiskit.compiler.transpile() ha quedado obsoleto y se eliminará en una futura versión. En adelante, la forma preferida de transpilar un circuito con un objeto personalizado PassManager personalizado es utilizar el método run() del objeto PassManager .

  • La función qiskit.quantum_info.random_state() ha quedado obsoleta y se eliminará en una futura versión. En su lugar, debe utilizar la función qiskit.quantum_info.random_statevector() función

  • Los métodos add, subtract, y multiply de la qiskit.quantum_info.Statevector y qiskit.quantum_info.DensityMatrix están obsoletos y se eliminarán en una futura versión. En su lugar, debe utilizar los operadores binarios +, -, * .

  • Deja obsoletos qiskit.quantum_info.Statevector.to_counts(), qiskit.quantum_info.DensityMatrix.to_counts(), y qiskit.quantum_info.counts.state_to_counts(). Estas funciones son sustituidas por los métodos de clase qiskit.quantum_info.Statevector.probabilities_dict() y qiskit.quantum_info.DensityMatrix.probabilities_dict().

  • SamplePulse y ParametricPulse s (por ejemplo, Gaussian) ahora subclase de Pulse y se han movido a la qiskit.pulse.pulse_lib. La ruta anterior a través de pulse.commands es obsoleta y se eliminará en una futura versión.

  • DelayInstruction ha quedado obsoleto y ha sido sustituido por Delay. Esta nueva instrucción se ha tomado sobre la anterior Command Delay. El patrón de migración es:

    Delay(<duration>)(<channel>) -> Delay(<duration>, <channel>)
    DelayInstruction(Delay(<duration>), <channel>)
        -> Delay(<duration>, <channel>)

    Hasta que finalice el periodo de desaprobación, también se admitirá la sintaxis anterior de Delay para llamar a un comando en un canal:

    Delay(<phase>)(<channel>)

    La nueva instrucción Delay no admite el atributo command .

  • FrameChange y FrameChangeInstruction han quedado obsoletos y se han sustituido por ShiftPhase. Los cambios son:

    FrameChange(<phase>)(<channel>) -> ShiftPhase(<phase>, <channel>)
    FrameChangeInstruction(FrameChange(<phase>), <channel>)
        -> ShiftPhase(<phase>, <channel>)

    Hasta que finalice el periodo de desaprobación, se admitirá la sintaxis anterior de FrameChange para llamar a un comando en un canal:

    ShiftPhase(<phase>)(<channel>)
  • El método call de SamplePulse y ParametricPulse s ha quedado obsoleto. La migración es la siguiente:

    Pulse(<*args>)(<channel>) -> Play(Pulse(*args), <channel>)
  • AcquireInstruction ha quedado obsoleto y ha sido sustituido por Acquire. Los cambios son:

    Acquire(<duration>)(<**channels>) -> Acquire(<duration>, <**channels>)
    AcquireInstruction(Acquire(<duration>), <**channels>)
        -> Acquire(<duration>, <**channels>)

    Hasta que finalice el periodo de desaprobación, se admitirá la sintaxis anterior de Acquire para llamar al comando en un canal:

    Acquire(<duration>)(<**channels>)

Corrección de errores

  • El BarrierBeforeFinalMeasurements transpiler pass, incluido en los niveles de transpiler preestablecidos cuando se apunta a un dispositivo físico, anteriormente insertaba una barrera a través de qubits medidos solamente. En algunos casos, esto permitía al transpilador insertar un swap después de una operación de medida, haciendo que el circuito no fuera válido para los dispositivos actuales. El pase se ha actualizado para que la barrera insertada abarque todos los qubits del dispositivo. Correcciones #3937

  • Al ampliar una QuantumCircuit instancia (extendido) con otro circuito (extensión), el circuito se toma por referencia. Si un circuito se extiende consigo mismo, se produce un bucle infinito, ya que el extendido y la extensión son lo mismo. Este error se ha resuelto copiando la extensión si es el mismo objeto que el extendido. Correcciones #3811

  • Corrige un caso en qiskit.result.Result.get_counts()en el que no se podía hacer referencia a los resultados de una caducidad si el experimento se inicializaba como un Programa sin nombre. Correcciones nº 2753

  • Anteriormente, la sustitución de Parameter de un circuito por nuevos objetos Parameter antes de descomponer un circuito provocaba que los valores sustituidos no se sustituyeran correctamente en las puertas descompuestas. Esto se ha resuelto de forma que la unión y la descomposición puedan producirse en cualquier orden.

  • El backend de salida de matplotlib para la función qiskit.visualization.circuit_drawer() función y qiskit.circuit.QuantumCircuit.draw() se ha corregido para que muestre correctamente CU1Gate gates. Correcciones #3684

  • Un error en qiskit.circuit.QuantumCircuit.from_qasm_str() y qiskit.circuit.QuantumCircuit.from_qasm_file() al cargar QASM con puertas personalizadas definidas. Ahora, cargando este QASM:

    OPENQASM 2.0;
    include "qelib1.inc";
    gate rinv q {sdg q; h q; sdg q; h q; }
    qreg q[1];
    rinv q[0];

    es equivalente al siguiente circuito:

    rinv_q = QuantumRegister(1, name='q')
    rinv_gate = QuantumCircuit(rinv_q, name='rinv')
    rinv_gate.sdg(rinv_q)
    rinv_gate.h(rinv_q)
    rinv_gate.sdg(rinv_q)
    rinv_gate.h(rinv_q)
    rinv = rinv_gate.to_instruction()
    qr = QuantumRegister(1, name='q')
    expected = QuantumCircuit(qr, name='circuit')
    expected.append(rinv, [qr[0]])

    Correcciones #1566

  • Permitir que las instrucciones de circuitos cuánticos tengan valores de parámetros de lista. Se utiliza en Aer para los parámetros de instantánea de valor de expectativa, por ejemplo params = [[1.0, 'I'], [1.0, 'X']]] para I+X\langle I + X\rangle.

  • Anteriormente, para los circuitos que contenían puertas compuestas (las creadas mediante qiskit.circuit.QuantumCircuit.to_gate() o qiskit.circuit.QuantumCircuit.to_instruction() o sus convertidores correspondientes), si se intentaba enlazar el circuito más de una vez, al transpilarlo sólo se aplicaba el primer valor de enlace a todos los circuitos. Esto se ha resuelto para que se respeten correctamente los valores proporcionados para las vinculaciones posteriores.

Otras notas

Aer 0.5.0

Añadido

  • Añadir soporte para puerta diagonal terra
  • Añadir soporte para qobj parametrizado

Fijo

  • Añadido postfix para linux en Raspberry Pi
  • Manejar entradas de array numpy desde qobj

Ignis 0.3.0

Añadido

  • Documentación de API
  • Evaluación comparativa aleatoria CNOT-Diédrica
  • Módulo de acreditación para la acreditación de salida de dispositivos ruidosos
  • Calibración de impulsos para qubits individuales
  • Discriminador de impulsos
  • Circuitos de verificación del entrelazamiento
  • Tomografía de conjuntos de compuertas para conjuntos de compuertas de un solo qubit
  • Añade funciones de utilidad de evaluación comparativa aleatorias calculate_1q_epg, calculate_2q_epg funciones para calcular el error de 1 y 2 qubits por puerta a partir del error por Clifford
  • Añade funciones de utilidad de evaluación comparativa aleatorias calculate_1q_epc, calculate_2q_epc para calcular el error de 1 y 2 qubits por Clifford a partir del error por puerta

Cambiado

  • Soporte de etiquetas enteras para qubits en tomografía
  • Admite etiquetas enteras para mitigar los errores de medición

En desuso

  • Deja obsoleta la función twoQ_clifford_error . Utilice calculate_2q_epc en su lugar.
  • Python 3.5 en qiskit-ignis está obsoleto. El soporte se retirará en la fecha de fin de vida de la versión para la comunidad python, que es el 13/09/2020.

Aqua 0.6.5

Sin cambios

IBM Proveedor Q 0.6.0

Sin cambios

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