Tensornetzwerk-Renormalisierungsgruppe

Ich arbeite an der Gruppe Tensor Network Renormalization. Während ich versuche, TRG auf dem Wabengitter zu implementieren, blieb ich beim Paaren von zwei Drei-Rang-Tensoren hängen und stelle es als D ^ 2 * D ^ 2-Matrix dar. Können Sie mir dabei helfen?

Ich muss zwei Tensoren vom Rang drei paaren. A ich J M B M k l . Dann muss ich einen Tensor C und D in der Form finden C l ich N D J k N . Wie kann ich es tun?

Wäre Computational Science ein besseres Zuhause für diese Frage?
@Qmechanic Nein. (Sie wüssten nicht, was sie mit TRG anfangen sollen.)

Antworten (1)

Mathematica-Implementierung. Definieren Sie die Tensor-Trace-Funktion:

tTr[Ts_,s_]:=Activate@TensorContract[Inactive[TensorProduct]@@Ts,s];

Die Tensorspur kann einfach implementiert werden, indem die Liste der Tensoren angegeben wird und die Beinpaare kontrahiert werden sollen. Die Beine werden nach den Befehlen der Tensoren indiziert. Der folgende Code verwendet beispielsweise die 3-Bein-Tensoren A Und B und kontrahiere die Beine ( 3 , 4 ) um den 4-Bein-Tensor zu bilden X .

A = RandomReal[1, {2, 2, 2}];
B = RandomReal[1, {2, 2, 2}];
X = tTr[{A, B}, {{3, 4}}];

Geben Sie hier die Bildbeschreibung ein

Um die tTrFunktion korrekt zu verwenden, muss man verstehen, wie die Einstein-Notation übersetzt wird A ich J M B M k l zur Tensor-Netzwerk-Sprache. Die Regel ist ganz einfach, hängen Sie einfach an jeden Index in der Einstein-Notation durch den Beinindex 1,2,3 ... von links nach rechts. Zum Beispiel kann man umschreiben A ich J M B M k l als A ( ich 1 ) ( J 2 ) ( M 3 ) B ( M 4 ) ( k 5 ) ( l 6 ) , dann wissen wir es ( M 3 ) Und ( M 4 ) sind Beine, die zusammengezogen werden müssen, also müssen wir sagen, tTrdass wir die Beine paaren sollen ( 3 , 4 ) . Nach der Tensorspur erhalten wir einen 4-Bein-Tensor X ich J k l = A ich J M B M k l .

Dann den Tensor spalten X ich J k l = C l ich N D J k N , müssen wir die Beine gruppieren l ich Und J k Erste. Um uns zu helfen, die Leg-Indizes zu finden, schreiben wir X als X ( ich 1 ) ( J 2 ) ( k 3 ) ( l 4 ) , dann wissen wir, dass die Beine l ich sind eigentlich Beine ( 4 , 1 ) und die Beine J k sind eigentlich Beine ( 2 , 3 ) , damit wir die Beine gruppieren und die SVD by durchführen können

{U, S, V} = SingularValueDecomposition@Flatten[X, {{4, 1}, {2, 3}}];

Also Beine l ich werde gehen U und die Beine J k werde gehen v Jetzt. Wir müssen den Singularwert in die linken und rechten Einheitsmatrizen aufnehmen, dies kann durch erfolgen

V = V.Sqrt[S];
U = U.Sqrt[S];

Für den Tensor RG möchten Sie in diesem Schritt möglicherweise die Dimension der inneren Beine einschränken. Zum Beispiel können Sie das tun

V = V[[;; d]];
U = U[[;; d]];

Wo D sollte die Bindungsdimension sein, die Sie zuvor angegeben haben. Aber wir werden diese Kürzung vorerst nicht durchführen. Schließlich formen wir die Matrizen um U Und v in 3-Bein-Tensoren C Und D von

C = ArrayReshape[U, {2, 2, 4}];
D = ArrayReshape[V, {2, 2, 4}];

Damit haben wir die neuen Tensoren erhalten C Und D . Um zu überprüfen, ob dies die richtige Antwort ist, können wir die Tensoren zusammenziehen C Und D . Durch das Umschreiben C ( l 1 ) ( ich 2 ) ( N 3 ) D ( J 4 ) ( k 5 ) ( N 6 ) , wir wissen, dass wir dieses Mal die Beine anspannen müssen ( 3 , 6 ) , also sagen wir das zutTr

Y = tTr[{C, D}, {{3, 6}}];

Jetzt haben wir einen 4-Bein-Tensor erhalten Y l ich J k = C l ich N D J k N . Wir hätten sollen Y l ich J k = X ich J k l . Aber wir können Mathematica nicht direkt bitten, zu prüfen, ob Y == X, weil die beiden Tensoren jetzt unterschiedliche Beinordnungen haben. Um die Beine neu anzuordnen, können wir die verallgemeinerte Transponierung verwenden. Aber wir müssen Mathematica die Leg-Mapping-Regeln mitteilen. So finden Sie die Mapping-Regeln aus Y Zu X , wir können schreiben Y ( l 1 ) ( ich 2 ) ( J 3 ) ( k 4 ) X ( ich 1 ) ( J 2 ) ( k 3 ) ( l 4 ) , also haben wir die Zuordnung für jedes Bein als festgelegt l : ( l 1 ) ( l 4 ) , ich : ( ich 2 ) ( ich 1 ) , J : ( J 3 ) ( J 2 ) , k : ( k 4 ) ( k 3 ) . Wir müssen die Namen nicht behalten ich , J , k , l , können wir die Zuordnung einfach schreiben als ( 1 , 2 , 3 , 4 ) ( 4 , 1 , 2 , 3 ) . Wir müssen Mathematica nicht einmal die linke Seite der Abbildung mitteilen, da die linke Seite per Definition immer wie 1,2,3... geordnet sein muss , also müssen wir Mathematica nur mitteilen den Tensor zu transponieren Y von ( 4 , 1 , 2 , 3 ) , dann vergleiche das Ergebnis mit dem Tensor X .

Transpose[Y, {4, 1, 2, 3}] == X

Das Ergebnis ist Truetrotzdem A Und B werden zufällig generiert. Wir wissen also, dass das ganze Verfahren funktioniert.

Zusammenfassend lässt sich sagen, dass wir Tensoroperationen in Mathematica sehr einfach realisieren können. Die folgenden vier Funktionen decken im Grunde alle unsere Bedürfnisse ab:

  • tTr: Tensor-Trace durchführen (Tensor-Netzwerkkontraktion),
  • Transpose: Tensorbeine neu anordnen,
  • Flatten: Spannbeine gruppieren,
  • ArrayReshape: Trennen Sie die Tensorbeine (tatsächlich kann es verwendet werden, um den Tensor in jede gewünschte Form umzuformen).

Mit dem von bereitgestellten SVD-Solver können Sie auf diesen vier Funktionen ein Tensor-RG-Paket aufbauen SingularValueDecomposition.

Ich muss zwei Tensoren vom Rang drei paaren. T_ijm T_mkl. Dann muss ich einen Tensor S in der Form S_lin S_jkn finden. Wie kann ich es tun?
@ user142797 Ich habe die Antwort mit einem Schritt-für-Schritt-Beispiel aktualisiert. Ich hoffe es hilft.