2c16e1c4

By: Lucien Huber <im@lcnbr.ch>

move generation and tensor reduction into feynkit

Finish the FeynKit ownership consolidation, add exact symmetry-aware tensor
reduction through rank 20, expose the native PyO3 API, preserve named UFO
couplings until explicit expansion, and keep GammaLoop integration confined to
extension traits and finalized runtime conversion.

User requests:

The entire generation should live in feynkit. There can still be a final Feynkit graph to gammaloop graph if necessary , but I don't see why there should be two different models, Similarly for the cff. It is even okay if not all the rust side api that is necessary for gammaloop is exposed to python. IN general we want to drastically reduce code dedup and the necessity for adapters.. We own all the crates here, so it does not make sense to dedup so much

implement the plan. To add methods from gammaloop using feynkit types, use an extension trait, don't wrap the type

Tensor reduction is an important part of a QFT calculation. For the R operation, a tensor reduction is needed to make a tensor vacuum graph into a sum of scalar graphs. Write a tensor reducer as part of Feynkit. As input and output format it should support standards set by the rest of the ecosystem (likely spenso formatting of tensors). A goal is that it should easily reduce up to rank 12 and preferably up to rank 20. You can see the `vakint` source code for a Form implementation of tensor reduction. It uses some symmetries for the solving and it can exploit internal symmetries (projecting k^mu*k^nu means that mu and nu are internally exchangeable, and similarly if it is known that the projection will hit an external p^mu p^nu, that symmetry can be used as well). Apparently, there is a method by Collins (?) used in lattice QCD that speeds up solving the system, even having a closed form. Investigate that first. Make a plan and then implement it.

Continue but I paused the goal as I want you to do a final polishing round, identifying the main important issues left and finishing what you were doing and then do one last clean commit+push and pause/stop there.
GitHub
Time to Start Worker time Duration Time to finish Idle
Config 2s 9s 9s 11s 2s
Eval 8s 58s 58s 1m06s 0s
Build 58s 5h43m25s - - 5m30s
Test 7m34s 18m32s - - 0s
Deploy - - - - 12h43m16s
Suite 2s 6h03m06s - - 12h48m49s

Timeline

Config Eval Build Test Failed Retried Compressed gap
0s1m2m3m4m5m6m7m8m9m10m11m12m13m14m15m16m17m18m19m20m21m22m23m24m25m26m27m28m29m30m31m32m33m34m35m36m37m38m39m40m41m42m43m44m45m46m47m48m49m50m51m52m53m54m55m56m57m58m59m1h0m1h1m1h2m1h3m1h4m1h6m1h7m1h8m1h9m1h10m1h11m1h12m1h13m1h14m1h15m1h16m1h17m1h18m1h19m1h20m1h21m1h22m1h23m1h24m1h25m1h26m1h27m