Skip to main content
IBM Quantum Platform

QkCircuit

typedef struct QkCircuit QkCircuit

Das 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:

∣ψ⟩=(∣000⟩+∣111⟩)/2|\psi\rangle = \left( |000\rangle + |111\rangle \right) / \sqrt{2}
#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==100

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 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==50

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 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_t qubits, zu dem das Tor hinzugefügt werden soll. Dies kann ein Nullzeiger sein, wenn es keine Qubits für gate gibt (z. B. QkGate_GlobalPhase).
  • params - Der Zeiger auf das Array mit den double Werten, die für die Gate-Parameter verwendet werden sollen. Dies kann ein Null-Zeiger sein, wenn es keine Parameter für gate gibt (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 circuit

Sicherheit

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 QkGate hinzugefügt werden soll.
  • qubits - Der Zeiger auf das Array mit den Indizes von uint32_t qubits, zu dem das Tor hinzugefügt werden soll. Dies kann ein Nullzeiger sein, wenn es keine Qubits für gate gibt (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 sind gate (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_t für das zu messende Qubit
  • clbit - Die uint32_t fü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_t fü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_t qubits, 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:

  • circuit ist ein gültiger, nicht-null-Zeiger auf eine QkCircuit
  • matrix ist ein ausgerichteter Zeiger auf 4**num_qubits initialisierte QkComplex64 Werte
  • qubits ist ein ausgerichteter Zeiger auf num_qubits initialisierte uint32_t Werte

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 Dimension 2 ^ num_qubits x 2 ^ num_qubits sein. Genauer gesagt: das (i, j)-te Element ist durch matrix[i * 2^n + j] gegeben. Der Inhalt von matrix wird innerhalb dieser Funktion kopiert, bevor er der Schaltung hinzugefügt wird. Der Aufrufer behält also das Eigentum an dem ursprünglichen Speicher, auf den matrix zeigt, 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); // 1

Sicherheit

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:

  • circuit ist ein gültiger, nicht-null-Zeiger auf eine QkCircuit
  • rotation ist ein gültiger, nicht-null-Zeiger auf einen kohärenten QkPauliProductRotation. Insbesondere müssen die Datenfelder rotation->z``rotation->x und für rotation->len Elemente lesbar sein.
  • qubits ist ein ausgerichteter Zeiger auf rotation->len initialisierte uint32_t Werte.

Parameter

  • Schaltkreis – Der Schaltkreis, auf den die Operation angewendet werden soll.
  • Rotation – Ein Zeiger auf die QkPauliProductRotation anzuwendende 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:

  • circuit ist ein gültiger, nicht-null-Zeiger auf eine QkCircuit
  • measurement ist ein gültiger, nicht-null-Zeiger auf einen kohärenten QkPauliProductMeasurement. Insbesondere müssen die Datenfelder measurement->z``measurement->x und für measurement->len Elemente lesbar sein.
  • qubits ist ein ausgerichteter Zeiger auf rotation->len initialisierte uint32_t Werte.

Parameter

  • Schaltkreis – Der Schaltkreis, auf den die Operation angewendet werden soll.
  • Messung – Ein Zeiger auf die QkPauliProductMeasurement anzuwendende Messung.
  • Qubits – Ein Zeiger auf das Qubit-Array.
  • clbit – Ein einzelnes Qubit, das das uint32_t Mess-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 circuit

Sicherheit

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_t Index 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 QkCircuitDrawerConfig Struktur oder NULL. Wenn NULL, verwendet die Schublade folgende Standardwerte:

    • bundle_cregs = true
    • merge_wires = true
    • fold = 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.

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