Gruppierungsfunktionen
Siehe „Begriffe zu Gruppenoperatoren“: Eine ausführliche Erläuterung der Funktionen dieses Moduls finden Sie in der Operatorstruktur.
Zuweisung
Anstatt sich stets darauf zu verlassen, dass der Benutzer die Gruppenindizes selbst angibt, bietet die C-API eine Reihe von Funktionen, die die Gruppierungsinformationen automatisch ermitteln.
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
qf_ferm_op_group_terms_by_electronic_structure() | Gruppiert die Terme eines Operators nach ihrer elektronischen Struktur. |
Analyse
Gruppenindizes haben keine eigentliche Bedeutung: Sie geben lediglich an, welche Begriffe zusammengehören, niemals aber, warum. Dementsprechend gibt keine der unten aufgeführten Funktionen an, ob eine Gruppierung „korrekt“ ist, und es gibt keinen einheitlichen Maßstab für Korrektheit, anhand dessen eine Bewertung erfolgen könnte. Jede Antwort bezieht sich auf eine konkret formulierte, eng gefasste Frage zu einer bestehenden Gruppierung, wobei die Interpretation Ihnen überlassen bleibt. Sie werden bereitgestellt, damit eine Annahme, die ein nachgelagerter Verbraucher hinsichtlich einer Gruppierung trifft, im Voraus überprüft werden kann, anstatt bei jedem Aufruf dafür bezahlen zu müssen.
Da diese Funktionen mit generischen Operator-Darstellungen arbeiten (ein Konzept, das es in C nicht gibt), werden sie in den folgenden drei Abschnitten allgemein erläutert. Die tatsächlichen Funktionen, die in der C-API für die verschiedenen Operator-Darstellungen enthalten sind, sind am Ende dieser Seite aufgeführt.
Bei jedem einzelnen davon muss der Bediener die Gruppenindizes im Auge behalten. Überprüfen Sie dies zunächst qf_op_type_has_groups ; der Aufruf bei einem Operator ohne Gruppen führt zum Abbruch.
Gruppenkoeffizient bedeutet
qf_op_type_group_coeff_means
void qf_op_type_group_coeff_means(const OpType *op, double *means_out)
Die Funktionssignatur ist hier generisch! Ein echter Operator ersetzt OpType durch eine tatsächliche Operator-Darstellung und op_type durch das dazugehörige Präfix (zum Beispiel ferm_op für QfFermionOperator).
Der i-te Eintrag ist die Summe von über abs(coeff) die Glieder der Gruppe i, geteilt durch die Anzahl der Glieder in dieser Gruppe. Dies ist das Stichprobengewicht einer randomisierten Produktformel (zum Beispiel qDRIFT ), bei der ganze Gruppen statt einzelner Terme gezogen werden: Es handelt sich um die Größe einer atomaren Gruppe, was die relevante Größenordnung ist, da erst durch die Gruppierung jedes Stichprobenelement hermitisch und damit seine Zeitentwicklung unitär wird.
Die Berechnung erfolgt in einem einzigen Durchlauf über den Operator und nicht durch Reduktion von und qf_op_type_get_coeffs ( qf_op_type_get_groups jeweils ein Wert pro nicht gruppiertem Term) auf der Seite des Aufrufers.
Ein Gruppenindex, den kein Begriff aufweist 0.0, erhält den Wert, wodurch er aus der Stichprobe ausgeschlossen wird.
Parameter
- op – Ein Zeiger auf den Operator, dessen Gruppen reduziert werden sollen.
- means_out – Ein Zeiger auf das Double-Array, in das die Mittelwerte geschrieben werden sollen. Die Größe muss auf
qf_op_type_num_groups. angepasst werden.
Gruppenhermitizität
qf_op_type_groups_are_hermitian
void qf_op_type_groups_are_hermitian(const OpType *op, double atol, bool *hermitian_out)
Die Funktionssignatur ist hier generisch! Beachten Sie den vorstehenden Hinweis.
Gruppen schreiben keine eigene Bedeutung vor; dies bestätigt eine gängige Konvention, nämlich dass jede Gruppe für sich genommen hermitesch ist. Das ist die Eigenschaft, auf die sich eine randomisierte Produktformel stützt, wenn sie Stichproben aus ganzen Gruppen zieht, da nur eine hermitische Gruppe eine unitäre Zeitentwicklung aufweist. Eine leere Gruppe gilt als hermitisch, da der Nulloperator hermitisch ist.
Dies folgt aus der einseitigen Garantie von qf_op_type_is_hermitian: Ein Eintrag true vom Typ ist immer zuverlässig, während ein false Eintrag vom Typ nur für Operatortypen zuverlässig ist, deren Normalform eine echte kanonische Form ist. Bei den anderen ist die Überprüfung konservativ und kann zu einem Ergebnis führen, das eine Gruppe false betrifft, die tatsächlich hermitisch ist. Informieren Sie sich in der jeweiligen Betreiberdarstellung, welche Regelung gilt.
Dies impliziert weder … noch lässt sich daraus ableiten, dass qf_op_type_groups_have_uniform_coeffs… Einheitliche Koeffizienten machen eine Gruppe noch nicht hermitisch, und eine hermitische Gruppe kann unterschiedliche Größenordnungen enthalten.
Parameter
- op – Ein Zeiger auf den Operator, dessen Gruppen überprüft werden sollen.
- Atol – Die absolute Toleranz, bis zu der Koeffizienten als gleich angesehen werden.
- hermitian_out – Ein Zeiger auf das Array von Booleschen Werten, in das pro Gruppe ein Flag geschrieben werden soll. Die Größe muss auf
qf_op_type_num_groups. angepasst werden.
Gleichmäßigkeit der Gruppenkoeffizienten
qf_op_type_groups_have_uniform_coeffs
void qf_op_type_groups_have_uniform_coeffs(const OpType *op, double atol, bool abs, bool *uniform_out)
Die Funktionssignatur ist hier generisch! Beachten Sie den vorstehenden Hinweis.
Mit werden die Koeffizientengrößen verglichen abs, was der Annahme entspricht, die qf_op_type_group_coeff_means trifft, wenn es den Mittelwert von bildet abs(coeff). Ohne diese müssen die Koeffizienten exakt übereinstimmen. Beachten Sie, dass eine hermitische Gruppe die strengere Form durchaus nicht erfüllen kann, da ein konjugiertes Paar mit komplexen Koeffizienten zwar gleiche Absolutwerte, aber ungleiche Koeffizienten aufweist. Eine leere oder aus einem einzigen Element bestehende Gruppe ist trivialerweise einheitlich.
Dies ist keine abgeschwächte Form von qf_op_type_groups_are_hermitian: Das eine impliziert das andere nicht. Einheitliche Koeffizienten machen eine Gruppe noch nicht hermitisch, und eine hermitische Gruppe kann unterschiedliche Größenordnungen enthalten.
Parameter
- op – Ein Zeiger auf den Operator, dessen Gruppen überprüft werden sollen.
- Atol – Die absolute Toleranz, bis zu der Koeffizienten als gleich angesehen werden.
- abs – Gibt an, ob die Größen der Koeffizienten anstelle der Koeffizienten selbst verglichen werden sollen.
- uniform_out – Ein Zeiger auf das Array von Booleschen Werten, in das pro Gruppe ein Flag geschrieben werden soll. Die Größe muss auf
qf_op_type_num_groups. angepasst werden.
Beispiel
1QfFermionOperator *op = qf_ferm_op_zero();
2bool actions[2] = {true, false};
3QkComplex64 coeff = {1.0, 0.0};
4uint32_t modes_a[2] = {0, 1};
5qf_ferm_op_add_term(op, 2, actions, modes_a, &coeff);
6uint32_t modes_b[2] = {1, 0};
7qf_ferm_op_add_term(op, 2, actions, modes_b, &coeff);
8
9uint32_t groups_in[2] = {0, 0};
10assert(qf_ferm_op_set_groups(op, groups_in, 2) == QfExitCode_Success);
11
12double means[1];
13qf_ferm_op_group_coeff_means(op, means);
14assert(means[0] == 1.0);
15
16bool hermitian[1];
17qf_ferm_op_groups_are_hermitian(op, 1e-8, hermitian);
18assert(hermitian[0]);
19
20bool uniform[1];
21qf_ferm_op_groups_have_uniform_coeffs(op, 1e-8, true, uniform);
22assert(uniform[0]);Funktionen
qf_ferm_op_group_terms_by_electronic_structure
QfExitCode qf_ferm_op_group_terms_by_electronic_structure(QfFermionOperator *op, uint32_t num_modes, bool two_body_physicist_order)
Gruppiert die Terme eines Operators nach ihrer elektronischen Struktur.
Diese Funktion füllt das Attribut groups (siehe auch qf_ferm_op_get_groups()) des angegebenen automatisch QfFermionOperator so aus, dass Terme, die eine in Elektronenstruktur-Hamiltonianen vorhandene symmetrische Störung erfüllen, gruppiert werden.
Der angegebene Operator muss normal geordnet sein! Dies ist eine Grundannahme der Implementierung, die nicht überprüft wird! Siehe qf_ferm_op_normal_ordered() für eine Anleitung, wie man einen Operator dieser Form erhält.
Konkret bedeutet dies: Bei einem Hamilton-Operator der elektronischen Struktur der Form
Diese Funktion gruppiert sowohl die 1-Körper-Terme mit Permutationssymmetrie von (i, j) als auch die 2-Körper-Terme mit Permutationssymmetrie von (i, j, k, l). Bei den 2-Körper-Termen werden nicht alle Permutationen gruppiert. Stattdessen legt two_body_physicist_order die fest, wie die vier Indizes zu Zweierpaaren gruppiert werden, innerhalb derer Permutationssymmetrien bestehen:
two_body_physicist_order=False(Standard):(i, l)und(j, k)two_body_physicist_order=True: und(i, k)(j, l)
1QfFCIDump *fcidump = NULL;
2qf_fcidump_from_file("molecule.fcidump", &fcidump);
3QfFermionOperator *op = qf_ferm_op_from_fcidump(fcidump);
4
5uint32_t num_modes = 2 * qf_fcidump_norb(fcidump);
6
7QfFermionOperator *normal = qf_ferm_op_normal_ordered(op, NULL);
8
9QfExitCode exit = qf_ferm_op_group_terms_by_electronic_structure(normal, num_modes, false);Parameter
- op – Ein Zeiger auf den normalgeordneten Fermionenoperator, dessen Terme gruppiert werden sollen.
- num_modes – Die Anzahl der fermionischen Moden im Operator.
- two_body_physicist_order – Gibt an, ob die 2-Körper-Terme in der Reihenfolge der Physiker gespeichert werden.
Rückgabe
Ein Exit-Code.
QfExitCode_Successim ErfolgsfallQfExitCode_ValueErrorwenn bei der Gruppierung ein ungültiger Begriff auftritt.
qf_ferm_op_group_coeff_means
void qf_ferm_op_group_coeff_means(const QfFermionOperator *op, double *means_out)
qf_ferm_op_groups_are_hermitian
void qf_ferm_op_groups_are_hermitian(const QfFermionOperator *op, double atol, bool *hermitian_out)
qf_ferm_op_groups_have_uniform_coeffs
void qf_ferm_op_groups_have_uniform_coeffs(const QfFermionOperator *op, double atol, bool abs, bool *uniform_out)
qf_maj_op_group_coeff_means
void qf_maj_op_group_coeff_means(const QfMajoranaOperator *op, double *means_out)
qf_maj_op_groups_are_hermitian
void qf_maj_op_groups_are_hermitian(const QfMajoranaOperator *op, double atol, bool *hermitian_out)
qf_maj_op_groups_have_uniform_coeffs
void qf_maj_op_groups_have_uniform_coeffs(const QfMajoranaOperator *op, double atol, bool abs, bool *uniform_out)
qf_edge_op_group_coeff_means
void qf_edge_op_group_coeff_means(const QfEdgeVertexOperator *op, double *means_out)
qf_edge_op_groups_are_hermitian
void qf_edge_op_groups_are_hermitian(const QfEdgeVertexOperator *op, double atol, bool *hermitian_out)
qf_edge_op_groups_have_uniform_coeffs
void qf_edge_op_groups_have_uniform_coeffs(const QfEdgeVertexOperator *op, double atol, bool abs, bool *uniform_out)
qf_transfer_op_group_coeff_means
void qf_transfer_op_group_coeff_means(const QfTransferVertexOperator *op, double *means_out)
qf_transfer_op_groups_are_hermitian
void qf_transfer_op_groups_are_hermitian(const QfTransferVertexOperator *op, double atol, bool *hermitian_out)
qf_transfer_op_groups_have_uniform_coeffs
void qf_transfer_op_groups_have_uniform_coeffs(const QfTransferVertexOperator *op, double atol, bool abs, bool *uniform_out)