Skip to main content
IBM Quantum Platform

Notas de la versión de Qiskit 0.44


Historial de versiones

Esta es la última versión en la que qiskit era un "metapaquete", que contenía varios "elementos" diferentes. Lo que se denomina "Qiskit Terra" en estas notas de la versión (y en otras anteriores) es principalmente lo que ahora se llama simplemente "Qiskit".

Esta tabla registra las versiones del metapaquete y la versión de cada elemento heredado de Qiskit instalado:

Versión del metapaquete Qiskit
qiskit-terra
qiskit-aer
qiskit-ignis
qiskit-ibmq-provider
qiskit-aqua
Fecha de release
0.44.10.25.12023-08-17
0.44.00.25.02023-07-27
0.43.30.24.20.12.20.20.22023-07-19
0.43.20.24.10.12.10.20.22023-06-28
0.43.10.24.10.12.00.20.22023-06-02
0.43.00.24.00.12.00.20.22023-05-04
0.42.10.23.30.12.00.20.22023-03-21
0.42.00.23.20.12.00.20.22023-03-10
0.41.10.23.20.11.20.20.12023-02-23
0.41.00.23.10.11.20.20.02023-01-31
0.40.00.23.00.11.20.19.22023-01-26
0.39.50.22.40.11.20.19.22023-01-17
0.39.40.22.30.11.20.19.22022-12-08
0.39.30.22.30.11.10.19.22022-11-25
0.39.20.22.20.11.10.19.22022-11-03
0.39.10.22.10.11.10.19.22022-11-02
0.39.00.22.00.11.00.19.22022-10-13
0.38.00.21.20.11.00.19.22022-09-14
0.37.20.21.20.10.40.19.22022-08-23
0.37.10.21.10.10.40.19.22022-07-28
0.37.00.21.00.10.40.19.22022-06-30
0.36.20.20.20.10.40.7.10.19.12022-05-18
0.36.10.20.10.10.40.7.00.19.12022-04-21
0.36.00.20.00.10.40.7.00.19.006-04-2022
0.35.00.20.00.10.30.7.00.18.32022-03-31
0.34.20.19.20.10.30.7.00.18.32022-02-09
0.34.10.19.10.10.20.7.00.18.32022-01-05
0.34.00.19.10.10.10.7.00.18.320-12-2021
0.33.10.19.10.9.10.7.00.18.210-12-2021
0.33.00.19.00.9.10.7.00.18.106-12-2021
0.32.10.18.30.9.10.6.00.18.10.9.52021-11-22
0.32.00.18.30.9.10.6.00.18.00.9.52021-11-10
0.31.00.18.30.9.10.6.00.17.00.9.512-10-2021
0.30.10.18.30.9.00.6.00.16.00.9.52021-09-29
0.30.00.18.20.9.00.6.00.16.00.9.516-09-2021
0.29.10.18.20.8.20.6.00.16.00.9.510-09-2021
0.29.00.18.10.8.20.6.00.16.00.9.42021-08-02
0.28.00.18.00.8.20.6.00.15.00.9.413-07-2021
0.27.00.17.40.8.20.6.00.14.00.9.215-06-2021
0.26.20.17.40.8.20.6.00.13.10.9.12021-05-19
0.26.10.17.40.8.20.6.00.13.10.9.12021-05-18
0.26.00.17.30.8.20.6.00.13.10.9.12021-05-11
0.25.40.17.20.8.20.6.00.12.30.9.12021-05-05
0.25.30.17.10.8.20.6.00.12.30.9.12021-04-29
0.25.20.17.10.8.10.6.00.12.30.9.12021-04-21
0.25.10.17.10.8.10.6.00.12.20.9.12021-04-15
0.25.00.17.00.8.00.6.00.12.20.9.002-04-2021
0.24.10.16.40.7.60.5.20.12.20.8.224-03-2021
0.24.00.16.40.7.60.5.20.12.10.8.22021-03-04
0.23.60.16.40.7.50.5.20.11.10.8.22021-02-18
0.23.50.16.40.7.40.5.20.11.10.8.22021-02-08
0.23.40.16.30.7.30.5.10.11.10.8.12021-01-28
0.23.30.16.20.7.30.5.10.11.10.8.126-01-2021
0.23.20.16.10.7.20.5.10.11.10.8.12020-12-15
0.23.10.16.10.7.10.5.10.11.10.8.12020-11-12
0.23.00.16.00.7.00.5.00.11.00.8.02020-10-16
0.22.00.15.20.6.10.4.00.10.00.7.52020-10-05
0.21.00.15.20.6.10.4.00.9.00.7.52020-09-16
0.20.10.15.20.6.10.4.00.8.00.7.52020-09-08
0.20.00.15.10.6.10.4.00.8.00.7.52020-08-10
0.19.60.14.20.5.20.3.30.7.20.7.32020-06-25
0.19.50.14.20.5.20.3.20.7.20.7.32020-06-19
0.19.40.14.20.5.20.3.00.7.20.7.22020-06-16
0.19.30.14.10.5.20.3.00.7.20.7.102-06-2020
0.19.20.14.10.5.10.3.00.7.10.7.12020-05-14
0.19.10.14.10.5.10.3.00.7.00.7.02020-05-01
0.19.00.14.00.5.10.3.00.7.00.7.02020-04-30
0.18.30.13.00.5.10.3.00.6.10.6.62020-04-24
0.18.20.13.00.5.00.3.00.6.10.6.62020-04-23
0.18.10.13.00.5.00.3.00.6.00.6.620-04-2020
0.18.00.13.00.5.00.3.00.6.00.6.509-04-2020
0.17.00.12.00.4.10.2.00.6.00.6.52020-04-01
0.16.20.12.00.4.10.2.00.5.00.6.520-03-2020
0.16.10.12.00.4.10.2.00.5.00.6.42020-03-05
0.16.00.12.00.4.00.2.00.5.00.6.42020-02-27
0.15.00.12.00.4.00.2.00.4.60.6.46-2-2020
0.14.10.11.10.3.40.2.00.4.50.6.22020-01-07
0.14.00.11.00.3.40.2.00.4.40.6.110-12-2019
0.13.00.10.00.3.20.2.00.3.30.6.12019-10-17
0.12.20.9.10.3.00.2.00.3.30.6.02019-10-11
0.12.10.9.00.3.00.2.00.3.30.6.02019-09-30
0.12.00.9.00.3.00.2.00.3.20.6.022-05-2019
0.11.20.8.20.2.30.1.10.3.20.5.520-08-2019
0.11.10.8.20.2.30.1.10.3.10.5.32019-07-24
0.11.00.8.20.2.30.1.10.3.00.5.22019-07-15
0.10.50.8.20.2.10.1.10.2.20.5.22019-06-27
0.10.40.8.20.2.10.1.10.2.20.5.12019-06-17
0.10.30.8.10.2.10.1.10.2.20.5.12019-05-29
0.10.20.8.00.2.10.1.10.2.20.5.12019-05-24
0.10.10.8.00.2.00.1.10.2.20.5.02019-05-07
0.10.00.8.00.2.00.1.10.2.10.5.02019-05-06
0.9.00.8.00.2.00.1.10.1.10.5.02019-05-02
0.8.10.7.20.1.10.1.02019-05-01
0.8.00.7.10.1.10.1.02019-03-05
0.7.3>=0.7,<0.8>=0.1,<0.219-02-2019
0.7.2>=0.7,<0.8>=0.1,<0.22019-01-22
0.7.1>=0.7,<0.8>=0.1,<0.217-01-2019
0.7.0>=0.7,<0.8>=0.1,<0.22018-12-14
Note

Para las versiones de los metapaquetes 0.7.0, 0.7.1 y 0.7.2 aún no se ha formalizado la estrategia de versionado de los metapaquetes.


0.44.1

Terra 0.25.1

Preludio

Qiskit Terra 0.25.1 es una versión de corrección de errores, que aborda algunos problemas identificados desde la versión 0.25.1.

Corrección de errores

  • Se ha corregido un error en la serialización QPY (qiskit.qpy) por el que múltiples compuertas personalizadas controladas en un circuito podían dar lugar a un archivo QPY no válido que no se podía analizar. Corregido #9746.

  • Arreglado #9363. etiquetando la síntesis sin registro en el orden que devuelve Tweedledum. Por ejemplo, compare este ejemplo antes y después del arreglo:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.classicalfunction import BooleanExpression
    
    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")
    
    from qiskit.circuit.classicalfunction import classical_function
    from qiskit.circuit.classicalfunction.types import Int1
    
    @classical_function
    def grover_oracle(a: Int1, b: Int1, c: Int1) -> Int1:
        return (a and b and not c)
    
    quantum_circuit = grover_oracle.synth(registerless=False)
    print(quantum_circuit.draw())

    Que imprimiría

         Before             After
    
         c: ──■──           a: ──■──
              │                  │
         b: ──■──           b: ──■──
              │                  │
         a: ──o──           c: ──o──
            ┌─┴─┐              ┌─┴─┐
    return: ┤ X ├      return: ┤ X ├
            └───┘              └───┘
  • Se ha corregido plot_state_paulivec(), que anteriormente amortiguaba los coeficientes de estado en un factor de 2n2^n, donde nn es el número de qubits. Ahora el gráfico de barras muestra correctamente los coeficientes como Tr(σρ)\mathrm{Tr}(\sigma\rho), donde ρ\rho es el estado a representar y σ\sigma itera sobre todos los posibles productos tensoriales de Paulis de un solo qubit.

  • Los ángulos en el exportador OpenQASM 2 (QuantumCircuit.qasm()) ahora siempre incluirán un punto decimal, por ejemplo en el caso de 1.e-5. Así lo exige una interpretación estricta de la especificación floating-point-literal en OpenQASM 2. El analizador sintáctico OpenQASM 2 de Qiskit (qasm2.load() y loads()) es más permisivo por defecto, y permitirá 1e-5 sin el punto decimal a menos que esté en modo strict .

  • El definidor de SparsePauliOp.paulis ahora rechazará correctamente los intentos de establecer el atributo con datos de forma incorrecta, en lugar de permitir silenciosamente que se cree un objeto no válido. Ver #10384.

  • Se ha corregido una regresión de rendimiento en la función SabreLayout y SabreSwap del transpilador. Corregido #10650


0.44.0

Esta versión marca oficialmente el fin del soporte para el paquete Qiskit IBMQ Provider y la eliminación de Qiskit Aer del metapaquete Qiskit. Después de esta versión, el metapaquete sólo contiene Qiskit Terra, por lo que esta es la última versión en la que nos referiremos al metapaquete Qiskit y a Qiskit Terra como cosas separadas. A partir de la próxima versión Qiskit 0.45.0 el paquete Qiskit será simplemente lo que antes era Qiskit Terra y ya no habrá separación entre ellos.

Si todavía utilizas el paquete qiskit-ibmq-provider , ya no está disponible. Deberá seguir los enlaces a las guías de migración en el LÉEME del paquete sobre cómo cambiar a los nuevos paquetes de sustitución qiskit-ibm-provider, qiskit-ibm-runtime, y qiskit-ibm-experiment:

https://github.com/Qiskit/qiskit-ibmq-provider#migration-guides

El proyecto Qiskit Aer sigue activo y se mantiene en el futuro, sólo que ya no se incluye como parte del paquete qiskit . Para seguir utilizando qiskit-aer deberá instalar explícitamente qiskit-aer e importar el paquete de qiskit_aer.

Como esta es la última versión del metapaquete Qiskit los siguientes extras setuptools utilizados para instalar dependencias opcionales ya no funcionarán en la próxima versión Qiskit 0.45.0:

  • nature
  • machine-learning
  • finance
  • optimization
  • experiments

Si estás usando los extras para instalar algún paquete deberías migrar a usar los paquetes directamente en lugar de los extras. Por ejemplo, si antes utilizaba pip install qiskit[experiments] , deberá cambiar a pip install qiskit qiskit-experiments para instalar ambos paquetes. Del mismo modo, el extra all (lo que se instala a través de pip install "qiskit[all]") ya no incluirá estos paquetes en Qiskit 0.45.0.

Terra 0.25.0

Preludio

Los aspectos más destacados del lanzamiento de Qiskit Terra 0.25.0 son:

  • Las operaciones de flujo de control ahora se admiten a través del transpilador en todos los niveles de optimización, incluidos los niveles 2 y 3 (por ejemplo, llamar a transpile() o generate_preset_pass_manager() con el argumento optimization_level especificado como 2 o 3).

  • Los campos IfElseOp.condition, WhileLoopOp.condition y SwitchCaseOp.target pueden ser ahora instancias del nuevo tipo de expresión clásica en tiempo de ejecución expr.Expr. Es distinto de ParameterExpression porque se evalúa en tiempo de ejecución para los backends que admiten dichas operaciones.

    Estas nuevas expresiones tienen mucha más potencia que la antigua forma de dos tuplas para suministrar las condiciones clásicas. Por ejemplo, ahora se pueden representar restricciones de igualdad entre dos registros clásicos diferentes, o la "o" lógica de dos bits clásicos. Estos dos ejemplos quedarían así:

    from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister
    from qiskit.circuit.classical import expr
    
    qr = QuantumRegister(4)
    cr1 = ClassicalRegister(2)
    cr2 = ClassicalRegister(2)
    qc = QuantumCircuit(qr, cr1, cr2)
    qc.h(0)
    qc.cx(0, 1)
    qc.h(2)
    qc.cx(2, 3)
    qc.measure([0, 1, 2, 3], [0, 1, 2, 3])
    
    # If the two registers are equal to each other.
    with qc.if_test(expr.equal(cr1, cr2)):
      qc.x(0)
    
    # While either of two bits are set.
    with qc.while_loop(expr.logic_or(cr1[0], cr1[1])):
      qc.reset(0)
      qc.reset(1)
      qc.measure([0, 1], cr1)

    Para más ejemplos, consulte la documentación de qiskit.circuit.classical.

    Esta característica es nueva tanto para Qiskit como para el hardware cuántico disponible con el que funciona Qiskit. Como las funciones aún están en fase de desarrollo, es probable que haya casos extremos inesperados que necesiten tiempo para resolverse. Si tienes algún problema relacionado con la compatibilidad o el uso de la expresión clásica, ponte en contacto con Qiskit o con tu proveedor de hardware.

    En esta versión inicial, Qiskit ha añadido las operaciones:

    Pueden actuar sobre Python literales enteros y booleanos, o sobre ClassicalRegister y Clbit instancias.

    Todas estas expresiones clásicas son totalmente compatibles con la pila del transpilador Qiskit, con la serialización QPY (qiskit.qpy) y para la exportación a OpenQASM 3 (qiskit.qasm3). La importación desde OpenQASM 3 se gestiona actualmente mediante un paquete independiente (que se vuelve a exponer a través de qiskit.qasm3), que esperamos se amplíe para adaptarse a las nuevas características de Qiskit.

  • El módulo qiskit.algorithms ha quedado obsoleto y se eliminará en una próxima versión. Ha sido sustituida por una nueva biblioteca independiente qiskit-algorithms que puede encontrarse en PyPi o en Github aquí:

    https://github.com/qiskit-community/qiskit-algorithms

    El módulo qiskit.algorithms seguirá funcionando como hasta ahora y se corregirán errores hasta su futura eliminación, pero el desarrollo activo de nuevas funciones se ha trasladado al nuevo paquete. Si depende de qiskit.algorithms debe actualizar sus requisitos de Python para incluir también qiskit-algorithms y actualizar las importaciones de qiskit.algorithms a qiskit_algorithms. Tenga en cuenta que este nuevo paquete no incluye el código de algoritmos ya obsoletos, incluidos los algoritmos basados en opflow y QuantumInstance. Si aún no ha migrado de algoritmos basados en QuantumInstance a algoritmos basados en primitivas, debe seguir las directrices de migración de https://qisk.it/algo _migration. La decisión de migrar el módulo algorithms a un paquete independiente para aclarar el propósito de Qiskit y distinguir entre las herramientas y las bibliotecas creadas sobre él.

Qiskit Terra 0.25 ha abandonado el soporte para Python 3.7 siguiendo las advertencias de depreciación iniciadas en Qiskit Terra 0.23. Esto es coherente con Python 3.7’s final de su vida útil el 27 de junio de 2023. Para seguir utilizando Qiskit, debes actualizarte a una versión más reciente de Python.

Nuevas funciones

  • En esta versión se han añadido las siguientes funciones.
Características del transpilador
  • Se han añadido dos nuevas opciones a BlockCollector.

    La primera opción nueva split_layers permite dividir los bloques recogidos en subbloques sobre subconjuntos de qubits disjuntos, es decir, en subbloques depth-1.

    La segunda opción nueva collect_from_back permite recoger bloques con avidez a partir de las salidas del circuito. Esto es importante en combinación con los pases de programación ALAP, en los que es posible que prefiramos colocar puertas en los bloques más tardíos en lugar de en los más tempranos.

  • Se han añadido las nuevas opciones split_layers y collect_from_back a CollectLinearFunctions y CollectCliffords pases del transpilador.

    Cuando split_layers es True, los bloques recogidos se dividen en subbloques sobre subconjuntos de qubits disjuntos, es decir, en subbloques depth-1. Consulte el ejemplo siguiente:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import CollectLinearFunctions
    
    circuit = QuantumCircuit(5)
    circuit.cx(0, 2)
    circuit.cx(1, 4)
    circuit.cx(2, 0)
    circuit.cx(0, 3)
    circuit.swap(3, 2)
    circuit.swap(4, 1)
    
    # Collect all linear gates, without splitting into layers
    qct = CollectLinearFunctions(split_blocks=False, min_block_size=1, split_layers=False)(circuit)
    assert qct.count_ops()["linear_function"] == 1
    
    # Collect all linear gates, with splitting into layers
    qct = CollectLinearFunctions(split_blocks=False, min_block_size=1, split_layers=True)(circuit)
    assert qct.count_ops()["linear_function"] == 4

    El circuito original es lineal. Al reunir puertas lineales sin dividir en capas, deberíamos acabar con una única función lineal. Sin embargo, al reunir las puertas lineales y dividirlas en capas, deberíamos acabar con 4 funciones lineales.

    Cuando collect_from_back es True, los bloques se recogen ávidamente desde las salidas hacia las entradas del circuito. Consulte el ejemplo siguiente:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import CollectLinearFunctions
    
    circuit = QuantumCircuit(3)
    circuit.cx(1, 2)
    circuit.cx(1, 0)
    circuit.h(2)
    circuit.swap(1, 2)
    
    # This combines the CX(1, 2) and CX(1, 0) gates into a single linear function
    qct = CollectLinearFunctions(collect_from_back=False)(circuit)
    
    # This combines the CX(1, 0) and SWAP(1, 2) gates into a single linear function
    qct = CollectLinearFunctions(collect_from_back=True)(circuit)

    El circuito original contiene una puerta Hadamard, de modo que la puerta CX(1, 0) puede combinarse con CX(1, 2) o con SWAP(1, 2), pero no con ambas. Cuando collect_from_back es Falso, los bloques lineales se recogen ávidamente desde el principio del circuito, y así CX(1, 0) se combina con CX(1, 2). Cuando collect_from_back es True, los bloques lineales se recogen ávidamente desde el final del circuito, y así CX(1, 0) se combina con SWAP(1, 2).

  • Añadido DAGCircuit.classical_predecessors() y DAGCircuit.classical_successors()una alternativa a la selección de hilos clásica que no requiere acceder directamente al grafo interno de un nodo DAG. El siguiente ejemplo ilustra la nueva funcionalidad:

    from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
    from qiskit.converters import circuit_to_dag
    from qiskit.circuit.library import RZGate
    
    q = QuantumRegister(3, 'q')
    c = ClassicalRegister(3, 'c')
    circ = QuantumCircuit(q, c)
    circ.h(q[0])
    circ.cx(q[0], q[1])
    circ.measure(q[0], c[0])
    circ.rz(0.5, q[1]).c_if(c, 2)
    circ.measure(q[1], c[0])
    dag = circuit_to_dag(circ)
    
    rz_node = dag.op_nodes(RZGate)[0]
    # Contains the "measure" on clbit 0, and the "wire start" nodes for clbits 1 and 2.
    classical_predecessors = list(dag.classical_predecessors(rz_node))
    # Contains the "measure" on clbit 0, and the "wire end" nodes for clbits 1 and 2.
    classical_successors = list(dag.classical_successors(rz_node))
  • Soporte habilitado para ControlFlowOp operaciones en el CommutativeCancellation paso. Anteriormente, los bloques de las operaciones de flujo de control se omitían en este paso.

  • Soporte habilitado para ControlFlowOp operaciones en el ConsolidateBlocks paso.

  • Añadimos DAGCircuit.quantum_causal_cone() para obtener el cono causal de un qubit en un DAGCircuit. El siguiente ejemplo muestra su uso correcto:

    from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
    from qiskit.circuit.library import CXGate, CZGate
    from qiskit.dagcircuit import DAGCircuit
    
    # Build a DAGCircuit
    dag = DAGCircuit()
    qreg = QuantumRegister(5)
    creg = ClassicalRegister(5)
    dag.add_qreg(qreg)
    dag.add_creg(creg)
    dag.apply_operation_back(CXGate(), qreg[[1, 2]], [])
    dag.apply_operation_back(CXGate(), qreg[[0, 3]], [])
    dag.apply_operation_back(CZGate(), qreg[[1, 4]], [])
    dag.apply_operation_back(CZGate(), qreg[[2, 4]], [])
    dag.apply_operation_back(CXGate(), qreg[[3, 4]], [])
    
    # Get the causal cone of qubit at index 0
    result = dag.quantum_causal_cone(qreg[0])
  • Se ha añadido un nuevo método find_bit() a la clase DAGCircuit que devuelve las posiciones de los bits de la clase Qubit o Clbit como una tupla del índice posicional del bit dentro del circuito y una lista de tuplas que localizan el bit en los registros del circuito.

  • El transpilador incorporado EquivalenceLibrary (qiskit.circuit.equivalence_library.SessionEquivalenceLibrary) se le han enseñado las relaciones circulares de Pauli X=iYZX = iYZ, Y=iZXY = iZX y Z=iXYZ = iXY. Esto debería hacer más fiable la transpilación a conjuntos de bases restringidos y potencialmente incompletos. Ver #10293 para más detalles.

  • Las operaciones de flujo de control ahora se admiten a través del transpilador en todos los niveles de optimización, incluidos los niveles 2 y 3 (por ejemplo, llamar a transpile() o generate_preset_pass_manager() con el argumento optimization_level=3).

  • DAGCircuit.substitute_node() ganó un argumento de palabra clave propagate_condition que es análogo al mismo argumento en substitute_node_with_dag(). Si se establece en False , se anula el comportamiento heredado de copiar una condición de node en el nuevo op que lo sustituye.

    Esta opción se ignora para las operaciones generales de flujo de control, que nunca propagarán su condición, ni aceptarán una condición de otro nodo.

  • Se ha introducido un nuevo método DAGCircuit.separable_circuits()que devuelve una lista de objetos DAGCircuit uno por cada conjunto de qubits conectados que no tengan puertas que los conecten a otro conjunto.

    Cada instancia de DAGCircuit devuelto por este método contendrá el mismo número de clbits que self. Este método no devolverá DAGCircuit instancias formadas únicamente por clbits.

  • Se ha añadido el atributo Target.concurrent_measurements que representa una restricción de hardware de qubits medidos simultáneamente. Esta restricción se proporciona en forma de lista anidada, en la que cada elemento representa un grupo de qubits que deben medirse juntos. En un ejemplo

    [[0, 1], [2, 3, 4]]

    los qubits 0 y 1, y 2, 3 y 4 se miden juntos en el dispositivo. Esta restricción no bloquea la medición de un qubit individual, pero puede que tengas que considerar la alineación de las operaciones de medición para estos qubits cuando trabajes con el programador Qiskit Pulse y cuando crees nuevos pases del transpilador que tengan en cuenta el tiempo (es decir, pases que realicen la programación).

  • El pase del transpilador SetLayout puede construirse ahora con una lista de enteros que representan los qubits físicos en los que se mapeará el circuito cuántico. Es decir, el primer qubit del circuito se asignará al qubit físico en la posición cero de la lista, y así sucesivamente.

  • El transpilador incorporado EquivalenceLibrary ha enseñado más equivalencias de rotación Pauli entre las compuertas de un qubit RXR_X, RYR_Y y RZR_Z, y entre las compuertas de dos qubits RXXR_{XX}, RYYR_{YY} y RZZR_{ZZ}. Esto debería hacer más fiables las conversiones de bases sencillas, especialmente los circuitos que utilizan rotaciones YY. Ver #7332.

  • Las operaciones de flujo de control son ahora compatibles con la familia Sabre de pases de transpilador, a saber, el pase de diseño SabreLayout y el pase de enrutamiento SabreSwap. Función transpile() los argumentos de la palabra clave layout_method y routing_method aceptan ahora la opción "sabre" para circuitos con flujo de control, que antes no se admitía.

Características de los circuitos
  • Los campos IfElseOp.condition, WhileLoopOp.condition y SwitchCaseOp.target pueden ser ahora instancias del nuevo tipo de expresión clásica en tiempo de ejecución expr.Expr. Es distinto de ParameterExpression porque se evalúa en tiempo de ejecución para los backends que admiten dichas operaciones.

    Estas nuevas expresiones tienen mucha más potencia que la antigua forma de dos tuplas para suministrar las condiciones clásicas. Por ejemplo, ahora se pueden representar restricciones de igualdad entre dos registros clásicos diferentes, o la "o" lógica de dos bits clásicos. Estos dos ejemplos quedarían así:

    from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister
    from qiskit.circuit.classical import expr
    
    qr = QuantumRegister(4)
    cr1 = ClassicalRegister(2)
    cr2 = ClassicalRegister(2)
    qc = QuantumCircuit(qr, cr1, cr2)
    qc.h(0)
    qc.cx(0, 1)
    qc.h(2)
    qc.cx(2, 3)
    qc.measure([0, 1, 2, 3], [0, 1, 2, 3])
    
    # If the two registers are equal to each other.
    with qc.if_test(expr.equal(cr1, cr2)):
      qc.x(0)
    
    # While either of two bits are set.
    with qc.while_loop(expr.logic_or(cr1[0], cr1[1])):
      qc.reset(0)
      qc.reset(1)
      qc.measure([0, 1], cr1)

    Para más ejemplos, consulte la documentación de qiskit.circuit.classical.

    Esta característica es nueva tanto para Qiskit como para el hardware cuántico disponible con el que funciona Qiskit. Como las funciones aún están en fase de desarrollo, es probable que haya casos extremos inesperados que necesiten tiempo para resolverse. Si tienes algún problema relacionado con la compatibilidad o el uso de la expresión clásica, ponte en contacto con Qiskit o con tu proveedor de hardware.

    En esta versión inicial, Qiskit ha añadido las operaciones:

    Pueden actuar sobre Python literales enteros y booleanos, o sobre ClassicalRegister y Clbit instancias.

    Todas estas expresiones clásicas son totalmente compatibles con la pila del transpilador Qiskit, con la serialización QPY (qiskit.qpy) y para la exportación a OpenQASM 3 (qiskit.qasm3). La importación desde OpenQASM 3 se gestiona actualmente mediante un paquete independiente (que se vuelve a exponer a través de qiskit.qasm3), que esperamos se amplíe para adaptarse a las nuevas características de Qiskit.

  • Se han añadido herramientas para trabajar con las nuevas representaciones de expresiones en tiempo de ejecución clásicas. Se ExprVisitor para que los consumidores de estas expresiones puedan subclasificarlas. Dos utilidades basadas en esta estructura iter_vars() y structurally_equivalent()que producen respectivamente un iterador a través de los nodos Var y comprueban si dos instancias Expr instancias son estructuralmente iguales, hasta cierto mapeo de los nodos Var nodos contenidos.

  • Se ha añadido la función lift_legacy_condition() que se puede utilizar para convertir condiciones de estilo antiguo en nodos de estilo nuevo Expr nuevos. Tenga en cuenta que estos nodos de expresión no están permitidos en los campos de estilo antiguo Instruction.condition que van a ser sustituidos por métodos clásicos más avanzados como IfElseOp.

  • Se ha añadido soporte para tomar valores absolutos de ParameterExpressions. Por ejemplo, ahora es posible

    from qiskit.circuit import QuantumCircuit, Parameter
    
    x = Parameter("x")
    circuit = QuantumCircuit(1)
    circuit.rx(abs(x), 0)
    
    bound = circuit.bind_parameters({x: -1})
  • El rendimiento de QuantumCircuit.assign_parameters() y bind_parameters() ha aumentado significativamente para circuitos grandes con estructuras típicas de los usos de las aplicaciones. Esto incluye la mayoría de los circuitos basados en la NLocal estructura, como EfficientSU2. Ver #10282 para más detalles.

  • El método QuantumCircuit.assign_parameters() ha ganado dos nuevos argumentos clave: flat_input y strict. Se trata de opciones avanzadas que se pueden utilizar para acelerar el método cuando se pasan las vinculaciones de parámetros como un diccionario; flat_input=True es una garantía de que las claves del diccionario sólo contienen Parameter (no ParameterVectors), y strict=False permite que el diccionario contenga parámetros que no están presentes en el circuito. El uso de estas dos opciones puede reducir la sobrecarga de la normalización de la entrada en esta función.

  • Añadido un nuevo argumento de palabra clave flatten al constructor de las siguientes clases:

    Si este argumento se establece en True , la subclase QuantumCircuit subclase generada no envolverá la implementación en Gate o Instruction objetos. Aunque esto no es óptimo para la visualización, suele mejorar mucho el rendimiento en tiempo de ejecución, especialmente con QuantumCircuit.bind_parameters() y QuantumCircuit.assign_parameters() que pueden ver una mejora substacial en el tiempo de ejecución con una salida aplanada en comparación con la salida anidada envuelta por defecto.

  • Se ha añadido soporte para construir LinearFunctions a partir de circuitos cuánticos más generales, que pueden contener:

    • Barreras (de tipo Barrier) y retardos (Delay), que simplemente se ignoran
    • Permutaciones (de tipo PermutationGate)
    • Otras funciones lineales
    • Cliffords (de tipo Clifford), cuando el Clifford representa una función lineal (y se lanza una excepción CircuitError en caso contrario)
    • Circuitos cuánticos anidados de esta forma
  • Añadido el método LinearFunction.__eq__() . Dos objetos de tipo LinearFunction se consideran iguales cuando sus representaciones como matrices binarias invertibles son iguales.

  • Añadido el método LinearFunction.extend_with_identity() que permite extender una función lineal sobre k qubits a una función lineal sobre n >= k qubits, especificando las nuevas posiciones de los qubits originales y rellenando con identidades los qubits restantes.

  • Añadidos dos métodos para pretty-printing LinearFunction objetos: LinearFunction.mat_str(), que devuelve la representación en cadena de la función lineal vista como una matriz con entradas 0/1, y LinearFunction.function_str()que devuelve la representación en cadena de la función lineal vista como una transformación lineal.

  • Las instrucciones StatePreparation y Initialize, y sus métodos de circuito asociados QuantumCircuit.prepare_state() y initialize()ganaron un argumento de palabra clave normalize, que puede establecerse en True para normalizar automáticamente un array objetivo. Por defecto es False, que mantiene el comportamiento actual de lanzar una excepción cuando se recibe una entrada no normalizada.

Características de los algoritmos
  • Se ha añadido la opción de pasar una llamada de retorno al UMDA optimizador, que permite realizar un seguimiento del número de evaluaciones de la función, los parámetros actuales y el mejor valor de función alcanzado.
OpenQASM Características
  • Los exportadores de OpenQASM 3 (qasm3.dump(), dumps() y Exporter) tienen un nuevo argumento allow_aliasing , que acabará sustituyendo al argumento alias_classical_registers . Controla si se permite el aliasing para bits clásicos o qubits, en lugar de que la opción sólo esté disponible para bits clásicos.
Características de la información cuántica
  • Añadida una nueva función negativity() que calcula la medida de entrelazamiento de negatividad de un estado cuántico. A continuación se ofrece un ejemplo de uso de la función anterior:

    from qiskit.quantum_info.states.densitymatrix import DensityMatrix
    from qiskit.quantum_info.states.statevector import Statevector
    from qiskit.quantum_info import negativity
    import numpy as np
    
    # Constructing a two-qubit bell state vector
    state = np.array([0, 1/np.sqrt(2), -1/np.sqrt(2), 0])
    # Calculating negativity of statevector
    negv = negativity(Statevector(state), [1])
    
    # Creating the Density Matrix (DM)
    rho = DensityMatrix.from_label("10+")
    # Calculating negativity of DM
    negv2 = negativity(rho, [0, 1])
  • Añadida la función schmidt_decomposition(). Esta función funciona con las funciones Statevector y DensityMatrix para estados puros bipartitos.

  • Añade soporte para la multiplicación de SparsePauliOp objetos con Parameter objetos utilizando el operador *, por ejemplo:

    from qiskit.circuit import Parameter
    from qiskit.quantum_info import SparsePauliOp
    
    param = Parameter("a")
    op = SparsePauliOp("X")
    param * op
Características de Pulse
  • Se ha ampliado la biblioteca SymbolicPulse biblioteca se amplió. Las nuevas funciones de pulso de la biblioteca son:

    Las nuevas funciones devuelven una instancia de ScalableSymbolicPulse , y coinciden con la funcionalidad de las funciones correspondientes de la biblioteca de pulsos discretos, con la excepción de Square() para la que una fase de 2π2\pi se desplaza un ciclo completo (a diferencia de la función discreta square() donde dicho desplazamiento era inducido por una fase de π\pi ).

  • El método filter() se activa en la ScheduleBlock clase. Este método permite a los usuarios conservar sólo Instruction objetos que pasen todos los filtros proporcionados. Como condiciones de filtro incorporadas, pulse Channel instancia de subclase y Instruction se pueden especificar. Los callbacks definidos por el usuario que toman Instruction a los filtros.

  • El método exclude() se activa en la ScheduleBlock clase. Este método permite a los usuarios conservar sólo Instruction objetos que no pasen al menos uno de todos los filtros proporcionados. Como condiciones de filtro incorporadas, pulse Channel instancia de subclase y Instruction se pueden especificar. Los callbacks definidos por el usuario que toman Instruction a los filtros. Este método es el complemento de filter(), por lo que siempre se cumple la siguiente condición: block.filter(*filters) + block.exclude(*filters) == block en términos de instrucciones incluidas, donde block es una ScheduleBlock instancia.

  • Se ha añadido una nueva función gaussian_square_echo() a la biblioteca de impulsos. El impulso devuelto se compone de tres GaussianSquare pulsos. Los dos primeros son impulsos de eco con una duración de la mitad de la duración total e implementan tonos giratorios. El tercer pulso es un tono de cancelación que dura toda la duración del pulso e implementa la corrección de rotaciones de qubits individuales.

  • QPY admite los objetos Discriminator y Kernel . Esta función permite a los usuarios serializar y deserializar las Acquire instrucciones con estos objetos utilizando QPY.

Características de síntesis
  • Añadida una nueva función de síntesis synth_cx_cz_depth_line_my() que produce la forma de circuito de un circuito CX seguido de un circuito CZ para conectividad de vecino más cercano lineal (LNN) en profundidad de 2 qubits de como máximo 5n, utilizando CX y puertas de fase (S, Sdg o Z). El algoritmo de síntesis se basa en el trabajo de Maslov y Yang, arXiv:2210.16195.

    El algoritmo acepta una matriz binaria invertible mat_x que representa el circuito CX, una matriz binaria simétrica mat_z que representa el circuito CZ, y devuelve un circuito cuántico con una profundidad de 2 qubits de como máximo 5n que calcula la composición de los circuitos CX y CZ. El siguiente ejemplo ilustra la nueva funcionalidad:

    import numpy as np
    from qiskit.synthesis.linear_phase import synth_cx_cz_depth_line_my
    mat_x = np.array([[0, 1], [1, 1]])
    mat_z = np.array([[0, 1], [1, 0]])
    qc = synth_cx_cz_depth_line_my(mat_x, mat_z)

    Esta función se utiliza ahora por defecto en el algoritmo de síntesis de Clifford synth_clifford_depth_lnn() que optimiza la profundidad de 2 qubits para la conectividad LNN, mejorando la profundidad de 2 qubits de 9n+4 a 7n+2. El algoritmo de síntesis clifford puede utilizarse del siguiente modo:

    from qiskit.quantum_info import random_clifford
    from qiskit.synthesis import synth_clifford_depth_lnn
    
    cliff = random_clifford(3)
    qc = synth_clifford_depth_lnn(cliff)

    La síntesis anterior puede mejorarse aún más, como se describe en el artículo de Maslov y Yang, utilizando la optimización local entre capas de 2 qubits. Esta mejora se deja para trabajos posteriores.

Funciones de visualización
  • QuantumCircuit.draw() y la función circuit_drawer() cuando se utiliza la opción output='mpl' soportan ahora el dibujo de los bloques de circuitos anidados de ControlFlowOp operaciones, incluyendo if, else, while, for, y switch/case. Los bloques de circuitos se envuelven con cajas para delimitar los circuitos.

  • Se han suavizado algunas restricciones a la hora de utilizar wire_order en los cajones de los circuitos. Ahora, wire_order puede listar sólo qubits y, en ese caso, se puede utilizar con cregbundle=True, ya que no afectará a los bits clásicos.

    from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qr = QuantumRegister(4, "q")
    cr = ClassicalRegister(4, "c")
    cr2 = ClassicalRegister(2, "ca")
    circuit = QuantumCircuit(qr, cr, cr2)
    circuit.h(0)
    circuit.h(3)
    circuit.x(1)
    circuit.x(3).c_if(cr, 10)
    circuit.draw('text', wire_order=[2, 3, 0, 1], cregbundle=True)
     q_2: ────────────
          ┌───┐ ┌───┐
     q_3: ┤ H ├─┤ X ├─
          ├───┤ └─╥─┘
     q_0: ┤ H ├───╫───
          ├───┤   ║
     q_1: ┤ X ├───╫───
          └───┘┌──╨──┐
     c: 4/═════╡ 0xa
               └─────┘
    ca: 2/════════════
Herramientas Opciones

Notas de actualización

  • Qiskit Terra 0.25 ha abandonado el soporte para Python 3.7 siguiendo las advertencias de depreciación iniciadas en Qiskit Terra 0.23. Esto es coherente con Python 3.7’s final de su vida útil el 27 de junio de 2023. Para seguir utilizando Qiskit, debes actualizarte a una versión más reciente de Python.

  • Qiskit Terra 0.25 ahora requiere la versison 0.13.0 de rustworkx.

  • Por defecto Qiskit construye sus extensiones compiladas usando la ABI Estable de Python con soporte hasta la versión más antigua de Python soportada por Qiskit (actualmente 3.8 ). Esto significa que, en el futuro, habrá una única rueda precompilada que se entregará en el momento del lanzamiento y que funcionará con todas las versiones de Qiskit compatibles con Python. No se espera ninguna diferencia de rendimiento en tiempo de ejecución utilizando la API limitada, por lo que ahora está activada por defecto para todas las compilaciones. Anteriormente, las extensiones compiladas se construían utilizando la API específica de la versión y sólo funcionaban con una única versión de Python. Este cambio se realizó para reducir el número de archivos de paquetes que tenemos que crear y publicar en cada versión. Al construir Qiskit desde el código fuente, no debería haber cambios necesarios en el proceso de construcción, excepto que las etiquetas por defecto en los nombres de archivo de salida serán diferentes para reflejar el uso de la API limitada.

Notas sobre la actualización del transpilador
  • Se elimina la posibilidad de pasar listas de valores de argumentos a la función transpile() se ha eliminado. Esta funcionalidad quedó obsoleta en la versión 0.23.0. Aún puede pasar una lista de objetos QuantumCircuit como primer argumento posicional. Lo que se ha eliminado es la difusión de la lista de los otros argumentos a cada circuito en esa lista de entrada. La eliminación de esta funcionalidad era necesaria para reducir en gran medida la sobrecarga de la ejecución paralela para transpilar varios circuitos a la vez. Si está utilizando esta funcionalidad actualmente, puede llamar a transpile() varias veces. Por ejemplo, si antes hacías algo como:

    from qiskit.transpiler import CouplingMap
    from qiskit import QuantumCircuit
    from qiskit import transpile
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)]
    results = transpile([qc] * 6, coupling_map=cmaps)

    en su lugar, ahora debería ejecutar algo como

    from qiskit.transpiler import CouplingMap
    from qiskit import QuantumCircuit
    from qiskit import transpile
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)]
    results = [transpile(qc, coupling_map=cm) for cm in cmap]

    También puede aprovechar parallel_map() o multiprocessing de la biblioteca estándar Python si desea ejecutar esto en paralelo.

  • La familia Sabre de pases transpilares (a saber SabreLayout y SabreSwap) se utilizan ahora por defecto para todos los circuitos cuando se invoca al transpilador en el nivel de optimización 1 (por ejemplo, llamando a transpile() o generate_preset_pass_manager() con el argumento optimization_level=1). Anteriormente, los circuitos con operaciones de flujo de control utilizaban DenseLayout y StochasticSwap con este perfil.

Notas sobre la actualización de circuitos
  • Los métodos del constructor OpenQASM 2 en QuantumCircuit (from_qasm_str() y from_qasm_file()) se han cambiado para utilizar el analizador sintáctico basado en Rust añadido en Qiskit Terra 0.24. Esto debería acelerar considerablemente los tiempos de análisis (10 veces o más no es raro) y reducir masivamente el uso de memoria intermedia.

    Los métodos de QuantumCircuit se mantienen con la misma interfaz por continuidad; la forma preferida de acceder al importador de OpenQASM 2 es utilizar qasm2.load() y qasm2.loads()que ofrecen una interfaz ampliada para controlar el análisis sintáctico y la construcción.

  • Se ha eliminado el argumento obsoleto circuit_cregs del constructor de la clase InstructionSet ha sido eliminado. Se eliminó en la versión 0.19.0. Si utiliza este argumento y construye manualmente un objeto InstructionSet (lo que debería ser bastante infrecuente, ya que se utiliza sobre todo internamente), debería pasar un callable al argumento de la palabra clave resource_requester en su lugar. Por ejemplo:

    from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet
    from qiskit.circuit.exceptions import CircuitError
    
    def my_requester(bits, registers):
        bits_set = set(bits)
        bits_flat = tuple(bits)
        registers_set = set(registers)
    
        def requester(specifier):
            if isinstance(specifer, Clbit) and specifier in bits_set:
                return specifier
            if isinstance(specifer, ClassicalRegster) and specifier in register_set:
                return specifier
            if isinstance(specifier, int) and 0 <= specifier < len(bits_flat):
                return bits_flat[specifier]
            raise CircuitError(f"Unknown resource: {specifier}")
    
        return requester
    
    my_bits = [Clbit() for _ in [None]*5]
    my_registers = [ClassicalRegister(n) for n in range(3)]
    
    InstructionSet(resource_requester=my_requester(my_bits, my_registers))
OpenQASM Notas sobre la actualización
  • Los métodos del constructor OpenQASM 2 en QuantumCircuit (from_qasm_str() y from_qasm_file()) se han cambiado para utilizar el analizador sintáctico basado en Rust añadido en Qiskit Terra 0.24. Esto debería acelerar considerablemente los tiempos de análisis (10 veces o más no es raro) y reducir masivamente el uso de memoria intermedia.

    Los métodos de QuantumCircuit se mantienen con la misma interfaz por continuidad; la forma preferida de acceder al importador de OpenQASM 2 es utilizar qasm2.load() y qasm2.loads()que ofrecen una interfaz ampliada para controlar el análisis sintáctico y la construcción.

  • Los exportadores de OpenQASM 3 (qasm3.dump(), dumps() y Exporter) utilizarán ahora menos definiciones de "alias de registro" en su salida. El circuito descrito no cambiará, pero ahora exportará preferentemente en términos de tipos directos bit, qubit y qubit[n] en lugar de producir un registro _loose_bits y aliasear más registros a partir de éste. Esto se hace para minimizar el número de funciones avanzadas de OpenQASM 3 en uso y para evitar introducir una estructura de matrices innecesaria en programas que no la necesitan.

Notas sobre la actualización de la información cuántica
  • Clifford.from_circuit() ya no intentará resolver instrucciones cuyos definition sean mutuamente recursivas con algún otro objeto. Tales definiciones recursivas ya suponen una violación del orden estrictamente jerárquico que requiere el campo definition y el código no debería confiar en que esto sea posible. Si desea definir equivalencias que puedan tener ciclos (mutuos), utilice un parámetro EquivalenceLibrary.
Notas sobre la actualización de la visualización
  • En el objeto interno ~qiskit.visualization.circuit.matplotlib.MatplotlibDrawer se han eliminado los argumentos layout, global_phase, qregs y cregs . Originalmente estaban obsoletos en Qiskit Terra 0.20. Estos objetos se infieren simplemente a partir de la dirección circuit .

    Se trata de una clase trabajadora interna de las rutinas de visualización. Es poco probable que tenga que cambiar nada de su código.

Herramientas Notas de actualización
  • Se ha eliminado la ubicación de importación qiskit.util , ya que había quedado obsoleta desde Qiskit Terra 0.17. Los usuarios deben utilizar la nueva ubicación de importación, qiskit.utils.

Notas sobre características en desuso

  • Las extensiones de los espacios de nombres qiskit y qiskit.providers por parte de paquetes externos han quedado obsoletas y los puntos de enganche que las permitían se eliminarán en una futura versión. En el pasado, el proyecto Qiskit se componía de elementos que ampliaban un espacio de nombres compartido y estos puntos de enganche permitían hacerlo. Sin embargo, no se pretendía que estas interfaces fueran utilizadas nunca por otros paquetes. Ahora que el paquete general Qiskit ya no utiliza ese modelo de empaquetado, dejar la posibilidad de estas extensiones conlleva más riesgos que beneficios y, por lo tanto, se está obviando para su futura eliminación. Si mantienes un paquete que amplía el espacio de nombres de Qiskit (es decir, tus usuarios importan de qiskit.x o qiskit.providers.y) deberías pasar a utilizar un espacio de nombres independiente Python para tu paquete. No se generará ninguna advertencia como parte de esto porque no hay ningún método para inyectar una advertencia a nivel de paquete que sería necesaria para advertir a los paquetes externos de este cambio.

  • El diccionario qiskit.__qiskit_version__ está obsoleto, ya que Qiskit se define con un único paquete (qiskit-terra). En el futuro, qiskit.__version__ será el único punto para consultar la versión de Qiskit, como una cadena estándar.

Deprecaciones del transpilador
  • La función get_vf2_call_limit disponible a través del módulo qiskit.transpiler.preset_passmanagers.common ha quedado obsoleta. Es probable que esto afecte a muy pocos usuarios, ya que esta función no se exportó explícitamente ni se documentó. Su funcionalidad ha sido sustituida y ampliada por una función del mismo módulo.
Circuitos obsoletos
  • El método qasm() y todos los métodos anulados de las subclases de :class:~qiskit.circuit.Instruction están obsoletos. No existe un sustituto para generar una cadena OpenQASM2 para una instrucción aislada, ya que normalmente un objeto de instrucción aislado tiene un contexto insuficiente para generar completamente una cadena OpenQASM2 válida. Si actualmente confía en este método, tendrá que recurrir al exportador OpenQASM2 : QuantumCircuit.qasm() para generar el OpenQASM2 para un objeto de circuito entero.
Desuso de algoritmos
  • El módulo qiskit.algorithms ha quedado obsoleto y se eliminará en una próxima versión. Ha sido sustituida por una nueva biblioteca independiente qiskit-algorithms que puede encontrarse en PyPi o en Github aquí:

    https://github.com/qiskit-community/qiskit-algorithms

    El módulo qiskit.algorithms seguirá funcionando como hasta ahora y se corregirán errores hasta su futura eliminación, pero el desarrollo activo de nuevas funciones se ha trasladado al nuevo paquete. Si depende de qiskit.algorithms debe actualizar sus requisitos de Python para incluir también qiskit-algorithms y actualizar las importaciones de qiskit.algorithms a qiskit_algorithms. Tenga en cuenta que este nuevo paquete no incluye el código de algoritmos ya obsoletos, incluidos los algoritmos basados en opflow y QuantumInstance. Si aún no ha migrado de algoritmos basados en QuantumInstance a algoritmos basados en primitivas, debe seguir las directrices de migración de https://qisk.it/algo _migration. La decisión de migrar el módulo algorithms a un paquete independiente para aclarar el propósito de Qiskit y distinguir entre las herramientas y las bibliotecas creadas sobre él.

Deprecaciones de Pulse
  • Inicialización de un ScalableSymbolicPulse con valor complejo para amp. Este cambio también afecta a los siguientes pulsos de biblioteca:

    La inicialización de amp con un valor complejo también ha quedado obsoleta.

    En su lugar, utilice dos valores flotantes al especificar los parámetros amp y angle , donde amp representa la magnitud de la amplitud compleja y angle representa el ángulo de la amplitud compleja. es decir, la amplitud compleja viene dada por amp×exp(i×angle)\texttt{amp} \times \exp(i \times \texttt{angle}).

  • La instrucción Call ha quedado obsoleta y se eliminará en futuras versiones. En su lugar, utilice la función call() del módulo qiskit.pulse.builder dentro de un contexto de construcción activo.

Herramientas Características en desuso
  • La magia Jupyter %circuit_library_info y los objetos en qiskit.tools.jupyter.library que llama a su vez:

    • circuit_data_table
    • properties_widget
    • qasm_widget
    • circuit_digram_widget
    • circuit_library_widget

    están obsoletos y se eliminarán en una futura versión. Estos objetos sólo estaban destinados a utilizarse en la compilación de la documentación. Ya no se utilizan allí, por lo que ya no reciben apoyo ni mantenimiento.

Problemas conocidos

  • Los circuitos que contienen expresiones clásicas realizadas con el módulo expr todavía no son compatibles con los visualizadores de circuitos.

Corrección de errores

  • Se ha corregido un error en Channel por el que la validación del índice se realizaba de forma incorrecta y sólo generaba un error cuando el índice era tanto no entero como negativo, en lugar de cualquiera de los dos.

  • Se ha solucionado un problema con la función transpile() y todos los gestores de pases predefinidos generados mediante generate_preset_pass_manager() donde la salida QuantumCircuit del objeto layout del objeto de salida tenía un atributo TranspileLayout.final_layout no válido. Esto ocurriría en escenarios en los que el VF2PostLayout se ejecutaría y encontraría un diseño inicial alternativo con menores tasas de error. Al modificar el diseño inicial, el atributo final_layout nunca se actualizó para reflejar este cambio. Esto se ha corregido para que final_layout refleje siempre correctamente la permutación de salida provocada por la etapa de enrutamiento. Corregido #10457

  • El analizador OpenQASM 2 (qasm2.load() y loads()) ejecutado en modo strict emitirá ahora correctamente un error si una sentencia barrier no tiene argumentos. Cuando se ejecuta en el modo más permisivo (por defecto), una sentencia barrier sin argumento continuará causando una barrera en todos los qubits actualmente en el ámbito (los qubits a los que afecta una definición de puerta, o todos los qubits definidos por un programa, si la sentencia está en un cuerpo de puerta o en el ámbito global, respectivamente).

  • El exportador OpenQASM 2 (QuantumCircuit.qasm()) ya no intentará emitir sentencias barrier que no actúen sobre qubits. Tal declaración de barrera tampoco tiene efecto en Qiskit, pero no es válida OpenQASM 2.

  • Qiskit puede representar instrucciones personalizadas que actúan sobre qubits cero, o sobre un número distinto de cero de bits clásicos. No se pueden exportar a OpenQASM 2, pero antes QuantumCircuit.qasm() lo intentaba, y la salida no era válida OpenQASM 2. En su lugar, ahora se mostrará correctamente un QASM2ExportError correctamente. Ver #7351 y #10435.

  • Se ha corregido un problema con el uso de Targets sin acoplar mapas con el FullAncillaAllocation transpiler pass. En este caso, FullAncillaAllocation añadirá ahora qubits ancilla para que el número de qubits en el DAGCircuit coincida con el de Target.num_qubits.

  • DAGCircuit.substitute_node() ya no sobrescribirá silenciosamente una condición existente en el reemplazo dado op. Si propagate_condition está configurado como True (el valor predeterminado), en su lugar se mostrará un mensaje DAGCircuitError en su lugar.

  • Un circuito parametrizado que contiene una puerta personalizada cuya definición tiene una fase global parametrizada puede ahora enlazar correctamente el parámetro en la fase global interna. Ver #10283 para más detalles.

  • Construcción de un Statevector a partir de un QuantumCircuit que contenga operaciones de qubit cero ya no generará un error. Estas operaciones confieren una fase global al vector de estado resultante.

  • La interfaz del constructor de flujo de control ahora incluirá correctamente ClassicalRegister recursos de sentencias switch anidadas en sus ámbitos de circuito contenedor. Ver #10398.

  • Se ha corregido un problema en QuantumCircuit.decompose() por el que al pasar un nombre de circuito a la función que coincidía con un nombre de puerta compuesta no se descomponía la puerta si también tenía asignada una etiqueta. Corregido #9136

  • Se ha corregido un problema con qiskit.visualization.plot_histogram() por el que la leyenda relativa no aparecía cuando el conjunto de datos dado tenía un valor cero en la primera posición. Ver #10158 para más detalles.

  • Se ha corregido un fallo con el método Target.update_from_instruction_schedule_map() desencadenado por el inst_map dado que contiene un Schedule con duraciones no asignadas.

  • Cuando el parámetro conditional=True se especifica en random_circuit()las operaciones condicionales en el circuito resultante irán ahora precedidas de una medición completa a mitad de circuito. Correcciones #9016

  • Se han mejorado las anotaciones de tipo en el método QuantumCircuit.assign_parameters() para reflejar el cambio en el tipo de retorno en función del argumento inplace .

  • Los métodos de construcción de circuitos OpenQASM 2 (QuantumCircuit.from_qasm_str() y from_qasm_file()) ya no darán error al encontrar una definición gate que contenga instrucciones U o CX . Ver #5536.

  • Reducción de la sobrecarga del ConsolidateBlocks realizando operaciones matriciales en todos los bloques de dos qubits en lugar de crear una instancia de QuantumCircuit y pasarlo a un bloque Operator. El aumento de velocidad sólo será aplicable cuando se consoliden bloques de dos qubits. Todo lo que supere este valor seguirá siendo gestionado por la clase Operator clase. Consulta el nº 8779 para más detalles.

  • El exportador OpenQASM 3 (qiskit.qasm3) ya no mostrará OpenQASM 3 inválido para instancias no unitarias Instruction sino que mostrará un mensaje QASM3ExporterError explicando que aún no están soportadas. Esta función está prevista para una versión posterior de Qiskit, cuando haya más funciones de procesamiento clásico en toda la biblioteca.

  • Soluciona el problema nº 10185.

  • Solucionado un problema con la función state_to_latex(). Anteriormente, producía LaTeX no válidos con un redondeo involuntario de los coeficientes, lo que provocaba errores al llamar a state_drawer(). Corregido #9297.

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