QkCircuit
typedef struct QkCircuit QkCircuitDas grundlegende Element der Quanteninformatik ist der Quantenschaltkreis. Dabei handelt es sich um eine Berechnungsroutine, die auf einer Quantenverarbeitungseinheit (QPU) nacheinander ausgeführt werden kann. Ein Schaltkreis wirkt auf eine vordefinierte Menge von Quantendaten (in Qiskit unterstützen wir nur Qubits direkt) mit unitären Operationen (Gates), Messungen und Rücksetzungen. Darüber hinaus kann eine Quantenschaltung Operationen auf klassischen Daten enthalten, einschließlich Echtzeitberechnungen und Kontrollflusskonstrukte, die von den Controllern der QPU ausgeführt werden. Die QkCircuit Struktur stellt eine Low-Level-Schnittstelle zu Qiskits Quantenschaltkreis-Datenstruktur dar und gibt nur das preis, was im inneren Datenmodell von Qiskit definiert ist. Daher fehlen ihr einige Funktionen, die in der übergeordneten Klasse Python QuantumCircuit klasse.
Nachstehend ein Beispiel für einen Quantenschaltkreis, der einen Drei-Qubit-Zustand nach Greenberger-Horne-Zeilinger (GHZ) erzeugt:
#include <qiskit.h>
// Create a circuit with three qubits and 3 classical bits
QkCircuit *qc = qk_circuit_new(3, 0);
// H gate on qubit 0, putting this qubit in a superposition of |0> + |1>.
qk_circuit_gate(qc, QkGate_H, (uint32_t[]){0}, NULL);
// A CX (CNOT) gate on control qubit 0 and target qubit 1 generating a Bell state.
qk_circuit_gate(qc, QkGate_CX, (uint32_t[]){0, 1}, NULL);
// A CX (CNOT) gate on control qubit 0 and target qubit 2 generating a GHZ state.
qk_circuit_gate(qc, QkGate_CX, (uint32_t[]){0, 2}, NULL);
// Free the created circuit.
qk_circuit_free(qc);Die C-API für Schaltkreise unterstützt derzeit nur die Erstellung von Schaltkreisen, die im internen Rust-Datenmodell von Qiskit definierte Operationen enthalten. Im Allgemeinen umfasst dies nur Gatter aus der Standard-Gatterbibliothek, nicht-unitäre Standardoperationen (derzeit Barrier, Measure, Reset, und Delay) und UnitaryGate. Diese Funktionalität wird im Laufe der Zeit erweitert werden, wenn das Rust-Datenmodell so erweitert wird, dass es mehr Funktionen unterstützt.
Datentypen
QkOpCount
struct QkOpCount
Die Anzahl der einzelnen Vorgänge wird durch den Namen des Vorgangs und die Anzahl der Instanzen im Kreislauf dargestellt.
const char *name
Eine mit Null beendete Zeichenkette, die den Namen des Vorgangs darstellt
size_t Anzahl
Die Anzahl der Instanzen dieses Vorgangs in der Schaltung
QkOpCounts
struct QkOpCounts
Ein Array von OpCount Objekten, die die Gesamtzahl aller Operationstypen in einem Schaltkreis darstellen.
QkOpCount *Daten
Ein Array der Größe len mit OpCount Objekten für jede Art von Operation in der Schaltung
size_t len
Die Anzahl der Elemente in data
QkCircuitInstruction
struct QkCircuitInstruction
Darstellung einer Schaltungsanweisung.
Diese Struktur stellt die Daten dar, die in einer einzelnen Anweisung in einer QkCircuit enthalten sind. Es ist kein Zeiger auf das zugrunde liegende Objekt, sondern enthält eine Kopie der Eigenschaften der Anweisung zur Überprüfung.
Zeichen *Name
Der Name der Anweisung
uint32_t *Qubits
Ein Zeiger auf ein Array von Qubit-Indizes, auf die dieser Befehl wirkt.
uint32_t *clbits
Ein Zeiger auf ein Array von Clbit-Indizes, auf die dieser Befehl wirkt.
QkParam **params
Ein Zeiger auf ein Array von Parameterwerten für diese Anweisung.
uint32_t Anzahl der Qubits
Die Anzahl der Qubits für diese Anweisung.
uint32_t num_clbits
Die Anzahl der Clbits für diese Anweisung.
uint32_t Anzahl der Parameter
Die Anzahl der Parameter für diese Anweisung.
QkCircuitDrawerConfig
struct QkCircuitDrawerConfig
Die Konfigurationsoptionen für die qk_circuit_draw Funktion.
bool bundle_cregs
Wenn true, werden klassische Register zu einzelnen Leitungen gebündelt.
bool merge_wires
Wenn true, werden die unteren und oberen Leitungen benachbarter Drähte miteinander verbunden.
Größe_t falten
Legt die Zeilenlänge für den Zeilenumbruch des gerenderten Textes fest. Verwenden Sie 0, um die Konsolenbreite automatisch zu ermitteln. Verwenden Sie, um den SIZE_MAX Zeilenumbruch vollständig zu umgehen.
Funktionen
QkDelayUnit
enum QkDelayUnit
Einheiten für Schaltungsverzögerungen.
Werte:
Zähler QkDelayUnit_S
Sekunden.
Zähler QkDelayUnit_MS
Millisekunden.
Zähler QkDelayUnit_US
Mikrosekunden.
Zähler QkDelayUnit_NS
Nanosekunden.
Zähler QkDelayUnit_PS
Pikosekunden.
QkVarsMode
enum QkVarsMode
Der Modus zum Kopieren der klassischen Variablen für Vorgänge, bei denen auf der Grundlage einer bestehenden Schaltung eine neue Schaltung erstellt wird.
Werte:
Zähler QkVarsMode_Alike
Jede Variable hat denselben Typ wie in der Eingabe.
Zähler QkVarsMode_Captures
Jede Variable wird zu einer „Erfassung“.
Zähler QkVarsMode_Drop
Kopieren Sie die variablen Daten nicht.
QkBlocksMode
enum QkBlocksMode
Der Modus zum Kopieren von Blöcken in Kontrollflussanweisungen für Operationen, die einen neuen Schaltkreis auf der Grundlage eines bestehenden Schaltkreises erstellen.
Werte:
Zähler QkBlocksMode_Drop
Lass die Blöcke fallen.
Zähler QkBlocksMode_Keep
Behalte die Blöcke.
qk_circuit_new
QkCircuit *qk_circuit_new(uint32_t num_qubits, uint32_t num_clbits)
Konstruieren Sie eine neue Schaltung mit der angegebenen Anzahl von Qubits und Clbits.
Beispiel
QkCircuit *empty = qk_circuit_new(100, 100);Parameter
- num_qubits - Die Anzahl der Qubits, die der Schaltkreis enthält.
- num_clbits - Die Anzahl der Clbits, die der Schaltkreis enthält.
*Rückkehr
Ein Zeiger auf den erstellten Schaltkreis.
qk_circuit_add_quantum_register
void qk_circuit_add_quantum_register(QkCircuit *circuit, const QkQuantumRegister *reg)
Hinzufügen eines Quantenregisters zu einer bestimmten Quantenschaltung
Beispiel
QkCircuit *qc = qk_circuit_new(0, 0);
QkQuantumRegister *qr = qk_quantum_register_new(1024, "my_little_register");
qk_circuit_add_quantum_register(qc, qr);
qk_quantum_register_free(qr);
qk_circuit_free(qc);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist und wenn reg kein gültiger Nicht-Null-Zeiger auf QkQuantumRegister ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
- reg - Ein Zeiger auf das Quantenregister
qk_circuit_num_quantum_registers
size_t qk_circuit_num_quantum_registers(const QkCircuit *circuit)
Ermitteln Sie die Anzahl der Quantenregister in der Schaltung.
Gibt die Anzahl der Quantenregister zurück, die der Schaltung hinzugefügt wurden.
Beispiel
QkCircuit *qc = qk_circuit_new(0, 0);
QkQuantumRegister *qr1 = qk_quantum_register_new(2, "qr1");
QkQuantumRegister *qr2 = qk_quantum_register_new(3, "qr2");
qk_circuit_add_quantum_register(qc, qr1);
qk_circuit_add_quantum_register(qc, qr2);
size_t num_qregs = qk_circuit_num_quantum_registers(qc);
printf("Number of quantum registers: %zu\n", num_qregs); // Prints: 2
qk_quantum_register_free(qr1);
qk_quantum_register_free(qr2);
qk_circuit_free(qc);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
*Rückkehr
Die Anzahl der Quantenregister in der Schaltung.
qk_circuit_get_quantum_register
const QkQuantumRegister *qk_circuit_get_quantum_register(const QkCircuit *circuit, size_t qreg_idx)
Gibt das Quantenregister am angegebenen Index zurück.
Gibt einen ausgeliehenen Zeiger auf das Quantenregister am angegebenen Index zurück. Der zurückgegebene Zeiger ist gültig, solange die Schaltung existiert und nicht verändert wird. Der Aufrufer sollte den zurückgegebenen Zeiger nicht freigeben.
Beispiel
QkCircuit *qc = qk_circuit_new(0, 0);
QkQuantumRegister *qr1 = qk_quantum_register_new(2, "qr1");
qk_circuit_add_quantum_register(qc, qr1);
const QkQuantumRegister *retrieved = qk_circuit_get_quantum_register(qc, 0);
qk_quantum_register_free(qr1);
qk_circuit_free(qc);Sicherheit
QkCircuitDas Verhalten ist undefiniert, wenn circuit kein gültiger, nicht-null-Zeiger auf ein ist oder wenn qreg_idx außerhalb des zulässigen Bereichs liegt (>= der Anzahl der Quantenregister im Schaltkreis).
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
- qreg_idx – Der Index des abzurufenden Quantenregisters.
*Rückkehr
Ein ausgeliehener Zeiger auf das Quantenregister am angegebenen Index. Diesen Zeiger nicht freigeben.
qk_circuit_add_classical_register
void qk_circuit_add_classical_register(QkCircuit *circuit, const QkClassicalRegister *reg)
Hinzufügen eines klassischen Registers zu einer gegebenen Quantenschaltung
Beispiel
QkCircuit *qc = qk_circuit_new(0, 0);
QkClassicalRegister *cr = qk_classical_register_new(24, "my_big_register");
qk_circuit_add_classical_register(qc, cr);
qk_classical_register_free(cr);
qk_circuit_free(qc);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist und wenn reg kein gültiger Nicht-Null-Zeiger auf QkClassicalRegister ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
- reg - Ein Zeiger auf das klassische Register
qk_circuit_num_classical_registers
size_t qk_circuit_num_classical_registers(const QkCircuit *circuit)
Ermitteln Sie die Anzahl der klassischen Register in der Schaltung.
Gibt die Anzahl der klassischen Register zurück, die der Schaltung hinzugefügt wurden.
Beispiel
QkCircuit *qc = qk_circuit_new(0, 0);
QkClassicalRegister *cr1 = qk_classical_register_new(2, "cr1");
QkClassicalRegister *cr2 = qk_classical_register_new(3, "cr2");
qk_circuit_add_classical_register(qc, cr1);
qk_circuit_add_classical_register(qc, cr2);
size_t num_cregs = qk_circuit_num_classical_registers(qc);
printf("Number of classical registers: %zu\n", num_cregs); // Prints: 2
qk_classical_register_free(cr1);
qk_classical_register_free(cr2);
qk_circuit_free(qc);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
*Rückkehr
Die Anzahl der klassischen Register in der Schaltung.
qk_circuit_get_classical_register
const QkClassicalRegister *qk_circuit_get_classical_register(const QkCircuit *circuit, size_t creg_idx)
Gibt das klassische Register am angegebenen Index zurück.
Gibt einen ausgeliehenen Zeiger auf das klassische Register am angegebenen Index zurück. Der zurückgegebene Zeiger ist gültig, solange die Schaltung existiert und nicht verändert wird. Der Aufrufer sollte den zurückgegebenen Zeiger nicht freigeben.
Beispiel
QkCircuit *qc = qk_circuit_new(0, 0);
QkClassicalRegister *cr1 = qk_classical_register_new(2, "cr1");
qk_circuit_add_classical_register(qc, cr1);
const QkClassicalRegister *retrieved = qk_circuit_get_classical_register(qc, 0);
qk_classical_register_free(cr1);
qk_circuit_free(qc);Sicherheit
QkCircuitDas Verhalten ist undefiniert, wenn circuit kein gültiger, nicht-null-Zeiger auf ein ist oder wenn creg_idx außerhalb des zulässigen Bereichs liegt (>= der Anzahl der klassischen Register in der Schaltung).
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
- creg_idx – Der Index des klassischen Registers, das abgerufen werden soll.
*Rückkehr
Ein ausgeliehener Zeiger auf das klassische Register am angegebenen Index. Diesen Zeiger nicht freigeben.
qk_circuit_copy
QkCircuit *qk_circuit_copy(const QkCircuit *circuit)
Erstellen Sie eine Kopie von QkCircuit.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 100);
QkCircuit *copy = qk_circuit_copy(qc);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den zu kopierenden Schaltkreis.
*Rückkehr
Ein neuer Zeiger auf eine Kopie der Eingabe circuit.
qk_circuit_num_qubits
uint32_t qk_circuit_num_qubits(const QkCircuit *circuit)
Ermittelt die Anzahl der Qubits, die der Schaltkreis enthält.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 100);
uint32_t num_qubits = qk_circuit_num_qubits(qc); // num_qubits==100Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
*Rückkehr
Die Anzahl der Qubits, für die die Schaltung definiert ist.
qk_circuit_num_clbits
uint32_t qk_circuit_num_clbits(const QkCircuit *circuit)
Ermittelt die Anzahl der Clbits, die der Schaltkreis enthält.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 50);
uint32_t num_clbits = qk_circuit_num_clbits(qc); // num_clbits==50Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
*Rückkehr
Die Anzahl der Clbits, auf denen die Schaltung definiert ist.
qk_circuit_num_param_symbols
size_t qk_circuit_num_param_symbols(const QkCircuit *circuit)
Ermittle die Anzahl der ungebundenen Symbole in QkParam den Objekten der Schaltung.
Beispiel
QkCircuit *qc = qk_circuit_new(2, 0);
QkParam *x = qk_param_new_symbol("x");
QkParam *y = qk_param_new_symbol("y");
uint32_t q0[1] = {0};
const QkParam *rx_param[1] = {x};
const QkParam *ry_param[1] = {y};
qk_circuit_parameterized_gate(qc, QkGate_RX, q0, rx_param);
qk_circuit_parameterized_gate(qc, QkGate_RY, q0, ry_param);
// check the number of QkParam symbols
size_t num_symbols = qk_circuit_num_param_symbols(qc); // == 2
qk_param_free(x);
qk_param_free(y);
qk_circuit_free(qc);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
*Rückkehr
Die Anzahl der ungebundenen QkParam Symbole im Schaltkreis.
qk_circuit_global_phase
QkParam *qk_circuit_global_phase(const QkCircuit *circuit)
Ermitteln Sie die globale Phase der Schaltung.
Diese Funktion gibt eine Kopie der globalen Phase der Schaltung zurück; der Wert muss nach der Verwendung über :c:func:qk_param_free freigegeben werden.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 100);
QkParam *phase = qk_circuit_global_phase(qc);
qk_param_free(phase);
qk_circuit_free(qc);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
*Rückkehr
Die globale Phase der Rennserie.
qk_circuit_set_global_phase
QkExitCode qk_circuit_set_global_phase(QkCircuit *circuit, const QkParam *phase)
Stellen Sie die globale Phase des Schaltkreises ein.
Diese Funktion kopiert die neue globale Phase beim Setzen, sodass der Aufrufer weiterhin Eigentümer der QkParam Phase bleibt; der Wert der Phase muss nach dem Setzen über :c:func:qk_param_free freigegeben werden.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 100);
QkParam *new_global_phase = qk_param_from_double(1.23);
qk_circuit_set_global_phase(qc, new_global_phase);
qk_param_free(new_global_phase);
qk_circuit_free(qc);Sicherheit
QkParamDas Verhalten ist undefiniert, wenn circuit kein gültiger, nicht-null-Zeiger auf ein QkCircuit ist und wenn phase kein gültiger, nicht-null-Zeiger auf ein ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis.
- Phase – Ein Zeiger auf die globale Phase, die festgelegt werden soll.
*Rückkehr
QkExitCode_Success nach erfolgreicher Festlegung der globalen Phase. Im Fehlerfall wird angezeigt, QkExitCode_ParameterNameConflict dass ein neues Parametersymbol einen Namenskonflikt mit einem bereits vorhandenen Symbol aufweist. QkExitCode_ParameterError beschreibt weitere allgemeine Fehler, die beim Versuch auftreten, die Parametersymbole nachzuverfolgen.
qk_circuit_free
void qk_circuit_free(QkCircuit *circuit)
Geben Sie den Stromkreis frei.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 100);
qk_circuit_free(qc);Sicherheit
Das Verhalten ist undefiniert, wenn circuit nicht entweder null oder ein gültiger Zeiger auf eine QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den freizugebenden Stromkreis.
qk_circuit_gate
QkExitCode qk_circuit_gate(QkCircuit *circuit, QkGate gate, const uint32_t *qubits, const double *params)
Fügen Sie der Schaltung eine QkGate hinzu.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t qubit[1] = {0};
qk_circuit_gate(qc, QkGate_H, qubit, NULL);Sicherheit
Die Typen qubits und params werden als Zeiger auf ein Array von uint32_t bzw. double erwartet, wobei die Länge den Erwartungen für das Standard-Gate entspricht. Wenn das Array unzureichend lang ist, ist das Verhalten dieser Funktion undefiniert, da sie außerhalb der Grenzen des Arrays liest. Es kann ein Null-Zeiger sein, wenn es keine Qubits oder Parameter für ein bestimmtes Gate gibt. Sie können unter qk_gate_num_qubits und qk_gate_num_params nachsehen, wie viele Qubits und Params für ein bestimmtes Gatter erforderlich sind.
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Schaltkreis, dem das Gatter hinzugefügt werden soll.
- gate - Die StandardGate, die der Schaltung hinzugefügt wird.
- qubits - Der Zeiger auf das Array mit den Indizes von
uint32_tqubits, zu dem das Tor hinzugefügt werden soll. Dies kann ein Nullzeiger sein, wenn es keine Qubits fürgategibt (z. B.QkGate_GlobalPhase). - params - Der Zeiger auf das Array mit den
doubleWerten, die für die Gate-Parameter verwendet werden sollen. Dies kann ein Null-Zeiger sein, wenn es keine Parameter fürgategibt (z. B.QkGate_H).
*Rückkehr
Ein Exit-Code.
qk_circuit_parameterized_gate
QkExitCode qk_circuit_parameterized_gate(QkCircuit *circuit, QkGate gate, const uint32_t *qubits, const QkParam *const *params)
Füge dem Schaltkreis einen QkGate mit QkParam* Parametern hinzu.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 0);
QkParam *theta = qk_param_new_symbol("theta");
uint32_t qubit[1] = {0};
const QkParam* params[1] = {theta};
qk_circuit_parameterized_gate(qc, QkGate_RX, qubit, params); // add RX(theta) to the circuitSicherheit
Es wird erwartet, dass die Typen qubits``params und jeweils einen Zeiger auf QkParam* ein Array von uint32_t bzw. darstellen, wobei die Länge den Vorgaben für das Standard-Gate entspricht. Ist das Array nicht lang genug, ist das Verhalten dieser Funktion undefiniert, da dabei Daten außerhalb der Array-Grenzen gelesen werden. Es kann ein Nullzeiger sein, wenn für ein bestimmtes Gatter keine Qubits oder Parameter vorhanden sind. Sie können unter und qk_gate_num_qubits``qk_gate_num_params nachsehen, wie viele Qubits und Parameter für ein bestimmtes Gatter benötigt werden.
Das Verhalten ist nicht definiert, wenn kein gültiger, circuit``QkCircuit nicht-null-Zeiger auf ein ist oder wenn eines der Elemente im params Array kein gültiger, nicht-null-Zeiger auf ein ist QkParam.
Parameter
- circuit - Ein Zeiger auf den Schaltkreis, dem das Gatter hinzugefügt werden soll.
- Gatter – Das, das dem Schaltkreis
QkGatehinzugefügt werden soll. - qubits - Der Zeiger auf das Array mit den Indizes von
uint32_tqubits, zu dem das Tor hinzugefügt werden soll. Dies kann ein Nullzeiger sein, wenn es keine Qubits fürgategibt (z. B.QkGate_GlobalPhase). - params – Der Zeiger auf das Array der
QkParam*Parameter, die für die Gate-Parameter verwendet werden sollen. Dies kann ein Nullzeiger sein, wenn keine Parameter vorhanden sindgate(z. B.QkGate_H).
*Rückkehr
QkExitCode_Success nach erfolgreichem Hinzufügen Im Fehlerfall wird angezeigt QkExitCode_ParameterNameConflict , dass ein neues Parametersymbol einen Namenskonflikt mit einem bereits vorhandenen Symbol aufweist. QkExitCode_ParameterError beschreibt weitere allgemeine Fehler, die beim Versuch auftreten können, die Parametersymbole nachzuverfolgen.
qk_gate_num_qubits
uint32_t qk_gate_num_qubits(QkGate gate)
Ermittelt die Anzahl der Qubits für eine QkGate.
Beispiel
uint32_t num_qubits = qk_gate_num_qubits(QkGate_CCX);Parameter
- gate - Die
QkGate, um die Anzahl der Qubits zu ermitteln.
*Rückkehr
Die Anzahl der Qubits, auf die das Gate wirkt.
qk_gate_num_params
uint32_t qk_gate_num_params(QkGate gate)
Ermitteln der Anzahl der Parameter für eine QkGate.
Beispiel
uint32_t num_params = qk_gate_num_params(QkGate_R);Parameter
- gate - Die
QkGate, um die Anzahl der Qubits zu ermitteln.
*Rückkehr
Die Anzahl der Parameter, die das Tor hat.
qk_circuit_measure
QkExitCode qk_circuit_measure(QkCircuit *circuit, uint32_t qubit, uint32_t clbit)
Anhängen einer Messung an den Stromkreis
Beispiel
QkCircuit *qc = qk_circuit_new(100, 1);
qk_circuit_measure(qc, 0, 0);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis, zu dem die Messung hinzugefügt werden soll
- qubit - Die
uint32_tfür das zu messende Qubit - clbit - Die
uint32_tfür das clbit, in dem das Messergebnis gespeichert wird
*Rückkehr
Ein Exit-Code.
qk_circuit_reset
QkExitCode qk_circuit_reset(QkCircuit *circuit, uint32_t qubit)
Anhängen eines Resets an den Stromkreis
Beispiel
QkCircuit *qc = qk_circuit_new(100, 0);
qk_circuit_reset(qc, 0);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Schaltkreis, zu dem der Reset hinzugefügt werden soll
- qubit - Die
uint32_tfür das zurückzusetzende Qubit
*Rückkehr
Ein Exit-Code.
qk_circuit_barrier
QkExitCode qk_circuit_barrier(QkCircuit *circuit, const uint32_t *qubits, uint32_t num_qubits)
Fügen Sie dem Stromkreis eine Barriere hinzu.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 1);
uint32_t qubits[5] = {0, 1, 2, 3, 4};
qk_circuit_barrier(qc, qubits, 5);Sicherheit
Die Länge des Arrays, auf das qubits zeigt, muss num_qubits sein. Bei einer Nichtübereinstimmung ist das Verhalten undefiniert.
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis, dem die Barriere hinzugefügt werden soll.
- num_qubits - Die Anzahl der Qubits, die die Barriere breit ist.
- qubits - Der Zeiger auf das Array mit den Indizes von
uint32_tqubits, auf dem die Barriere hinzugefügt werden soll.
*Rückkehr
Ein Exit-Code.
qk_circuit_unitary
QkExitCode qk_circuit_unitary(QkCircuit *circuit, const QkComplex64 *matrix, const uint32_t *qubits, uint32_t num_qubits, bool check_input)
Fügen Sie der Schaltung eine beliebige unitäre Matrix hinzu.
Beispiel
QkComplex64 c0 = {0, 0}; // 0+0i
QkComplex64 c1 = {1, 0}; // 1+0i
const uint32_t num_qubits = 1;
QkComplex64 unitary[2*2] = {c0, c1, // row 0
c1, c0}; // row 1
QkCircuit *circuit = qk_circuit_new(1, 0); // 1 qubit circuit
uint32_t qubit[1] = {0}; // qubit to apply the unitary on
qk_circuit_unitary(circuit, unitary, qubit, num_qubits, true);Sicherheit
Das Verhalten ist undefiniert, wenn einer der folgenden Punkte verletzt wird:
circuitist ein gültiger, nicht-null-Zeiger auf eineQkCircuitmatrixist ein ausgerichteter Zeiger auf4**num_qubitsinitialisierteQkComplex64Wertequbitsist ein ausgerichteter Zeiger aufnum_qubitsinitialisierteuint32_tWerte
Parameter
- circuit - Ein Zeiger auf den Stromkreis, an den die Einheit angehängt werden soll.
- matrix - Ein Zeiger auf das Array
QkComplex64, das die unitäre Matrix darstellt. Dies muss eine unitäre Matrix der Dimension2 ^ num_qubits x 2 ^ num_qubitssein. Genauer gesagt: das(i, j)-te Element ist durchmatrix[i * 2^n + j]gegeben. Der Inhalt vonmatrixwird innerhalb dieser Funktion kopiert, bevor er der Schaltung hinzugefügt wird. Der Aufrufer behält also das Eigentum an dem ursprünglichen Speicher, auf denmatrixzeigt, und kann ihn nach dem Aufruf wiederverwenden; der Aufrufer ist für die Freigabe verantwortlich. - qubits - Ein Zeiger auf ein Array von Qubit-Indizes der Länge
num_qubits. - num_qubits - Die Anzahl der Qubits, auf die die Unitary wirkt.
- check_input - Wenn true, prüft die Funktion, ob die Matrix unitär ist. Wenn auf False gesetzt, ist der Aufrufer dafür verantwortlich, dass die Matrix unitär ist. Wenn die Matrix nicht unitär ist, ist dies ein undefiniertes Verhalten und führt zu einer fehlerhaften Schaltung.
*Rückkehr
Ein Exit-Code.
qk_circuit_inst_unitary
void qk_circuit_inst_unitary(QkCircuit *circuit, size_t index, QkComplex64 *out)
Schreibe die Einheitsmatrix für einen bestimmten Befehl in der Schaltung auf.
Es kommt zu einem Fehler, wenn der Befehl am angegebenen Index kein Unitary ist.
Sicherheit
Das Verhalten ist nicht definiert, wenn einer der folgenden Punkte verletzt wird: wenn kein gültiger, circuit nicht-null-Zeiger auf ein ist QkCircuit, wenn die zulässige Anzahl index von Befehlen im Schaltkreis überschreitet, wenn für 4**num_qubits Schreibvorgänge out auf QkComplex64ungültig ist.
Parameter
- Schaltung – Ein Zeiger auf die Schaltung, aus der der Einheitsoperator abgerufen werden soll.
- Index – Der Index des Befehls, für den der Einheitsoperator ermittelt werden soll.
- out – Zugewiesener und ausgerichteter Zeiger, in den die unitäre Matrix geschrieben werden soll.
qk_circuit_instruction_kind
QkOperationKind qk_circuit_instruction_kind(const QkCircuit *circuit, size_t index)
Erhalten Sie den „richtigen“ Unterricht im Schaltkreisbau.
Sicherheit
Das Verhalten ist undefiniert, wenn kein gültiger, circuit nicht-null-Zeiger auf ein ist QkCircuit und wenn die zulässige Anzahl von index Befehlen in der Schaltung überschreitet.
Parameter
- Schaltkreis – Ein Zeiger auf den Schaltkreis, aus dem der Befehlstyp abgerufen werden soll.
- Index – Der Index des Befehls, dessen Typ ermittelt werden soll.
*Rückkehr
Ein QkOperationKind Enum-Wert, der die Art des Befehls am angegebenen Index angibt.
qk_circuit_count_ops
QkOpCounts qk_circuit_count_ops(const QkCircuit *circuit)
Gibt eine Liste von Stringnamen für Anweisungen in einer Schaltung und deren Anzahl zurück.
Um den von der Struktur zugewiesenen Speicher ordnungsgemäß freizugeben, sollten Sie qk_opcounts_clear aufrufen. Wenn Sie die Struktur QkOpCounts löschen, ohne dies zu tun, bleibt das gespeicherte Array von QkOpCount zugewiesen und führt zu einem Speicherleck.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t qubits[1] = {0};
qk_circuit_gate(qc, QkGate_H, qubits, NULL);
QkOpCounts counts = qk_circuit_count_ops(qc);
// .. once done
qk_opcounts_clear(&counts);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Stromkreis, für den die Zählerstände ermittelt werden sollen.
*Rückkehr
Eine QkOpCounts Struktur, die die Anzahl der Schaltvorgänge enthält.
qk_circuit_num_instructions
size_t qk_circuit_num_instructions(const QkCircuit *circuit)
Gibt die Gesamtzahl der Anweisungen in der Schaltung zurück.
Beispiel
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t qubit[1] = {0};
qk_circuit_gate(qc, QkGate_H, qubit, NULL);
size_t num = qk_circuit_num_instructions(qc); // 1Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Schaltkreis, für den die Gesamtzahl der Anweisungen ermittelt werden soll.
*Rückkehr
Die Gesamtzahl der Anweisungen in der Schaltung.
qk_circuit_get_instruction
void qk_circuit_get_instruction(const QkCircuit *circuit, size_t index, QkCircuitInstruction *instruction)
Rückgabe der Befehlsdetails für einen Befehl in der Schaltung.
Diese Funktion wird verwendet, um die Befehlsdetails für einen bestimmten Befehl in der Schaltung zu erhalten.
Diese Funktion weist intern Speicher für die bereitgestellte QkCircuitInstruction zu, und Sie sind dafür verantwortlich, qk_circuit_instruction_clear aufzurufen, um ihn freizugeben.
Beispiel
QkCircuitInstruction inst;
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t qubit[1] = {0};
qk_circuit_gate(qc, QkGate_H, qubit, NULL);
qk_circuit_get_instruction(qc, 0, &inst);
qk_circuit_instruction_clear(&inst);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist. Der Wert für index muss kleiner sein als der von qk_circuit_num_instructions zurückgegebene Wert, andernfalls führt diese Funktion zu einer Panik. Das Verhalten ist undefiniert, wenn instruction kein gültiger, nicht-null Zeiger auf eine Speicherzuweisung mit ausreichend Platz für QkCircuitInstruction ist.
Parameter
- circuit - Ein Zeiger auf den Schaltkreis, für den die Befehlsdetails abgerufen werden sollen.
- index - Der Befehlsindex, für den die Befehlsdetails abgerufen werden sollen.
- anweisung - Ein Zeiger auf den Ort, an dem die Anweisung ausgegeben werden soll
QkCircuitInstruction
qk_circuit_pauli_product_rotation
void qk_circuit_pauli_product_rotation(QkCircuit *circuit, const QkPauliProductRotation *rotation, const uint32_t *qubits)
Schließe einen Stromkreis QkPauliProductRotation an.
Beispiel
// build a IXYZ Pauli rotation
bool x[4] = {false, true, true, false};
bool z[4] = {false, false, true, true};
QkParam *angle = qk_param_from_double(1.0);
QkPauliProductRotation rotation = {x, z, 4, angle};
// append it to a circuit
QkCircuit *circuit = qk_circuit_new(10, 1);
uint32_t qubits[4] = {0, 1, 2, 3};
qk_circuit_pauli_product_rotation(circuit, &rotation, qubits);
// do something with the circuit... and then free it
qk_param_free(angle);
qk_circuit_free(circuit);Sicherheit
Das Verhalten ist undefiniert, wenn einer der folgenden Punkte verletzt wird:
circuitist ein gültiger, nicht-null-Zeiger auf eineQkCircuitrotationist ein gültiger, nicht-null-Zeiger auf einen kohärentenQkPauliProductRotation. Insbesondere müssen die Datenfelderrotation->z``rotation->xund fürrotation->lenElemente lesbar sein.qubitsist ein ausgerichteter Zeiger aufrotation->leninitialisierteuint32_tWerte.
Parameter
- Schaltkreis – Der Schaltkreis, auf den die Operation angewendet werden soll.
- Rotation – Ein Zeiger auf die
QkPauliProductRotationanzuwendende Rotation. - Qubits – Ein Zeiger auf das Qubit-Array.
qk_circuit_inst_pauli_product_rotation
QkExitCode qk_circuit_inst_pauli_product_rotation(const QkCircuit *circuit, size_t index, QkPauliProductRotation *instruction)
Rufe die QkPauliProductRotation Daten aus einer Schaltungsanweisung ab.
Bei einem Schaltkreis mit einer QkPauliProductRotation Anweisung am Index füllt diese Funktion den instruction Zeiger index mit einer Kopie der QkPauliProductRotation Daten. Beachten Sie, dass diese Daten unabhängig von der Schaltung existieren und manuell mit freigegeben werden qk_pauli_product_rotation_clear müssen.
Wenn der Befehl an der angegebenen index Adresse QkPauliProductRotationkein ist, gibt diese Funktion einen Fehler QkExitCode_InvalidOperationKind zurück. Du kannst mit überprüfen, ob der Befehl qk_circuit_instruction_kind den richtigen Typ hat.
Sicherheit
Das Verhalten ist nicht definiert, wenn kein gültiger, circuit nicht-null-Zeiger auf ein ist QkCircuit. Der Wert für index muss kleiner sein als der von zurückgegebene qk_circuit_num_instructions Wert, andernfalls löst diese Funktion einen Panikfehler aus. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger instruction auf einen Speicherbereich ist, der über ausreichend Platz für ein QkPauliProductRotationverfügt.
Parameter
- Schaltkreis – Ein Zeiger auf den Schaltkreis, aus dem die Befehlsdetails abgerufen werden sollen.
- Index – Der Index der Schaltungsanweisung.
- Anweisung – Ein Zeiger auf einen zugewiesenen Speicherbereich
QkPauliProductRotation, in dem die Daten gespeichert werden sollen.
*Rückkehr
QkExitCode_Success entweder wurden die Daten in den Befehl geschrieben, oder QkExitCode_InvalidOperationKind der Index verwies nicht auf einen QkPauliProductRotation.
qk_circuit_pauli_product_measurement
void qk_circuit_pauli_product_measurement(QkCircuit *circuit, const QkPauliProductMeasurement *measurement, const uint32_t *qubits, uint32_t clbit)
Schließe einen Stromkreis QkPauliProductMeasurement an.
Beispiel
// build a XZ Pauli measurement
bool x[2] = {true, false};
bool z[2] = {false, true};
QkPauliProductMeasurement measure = {x, z, 2, false};
// append it to a circuit
QkCircuit *circuit = qk_circuit_new(10, 1);
uint32_t qubits[2] = {0, 2};
uint32_t clbit = 0;
qk_circuit_pauli_product_measurement(circuit, &measure, qubits, clbit);
// do something with the circuit... and then free it
qk_circuit_free(circuit);Sicherheit
Das Verhalten ist undefiniert, wenn einer der folgenden Punkte verletzt wird:
circuitist ein gültiger, nicht-null-Zeiger auf eineQkCircuitmeasurementist ein gültiger, nicht-null-Zeiger auf einen kohärentenQkPauliProductMeasurement. Insbesondere müssen die Datenfeldermeasurement->z``measurement->xund fürmeasurement->lenElemente lesbar sein.qubitsist ein ausgerichteter Zeiger aufrotation->leninitialisierteuint32_tWerte.
Parameter
- Schaltkreis – Der Schaltkreis, auf den die Operation angewendet werden soll.
- Messung – Ein Zeiger auf die
QkPauliProductMeasurementanzuwendende Messung. - Qubits – Ein Zeiger auf das Qubit-Array.
- clbit – Ein einzelnes Qubit, das das
uint32_tMess-Qubit angibt.
qk_circuit_inst_pauli_product_measurement
QkExitCode qk_circuit_inst_pauli_product_measurement(const QkCircuit *circuit, size_t index, QkPauliProductMeasurement *instruction)
Rufe die QkPauliProductMeasurement Daten aus einer Schaltungsanweisung ab.
Bei einem Schaltkreis mit einer QkPauliProductMeasurement Anweisung am Index füllt diese Funktion den instruction Zeiger index mit einer Kopie der QkPauliProductMeasurement Daten. Beachten Sie, dass diese Daten unabhängig von der Schaltung existieren und manuell mit freigegeben werden qk_pauli_product_measurement_clear müssen.
Wenn der Befehl an der angegebenen index Adresse QkPauliProductMeasurementkein ist, gibt diese Funktion einen Fehler QkExitCode_InvalidOperationKind zurück. Überprüfen Sie mithilfe von qk_circuit_instruction_kind, ob es sich um den richtigen Befehl handelt.
Sicherheit
Das Verhalten ist nicht definiert, wenn kein gültiger, circuit nicht-null-Zeiger auf ein ist QkCircuit. Der Wert für index muss kleiner sein als der von zurückgegebene qk_circuit_num_instructions Wert, andernfalls löst diese Funktion einen Panikfehler aus. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger instruction auf einen Speicherbereich ist, der über ausreichend Platz für ein QkPauliProductMeasurementverfügt.
Parameter
- Schaltkreis – Ein Zeiger auf den Schaltkreis, aus dem die Befehlsdetails abgerufen werden sollen.
- Index – Der Index der Schaltungsanweisung.
- Anweisung – Ein Zeiger auf einen zugewiesenen Speicherbereich
QkPauliProductMeasurement, in dem die Daten gespeichert werden sollen.
*Rückkehr
QkExitCode_Success entweder wurden die Daten in den Befehl geschrieben, oder QkExitCode_InvalidOperationKind der Index verwies nicht auf einen QkPauliProductMeasurement.
qk_circuit_instruction_clear
void qk_circuit_instruction_clear(QkCircuitInstruction *inst)
Löschen Sie die Daten im Objekt Schaltkreisanweisung.
Diese Funktion gibt nicht die Zuweisung für den bereitgestellten Zeiger QkCircuitInstruction frei, sondern nur die internen Zuweisungen für die in der Anweisung enthaltenen Daten. Sie sind verantwortlich für die Zuweisung und Freigabe der tatsächlichen Zuweisung, die zum Speichern einer QkCircuitInstruction verwendet wird.
Beispiel
QkCircuitInstruction *inst = malloc(sizeof(QkCircuitInstruction));
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t q0[1] = {0};
qk_circuit_gate(qc, QkGate_H, q0, NULL);
qk_circuit_get_instruction(qc, 0, inst);
qk_circuit_instruction_clear(inst); // clear internal allocations
free(inst); // free struct
qk_circuit_free(qc); // free the circuitSicherheit
Das Verhalten ist undefiniert, wenn inst kein gültiger Nicht-Null-Zeiger auf QkCircuitInstruction ist.
Parameter
- inst - Ein Zeiger auf die freizugebende Anweisung.
qk_opcounts_clear
void qk_opcounts_clear(QkOpCounts *op_counts)
Löschen des Inhalts einer Zählliste für Schaltvorgänge.
Sicherheit
Das Verhalten ist undefiniert, wenn op_counts nicht das von qk_circuit_count_ops zurückgegebene Objekt ist.
Parameter
- op_counts - Die zurückgegebene Op-Count-Liste von
qk_circuit_count_ops.
qk_circuit_delay
QkExitCode qk_circuit_delay(QkCircuit *circuit, uint32_t qubit, double duration, QkDelayUnit unit)
Fügen Sie eine Verzögerungsanweisung an die Schaltung an.
Beispiel
QkCircuit *qc = qk_circuit_new(1, 0);
qk_circuit_delay(qc, 0, 100.0, QkDelayUnit_NS);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den Schaltkreis, zu dem die Verzögerung hinzugefügt werden soll.
- qubit - Der
uint32_tIndex des Qubits, auf das die Verzögerung angewendet werden soll. - duration - Die Dauer der Verzögerung.
- unit - Eine Aufzählung, die die Einheit der Dauer angibt.
*Rückkehr
Ein Exit-Code.
qk_circuit_draw
char *qk_circuit_draw(const QkCircuit *circuit, const QkCircuitDrawerConfig *config)
Zeichne den Schaltkreis als Text.
Beispiel
QkCircuit *circuit = qk_circuit_new(2, 1);
qk_circuit_gate(circuit, QkGate_H, (uint32_t[]){0}, NULL);
qk_circuit_gate(circuit, QkGate_CX, (uint32_t[]){0, 1}, NULL);
qk_circuit_measure(circuit, 0, 0);
qk_circuit_measure(circuit, 1, 0);
QkCircuitDrawerConfig config = {false, true, 0};
char *circ_str = qk_circuit_draw(circuit, &config);
printf("%s", circ_str);
qk_str_free(circ_str);
qk_circuit_free(circuit);Sicherheit
Das Verhalten ist nicht definiert, wenn kein gültiger, circuit nicht-null-Zeiger auf eine ist QkCircuit oder wenn config nicht NULL ist und ein ungültiger Zeiger auf eine QkCircuitDrawerConfig Struktur darstellt.
Parameter
-
Schaltkreis – Ein Zeiger auf den zu zeichnenden Schaltkreis.
-
config – Ein Zeiger auf die
QkCircuitDrawerConfigStruktur oder NULL. Wenn NULL, verwendet die Schublade folgende Standardwerte:bundle_cregs = truemerge_wires = truefold = 0
*Rückkehr
Ein Zeiger auf eine null-terminierte Zeichenkette, die die Schaltungsdarstellung enthält. Sie müssen verwenden, qk_str_free um den zugewiesenen Speicher nach Abschluss freizugeben.
qk_circuit_to_dag
QkDag *qk_circuit_to_dag(const QkCircuit *circuit)
Wandeln Sie einen gegebenen Schaltkreis in einen DAG um.
Die neue DAG wird aus dem Schaltkreis kopiert; die ursprüngliche circuit Referenz befindet sich weiterhin im Besitz des Aufrufenden und muss weiterhin mit freigegeben qk_circuit_free werden. Sie müssen die zurückgegebene DAG mit qk_dag_free freigeben, wenn Sie damit fertig sind.
Beispiel
QkCircuit *qc = qk_circuit_new(0, 0);
QkQuantumRegister *qr = qk_quantum_register_new(3, "qr");
qk_circuit_add_quantum_register(qc, qr);
qk_quantum_register_free(qr);
QkDag *dag = qk_circuit_to_dag(qc);
qk_dag_free(dag);
qk_circuit_free(qc);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- Schaltkreis – Ein Zeiger auf den Schaltkreis, aus dem der DAG erstellt werden soll.
*Rückkehr
Ein Zeiger auf die neue DAG.
qk_circuit_copy_empty_like
QkCircuit *qk_circuit_copy_empty_like(const QkCircuit *circuit, QkVarsMode vars_mode, QkBlocksMode blocks_mode)
Gibt eine Kopie von sich selbst mit derselben Struktur zurück, die jedoch leer ist.
Diese Struktur umfasst:
- globale Phase
- alle Qubits und Clbits, einschließlich der Register.
Beispiel
QkCircuit *qc = qk_circuit_new(10, 10);
for (int i = 0; i < 10; i++) {
qk_circuit_measure(qc, i, i);
uint32_t qubits[1] = {i};
qk_circuit_gate(qc, QkGate_H, qubits, NULL);
}
// As the circuit does not contain any control-flow instructions,
// vars_mode and blocks_mode do not have any effect.
QkCircuit *copy = qk_circuit_copy_empty_like(qc, QkVarsMode_Alike, QkBlocksMode_Drop);
size_t num_copy_instructions = qk_circuit_num_instructions(copy); // 0
// do something with the copy
qk_circuit_free(qc);
qk_circuit_free(copy);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Nicht-Null-Zeiger auf QkCircuit ist.
Parameter
- circuit - Ein Zeiger auf den zu kopierenden Schaltkreis.
- vars_mode – Der Modus für die Behandlung klassischer Variablen.
- blocks_mode – Der Modus für die Behandlung von Blöcken.
*Rückkehr
Der Zeiger auf die kopierte Schaltung.
qk_circuit_estimate_fidelity
double qk_circuit_estimate_fidelity(const QkCircuit *circuit, const QkTarget *target)
Schätzen Sie die Genauigkeit einer physikalischen Schaltung.
Diese Funktion berechnet das Produkt der Fehlerraten für jedes Gatter in der Schaltung, um die Genauigkeit der Schaltung abzuschätzen. Diese Methode dient nicht dazu, eine realistische Simulation der Ausführungsgenauigkeit auf echter Hardware zu berechnen. Es soll einen Überblick darüber geben, wie der Transpiler unter Berücksichtigung der Genauigkeit verschiedener Heuristiken bei seiner Ausführung funktionieren würde. In der Regel ist dies nur sinnvoll, um verschiedene Kompilierungsergebnisse miteinander zu vergleichen und so abzuschätzen, welches davon auf der Hardware eine qualitativ bessere Ausführung liefern würde.
Sicherheit
Das Verhalten ist undefiniert, wenn circuit und target keine gültigen, nicht-null-Zeiger auf bzw QkTarget . QkCircuit sind.
Parameter
- Schaltung – Ein Zeiger auf die Schaltung, deren Wiedergabetreue geschätzt werden soll.
- target – Ein Zeiger auf das Ziel, auf dem die Schaltung ausgeführt wird. Damit werden die Fehlerraten für die Befehle in der Schaltung ermittelt.
*Rückkehr
Die berechnete Genauigkeit der Schaltung. targetDies gibt „ NaN “ zurück, wenn es sich nicht um eine physische Schaltung handelt, d. h., wenn Anweisungen enthalten sind, die von circuit nicht unterstützt werden.
qk_circuit_get_control_flow_instruction
QkControlFlowInstruction *qk_circuit_get_control_flow_instruction(const QkCircuit *circuit, size_t inst_idx, const QkControlFlowInstruction *parent_cf)
Rufe eine Kontrollflussanweisung aus einer Schaltung mit dem angegebenen Index ab.
Diese Funktion gibt einen Zeiger auf eine undurchsichtige QkControlFlowInstruction Struktur zurück, die Informationen über eine Kontrollflussanweisung am angegebenen Index enthält. Der Befehl an inst_idx muss ein Befehl zur Steuerung des Programmablaufs sein (z. B. „ IfElse, “, „ ForLoop “ usw.).
Beispiel
QkCircuit *circuit = ...; // Assume circuit contains a control flow instruction at index 0
QkControlFlowInstruction *cf_inst = qk_circuit_get_control_flow_instruction(circuit, 0, NULL);
QkControlFlowKind kind = qk_control_flow_kind(cf_inst);
qk_control_flow_instruction_free(cf_inst);Sicherheit
Das Verhalten ist undefiniert, wenn circuit kein gültiger Zeiger auf ein QkCircuit -Objekt ist, wenn inst_idx kein gültiger Index innerhalb der Befehlsliste des Schaltkreises ist oder wenn der Befehl an inst_idx Position kein Kontrollflussbefehl ist. QkControlFlowInstructionWenn parent_cf nicht null ist, muss es sich um einen gültigen Zeiger auf ein handeln.
Parameter
- Schaltkreis – Ein Zeiger auf den Schaltkreis, der die Anweisung zur Steuerung des Programmablaufs enthält.
- inst_idx – Der Index des Befehls in der Befehlsliste der Schaltung.
- parent_cf – Ein Zeiger auf die übergeordnete Kontrollflussanweisung oder
NULL– falls sich diese Anweisung auf der obersten Ebene des Schaltkreises befindet – auf die oberste Ebene des Schaltkreises. Dies dient dazu, die korrekten Qubit- und Clbit-Zuordnungen in Bezug auf die Schaltung der obersten Ebene zu berechnen.
*Rückkehr
Ein Zeiger auf ein neu zugewiesenes QkControlFlowInstruction Objekt.
qk_control_flow_instruction_free
void qk_control_flow_instruction_free(QkControlFlowInstruction *cf_inst)
Ein QkControlFlowInstruction Objekt freigeben.
Beispiel
QkCircuit *circuit = ...; // Assume circuit contains a control flow instruction at index 0
QkControlFlowInstruction *cf_inst = qk_circuit_get_control_flow_instruction(circuit, 0, NULL);
qk_control_flow_instruction_free(cf_inst);Sicherheit
qk_circuit_get_control_flow_instructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger ist, der von zurückgegeben wurde, oder wenn diese Funktion mehr als einmal für denselben Zeiger aufgerufen wird.
Parameter
- cf_inst – Ein Zeiger auf die zu freigebende Kontrollflussanweisung.
qk_circuit_to_python
PyObject *qk_circuit_to_python(QkCircuit *qc)
Übergeben Sie die Eigentumsrechte an einem QkCircuit Objekt an „ Python “.
Das resultierende „ Python “-Objekt ist nicht das QuantumCircuit eigentliche Objekt, CircuitDatasondern das innere Objekt, auf das typischerweise als QuantumCircuit._data„“ zugegriffen wird. Sie können verwenden, qk_circuit_to_python_full um ein vollständiges QuantumCircuit Objekt zu erstellen.
Nach dem Aufruf dieser Funktion ist die Verwendung des QkCircuit Zeigers nicht mehr sicher. Insbesondere sollten Sie nicht versuchen, den Speicher zu löschen oder freizugeben. Der Aufrufer muss Eigentümer des Objekts QkCircuit sein und darf keine geliehene Referenz darauf halten (beispielsweise ist ein qk_circuit_borrow_from_python aus QkCircuit * abgerufenes Objekt kein Eigentum des Aufrufers).
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein circuit initialisiertes und im Besitz befindliches ist QkCircuit.
Parameter
- qc – Das Objekt, das sich im Besitz befindet.
*Rückkehr
Ein verweis auf das Objekt, der von „ Python “ verwaltet wird.
qk_circuit_to_python_full
PyObject *qk_circuit_to_python_full(QkCircuit *qc)
Übergeben Sie die Eigentumsrechte an einem QkCircuit Objekt an „ Python “ und erstellen Sie ein vollständiges QuantumCircuit.
Dies beinhaltet zusätzliche Logik im Bereich von Python, um das QuantumCircuit vollständige zu erzeugen, da nur dem internen QuantumCircuit._data``QkCircuit Feld entspricht.
Nach dem Aufruf dieser Funktion ist die Verwendung des QkCircuit Zeigers nicht mehr sicher. Insbesondere sollten Sie nicht versuchen, den Speicher zu löschen oder freizugeben. Der Aufrufer muss Eigentümer des Objekts QkCircuit sein und darf keine geliehene Referenz darauf halten (beispielsweise ist ein qk_circuit_borrow_from_python aus QkCircuit * abgerufenes Objekt kein Eigentum des Aufrufers).
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein circuit initialisiertes und im Besitz befindliches ist QkCircuit.
Parameter
- qc – Das Objekt, das sich im Besitz befindet.
*Rückkehr
Ein verweis auf das Objekt, der von „ Python “ verwaltet wird.
qk_circuit_borrow_from_python
QkCircuit *qk_circuit_borrow_from_python(PyObject *ob)
Rufe einen QkCircuit Zeiger von einem Python-Objekt ab.
Beachten Sie, dass die Eingabe für QuantumCircuitdiese Funktion nicht sein sollte, sondern die Ausgabe von QuantumCircuit._data. Dies ist notwendig, um eine korrekte Semantik der Referenzzählung zu gewährleisten.
Hierbei wird ein Zeiger auf Python übernommen und der QkCircuit Zeiger darauf extrahiert, sofern er vom richtigen Typ ist. Der zurückgegebene Zeiger wird vom ob Zeiger ausgeliehen. Wenn der Typ PyObject nicht korrekt ist, ist der NULL Rückgabewert und der Ausnahmezustand des Interpreter „ Python “ wird gesetzt.
Um diese Funktion aufzurufen, muss eine Verbindung zu einem „ Python “-Interpreter bestehen.
Sie können auch verwenden qk_circuit_convert_from_python, was logisch gesehen genau dasselbe wie diese Funktion ist, aber direkt als „Konverter“-Funktion für die PyArg_Parse* Familie der Konverterfunktionen von Python genutzt werden kann.
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein ob Python-Objekt ist.
Parameter
- ob – Ein Objekt vom Typ „ Python “, das ausgeliehen wurde.
*Rückkehr
Ein Zeiger auf das native Objekt oder NULL falls das Objekt „ Python “ vom falschen Typ ist.
qk_circuit_convert_from_python
int qk_circuit_convert_from_python(PyObject *object, void *address)
Rufe einen QkCircuit Zeiger von einem Python-Objekt ab.
Beachten Sie, dass die Eingabe für QuantumCircuitdiese Funktion nicht sein sollte, sondern die Ausgabe von QuantumCircuit._data. Dies ist notwendig, um eine korrekte Semantik der Referenzzählung zu gewährleisten.
Hierbei wird eine Referenz vom Typ Python übernommen und der QkCircuit Zeiger darauf in `` addressextrahiert, sofern er vom richtigen Typ ist. Der zurückgegebene Zeiger wird vom object Zeiger ausgeliehen. Wenn der Typ PyObject nicht korrekt ist, ist der Rückgabewert 0, der Ausnahmestatus des Interpreter „ Python “ wird gesetzt und address bleibt unverändert.
Um diese Funktion aufzurufen, muss eine Verbindung zu einem „ Python “-Interpreter bestehen.
Sie können auch verwenden qk_circuit_borrow_from_python, was logisch gesehen genau dasselbe ist wie dies, jedoch eine natürlichere Signatur für die direkte Verwendung bietet.
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein object Python-Objekt ist oder wenn kein Zeiger auf beschreibbare address Daten des richtigen Typs ist.
Parameter
- Objekt – Ein ausgeliehenes „ Python “-Objekt.
- Adresse – Der Speicherort, an den die Ausgabe geschrieben werden soll.
*Rückkehr
1 bei Erfolg, 0 bei Misserfolg.
qk_quantum_register_to_python
PyObject *qk_quantum_register_to_python(QkQuantumRegister *qr)
Übergeben Sie die Eigentumsrechte an einem QkQuantumRegister Objekt an „ Python “.
Nach dem Aufruf dieser Funktion ist die Verwendung des QkQuantumRegister Zeigers nicht mehr sicher. Insbesondere sollten Sie nicht versuchen, den Speicher zu löschen oder freizugeben. Der Aufrufer muss Eigentümer des Objekts QkQuantumRegister sein und darf keine geliehene Referenz darauf halten (beispielsweise ist ein qk_quantum_register_borrow_from_python aus QkQuantumRegister * abgerufenes Objekt kein Eigentum des Aufrufers).
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein qr initialisiertes und im Besitz befindliches ist QkQuantumRegister.
Parameter
- qr – Das betreffende Objekt.
*Rückkehr
Ein verweis auf das Objekt, der von „ Python “ verwaltet wird.
qk_quantum_register_borrow_from_python
const QkQuantumRegister *qk_quantum_register_borrow_from_python(PyObject *ob)
Rufe einen QkQuantumRegister Zeiger von einem Python-Objekt ab.
Hierbei wird ein Zeiger auf Python übernommen und der QkQuantumRegister Zeiger darauf extrahiert, sofern er vom richtigen Typ ist. Der zurückgegebene Zeiger wird vom ob Zeiger ausgeliehen. Wenn der Typ PyObject nicht korrekt ist, ist der NULL Rückgabewert und der Ausnahmezustand des Interpreter „ Python “ wird gesetzt.
Um diese Funktion aufzurufen, muss eine Verbindung zu einem „ Python “-Interpreter bestehen.
Sie können auch verwenden qk_quantum_register_convert_from_python, was logisch gesehen genau dasselbe wie diese Funktion ist, aber direkt als „Konverter“-Funktion für die PyArg_Parse* Familie der Konverterfunktionen von Python genutzt werden kann.
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein ob Python-Objekt ist.
Parameter
- ob – Ein Objekt vom Typ „ Python “, das ausgeliehen wurde.
*Rückkehr
Ein Zeiger auf das native Objekt oder NULL falls das Objekt „ Python “ vom falschen Typ ist.
qk_quantum_register_convert_from_python
int qk_quantum_register_convert_from_python(PyObject *object, void *address)
Rufe einen QkQuantumRegister Zeiger von einem Python-Objekt ab.
Hierbei wird eine Referenz vom Typ Python übernommen und der QkQuantumRegister Zeiger darauf in `` addressextrahiert, sofern er vom richtigen Typ ist. Der zurückgegebene Zeiger wird vom object Zeiger ausgeliehen. Wenn der Typ PyObject nicht korrekt ist, ist der Rückgabewert 0, der Ausnahmestatus des Interpreter „ Python “ wird gesetzt und address bleibt unverändert.
Um diese Funktion aufzurufen, muss eine Verbindung zu einem „ Python “-Interpreter bestehen.
Sie können auch verwenden qk_quantum_register_borrow_from_python, was logisch gesehen genau dasselbe ist wie dies, jedoch eine natürlichere Signatur für die direkte Verwendung bietet.
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein object Python-Objekt ist oder wenn kein Zeiger auf beschreibbare address Daten des richtigen Typs ist.
Parameter
- Objekt – Ein ausgeliehenes „ Python “-Objekt.
- Adresse – Der Speicherort, an den die Ausgabe geschrieben werden soll.
*Rückkehr
1 bei Erfolg, 0 bei Misserfolg.
qk_classical_register_to_python
PyObject *qk_classical_register_to_python(QkClassicalRegister *cr)
Übergeben Sie die Eigentumsrechte an einem QkClassicalRegister Objekt an „ Python “.
Nach dem Aufruf dieser Funktion ist die Verwendung des QkClassicalRegister Zeigers nicht mehr sicher. Insbesondere sollten Sie nicht versuchen, den Speicher zu löschen oder freizugeben. Der Aufrufer muss Eigentümer des Objekts QkClassicalRegister sein und darf keine geliehene Referenz darauf halten (beispielsweise ist ein qk_classical_register_borrow_from_python aus QkClassicalRegister * abgerufenes Objekt kein Eigentum des Aufrufers).
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein cr initialisiertes und im Besitz befindliches ist QkClassicalRegister.
Parameter
- cr – Das betreffende Objekt.
*Rückkehr
Ein verweis auf das Objekt, der von „ Python “ verwaltet wird.
qk_classical_register_borrow_from_python
const QkClassicalRegister *qk_classical_register_borrow_from_python(PyObject *ob)
Rufe einen QkClassicalRegister Zeiger von einem Python-Objekt ab.
Hierbei wird ein Zeiger auf Python übernommen und der QkClassicalRegister Zeiger darauf extrahiert, sofern er vom richtigen Typ ist. Der zurückgegebene Zeiger wird vom ob Zeiger ausgeliehen. Wenn der Typ PyObject nicht korrekt ist, ist der NULL Rückgabewert und der Ausnahmezustand des Interpreter „ Python “ wird gesetzt.
Um diese Funktion aufzurufen, muss eine Verbindung zu einem „ Python “-Interpreter bestehen.
Sie können auch verwenden qk_classical_register_convert_from_python, was logisch gesehen genau dasselbe wie diese Funktion ist, aber direkt als „Konverter“-Funktion für die PyArg_Parse* Familie der Konverterfunktionen von Python genutzt werden kann.
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein ob Python-Objekt ist.
Parameter
- ob – Ein Objekt vom Typ „ Python “, das ausgeliehen wurde.
*Rückkehr
Ein Zeiger auf das native Objekt oder NULL falls das Objekt „ Python “ vom falschen Typ ist.
qk_classical_register_convert_from_python
int qk_classical_register_convert_from_python(PyObject *object, void *address)
Rufe einen QkClassicalRegister Zeiger von einem Python-Objekt ab.
Hierbei wird eine Referenz vom Typ Python übernommen und der QkClassicalRegister Zeiger darauf in `` addressextrahiert, sofern er vom richtigen Typ ist. Der zurückgegebene Zeiger wird vom object Zeiger ausgeliehen. Wenn der Typ PyObject nicht korrekt ist, ist der Rückgabewert 0, der Ausnahmestatus des Interpreter „ Python “ wird gesetzt und address bleibt unverändert.
Um diese Funktion aufzurufen, muss eine Verbindung zu einem „ Python “-Interpreter bestehen.
Sie können auch verwenden qk_classical_register_borrow_from_python, was logisch gesehen genau dasselbe ist wie dies, jedoch eine natürlichere Signatur für die direkte Verwendung bietet.
Sicherheit
Der Anrufer muss mit einem Dolmetscher von Python verbunden sein. Das Verhalten ist nicht definiert, wenn kein gültiger, nicht-null-Zeiger auf ein object Python-Objekt ist oder wenn kein Zeiger auf beschreibbare address Daten des richtigen Typs ist.
Parameter
- Objekt – Ein ausgeliehenes „ Python “-Objekt.
- Adresse – Der Speicherort, an den die Ausgabe geschrieben werden soll.
*Rückkehr
1 bei Erfolg, 0 bei Misserfolg.