Using FiniteFlow for tensor reduction
Closed this issue · 1 comments
Hi,
I have to admit that I never used TensorFlow before, so currently my main interested is directed towards employing it as a solver
for linear equations.
For the time being I'd be content to understand how to use FFDenseSolve
efficiently when solving symbolic linear systems
occurring in loop integral tensor reductions.
For example, in the case of a rank-5 2-loop tensor integral with 2 external momenta I'm getting a 24x24 linear system attached.
My current approach is to solve it using Fermat, which works very fast despite of running the latter as a script and then parsing the output to Mathematica:
$LoadAddOns = {"FeynHelpers"};
<< FeynCalc`
mySystem = Get["/home/vs/Downloads/mySystem.m"];
AbsoluteTiming[sol1 = FerSolve[mySystem[[1]], mySystem[[2]]];]
(* {0.57533,Null} *)
When I try to do the same using FFDenseSolve
AbsoluteTiming[sol2 = FFDenseSolve[mySystem[[1]], mySystem[[2]]];]
(*{10.0941,Null}*)
the performance seems to be much worse.
Both results agree
Together[(Last /@ sol1) - (Last /@ sol2)]
(*{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}*)
but I'm wondering whether there is something I'm doing wrong here, as naively I would expect finite field methods to outperform symbolic algorithms?
Trying FFSparseSolve
instead of specifying the variables via "Variables"
doesn't introduce any substantial changes.
Cheers,
Vladyslav
Hi,
whether or not finite field methods outperform symbolic methods is highly problem dependent and is not guaranteed. Since your system is small, it might be that intermediate symbolic expression never get too large and therefore symbolic tools perform very well.
Moreover, you can improve the FiniteFlow reconstruction time by roughly an order of magnitude by removing the dependence on redundant variables, e.g. by exploiting dimensional analysis.
Having had a quick look at your specific example, it seems to me that your functions are homogeneous in the variables X2,...,X10
, probably because they are the dimensional variables in your problem. In such cases it is advisable to set one of these variables to 1 and then recover its dependence via dimensional analysys. This should roughly speed up things by an order of magnitude.
Alternatively, you can achieve a similar improvement by rescaling variables such that all but one are dimensionless. For instance, replacing Xi -> Yi = Xi/X10
for i=2,...,9
:
todimless = {X2->X10 Y2,X3->X10 Y3,X4->X10 Y4,X5->X10 Y5,X6->X10 Y6,X7->X10 Y7,X8->X10 Y8,X9->X10 Y9};
sol2=FFDenseSolve[mySystem[[1]]/.todimless, mySystem[[2]];
improves things substantially (it happens because the dependence on the only dimensional variable becomes a monomial prefactor that FiniteFlow
can figure out early during the reconstruction). Then you can easily go back to the original variables, e.g. with
fromdimless = {Y2->X2/X10,Y3->X3/X10,Y4->X4/X10,Y5->X5/X10,Y6->X6/X10,Y7->X7/X10,Y8->X8/X10,Y9->X9/X10};
sol2 = sol2/.fromdimless;
I hope this is helpful.
If you have further enquiries about the usage of FiniteFlow, you can contact me via email.
Cheers,
Tiziano