Grupo de renormalización de la red de tensores

Estoy trabajando en el grupo de Renormalización de la red Tensor. Mientras trato de implementar TRG en la red Honeycomb, me quedé atascado emparejando dos tensores de tres rangos y representándolo como matriz D ^ 2 * D ^ 2. ¿Puedes ayudarme a hacer este?

Necesito emparejar dos tensores de rango tres. A i j metro B metro k yo . Entonces necesito encontrar un tensor C y D en la forma C yo i norte D j k norte . ¿Cómo puedo hacerlo?

¿Sería la ciencia computacional un mejor hogar para esta pregunta?
@Qmechanic No. (No sabrían qué hacer con TRG).

Respuestas (1)

Implementación de Mathematica. Defina la función de traza del tensor:

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

La traza del tensor se puede implementar simplemente especificando la lista de tensores y los pares de patas deben contraerse. Las patas se indexan siguiendo las órdenes de los tensores. Por ejemplo, el siguiente código toma los tensores de 3 patas A y B y contraer las piernas ( 3 , 4 ) para formar el tensor de 4 patas X .

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

ingrese la descripción de la imagen aquí

Para usar la tTrfunción correctamente, uno necesita entender cómo traducir la notación de Einstein A i j metro B metro k yo al lenguaje de red de tensores. La regla es bastante simple, simplemente adjunte a cada índice en la notación de Einstein por el índice de la pierna 1,2,3... de izquierda a derecha. Por ejemplo, uno puede reescribir A i j metro B metro k yo como A ( i 1 ) ( j 2 ) ( metro 3 ) B ( metro 4 ) ( k 5 ) ( yo 6 ) , entonces sabemos ( metro 3 ) y ( metro 4 ) son piernas que se van a contraer, así que tenemos que decirles tTrque emparejen las piernas ( 3 , 4 ) . Después de la traza del tensor, obtenemos un tensor de 4 patas X i j k yo = A i j metro B metro k yo .

Entonces para dividir el tensor X i j k yo = C yo i norte D j k norte , tenemos que agrupar las piernas yo i y j k primero. Para ayudarnos a encontrar los índices de las piernas, escribimos X como X ( i 1 ) ( j 2 ) ( k 3 ) ( yo 4 ) , entonces sabemos que las piernas yo i en realidad son piernas ( 4 , 1 ) y las piernas j k en realidad son piernas ( 2 , 3 ) , por lo que podemos agrupar las piernas y realizar el SVD por

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

Entonces piernas yo i ir a tu y las piernas j k ir a V ahora. Necesitamos absorber el valor singular en las matrices unitarias izquierda y derecha, esto se puede hacer mediante

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

Para el tensor RG, es posible que desee restringir la dimensión de las patas internas en este paso. Por ejemplo, puede hacer

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

dónde d debe ser la dimensión de enlace que especificó anteriormente. Pero no haremos este truncamiento por ahora. Finalmente, remodelamos las matrices. tu y V en tensores de 3 patas C y D por

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

Así hemos obtenido los nuevos tensores C y D . Para verificar que esta es la respuesta correcta, podemos contraer los tensores C y D . Por la reescritura C ( yo 1 ) ( i 2 ) ( norte 3 ) D ( j 4 ) ( k 5 ) ( norte 6 ) , sabemos que esta vez necesitamos contraer las piernas ( 3 , 6 ) , así que le decimos eso atTr

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

Ahora hemos obtenido un tensor de 4 patas Y yo i j k = C yo i norte D j k norte . Nosotros deberíamos tener Y yo i j k = X i j k yo . Pero no podemos pedirle directamente a Mathematica que verifique si Y == X, porque los dos tensores ahora tienen diferentes ordenaciones de piernas. Para reorganizar las piernas, podemos usar la transposición generalizada. Pero necesitamos decirle a Mathematica las reglas de mapeo de piernas. Para encontrar las reglas de mapeo de Y a X , podemos escribir Y ( yo 1 ) ( i 2 ) ( j 3 ) ( k 4 ) X ( i 1 ) ( j 2 ) ( k 3 ) ( yo 4 ) , por lo que hemos establecido el mapeo para cada pierna como yo : ( yo 1 ) ( yo 4 ) , i : ( i 2 ) ( i 1 ) , j : ( j 3 ) ( j 2 ) , k : ( k 4 ) ( k 3 ) . No necesitamos mantener los nombres. i , j , k , yo , podemos simplemente escribir el mapeo como ( 1 , 2 , 3 , 4 ) ( 4 , 1 , 2 , 3 ) . Ni siquiera necesitamos decirle a Mathematica el lado izquierdo del mapeo, porque por definición, el lado izquierdo siempre debe estar ordenado como 1,2,3..., entonces solo necesitamos decirle a Mathematica transponer el tensor Y por ( 4 , 1 , 2 , 3 ) , luego compare el resultado con el tensor X .

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

El resultado es Truea pesar de eso A y B se generan aleatoriamente. Entonces sabemos que todo el procedimiento funciona.

En conclusión, podemos realizar operaciones tensoriales en Mathematica muy fácilmente. Las siguientes cuatro funciones cubren básicamente todas nuestras necesidades:

  • tTr: realizar seguimiento de tensor (contracción de red de tensor),
  • Transpose: reorganizar las patas del tensor,
  • Flatten: agrupar patas tensoras,
  • ArrayReshape: dividir las patas del tensor (en realidad, se puede usar para remodelar el tensor en cualquier forma que desee).

Puede crear un paquete RG de tensor sobre estas cuatro funciones con el solucionador SVD proporcionado por SingularValueDecomposition.

Necesito emparejar dos tensores de rango tres. T_ijm T_mkl. Entonces necesito encontrar un tensor S en la forma S_lin S_jkn. ¿Cómo puedo hacerlo?
@ user142797 Actualicé la respuesta con un ejemplo paso a paso. Espero eso ayude.