Skip to main content
IBM Quantum Platform

QkTarget

typedef struct QkTarget QkTarget

Eine 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 QkTarget explizit 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 dt Wert 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 zu QkTarget hinzugefü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_t Werten, die als qargs verwendet werden sollen. Kann NULL sein, 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_t Werten, die als qargs verwendet werden sollen. Kann NULL sein, wenn global.
  • params – Ein Zeiger auf ein Array von Zeigern auf QkParam Objekte, die als Parameter zu überprüfen sind. Kann sein, NULL wenn 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_idx sich 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 QkInstructionProperties Instanz.

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 QkTargetOp werden.

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 Target Instanz.
  • 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 QkTargetOp Objekt.
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.