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.1 | 0.25.1 | 2023-08-17 | ||||
| 0.44.0 | 0.25.0 | 2023-07-27 | ||||
| 0.43.3 | 0.24.2 | 0.12.2 | 0.20.2 | 2023-07-19 | ||
| 0.43.2 | 0.24.1 | 0.12.1 | 0.20.2 | 2023-06-28 | ||
| 0.43.1 | 0.24.1 | 0.12.0 | 0.20.2 | 2023-06-02 | ||
| 0.43.0 | 0.24.0 | 0.12.0 | 0.20.2 | 2023-05-04 | ||
| 0.42.1 | 0.23.3 | 0.12.0 | 0.20.2 | 2023-03-21 | ||
| 0.42.0 | 0.23.2 | 0.12.0 | 0.20.2 | 2023-03-10 | ||
| 0.41.1 | 0.23.2 | 0.11.2 | 0.20.1 | 2023-02-23 | ||
| 0.41.0 | 0.23.1 | 0.11.2 | 0.20.0 | 2023-01-31 | ||
| 0.40.0 | 0.23.0 | 0.11.2 | 0.19.2 | 2023-01-26 | ||
| 0.39.5 | 0.22.4 | 0.11.2 | 0.19.2 | 2023-01-17 | ||
| 0.39.4 | 0.22.3 | 0.11.2 | 0.19.2 | 2022-12-08 | ||
| 0.39.3 | 0.22.3 | 0.11.1 | 0.19.2 | 2022-11-25 | ||
| 0.39.2 | 0.22.2 | 0.11.1 | 0.19.2 | 2022-11-03 | ||
| 0.39.1 | 0.22.1 | 0.11.1 | 0.19.2 | 2022-11-02 | ||
| 0.39.0 | 0.22.0 | 0.11.0 | 0.19.2 | 2022-10-13 | ||
| 0.38.0 | 0.21.2 | 0.11.0 | 0.19.2 | 2022-09-14 | ||
| 0.37.2 | 0.21.2 | 0.10.4 | 0.19.2 | 2022-08-23 | ||
| 0.37.1 | 0.21.1 | 0.10.4 | 0.19.2 | 2022-07-28 | ||
| 0.37.0 | 0.21.0 | 0.10.4 | 0.19.2 | 2022-06-30 | ||
| 0.36.2 | 0.20.2 | 0.10.4 | 0.7.1 | 0.19.1 | 2022-05-18 | |
| 0.36.1 | 0.20.1 | 0.10.4 | 0.7.0 | 0.19.1 | 2022-04-21 | |
| 0.36.0 | 0.20.0 | 0.10.4 | 0.7.0 | 0.19.0 | 06.04.2022 | |
| 0.35.0 | 0.20.0 | 0.10.3 | 0.7.0 | 0.18.3 | 31.03.2022 | |
| 0.34.2 | 0.19.2 | 0.10.3 | 0.7.0 | 0.18.3 | 2022-02-09 | |
| 0.34.1 | 0.19.1 | 0.10.2 | 0.7.0 | 0.18.3 | 05.01.2022 | |
| 0.34.0 | 0.19.1 | 0.10.1 | 0.7.0 | 0.18.3 | 2021-12-20 | |
| 0.33.1 | 0.19.1 | 0.9.1 | 0.7.0 | 0.18.2 | 10.12.2021 | |
| 0.33.0 | 0.19.0 | 0.9.1 | 0.7.0 | 0.18.1 | 2021-12-06 | |
| 0.32.1 | 0.18.3 | 0.9.1 | 0.6.0 | 0.18.1 | 0.9.5 | 2021-11-22 |
| 0.32.0 | 0.18.3 | 0.9.1 | 0.6.0 | 0.18.0 | 0.9.5 | 10.11.2021 |
| 0.31.0 | 0.18.3 | 0.9.1 | 0.6.0 | 0.17.0 | 0.9.5 | 2021-10-12 |
| 0.30.1 | 0.18.3 | 0.9.0 | 0.6.0 | 0.16.0 | 0.9.5 | 2021-09-29 |
| 0.30.0 | 0.18.2 | 0.9.0 | 0.6.0 | 0.16.0 | 0.9.5 | 16.09.2021 |
| 0.29.1 | 0.18.2 | 0.8.2 | 0.6.0 | 0.16.0 | 0.9.5 | 2021-09-10 |
| 0.29.0 | 0.18.1 | 0.8.2 | 0.6.0 | 0.16.0 | 0.9.4 | 2021-08-02 |
| 0.28.0 | 0.18.0 | 0.8.2 | 0.6.0 | 0.15.0 | 0.9.4 | 13.07.2021 |
| 0.27.0 | 0.17.4 | 0.8.2 | 0.6.0 | 0.14.0 | 0.9.2 | 15.06.2021 |
| 0.26.2 | 0.17.4 | 0.8.2 | 0.6.0 | 0.13.1 | 0.9.1 | 2021-05-19 |
| 0.26.1 | 0.17.4 | 0.8.2 | 0.6.0 | 0.13.1 | 0.9.1 | 2021-05-18 |
| 0.26.0 | 0.17.3 | 0.8.2 | 0.6.0 | 0.13.1 | 0.9.1 | 11.05.2021 |
| 0.25.4 | 0.17.2 | 0.8.2 | 0.6.0 | 0.12.3 | 0.9.1 | 2021-05-05 |
| 0.25.3 | 0.17.1 | 0.8.2 | 0.6.0 | 0.12.3 | 0.9.1 | 2021-04-29 |
| 0.25.2 | 0.17.1 | 0.8.1 | 0.6.0 | 0.12.3 | 0.9.1 | 2021-04-21 |
| 0.25.1 | 0.17.1 | 0.8.1 | 0.6.0 | 0.12.2 | 0.9.1 | 2021-04-15 |
| 0.25.0 | 0.17.0 | 0.8.0 | 0.6.0 | 0.12.2 | 0.9.0 | 2021-04-02 |
| 0.24.1 | 0.16.4 | 0.7.6 | 0.5.2 | 0.12.2 | 0.8.2 | 2021-03-24 |
| 0.24.0 | 0.16.4 | 0.7.6 | 0.5.2 | 0.12.1 | 0.8.2 | 2021-03-04 |
| 0.23.6 | 0.16.4 | 0.7.5 | 0.5.2 | 0.11.1 | 0.8.2 | 2021-02-18 |
| 0.23.5 | 0.16.4 | 0.7.4 | 0.5.2 | 0.11.1 | 0.8.2 | 2021-02-08 |
| 0.23.4 | 0.16.3 | 0.7.3 | 0.5.1 | 0.11.1 | 0.8.1 | 2021-01-28 |
| 0.23.3 | 0.16.2 | 0.7.3 | 0.5.1 | 0.11.1 | 0.8.1 | 26.01.2021 |
| 0.23.2 | 0.16.1 | 0.7.2 | 0.5.1 | 0.11.1 | 0.8.1 | 2020-12-15 |
| 0.23.1 | 0.16.1 | 0.7.1 | 0.5.1 | 0.11.1 | 0.8.1 | 12.11.2020 |
| 0.23.0 | 0.16.0 | 0.7.0 | 0.5.0 | 0.11.0 | 0.8.0 | 2020-10-16 |
| 0.22.0 | 0.15.2 | 0.6.1 | 0.4.0 | 0.10.0 | 0.7.5 | 2020-10-05 |
| 0.21.0 | 0.15.2 | 0.6.1 | 0.4.0 | 0.9.0 | 0.7.5 | 16.09.2020 |
| 0.20.1 | 0.15.2 | 0.6.1 | 0.4.0 | 0.8.0 | 0.7.5 | 2020-09-08 |
| 0.20.0 | 0.15.1 | 0.6.1 | 0.4.0 | 0.8.0 | 0.7.5 | 2020-08-10 |
| 0.19.6 | 0.14.2 | 0.5.2 | 0.3.3 | 0.7.2 | 0.7.3 | 2020-06-25 |
| 0.19.5 | 0.14.2 | 0.5.2 | 0.3.2 | 0.7.2 | 0.7.3 | 19.06.2020 |
| 0.19.4 | 0.14.2 | 0.5.2 | 0.3.0 | 0.7.2 | 0.7.2 | 2020-06-16 |
| 0.19.3 | 0.14.1 | 0.5.2 | 0.3.0 | 0.7.2 | 0.7.1 | 2020-06-02 |
| 0.19.2 | 0.14.1 | 0.5.1 | 0.3.0 | 0.7.1 | 0.7.1 | 2020-05-14 |
| 0.19.1 | 0.14.1 | 0.5.1 | 0.3.0 | 0.7.0 | 0.7.0 | 2020-05-01 |
| 0.19.0 | 0.14.0 | 0.5.1 | 0.3.0 | 0.7.0 | 0.7.0 | 2020-04-30 |
| 0.18.3 | 0.13.0 | 0.5.1 | 0.3.0 | 0.6.1 | 0.6.6 | 2020-04-24 |
| 0.18.2 | 0.13.0 | 0.5.0 | 0.3.0 | 0.6.1 | 0.6.6 | 2020-04-23 |
| 0.18.1 | 0.13.0 | 0.5.0 | 0.3.0 | 0.6.0 | 0.6.6 | 2020-04-20 |
| 0.18.0 | 0.13.0 | 0.5.0 | 0.3.0 | 0.6.0 | 0.6.5 | 2020-04-09 |
| 0.17.0 | 0.12.0 | 0.4.1 | 0.2.0 | 0.6.0 | 0.6.5 | 01.04.2020 |
| 0.16.2 | 0.12.0 | 0.4.1 | 0.2.0 | 0.5.0 | 0.6.5 | 2020-03-20 |
| 0.16.1 | 0.12.0 | 0.4.1 | 0.2.0 | 0.5.0 | 0.6.4 | 2020-03-05 |
| 0.16.0 | 0.12.0 | 0.4.0 | 0.2.0 | 0.5.0 | 0.6.4 | 2020-02-27 |
| 0.15.0 | 0.12.0 | 0.4.0 | 0.2.0 | 0.4.6 | 0.6.4 | 2020-02-06 |
| 0.14.1 | 0.11.1 | 0.3.4 | 0.2.0 | 0.4.5 | 0.6.2 | 2020-01-07 |
| 0.14.0 | 0.11.0 | 0.3.4 | 0.2.0 | 0.4.4 | 0.6.1 | 2019-12-10 |
| 0.13.0 | 0.10.0 | 0.3.2 | 0.2.0 | 0.3.3 | 0.6.1 | 2019-10-17 |
| 0.12.2 | 0.9.1 | 0.3.0 | 0.2.0 | 0.3.3 | 0.6.0 | 2019-10-11 |
| 0.12.1 | 0.9.0 | 0.3.0 | 0.2.0 | 0.3.3 | 0.6.0 | 2019-09-30 |
| 0.12.0 | 0.9.0 | 0.3.0 | 0.2.0 | 0.3.2 | 0.6.0 | 2019-08-22 |
| 0.11.2 | 0.8.2 | 0.2.3 | 0.1.1 | 0.3.2 | 0.5.5 | 2019-08-20 |
| 0.11.1 | 0.8.2 | 0.2.3 | 0.1.1 | 0.3.1 | 0.5.3 | 2019-07-24 |
| 0.11.0 | 0.8.2 | 0.2.3 | 0.1.1 | 0.3.0 | 0.5.2 | 2019-07-15 |
| 0.10.5 | 0.8.2 | 0.2.1 | 0.1.1 | 0.2.2 | 0.5.2 | 2019-06-27 |
| 0.10.4 | 0.8.2 | 0.2.1 | 0.1.1 | 0.2.2 | 0.5.1 | 2019-06-17 |
| 0.10.3 | 0.8.1 | 0.2.1 | 0.1.1 | 0.2.2 | 0.5.1 | 29.05.2019 |
| 0.10.2 | 0.8.0 | 0.2.1 | 0.1.1 | 0.2.2 | 0.5.1 | 2019-05-24 |
| 0.10.1 | 0.8.0 | 0.2.0 | 0.1.1 | 0.2.2 | 0.5.0 | 07.05.2019 |
| 0.10.0 | 0.8.0 | 0.2.0 | 0.1.1 | 0.2.1 | 0.5.0 | 2019-05-06 |
| 0.9.0 | 0.8.0 | 0.2.0 | 0.1.1 | 0.1.1 | 0.5.0 | 2019-05-02 |
| 0.8.1 | 0.7.2 | 0.1.1 | 0.1.0 | 2019-05-01 | ||
| 0.8.0 | 0.7.1 | 0.1.1 | 0.1.0 | 2019-03-05 | ||
| 0.7.3 | >=0.7,<0.8 | >=0.1,<0.2 | 2019-02-19 | |||
| 0.7.2 | >=0.7,<0.8 | >=0.1,<0.2 | 2019-01-22 | |||
| 0.7.1 | >=0.7,<0.8 | >=0.1,<0.2 | 2019-01-17 | |||
| 0.7.0 | >=0.7,<0.8 | >=0.1,<0.2 | 2018-12-14 |
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 gedämpft wurden, wobei die Anzahl der Qubits ist. Jetzt zeigt das Balkendiagramm die Koeffizienten korrekt als an, wobei der darzustellende Zustand ist und ü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 von1.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()undloads()) ist standardmäßig freizügiger und erlaubt1e-5ohne Dezimalpunkt, es sei denn, er befindet sich im Modusstrict. -
Der Setter für
SparsePauliOp.paulisweist 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
SabreLayoutundSabreSwaptranspiler-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:
naturemachine-learningfinanceoptimizationexperiments
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()odergenerate_preset_pass_manager()mit dem Schlüsselwortargumentoptimization_level, das als 2 oder 3 angegeben ist, wird jetzt unterstützt). -
Die Felder
IfElseOp.condition,WhileLoopOp.conditionundSwitchCaseOp.targetkönnen nun Instanzen des neuen Laufzeittyps für klassische Ausdrücke seinexpr.Expr. Dies unterscheidet sich vonParameterExpressionweil 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:
bit_not()logic_not()bit_and()bit_or()bit_xor()logic_and()logic_or()equal()not_equal()less()less_equal()greater()greater_equal()
Diese können auf Python Integer- und Boolesche Literale wirken, oder auf
ClassicalRegisterundClbitinstanzen 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 überqiskit.qasm3), das hoffentlich erweitert wird, um den neuen Funktionen in Qiskit zu entsprechen. -
Das Modul
qiskit.algorithmsmodul ist veraltet und wird in einer zukünftigen Version entfernt werden. Sie wurde durch eine neue, eigenständige Bibliothekqiskit-algorithmsersetzt, die unter PyPi oder auf Github hier zu finden ist:https://github.com/qiskit-community/qiskit-algorithms
Das
qiskit.algorithmsmodul 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 aufqiskit.algorithmsverwenden, sollten Sie die Anforderungen von Python aktualisieren, um auchqiskit-algorithmseinzubeziehen und die Importe vonqiskit.algorithmsaufqiskit_algorithmszu aktualisieren. Bitte beachten Sie, dass dieses neue Paket keinen Code für bereits veraltete Algorithmen enthält, einschließlichopflowundQuantumInstance-basierter Algorithmen. Wenn Sie noch nicht vonQuantumInstance-basierten zu primitiv-basierten Algorithmen migriert haben, sollten Sie die Migrationsrichtlinien in https://qisk.it/algo _migration befolgen. Die Entscheidung zur Migration desalgorithmsmodul 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
BlockCollectorhinzugefügt.Die erste neue Option
split_layerserlaubt 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_backermö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_layersundcollect_from_backwurden zuCollectLinearFunctionsundCollectCliffordstranspiler-Pässe.Wenn
split_layersTrue 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"] == 4Die 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_backwahr 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_backfalsch ist, werden die linearen Blöcke vom Anfang der Schaltung an gierig gesammelt, und somit wird CX(1, 0) mit CX(1, 2) kombiniert. Wenncollect_from_backwahr 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()undDAGCircuit.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
ControlFlowOpoperationen imCommutativeCancellationpass. Zuvor wurden die Blöcke in Kontrollflussoperationen bei diesem Durchgang übersprungen. -
Aktivierte Unterstützung für
ControlFlowOpoperationen imConsolidateBlockspass. -
Hinzugefügt
DAGCircuit.quantum_causal_cone()um den Kausalkonus eines Qubits in einemDAGCircuit. 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 derDAGCircuitklasse hinzugefügt, die die Bitpositionen der angegebenenQubitoderClbitals 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 , und 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()odergenerate_preset_pass_manager()mit dem Schlüsselwortargumentoptimization_level=3). -
DAGCircuit.substitute_node()ein Schlüsselwortargumentpropagate_conditiongewonnen, das dem gleichen Argument insubstitute_node_with_dag(). Durch die EinstellungFalsewird das bisherige Verhalten, eine Bedingung aufnodeauf die neueopzu 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 vonDAGCircuitobjekten zurückgibt, eines für jeden Satz verbundener Qubits, die keine Gates haben, die sie mit einem anderen Satz verbinden.Jede
DAGCircuitinstanz, die von dieser Methode zurückgegeben wird, enthält die gleiche Anzahl von Clbits wieself. Diese Methode gibt keineDAGCircuitinstanzen zurück, die nur aus Clbits bestehen. -
Hinzufügen des Attributs
Target.concurrent_measurementsdas 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
SetLayoutkann 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
EquivalenceLibrarywurden weitere Pauli-Rotationsäquivalenzen zwischen den Ein-Qubit-Gattern , und sowie zwischen den Zwei-Qubit-Gattern , und gelehrt. Dies sollte einfache Basisübersetzungen zuverlässiger machen, insbesondere Schaltungen, die Rotationen verwenden. Siehe #7332. -
Kontrollflussoperationen werden jetzt von der Sabre-Familie von Transpiler-Pässen unterstützt, nämlich Layout-Pass
SabreLayoutund Routing-PassSabreSwap. Die Funktiontranspile()die Schlüsselwortargumentelayout_methodundrouting_methodakzeptieren nun die Option"sabre"für Schaltungen mit Kontrollfluss, die bisher nicht unterstützt wurde.
Schaltkreise Funktionen
-
Die Felder
IfElseOp.condition,WhileLoopOp.conditionundSwitchCaseOp.targetkönnen nun Instanzen des neuen Laufzeittyps für klassische Ausdrücke seinexpr.Expr. Dies unterscheidet sich vonParameterExpressionweil 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:
bit_not()logic_not()bit_and()bit_or()bit_xor()logic_and()logic_or()equal()not_equal()less()less_equal()greater()greater_equal()
Diese können auf Python Integer- und Boolesche Literale wirken, oder auf
ClassicalRegisterundClbitinstanzen 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 überqiskit.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
ExprVisitorist für Verbraucher dieser Ausdrücke als Unterklasse vorgesehen. Zwei Hilfsprogramme, die auf dieser Struktur basieren,iter_vars()undstructurally_equivalent()werden ebenfalls bereitgestellt, die jeweils einen Iterator durch dieVarknoten erzeugen und prüfen, ob zweiExprinstanzen strukturell identisch sind, bis hin zu einer gewissen Abbildung derVarknoten enthalten. -
Funktion hinzugefügt
lift_legacy_condition()hinzugefügt, die verwendet werden kann, um Bedingungen alten Stils in Knoten neuen StilsExprknoten umwandelt. Beachten Sie, dass diese Ausdrucksknoten in Feldern des alten Stils nicht erlaubt sindInstruction.conditionfeldern nicht erlaubt, die durch fortschrittlichere klassische Handhabung wieIfElseOp. -
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()undbind_parameters()hat sich bei großen Schaltungen mit anwendungstypischen Strukturen deutlich erhöht. Dazu gehören die meisten Schaltungen, die auf derNLocalstruktur, wie zum BeispielEfficientSU2. Siehe #10282 für weitere Einzelheiten. -
Die Methode
QuantumCircuit.assign_parameters()hat zwei neue Schlüsselwortargumente erhalten:flat_inputundstrict. Dies sind erweiterte Optionen, die verwendet werden können, um die Methode zu beschleunigen, wenn die Parameterbindungen als Wörterbuch übergeben werden;flat_input=Trueist eine Garantie dafür, dass die Wörterbuchschlüssel nurParameterinstanzen (nichtParameterVectors), undstrict=Falseerlaubt 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
flattenhinzugefügt:Wenn dieses Argument auf
Truegesetzt ist, wird dieQuantumCircuitgenerierte Unterklasse die Implementierung nicht inGateoderInstructionobjekte. Dies ist zwar nicht optimal für die Visualisierung, führt aber in der Regel zu einer deutlich besseren Laufzeitleistung, insbesondere beiQuantumCircuit.bind_parameters()undQuantumCircuit.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 eineCircuitErrorAusnahme ausgelöst) - Verschachtelte Quantenschaltungen dieser Form
- Barrieren (vom Typ
-
Methode
LinearFunction.__eq__()hinzugefügt. Zwei Objekte des TypsLinearFunctionwerden 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 überkQubits zu einer linearen Funktion übern >= kQubits 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
LinearFunctionobjekte:LinearFunction.mat_str(), die die String-Repräsentation der linearen Funktion als Matrix mit 0/1 Einträgen zurückgibt, undLinearFunction.function_str()die die String-Repräsentation der linearen Funktion, betrachtet als lineare Transformation, zurückgibt. -
Die Anleitungen
StatePreparationundInitializeund die zugehörigen SchaltungsmethodenQuantumCircuit.prepare_state()undinitialize()erhalten ein Schlüsselwortargumentnormalize, das aufTruegesetzt werden kann, um ein Array-Ziel automatisch zu normalisieren. Standardmäßig ist diesFalse, 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
UMDAoptimierer 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()undExporter) haben ein neues Argumentallow_aliasing, das später das Argumentalias_classical_registersersetzen 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 denStatevectorundDensityMatrixklassen für zweiseitige reine Zustände. -
Fügt Unterstützung für die Multiplikation von
SparsePauliOpobjekten mitParameterobjekten, 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
SymbolicPulsedie 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 vonSquare()für die sich eine Phase von um einen vollen Zyklus verschiebt (im Gegensatz zur diskretensquare()wo eine solche Verschiebung durch eine -Phase hervorgerufen wurde). -
Die Methode
filter()wird in derScheduleBlockklasse. Mit dieser Methode können die Benutzer nurInstructionobjekte zu behalten, die alle angegebenen Filter durchlaufen haben. Als eingebaute Filterbedingungen können die PulseChannelunterklasseninstanz undInstructionunterklassentyp angegeben werden. Benutzerdefinierte Rückrufe, dieInstructioninstanz können den Filtern ebenfalls hinzugefügt werden. -
Die Methode
exclude()wird in derScheduleBlockklasse. Diese Methode ermöglicht es den Benutzern, nurInstructionobjekte zu behalten, die mindestens einen der angegebenen Filter nicht erfüllen. Als eingebaute Filterbedingungen können die PulseChannelunterklasseninstanz undInstructionunterklassentyp angegeben werden. Benutzerdefinierte Rückrufe, dieInstructioninstanz können den Filtern ebenfalls hinzugefügt werden. Diese Methode ist das Komplement vonfilter(), so dass die folgende Bedingung immer erfüllt ist:block.filter(*filters) + block.exclude(*filters) == blockin Bezug auf die enthaltenen Anweisungen, wobeiblockeineScheduleBlockinstanz ist. -
Hinzufügen einer neuen Funktion
gaussian_square_echo()in die Impulsbibliothek aufgenommen. Der zurückgesendete Impuls setzt sich aus dreiGaussianSquareimpulsen 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
DiscriminatorundKernel. Diese Funktion ermöglicht es dem Benutzer, die Anweisungen mit diesen ObjektenAcquireanweisungen 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 Matrixmat_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 Funktioncircuit_drawer()bei Verwendung der Optionoutput='mpl'unterstützen nun das Zeichnen der verschachtelten Schaltkreisblöcke vonControlFlowOpoperationen, einschließlichif,else,while,forundswitch/case. Die Schaltkreisblöcke sind mit Kästchen umhüllt, um die Schaltkreise abzugrenzen. -
Einige Einschränkungen bei der Verwendung von
wire_orderin den Schaltkreisschubladen wurden gelockert. Nun kannwire_ordernur Qubits auflisten und in diesem Fall kann es mitcregbundle=Trueverwendet 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_tablevonqiskit.tools.jupyterumfasst nun alle importierten Module mitqiskitim 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 vonQuantumCircuitobjekten 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 stattdessentranspile()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()odermultiprocessingaus der Python Standardbibliothek verwenden, wenn Sie dies parallel ausführen möchten. -
Die Sabre-Familie der Transpilerpässe (nämlich
SabreLayoutundSabreSwap) werden nun standardmäßig für alle Schaltkreise verwendet, wenn der Transpiler auf Optimierungsebene 1 aufgerufen wird (z. B. durch Aufruf vontranspile()odergenerate_preset_pass_manager()mit dem Schlüsselwortargumentoptimization_level=1). Bisher verwendeten Schaltungen mit KontrollflussoperationenDenseLayoutundStochasticSwapmit diesem Profil.
Hinweise zur Aktualisierung von Schaltkreisen
-
Die OpenQASM 2 Konstruktormethoden auf
QuantumCircuit(from_qasm_str()undfrom_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
QuantumCircuitmethoden 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 vonqasm2.load()undqasm2.loads()zu verwenden, die eine erweiterte Schnittstelle zur Steuerung des Parsens und der Konstruktion bieten. -
Das veraltete
circuit_cregsArgument für den Konstruktor derInstructionSetklasse wurde entfernt. Sie wurde in der Version 0.19.0 veraltet. Wenn Sie dieses Argument verwenden und manuell einInstructionSetobjekts (was ziemlich ungewöhnlich sein sollte, da es meist intern verwendet wird), sollten Sie stattdessen ein Callable an das Schlüsselwortargumentresource_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()undfrom_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
QuantumCircuitmethoden 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 vonqasm2.load()undqasm2.loads()zu verwenden, die eine erweiterte Schnittstelle zur Steuerung des Parsens und der Konstruktion bieten. -
Die OpenQASM 3 Ausführer (
qasm3.dump(),dumps()undExporter) verwenden nun weniger "register alias"-Definitionen in ihrer Ausgabe. Die beschriebene Schaltung ändert sich nicht, aber sie exportiert nun vorzugsweise in Form von direktenbit,qubitundqubit[n]Typen, anstatt ein_loose_bitsRegister 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, derendefinitionfelder sich gegenseitig mit einem anderen Objekt rekursiv sind. Solche rekursiven Definitionen sind bereits ein Verstoß gegen die streng hierarchische Ordnung, die dasdefinitionfeld 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 eineEquivalenceLibrary.
Hinweise zum Upgrade der Visualisierung
-
In dem internen Objekt
~qiskit.visualization.circuit.matplotlib.MatplotlibDrawerwurden die Argumentelayout,global_phase,qregsundcregsentfernt. Sie waren ursprünglich in Qiskit Terra 0.20 veraltet. Diese Objekte werden nun einfach aus der angegebenencircuitabgeleitet.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.utilwurde entfernt, da er seit Qiskit Terra 0.17 veraltet war. Die Benutzer sollten den neuen Importortqiskit.utilsverwenden.
Hinweise zu veralteten Versionen
-
Erweiterungen der Namensräume
qiskitundqiskit.providersdurch 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 vonqiskit.xoderqiskit.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 wirdqiskit.__version__der einzige Punkt sein, um die Qiskit-Version als Standard-String abzufragen.
Transpiler-Veraltungen
- Die Funktion
get_vf2_call_limit, die über das Modulqiskit.transpiler.preset_passmanagers.commonverfü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.algorithmsmodul ist veraltet und wird in einer zukünftigen Version entfernt werden. Sie wurde durch eine neue, eigenständige Bibliothekqiskit-algorithmsersetzt, die unter PyPi oder auf Github hier zu finden ist:https://github.com/qiskit-community/qiskit-algorithms
Das
qiskit.algorithmsmodul 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 aufqiskit.algorithmsverwenden, sollten Sie die Anforderungen von Python aktualisieren, um auchqiskit-algorithmseinzubeziehen und die Importe vonqiskit.algorithmsaufqiskit_algorithmszu aktualisieren. Bitte beachten Sie, dass dieses neue Paket keinen Code für bereits veraltete Algorithmen enthält, einschließlichopflowundQuantumInstance-basierter Algorithmen. Wenn Sie noch nicht vonQuantumInstance-basierten zu primitiv-basierten Algorithmen migriert haben, sollten Sie die Migrationsrichtlinien in https://qisk.it/algo _migration befolgen. Die Entscheidung zur Migration desalgorithmsmodul 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
ScalableSymbolicPulsemit komplexem Wert füramp. Diese Änderung betrifft auch die folgenden Bibliotheksimpulse:Die Initialisierung von
ampmit einem komplexen Wert ist nun ebenfalls veraltet.Verwenden Sie stattdessen zwei Fließkommazahlen, wenn Sie die Parameter
ampundangleangeben, wobeiampfür den Betrag der komplexen Amplitude steht und angle für den Winkel der komplexen Amplitude. d.h. die komplexe Amplitude ist gegeben durch . -
Die Anweisung
Callanweisung ist veraltet und wird in einer zukünftigen Version entfernt werden. Verwenden Sie stattdessen die Funktioncall()von Modulqiskit.pulse.builderinnerhalb eines aktiven Gebäudekontexts.
Versch. Einstellung von Unterstützung
-
Die Jupyter-Magie
%circuit_library_infound die Objekte inqiskit.tools.jupyter.libraryruft sie der Reihe nach auf:circuit_data_tableproperties_widgetqasm_widgetcircuit_digram_widgetcircuit_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
exprmodul erstellt wurden, werden von den Schaltkreisvisualisierern noch nicht unterstützt.
Fehlerkorrekturen
-
Es wurde ein Fehler in
Channelbehoben, 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 übergenerate_preset_pass_manager()generiert wurden, bei denen die AusgabeQuantumCircuitobjektslayoutattribut ein ungültigesTranspileLayout.final_layoutattribut hatte. Dies würde in Szenarien auftreten, in denen derVF2PostLayoutdurchlauf ein alternatives Anfangslayout mit niedrigeren Fehlerquoten finden würde. Beim Ändern des ursprünglichen Layouts wurde dasfinal_layoutattribut nie aktualisiert, um diese Änderung widerzuspiegeln. Dies wurde korrigiert, so dass diefinal_layoutdie durch die Routing-Stufe verursachte Ausgangspermutation immer korrekt wiedergibt. Behoben #10457 -
Der Parser OpenQASM 2 (
qasm2.load()undloads()), der im Modusstrictläuft, gibt nun korrekt einen Fehler aus, wenn einebarrier-Anweisung keine Argumente hat. Im (standardmäßigen) freizügigeren Modus verursacht eine argumentlosebarrier-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,barrierAnweisungen 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 einQASM2ExportErrornun korrekt ausgelöst werden. Siehe #7351 und #10435. -
Es wurde ein Problem bei der Verwendung von
Targets ohne Kopplung von Maps mit demFullAncillaAllocationtranspiler-Durchgang. In diesem Fall,FullAncillaAllocationnun Ancilla-Qubits hinzufügen, so dass die Anzahl der Qubits in derDAGCircuitmit der vonTarget.num_qubitsübereinstimmt. -
DAGCircuit.substitute_node()überschreibt nicht mehr stillschweigend eine bestehende Bedingung auf der angegebenen Ersetzungop. Wennpropagate_conditionaufTruegesetzt ist (Standardeinstellung), wird stattdessen einDAGCircuitErrorstattdessen 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
Statevectoraus einerQuantumCircuitdie 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
ClassicalRegisterressourcen 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 angegebeneinst_map, die eineSchedulemit nicht zugewiesenen Laufzeiten. -
Wenn der Parameter
conditional=Trueinrandom_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 Argumentinplacewiderzuspiegeln. -
Die Methoden OpenQASM 2 circuit-constructor (
QuantumCircuit.from_qasm_str()undfrom_qasm_file()) werden nicht mehr fehlschlagen, wenn sie auf einegateDefinition treffen, dieUoderCXAnweisungen enthält. Siehe #5536. -
Reduzierter Overhead des
ConsolidateBlocksdurch die Durchführung von Matrixoperationen auf allen Zwei-Qubit-Blöcken, anstatt eine Instanz vonQuantumCircuitzu erzeugen und diese an eineOperator. Der Geschwindigkeitszuwachs ist nur bei der Konsolidierung von Zwei-Qubit-Blöcken möglich. Alles, was darüber hinausgeht, wird weiterhin von derOperatorklasse. Siehe #8779 für weitere Informationen. -
Der OpenQASM 3 Exporter (
qiskit.qasm3) gibt nicht länger ungültige OpenQASM 3 für nicht-unitäreInstructioninstanzen aus, sondern gibt stattdessen eineQASM3ExporterErrorund 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 vonstate_drawer()führte. Behoben #9297.