WilsonWebs - An automated tool for n-Loop Wilson web generation

git clone git://git.bcharge.de/WilsonWebs.git

About | Log | Files | Refs | License

commit a97a6f3ef90bc23dda77ad60991fe53ecd24b2e9
parent 96d13de1d7752eae671890fb650604dcfd827a14
Author: Bakar Chargeishvili <bakar@bcharge.de>
Date:   Wed, 27 Apr 2022 17:59:01 +0200

Major refactoring

Diffstat:
Mwebs.c | 206+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
1 file changed, 123 insertions(+), 83 deletions(-)

diff --git a/webs.c b/webs.c @@ -5,17 +5,19 @@ #include "util.h" typedef struct { + unsigned int legId; + unsigned int id; +} Vertex; + +typedef struct { char *name; int init; unsigned int id; int isMassive; int isGluon; + Vertex *Vertices; } Leg; -typedef struct { - unsigned int legId; - unsigned int id; -} Vertex; typedef struct { Vertex emitter; @@ -23,20 +25,24 @@ typedef struct { } Link; void -generate_legs(char **init, size_t n_init, char **fin, size_t n_fin, Leg *Legs) +generate_legs(char **init, size_t n_init, char **fin, size_t n_fin, size_t nLoops, Leg *Legs) { for (int i=0; i<n_init; ++i) { int isGluon = 0; if (!strcmp("g", init[i])) isGluon = 1; - Legs[i] = (Leg){init[i], 1, i, 0, isGluon}; + Vertex *Vertices = (Vertex*)ecalloc(nLoops+1, sizeof(Vertex)); + Vertices[0] = (Vertex){i,0}; + Legs[i] = (Leg){init[i], 1, i, 0, isGluon, Vertices}; } for (int i=0; i<n_fin; ++i) { int isGluon = 0; if (!strcmp("g", fin[i])) isGluon = 1; - Legs[n_init+i] = (Leg){init[i], 1, n_init+i, 0, isGluon}; + Vertex *Vertices = (Vertex *)ecalloc(nLoops+1, sizeof(Vertex)); + Vertices[0] = (Vertex){n_init+i,0}; + Legs[n_init+i] = (Leg){init[i], 1, n_init+i, 0, isGluon,Vertices}; } } @@ -46,7 +52,8 @@ generate_vertices(Leg *Legs, size_t nLegs, int nLoops, Vertex *Vertices) for (int i=0; i<nLegs; ++i) { for (int j=0; j<nLoops; ++j) { /* TODO: Don't forget to add vertices for self-energies later */ - Vertices[j+nLoops*i] = (Vertex){i, j+nLoops*i}; + Vertices[j+nLoops*i] = (Vertex){i+1, 1+j}; + Legs[i].Vertices[j+1] = Vertices[j+nLoops*i]; } } @@ -60,77 +67,89 @@ generate_vertices(Leg *Legs, size_t nLegs, int nLoops, Vertex *Vertices) void generate_loops(Vertex *Vertices, int *deletedVertices, Link *Graphs, size_t nVx, int nLoops, int nGenLoops) { - /* Find the first non-deleted vertex */ - int mVx = -1; - for (int iVx=0; iVx<nVx; ++iVx) { - if (!deletedVertices[iVx]) { - mVx = iVx; - break; - } - } - printf("mVx %d\n", mVx); - - Vertex *AllPossConns = (Vertex *)ecalloc(nVx, sizeof(Vertex)); - size_t nConns = 0; - for (int iVx=mVx; iVx<nVx; ++iVx) { - if (!deletedVertices[iVx] && Vertices[iVx].legId != Vertices[mVx].legId) { - AllPossConns[nConns++] = Vertices[iVx]; - } - } - - if (nConns == 0 || mVx == -1) { - free(deletedVertices); - printf("End rec"); - return; - } - - /* We build the connections here */ - static int iGraph = 0; - for (int iVx = 0; iVx < nConns; ++iVx) { - if (!nGenLoops) - printf("yess"); - Graphs[iGraph*nLoops+nGenLoops] = (Link){Vertices[mVx], AllPossConns[iVx]}; - printf("V%d%d - V%d%d\n", Vertices[mVx].legId, Vertices[mVx].id, AllPossConns[iVx].legId, AllPossConns[iVx].id); - /* Gluon connection introduces new vertices. - * Gluon legId = (emitter legId + 100) - */ - - /* - for (int i = 0; i < nLoops-nGenLoops; ++i) { - AllPossConns[i] = (Vertex){Vertices[mVx].legId+100,i} - } - */ - - deletedVertices[mVx] = 1; - deletedVertices[AllPossConns[iVx].id] = 1; - nGenLoops++; - if(nGenLoops < nLoops) { - int *deletedCopy = (int *)ecalloc(nVx, sizeof(int)); - deletedCopy[mVx] = 1; - deletedCopy[AllPossConns[iVx].id] = 1; - generate_loops(Vertices, deletedCopy, Graphs, nVx, nLoops, nGenLoops); + for (int iVx = 0; iVx < nVx; ++iVx) { + Link *Graph = (Link *)ecalloc(nLoops, sizeof(Link)); + int iEdge = -1; + for (int jVx = 0; jVx < nVx; ++jVx) { + if (iVx == jVx) { + continue; + } + /* Add a connection */ + Graph[++iEdge] = (Link){Vertices[iVx], Vertices[jVx]}; + printf("V%d%d\n", iVx, jVx); } - else if (nGenLoops == nLoops) { - iGraph++; - } - nGenLoops--; } - free(AllPossConns); - - /* - for (int iVx=mVx+1; iVx<nVx; ++iVx) - deletedVertices[iVx] = 0; - */ - /* - printf("%d\n", nConns); - printf("%d\n", deletedVertices[mVx-1]); - printf("%d\n", deletedVertices[mVx]); - printf("%d\n", deletedVertices[mVx+1]); - */ - - generate_loops(Vertices, deletedVertices, Graphs, nVx, nLoops, nGenLoops); - - //memmove(&AllPossVertices[0], &Vertices[1], (n_vx - 1) * sizeof(Vertex)); + /* Find the first non-deleted vertex */ + //int mVx = -1; + //for (int iVx=0; iVx<nVx; ++iVx) { + //if (!deletedVertices[iVx]) { + //mVx = iVx; + //break; + //} + //} + //printf("mVx %d\n", mVx); +// + //Vertex *AllPossConns = (Vertex *)ecalloc(nVx, sizeof(Vertex)); + //size_t nConns = 0; + //for (int iVx=mVx; iVx<nVx; ++iVx) { + //if (!deletedVertices[iVx] && Vertices[iVx].legId != Vertices[mVx].legId) { + //AllPossConns[nConns++] = Vertices[iVx]; + //} + //} +// + //if (nConns == 0 || mVx == -1) { + //free(deletedVertices); + //printf("End rec"); + //return; + //} +// + ///* We build the connections here */ + //static int iGraph = 0; + //for (int iVx = 0; iVx < nConns; ++iVx) { + //if (!nGenLoops) + //printf("yess"); + //Graphs[iGraph*nLoops+nGenLoops] = (Link){Vertices[mVx], AllPossConns[iVx]}; + //printf("V%d%d - V%d%d\n", Vertices[mVx].legId, Vertices[mVx].id, AllPossConns[iVx].legId, AllPossConns[iVx].id); + ///* Gluon connection introduces new vertices. + //* Gluon legId = (emitter legId + 100) + //*/ +// + ///* + //for (int i = 0; i < nLoops-nGenLoops; ++i) { + //AllPossConns[i] = (Vertex){Vertices[mVx].legId+100,i} + //} + //*/ +// + //deletedVertices[mVx] = 1; + //deletedVertices[AllPossConns[iVx].id] = 1; + //nGenLoops++; + //if(nGenLoops < nLoops) { + //int *deletedCopy = (int *)ecalloc(nVx, sizeof(int)); + //deletedCopy[mVx] = 1; + //deletedCopy[AllPossConns[iVx].id] = 1; + //generate_loops(Vertices, deletedCopy, Graphs, nVx, nLoops, nGenLoops); + //} + //else if (nGenLoops == nLoops) { + //iGraph++; + //} + //nGenLoops--; + //} + //free(AllPossConns); +// + ///* + //for (int iVx=mVx+1; iVx<nVx; ++iVx) + //deletedVertices[iVx] = 0; + //*/ + ///* + //printf("%d\n", nConns); + //printf("%d\n", deletedVertices[mVx-1]); + //printf("%d\n", deletedVertices[mVx]); + //printf("%d\n", deletedVertices[mVx+1]); + //*/ +// + //generate_loops(Vertices, deletedVertices, Graphs, nVx, nLoops, nGenLoops); +// + ////memmove(&AllPossVertices[0], &Vertices[1], (n_vx - 1) * sizeof(Vertex)); } @@ -146,22 +165,43 @@ main(int argc, char *argv[]) char *initial[] = {"g","g"}; char *final[] = {"q","qbar", "g"}; - int nLoops = 2; + int nLoops = 1; size_t nLegs = NELEMS(initial) + NELEMS(final); Leg Legs[nLegs]; - generate_legs(initial,NELEMS(initial), final, NELEMS(final), Legs); + generate_legs(initial,NELEMS(initial), final, NELEMS(final), nLoops, Legs); - Vertex *Vertices = (Vertex *)ecalloc(nLoops*nLegs, sizeof(Vertex)); + size_t nVx = nLegs*nLoops; + Vertex *Vertices = (Vertex *)ecalloc(nVx, sizeof(Vertex)); generate_vertices(Legs, nLegs, nLoops, Vertices); - printf("%d\n",Vertices[0].legId); - printf("%d\n",Vertices[1].legId); + for (int i = 0; i < nVx; ++i) { + printf("V%d%d\n",Vertices[i].legId,Vertices[i].id); + } - size_t nVx = nLegs*nLoops; int *deletedVertices = (int *)ecalloc(nVx, sizeof(int)); Link *Graphs = (Link *)ecalloc(300*nLoops, sizeof(Link)); + Link *Skeleton = (Link *)ecalloc(300*nLoops, sizeof(Link)); + int iEdge = -1; + for (int iLeg = 0; iLeg < nLegs; ++iLeg) { + Vertex* LegVertices = Legs[iLeg].Vertices; + Skeleton[++iEdge] = (Link){LegVertices[0],LegVertices[1]}; + for (int iVx = 1; iVx < nLoops; ++iVx) { + Skeleton[++iEdge] = (Link){LegVertices[iVx],LegVertices[iVx+1]}; + } + /*printf("Last vx: V%d%d\n", LegVertices[nLoops].legId, LegVertices[nLoops].id);*/ + Skeleton[++iEdge] = (Link){LegVertices[nLoops], (Vertex){999, 999}}; + } + + for (int i = 0; i < iEdge; ++i) { + printf("Emit V%d%d Absorb V%d%d\n", + Skeleton[i].emitter.legId,Skeleton[i].emitter.id, Skeleton[i].absorber.legId,Skeleton[i].absorber.id); + } + + printf("Edge count: %d\n", iEdge); + return 0; + generate_loops(Vertices, deletedVertices, Graphs, nVx, nLoops, 0); for (int iVx=0; iVx<300; ++iVx) {