Тензорная сеть Ренормгруппа

Я работаю над группой ренормализации сети Tensor. Пока я пытаюсь реализовать TRG на сотовой решетке, я застрял на соединении двух трехранговых тензоров и представляю их как матрицу D ^ 2 * D ^ 2. Можете ли вы помочь мне сделать это?

Мне нужно соединить два тензора третьего ранга. А я Дж м Б м к л . Затем мне нужно найти тензор C и D в виде С л я н Д Дж к н . Как мне это сделать?

Будет ли вычислительная наука лучшим местом для ответа на этот вопрос?
@Qmechanic Нет. (Они не знали бы, что делать с TRG.)

Ответы (1)

Реализация Математики. Определите функцию тензорной трассировки:

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

Трассировку тензора можно просто реализовать, указав список тензоров, и пары ветвей должны быть стянуты. Ноги индексируются в соответствии с порядками тензоров. Например, следующий код принимает тензоры с тремя ветвями А и Б и сжать ноги ( 3 , 4 ) чтобы сформировать четырехсторонний тензор Икс .

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

введите описание изображения здесь

Чтобы правильно использовать tTrфункцию, нужно понимать, как перевести нотацию Эйнштейна А я Дж м Б м к л на тензорно-сетевой язык. Правило довольно простое, просто прикрепите к каждому индексу в нотации Эйнштейна индекс ноги 1,2,3... слева направо. Например, можно переписать А я Дж м Б м к л как А ( я 1 ) ( Дж 2 ) ( м 3 ) Б ( м 4 ) ( к 5 ) ( л 6 ) , то мы знаем ( м 3 ) и ( м 4 ) ноги должны быть сокращены, поэтому нам нужно сказать tTrсоединить ноги ( 3 , 4 ) . После тензорного следа мы получаем четырехветвевой тензор Икс я Дж к л "=" А я Дж м Б м к л .

Затем, чтобы разделить тензор Икс я Дж к л "=" С л я н Д Дж к н , нам нужно сгруппировать ноги л я и Дж к первый. Чтобы помочь нам найти индексы ног, мы пишем Икс как Икс ( я 1 ) ( Дж 2 ) ( к 3 ) ( л 4 ) , то мы знаем, что ноги л я на самом деле ноги ( 4 , 1 ) и ноги Дж к на самом деле ноги ( 2 , 3 ) , поэтому мы можем сгруппировать ноги и выполнить СВД по

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

Итак, ноги л я будет идти к U и ноги Дж к будет идти к В сейчас. Нам нужно поглотить сингулярное значение в левую и правую унитарные матрицы, это можно сделать с помощью

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

Для тензора RG на этом шаге вы можете ограничить размер внутренних ветвей. Например, вы можете сделать

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

где г должен быть размером связи, который вы указали ранее. Но мы пока не будем делать это усечение. Наконец, мы меняем матрицы U и В в трехветвевые тензоры С и Д к

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

Итак, мы получили новые тензоры С и Д . Чтобы убедиться, что это правильный ответ, мы можем сжать тензоры С и Д . По переписыванию С ( л 1 ) ( я 2 ) ( н 3 ) Д ( Дж 4 ) ( к 5 ) ( н 6 ) , мы знаем, что на этот раз нам нужно сжать ноги ( 3 , 6 ) , поэтому мы говорим, чтоtTr

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

Теперь мы получили четырехсторонний тензор Д л я Дж к "=" С л я н Д Дж к н . Мы должны иметь Д л я Дж к "=" Икс я Дж к л . Но мы не можем напрямую попросить Mathematica проверить, если Y == X, потому что два тензора теперь имеют разный порядок ветвей. Чтобы переставить ноги, мы можем использовать обобщенное транспонирование. Но нам нужно сообщить системе Mathematica правила отображения ветвей. Чтобы найти правила отображения из Д к Икс , мы можем написать Д ( л 1 ) ( я 2 ) ( Дж 3 ) ( к 4 ) Икс ( я 1 ) ( Дж 2 ) ( к 3 ) ( л 4 ) , поэтому мы установили отображение для каждой ноги как л : ( л 1 ) ( л 4 ) , я : ( я 2 ) ( я 1 ) , Дж : ( Дж 3 ) ( Дж 2 ) , к : ( к 4 ) ( к 3 ) . Нам не нужно хранить имена я , Дж , к , л , мы можем просто записать отображение как ( 1 , 2 , 3 , 4 ) ( 4 , 1 , 2 , 3 ) . Нам даже не нужно сообщать Mathematica левую часть отображения, потому что по определению левая часть всегда должна быть упорядочена как 1,2,3..., поэтому нам нужно только сообщить Mathematica транспонировать тензор Д к ( 4 , 1 , 2 , 3 ) , затем сравните результат с тензором Икс .

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

Результат, Trueнесмотря на это А и Б генерируются случайным образом. Итак, мы знаем, что вся процедура работает.

В заключение, мы можем очень легко реализовать тензорные операции в Mathematica. Следующие четыре функции в основном покрывают все наши потребности:

  • tTr: выполнить тензорную трассировку (тензорное сжатие сети),
  • Transpose: переставить тензорные ноги,
  • Flatten: сгруппировать напрягающие ноги,
  • ArrayReshape: разделить ножки тензора (на самом деле это можно использовать для изменения формы тензора до любой формы, которую вы хотите).

Вы можете создать тензорный пакет RG поверх этих четырех функций с помощью решателя SVD, предоставляемого SingularValueDecomposition.

Мне нужно соединить два тензора третьего ранга. Т_ijm Т_мкл. Затем мне нужно найти тензор S в виде S_lin S_jkn. Как мне это сделать?
@ user142797 Я обновил ответ пошаговым примером. Надеюсь, поможет.