Skip to main content
IBM Quantum Platform

Qiskit 0.44 Versionshinweise


Versionsverlauf

Dies ist die letzte Version, in der qiskit ein "Meta-Paket" war, das mehrere verschiedene "Elemente" enthielt. Was in diesen (und früheren) Versionshinweisen als "Qiskit Terra" bezeichnet wird, ist im Wesentlichen das, was jetzt einfach "Qiskit" genannt wird.

In dieser Tabelle werden die Versionen der Meta-Pakete und die Versionen der einzelnen installierten Qiskit-Legacy-Elemente aufgeführt:

Version des Qiskit-Metapakets
qiskit-terra
qiskit-aer
qiskit-ignis
qiskit-ibmq-provider
qiskit-aqua
Freigabedatum
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.331.03.2022
0.34.20.19.20.10.30.7.00.18.32022-02-09
0.34.10.19.10.10.20.7.00.18.305.01.2022
0.34.00.19.10.10.10.7.00.18.32021-12-20
0.33.10.19.10.9.10.7.00.18.210.12.2021
0.33.00.19.00.9.10.7.00.18.12021-12-06
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.510.11.2021
0.31.00.18.30.9.10.6.00.17.00.9.52021-10-12
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.52021-09-10
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.111.05.2021
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.02021-04-02
0.24.10.16.40.7.60.5.20.12.20.8.22021-03-24
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.112.11.2020
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.516.09.2020
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.319.06.2020
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.12020-06-02
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.62020-04-20
0.18.00.13.00.5.00.3.00.6.00.6.52020-04-09
0.17.00.12.00.4.10.2.00.6.00.6.501.04.2020
0.16.20.12.00.4.10.2.00.5.00.6.52020-03-20
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.42020-02-06
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.12019-12-10
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.02019-08-22
0.11.20.8.20.2.30.1.10.3.20.5.52019-08-20
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.129.05.2019
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.007.05.2019
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.22019-02-19
0.7.2>=0.7,<0.8>=0.1,<0.22019-01-22
0.7.1>=0.7,<0.8>=0.1,<0.22019-01-17
0.7.0>=0.7,<0.8>=0.1,<0.22018-12-14
Note

Für die Meta-Paketversionen 0.7.0, 0.7.1 und 0.7.2 wurde die Strategie zur Versionierung der Meta-Pakete noch nicht formalisiert.


0.44.1

Terra- 0.25.1

Vorspiel

Qiskit Terra 0.25.1 ist eine Fehlerbehebungsversion, die einige Probleme behebt, die seit der Version 0.25.1 festgestellt wurden.

Fehlerkorrekturen

  • Es wurde ein Fehler in der QPY-Serialisierung (qiskit.qpy), bei dem mehrere kontrollierte benutzerdefinierte Gatter in einer Schaltung zu einer ungültigen QPY-Datei führen konnten, die nicht geparst werden konnte. Behoben #9746.

  • #9363. behoben, indem die nicht-registerlose Synthese in der Reihenfolge gekennzeichnet wurde, in der Tweedledum zurückkehrt. Vergleichen Sie zum Beispiel dieses Beispiel vor und nach der Korrektur:

    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())

    Das würde bedeuten, dass

         Before             After
    
         c: ──■──           a: ──■──
              │                  │
         b: ──■──           b: ──■──
              │                  │
         a: ──o──           c: ──o──
            ┌─┴─┐              ┌─┴─┐
    return: ┤ X ├      return: ┤ X ├
            └───┘              └───┘
  • Festgelegt wurde plot_state_paulivec(), wodurch die Zustandskoeffizienten zuvor um einen Faktor von 2n2^n gedämpft wurden, wobei nn die Anzahl der Qubits ist. Jetzt zeigt das Balkendiagramm die Koeffizienten korrekt als Tr(σρ)\mathrm{Tr}(\sigma\rho) an, wobei ρ\rho der darzustellende Zustand ist und σ\sigma über alle möglichen Tensorprodukte von Ein-Qubit-Paulis iteriert.

  • Winkel im OpenQASM 2 Exporter (QuantumCircuit.qasm()) enthalten nun immer einen Dezimalpunkt, z.B. im Fall von 1.e-5. Dies wird durch eine strenge Auslegung der Spezifikation von Gleitkomma-Literalen in OpenQASM 2 gefordert. Der OpenQASM 2 Parser von Qiskit (qasm2.load() und loads()) ist standardmäßig freizügiger und erlaubt 1e-5 ohne Dezimalpunkt, es sei denn, er befindet sich im Modus strict .

  • Der Setter für SparsePauliOp.paulis weist nun Versuche, das Attribut mit falsch geformten Daten zu setzen, korrekt zurück, anstatt stillschweigend zuzulassen, dass ein ungültiges Objekt erstellt wird. Siehe #10384.

  • Behebung einer Leistungsminderung in den SabreLayout und SabreSwap transpiler-Durchläufen. Behoben #10650


0.44.0

Diese Version markiert offiziell das Ende der Unterstützung für das Qiskit IBMQ Provider Paket und die Entfernung von Qiskit Aer aus dem Qiskit Metapaket. Nach dieser Veröffentlichung enthält das Metapaket nur noch Qiskit Terra, so dass wir das Qiskit-Metapaket und Qiskit Terra als getrennte Dinge bezeichnen werden. Ab der nächsten Version Qiskit 0.45.0 wird das Qiskit-Paket nur noch das sein, was vorher Qiskit Terra war, und es wird keine Trennung mehr zwischen ihnen geben.

Wenn Sie noch das Paket qiskit-ibmq-provider verwenden, wurde es jetzt eingestellt und wird nicht mehr unterstützt. Sie sollten den Links zu den Migrationsanleitungen in der README für das Paket folgen, um auf die neuen Ersatzpakete qiskit-ibm-provider, qiskit-ibm-runtime und qiskit-ibm-experiment umzusteigen:

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

Das Qiskit Aer Projekt ist immer noch aktiv und wird weiter gepflegt, es ist nur nicht mehr Teil des qiskit Pakets. Um qiskit-aer weiter zu verwenden, müssen Sie qiskit-aer explizit installieren und das Paket von qiskit_aer importieren.

Da dies die letzte Version des Qiskit-Metapakets ist, werden die folgenden setuptools-Extras zur Installation optionaler Abhängigkeiten in der nächsten Version von Qiskit nicht mehr funktionieren 0.45.0:

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

Wenn Sie die Extras verwenden, um Pakete zu installieren, sollten Sie dazu übergehen, die Pakete direkt zu verwenden und nicht die Extras. Wenn Sie z. B. zuvor pip install qiskit[experiments] verwendet haben, sollten Sie zu pip install qiskit qiskit-experiments wechseln, um beide Pakete zu installieren. Ebenso wird das all extra (was über pip install "qiskit[all]" installiert wird) diese Pakete in Qiskit 0.45.0 nicht mehr enthalten.

Terra- 0.25.0

Vorspiel

Die Highlights der Qiskit Terra 0.25.0 Version sind:

  • Kontrollflussoperationen werden nun durch den Transpiler auf allen Optimierungsebenen unterstützt, einschließlich der Ebenen 2 und 3 (z. B. Aufruf von transpile() oder generate_preset_pass_manager() mit dem Schlüsselwortargument optimization_level , das als 2 oder 3 angegeben ist, wird jetzt unterstützt).

  • Die Felder IfElseOp.condition, WhileLoopOp.condition und SwitchCaseOp.target können nun Instanzen des neuen Laufzeittyps für klassische Ausdrücke sein expr.Expr. Dies unterscheidet sich von ParameterExpression weil es zur Laufzeit für Backends ausgewertet wird, die solche Operationen unterstützen.

    Diese neuen Ausdrücke sind wesentlich leistungsfähiger als die alte Zwei-Tupel-Form zur Angabe der klassischen Bedingungen. Zum Beispiel kann man jetzt Gleichheitsbedingungen zwischen zwei verschiedenen klassischen Registern oder das logische "oder" zweier klassischer Bits darstellen. Diese beiden Beispiele würden wie folgt aussehen:

    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)

    Weitere Beispiele finden Sie in der Dokumentation zu qiskit.circuit.classical.

    Diese Funktion ist sowohl für Qiskit als auch für die verfügbare Quantenhardware, mit der Qiskit arbeitet, neu. Da sich die Funktionen noch in der Entwicklung befinden, wird es wahrscheinlich an einigen Stellen unerwartete Probleme geben, die erst nach einiger Zeit gelöst werden können. Wenn Sie ein Problem mit der Unterstützung oder der Verwendung des klassischen Ausdrucks haben, wenden Sie sich bitte an Qiskit oder Ihren Hardwarehersteller.

    In dieser ersten Version hat Qiskit die Operationen hinzugefügt:

    Diese können auf Python Integer- und Boolesche Literale wirken, oder auf ClassicalRegister und Clbit instanzen wirken.

    Alle diese klassischen Ausdrücke werden durch den Qiskit-Transpiler-Stack, durch die QPY-Serialisierung (qiskit.qpy) und für den Export nach OpenQASM 3 (qiskit.qasm3). Der Import von OpenQASM 3 wird derzeit von einem separaten Paket verwaltet (das über qiskit.qasm3), das hoffentlich erweitert wird, um den neuen Funktionen in Qiskit zu entsprechen.

  • Das Modul qiskit.algorithms modul ist veraltet und wird in einer zukünftigen Version entfernt werden. Sie wurde durch eine neue, eigenständige Bibliothek qiskit-algorithms ersetzt, die unter PyPi oder auf Github hier zu finden ist:

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

    Das qiskit.algorithms modul wird weiterhin wie bisher funktionieren und Fehler werden bis zu seiner zukünftigen Entfernung behoben, aber die aktive Entwicklung neuer Funktionen wurde in das neue Paket verlagert. Wenn Sie sich auf qiskit.algorithms verwenden, sollten Sie die Anforderungen von Python aktualisieren, um auch qiskit-algorithms einzubeziehen und die Importe von qiskit.algorithms auf qiskit_algorithms zu aktualisieren. Bitte beachten Sie, dass dieses neue Paket keinen Code für bereits veraltete Algorithmen enthält, einschließlich opflow und QuantumInstance-basierter Algorithmen. Wenn Sie noch nicht von QuantumInstance-basierten zu primitiv-basierten Algorithmen migriert haben, sollten Sie die Migrationsrichtlinien in https://qisk.it/algo _migration befolgen. Die Entscheidung zur Migration des algorithms modul in ein separates Paket zu migrieren, wurde getroffen, um den Zweck von Qiskit zu verdeutlichen und eine Unterscheidung zwischen den darauf aufbauenden Werkzeugen und Bibliotheken zu treffen.

Qiskit Terra 0.25 hat die Unterstützung für Python 3.7 eingestellt, nachdem in Qiskit Terra 0.23 Warnungen vor der Veralterung ausgegeben wurden. Dies steht im Einklang mit Python 3.7’s, dessen Lebensdauer am 27. Juni 2023 endet. Um Qiskit weiterhin nutzen zu können, müssen Sie ein Upgrade auf eine neuere Version von Python durchführen.

Neue Funktionen

  • Die folgenden Funktionen wurden in dieser Version hinzugefügt.
Transpiler-Funktionen
  • Zwei neue Optionen wurden zu BlockCollector hinzugefügt.

    Die erste neue Option split_layers erlaubt es, gesammelte Blöcke in Unterblöcke über disjunkte Qubit-Teilmengen aufzuteilen, d.h. in depth-1 Unterblöcke.

    Die zweite neue Option collect_from_back ermöglicht es, Blöcke ausgehend von den Ausgängen der Schaltung gierig zu sammeln. Dies ist wichtig in Verbindung mit ALAP-Planungsdurchläufen, bei denen wir es vorziehen können, Gates in die späteren statt in die früheren Blöcke zu setzen.

  • Neue Optionen split_layers und collect_from_back wurden zu CollectLinearFunctions und CollectCliffords transpiler-Pässe.

    Wenn split_layers True ist, werden die gesammelten Blöcke in Unterblöcke über disjunkte Qubit-Teilmengen aufgeteilt, d.h. in depth-1 Unterblöcke. Sehen Sie sich dazu das folgende Beispiel an:

    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

    Die ursprüngliche Schaltung ist linear. Wenn man lineare Gatter sammelt, ohne sie in Schichten aufzuteilen, sollte man am Ende eine einzige lineare Funktion erhalten. Wenn man jedoch lineare Gatter sammelt und in Schichten aufteilt, sollte man am Ende 4 lineare Funktionen haben.

    Wenn collect_from_back wahr ist, werden die Blöcke gierig von den Ausgängen zu den Eingängen der Schaltung gesammelt. Sehen Sie sich dazu das folgende Beispiel an:

    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)

    Die Originalschaltung enthält ein Hadamard-Gatter, so dass das CX(1, 0)-Gatter entweder mit CX(1, 2) oder mit SWAP(1, 2) kombiniert werden kann, aber nicht mit beiden. Wenn collect_from_back falsch ist, werden die linearen Blöcke vom Anfang der Schaltung an gierig gesammelt, und somit wird CX(1, 0) mit CX(1, 2) kombiniert. Wenn collect_from_back wahr ist, werden die linearen Blöcke am Ende der Schaltung gierig eingesammelt, und somit wird CX(1, 0) mit SWAP(1, 2) kombiniert.

  • Hinzugefügt DAGCircuit.classical_predecessors() und DAGCircuit.classical_successors()eine Alternative zur Auswahl klassischer Drähte, die keinen direkten Zugriff auf den inneren Graphen eines DAG-Knotens erfordert. Das folgende Beispiel veranschaulicht die neue Funktionalität:

    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))
  • Aktivierte Unterstützung für ControlFlowOp operationen im CommutativeCancellation pass. Zuvor wurden die Blöcke in Kontrollflussoperationen bei diesem Durchgang übersprungen.

  • Aktivierte Unterstützung für ControlFlowOp operationen im ConsolidateBlocks pass.

  • Hinzugefügt DAGCircuit.quantum_causal_cone() um den Kausalkonus eines Qubits in einem DAGCircuit. Das folgende Beispiel zeigt die korrekte Verwendung:

    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])
  • Eine neue Methode find_bit() wurde zu der DAGCircuit klasse hinzugefügt, die die Bitpositionen der angegebenen Qubit oder Clbit als Tupel mit dem Positionsindex des Bits innerhalb der Schaltung und einer Liste von Tupeln, die das Bit in den Registern der Schaltung lokalisieren, zurückgibt.

  • Die in den Transpiler eingebaute EquivalenceLibrary (qiskit.circuit.equivalence_library.SessionEquivalenceLibrary) wurden die zirkulären Pauli-Relationen X=iYZX = iYZ, Y=iZXY = iZX und Z=iXYZ = iXY beigebracht. Dies sollte die Transpilierung auf eingeschränkte und möglicherweise unvollständige Basissätze zuverlässiger machen. Siehe #10293 für weitere Einzelheiten.

  • Kontrollflussoperationen werden nun durch den Transpiler auf allen Optimierungsebenen unterstützt, einschließlich der Ebenen 2 und 3 (z. B. Aufruf von transpile() oder generate_preset_pass_manager() mit dem Schlüsselwortargument optimization_level=3).

  • DAGCircuit.substitute_node() ein Schlüsselwortargument propagate_condition gewonnen, das dem gleichen Argument in substitute_node_with_dag(). Durch die Einstellung False wird das bisherige Verhalten, eine Bedingung auf node auf die neue op zu kopieren, die sie ersetzt, nicht mehr angewendet.

    Diese Option wird bei allgemeinen Kontrollflussoperationen ignoriert, da diese niemals ihre Bedingung weitergeben oder eine Bedingung von einem anderen Knoten akzeptieren werden.

  • Es wurde eine neue Methode eingeführt, DAGCircuit.separable_circuits()eingeführt, die eine Liste von DAGCircuit objekten zurückgibt, eines für jeden Satz verbundener Qubits, die keine Gates haben, die sie mit einem anderen Satz verbinden.

    Jede DAGCircuit instanz, die von dieser Methode zurückgegeben wird, enthält die gleiche Anzahl von Clbits wie self. Diese Methode gibt keine DAGCircuit instanzen zurück, die nur aus Clbits bestehen.

  • Hinzufügen des Attributs Target.concurrent_measurements das eine Hardware-Beschränkung der gleichzeitig gemessenen Qubits darstellt. Diese Bedingung wird in Form einer verschachtelten Liste angegeben, in der jedes Element eine gemeinsam zu messende Qubit-Gruppe darstellt. Nachfolgend ein Beispiel:

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

    die Qubits 0 und 1 sowie 2, 3 und 4 werden auf dem Gerät gemeinsam gemessen. Diese Einschränkung blockiert nicht die Messung eines einzelnen Qubits, aber Sie müssen möglicherweise die Ausrichtung der Messoperationen für diese Qubits berücksichtigen, wenn Sie mit dem Qiskit Pulse Scheduler arbeiten und wenn Sie neue Transpiler-Passes schreiben, die zeitabhängig sind (d.h. Passes, die Scheduling durchführen).

  • Der Transpiler-Pass SetLayout kann nun mit einer Liste von Ganzzahlen erstellt werden, die die physikalischen Qubits darstellen, auf die der Quantenschaltkreis abgebildet wird. Das heißt, das erste Qubit in der Schaltung wird dem physischen Qubit an Position Null der Liste zugeordnet usw.

  • Der eingebaute Transpiler EquivalenceLibrary wurden weitere Pauli-Rotationsäquivalenzen zwischen den Ein-Qubit-Gattern RXR_X, RYR_Y und RZR_Z sowie zwischen den Zwei-Qubit-Gattern RXXR_{XX}, RYYR_{YY} und RZZR_{ZZ} gelehrt. Dies sollte einfache Basisübersetzungen zuverlässiger machen, insbesondere Schaltungen, die YY Rotationen verwenden. Siehe #7332.

  • Kontrollflussoperationen werden jetzt von der Sabre-Familie von Transpiler-Pässen unterstützt, nämlich Layout-Pass SabreLayout und Routing-Pass SabreSwap. Die Funktion transpile() die Schlüsselwortargumente layout_method und routing_method akzeptieren nun die Option "sabre" für Schaltungen mit Kontrollfluss, die bisher nicht unterstützt wurde.

Schaltkreise Funktionen
  • Die Felder IfElseOp.condition, WhileLoopOp.condition und SwitchCaseOp.target können nun Instanzen des neuen Laufzeittyps für klassische Ausdrücke sein expr.Expr. Dies unterscheidet sich von ParameterExpression weil es zur Laufzeit für Backends ausgewertet wird, die solche Operationen unterstützen.

    Diese neuen Ausdrücke sind wesentlich leistungsfähiger als die alte Zwei-Tupel-Form zur Angabe der klassischen Bedingungen. Zum Beispiel kann man jetzt Gleichheitsbedingungen zwischen zwei verschiedenen klassischen Registern oder das logische "oder" zweier klassischer Bits darstellen. Diese beiden Beispiele würden wie folgt aussehen:

    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)

    Weitere Beispiele finden Sie in der Dokumentation zu qiskit.circuit.classical.

    Diese Funktion ist sowohl für Qiskit als auch für die verfügbare Quantenhardware, mit der Qiskit arbeitet, neu. Da sich die Funktionen noch in der Entwicklung befinden, wird es wahrscheinlich an einigen Stellen unerwartete Probleme geben, die erst nach einiger Zeit gelöst werden können. Wenn Sie ein Problem mit der Unterstützung oder der Verwendung des klassischen Ausdrucks haben, wenden Sie sich bitte an Qiskit oder Ihren Hardwarehersteller.

    In dieser ersten Version hat Qiskit die Operationen hinzugefügt:

    Diese können auf Python Integer- und Boolesche Literale wirken, oder auf ClassicalRegister und Clbit instanzen wirken.

    Alle diese klassischen Ausdrücke werden durch den Qiskit-Transpiler-Stack, durch die QPY-Serialisierung (qiskit.qpy) und für den Export nach OpenQASM 3 (qiskit.qasm3). Der Import von OpenQASM 3 wird derzeit von einem separaten Paket verwaltet (das über qiskit.qasm3), das hoffentlich erweitert wird, um den neuen Funktionen in Qiskit zu entsprechen.

  • Es wurden Werkzeuge für die Arbeit mit den neuen Darstellungen der klassischen Laufzeitausdrücke hinzugefügt. Eine allgemeine ExprVisitor ist für Verbraucher dieser Ausdrücke als Unterklasse vorgesehen. Zwei Hilfsprogramme, die auf dieser Struktur basieren, iter_vars() und structurally_equivalent()werden ebenfalls bereitgestellt, die jeweils einen Iterator durch die Var knoten erzeugen und prüfen, ob zwei Expr instanzen strukturell identisch sind, bis hin zu einer gewissen Abbildung der Var knoten enthalten.

  • Funktion hinzugefügt lift_legacy_condition() hinzugefügt, die verwendet werden kann, um Bedingungen alten Stils in Knoten neuen Stils Expr knoten umwandelt. Beachten Sie, dass diese Ausdrucksknoten in Feldern des alten Stils nicht erlaubt sind Instruction.condition feldern nicht erlaubt, die durch fortschrittlichere klassische Handhabung wie IfElseOp.

  • Unterstützung für das Erfassen absoluter Werte von ParameterExpressions. Zum Beispiel ist jetzt Folgendes möglich:

    from qiskit.circuit import QuantumCircuit, Parameter
    
    x = Parameter("x")
    circuit = QuantumCircuit(1)
    circuit.rx(abs(x), 0)
    
    bound = circuit.bind_parameters({x: -1})
  • Die Leistung von QuantumCircuit.assign_parameters() und bind_parameters() hat sich bei großen Schaltungen mit anwendungstypischen Strukturen deutlich erhöht. Dazu gehören die meisten Schaltungen, die auf der NLocal struktur, wie zum Beispiel EfficientSU2. Siehe #10282 für weitere Einzelheiten.

  • Die Methode QuantumCircuit.assign_parameters() hat zwei neue Schlüsselwortargumente erhalten: flat_input und strict. Dies sind erweiterte Optionen, die verwendet werden können, um die Methode zu beschleunigen, wenn die Parameterbindungen als Wörterbuch übergeben werden; flat_input=True ist eine Garantie dafür, dass die Wörterbuchschlüssel nur Parameter instanzen (nicht ParameterVectors), und strict=False erlaubt es dem Wörterbuch, Parameter zu enthalten, die nicht in der Schaltung vorhanden sind. Die Verwendung dieser beiden Optionen kann den Overhead der Eingabenormalisierung in dieser Funktion reduzieren.

  • Dem Konstruktor für die folgenden Klassen wurde ein neues Schlüsselwortargument flatten hinzugefügt:

    Wenn dieses Argument auf True gesetzt ist, wird die QuantumCircuit generierte Unterklasse die Implementierung nicht in Gate oder Instruction objekte. Dies ist zwar nicht optimal für die Visualisierung, führt aber in der Regel zu einer deutlich besseren Laufzeitleistung, insbesondere bei QuantumCircuit.bind_parameters() und QuantumCircuit.assign_parameters() die eine substatiale Laufzeitverbesserung mit einer abgeflachten Ausgabe im Vergleich zur verschachtelten, umhüllten Standardausgabe erfahren können.

  • Zusätzliche Unterstützung für die Konstruktion von LinearFunctions aus allgemeineren Quantenschaltungen, die enthalten können:

    • Barrieren (vom Typ Barrier) und Verzögerungen (Delay), die einfach ignoriert werden
    • Permutationen (vom Typ PermutationGate)
    • Andere lineare Funktionen
    • Cliffords (vom Typ Clifford), wenn der Clifford eine lineare Funktion darstellt (andernfalls wird eine CircuitError Ausnahme ausgelöst)
    • Verschachtelte Quantenschaltungen dieser Form
  • Methode LinearFunction.__eq__() hinzugefügt. Zwei Objekte des Typs LinearFunction werden als gleich angesehen, wenn ihre Darstellungen als binäre invertierbare Matrizen gleich sind.

  • Hinzugefügt LinearFunction.extend_with_identity() methode hinzugefügt, die es ermöglicht, eine lineare Funktion über k Qubits zu einer linearen Funktion über n >= k Qubits zu erweitern, wobei die neuen Positionen der ursprünglichen Qubits angegeben werden und die verbleibenden Qubits mit Identitäten aufgefüllt werden.

  • Zwei Methoden für Pretty-Printing hinzugefügt LinearFunction objekte: LinearFunction.mat_str(), die die String-Repräsentation der linearen Funktion als Matrix mit 0/1 Einträgen zurückgibt, und LinearFunction.function_str()die die String-Repräsentation der linearen Funktion, betrachtet als lineare Transformation, zurückgibt.

  • Die Anleitungen StatePreparation und Initialize und die zugehörigen Schaltungsmethoden QuantumCircuit.prepare_state() und initialize()erhalten ein Schlüsselwortargument normalize, das auf True gesetzt werden kann, um ein Array-Ziel automatisch zu normalisieren. Standardmäßig ist dies False, was das derzeitige Verhalten beibehält, eine Exception auszulösen, wenn eine nicht-normalisierte Eingabe vorliegt.

Algorithmen Funktionen
  • Es wurde die Option hinzugefügt, einen Callback an den UMDA optimierer zu übergeben, der es ermöglicht, die Anzahl der Funktionsbewertungen, die aktuellen Parameter und den besten erreichten Funktionswert zu verfolgen.
OpenQASM Funktionen
  • Die OpenQASM 3 Ausführer (qasm3.dump(), dumps() und Exporter) haben ein neues Argument allow_aliasing , das später das Argument alias_classical_registers ersetzen wird. Dies steuert, ob Aliasing entweder für klassische Bits oder für Qubits erlaubt ist, anstatt dass die Option nur für klassische Bits verfügbar ist.
Quanteninformationsmerkmale
  • Es wurde eine neue Funktion negativity() hinzugefügt, die das Verschränkungsmaß der Negativität eines Quantenzustandes berechnet. Ein Beispiel für die Verwendung der obigen Funktion ist unten angegeben:

    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])
  • Hinzufügen der Funktion schmidt_decomposition(). Diese Funktion arbeitet mit den Statevector und DensityMatrix klassen für zweiseitige reine Zustände.

  • Fügt Unterstützung für die Multiplikation von SparsePauliOp objekten mit Parameter objekten, z. B. mit dem Operator *:

    from qiskit.circuit import Parameter
    from qiskit.quantum_info import SparsePauliOp
    
    param = Parameter("a")
    op = SparsePauliOp("X")
    param * op
Puls-Funktionen
  • Die SymbolicPulse die Bibliothek wurde erweitert. Die neuen Impulsfunktionen in der Bibliothek sind:

    Die neuen Funktionen geben eine ScalableSymbolicPulse -Instanz zurück und entsprechen der Funktionalität der entsprechenden Funktionen in der diskreten Pulsbibliothek, mit Ausnahme von Square() für die sich eine Phase von 2π2\pi um einen vollen Zyklus verschiebt (im Gegensatz zur diskreten square() wo eine solche Verschiebung durch eine π\pi -Phase hervorgerufen wurde).

  • Die Methode filter() wird in der ScheduleBlock klasse. Mit dieser Methode können die Benutzer nur Instruction objekte zu behalten, die alle angegebenen Filter durchlaufen haben. Als eingebaute Filterbedingungen können die Pulse Channel unterklasseninstanz und Instruction unterklassentyp angegeben werden. Benutzerdefinierte Rückrufe, die Instruction instanz können den Filtern ebenfalls hinzugefügt werden.

  • Die Methode exclude() wird in der ScheduleBlock klasse. Diese Methode ermöglicht es den Benutzern, nur Instruction objekte zu behalten, die mindestens einen der angegebenen Filter nicht erfüllen. Als eingebaute Filterbedingungen können die Pulse Channel unterklasseninstanz und Instruction unterklassentyp angegeben werden. Benutzerdefinierte Rückrufe, die Instruction instanz können den Filtern ebenfalls hinzugefügt werden. Diese Methode ist das Komplement von filter(), so dass die folgende Bedingung immer erfüllt ist: block.filter(*filters) + block.exclude(*filters) == block in Bezug auf die enthaltenen Anweisungen, wobei block eine ScheduleBlock instanz ist.

  • Hinzufügen einer neuen Funktion gaussian_square_echo() in die Impulsbibliothek aufgenommen. Der zurückgesendete Impuls setzt sich aus drei GaussianSquare impulsen zusammen. Die ersten beiden sind Echoimpulse mit der halben Dauer der Gesamtdauer und dienen der Umsetzung von Drehtönen. Der dritte Impuls ist ein Auslöschungston, der über die gesamte Dauer des Impulses anhält und die Korrektur einzelner Qubit-Drehungen ermöglicht.

  • QPY unterstützt die Objekte Discriminator und Kernel . Diese Funktion ermöglicht es dem Benutzer, die Anweisungen mit diesen Objekten Acquire anweisungen mit diesen Objekten mit QPY zu serialisieren und zu deserialisieren.

Synthesefunktionen
  • Hinzufügen einer neuen Synthesefunktion synth_cx_cz_depth_line_my() die die Schaltungsform einer CX-Schaltung, gefolgt von einer CZ-Schaltung für lineare Nächste-Nachbarn-Verbindungen (LNN) mit einer 2-Qubit-Tiefe von höchstens 5n erzeugt, wobei CX- und Phasengatter (S, Sdg oder Z) verwendet werden. Der Synthesealgorithmus basiert auf der Arbeit von Maslov und Yang, arXiv:2210.16195.

    Der Algorithmus akzeptiert eine binäre invertierbare Matrix mat_x , die die CX-Schaltung darstellt, eine binäre symmetrische Matrix mat_z , die die CZ-Schaltung darstellt, und gibt eine Quantenschaltung mit einer 2-Qubit-Tiefe von höchstens 5n zurück, die die Komposition der CX- und CZ-Schaltungen berechnet. Das folgende Beispiel veranschaulicht die neue Funktionalität:

    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)

    Diese Funktion wird nun standardmäßig im Clifford-Synthese-Algorithmus verwendet synth_clifford_depth_lnn() der die 2-Qubit-Tiefe für die LNN-Konnektivität optimiert und die 2-Qubit-Tiefe von 9n+4 auf 7n+2 verbessert. Der Clifford-Synthese-Algorithmus kann wie folgt verwendet werden:

    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)

    Die obige Synthese kann weiter verbessert werden, wie in der Arbeit von Maslov und Yang beschrieben, indem eine lokale Optimierung zwischen 2-Qubit-Schichten verwendet wird. Diese Verbesserung ist Gegenstand von Folgearbeiten.

Visualisierungsfunktionen
  • QuantumCircuit.draw() und Funktion circuit_drawer() bei Verwendung der Option output='mpl' unterstützen nun das Zeichnen der verschachtelten Schaltkreisblöcke von ControlFlowOp operationen, einschließlich if, else, while, for und switch/case. Die Schaltkreisblöcke sind mit Kästchen umhüllt, um die Schaltkreise abzugrenzen.

  • Einige Einschränkungen bei der Verwendung von wire_order in den Schaltkreisschubladen wurden gelockert. Nun kann wire_order nur Qubits auflisten und in diesem Fall kann es mit cregbundle=True verwendet werden, da es die klassischen Bits nicht beeinflusst.

    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/════════════
Versch. Funktionen
  • Ein neuer Lazy-Import-Tester, HAS_PYGMENTSist verfügbar, um das Vorhandensein der Pygments-Syntaxhervorhebungsbibliothek zu testen.

  • Die magische %qiskit_version_table von qiskit.tools.jupyter umfasst nun alle importierten Module mit qiskit im Namen.

Anmerkungen zu Upgrades

  • Qiskit Terra 0.25 hat die Unterstützung für Python 3.7 eingestellt, nachdem in Qiskit Terra 0.23 Warnungen vor der Veralterung ausgegeben wurden. Dies steht im Einklang mit Python 3.7’s, dessen Lebensdauer am 27. Juni 2023 endet. Um Qiskit weiterhin nutzen zu können, müssen Sie ein Upgrade auf eine neuere Version von Python durchführen.

  • Qiskit Terra 0.25 benötigt jetzt die Version 0.13.0 von rustworkx.

  • Standardmäßig erstellt Qiskit seine kompilierten Erweiterungen unter Verwendung der Python Stable ABI mit Unterstützung bis zurück zur ältesten von Qiskit unterstützten Version von Python (derzeit 3.8 ). Das bedeutet, dass es in Zukunft ein einziges vorkompiliertes Rad geben wird, das mit allen von Qiskit unterstützten Python Versionen funktioniert. Es ist nicht zu erwarten, dass die eingeschränkte API einen Unterschied in der Laufzeitleistung mit sich bringt, daher ist sie jetzt standardmäßig für alle Builds aktiviert. Zuvor wurden die kompilierten Erweiterungen unter Verwendung der versionsspezifischen API erstellt und funktionierten nur mit einer einzigen Version von Python. Diese Änderung wurde vorgenommen, um die Anzahl der Paketdateien zu reduzieren, die wir bei jeder Veröffentlichung erstellen und veröffentlichen müssen. Bei der Erstellung von Qiskit aus dem Quellcode sollten keine Änderungen am Erstellungsprozess notwendig sein, außer dass die Standard-Tags in den Ausgabedateinamen anders sein werden, um die Verwendung der eingeschränkten API zu reflektieren.

Hinweise zum Transpiler-Upgrade
  • Die Unterstützung für die Übergabe von Listen von Argumentwerten an die transpile() funktion wird entfernt. Diese Funktion wurde mit der Version 0.23.0 veraltet. Sie können weiterhin eine Liste von QuantumCircuit objekten für das erste Positionsargument übergeben. Was entfernt wurde, ist die Auflistung der anderen Argumente für jeden Schaltkreis in dieser Eingabeliste. Die Entfernung dieser Funktionalität war notwendig, um den Overhead für die parallele Ausführung bei der gleichzeitigen Umsetzung mehrerer Schaltkreise erheblich zu reduzieren. Wenn Sie diese Funktion derzeit verwenden, können Sie stattdessen transpile() stattdessen mehrere Male aufrufen. Zum Beispiel, wenn Sie vorher etwas getan haben wie:

    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)

    stattdessen sollten Sie nun etwas wie folgt ausführen:

    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]

    Sie können auch parallel_map() oder multiprocessing aus der Python Standardbibliothek verwenden, wenn Sie dies parallel ausführen möchten.

  • Die Sabre-Familie der Transpilerpässe (nämlich SabreLayout und SabreSwap) werden nun standardmäßig für alle Schaltkreise verwendet, wenn der Transpiler auf Optimierungsebene 1 aufgerufen wird (z. B. durch Aufruf von transpile() oder generate_preset_pass_manager() mit dem Schlüsselwortargument optimization_level=1). Bisher verwendeten Schaltungen mit Kontrollflussoperationen DenseLayout und StochasticSwap mit diesem Profil.

Hinweise zur Aktualisierung von Schaltkreisen
  • Die OpenQASM 2 Konstruktormethoden auf QuantumCircuit (from_qasm_str() und from_qasm_file()) wurden umgestellt, um den Rust-basierten Parser zu verwenden, der in Qiskit Terra 0.24 hinzugefügt wurde. Dies sollte zu erheblich schnelleren Parsing-Zeiten (10-mal oder mehr ist keine Seltenheit) und zu einem massiv reduzierten Zwischenspeicherverbrauch führen.

    Die QuantumCircuit methoden werden aus Gründen der Kontinuität mit der gleichen Schnittstelle beibehalten; der bevorzugte Weg, um auf den OpenQASM 2 Importer zuzugreifen, ist die Verwendung von qasm2.load() und qasm2.loads()zu verwenden, die eine erweiterte Schnittstelle zur Steuerung des Parsens und der Konstruktion bieten.

  • Das veraltete circuit_cregs Argument für den Konstruktor der InstructionSet klasse wurde entfernt. Sie wurde in der Version 0.19.0 veraltet. Wenn Sie dieses Argument verwenden und manuell ein InstructionSet objekts (was ziemlich ungewöhnlich sein sollte, da es meist intern verwendet wird), sollten Sie stattdessen ein Callable an das Schlüsselwortargument resource_requester übergeben. Zum Beispiel:

    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 Upgrade-Hinweise
  • Die OpenQASM 2 Konstruktormethoden auf QuantumCircuit (from_qasm_str() und from_qasm_file()) wurden umgestellt, um den Rust-basierten Parser zu verwenden, der in Qiskit Terra 0.24 hinzugefügt wurde. Dies sollte zu erheblich schnelleren Parsing-Zeiten (10-mal oder mehr ist keine Seltenheit) und zu einem massiv reduzierten Zwischenspeicherverbrauch führen.

    Die QuantumCircuit methoden werden aus Gründen der Kontinuität mit der gleichen Schnittstelle beibehalten; der bevorzugte Weg, um auf den OpenQASM 2 Importer zuzugreifen, ist die Verwendung von qasm2.load() und qasm2.loads()zu verwenden, die eine erweiterte Schnittstelle zur Steuerung des Parsens und der Konstruktion bieten.

  • Die OpenQASM 3 Ausführer (qasm3.dump(), dumps() und Exporter) verwenden nun weniger "register alias"-Definitionen in ihrer Ausgabe. Die beschriebene Schaltung ändert sich nicht, aber sie exportiert nun vorzugsweise in Form von direkten bit, qubit und qubit[n] Typen, anstatt ein _loose_bits Register zu erzeugen und weitere Register von diesem abzugrenzen. Dies geschieht, um die Anzahl der fortgeschrittenen OpenQASM 3-Funktionen zu minimieren und um die Einführung unnötiger Array-Strukturen in Programmen zu vermeiden, die diese nicht benötigen.

Hinweise zum Upgrade der Quanteninformation
  • Clifford.from_circuit() wird nicht mehr versuchen, Anweisungen aufzulösen, deren definition felder sich gegenseitig mit einem anderen Objekt rekursiv sind. Solche rekursiven Definitionen sind bereits ein Verstoß gegen die streng hierarchische Ordnung, die das definition feld erfordert, und der Code sollte sich nicht darauf verlassen, dass dies überhaupt möglich ist. Wenn Sie Äquivalenzen definieren wollen, die (gegenseitige) Zyklen haben dürfen, verwenden Sie eine EquivalenceLibrary.
Hinweise zum Upgrade der Visualisierung
  • In dem internen Objekt ~qiskit.visualization.circuit.matplotlib.MatplotlibDrawer wurden die Argumente layout, global_phase, qregs und cregs entfernt. Sie waren ursprünglich in Qiskit Terra 0.20 veraltet. Diese Objekte werden nun einfach aus der angegebenen circuit abgeleitet.

    Dies ist eine interne Arbeitsklasse der Visualisierungsroutinen. Es ist unwahrscheinlich, dass Sie irgendetwas an Ihrem Code ändern müssen.

Versch. Anmerkungen zu Upgrades
  • Der Importort qiskit.util wurde entfernt, da er seit Qiskit Terra 0.17 veraltet war. Die Benutzer sollten den neuen Importort qiskit.utils verwenden.

Hinweise zu veralteten Versionen

  • Erweiterungen der Namensräume qiskit und qiskit.providers durch externe Pakete sind nun veraltet und die Hakenpunkte, die dies ermöglichen, werden in einer zukünftigen Version entfernt. In der Vergangenheit bestand das Qiskit-Projekt aus Elementen, die einen gemeinsamen Namespace erweiterten, und diese Hook-Points ermöglichten dies. Es war jedoch nicht vorgesehen, dass diese Schnittstellen jemals von anderen Paketen verwendet werden. Da das gesamte Qiskit-Paket dieses Paketierungsmodell nicht mehr verwendet, birgt die Möglichkeit dieser Erweiterungen mehr Risiken als Vorteile und wird daher für eine zukünftige Entfernung abgelehnt. Wenn Sie ein Paket verwalten, das den Qiskit-Namensraum erweitert (d.h. Ihre Benutzer importieren von qiskit.x oder qiskit.providers.y), sollten Sie dazu übergehen, einen eigenständigen Python -Namensraum für Ihr Paket zu verwenden. Dabei wird keine Warnung ausgelöst, da es keine Methode gibt, um eine Warnung auf der Paketebene einzubringen, die erforderlich wäre, um externe Pakete vor dieser Änderung zu warnen.

  • Das Wörterbuch qiskit.__qiskit_version__ ist veraltet, da Qiskit mit einem einzigen Paket definiert ist (qiskit-terra). In Zukunft wird qiskit.__version__ der einzige Punkt sein, um die Qiskit-Version als Standard-String abzufragen.

Transpiler-Veraltungen
  • Die Funktion get_vf2_call_limit , die über das Modul qiskit.transpiler.preset_passmanagers.common verfügbar ist, wurde veraltet. Dies wird wahrscheinlich nur sehr wenige Benutzer betreffen, da diese Funktion weder explizit exportiert noch dokumentiert wurde. Seine Funktionalität wurde durch eine Funktion im selben Modul ersetzt und erweitert.
Veraltete Schaltungen
  • Die Methode qasm() und alle überschreibenden Methoden von Unterklassen von :class:~qiskit.circuit.Instruction sind veraltet. Es gibt keinen Ersatz für die Erzeugung einer OpenQASM2 Zeichenfolge für eine isolierte Anweisung, da ein einzelnes Anweisungsobjekt in der Regel nicht genügend Kontext hat, um eine gültige OpenQASM2 Zeichenfolge vollständig zu erzeugen. Wenn Sie sich derzeit auf diese Methode verlassen, müssen Sie sich stattdessen auf den OpenQASM2 exporter verlassen: QuantumCircuit.qasm() um die OpenQASM2 für ein ganzes Schaltkreisobjekt zu erzeugen.
Algorithmen-Veraltungen
  • Das Modul qiskit.algorithms modul ist veraltet und wird in einer zukünftigen Version entfernt werden. Sie wurde durch eine neue, eigenständige Bibliothek qiskit-algorithms ersetzt, die unter PyPi oder auf Github hier zu finden ist:

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

    Das qiskit.algorithms modul wird weiterhin wie bisher funktionieren und Fehler werden bis zu seiner zukünftigen Entfernung behoben, aber die aktive Entwicklung neuer Funktionen wurde in das neue Paket verlagert. Wenn Sie sich auf qiskit.algorithms verwenden, sollten Sie die Anforderungen von Python aktualisieren, um auch qiskit-algorithms einzubeziehen und die Importe von qiskit.algorithms auf qiskit_algorithms zu aktualisieren. Bitte beachten Sie, dass dieses neue Paket keinen Code für bereits veraltete Algorithmen enthält, einschließlich opflow und QuantumInstance-basierter Algorithmen. Wenn Sie noch nicht von QuantumInstance-basierten zu primitiv-basierten Algorithmen migriert haben, sollten Sie die Migrationsrichtlinien in https://qisk.it/algo _migration befolgen. Die Entscheidung zur Migration des algorithms modul in ein separates Paket zu migrieren, wurde getroffen, um den Zweck von Qiskit zu verdeutlichen und eine Unterscheidung zwischen den darauf aufbauenden Werkzeugen und Bibliotheken zu treffen.

Impuls-Deprecations
  • Initialisierung einer ScalableSymbolicPulse mit komplexem Wert für amp. Diese Änderung betrifft auch die folgenden Bibliotheksimpulse:

    Die Initialisierung von amp mit einem komplexen Wert ist nun ebenfalls veraltet.

    Verwenden Sie stattdessen zwei Fließkommazahlen, wenn Sie die Parameter amp und angle angeben, wobei amp für den Betrag der komplexen Amplitude steht und angle für den Winkel der komplexen Amplitude. d.h. die komplexe Amplitude ist gegeben durch amp×exp⁡(i×angle)\texttt{amp} \times \exp(i \times \texttt{angle}).

  • Die Anweisung Call anweisung ist veraltet und wird in einer zukünftigen Version entfernt werden. Verwenden Sie stattdessen die Funktion call() von Modul qiskit.pulse.builder innerhalb eines aktiven Gebäudekontexts.

Versch. Einstellung von Unterstützung
  • Die Jupyter-Magie %circuit_library_info und die Objekte in qiskit.tools.jupyter.library ruft sie der Reihe nach auf:

    • circuit_data_table
    • properties_widget
    • qasm_widget
    • circuit_digram_widget
    • circuit_library_widget

    sind veraltet und werden in einer zukünftigen Version entfernt. Diese Objekte waren nur für die Verwendung in der Dokumentationserstellung vorgesehen. Sie werden dort nicht mehr verwendet und daher auch nicht mehr unterstützt oder gewartet.

Bekannte Probleme

  • Schaltkreise mit klassischen Ausdrücken, die mit dem Modul expr modul erstellt wurden, werden von den Schaltkreisvisualisierern noch nicht unterstützt.

Fehlerkorrekturen

  • Es wurde ein Fehler in Channel behoben, bei dem die Indexüberprüfung nicht korrekt durchgeführt wurde und nur dann einen Fehler auslöste, wenn der Index sowohl nicht ganzzahlig als auch negativ war, anstatt nur eines von beiden.

  • Es wurde ein Problem mit der transpile() funktion und allen voreingestellten Pass-Managern, die über generate_preset_pass_manager() generiert wurden, bei denen die Ausgabe QuantumCircuit objekts layout attribut ein ungültiges TranspileLayout.final_layout attribut hatte. Dies würde in Szenarien auftreten, in denen der VF2PostLayout durchlauf ein alternatives Anfangslayout mit niedrigeren Fehlerquoten finden würde. Beim Ändern des ursprünglichen Layouts wurde das final_layout attribut nie aktualisiert, um diese Änderung widerzuspiegeln. Dies wurde korrigiert, so dass die final_layout die durch die Routing-Stufe verursachte Ausgangspermutation immer korrekt wiedergibt. Behoben #10457

  • Der Parser OpenQASM 2 (qasm2.load() und loads()), der im Modus strict läuft, gibt nun korrekt einen Fehler aus, wenn eine barrier -Anweisung keine Argumente hat. Im (standardmäßigen) freizügigeren Modus verursacht eine argumentlose barrier -Anweisung weiterhin eine Barriere auf allen Qubits, die sich im Gültigkeitsbereich befinden (die Qubits, auf die sich eine Gatterdefinition auswirkt, oder alle Qubits, die von einem Programm definiert werden, wenn sich die Anweisung in einem Gatterkörper oder im globalen Gültigkeitsbereich befindet).

  • Der OpenQASM 2 Exporter (QuantumCircuit.qasm()) wird nun nicht mehr versuchen, barrier Anweisungen auszugeben, die auf keine Qubits wirken. Eine solche Sperrerklärung hat auch in Qiskit keine Wirkung, ist aber ungültig OpenQASM 2.

  • Qiskit kann benutzerdefinierte Anweisungen darstellen, die auf Null-Qubits oder auf eine Anzahl klassischer Bits ungleich Null wirken. Diese können nicht nach OpenQASM 2 exportiert werden, aber vorher QuantumCircuit.qasm() versucht und ungültige OpenQASM 2 ausgegeben. Stattdessen wird ein QASM2ExportError nun korrekt ausgelöst werden. Siehe #7351 und #10435.

  • Es wurde ein Problem bei der Verwendung von Targets ohne Kopplung von Maps mit dem FullAncillaAllocation transpiler-Durchgang. In diesem Fall, FullAncillaAllocation nun Ancilla-Qubits hinzufügen, so dass die Anzahl der Qubits in der DAGCircuit mit der von Target.num_qubits übereinstimmt.

  • DAGCircuit.substitute_node() überschreibt nicht mehr stillschweigend eine bestehende Bedingung auf der angegebenen Ersetzung op. Wenn propagate_condition auf True gesetzt ist (Standardeinstellung), wird stattdessen ein DAGCircuitError stattdessen ausgelöst werden.

  • Ein parametrisierter Schaltkreis, der ein benutzerdefiniertes Gatter enthält, dessen Definition eine parametrisierte globale Phase hat, kann nun erfolgreich den Parameter in der inneren globalen Phase binden. Siehe #10283 für weitere Einzelheiten.

  • Konstruktion eines Statevector aus einer QuantumCircuit die Null-Qubit-Operationen enthält, führt nicht mehr zu einem Fehler. Diese Operationen verleihen dem resultierenden Zustandsvektor eine globale Phase.

  • Die Schnittstelle für die Erstellung von Kontrollflüssen schließt nun korrekt ClassicalRegister ressourcen aus verschachtelten Switch-Anweisungen in die sie enthaltenden Schaltkreisbereiche ein. Siehe #10398.

  • Ein Problem wurde behoben in QuantumCircuit.decompose() wo die Übergabe eines Schaltkreisnamens an die Funktion, der mit einem zusammengesetzten Gatternamen übereinstimmte, das Gatter nicht zerlegte, wenn ihm auch ein Label zugewiesen war. Behoben #9136

  • Ein Problem wurde behoben mit qiskit.visualization.plot_histogram() bei dem die relative Legende nicht angezeigt wurde, wenn der angegebene Datensatz einen Nullwert an der ersten Position hatte. Siehe #10158 für weitere Einzelheiten.

  • Ein Fehler bei der Methode Target.update_from_instruction_schedule_map() ausgelöst durch die angegebene inst_map , die eine Schedule mit nicht zugewiesenen Laufzeiten.

  • Wenn der Parameter conditional=True in random_circuit()angegeben wird, geht den bedingten Operationen in der resultierenden Schaltung nun eine vollständige Messung in der Mitte der Schaltung voraus. Behebt #9016

  • Verbesserte die Typ-Anmerkungen der QuantumCircuit.assign_parameters() methode, um die Änderung des Rückgabetyps in Abhängigkeit von dem Argument inplace widerzuspiegeln.

  • Die Methoden OpenQASM 2 circuit-constructor (QuantumCircuit.from_qasm_str() und from_qasm_file()) werden nicht mehr fehlschlagen, wenn sie auf eine gate Definition treffen, die U oder CX Anweisungen enthält. Siehe #5536.

  • Reduzierter Overhead des ConsolidateBlocks durch die Durchführung von Matrixoperationen auf allen Zwei-Qubit-Blöcken, anstatt eine Instanz von QuantumCircuit zu erzeugen und diese an eine Operator. Der Geschwindigkeitszuwachs ist nur bei der Konsolidierung von Zwei-Qubit-Blöcken möglich. Alles, was darüber hinausgeht, wird weiterhin von der Operator klasse. Siehe #8779 für weitere Informationen.

  • Der OpenQASM 3 Exporter (qiskit.qasm3) gibt nicht länger ungültige OpenQASM 3 für nicht-unitäre Instruction instanzen aus, sondern gibt stattdessen eine QASM3ExporterError und erklärt, dass diese noch nicht unterstützt werden. Diese Funktion ist für eine spätere Version von Qiskit vorgesehen, wenn mehr klassische Verarbeitungsmöglichkeiten in der Bibliothek vorhanden sind.

  • Behebt Problem #10185.

  • Ein Problem mit der Funktion state_to_latex() wurde behoben. Zuvor erzeugte es ungültige LaTeX mit ungewollter Koeffizientenrundung, was zu Fehlern beim Aufruf von state_drawer() führte. Behoben #9297.

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.