Qiskit 1.0 Versionshinweise
1.0.2
Vorspiel
Qiskit 1.0.2 ist ein kleineres Bugfix-Release für die 1.0 Serie.
Fehlerkorrekturen
-
Ein Problem wurde behoben mit
convert_to_target()bei dem der Konverter fälschlicherweise Kontrollflussanweisungen ignorierte, wenn sie im AttributBackendConfiguration.supported_instructionsangegeben waren, was der typische Ort ist, an dem Kontrollflussanweisungen in einemBackendConfigurationobjekt angegeben werden. Behoben #11872. -
Der Aufruf von
EquivalenceLibrary.set_entry()wird nun das interne Graph-Objekt der Bibliothek korrekt aktualisiert. Bisher wurden zwar die Metadaten aktualisiert, aber die Diagrammstruktur blieb unverändert, so dass Benutzer wieBasisTranslatorimmer noch die alten Regeln verwenden würden. Behoben #11958. -
Das Programm
EvolvedOperatorAnsatzbehandelt jetzt korrekt den Fall, dass das Argumentoperatorseine leere Liste ist. Zuvor hatte dies zu einem Fehler geführt. -
Es wurde ein Konsistenzproblem mit
EvolvedOperatorAnsatzinstanzen mit Null-Qubits. Zuvor enthielten solche Instanzen eine einzelneQuantumRegisterinqregsmit null Qubits, aber jetzt werden keine Register erstellt. Dieses Verhalten steht im Einklang mit seiner OberklasseQuantumCircuit. -
Behebung eines Absturzes in
convert_to_target()der auftrat, wenn Qubit-Eigenschaften (entweder T1, T2 oder Frequenz) fehlten. Die fehlenden Eigenschaftswerte inQubitPropertieswerden nun mitNoneaufgefüllt. -
Es wurde ein Leistungsproblem in der Funktion
qpy.load()funktion bei der Deserialisierung von QPY-Payloads mit einer großen Anzahl von Qubits oder Clbits in einem Schaltkreis. -
Es wurde ein Fehler behoben, bei dem
EstimatorPub.coerce()undSamplerPub.coerce()einen Parameter vom TypBindingsArraynicht korrekt behandelten. Zuvor wurde fälschlicherweise eineValueErrorAusnahme ausgelöst. -
Die voreingestellten Pass-Manager, die von
transpile()verwendeten voreingestellten Pass-Manager schlagen bei Schaltungen mit Kontrollfluss nicht mehr fehl, wenn kein Hardware-Ziel oder Basis-Gate-Set angegeben ist. Sie werden nun solche abstrakten Ziele so behandeln, als ob sie alle Kontrollflussoperationen zulassen. Behoben #11906. -
coerce()wurde korrigiert, so dass es ein 0-d-Array zurückgibt, wenn die Eingabe ein einzelnes, nicht verschachteltes Observable ist. Zuvor wurde es fälschlicherweise auf eine einzige Dimension aktualisiert, mit der Form(1,). -
Parameterwurde aktualisiert, so dass Instanzen, die gleich sind, immer den gleichen Hash haben. Zuvor wurde nur dieParameter.uuidverglichen, so dassParameterinstanzen mit unterschiedlichen Namen konnten gleich verglichen werden, wenn sie mit einem gemeinsamen Wert für den Parameteruuidkonstruiert worden waren (der normalerweise nicht explizit übergeben wird). -
Fehler behoben in
QuantumCircuit.draw()der dazu führte, dass benutzerdefinierte Stilwörterbücher für die Schublade Matplotlib bei der Ausführung geändert wurden.
1.0.1
Vorspiel
Qiskit 1.0.1 ist ein Patch-Release, das eine kleine Anzahl von Fehlern behebt, die in der Qiskit 1.0.0 Version identifiziert wurden.
Fehlerkorrekturen
-
Es wurde ein Fehler bei der Konvertierung von benutzerdefinierten Impulsanweisungen in das Legacy
qiskit.qobjformat. Der Fehler wurde in Qiskit 1.0.0 eingeführt und führte dazu, dass die Konvertierung von Anweisungen mit benutzerdefinierten Pulsformen einen Fehler auslöste. Nach der Korrektur wird die Konvertierung korrekt durchgeführt, und der benutzerdefinierte Impuls wird ordnungsgemäß in einepulse.Waveformumgewandelt. Behoben #11828. -
Es wurde ein Problem im
InverseCancellationtranspiler-Durchgang, bei dem in einigen Fällen ein selbstinverses parametrisiertes Gatter fälschlicherweise abgebrochen wurde, selbst wenn der Parameterwert nicht übereinstimmte. Behoben #11815. -
BasePassManager.run()wird nicht mehr die vorherigePropertySetin neue Workflows, wenn sie mehr als einmal aufgerufen werden. Zuvor wurden die gleichenPropertySetzur Initialisierung von Folgeläufen verwendet, was dazu führen konnte, dass ungültige Eigenschaftsinformationen an Aufgaben weitergegeben wurden. Das Verhalten entspricht nun dem von Qiskit 0.44. Behoben #11784. -
In
convert_durations_to_dt()wurde ein Fehler behoben, bei dem die Funktion davon ausging, dass alle Eingaben in Sekunden erfolgten, anstatt die tatsächliche Einheit zu lesen. Dies könnte zu falschen Größenordnungen bei den angegebenen Schaltkreisdauern führen.
1.0.0
Vorspiel
Wir freuen uns sehr über die Veröffentlichung von Qiskit 1.0.0. Diese Version ist der Höhepunkt von 7 Jahren Entwicklung, um Qiskit zu einem stabilen, hochleistungsfähigen SDK für Quantencomputer auszubauen, und ist der Beginn einer neuen Ära für das Qiskit-Projekt und die Community. Neben allgemeinen Leistungs- und Stabilitätsverbesserungen beziehen sich die wichtigsten Änderungen der Version 1.0.0 auf die Stabilitätspolitik, die Veröffentlichungszyklen und die Versionierung. Qiskit verwendet nun offiziell die semantische Versionierung, was bedeutet, dass das Projekt während des gesamten Lebenszyklus der 1.x Versionsreihe die Abwärtskompatibilität seiner öffentlich dokumentierten APIs aufrechterhalten will. Wir bieten jetzt auch Bugfix-Support für Hauptversionen an, so dass Sie noch 6 Monate nach der Veröffentlichung der nächsten Hauptversion über einen unterstützten Zweig verfügen. Dies beginnt nun mit den Hauptversionen 1.x und 0.x : Die Version 0.46.x wird weiterhin unterstützt, mit regelmäßigen Patch-Versionen, die Fehlerkorrekturen enthalten, für 6 Monate nach der Veröffentlichung von 1.0. Das heißt, 0.46.x wird bis 2024-08 unterstützt. Die vollständigen Einzelheiten der neuen Politik können Sie hier einsehen:
start/install#qiskit-versioning
Von zentraler Bedeutung in dieser Version ist auch die Änderung der Verpackung. Seit der Veröffentlichung von Qiskit 0.7 im Jahr 2018-12, als Qiskit sein Elementemodell einführte, ist das Paket qiskit , das Sie installieren würden, ein Meta-Paket (oder ein Paket von Paketen), das die kombinierten Elemente installiert, aus denen Qiskit besteht. Wie bereits in früheren Veröffentlichungen angekündigt (weitere Einzelheiten finden Sie in der 0.44.0, 0.45.3, und 0.46.0 release Notes, zusammen mit diesem Blog-Post ), schließen wir mit der 1.0 Release den Übergang zu einem einzigen qiskit Paket ab, das nur noch das Kern-SDK enthält (was vorher qiskit-terra war). Das bedeutet, dass wir für die Versionen >= 1.0.0 das Paket qiskit-terra nicht mehr verwenden und nur noch qiskit veröffentlichen werden. Da diese Änderung in der Paketstruktur vom Python -Paketinstallationsprogramm pip nicht vollständig unterstützt wird, ist es nicht möglich, einfach pip install -U qiskit für ein Upgrade von qiskit 0.46.0 auf 1.0.0 zu verwenden. Es wird dringend empfohlen, dass Sie für das Upgrade auf Qiskit 1.0.0 eine separate virtuelle Umgebung erstellen, um die Installation zu isolieren. Es gibt einen detaillierten Migrationsleitfaden, der die Änderungen an den Paketen und die Installation von Qiskit 1.0.0 in verschiedenen Szenarien erklärt und hier zu finden ist:
https://qisk.it/1-0-packaging-migration
Wie alle unsere Hauptversionen hat auch Qiskit 1.0.0 eine Fülle neuer Funktionen, die Highlights dieser Version sind:
- Die
QuantumCircuitdie interne Struktur der Klassedatastruktur der Klasse wurde in Rust umgeschrieben, um die Speichereffizienz derQuantumCircuitobjekte zu verbessern, indem die Argumente der Anweisungen zwischengespeichert werden.- Eine neue Version der Schnittstellendefinition für Primitive in
qiskit.primitivesmit denBaseSamplerV2undBaseEstimatorV2abstrakten Klassen. Diese neue Version der Schnittstelle unterstützt die Durchführung von vektorisierten Aufrufen des Primitivs, so dass Sweeps über Parameterwertsätze und Observablen effizient spezifiziert werden können.- Ein neuer experimenteller nativer OpenQASM 3 Parser
qiskit.qasm3.loads_experimental()undqiskit.qasm3.load_experimental(). Dieser neue Parser befindet sich noch in der Entwicklung und hat noch einige Einschränkungen und ist noch experimentell. Der neue Parser ist jedoch wesentlich schneller und verfügt über eine bessere Fehlermeldung, die eine Fehlersuche in einem OpenQASM 3 Programm ermöglicht, wenn dieses ungültig ist. Dieser neue Parser ist in Rust geschrieben und basiert auf einer neu entwickelten Rust-Bibliothek zum Parsen von OpenQASM3, die hier zu finden ist: https://github.com/Qiskit/openqasm3_parser
Schließlich war die Veröffentlichung von Qiskit 1.0.0 eine Gelegenheit, einige technische Schulden zu bereinigen, die sich in den letzten 7 Jahren der Entwicklung angesammelt hatten. Sie werden feststellen, dass die Version von Qiskit 1.0.0 praktisch frei von DeprecationWarningist, und gleichzeitig ist der Abschnitt über die Aktualisierung in den Versionshinweisen von 1.0.0 länger als üblich. Dies sind unmittelbare Folgen der Bereinigung der technischen Schulden. Um die Migration von 0.46.x auf 1.0.0 zu erleichtern, haben wir neben den Versionshinweisen auch eine spezielle Migrationsanleitung veröffentlicht, die Sie hier finden:
Qiskit 1.0 Funktionsänderungen
Dieser Leitfaden ist als Ergänzung zu den Versionshinweisen gedacht und enthält gezielte Hinweise für die Migration der API-Änderungen nach der Entfernung der veralteten Funktionen aus der Version 0.46.0.
Schaltkreise Funktionen
-
Ein neues Argument,
annotated, wurde zu den MethodenQuantumCircuit.inverse(),circuit.Instruction.inverse()und.inverse()Methoden vonInstructionunterklassen (wie z.BSwapGateoderSGate) zur optionalen Rückgabe einesAnnotatedOperation. Der Standardwert vonannotatedistFalseund entspricht dem bereits vorhandenen Verhalten der Methode. Darüber hinaus hat das Argumentannotatedbei Standardgattern mit einer explizit definierten Methodeinversekeine Wirkung, z. B. bei beiden:SwapGate().inverse(annotated=False) SwapGate().inverse(annotated=True)rückgabe a
SwapGateund beides:SGate().inverse(annotated=False) SGate().inverse(annotated=True)rückgabe eines
SdgGate. Der Unterschied zeigt sich bei benutzerdefinierten Anweisungen ohne explizit definierte Umkehrung. Mitannotated=Falsegibt die Methode eine neue Anweisung mit der rekursiv invertierten Definition zurück, genau wie zuvor. Währendannotated=TrueeineAnnotatedOperationzurück, das die mit dem BefehlInverseModifier. -
Hinzufügen einer Kommutierungsbibliothek zur
CommutationChecker. Diese Bibliothek speichert alle Kommutationsbeziehungen von unparametrisierbaren Standardgattern in einem Wörterbuch, das ein effizientes Nachschlagen zur Laufzeit ermöglicht. Dies beschleunigt die Ausführung derCommutationCheckerklasse und damit auch desCommutationAnalysistranspiler-Durchlaufs, denn statt zu berechnen, ob zwei nicht parametrisierbare Standardtore pendeln, muss er nur in der Bibliothek nachschlagen.Außerdem wurde die
CommutationCheckerüberarbeitet und hat nun eine Obergrenze für die Anzahl der zwischengespeicherten Kommutationsbeziehungen, die nicht in der Kommutationsbibliothek enthalten sind. Dies betrifft: # Nr. 8020 und Nr. 7101 -
QuantumCircuit.assign_parameters()akzeptiert jetzt String-Schlüssel in der Mapping-Form der Eingabe. Diese Namen werden verwendet, um die entsprechendeParameterinstanz mitget_parameter(). Das können Sie tun:from qiskit.circuit import QuantumCircuit, Parameter a = Parameter("a") qc = QuantumCircuit(1) qc.rx(a, 0) qc.assign_parameters({"a": 1}) == qc.assign_parameters({a: 1}) -
QuantumCircuithat zwei neue Methoden,get_parameter()undhas_parameter(), die jeweils eineParameterinstanz, die in der Schaltung verwendet wird, anhand ihres Namens abrufen und einen booleschen Wert zurückgeben, der angibt, ob ein Parameter mit dem gleichen Namen (oder die genaue Instanz) in der Schaltung verwendet wird. -
A
uuideigenschaft wurde derqiskit.circuit.Parameterklasse hinzugefügt. In fortgeschrittenen Anwendungsfällen kann diese Eigenschaft verwendet werden, umqiskit.circuit.Parameterinstanzen, die miteinander verglichen werden. -
Es wurde eine neue Methode hinzugefügt,
ParameterExpression.numeric()hinzugefügt, die einen vollständig gebundenen Parameterausdruck in den restriktivsten eingebauten numerischen Typ Python umwandelt, der das Ergebnis der symbolischen Auswertung genau beschreibt. Zum Beispiel wird eine symbolische ganze Zahl zu einemint, während eine symbolische reelle Zahl zu einemfloatund eine komplexe Zahl wird zu acomplex. Diese Methode enthält mehrere Umgehungen für die Besonderheiten der Auswertungskontexte vonsymengine, die manchmal zu falschen Ergebnissen führen können, wenn mancomplexoderfloatfür einen Ausdruck direkt aufrufen.
Primitive Funktionen
-
Version 2 der Primitive wird durch eine neue Basisklasse sowohl für den Sampler als auch für den Estimator eingeführt, zusammen mit neuen Typen für ihre Eingänge und Ausgänge. Der Schwerpunkt dieser neuen Version liegt auf der Durchführung von vektorisierten Aufrufen der primitiven
run()Methoden, so dass Sweeps über Parameterwertsätze und Observablen effizient spezifiziert werden können. SieheStatevectorSamplerundStatevectorEstimatorfür Referenzimplementierungen der V2 Primitive.Außerdem hat der Schätzer ein
precisionArgument in derrun()das die angestrebte Genauigkeit der Erwartungswertschätzungen angibt. Analog dazu hat der Probenehmershotsaus den Optionen in die Argumente derrun()methode verschoben. Der Sampler wurde auch dahingehend geändert, dass er die Ausgaben (z. B. Bitstrings) von jedem Schuss zurückgibt, anstatt eineCounts-zurückzugeben, und auch die Daten von separatenClassicalRegisters. Dies ermöglicht es abgeleiteten Klassen, Sampler-Unterstützung für Schaltungen mit klassischem Kontrollfluss zu implementieren.Die primitiven Basisklassen V2 sind:
Die neuen Typen, die für Eingänge und Ausgänge verwendet werden, sind:
SamplerPubLikeprimitiver einheitlicher Block ( PUB ) von Sampler-Eingängen; ein Vereinigungstyp von zulässigen Eingängen zu einem SamplerEstimatorPubLike: Primitiver vereinheitlichter Block ( PUB ) von Schätzereingaben; eine Art Vereinigung von zulässigen Eingaben für einen SchätzerPubResultdie Daten und Metadaten, die sich aus der Ausführung einer einzelnen PUB ergebenDataBin: Ein Namespace, der die Daten einer einzelnen Ausführung von PUB enthältBitArrayeine array-bewertete Sammlung von Bitwerten in einem dichten FormatPrimitiveResult: eine Iterable vonPubResults zusammen mit Metadaten
-
Die Referenzimplementierung
StatevectorEstimatorvonBaseEstimatorV2wurde hinzugefügt. Wie im folgenden Beispiel zu sehen ist, unterstützt dieser Schätzer (und alle V2 Schätzer) die Bereitstellung von Arrays von Beobachtungswerten und/oder Arrays von Parameterwertsätzen, die mit bestimmten Schaltkreisen verbunden sind.Jedes Tupel von
(circuit, observables, <optional> parameter values, <optional> precision), das als primitiver vereinheitlichter Schätzer-Block ( PUB ) bezeichnet wird, erzeugt sein eigenes array-basiertes Ergebnis. Die Methoderun()kann in vielen Lokalen gleichzeitig angewendet werden.from qiskit.circuit import Parameter, QuantumCircuit from qiskit.primitives import StatevectorEstimator from qiskit.quantum_info import Pauli, SparsePauliOp import matplotlib.pyplot as plt import numpy as np # Define a circuit with two parameters. circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.ry(Parameter("a"), 0) circuit.rz(Parameter("b"), 0) circuit.cx(0, 1) circuit.h(0) # Define a sweep over parameter values, where the second axis is over # the two parameters in the circuit. params = np.vstack([ np.linspace(-np.pi, np.pi, 100), np.linspace(-4 * np.pi, 4 * np.pi, 100) ]).T # Define three observables. Many formats are supported here including # classes such as qiskit.quantum_info.SparsePauliOp. The inner length-1 # lists cause this array of observables to have shape (3, 1), rather # than shape (3,) if they were omitted. observables = [ [SparsePauliOp(["XX", "IY"], [0.5, 0.5])], [Pauli("XX")], [Pauli("IY")] ] # Instantiate a new statevector simulation based estimator object. estimator = StatevectorEstimator() # Estimate the expectation value for all 300 combinations of # observables and parameter values, where the pub result will have # shape (3, 100). This shape is due to our array of parameter # bindings having shape (100,), combined with our array of observables # having shape (3, 1) pub = (circuit, observables, params) job = estimator.run([pub]) # Extract the result for the 0th pub (this example only has one pub). result = job.result()[0] # Error-bar information is also available, but the error is 0 # for this StatevectorEstimator. result.data.stds # Pull out the array-based expectation value estimate data from the # result and plot a trace for each observable. for idx, pauli in enumerate(observables): plt.plot(result.data.evs[idx], label=pauli) plt.legend() -
Die Referenzimplementierung
StatevectorSamplervonBaseSamplerV2wurde hinzugefügt. Wie im folgenden Beispiel zu sehen ist, unterstützt dieser Probenehmer (und alle V2 Probenehmer) die Bereitstellung von Arrays von Parameterwertsätzen zur Bindung an einen einzelnen Schaltkreis.Jedes Tupel von
(circuit, <optional> parameter values, <optional> shots), das als Sampler Primitive Unified Bloc ( PUB ) bezeichnet wird, erzeugt sein eigenes Array-basiertes Ergebnis. Die Methoderun()kann in vielen Lokalen gleichzeitig angewendet werden.from qiskit.circuit import ( Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister ) from qiskit.primitives import StatevectorSampler import matplotlib.pyplot as plt import numpy as np # Define our circuit registers, including classical registers # called 'alpha' and 'beta'. qreg = QuantumRegister(3) alpha = ClassicalRegister(2, "alpha") beta = ClassicalRegister(1, "beta") # Define a quantum circuit with two parameters. circuit = QuantumCircuit(qreg, alpha, beta) circuit.h(0) circuit.cx(0, 1) circuit.cx(1, 2) circuit.ry(Parameter("a"), 0) circuit.rz(Parameter("b"), 0) circuit.cx(1, 2) circuit.cx(0, 1) circuit.h(0) circuit.measure([0, 1], alpha) circuit.measure([2], beta) # Define a sweep over parameter values, where the second axis is over. # the two parameters in the circuit. params = np.vstack([ np.linspace(-np.pi, np.pi, 100), np.linspace(-4 * np.pi, 4 * np.pi, 100) ]).T # Instantiate a new statevector simulation based sampler object. sampler = StatevectorSampler() # Start a job that will return shots for all 100 parameter value sets. pub = (circuit, params) job = sampler.run([pub], shots=256) # Extract the result for the 0th pub (this example only has one pub). result = job.result()[0] # There is one BitArray object for each ClassicalRegister in the # circuit. Here, we can see that the BitArray for alpha contains data # for all 100 sweep points, and that it is indeed storing data for 2 # bits over 256 shots. assert result.data.alpha.shape == (100,) assert result.data.alpha.num_bits == 2 assert result.data.alpha.num_shots == 256 # We can work directly with a binary array in performant applications. raw = result.data.alpha.array # For small registers where it is anticipated to have many counts # associated with the same bitstrings, we can turn the data from, # for example, the 22nd sweep index into a dictionary of counts. counts = result.data.alpha.get_counts(22) # Or, convert into a list of bitstrings that preserve shot order. bitstrings = result.data.alpha.get_bitstrings(22) print(bitstrings)
Anbieter Funktionen
-
Eine neue Klasse wurde hinzugefügt,
GenericBackendV2zu demqiskit.providers.fake_providermodul hinzugefügt. Diese Klasse ist konfigurierbar und erstellt eineBackendV2backend-Instanz, die lokal ausgeführt werden kann (im Sinne der Fake-Backends). Die Benutzer können die Anzahl der Qubits, die Basisgatter, die Kopplungskarte, die Fähigkeit zur Ausführung dynamischer Schaltungen (Kontrollflussanweisungen), die Anweisungskalibrierungen und die Messzeitschritte des Backends konfigurieren, ohne sich mit der manuellen Konstruktion von Targets befassen zu müssen. Qubit- und Gate-Eigenschaften (Dauer, Fehler) werden durch Zufallsstichproben aus Standardbereichen erzeugt. Der Seed für diese Zufallsgenerierung kann festgelegt werden, um die Reproduzierbarkeit der Backend-Ausgabe zu gewährleisten. Es ist wichtig zu beachten, dass dieses Backend nur Gates aus der Standardbibliothek unterstützt. Wenn Sie ein flexibleres Backend benötigen, gibt es immer die Möglichkeit, direkt einTargetobjekt zu instanziieren, das für die Transpilierung verwendet wird.Anwendungsbeispiel 1:
from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import GenericBackendV2 # Create a simple circuit circuit = QuantumCircuit(3) circuit.h(0) circuit.cx(0,1) circuit.cx(0,2) circuit.measure_all() circuit.draw('mpl') # Define backend with 3 qubits backend = GenericBackendV2(num_qubits=3) # Transpile and run transpiled_circuit = transpile(circuit, backend) result = backend.run(transpiled_circuit).result()Anwendungsbeispiel 2:
from qiskit import QuantumCircuit, ClassicalRegister, transpile from qiskit.providers.fake_provider import GenericBackendV2 # Create a circuit with classical control creg = ClassicalRegister(19) qc = QuantumCircuit(25) qc.add_register(creg) qc.h(0) for i in range(18): qc.cx(0, i + 1) for i in range(18): qc.measure(i, creg[i]) with qc.if_test((creg, 0)): qc.ecr(20, 21) # Define backend with custom basis gates and control flow instructions backend = GenericBackendV2( num_qubits=25, basis_gates=["ecr", "id", "rz", "sx", "x"], control_flow=True, ) #Transpile transpiled_qc = transpile(qc, backend)AnmerkungDie von dieser Klasse erzeugten Rauscheigenschaften ahmen kein konkretes Quantengerät nach und sollten nicht dazu verwendet werden, konkrete Verhaltensweisen zu messen. Es handelt sich um "vernünftige Vorgaben", die zum Testen von Backend-Schnittstellenfunktionen verwendet werden können, die nicht an bestimmte Rauschwerte realer Quantensysteme gebunden sind. Für eine genauere Simulation vorhandener Geräte können Sie manuell ein Geräuschmodell aus dem realen Backend erstellen, indem Sie die Funktionen in
qiskit_aer. -
Das
qiskit.providers.fake_providermodul enthält nun eine Reihe von generischen Fake-Backends, die derBackendV1schnittstelle. Sie wurden als Alternative zu den Snapshot-basierten Fake-Backends eingeführt, die in den veraltetenFakeProvider(FakeVigo,FakeTokyo, etc) enthalten sind. Die Liste der neuen gefälschten Backends umfasst:-
Backends ohne Impulsfunktion:
-
Backends mit Impulsfunktion:
Sie können nach folgendem Muster importiert werden:
from qiskit.providers.fake_provider import Fake5QV1. Weitere Einzelheiten zu den Backend-Eigenschaften finden Sie in der API-Dokumentation des jeweiligen Backends. -
OpenQASM Funktionen
-
Das
qiskit.qasm3paket enthält nun einen eingebauten, auf Rust basierenden Parser zum Einlesen von OpenQASM 3 Programmen inQuantumCircuits, zu finden unterqiskit.qasm3.load_experimental()undloads_experimental(). Diese sind in der Regel um ein Vielfaches schneller als die bestehenden, reinen Pythonload()undloads()funktionen, für die zusätzlichqiskit-qasm3-importinstalliert werden muss.Wir können zum Beispiel eine Verschränkung mit 20.000 Befehlen erstellen
QuantumCircuit:import numpy as np import qiskit.qasm3 from qiskit.circuit.library import RealAmplitudes qc = RealAmplitudes(100, reps=100, flatten=True) qc = qc.assign_parameters(np.random.rand(qc.num_parameters)) oq3 = qiskit.qasm3.dumps(qc)Das alte
qasm3.loads()brauchte etwa 7.3s um das resultierende OpenQASM 3 Programm zu laden, währendqasm3.loads_experimental()unter 300ms auf einem Macbook Pro ( i7, 2020) - eine Beschleunigung von 25x!Der unterstützte Funktionsumfang des experimentellen Parsers ist in dieser Vorabversion sehr begrenzt, wird aber mit der Verbesserung sowohl der Qiskit-Seite als auch des nativen Rust-basierten Parsers erweitert.
Eines unserer Hauptziele bei diesem neuen Parser ist neben den enormen Geschwindigkeitsverbesserungen die Bereitstellung einer erstklassigen Fehlerdiagnose. Wie bei anderen Teilen des Parsers sind diese noch in Arbeit, aber Sie werden schon bald viel bessere Fehlermeldungen sehen, wenn Sie ungültige OpenQASM 3 Programme mit dem experimentellen Parser parsen.
-
Der OpenQASM 3 Exporter (siehe
dump()unddumps()funktionen inqiskit.qasm3) unterstützt jetzt standardmäßig die stabilisierte Syntax der Anweisungswitchin OpenQASM 3. Die Vorzertifizierungssyntax der Anweisungswitchist weiterhin verfügbar, indem dasExperimentalFeatures.SWITCH_CASE_V1flagge imexperimentalArgument des Exporteurs. Für die stabilisierte Syntax ist kein Merkmalsflag erforderlich, aber wenn Sie mit anderen Werkzeugen arbeiten, die noch nicht aktualisiert wurden, müssen Sie möglicherweise das Experimentalflag übergeben.Die Syntax der stabilisierten Form unterscheidet sich geringfügig in Bezug auf die Beendigung von
breakAnweisungen (nicht mehr erforderlich und nicht mehr zulässig), und mehrere Fälle werden nun in einer einzigencaseZeile zusammengefasst, anstatt das Fall-Through-Verfahren im Stil von C zu verwenden. Weitere Einzelheiten finden Sie in der Dokumentation OpenQASM 3 über das switch-case-Konstrukt.
QPY-Funktionen
-
Eine neue Warnklasse wurde hinzugefügt,
QPYLoadingDeprecatedFeatureWarningzum QPY-Modul hinzugefügt. Diese Klasse ermöglicht es, Warnungen vor veralteten Funktionen auch dann anzuzeigen, wenn der Zugriff auf die veraltete Funktion an einer variablen Stelle im Aufrufstapel erfolgt, wie dies bei vielen rekursiv aufgerufenen QPY-Ladefunktionen der Fall ist. -
Ein neues Flag,
version, wurde derqpy.dump()funktion. Dies erlaubtqpy.dump()optional einen ganzzahligen Wert für die auszugebende QPY-Format-Version annehmen. Dies ist nützlich, wenn Sie eine QPY-Datei erzeugen wollen, die von einer älteren Version von Qiskit geladen werden soll. Allerdings ist die Anzahl der unterstützten Versionen begrenzt. Es können nur Versionen zwischen der letzten QPY-Version (Standardversion) und der kompatiblen QPY-Version 10 (eingeführt mit Qiskit 0.45.0 ) verwendet werden. Die Kompatibilitätsversion wird für die gesamte Hauptversionsreihe 1.x.y beibehalten. Dies ändert nichts an den Rückwärtskompatibilitätsgarantien des QPY-Formats beim Aufruf vonqpy.load()es ermöglicht den Nutzern lediglich, eine ältere Version von QPY zu emittieren, um die Kompatibilität und Interoperabilität zwischen den Versionsreihen 0.x und 1.x zu erhalten.
Quanteninformationsmerkmale
-
Hinzufügen einer
qiskit.quantum_info.StabilizerState.from_stabilizer_list()methode hinzugefügt, die einen Stabilisatorzustand aus einer Liste von Stabilisatoren erzeugt:from qiskit.quantum_info import StabilizerState stabilizer_list = ["ZXX", "-XYX", "+ZYY"] stab = StabilizerState.from_stabilizer_list(stabilizer_list) -
SparsePauliOp.from_operator()verwendet nun eine Implementierung des in Hatznko, Binkowski und Gupta (2023 ) vorgestellten "tensorisierten Pauli-Zerlegungsalgorithmus". Die Methode ist nun um mehrere Größenordnungen schneller; so ist es zum Beispiel möglich, einen zufälligen 10-Qubit-Operator in etwa 250ms auf einem Macbook Pro (Intel i7, 2020) zu zerlegen.
Synthesefunktionen
-
Hinzugefügt wurde eine
qiskit.synthesis.synth_circuit_from_stabilizers()funktion hinzugefügt, die eine Schaltung zurückgibt, die den durch eine Reihe von gegebenen Stabilisatoren stabilisierten Zustand ausgibt. -
Die AQC-Plugin-Methode für die unitäre Synthese verwendet nun standardmäßig eine schnellere Bewertung der Zielfunktion, was zu einer erheblichen Verbesserung der Synthesezeit führt.
-
Hinzufügen einer neuen Synthesemethode
synth_qft_line()einer QFT-Schaltung für lineare Nächste-Nachbarn-Verbindungen, die die Anzahl der SWAPs für eine große Anzahl von Qubits im Vergleich zu SABRE erheblich reduziert. -
Die Klasse
TwoQubitWeylDecompositionwurde der öffentlichen API hinzugefügt inqiskit.synthesis. Diese Klasse ermöglicht die Anwendung der Weyl-Zerlegung von Zwei-Qubit-Unitariern. Wenn Sie diese Klasse zuvor importiert haben, als sie noch eine nicht-öffentliche Klasse in dem jetzt entfernten Modulqiskit.quantum_info.synthesiswar, sollten Sie Ihre Importpfade aktualisieren.
Transpiler-Funktionen
-
Eine neue Ausnahmeklasse wurde hinzugefügt:
InvalidLayoutError. Dies ist eineTranspilerErrorunterklasse, die ausgelöst wird, wenn ein vom Benutzer bereitgestelltes Layout ungültig ist (ungleiche Größe, doppelte Qubits usw.). -
Ein neues Schlüsselwortargument,
num_processes, wurde zutranspile()und derPassManager.run()methode. Dadurch können sowohlQISKIT_NUM_PROCSals auch das Feldnum_processesin den Benutzerkonfigurationsdateien auf der Basis der einzelnen Dateien überschrieben werden. Zum Beispiel:from qiskit import transpile, QuantumCircuit qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() transpile([qc]*10, basis_gates=['u', 'cz'], num_processes=2)führt das Transpilieren über die 10 Eingangskreise mit nur 2 Prozessen durch und überschreibt die Systemvorgabe, die Umgebungsvariable oder die Benutzerkonfigurationsdatei für diesen
transpile()aufruf. -
Es wurde ein neuer Transpiler-Pass hinzugefügt,
OptimizeAnnotatedhinzugefügt, der kommentierte Operationen auf einem Quantenschaltkreis optimiert.Sehen Sie sich dazu das folgende Beispiel an:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.annotated_operation import ( AnnotatedOperation, InverseModifier, ControlModifier, ) from qiskit.circuit.library import CXGate, SwapGate from qiskit.transpiler.passes import OptimizeAnnotated # Create a quantum circuit with multiple annotated gates gate1 = AnnotatedOperation( SwapGate(), [InverseModifier(), ControlModifier(2), InverseModifier(), ControlModifier(1)], ) gate2 = AnnotatedOperation( SwapGate(), [InverseModifier(), InverseModifier()] ) gate3 = AnnotatedOperation( AnnotatedOperation(CXGate(), ControlModifier(2)), ControlModifier(1) ) qc = QuantumCircuit(6) qc.append(gate1, [3, 2, 4, 0, 5]) qc.append(gate2, [1, 5]) qc.append(gate3, [5, 4, 3, 2, 1]) # Optimize the circuit using OptimizeAnnotated transpiler pass qc_optimized = OptimizeAnnotated()(qc) # This is how the optimized circuit should look like gate1_expected = AnnotatedOperation(SwapGate(), ControlModifier(3)) gate2_expected = SwapGate() gate3_expected = AnnotatedOperation(CXGate(), ControlModifier(3)) qc_expected = QuantumCircuit(6) qc_expected.append(gate1_expected, [3, 2, 4, 0, 5]) qc_expected.append(gate2_expected, [1, 5]) qc_expected.append(gate3_expected, [5, 4, 3, 2, 1]) assert qc_optimized == qc_expectedIm Fall von
gate1werden die Modifikatoren des kommentierten Swap-Gates in die kanonische Form gebracht: Die beidenInverseModifiers heben sich auf, und die beidenControlModifiers werden kombiniert. Im Fall vongate2werden alle Modifikatoren entfernt und die kommentierte Operation wird durch ihre Basisoperation ersetzt. Im Fall vongate3werden mehrere Ebenen von Anmerkungen zu einer einzigen zusammengefasst.Der Konstruktor des
OptimizeAnnotatedpasses akzeptiert optionale Argumentetarget,equivalence_library,basis_gatesundrecurse. WennrecursegleichTrueist (der Standardwert) und entwedertargetoderbasis_gatesangegeben wird, geht der Durchlauf rekursiv bis zu den Schaltkreisen des Gattersdefinition, mit Ausnahme von Gattern, die bereits vom Ziel unterstützt werden oder die zur Äquivalenzbibliothek gehören. Wenn hingegen wedertargetnochbasis_gatesangegeben sind oder wennrecurseaufFalsegesetzt ist, synthetisiert der Durchlauf nur die kommentierten Operationen der "obersten Ebene", d. h. er steigt nicht rekursiv in die Schaltungen vondefinitionhinab. Dieses Verhalten ist konsistent mit dem desHighLevelSynthesistranspiler-Pass, der aufgerufen werden muss, um die kommentierten Operationen in 1-Qubit- und 2-Qubit-Gatter zu "entrollen". -
Eine neue
HighLevelSynthesisPluginfürPermutationGateobjekte, die auf dem Token-Swapper-Algorithmus von Qiskit basieren. Um dieses Plugin zu verwenden, geben Sie bei der Definition der High-Level-Synthese-Konfigurationtoken_swapperan.Dieses Synthese-Plugin kann vor oder nach der Festlegung des Layouts ausgeführt werden. Wenn die Synthese erfolgreich ist, gibt das Plugin eine Quantenschaltung aus, die nur aus Tauschgattern besteht. Wenn die Synthese nicht erfolgreich ist, gibt das Plugin
Noneaus.Der folgende Code veranschaulicht, wie das neue Plugin ausgeführt werden kann:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PermutationGate from qiskit.transpiler import PassManager, CouplingMap from qiskit.transpiler.passes.synthesis.high_level_synthesis import HighLevelSynthesis, HLSConfig # This creates a circuit with a permutation gate. qc = QuantumCircuit(8) perm_gate = PermutationGate([0, 1, 4, 3, 2]) qc.append(perm_gate, [3, 4, 5, 6, 7]) # This defines the coupling map. coupling_map = CouplingMap.from_ring(8) # This high-level-synthesis config specifies that we want to use # the "token_swapper" plugin for synthesizing permutation gates, # with the option to use 10 trials. synthesis_config = HLSConfig(permutation=[("token_swapper", {"trials": 10})]) # This creates the pass manager that runs high-level-synthesis on our circuit. # The option use_qubit_indices=True indicates that synthesis is run after the layout is set, # and hence should preserve the specified coupling map. pm = PassManager( HighLevelSynthesis( synthesis_config, coupling_map=coupling_map, target=None, use_qubit_indices=True ) ) qc_transpiled = pm.run(qc) -
Zwei neue Argumente,
matrix_basedundmax_qubits, wurden dem Konstruktor desCommutativeInverseCancellationtranspiler-Passes. Wennmatrix_basedTrueist, verwendet der Durchlauf Matrixdarstellungen, um zu prüfen, ob zwei Operationen die Inverse voneinander sind. Dies macht die Prüfungen leistungsfähiger und ermöglicht darüber hinaus die Aufhebung von Paaren von Operationen, die bis zu einer Phase invers sind, während die globale Phase der Schaltung entsprechend aktualisiert wird. Dies führt im Allgemeinen zu mehr Kürzungen auf Kosten einer längeren Laufzeit. Das Argumentmax_qubitsbegrenzt die Anzahl der Qubits bei matrixbasierten Kommutativitäts- und Inversitätsprüfungen. Zum Beispiel:import numpy as np from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager from qiskit.transpiler.passes import CommutativeInverseCancellation circuit = QuantumCircuit(1) circuit.rz(np.pi / 4, 0) circuit.p(-np.pi / 4, 0) passmanager = PassManager(CommutativeInverseCancellation(matrix_based=True)) new_circuit = passmanager.run(circuit)Der Pass ist in der Lage, die Gatter
RZundPzu löschen und gleichzeitig die globale Phase der Schaltung auf einzustellen. -
Eine neue Funktion wurde hinzugefügt,
high_level_synthesis_plugin_names()hinzugefügt, die verwendet werden kann, um die Liste der installierten High-Level-Synthese-Plugins für einen bestimmten Operationsnamen zu erhalten.
Visualisierungsfunktionen
-
Die Ausgänge
textundmplfür dieQuantumCircuit.draw()undcircuit_drawer()zeigen nun detaillierte Informationen zu den Operationen der SchaltkreisschubladeAnnotatedOperation. Wenn dieAnnotatedOperation.modifierseinControlModifierenthält, wird der Vorgang auf dieselbe Weise angezeigt wie bei kontrollierten Gattern. Wenn dieInverseModifieroderPowerModifierverwendet wird, werden diese mit dem Namen der Basisoperation angezeigt. Zum Beispiel:from qiskit.circuit import ( AnnotatedOperation, ControlModifier, PowerModifier, InverseModifier, QuantumCircuit ) from qiskit.circuit.library import SGate annotated_op = AnnotatedOperation(SGate(), [PowerModifier(3.4), ControlModifier(3), InverseModifier()]) qc = QuantumCircuit(4) qc.append(annotated_op, range(4)) qc.draw("mpl")
Versch. Funktionen
-
Eine neue Warnungs-Basisklasse wurde hinzugefügt,
QiskitWarning. Während Qiskit weiterhin die eingebauten Python Warnungen (wieDeprecationWarning) verwenden, wenn diese am besten geeignet sind, werden die Warnungen für Fälle, die spezifischer für Qiskit sind, Unterklassen vonQiskitWarning. -
Die Tester für die optionale Funktionalität (
qiskit.utils.optionals) unterscheiden nun zwischen einer optionalen Abhängigkeit, die überhaupt nicht gefunden wurde (eine normale Situation) und einer, die zwar gefunden wurde, aber beim Import Fehler auslöste. Im letzteren Fall werden sie nun eineOptionalDependencyImportWarningaus, was passiert ist, da es sich um eine fehlgeschlagene Installation oder eine inkompatible Version handeln könnte.
Anmerkungen zu Upgrades
-
Qiskit 1.0 benötigt jetzt die Version 0.14.0 von
rustworkx. Die Mindestversionsanforderung wurde erhöht, um das neuetoken_swapperPermutationGatesynthese-Plugin fürHighLevelSynthesisPlugin. -
Die minimal unterstützte Rust-Version für die Erstellung von Qiskit aus dem Quellcode ist nun 1.70. Diese wurde von der vorherigen minimal unterstützten Rust-Version von 1.64 in der Qiskit 0.45.x und 0.46.0 Release-Serie angehoben.
-
Die Abhängigkeit von psutil wurde entfernt. Die psutil-Bibliothek wurde bisher nur zur Ermittlung der Anzahl der physischen CPUs und des gesamten Systemspeichers verwendet. Diese Informationen sind jedoch nicht wertvoll genug, um die zusätzlichen Abhängigkeiten und den Overhead zu rechtfertigen, und wurden daher entfernt. Dies bedeutet, dass die Standardanzahl der Prozesse, die von
parallel_map()verwendeten Prozesse und Funktionen, die internparallel_map()wie z.Btranspile()undPassManager.run()mehr oder weniger parallele Prozesse als in früheren Versionen verwenden können. Wenn Sie die Anzahl der verwendeten Prozesse anpassen möchten, können Sie das neue Argumentnum_processesfür diese Funktionen oder die UmgebungsvariableQISKIT_NUM_PROCSoder das Feldnum_processesin einer Benutzerkonfigurationsdatei verwenden (weitere Einzelheiten finden Sie in der Anleitung zur lokalen Konfiguration ), wenn Sie die Anzahl der Prozesse, die Qiskit potenziell verwendet, anpassen müssen. -
Die Methoden
scoped_parametersundsearch_parameterswurden aus der KlasseScheduleBlockklasse entfernt. Diese Methoden gabenParameterobjekte zurück, die teilweise mit den Parametern in derScheduleBlockinstanz verknüpften, aber die Zuweisung von Werten über diese Objekte funktionierte nicht korrekt. Benutzer solltenScheduleBlock.parametersstattdessen verwenden und sich durchScheduleBlock.referencesund vergleichen mit denSchedule.parametersattributen der Unterreferenzen vergleichen, wenn sie unterscheiden müssen, in welchem Unterprogramm ein Parameter verwendet wird. Siehe #11654 für weitere Informationen. -
Die Logik für die Injektion von
QuantumCircuitundGateoperationen in den Pulskontext (wie inpulse.builder.call()), was ein veraltetes Verhalten war, das in Qiskit 0.46 veraltet ist. Impulsfahrpläne sollten als vollständiger Fahrplankontext aufgebaut werden; Schaltungen und Gatter sind eine höhere Abstraktionsebene.Dazu gehört auch die Abschaffung der entsprechenden Funktionen:
pulse.builder.call_gatepulse.builder.cxpulse.builder.u1pulse.builder.u2pulse.builder.u3pulse.builder.xpulse.builder.active_transpiler_settingspulse.builder.active_circuit_scheduler_settingspulse.builder.transpiler_settingspulse.builder.circuit_scheduler_settings
Die Argumente
default_transpiler_settingsunddefault_circuit_scheduler_settingsfürpulse.builder.build()werden in ähnlicher Weise entfernt.from qiskit import transpile, schedule, QuantumCircuit, pulse from qiskit.providers.fake_provider import Fake7QPulseV1 backend = Fake7QPulseV1() # Create a schedule from a hardware-based circuit. qc = QuantumCircuit(2) qc.cx(0, 1) qc = transpile(qc, backend) sched = schedule(qc, backend) # These pulse schedules can still be called in builder contexts. with pulse.build(backend) as qc_sched: pulse.call(sched) # Schedules for certain operations can also be directly retrieved # from BackendV1 instances: sched = backend.defaults().instruction_schedule_map.get('x', (0,)) # ... and from BackendV2 instances: sched = backend.target['x'][(0,)].calibration -
Die für symengine erforderliche Mindestversion wurde auf >= 0.11 erhöht.
Hinweise zur Aktualisierung von Schaltkreisen
-
Entfernt wurde die Methode
Instruction.qasm, die in Qiskit 0.45.0 veraltet war. Verwenden Sieqiskit.qasm2.dump()mit einem vollständigenQuantumCircuitstattdessen. -
Die Eigenschaften
Bit.registerundBit.indexwerden entfernt. Sie wurden in Qiskit 0.25 (veröffentlicht in 2021-04) veraltet. Die Qubits und Bits leben nur noch im Kontext einerQuantumCircuit. Die Alternative zu den Eigenschaften ist die Verwendung vonQuantumCircuit.find_bit()um alle Register innerhalb einer Schaltung und den Index des Bits innerhalb der Schaltung zu finden. -
Die Methode
QuantumCircuit.bind_parameterswurde entfernt, nachdem sie in Qiskit 0.45 veraltet ist. Sie könnenQuantumCircuit.assign_parameters()als Drop-in-Ersatz mit all seinen Voreinstellungen verwenden, und es bietet auch zusätzliche Funktionen gegenüber der alten Methode. -
Der Import von
Int1,Int2,BooleanFunction,classical_function()vonqiskit.circuitist jetzt deaktiviert. Importieren Sie stattdessen die Objekte aus demqiskit.circuit.classicalfunctionsubmodul, das das Pakettweedledumbenötigt. -
Die Nur-Daten-Attribute
headerundextension_libvonQuantumCircuitwerden entfernt, nachdem sie in Qiskit 0.45 veraltet sind. Dies waren interne Angaben des OpenQASM 2 Exporters, die nicht mehr verwendet werden. -
Das Modul
qiskit.extensionswurde entfernt, da es seit der Version 0.45 zur Verwerfung ansteht und in der Version 0.46 vollständig verwerflich ist. Die folgenden Operationen dieses Moduls sind verfügbar inqiskit.circuit.library:DiagonalGate,HamiltonianGateGate,Initialize,Isometry,MCGupDiag,UCGate,UCPauliRotGate,UCRXGate,UCRYGate,UCRZGate,UnitaryGate.
Die folgenden Objekte wurden entfernt:
SingleQubitUnitary(verwenden Sie stattdessenlibrary.UnitaryGate),Snapshot(ersetzt durch die Speicheranweisungen von Aer),ExtensionError,
zusammen mit den folgenden Schaltungsmethoden:
QuantumCircuit.snapshot,QuantumCircuit.squ,QuantumCircuit.diagonal,QuantumCircuit.hamiltonian,QuantumCircuit.isometryundQuantumCircuit.iso,QuantumCircuit.uc,QuantumCircuit.ucrx,QuantumCircuit.ucry,QuantumCircuit.ucrz.
Diese Operationen können immer noch durchgeführt werden, indem der entsprechende Befehl an eine Quantenschaltung angehängt wird.
-
Entfernte veraltete, duplizierte
QuantumCircuitmethoden. Diese umfassen:QuantumCircuit.cnotverwenden, sondernQuantumCircuit.cx(),QuantumCircuit.toffoliverwenden, sondernQuantumCircuit.ccx(),QuantumCircuit.fredkinverwenden, sondernQuantumCircuit.cswap(),QuantumCircuit.mctverwenden, sondernQuantumCircuit.mcx(),QuantumCircuit.iverwenden, sondernQuantumCircuit.id().
-
Sie können nicht mehr
QuantumCircuit.metadataaufNonesetzen, nachdem es in Qiskit 0.43.0 veraltet ist. Sein Typ istdict. Um ihn zu löschen, setzen Sie ihn auf{}. -
Das Attribut
.Register.name_formatwurde entfernt, nachdem es in Qiskit 0.40.0 veraltet ist. Es gibt keine Einschränkung mehr bei den Registernamen, und der reguläre Ausdruck dort war einfach[a-z][a-zA-Z0-9_]*.
Hinweise zum Upgrade von Primitives
- Hinzufügen der
BasePrimitiveJobklasse als abstrakte Jobklasse für Primitive und machtePrimitiveJobvererbtBasePrimitiveJobanstelle vonJobV1.
Hinweise zum Upgrade für Anbieter
-
Geänderter Standardwert von zwei Argumenten (
add_delayundfilter_faulty) in derconvert_to_target()funktion. Diese Konvertierungsfunktion fügt nun standardmäßig Verzögerungsanweisungen hinzu und entfernt fehlerhafte Anweisungen. -
Die
BackendPropertiesundPulseDefaultsmodellobjekte, die von derFakeOpenPulse2Qverwendeten Objekte wurden aktualisiert, um intern konsistent zu sein und fehlende Anweisungen hinzuzufügen. Wenn Sie sich auf die vorherigen Modellobjekte als Kompilierungsziel verlassen haben, können Sie das Backend mit Qiskit 0.46 verwenden und eineQuantumCircuitgeneriert mittranspile()exportieren und mitqpy.dumpserialisieren, um in dieser Version darauf zuzugreifen. -
Das Modul
qiskit.providers.basicaer, das unterqiskit.BasicAerzu finden ist, wurde entfernt, nachdem es mit der Version 0.46 veraltet ist. Seine Funktionalität wurde ersetzt durch dasqiskit.quantum_infomodul und das neueqiskit.providers.basic_providermodul ersetzt.Die Umstellung von der Verwendung von
qiskit.providers.basicaer(qiskit.BasicAer) aufqiskit.providers.basic_providerkann wie folgt durchgeführt werden:Migrieren vonErsetzen durchqiskit.BasicAerDer neue Anbieter hat keine globale Instanz, die Importe sollten von qiskit.providers.basic_providerqiskit.providers.basicaerbasic_providerBasicAerProviderBasicProviderBasicAerJobBasicProviderJobQasmSimulatorPyBasicSimulatorUnitarySimulatorPyverwenden OperatorStatevectorSimulatorPyverwenden StatevectorEin bemerkenswerter Unterschied ist, dass der neue Anbieter nicht mehr über eine globale Instanz (wie
BasicAer) zugänglich ist, so dass es nicht möglich ist,from qiskit import BasicProviderzu verwenden. Stattdessen muss die Anbieterklasse aus ihrem Submodul importiert und manuell instanziiert werden:from qiskit.providers.basic_provider import BasicProvider provider = BasicProvider() backend = provider.get_backend("basic_simulator")Die folgenden Beispiele zeigen die Migrationspfade der drei Simulatoren in
BasicAer.-
Zustandsvektor-Simulator:
from qiskit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.h(1) qc.cx(1,2) # Former path from qiskit import BasicAer backend = BasicAer.get_backend("statevector_simulator") statevector = backend.run(qc).result().get_statevector() # New path from qiskit.quantum_info import Statevector statevector = Statevector(qc) -
Einheits-Simulator:
from qiskit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.h(1) qc.cx(1,2) # Former path from qiskit import BasicAer backend = BasicAer.get_backend("unitary_simulator") result = backend.run(qc).result() # New path from qiskit.quantum_info import Operator result = Operator(qc).data -
Qasm-Simulator:
from qiskit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.h(1) qc.cx(1,2) qc.measure_all() # Former path from qiskit import BasicAer backend = BasicAer.get_backend("qasm_simulator") result = backend.run(qc).result() # New path from qiskit.providers.basic_provider import BasicProvider backend = BasicProvider().get_backend("basic_simulator") result = backend.run(qc).result() # or, directly from qiskit.providers.basic_provider import BasicSimulator backend = BasicSimulator() result = backend.run(qc).result()
-
-
Entfernt die
ConfigurableFakeBackendKlasse, die in Qiskit 0.46.0 veraltet ist. Stattdessen kann eine geeigneteFakeBackendverwendet werden. -
Das abgelehnte
qiskit.providers.fake_providermodul wurde in dasqiskit-ibm-runtimePython Paket migriert. Aus diesem Grund wurden die folgenden Elemente in derqiskit.providers.fake_providerentfernt worden, nachdem sie in Qiskit veraltet sind 0.46:qiskit.providers.fake_provider.FakeProviderqiskit.providers.fake_provider.FakeProviderForBackendV2qiskit.providers.fake_provider.FakeProviderFactoryqiskit.providers.fake_provider.fake_backends.FakeBackendV2- jedes gefälschte Backend, das in
qiskit.providers.fake_provider.backendsenthalten ist (zugänglich über den Provider) qiskit.providers.fake_provider.FakeQasmSimulatorqiskit.providers.fake_provider.FakeJobqiskit.providers.fake_provider.FakeQobj
Um das neue Fake-Provider-Modul zu verwenden, können Sie
pip install qiskit-ibm-runtimeausführen und den qiskit-Importpfad (qiskit.providers.fake_provider) durch den neuen Importpfad (qiskit_ibm_runtime.fake_provider) ersetzen. Beispiel für die Migration:# Legacy path from qiskit.providers.fake_provider import FakeProvider, FakeSherbrooke backend1 = FakeProvider().get_backend("fake_ourense") backend2 = FakeSherbrooke() # New path # run "pip install qiskit-ibm-runtime" from qiskit_ibm_runtime.fake_provider import FakeProvider, FakeSherbrooke backend1 = FakeProvider().get_backend("fake_ourense") backend2 = FakeSherbrooke()Darüber hinaus wurden die folgenden, für spezielle Testzwecke entwickelten Fake-Backends durch die neue
GenericBackendV2klasse ersetzt und werden ebenfalls entfernt, nachdem sie in Qiskit veraltet sind 0.46:qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2`qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitPropsqiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple
Beispiel für die Migration zur neuen
GenericBackendV2klasse:# Legacy path from qiskit.providers.fake_provider import FakeBackend5QV2 backend = FakeBackend5QV2() # New path from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2(num_qubits=5) # note that this class will generate 5q backend with generic # properties that serves the same purpose as FakeBackend5QV2 # but will generate different results
Hinweise zum Pulse-Upgrade
-
Die veraltete Klasse
qiskit.pulse.instructions.Callwurde entfernt. Es wird keine alternative Impulsanweisung bereitgestellt. -
Veraltete Methoden in
InstructionToQobjConverterundQobjToInstructionConverterwurden entfernt. Dazu gehörenInstructionToQobjConverter.convert_acquire()InstructionToQobjConverter.convert_bundled_acquires()InstructionToQobjConverter.convert_set_frequency()InstructionToQobjConverter.convert_shift_frequency()InstructionToQobjConverter.convert_set_phase()InstructionToQobjConverter.convert_shift_phase()InstructionToQobjConverter.convert_delay()InstructionToQobjConverter.convert_play()InstructionToQobjConverter.convert_snapshot()QobjToInstructionConverter.convert_acquire()QobjToInstructionConverter.convert_set_phase()QobjToInstructionConverter.convert_shift_phase()QobjToInstructionConverter.convert_set_frequency()QobjToInstructionConverter.convert_shift_frequency()QobjToInstructionConverter.convert_delay()QobjToInstructionConverter.bind_pulse()QobjToInstructionConverter.convert_parametric()QobjToInstructionConverter.convert_snapshot()
Diese öffentlichen Methoden werden alle durch geschützte Methoden ersetzt, die implizit vom einzigen Einstiegspunkt aus aufgerufen werden, d. h. die Klasse wird wie eine Funktion aufgerufen.
-
Die Klasse
qiskit.pulse.library.ParametricPulseund alle Unterklassen werden entfernt. Diese wurden seit Qiskit 0.39 (mit qiskit-terra 0.22 ), veröffentlicht im Jahr 2022-10, veraltet. Verwenden Sie stattdessenSymbolicPulseund lesen Sie die Dokumentation für weitere Details.
OpenQASM Upgrade-Hinweise
- Die Methoden
qasm()der KlassenQuantumRegisterundClassicalRegisterwurden entfernt. Es ist kein Ersatz notwendig; diese waren ein internes Detail einer alten Implementierung des OpenQASM 2 Exporters. Um ein Programm nach OpenQASM 2 zu exportieren, verwenden Sieqasm2.dump()oderqasm2.dumps().
QPY-Upgrade-Hinweise
-
Die neueste Formatversion von QPY ist jetzt Version 11, und das ist das, was standardmäßig ausgegeben wird, wenn man
qpy.dump(). -
Der Modulpfad
qiskit.circuit.qpy_serializationwurde entfernt, nachdem er in Qiskit 0.40.0 veraltet ist. Für die QPY-Serialisierung verwenden Sieqiskit.qpywas der neue Standort ist.
Hinweise zum Upgrade der Quanteninformation
-
Entfernt die veralteten
__getitem__/__setitem__magischen Methoden vonClifford. Die Methoden sind seit Qiskit 0.44, das im Jahr 2023-07 veröffentlicht wurde, veraltet. Stattdessen indexieren oder iterieren Sie das AttributClifford.tableau. -
Das Modul
qiskit.quantum_info.synthesiswurde entfernt, da es seit der Version 0.46 veraltet ist. Die folgenden Objekte wurden verschoben nachqiskit.synthesis:OneQubitEulerDecomposerwurde verschoben nachqiskit.synthesis.one_qubitTwoQubitBasisDecomposerwurde verschoben nachqiskit.synthesis.two_qubitsXXDecomposerwurde verschoben nachqiskit.synthesis.two_qubitstwo_qubit_cnot_decompose()wurde verschoben nachqiskit.synthesis.two_qubits
Diese Funktion wurde entfernt, da sie in der Version 0.46 bereits veraltet ist: *
cnot_rxx_decomposeDiese Funktionen wurden entfernt, da sie bereits in einer früheren Version veraltet waren: *
decompose_clifford(verwenden Siesynth_clifford_full()stattdessen) *decompose_cnotdihedral(verwenden Siesynth_cnotdihedral_full()stattdessen) -
Die Funktionen
process_fidelity(),average_gate_fidelity(),gate_error()unddiamond_norm()werden nicht mehr versuchen, beliebige Eingaben in ihre markierten erwarteten Typen zu zwingen, nachdem sie in Qiskit 0.25.0 veraltet sind. Übergeben Sie Eingaben der markierten Typen direkt an jedes Argument.
Hinweise zum Upgrade der Synthese
-
Die folgenden veralteten Funktionen, die zuvor in
qiskit.quantum_infoenthalten waren, wurden entfernt. Diese Funktionen wurden in der Version 2023-01 von Qiskit 0.40.0 als veraltet gekennzeichnet.decompose_clifford: Sie sollten stattdessen dieqiskit.synthesis.synth_clifford_full()funktion verwenden.decompose_cnotdihedral: Sie sollten stattdessen dieqiskit.synthesis.synth_cnotdihedral_full()funktion verwenden.
Hinweise zum Transpiler-Upgrade
-
Die veraltete Methode
Target.aquire_alignmentwurde entfernt. Es wurde in Qiskit 0.43 (veröffentlicht 2023-05) als veraltet markiert. Stattdessen sollte die MethodeTarget.acquire_alignment()verwendet werden. -
Die veraltete Funktion
qiskit.transpiler.preset_passmanagers.common.get_vf2_call_limitwurde entfernt. Verwenden Sie stattdessenget_vf2_limits(). -
Die implizite Verwendung von
approximation_degree!=1.0als Standard in dergenerate_preset_pass_manager()funktion wurde deaktiviert. Der vorherige Standardwert konnte zu unangemessenen und unerwarteten Annäherungen führen, insbesondere bei Arbeitslasten, die eine Trotterisierung oder ähnliche Operationen beinhalten, die nahe an der Identität liegen, aber eindeutig nicht gleich sind.Mit dieser Änderung werden die Standardeinstellungen für die Erzeugung von Pass-Managern an die Vorgaben von
transpile()an, was immer die Absicht war. Siehe #8595 für weitere Einzelheiten. -
Die veraltete Klasse
Unrollerwurde inqiskit.transpiler.passes.basisentfernt. Diese Klasse wurde in Qiskit 0.45 veraltet und die Verwendung kann durch die kombinierte Verwendung vonBasisTranslatorund ersetzt werdenUnrollCustomDefinitions.Beachten Sie, dass
BasisTranslatorundUnrollCustomDefinitionsandere Argumente benötigen alsUnroller, da sie die Übergabe einesEquivalenceLibraryObjekts erfordern.Wo bisher
Unroller(basis_gates)verwendet werden konnte, können Sie jetzt verwenden:from qiskit.circuit.library.standard_gates.equivalence_library import ( StandardEquivalenceLibrary as std_eqlib, ) pm = PassManager([ UnrollCustomDefinitions(std_eqlib, basis_gates) BasisTranslator(std_eqlib, basis_gates), ]) translated = pm.run(circuit) -
Der veraltete
NoiseAdaptiveLayouttranspiler pass wurde entfernt. Sie wurde in Qiskit 0.46.0 als veraltet markiert. Dieser Pass wurde weitgehend ersetzt durchVF2LayoutundVF2PostLayoutersetzt, die ein Layout auf der Grundlage der gemeldeten Geräuschmerkmale eines Backends festlegen. Zusammen mit dem Pass wurde auch das Pluginlayout_method"noise_adaptive"entfernt. -
Der veraltete
CrosstalkAdaptiveScheduletranspiler pass wurde entfernt. Sie wurde in Qiskit 0.46.0 als veraltet markiert. Dieser Pass war nicht mehr verwendbar, da seine interne Funktionsweise davon abhing, dass benutzerdefinierte Eigenschaften in derBackendPropertiesnutzlast einerBackendV1instanz. Da keine Backends diese Felder setzen, wurde der Pass entfernt. Wenn Sie den Pass für einen benutzerdefinierten Workflow benötigen, können Sie die Version in Qiskit 0.46.x verwenden. -
Das Modul
qiskit.transpiler.synthesiswurde entfernt, da es seit der Veröffentlichung von 0.46 veraltet ist. Die folgenden Objekte wurden verschoben:qiskit.transpiler.synthesis.aqcwurde verschoben nachqiskit.synthesis.unitary.aqc(außer beiqiskit.synthesis.unitary.aqc.AQCSynthesisPlugin).qiskit.synthesis.unitary.aqc.AQCSynthesisPluginwurde aufqiskit.transpiler.passes.synthesis.AQCSynthesisPluginverschoben.qiskit.transpiler.synthesis.graysynth()wurde verschoben nachqiskit.synthesis.synth_cnot_phase_aam().qiskit.transpiler.synthesis.cnot_synth()wurde verschoben nachqiskit.synthesis.synth_cnot_count_full_pmh().
-
Das Schlüsselwort
targetalias beim Aufruf vonTwoQubitBasisDecomposerinstanzen als Funktionen wurde entfernt, nachdem es in Qiskit 0.40.0 veraltet ist. Sie sollten das Argument positionell als erstes Argument übergeben oder den neuen Namenunitaryverwenden. -
Der spezielle Transpiler-Pass
LinearFunctionsSynthesiswurde entfernt, nachdem er in Qiskit 0.40.0 veraltet ist. Seit seiner Abschaffung ist es nur noch ein sehr dünner Wrapper umHighLevelSynthesisdie Sie stattdessen verwenden sollten. -
Der Importpfad
qiskit.transpiler.passes.scheduling.calibration_creatorswird entfernt. Der Transpiler gibt sie untergebracht weiter,RZXCalibrationBuilderundRZXCalibrationBuilderNoEchokann direkt vonqiskit.transpiler.passes. -
Der Importpfad
qiskit.transpiler.passes.scheduling.rzx_templateswird entfernt. Sie sollten importierenrzx_templates()vonqiskit.transpiler.passesdirekt importieren. -
Ein Muster für die Konstruktion der Passpierlinie wurde verbessert. Der unten gezeigte syntaktische Zucker für die Instanziierung des Flusscontrollers wurde entfernt.
from qiskit.transpiler import PassManager pm = PassManager() pm.append(my_pass, condition=condition_callable, do_while=do_while_callable)Anstatt dieses Schlüsselwort-Argument-Muster zu verwenden, sollten Sie den Ablaufregler explizit instanziieren.
from qiskit.passmanager import ConditionalController, DoWhileController from qiskit.transpiler import PassManager pm = PassManager() pm.append( ConditionalController( DoWhileController(my_pass, do_while=do_while_callable), condition=condition_callable, ) )Beachten Sie, dass Sie die Hackordnung von Controllern verwalten können, wenn Sie sie verschachteln wollen, was mit Schlüsselwortargumenten nicht möglich war. Sie können die Pipeline auch mit dem Konstruktor des Pass-Managers wie unten aufbauen, da es keinen Grund gibt, die Append-Methode jetzt aufzurufen.
pm = PassManager( ConditionalController( DoWhileController(my_pass, do_while=do_while_callable), condition=condition_callable, ) ) -
Die Append-Methode von eingebauten Flow Controllern wurde entfernt. Dazu gehören
ConditionalController.appendDoWhileController.appendFlowControllerLinear.append
Die Task-Pipeline in einem Ablaufsteuerungsgerät ist eingefroren und muss bei der Erstellung der Steuerungsinstanz übergeben werden.
-
Entfernt wurden die Methoden
passessvonPassManagerundStagedPassManagerdie eine Darstellung der eingeschlossenen Pässe in Form einer Liste von Wörterbüchern zurückgaben. Dieses Format kann jedoch kompliziertere Durchlaufpipelines, die bedingte Verzweigungen und verschachtelte Bedingungen enthalten können, nicht effizient darstellen. Anstelle dieser Darstellung verwenden Sie bitte folgendes Musterpm = PassManager(...) pm.to_flow_controller().tasksDies gibt direkt eine linearisierte Basisaufgabeninstanz im Tupelformat zurück.
-
Das Argument
max_iterationwurde entfernt ausPassManager.append()undPassManager.replace(). -
Die folgenden Legacy-Klassen wurden aus den Modulen Pass Manager und Transpiler entfernt, nachdem sie in Qiskit veraltet sind 0.46:
qiskit.passmanager.flow_controllers.FlowControllerqiskit.transpiler.fencedobjs.FencedObjectqiskit.transpiler.fencedobjs.FencedPropertySetqiskit.transpiler.fencedobjs.FencedDAGCircuitqiskit.transpiler.runningpassmanager.RunningPassManager
Hinweise zum Upgrade der Visualisierung
-
Der Standardstil für die Schaltkreisvisualisierung mit Matplotlib wurde in
"iqp"geändert, passend zur IBM Quantum Platform. -
Das veraltete Modul
qiskit.visualization.qcstylewurde entfernt. Dieses Modul ist seit Qiskit 0.39.0 als veraltet gekennzeichnet. Verwenden Sie stattdessen die Seiteqiskit.visualization.circuit.qcstyle. -
Die veraltete Unterstützung für die Übergabe einer
QuasiDistribution,ProbDistributionoder ein Verteilungswörterbuch an dasdataArgument derplot_histogram()visualisierung wurde entfernt. Diese Funktionalität wurde in der Qiskit 0.39.0 Version (2022-10) als veraltet markiert. Wenn Sie stattdessen ein Histogramm von einemQuasiDistribution,ProbDistributionoder einem Verteilungswörterbuch zeichnen möchten, sollten Sie stattdessen die Funktionplot_distribution()funktion verwenden. -
Die Taste
link_interval_dtvonQiskitTimelineStylewurde entfernt. Sie sollten den neuen Namenlink_interval_percentverwenden.
Versch. Anmerkungen zu Upgrades
-
Das Objekt
qiskit.Aerwurde entfernt, nachdem es in Qiskit 0.46 veraltet ist. Sie können stattdessenqiskit_aer.Aerverwenden, das ein einfacher Ersatz ist. -
Der Import von
qiskit.providers.aerwird nicht mehr funktionieren, da er in Qiskit 0.46 veraltet ist. Sie sollten stattdessen vonqiskit_aerimportieren, das einen sofortigen Ersatz darstellt. -
Pulse-Jobs werden in Fake-Backends nicht mehr unterstützt, nachdem die zugrunde liegende Simulationsfunktionalität in Aer veraltet ist und entfernt wurde. Für die Simulation auf Impulsebene außerhalb des Kontextes von Schaltkreisobjekten sollten Sie eine Spezialbibliothek wie Qiskit Dynamics verwenden.
-
Die Funktion
execute()von Qiskit wird entfernt. Diese Funktion diente als High-Level-Wrapper, um einen Schaltkreis mit einigen Transpile-Optionen zu transpilieren und ihn auf einem Backend mit einigen Run-Optionen auszuführen. Um das Gleiche zu tun, können Sie explizit dietranspile()funktion (mit den entsprechenden Transpile-Optionen) gefolgt vonbackend.run()(mit den entsprechenden Run-Optionen).Zum Beispiel, anstatt zu laufen:
from qiskit import execute job = execute(circuit, backend)können Sie laufen:
from qiskit import transpile new_circuit = transpile(circuit, backend) job = backend.run(new_circuit)Alternativ dazu ist das Primitiv
Samplersemantisch äquivalent zu der veralteten Funktionexecute(). Die KlasseBackendSamplerist ein generischer Wrapper für Backends, die keine Primitive unterstützen:from qiskit.primitives import BackendSampler sampler = BackendSampler(backend) job = sampler.run(circuit) -
Das veraltete
qiskit.IBMQObjekt wurde entfernt. Dieses Alias-Objekt wurde in der Qiskit 0.40.0 Version als veraltet markiert. Dieses Alias-Objekt leitete den Zugriff auf Attribute nachqiskit.providers.ibmq.IBMQum. Da das Paketqiskit-ibmq-providernun aus dem Verkehr gezogen und durch das Paketqiskit-ibm-providerersetzt wurde, das seinen eigenen Namensraum unterhält, ist die Beibehaltung dieses Alias nicht mehr relevant. Wenn Sie auf den Aliasqiskit.IBMQangewiesen waren, sollten Sie Ihre Nutzung auf das Paketqiskit-ibm-providerumstellen; weitere Einzelheiten finden Sie im Migrationsleitfaden. -
Das veraltete Modul
qiskit.tools.jupyter, das zuvor Jupyter-Magics und Widgets zur interaktiven Visualisierung einiger Daten aus Qiskit enthielt, wurde entfernt. Dieses Modul wurde in Qiskit 0.46.0 veraltet. Die meisten dieser Funktionen waren direkt an das alte Paketqiskit-ibmq-providergebunden und nicht mehr gültig, weshalb das Modul entfernt wurde. Eine ähnliche Funktionalität bietet das Modulqiskit_ibm_provider.jupyteraus dem Paket qiskit-ibm-provider. -
Das veraltete Modul
qiskit.tools.monitorwurde entfernt, das früher Werkzeuge zur Verfolgung vonJobV1job-Instanzen enthielt, hauptsächlich aus dem alten Paketqiskit-ibm-provider. Dieses Modul wurde in Qiskit 0.46.0 als veraltet markiert. Sie wird entfernt, weil sie direkt mit dem alten Paketqiskit-ibm-providerverbunden war. -
Der veraltete Importpfad
qiskit.test.mockwurde entfernt, der zuvor verwendet wurde, um Importe für die Mock-Backends zu ihrem neueren Speicherort in derqiskit.providers.fake_provider. Dieses Modul wurde in Qiskit 0.37.0 als veraltet markiert. Wenn Sie dieses Modul verwendet haben, sollten Sie Ihre Importe vonqiskit.test.mockaufqiskit.providers.fake_providerstattdessen. -
Das Modul
qiskit.testist nicht länger ein öffentliches Modul. Diese war nie für die Öffentlichkeit bestimmt und sollte auch nicht außerhalb von Qiskits eigenem Testprogramm verwendet werden. Alle Funktionen waren spezifisch für Qiskit und es werden keine Alternativen angeboten; wenn Sie ähnliche Funktionen benötigen, sollten Sie sie in Ihre eigenen Test-Kabelbäume integrieren. -
Das veraltete
qiskit.tools.visualizationModul wurde entfernt. Dieses Modul wurde in der Qiskit 0.46.0 Version veraltet. Dieses Modul war eine Weiterleitung vom ursprünglichen Standort des Visualisierungsmoduls von Qiskit und wurde nachqiskit.visualizationin Qiskit 0.8.0 verschoben. Wenn Sie immer noch diesen Pfad verwenden, können Sie einfach Ihre Importe vonqiskit.tools.visualizationaufqiskit.visualization. -
Das veraltete Modul
qiskit.tools.eventsund das zugehörige Dienstprogrammqiskit.tools.progressbar, das es enthielt, wurde entfernt. Sie wurde in der Qiskit 0.46.0 Version veraltet. Die Funktionalität dieses Moduls war nicht weit verbreitet und wurde besser von speziellen Paketen wie tqdm abgedeckt. -
Das Modul
qiskit.toolsist entfernt worden. Dieses Modul wurde in Qiskit 0.46.0 veraltet. Der gesamte Inhalt dieses Moduls wurde entfernt, mit Ausnahme der Funktionqiskit.tools.parallel_map, die nun vonqiskit.utils.parallel_map()stattdessen verwendet werden kann.
Veraltete Primitive
- Die Methoden
PrimitiveJob.submit()undPrimitiveJob.wait_for_final_state()wurden entfernt, nachdem sie in Qiskit 0.46 veraltet sind. Diese waren nicht als öffentliche Methoden gedacht, sondern waren ein Erbe einer falschen Vererbungsstruktur.
Fehlerkorrekturen
-
Die Rückgabe von falschen Messplänen, wenn nur eine Teilmenge von Qubits angefordert wurde, wurde behoben. Zuvor wurde ein Messplan für alle Qubits zurückgegeben.
-
Es wurde ein Problem in der
textSchaltkreisschublade behoben, wenn Operationen angezeigt wurden, die nichtcircuit.instruction.Instructionklasse. Diese Vorgänge würden dazu führen, dass die Schublade ausfällt. Beispiele warenCliffordundAnnotatedOperation. -
Es wurde ein Problem mit dem
SetLayouttranspilerdurchgang, bei dem eine ungültige Integer-Listeneingabe, die doppelte Einträge enthielt, dazu führte, dass ein ungültigerLayouterzeugt wurde und nachfolgende Transpilerdurchläufe mit einem kryptischen Fehler fehlschlugen. Dies wird nun abgefangen, wennSetLayout.run()aufgerufen wird, wird einInvalidLayoutErrorfehler ausgelöst, der anzeigt, dass es doppelte Einträge in der Integer-Liste gibt. -
QPY (mit
qpy.dump()undqpy.load()) serialisiert und deserialisiert nun korrekt Quantenschaltungen mit kommentierten Operationen (AnnotatedOperation). -
Aufruf von
copy()odercopy_empty_like()auf einerBlueprintCircuitwird nun korrekt dieglobal_phaseauf die Kopie übertragen. Zuvor war die globale Phase nach dem Kopieren immer gleich Null. -
QuantumCircuit.compose()löst nun korrekt eineCircuitErrorwenn es Duplikate in den Argumentenqubitsoderclbitsgibt. -
QPY (mit
qpy.dump()undqpy.load()) serialisiert und deserialisiert nun korrekt Quantenschaltungen mit Clifford-Operatoren (Clifford). -
Ein Problem in der
mplSchaltkreisschublade wurde behoben, bei dem der Text über das Ende des Feldes für eineSwitchCaseOpüber das Ende des Feldes hinaus gedruckt wurde, wenn der Standardfall leer war. -
Die Übertragung von Qubit-Argumenten von
QuantumCircuit.delay()erzeugt nun korrekt einzelneDelayanweisungen für jedes Qubit, wie beabsichtigt. Zuvor wurde bei bestimmten Iterabilien (z. Bsets) eine ungültige Schaltung erzeugt, die an ungewöhnlichen Stellen fehlschlagen konnte. -
Ein Problem wurde behoben, das bei der Verwendung von
transpile()oder beim Ausführen eines voreingestellten Pass-Managers (z. B. generiert vongenerate_preset_pass_manager()), wenn er auf ein Backend abzielt, das eine disjunkte Konnektivität hat und der Ausgabe zusätzliche Barrieren hinzufügtQuantumCircuit. In einigen Fällen werden mehrere Einzel-QubitBarrierdirektiven in die Ausgangsschaltung aufgenommen werden, und zwar unmittelbar vor den endgültigen Messungen in der Schaltung. Dabei handelte es sich um einen internen Zustand, der von der internen Verarbeitung für disjunkte Verbindungen erzeugt und fälschlicherweise in den Ausgabeschaltkreis eingefügt wurde. Behoben #11649 -
Ein Fehler wurde behoben, der auftrat, wenn ein Benutzer versuchte, die Kalibrierungsdaten eines Gatters aus einem
Targetin einer bestimmten Situation. Dies tritt auf, wenn das Backend nur teilweise Kalibrierungsdaten meldet, z. B. wenn in einer Befehlsdefinition auf einen Wellenformimpuls verwiesen wird, dieser Wellenformimpuls aber nicht in der Impulsbibliothek enthalten ist. In diesem Fall konnte das Qiskit-Impulsobjekt nicht erstellt werden, was dazu führte, dass der Impulsplan für die Kalibrierung nicht erstellt werden konnte. Wenn nun die Kalibrierungsdaten unvollständig sind, wirdTargetbehandelt dies so, als ob überhaupt keine Kalibrierung gemeldet würde, und löst keine Ausnahme aus. -
Die Methode
Operator.power()methode arbeitet jetzt mit Fließkomma-Exponenten und entspricht damit der dokumentierten Beschreibung. -
Es wurde ein Problem mit dem
OptimizeSwapBeforeMeasurePass behoben, bei dem Schaltungen mit Swap- und Measure-Anweisungen falsch optimiert wurden. Zum Beispiel:from qiskit import QuantumCircuit from qiskit.transpiler.passes import OptimizeSwapBeforeMeasure pass_ = OptimizeSwapBeforeMeasure() qc = QuantumCircuit(2, 1) qc.swap(0, 1) qc.measure(0, 0) qc.measure(0, 0) print(qc.draw()) print(pass_(qc).draw())vorher drucken würde:
┌─┐┌─┐ q_0: ─X─┤M├┤M├ │ └╥┘└╥┘ q_1: ─X──╫──╫─ ║ ║ c: 1/════╩══╩═ 0 0 ┌─┐ q_0: ┤M├─── └╥┘┌─┐ q_1: ─╫─┤M├ ║ └╥┘ c: 1/═╩══╩═ 0 0und jetzt ist die zweite Schaltung korrekt auf optimiert:
q_0: ────── ┌─┐┌─┐ q_1: ┤M├┤M├ └╥┘└╥┘ c: 1/═╩══╩═ 0 0 -
Ein Problem mit der QPY-Serialisierung wurde behoben, wenn eine
QuantumCircuitmehrere benutzerdefinierte Instanzen von Anweisungen mit demselbennameattribut haben. In Versionen des QPY-Formats vor Version 11 unterschied die QPY-Nutzlast nicht zwischen diesen Instanzen und serialisierte nur die Eigenschaften der ersten Instanz in einem Schaltkreis. Dies könnte zu einer fehlerhaften Deserialisierung führen, wenn die anderen Eigenschaften der benutzerdefinierten Anweisung unterschiedlich sind, aber die Namen gleich sind. Dies wurde in QPY Version 11 behoben, so dass jede Instanz einer benutzerdefinierten Anweisung einzeln serialisiert wird und es nicht mehr zu einem potenziellen Konflikt mit überlappenden Namen kommt. Behebt #8941. -
Es wurde ein Problem mit der Funktion
qpy.dump()funktion behoben, bei der, wenn dasuse_symengineFlag auf ein wahrheitsgemäßes Objekt gesetzt wurde, das zuTrueausgewertet wurde, aber eigentlich nicht der boolesche WertTruewar, die generierte QPY-Nutzlast beschädigt wurde. Wenn Sie zum Beispieluse_symengineaufHAS_SYMENGINEsetzen, wird dieses Objekt alsTrueausgewertet, wenn es als bool gecastet wird, ist aber nicht wirklichTrue. -
Behebung eines Fehlers in der
StabilizerStatestring-Darstellung. -
Ein Fehler, bei dem
convert_to_target()undBackendV2Convertereinen unerwarteten Fehler auslöste, wurde behoben. Der Fehler trat auf, wenn das zu konvertierende Backend Kalibrierungen für ein Tor enthielt, für das in den Backend-Eigenschaften keine Definition vorhanden war. Ein solches Gatter wird nun als ideale fehlerfreie Anweisung an alle Qubits gesendet, selbst wenn Kalibrierungen für eine endliche Anzahl von Qubits gemeldet werden. -
Es wurde ein Problem mit der
circuit_drawer()funktion undQuantumCircuit.draw()methode beim Laden eines Matplotlib-Stils über die Benutzerkonfigurationsdatei. -
InstructionDurations.from_backend()gibt nun eine Instanz einer beliebigen Unterklasse vonInstructionDurationsanstelle der Basisklasse zurück. -
Der
UnitarySynthesistranspiler-Pass erzeugt nun bei der Initialisierung einen Fehler, wenn ein nicht existierendes Synthese-Plugin angegeben wird, anstatt bis zur Laufzeit zu warten. Behoben #11355. -
Die OpenQASM 3 Ausführer
qasm3.dump()unddumps()geben nun korrekt Dateien aus, die als Version3.0und nicht als unqualifiziertes3angegeben werden, da das OpenQASM 3 Projekt die Versionierung nun standardisiert hat. -
Die parametrische Form von
XXPlusYYGateundXXMinusYYGatedie vonget_standard_gate_name_mapping()zurückgegeben wird, enthält nun korrekt den Parameter sowie die anfängliche Drehung . -
Der
TemplateOptimizationpass gibt nun parametrische Ausdrücke zurück, die das native symbolische Ausdrucksformat vonParameterExpressionzurück, anstatt immer Sympy zu verwenden. Für die meisten unterstützten Plattformen bedeutet dies, dass die Ausdrücke Symengine-Objekte sein werden. Zuvor konnte die Übergabe nicht übereinstimmende Objekte zurückgeben, was zu späteren Fehlern im Code für die Parameterbehandlung führen konnte.