Schaltkreisbibliothek
Die Qiskit-Schaltkreisbibliothek enthält Funktionen und übergeordnete Bausteine zum Erstellen häufig verwendeter Quantenschaltkreise.
Datentypen
QkPauliProductRotation
struct QkPauliProductRotation
Eine Darstellung der Rotationsdaten des Pauli-Produkts.
Eine Pauli-Produkt-Rotation bewirkt eine Drehung um eine Achse angle , die durch ein Pauli-Produkt über len Qubits definiert ist. Der Pauli-Vektor wird hier im ZX-Format dargestellt, wobei zwei boolesche Arrays die Z- und X-Komponenten repräsentieren.
bool *z
Zeiger auf ein len Array von Z-Komponenten.
bool *x
Zeiger auf ein Array len der Länge X mit X Elementen.
size_t len
Die Anzahl der Pauli-Terme.
QkParam *Winkel
Der Drehwinkel.
QkPauliProductMeasurement
struct QkPauliProductMeasurement
Eine Darstellung der Messdaten zum Pauli-Produkt.
Eine Pauli-Produkt-Messung führt eine Projektion auf den Eigenraum des definierten Pauli-Produkts auf len Qubits durch. Der Pauli-Vektor wird hier im ZX-Format dargestellt, wobei zwei boolesche Arrays die Z- und X-Komponenten repräsentieren; er kann ein Minuszeichen enthalten, das durch „ flip_outcome.“ gekennzeichnet ist.
bool *z
Zeiger auf ein len Array von Z-Komponenten.
bool *x
Zeiger auf ein Array len der Länge X mit X Elementen.
size_t len
Die Anzahl der Pauli-Terme.
bool flip_outcome
Ob das Messergebnis ein Minuszeichen aufweist.
Funktionen
qk_circuit_library_iqp
QkCircuit *qk_circuit_library_iqp(uint32_t num_qubits, const int64_t *interactions, bool check_input)
Erzeuge eine IQP-Schaltung (Instantaneous Quantum Polynomial) aus einer ganzzahligen Wechselwirkungsmatrix.
Die interactions Matrix wird als n × n zeilenorientiertes Array aus 64-Bit-Ganzzahlen interpretiert, wobei n = num_qubits. Die diagonalen Einträge legen T-ähnliche Phasenpotenzen fest, und das obere Dreieck kodiert Zwei-Qubit-CPhase-Wechselwirkungen.
Sicherheit
Wenn num_qubits > 0, interactions** muss** ein gültiger, nicht-null-Zeiger auf mindestens num_qubits * num_qubits zusammenhängende int64_t Werte in zeilenorientierter Reihenfolge sein. Der Speicher, auf den verweist, interactions muss korrekt ausgerichtet sein, während der gesamten Dauer dieses Aufrufs lesbar sein und darf keine veränderbare Alias-Zuordnung aufweisen. Die Übergabe eines ungültigen Zeigers oder eines zu kleinen Puffers führt zu undefiniertem Verhalten.
Parameter
- num_qubits – Anzahl der logischen Qubits (
n). Muss mit der Dimension derinteractionsMatrix übereinstimmen. - Interaktionen – Zeiger auf eine zeilenorientierte
n × nMatrix vom Typint64_t. Darf nur dann NULL sein, wennnum_qubits == 0. - check_input – Wenn diese Funktion
trueaufgerufen wird, überprüft sie, ob die Matrix symmetrisch ist, und gibt einen FehlerwertNULLzurück, falls dies nicht der Fall ist. In diesem Fallfalsewird keine zusätzliche Überprüfung durchgeführt.
Rückgabe
Eine bei Erfolg QkCircuit* neu zugewiesene (der Aufrufer muss sie mit qk_circuit_freefreigeben), oder NULL wenn num_qubits > 0 und interactions ist NULL, oder wenn check_input ist true und die Matrix nicht symmetrisch ist.
qk_circuit_library_random_iqp
QkCircuit *qk_circuit_library_random_iqp(uint32_t num_qubits, int64_t seed)
Erzeuge eine zufällige Instantaneous-Quantum-Polynomial-Schaltung (IQP).
Dadurch wird intern eine zufällige symmetrische Interaktionsmatrix aus ganzen Zahlen erstellt und zur Erstellung einer IQP-Schaltung verwendet, ähnlich wie beim qiskit.circuit.library.IQP Konstruktor „ Python “.
Parameter
- num_qubits – Anzahl der Qubits.
- Startwert – RNG-Startwert. Ist der Wert negativ, wird die Entropie vom Betriebssystem bezogen; andernfalls wird der angegebene Wert als deterministischer Startwert verwendet.
Rückgabe
Ein neu zugewiesener QkCircuit* Speicherblock (der Aufrufer muss ihn mit qk_circuit_freefreigeben).
qk_pauli_product_rotation_clear
void qk_pauli_product_rotation_clear(QkPauliProductRotation *inst)
Lösche die internen Daten der von Rust zugewiesenen QkPauliProductRotation.
Dadurch wird der Speicher der Arrays z``x und freigegeben und der Speicher von anglefreigegeben. Diese Funktion sollte nur für QkPauliProductRotation Objekte aufgerufen werden, deren Daten von Rust bereitgestellt wurden.
Beispiel
// let `circuit` be a QkCircuit* and `index` a size_t at the position of a QkPauliProductRotation
QkPauliProductRotation inst;
// query the QkPauliProductRotation data
assert(qk_circuit_operation_kind(circuit, index) == QkOperationKind_PauliProductRotation);
qk_circuit_inst_pauli_product_rotation(circuit, index, &inst);
// do something with `inst`, and then clear the Rust-allocated data
qk_pauli_product_rotation_clear(&inst);Im Gegensatz dazu sollte diese Funktion nicht aufgerufen werden, wenn C bereits für das Löschen der Daten sorgt.
bool z[4] = {false, false, true, true};
bool x[4] = {false, true, true, false};
QkParam *angle = qk_param_from_double(1.0);
QkPauliProductRotation rotation = {z, x, 4, angle};
// since this data is allocated by C, we do not call `qk_pauli_product_rotation_clear(&rotation)`!
qk_param_free(angle);Sicherheit
Das Verhalten ist nicht definiert, wenn kein gültiger, inst``QkPauliProductRotation nicht-null-Zeiger auf ein ist oder wenn die internen Daten von QkPauliProductRotation inkonsistent sind.
Parameter
- inst – Ein Zeiger auf das
QkPauliProductRotationzu löschende Element.
qk_pauli_product_measurement_clear
void qk_pauli_product_measurement_clear(QkPauliProductMeasurement *inst)
Lösche die internen Daten der von Rust zugewiesenen QkPauliProductMeasurement.
Dadurch wird der Speicher der Arrays z``x und freigegeben. Diese Funktion sollte nur für QkPauliProductMeasurement Objekte aufgerufen werden, deren Daten von Rust bereitgestellt wurden.
Beispiel
// let `circuit` be a QkCircuit* and `index` a size_t at the position
// of a QkPauliProductMeasurement
QkPauliProductMeasurement inst;
// query the QkPauliProductMeasurement data
assert(qk_circuit_operation_kind(circuit, index) == QkOperationKind_PauliProductMeasurement);
qk_circuit_inst_pauli_product_measurement(circuit, index, &inst);
// do something with `inst`, and then clear the Rust-allocated data
qk_pauli_product_measurement_clear(&inst);Im Gegensatz dazu sollte diese Funktion nicht aufgerufen werden, wenn C bereits für das Löschen der Daten sorgt.
bool z[4] = {false, false, true, true};
bool x[4] = {false, true, true, false};
QkPauliProductMeasurement inst = {z, x, 4, true};
// since this data is allocated by C, we do not call `qk_pauli_product_measurement_clear(&inst)`Sicherheit
Das Verhalten ist nicht definiert, wenn kein gültiger, inst``QkPauliProductMeasurement nicht-null-Zeiger auf ein ist oder wenn die internen Daten von QkPauliProductMeasurement inkonsistent sind.
Parameter
- inst – Ein Zeiger auf das
QkPauliProductMeasurementzu löschende Element.
qk_circuit_library_quantum_volume
QkCircuit *qk_circuit_library_quantum_volume(uint32_t num_qubits, size_t depth, int64_t seed)
Erstellen Sie eine Schaltung für ein Quantum-Volume-Modell
Die Modellschaltungen sind zufällige Instanzen von Schaltungen, die zur Messung der in [Abschnitt 1] vorgestellten Metrik „Quantum Volume“ verwendet werden. Die Modellschaltungen bestehen aus Schichten von Haar-Zufallselementen von SU(4), die zwischen entsprechenden Quantenbit-Paaren in einer zufälligen Zweiteilung angewendet werden.
Diese Funktion ist multithreaded und startet standardmäßig einen Thread-Pool mit einer Anzahl von Threads, die der Anzahl der CPUs entspricht. Sie können die Anzahl der Threads mit der Umgebungsvariablen RAYON_NUM_THREADS anpassen. Beispielsweise würde die Einstellung „ RAYON_NUM_THREADS=4 “ den Thread-Pool auf 4 Threads beschränken.
[1] A. Cross et al. Validierung von Quantencomputern mithilfe randomisierter Modellschaltungen, Phys. Rev. A 100, 032328 (2019). arXiv:1811.12926
Beispiel
QkCircuit *qc = qk_circuit_library_quantum_volume(10, 10, -1)Parameter
- num_qubits – Die Anzahl der Qubits, die für den generierten Schaltkreis verwendet werden sollen.
- Tiefe – Die Anzahl der Schichten für die generierte Schaltung.
- Seed – Ein RNG-Seed, der zur Erzeugung der zufälligen SU(4)-Matrizen verwendet wird, die im Ausgangskreis zum Einsatz kommen. Wenn die angegebene Zahl negativ ist, wird der verwendete Startwert aus der Systementropie abgeleitet.
Rückgabe
Ein Zeiger auf den Quantenvolumen-Schaltkreis.
qk_circuit_library_suzuki_trotter
QkCircuit *qk_circuit_library_suzuki_trotter(const QkObs *op, uint32_t order, uint32_t reps, double time, bool preserve_order, bool insert_barriers)
Erstellen Sie anhand einer Observablen einen Schaltkreis unter Verwendung der Suzuki-Trotter-Produktformel höherer Ordnung.
Die Suzuki-Trotter-Formeln verbessern den Fehler der Lie-Trotter-Näherung. In dieser Implementierung werden die Operatoren als Summanden eines Pauli-Operators dargestellt. Dekomponierungen höherer Ordnung basieren auf Rekursionen, siehe Ref. [1] für weitere Informationen.
Beispiel
QkObs *obs = qk_obs_zero(1);
QkBitTerm op1_bits[1] = {QkBitTerm_X};
QkObsTerm term1 = {(QkComplex64){1.0, 0.0}, 1, op1_bits, (uint32_t[1]){0}, 1};
qk_obs_add_term(obs, &term1);
QkBitTerm op2_bits[1] = {QkBitTerm_Y};
QkObsTerm term2 = {(QkComplex64){1.0, 0.0}, 1, op2_bits, (uint32_t[1]){0}, 1};
qk_obs_add_term(obs, &term2);
QkCircuit *qc = qk_circuit_library_suzuki_trotter(obs, 2, 1, 0.1, true, false);
qk_obs_free(obs);
qk_circuit_free(qc);Sicherheit
„Verhalten ist undefiniert“ op ist kein gültiger, nicht-null-Zeiger auf ein QkObs.
Referenzen
[1] : D. Berry, G., Ahokas, R., Cleve und B. Sanders, „Effiziente Quantenalgorithmen zur Simulation spärlicher Hamilton-Operatoren“ (2006). arXiv:quant-ph/0508139
[2] : N. Hatano und M. Suzuki, „Ermittlung exponentieller Produktformeln höherer Ordnung“ (2005). arXiv:math-ph/0506007
Parameter
- op – Das
QkObsenthält die Summe der Pauli-Terme. - Reihenfolge – Die Reihenfolge der Produktformel.
- reps – Die Anzahl der Zeitschritte.
- Zeit – Die Entwicklungszeit.
- preserve_order – Wenn gesetzt
false, ermöglicht dies eine Neuanordnung der Operanden, wodurch möglicherweise eine flachere Evolutionsschaltung erzielt werden kann. Dies ist bei der Synthese einer Observablen mit einem einzigen Term nicht relevant. - insert_barriers – Gibt an, ob zwischen den Begriffen Trennzeichen eingefügt werden sollen.
Rückgabe
Ein Zeiger auf die generierte Schaltung.