QkTarget
typedef struct QkTarget QkTargetEine Zuordnung von Anweisungen und Eigenschaften, die die besonderen Beschränkungen eines Backends darstellen. Ihr Zweck ist es, dem Compiler Informationen zu liefern, die es ihm ermöglichen, eine Eingabeschaltung in eine andere zu kompilieren, die unter Berücksichtigung der Spezifikationen von QkTargetoptimiert ist. Diese Struktur stellt eine Low-Level-Schnittstelle zur Hauptdatenstruktur Target in Rust dar, die die Basisklasse für ihr Gegenstück Python darstellt, Target.
Hier ein Beispiel dafür, wie diese Struktur funktioniert:
#include <qiskit.h>
#include <math.h>
// Create a Target with 2 qubits
QkTarget *target = qk_target_new(2);
// Create an entry for a CX Gate with qargs (0, 1) and properties
// duration = 0.0123
// error = NaN
uint32_t qargs[2] = {0, 1};
QkTargetEntry *entry = qk_target_entry_new(QkGate_CX);
qk_target_entry_add_property(entry, qargs, 2, 0.0123, NAN);
// Add a CX Gate to the target
qk_target_add_instruction(target, entry);
// Add a global H gate
qk_target_add_instruction(target, qk_target_entry_new(QkGate_H));
// Free the created target.
qk_target_free(target);Die Target C API unterstützt derzeit nur das Hinzufügen von QkGate Instanzen mit entweder keinen oder festen Parametern. Die Unterstützung für reguläre Parameter wird in Zukunft hinzugefügt werden. Die Funktionalität wird im Laufe der Zeit weiter ausgebaut, wenn wir unser Rust-Datenmodell verbessern.
Datentypen
QkInstructionProperties
struct QkInstructionProperties
Eine Darstellung der Anweisungseigenschaften einer Zieloperation.
doppelte Dauer
Die Dauer der Anweisung für den angegebenen Qubit-Satz in Sekunden. Wird auf gesetzt NaN , wenn die Eigenschaft nicht definiert ist.
doppelter Fehler
Die durchschnittliche Fehlerrate für die Anweisung auf dem angegebenen Qubit-Satz. Wird auf gesetzt NaN , wenn die Eigenschaft nicht definiert ist.
QkTargetOp
struct QkTargetOp
Darstellung einer innerhalb des Ziels identifizierten Operation.
Diese Struktur wird nativ von der zugrunde liegenden Target API erstellt, und Benutzer sollten weder direkt in sie schreiben noch versuchen, ihre Attribute manuell freizugeben, da dies zu undefiniertem Verhalten führen würde. Um diese Struktur freizugeben, sollten Benutzer stattdessen qk_target_op_clear aufrufen.
QkOperationKind op_type
Die Kennung für den aktuellen Vorgang.
Zeichen *Name
Der Name der Operation.
uint32_t Anzahl der Qubits
Die Anzahl der Qubits, die dieser Vorgang unterstützt. Bei variadischen Parametern (uint32_t)-1 wird standardmäßig verwendet.
const QkParam **params
Die mit diesem Vorgang verbundenen Parameter, wie QkParam. Wenn keine Parameter vorhanden sind, wird dieser Wert durch einen NULL Zeiger dargestellt.
uint32_t Anzahl der Parameter
Die Anzahl der von diesem Vorgang unterstützten Parameter. Bei variadischen Parametern (uint32_t)-1 wird standardmäßig verwendet.
Funktionen
qk_target_new
QkTarget *qk_target_new(uint32_t num_qubits)
Konstruieren Sie eine neue QkTarget mit der angegebenen Anzahl von Qubits. Die Anzahl der Qubits wird sich zwangsläufig ändern, wenn eine Anweisung mit Eigenschaften hinzugefügt wird, die sich auf eine Sammlung von Qargs beziehen, bei denen ein beliebiger Index höher ist als die angegebene Anzahl von Qubits
Beispiel
QkTarget *target = qk_target_new(5);Parameter
- num_qubits - Die Anzahl der Qubits, die
QkTargetexplizit unterstützt.
Rückgabe
Ein Zeiger auf den neuen QkTarget
qk_target_borrow_from_python
QkTarget *qk_target_borrow_from_python(PyObject *ob)
Rufe einen QkTarget Zeiger von einem Python-Objekt ab.
Hierbei wird ein Zeiger auf Python übernommen und der QkTarget 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_target_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ückgabe
Ein Zeiger auf das native Objekt oder NULL falls das Objekt „ Python “ vom falschen Typ ist.
qk_target_convert_from_python
int qk_target_convert_from_python(PyObject *object, void *address)
Ruft einen Target-Zeiger aus einem „ Python “-Objekt ab.
Hierbei wird eine Referenz vom Typ Python übernommen und der QkTarget Zeiger darauf in `` addressextrahiert, sofern er vom richtigen Typ ist. Der zurückgegebene Zeiger wird vom object Zeiger ausgeliehen. Wenn nicht vom PyObject richtigen Typ ist, ist der Rückgabewert 1, der Ausnahmezustand 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_target_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ückgabe
1 bei Erfolg, 0 bei Misserfolg.
qk_target_num_qubits
uint32_t qk_target_num_qubits(const QkTarget *target)
Gibt die Anzahl der Qubits dieses QkTarget zurück.
Beispiel
QkTarget *target = qk_target_new(5);
uint32_t num_qubits = qk_target_num_qubits(target);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget.
Rückgabe
Die Anzahl der Qubits, die dieses Ziel verwenden kann.
qk_target_dt
double qk_target_dt(const QkTarget *target)
Gibt den dt-Wert dieses QkTarget zurück.
Beispiel
QkTarget *target = qk_target_new(5);
qk_target_set_dt(target, 10e-9);
double dt = qk_target_dt(target);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget.
Rückgabe
Der dt-Wert dieser QkTarget oder NAN , falls nicht zugewiesen.
qk_target_granularity
uint32_t qk_target_granularity(const QkTarget *target)
Gibt den Granularitätswert dieser QkTarget zurück.
Beispiel
QkTarget *target = qk_target_new(5);
// The value defaults to 1
uint32_t granularity = qk_target_granularity(target);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget.
Rückgabe
Der granularity Wert dieser QkTarget.
qk_target_min_length
uint32_t qk_target_min_length(const QkTarget *target)
Gibt den min_length Wert dieser QkTarget zurück.
Beispiel
QkTarget *target = qk_target_new(5);
// The value defaults to 1
size_t min_length = qk_target_min_length(target);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget.
Rückgabe
Der min_length Wert dieser QkTarget.
qk_target_pulse_alignment
uint32_t qk_target_pulse_alignment(const QkTarget *target)
Gibt den pulse_alignment Wert dieser QkTarget zurück.
Beispiel
QkTarget *target = qk_target_new(5);
// The value defaults to 1
uint32_t pulse_alignment = qk_target_pulse_alignment(target);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget.
Rückgabe
Der pulse_alignment Wert dieser QkTarget.
qk_target_acquire_alignment
uint32_t qk_target_acquire_alignment(const QkTarget *target)
Gibt den acquire_alignment Wert dieser QkTarget zurück.
Beispiel
QkTarget *target = qk_target_new(5);
// The value defaults to 0
uint32_t acquire_alignment = qk_target_pulse_alignment(target);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget.
Rückgabe
Der acquire_alignment Wert dieser QkTarget.
qk_target_set_dt
QkExitCode qk_target_set_dt(QkTarget *target, double dt)
Legt den dt-Wert dieser QkTarget fest.
Beispiel
QkTarget *target = qk_target_new(5);
double dt = qk_target_set_dt(target, 10e-9);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - dt - Der
dtWert für die Systemzeitauflösung des Eingangs.
Rückgabe
QkExitCode die angibt, ob der Vorgang erfolgreich war.
qk_target_set_granularity
QkExitCode qk_target_set_granularity(QkTarget *target, uint32_t granularity)
Legt den granularity Wert dieser QkTarget fest.
Beispiel
QkTarget *target = qk_target_new(5);
// The value defaults to 1
qk_target_set_granularity(target, 2);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - granularity - Der Wert für die minimale Impuls-Tor-Auflösung in Einheiten von
dt.
Rückgabe
QkExitCode die angibt, ob der Vorgang erfolgreich war.
qk_target_set_min_length
QkExitCode qk_target_set_min_length(QkTarget *target, uint32_t min_length)
Legt den min_length Wert dieser QkTarget fest.
Beispiel
QkTarget *target = qk_target_new(5);
// The value defaults to 1
qk_target_set_min_length(target, 3);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - min_length - Der Mindestwert für die Impuls-Torlänge in Einheiten von
dt.
Rückgabe
QkExitCode die angibt, ob der Vorgang erfolgreich war.
qk_target_set_pulse_alignment
QkExitCode qk_target_set_pulse_alignment(QkTarget *target, uint32_t pulse_alignment)
Gibt den pulse_alignment Wert dieser QkTarget zurück.
Beispiel
QkTarget *target = qk_target_new(5);
// The value defaults to 1
qk_target_set_pulse_alignment(target, 4);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - pulse_alignment - Wert, der eine zeitliche Auflösung des Gates darstellt.
Rückgabe
QkExitCode die angibt, ob der Vorgang erfolgreich war.
qk_target_set_acquire_alignment
QkExitCode qk_target_set_acquire_alignment(QkTarget *target, uint32_t acquire_alignment)
Legt den acquire_alignment Wert dieser QkTarget fest.
Beispiel
QkTarget *target = qk_target_new(5);
// The value defaults to 0
qk_target_set_acquire_alignment(target, 5);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - acquire_alignment - Wert, der eine zeitliche Auflösung der Startzeit der Messanweisung darstellt.
Rückgabe
QkExitCode die angibt, ob der Vorgang erfolgreich war.
qk_target_copy
QkTarget *qk_target_copy(QkTarget *target)
Erzeugt eine Kopie der QkTarget.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *entry = qk_target_entry_new(QkGate_CX);
uint32_t qargs[2] = {0, 1};
qk_target_entry_add_property(entry, qargs, 2, 0.0, 0.1);
QkExitCode result = qk_target_add_instruction(target, entry);
QkTarget *copied = qk_target_copy(target);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf das zu kopierende
QkTarget.
Rückgabe
Ein Zeiger auf die neue Kopie der QkTarget.
qk_target_free
void qk_target_free(QkTarget *target)
Befreien Sie die QkTarget.
Beispiel
QkTarget *target = qk_target_new(5);
qk_target_free(target);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget, die freigegeben werden soll.
qk_target_add_instruction
QkExitCode qk_target_add_instruction(QkTarget *target, QkTargetEntry *target_entry)
Fügt der Website QkTarget über QkTargetEntry ein Tor hinzu.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *entry = qk_target_entry_new(QkGate_CX);
uint32_t qargs[2] = {0, 1};
qk_target_entry_add_property(entry, qargs, 2, 0.0, 0.1);
QkExitCode result = qk_target_add_instruction(target, entry);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Das Verhalten ist undefiniert, wenn entry kein gültiger, nicht-null Zeiger auf QkTargetEntry ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - target_entry - Ein Zeiger auf den
QkTargetEntry. Der Zeiger wird freigegeben, wenn er zuQkTargethinzugefügt wird.
Rückgabe
QkExitCode die angibt, ob der Vorgang erfolgreich war.
qk_target_update_property
QkExitCode qk_target_update_property(QkTarget *target, QkGate instruction, uint32_t *qargs, uint32_t num_qubits, double duration, double error)
Ändert die Eigenschaften eines Gatters in der QkTarget.
Beispiel
QkTarget *target = qk_target_new(5);
double params[1] = {3.1415};
QkTargetEntry *entry = qk_target_entry_new_fixed(QkGate_CRX, params, "crx_pi");
uint32_t qargs[2] = {0, 1};
qk_target_entry_add_property(entry, qargs, 2, 0.0, 0.1);
qk_target_add_instruction(target, entry);
qk_target_update_property(target, QkGate_CRX, qargs, 2, 0.0012, 1.1);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Es wird erwartet, dass der Typ qargs ein Zeiger auf ein Array von uint32_t ist, wobei die Länge durch num_qubits festgelegt wird und mit der Erwartung des Gatters übereinstimmen muss. Wenn das Array unzureichend lang ist, ist das Verhalten dieser Funktion undefiniert, da sie außerhalb der Grenzen des Arrays liest. Er kann ein Null-Zeiger sein, wenn es keine Qubits für ein bestimmtes Gate gibt. Sie können unter qk_gate_num_qubits nachsehen, wie viele Qubits für ein bestimmtes Gatter erforderlich sind.
Parameter
- target - Ein Zeiger auf die
QkTarget. - instruction - Die zu ändernde Anweisung.
- qargs - Der Zeiger auf das Array von
uint32_tWerten, die als qargs verwendet werden sollen. KannNULLsein, wenn global. - num_qubits - Die Anzahl der Qubits der Anweisung...
- duration - Die Dauer des Befehls in Sekunden für den spezifischen Satz von Qubits.
- error - Die durchschnittliche Fehlerrate der Anweisung auf dem spezifischen Satz von Qubits.
Rückgabe
QkExitCode die angibt, ob der Vorgang erfolgreich war.
qk_target_num_instructions
size_t qk_target_num_instructions(const QkTarget *target)
Gibt die Anzahl der von einem QkTarget verfolgten Anweisungen zurück.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *target_entry = qk_target_entry_new(QkGate_H);
qk_target_add_instruction(target, target_entry);
size_t num_instructions = qk_target_num_instructions(target);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget.
Rückgabe
Die Länge der Zielscheibe.
qk_target_instruction_supported
bool qk_target_instruction_supported(const QkTarget *target, const char *operation_name, const uint32_t *qargs, QkParam **params)
Überprüft, ob die angegebene Anweisung und ihre qargs von diesem Targetunterstützt werden.
Beispiel
// Create a mock target with only a global crx entry
// and 3.14 as its rotation parameter.
QkTarget *target = qk_target_new(5);
QkTargetEntry *crx_entry = qk_target_entry_new_fixed(QkGate_CRX, (double[]){3.14});
qk_target_entry_add_property(crx_entry, NULL, 0, 0.0, 0.1);
qk_target_add_instruction(target, crx_entry);
// Check if target is compatible with a "crx" gate
// at [0, 1] with 3.14 rotation.
QkParam *params[1] = {qk_param_from_double(3.14)};
qk_target_instruction_supported(target, "crx", (uint32_t []){0, 1}, params);
// Free the pointers
qk_param_free(params[0]);
qk_target_free(target);Sicherheit
Das Verhalten ist undefiniert, wenn kein gültiger, target nicht-null Zeiger auf ein ist QkTarget.
Das qargs Argument sollte ein Zeiger auf ein Array sein, u32int_t dessen Länge den Erwartungen des Gates entspricht. Wenn das Array nicht ausreichend lang ist, ist das Verhalten dieser Funktion undefiniert, da außerhalb der Grenzen des Arrays gelesen wird. Es kann ein Nullzeiger sein, wenn für ein bestimmtes Gatter keine Qubits vorhanden sind. Sie können überprüfen qk_gate_num_qubits , wie viele Qubits für ein bestimmtes Gate erforderlich sind.
Das params Argument sollte ein Array sein, QkParam dessen Länge den Erwartungen der betreffenden Operation entspricht. Wenn das Array nicht lang genug ist, ist das Verhalten wie oben für das qargs Argument erwähnt undefiniert. Sie können dies jederzeit überprüfen, wenn es sich um qk_gate_num_params einen Fall QkGatevon handelt.
Parameter
- Ziel – Ein Zeiger auf die
Target. - operation_name – Der Name der zu überprüfenden Anweisung.
- qargs - Der Zeiger auf das Array von
uint32_tWerten, die als qargs verwendet werden sollen. KannNULLsein, wenn global. - params – Ein Zeiger auf ein Array von Zeigern auf
QkParamObjekte, die als Parameter zu überprüfen sind. Kann sein,NULLwenn keine Parameter vorhanden sind.
Rückgabe
Ob die Anweisung unterstützt wird oder nicht.
qk_target_op_index
size_t qk_target_op_index(const QkTarget *target, const char *name)
Gibt den Index zurück, an dem sich eine Operation anhand ihres Namens befindet.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *target_entry = qk_target_entry_new(QkGate_H);
qk_target_add_instruction(target, target_entry);
size_t op_idx = qk_target_op_index(target, "h");Sicherheit
Das Verhalten ist undefiniert, wenn kein gültiger, QkTarget nicht-null Zeiger auf ein ist QkTarget. Das Verhalten ist undefiniert, wenn kein Zeiger auf eine gültige name null-terminierte Zeichenkette ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - name – Der Name, dessen Index abgerufen werden soll.
Rückgabe
Der Index, in dem die Operation der Maximalwert von ist size_t , falls er nicht im Ziel enthalten ist.
qk_target_op_name
char *qk_target_op_name(const QkTarget *target, size_t index)
Gibt den Namen der Operation zurück, die unter diesem Index in der QkTarget Gate-Map der Instanz gespeichert ist.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *target_entry = qk_target_entry_new(QkGate_H);
qk_target_add_instruction(target, target_entry);
char *op_name = qk_target_op_name(target, 0);
// Free after use
qk_str_free(op_name);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - Index – Der Index, unter dem das Gate gespeichert ist.
Rückgabe
Der Name der Operation, die mit dem angegebenen Index verbunden ist.
qk_target_op_num_properties
size_t qk_target_op_num_properties(const QkTarget *target, size_t index)
Gibt die Anzahl der Eigenschaften zurück, die für die angegebene Operation in der QkTarget Instanz „ a.k.a “ definiert sind. die Länge der Grundstückskarte. Gibt eine Panik aus, wenn der Operationsindex nicht vorhanden ist.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *target_entry = qk_target_entry_new(QkGate_H);
qk_target_add_instruction(target, target_entry);
size_t num_props = qk_target_op_num_properties(target, 0);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - Index – Der Index, in dem das Gate gespeichert ist.
Rückgabe
Die Anzahl der Eigenschaften, die für die mit diesem Index verbundene Operation angegeben sind.
qk_target_op_qargs_index
size_t qk_target_op_qargs_index(const QkTarget *target, size_t op_idx, const uint32_t *qargs)
Ruft den Index ab, unter dem einige qargs gespeichert sind. Gibt zurück SIZE_MAX , wenn nicht gefunden.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *entry = qk_target_entry_new(QkGate_CX);
uint32_t qargs[2] = {0, 1};
qk_target_entry_add_property(entry, qargs, 2, 0.0, 0.1);
qk_target_add_instruction(target, entry);
size_t idx_0_1 = qk_target_op_qargs_index(target, 0, qargs);Sicherheit
Das Verhalten ist undefiniert, wenn QkTarget kein gültiger, nicht-null Zeiger auf QkTarget ist.
Parameter
- target - Ein Zeiger auf die
QkTarget. - op_idx – Der Index, unter dem die Operation gespeichert ist.
- qargs – Ein Zeiger auf das Array der zu
uint32_tüberprüfenden Qubit-Indizes, kann ein Nullzeiger sein, um globale Eigenschaften zu überprüfen.
Rückgabe
Der Index der qargs, die mit der Anweisung am angegebenen op_idx Index verknüpft sind, oder, SIZE_MAX falls die qargs nicht vorhanden sind.
qk_target_op_qargs
void qk_target_op_qargs(const QkTarget *target, size_t op_idx, size_t qarg_idx, uint32_t **qargs_out, uint32_t *qargs_len)
Rufen Sie die qargs für den Vorgang anhand des Index ab.
Gibt eine Panikmeldung aus, wenn einer der Indizes außerhalb des zulässigen Bereichs liegt.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *entry = qk_target_entry_new(QkGate_CX);
uint32_t qargs[2] = {0, 1};
qk_target_entry_add_property(entry, qargs, 2, 0.0, 0.1);
qk_target_add_instruction(target, entry);
uint32_t *qargs_retrieved;
uint32_t qargs_length;
qk_target_op_qargs(target, 0, 0, &qargs_retrieved, &qargs_length);
if (qargs_retrieved) {
// We should enter this branch.
printf("Number of qargs: %lu\n", qargs_length);
} else {
printf("Qargs are global\n");
}Sicherheit
Das Verhalten ist undefiniert, wenn kein gültiger, target nicht-null Zeiger auf ein ist QkTarget. Das Verhalten ist undefiniert, wenn oder nicht qargs_out aufeinander abgestimmt und für einen einzelnen qargs_len Wert des richtigen Typs beschreibbar sind.
Parameter
- target - Ein Zeiger auf die
QkTarget. - op_idx – Der Index, unter dem das Gate gespeichert ist.
- qarg_idx – Der Index, unter dem die qargs gespeichert sind.
- qargs_out – Ein Out-Zeiger auf ein Array von Qubits. Wenn
op_idxsich auf eine globale Operation bezieht, wird ein Nullzeiger geschrieben. Der schriftliche Zeiger wird vom Ziel ausgeliehen und darf nicht freigegeben werden. Eine Anweisung ohne qargs schreibt einen Nicht-Null-Zeiger, der jedoch für Lesevorgänge ungültig ist. - qargs_len – Ein Out-Zeiger auf die Länge der qargs in
qargs_out. Wenn der Index global ist, ist die geschriebene Länge nicht definiert.
qk_target_op_props
void qk_target_op_props(const QkTarget *target, size_t op_idx, size_t qarg_idx, QkInstructionProperties *inst_props)
Rufen Sie die qargs für den Vorgang ab, die in den entsprechenden Indizes gespeichert sind.
Gibt eine Panikmeldung aus, wenn einer der Indizes außerhalb des zulässigen Bereichs liegt.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *entry = qk_target_entry_new(QkGate_CX);
uint32_t qargs[2] = {0, 1};
qk_target_entry_add_property(entry, qargs, 2, 0.0, 0.1);
qk_target_add_instruction(target, entry);
QkInstructionProperties inst_props;
qk_target_op_props(target, 0, 0, &inst_props);Sicherheit
Das Verhalten ist undefiniert, wenn kein gültiger, target nicht-null Zeiger auf ein ist QkTarget. Das Verhalten ist undefiniert, wenn inst_props nicht auf eine Adresse der richtigen Größe zum Speichern QkInstructionProperties von zeigt.
Parameter
- target - Ein Zeiger auf die
QkTarget. - op_idx – Der Index, in dem das Gate gespeichert ist.
- qarg_idx – Der Index, in dem die qargs gespeichert sind.
- inst_props – Ein Zeiger zum Schreiben der
QkInstructionPropertiesInstanz.
qk_target_op_get
void qk_target_op_get(const QkTarget *target, size_t index, QkTargetOp *out_op)
Ruft Informationen über einen Vorgang im Ziel über den Index ab. Wenn der Index nicht vorhanden ist, löst diese Funktion eine Panik aus. Sie können die QkTarget Gesamtzahl der Anweisungen mit überprüfen qk_target_num_instructions.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *entry = qk_target_entry_new(QkGate_CX);
uint32_t qargs[2] = {0, 1};
qk_target_entry_add_property(entry, qargs, 2, 0.0, 0.1);
qk_target_add_instruction(target, entry);
QkTargetOp op;
qk_target_op_get(target, 0, &op);
// Clean up after you're done
qk_target_op_clear(&op);Sicherheit
Das Verhalten ist undefiniert, wenn kein gültiger, target nicht-null Zeiger auf ein ist QkTarget. Das Verhalten ist undefiniert, wenn out_op nicht auf eine Adresse der richtigen Größe zum Speichern QkTargetOp von zeigt.
Parameter
- target - Ein Zeiger auf die
QkTarget. - Index – Der Index, in dem das Gate gespeichert ist.
- out_op – Ein Zeiger auf den Speicherplatz, an dem die gespeichert
QkTargetOpwerden.
qk_target_op_gate
QkGate qk_target_op_gate(const QkTarget *target, size_t index)
Versucht, einen QkGate basierend auf der in einem Index gespeicherten Operation abzurufen. Der Benutzer ist dafür verantwortlich, zu überprüfen, ob dieser Vorgang ein Tor in der QkTarget via unter qk_target_op_getVerwendung von ist. Wenn nicht, löst diese Funktion eine Panik aus.
Beispiel
QkTarget *target = qk_target_new(5);
QkTargetEntry *entry = qk_target_entry_new(QkGate_CX);
uint32_t qargs[2] = {0, 1};
qk_target_entry_add_property(entry, qargs, 2, 0.0, 0.1);
qk_target_add_instruction(target, entry);
QkTargetOp op;
qk_target_op_get(target, 0, &op);
// Check if the operation is a gate;
if (op.op_type == QkOperationKind_Gate) {
QkGate gate = qk_target_op_gate(target, 0);
// Do something
}
// Clean up after you're done.
qk_target_op_clear(&op);Sicherheit
Das Verhalten ist undefiniert, wenn der target Zeiger null ist oder nicht ausgerichtet ist.
Parameter
- Ziel – Ein Zeiger auf die
TargetInstanz. - Index – Der Index, in dem sich die Operation befindet.
Rückgabe
Die QkGate Aufzählung in dem genannten Index.
qk_target_op_clear
void qk_target_op_clear(QkTargetOp *op)
Löscht das QkTargetOp Objekt.
Sicherheit
Das Verhalten ist undefiniert, wenn der Zeiger null oder nicht ausgerichtet ist. Die zu einem gehörenden QkTargetOp Daten stammen aus Rust und können nur mit dieser Funktion freigegeben werden.
Parameter
- op – Der Zeiger auf ein
QkTargetOpObjekt.