47 int cldeg[MAXPOINTS], clnum[MAXPOINTS], clext[MAXPOINTS];
48 int ncl, nloops, nlegs, npadding;
72int GenerateVertices(TOPOTYPE *TopoInf,
int pointsremaining,
int level)
76 for ( i = pointsremaining, j = 0; i >= 0; i -= TopoInf->vert[level]-2, j++ ) {
77 if ( TopoInf->vertmax && TopoInf->vertmax[level] >= 0
78 && j > TopoInf->vertmax[level] )
break;
81 TopoInf->cldeg[TopoInf->ncl] = TopoInf->vert[level];
82 TopoInf->clnum[TopoInf->ncl] = j;
83 TopoInf->clext[TopoInf->ncl] = 0;
86 mgraph =
new MGraph(0, TopoInf->ncl, TopoInf->cldeg,
87 TopoInf->clnum, TopoInf->clext, TopoInf->sopi);
97 if ( level < TopoInf->nvert-1 ) {
99 TopoInf->cldeg[TopoInf->ncl] = TopoInf->vert[level];
100 TopoInf->clnum[TopoInf->ncl] = j;
101 TopoInf->clext[TopoInf->ncl] = 0;
104 if ( GenerateVertices(TopoInf,i,level+1) < 0 )
return(-1);
105 if ( j > 0 ) { TopoInf->ncl--; }
123WORD GenerateTopologies(PHEAD WORD nloops, WORD nlegs, WORD setvert, WORD setmax)
126 int i, points, identical = 0;
133 TopoInf.vert = &(SetElements[Sets[setvert].first]);
134 TopoInf.nvert = Sets[setvert].last-Sets[setvert].first;
136 if ( setmax >= 0 ) TopoInf.vertmax = &(SetElements[Sets[setmax].first]);
137 else TopoInf.vertmax = 0;
141 points = 2*nloops-2+nlegs;
142 if ( points >= MAXPOINTS ) {
143 MLOCK(ErrorMessageLock);
144 MesPrint(
"GenerateTopologies: %d loops and %d legs considered excessive",nloops,nlegs);
145 MUNLOCK(ErrorMessageLock);
151 for ( i = 0; i < nlegs; i++ ) {
152 TopoInf.cldeg[i] = 1; TopoInf.clnum[i] = 1; TopoInf.clext[i] = 1;
154 if ( identical == 1 ) {
156 TopoInf.clnum[0] = 2;
161 if ( GenerateVertices(&TopoInf,points,0) != 0 ) {
162 MLOCK(ErrorMessageLock);
163 MesPrint(
"Called from GenerateTopologies with %d loops and %d legs considered excessive",nloops,nlegs);
164 MUNLOCK(ErrorMessageLock);
179void toForm(
EGraph *egraph)
187 int n, lg, ed, i, fromset;
189 WORD *termout = AT.WorkPointer;
190 WORD *t, *tt, *ttstop, *ttend, *ttail;
196 tt = AT.TopologiesTerm + 1;
197 i = AT.TopologiesStart - tt;
204 for ( n = 0; n < egraph->nNodes; n++ ) {
205 if ( ( AT.TopologiesOptions[1] &1 ) == 1 && egraph->nodes[n].ext )
continue;
207 *t++ = VERTEX; t++; FILLFUN(t);
208 *t++ = -SNUMBER; *t++ = n;
209 for ( lg = 0; lg < egraph->nodes[n].deg; lg++ ) {
210 ed = egraph->nodes[n].edges[lg];
211 if ( ed >= 0 ) { *t++ = -VECTOR; }
212 else { ed = -ed; *t++ = -MINVECTOR; }
216 fromset = egraph->edges[ed].ext ? AT.setexterntopo : AT.setinterntopo;
217 *t++ = SetElements[Sets[fromset].first+egraph->edges[ed].momn-1];
222 if ( ( AT.TopologiesOptions[0] & 1 ) == 1 ) {
224 for ( n = 1; n <= egraph->nEdges; n++ ) {
225 if ( ( AT.TopologiesOptions[1] & 1 ) == 1 && egraph->edges[n].ext )
continue;
227 *t++ = EDGE; t++; FILLFUN(t);
228 *t++ = -SNUMBER; *t++ = egraph->edges[n].nodes[0];
229 *t++ = -SNUMBER; *t++ = egraph->edges[n].nodes[1];
231 fromset = egraph->edges[n].ext ? AT.setexterntopo : AT.setinterntopo;
232 *t++ = SetElements[Sets[fromset].first+egraph->edges[n].momn-1];
239 ttend = AT.TopologiesTerm; ttend = ttend+ttend[0];
240 ttstop = ttend - ABS(ttend[-1]);
249 if ( egraph->nwsum == 1 && egraph->wsum[0] == 1 ) {
250 while (ttstop < ttend ) *t++ = *ttstop++;
255 newsize = REDLENG(newsize);
256 if ( Divvy(BHEAD (UWORD *)ttstop,&newsize,egraph->wsum,egraph->nwsum) )
258 newsize = INCLENG(newsize);
264 while (ttstop < ttend ) *t++ = *ttstop++;
266 *termout = t - termout;
270 if (
Generator(BHEAD termout,AT.TopologiesLevel) < 0 ) {
272 MLOCK(ErrorMessageLock);
273 MesPrint(
"Called from the topologies routine toForm");
274 MUNLOCK(ErrorMessageLock);
278 AT.WorkPointer = termout;
WORD Generator(PHEAD WORD *, WORD)