HepLib
Loading...
Searching...
No Matches
InitEval.cpp
Go to the documentation of this file.
1
6#include "SD.h"
7#include <math.h>
8#include <cmath>
9
10namespace HepLib::SD {
11
13 if(SecDec!=NULL) delete SecDec;
14 if(Integrator!=NULL) delete Integrator;
15 if(Minimizer!=NULL) delete Minimizer;
16 SecDec = NULL;
17 Integrator = NULL;
18 Minimizer = NULL;
19 }
20
21 void Replacement2(exmap &repl) {
22 auto tmp = repl;
23 for(auto &kv : repl) {
24 kv.second = Symbol::set_all(kv.second.subs(tmp));
25 }
26 }
27
29
30 if(fp.Propagator.nops()<1) {
31 FunExp.clear();
32 if(fp.LoopMomenta.nops()>0 || fp.tLoopMomenta.nops()>0) {
33 IsZero = true;
34 return;
35 } else {
36 FunExp.push_back(lst{lst{Symbol::set_all(fp.Prefactor)}, lst{1}});
37 }
38 return;
39 }
40
41 if(fp.Propagator.nops() != fp.Exponent.nops()) {
42 throw Error("Initialize: the length of Propagator and Exponent are NOT equal.");
43 }
44
45 if(Symbol::set_all(fp.Prefactor).is_zero()) {
46 IsZero = true;
47 return;
48 }
49
50 IsZero = false;
51
52 bool wFound = false;
53 for(auto kv : fp.lReplacement) {
54 if(has_w(kv.first)) {
55 wFound = true;
56 break;
57 }
58 }
59 if(!wFound) {
60 auto repl = fp.lReplacement;
61 for(auto kv : repl) fp.lReplacement[w*kv.first] = w*kv.second;
62 }
63 wFound = false;
64 for(auto kv : fp.tReplacement) {
65 if(has_w(kv.first)) {
66 wFound = true;
67 break;
68 }
69 }
70 if(!wFound) {
71 auto repl = fp.tReplacement;
72 for(auto kv : repl) fp.tReplacement[w*kv.first] = w*kv.second;
73 }
74 wFound = false;
75 for(auto kv : fp.nReplacement) {
76 if(has_w(kv.first)) {
77 wFound = true;
78 break;
79 }
80 }
81 if(!wFound) {
82 auto repl = fp.nReplacement;
83 for(auto kv : repl) fp.nReplacement[w*kv.first] = w*kv.second;
84 }
85
86
87 for(auto kv: fp.lReplacement) {
88 if((lst{kv.first, kv.second}).has(iEpsilon)) {
89 throw Error("Initialize: (lst{kv.first, kv.second}).has(iEpsilon) @1");
90 }
91 }
92 for(auto kv: fp.tReplacement) {
93 if((lst{kv.first, kv.second}).has(iEpsilon)) {
94 throw Error("Initialize: (lst{kv.first, kv.second}).has(iEpsilon) @2");
95 }
96 }
97 for(auto kv: fp.nReplacement) {
98 if((lst{kv.first, kv.second}).has(iEpsilon)) {
99 throw Error("Initialize: (lst{kv.first, kv.second}).has(iEpsilon) @3");
100 }
101 }
102
103 auto ps = Symbol::set_all(fp.Propagator);
104 auto ns = Symbol::set_all(fp.Exponent);
105
106 auto ls = fp.LoopMomenta;
107 auto tls = fp.tLoopMomenta;
108
109 for(auto item : ls) {
110 if(!is_a<symbol>(item)) throw Error("SecDec::Initialize failed, NOT a symbol: "+ex2str(item));
111 }
112 for(auto item : tls) {
113 if(!is_a<symbol>(item)) throw Error("SecDec::Initialize failed, NOT a symbol: "+ex2str(item));
114 }
115
119
120 auto lsubs = fp.lReplacement;
121 auto tsubs = fp.tReplacement;
122 auto nsubs = fp.nReplacement;
124
125 if(Verbose > 0) cout << Color_HighLight << " Initialize @ " << now() << RESET << endl;
126
127 ex asgn = 1;
128 ex a = 0;
129 ex ad = (4-2*ep)*ls.nops();
130 if(fp.isQuasi) ad += (3-2*ep)*tls.nops();
131 else ad += (2-2*ep)*tls.nops();
132 int xn = ps.nops();
133 ex rem = 0;
134 exmap xtNeg;
135
136 ex pre = Symbol::set_all(fp.Prefactor); // come from below
137 for(int i=0; i<ps.nops(); i++) {
138 bool ltQ = false; {
139 auto tps = Symbol::set_all(ps.op(i).expand().subs(lsubs).subs(tsubs));
140 for(auto lsi : ls) {
141 if(tps.has(lsi)) {
142 ltQ = true;
143 break;
144 }
145 }
146
147 if(!ltQ) {
148 for(auto lsi : tls) {
149 if(tps.has(lsi)) {
150 ltQ = true;
151 break;
152 }
153 }
154 }
155 }
156
157 if(ltQ) a += ns.op(i);
158 ex sgn = 0;
159
160 if(!ltQ) {
161 pre = pre * pow(Symbol::set_all(ps.op(i).expand().subs(lsubs).subs(tsubs)), ex(0)-ns.op(i));
162 ns.let_op(i) = 0;
163 ps.let_op(i) = 1;
164 continue;
165 } else if(ns.op(i).info(info_flags::negint) || is_zero(ns.op(i))) {
166 xtNeg[x(i)]=0;
167 if(is_zero(ns.op(i))) continue;
168 }
169
170 auto p = ps.op(i).expand().subs(lsubs).subs(tsubs).subs(nsubs);
171 p = Symbol::set_all(p);
172 p = p.subs(lsubs).subs(tsubs).subs(nsubs);
173 p = Symbol::set_all(p);
174
175 // check loop^2
176 for(auto m : ls) {
177 if(!is_a<numeric>(p.coeff(m,2))) {
178 cout << ErrColor << "not numeric: " << p.coeff(m,2) << endl;
179 cout << "nsubs = " << nsubs << RESET << endl;
180 exit(1);
181 }
182 numeric nm = ex_to<numeric>(p.coeff(m,2));
183 if(nm.is_zero()) continue;
184 sgn = nm>0 ? -1 : 1;
185 break;
186 }
187 // check iEpsilon
188 if(sgn.is_zero()) {
189 if(!is_a<numeric>(p.coeff(iEpsilon))) {
190 throw Error("Initialize: (!is_a<numeric>(p.coeff(iEpsilon)))");
191 }
192 numeric nm = ex_to<numeric>(p.coeff(iEpsilon));
193 if(!nm.is_zero()) sgn = nm>0 ? -1 : 1;
194 }
195 // check tloop^2
196 if(sgn.is_zero()) {
197 for(auto m : tls) {
198 if(!is_a<numeric>(p.coeff(m,2))) {
199 throw Error("Initialize: NOT numeric: " + ex2str(p.coeff(m,2)));
200 }
201 numeric nm = ex_to<numeric>(p.coeff(m,2));
202 if(nm.is_zero()) continue;
203 sgn = nm>0 ? -1 : 1;
204 break;
205 }
206 }
207 // others
208 if(sgn.is_zero()) {
209 sgn = 1;
210 if(is_a<numeric>(p) && ex_to<numeric>(p)>0) sgn = -1;
211 if(Verbose>0 && (!is_a<numeric>(ns.op(i)) || ns.op(i)>0)) {
212 cout << WarnColor << " - Warning: Can NOT determine the iEpsilon sign." << RESET << endl;
213 cout << WarnColor << " - " << p << " from " << ps.op(i) << RESET << endl;
214 }
215 }
216
217 p = (ps.op(i)*sgn).subs(iEpsilon==0);
218 if(sgn==-1) asgn *= exp(I * Pi * ns.op(i));
219 rem += x(i) * p;
220 }
221
222 rem = Symbol::set_all(rem.expand());
223 lst uList1, uList2;
224 ex u=1, cu=1;
225
226 // Loop
227 if(ls.nops()>0) {
228 u=1;
229 for(int i=0; i<ls.nops(); i++) {
230 auto t2 = rem.coeff(ls.op(i),2);
231 auto t1 = rem.coeff(ls.op(i),1);
232 auto t0 = rem.coeff(ls.op(i),0);
233 u *= (-t2);
234 if(t2==0) {
235 IsZero = true;
236 return;
237 }
238 rem = expand(t0 - pow(t1,2)/(4*t2));
239 }
240 rem = normal(Symbol::set_all(rem.subs(lsubs).subs(lsubs)));
241 u = normal(Symbol::set_all(u.subs(lsubs)));
242 for(auto m: tls) {
243 if(u.has(m)) {
244 cerr << ErrColor << "Initialize: u.has(m), " << u << ", " << m << RESET << endl;
245 exit(1);
246 }
247 }
248
249 cu *= u;
250 auto u_nd = numer_denom(u);
251 ex usgn = FactorOutX(u_nd.op(1)).subs(xtNeg).subs(x(w)==ex(1)/2).subs(nsubs);
252 if(is_zero(usgn)) usgn = FactorOutX(u_nd.op(1)).subs(xtNeg).subs(x(w)==ex(1)/3).subs(nsubs);
253 usgn = usgn.subs(nsubs);
254 if(!is_a<numeric>(usgn) || is_zero(usgn)) {
255 cout << "usgn: " << usgn << endl;
256 throw Error("Initialize@1: usgn is zero or non-numeric.");
257 }
258 usgn = normal(usgn)>0 ? 1 : -1;
259
260 uList1.append(usgn*u_nd.op(0));
261 uList2.append(-(4-2*ep)/2);
262 if((usgn*u_nd.op(0)) != 1) {
263 uList1.append(usgn*u_nd.op(1));
264 uList2.append((4-2*ep)/2);
265 }
266 } else {
267 rem = normal(Symbol::set_all(rem.subs(lsubs).subs(lsubs)));
268 }
269
270 // t-Loop
271 if(tls.nops()>0) {
272 u=1;
273 for(int i=0; i<tls.nops(); i++) {
274 auto t2 = rem.coeff(tls.op(i),2);
275 auto t1 = rem.coeff(tls.op(i),1);
276 auto t0 = rem.coeff(tls.op(i),0);
277 u *= (-t2);
278 if(t2.is_zero()) {
279 IsZero = true;
280 return;
281 }
282 rem = expand(t0 - pow(t1,2)/(4*t2));
283 }
284 rem = normal(Symbol::set_all(rem.subs(tsubs)));
285 u = normal(Symbol::set_all(u.subs(lsubs)));
286 for(auto m: tls) {
287 if(u.has(m)) {
288 cerr << ErrColor << "Initialize: u.has(m), " << u << ", " << m << RESET << endl;
289 exit(1);
290 }
291 }
292
293 cu *= u;
294 auto u_nd = numer_denom(u);
295 ex usgn = FactorOutX(u_nd.op(1)).subs(xtNeg).subs(x(w)==ex(1)/2).subs(nsubs);
296 if(is_zero(usgn)) usgn = FactorOutX(u_nd.op(1)).subs(xtNeg).subs(x(w)==ex(1)/3).subs(nsubs);
297 usgn = usgn.subs(nsubs);
298 if(!is_a<numeric>(usgn) || is_zero(usgn)) {
299 cout << "usgn: " << usgn << endl;
300 cout << "nsbus: " << nsubs << endl;
301 throw Error("Initialize@2: usgn is zero or non-numeric.");
302 }
303 usgn = normal(usgn)>0 ? 1 : -1;
304
305 uList1.append(usgn*u_nd.op(0));
306 if(fp.isQuasi) uList2.append(-(3-2*ep)/2);
307 else uList2.append(-(2-2*ep)/2);
308 if(usgn*u_nd.op(1) != 1) {
309 uList1.append(usgn*u_nd.op(1));
310 if(fp.isQuasi) uList2.append((3-2*ep)/2);
311 else uList2.append((2-2*ep)/2);
312 }
313 }
314
315 u = normal(cu);
316 auto u_nd = numer_denom(u);
317 rem = normal(rem * u);
318 auto rem_nd = numer_denom(rem);
319
320 ex usgn = FactorOutX(u_nd.op(1)).subs(xtNeg).subs(x(w)==ex(1)/2).subs(nsubs);
321 usgn = usgn.subs(nsubs);
322 if(!is_a<numeric>(usgn) || is_zero(usgn)) {
323 cout << "usgn: " << usgn << endl;
324 throw Error("Initialize@3: usgn is zero or non-numeric.");
325 }
326 usgn = normal(usgn)>0 ? 1 : -1;
327 ex fsgn = FactorOutX(rem_nd.op(1)).subs(xtNeg).subs(x(w)==ex(1)/2).subs(nsubs);
328 fsgn = fsgn.subs(nsubs);
329 if(!is_a<numeric>(fsgn) || is_zero(fsgn)) {
330 cout << "fsgn: " << fsgn << endl;
331 cout << "nsubs: " << nsubs << endl;
332 throw Error("Initialize: fsgn is zero or non-numeric.");
333 }
334 fsgn = normal(fsgn)>0 ? 1 : -1;
335
336 lst fList1, fList2;
337 fList1.append(usgn*u_nd.op(0));
338 fList2.append(a-ad/2);
339 fList1.append(fsgn*rem_nd.op(0));
340 fList2.append(-a+ad/2);
341 if(usgn*u_nd.op(1) != 1) {
342 fList1.append(usgn*u_nd.op(1));
343 fList2.append(-a+ad/2);
344 }
345 if(fsgn*rem_nd.op(1) != 1) {
346 fList1.append(fsgn*rem_nd.op(1));
347 fList2.append(a-ad/2);
348 }
349
350 for(int i=0; i<uList1.nops(); i++) {
351 fList1.append(uList1[i]);
352 fList2.append(uList2[i]);
353 }
354
355 exvector ret;
356 ret.push_back(lst{fList1, fList2});
357
358 // negative index
359 for(int i=0; i<xn; i++) {
360 if(ns.op(i).info(info_flags::negint)) {
361 for(int j=0; j<ex(0)-ns.op(i); j++) {
362 exvector nret;
363 for(auto fe : ret) {
364 auto plst = ex_to<lst>(fe.op(0));
365 auto nlst = ex_to<lst>(fe.op(1));
366
367 ex nxi=0;
368 for(int ij=0; ij<plst.nops(); ij++) {
369 auto ldeg = expand_ex(plst.op(ij),x(w)).ldegree(x(i));
370 if(ldeg>0) {
371 plst.let_op(ij) = collect_common_factors(plst.op(ij) / pow(x(i),ldeg));
372 nxi += ldeg * nlst.op(ij);
373 }
374 }
375 nxi = normal(nxi);
376 if(!is_zero(nxi)) {
377 plst.append(x(i));
378 nlst.append(nxi);
379 }
380
381 for(int ij=0; ij<nlst.nops(); ij++) { // note the "-" sign
382 auto dtmp = ex(0)-nlst.op(ij) * diff_ex(plst.op(ij),x(i));
383 if(is_zero(dtmp)) continue;
384 auto plst2 = plst;
385 auto nlst2 = nlst;
386 if(is_zero(nlst.op(ij)-1)) {
387 plst2.let_op(ij) = dtmp;
388 } else {
389 nlst2.let_op(ij) = nlst.op(ij)-1;
390 int nn = plst.nops();
391 if(!is_zero(nlst.op(nn-1)-1)) {
392 plst2.append(dtmp);
393 nlst2.append(1);
394 } else plst2.let_op(nn-1) = plst.op(nn-1) * dtmp;
395 }
396 nret.push_back(lst{plst2, nlst2});
397 }
398 }
399 ret = exvector(std::move(nret));
400 }
401
402 for(auto &fe : ret) {
403 ex xpn = 0;
404 int nps = fe.op(0).nops();
405 for(int k=0; k<nps; k++) {
406 auto tmp = fe.op(0).op(k);
407 auto ldeg = expand_ex(tmp,x(w)).ldegree(x(i));
408 if(ldeg>0) {
409 xpn += ldeg * fe.op(1).op(k);
410 tmp = collect_common_factors(tmp / pow(x(i),ldeg));
411 }
412 tmp = tmp.subs(x(i)==0);
413 let_op(fe,0,k,tmp);
414 }
415
416 xpn = normal(xpn);
417 if(!is_zero(xpn)) {
418 if(is_a<numeric>(xpn) && xpn<0) {
419 cout << "xpn=" << xpn << " :> " << i << endl;
420 cout << fe << endl;
421 throw Error("Initialize: xpn < 0 found.");
422 }
423 fe = 0;
424 }
425 }
426 }}
427
428 // simplification
429 // ex pre = fp.Prefactor; // moved to above
430 pre *= asgn * pow(I,ls.nops()+(fp.isQuasi ? tls.nops() : 0)) * pow(Pi, ad/2) * tgamma(a-ad/2);
431 for(int i=0; i<ns.nops(); i++) {
432 if(is_a<numeric>(ns.op(i)) && ns.op(i)<=0) continue;
433 pre /= tgamma(ns.op(i));
434 }
435 if(tls.nops()>0 && (!fp.isQuasi)) pre *= exp(I * Pi * tls.nops()*(2-2*ep)/2);
436
437 ex xpre = 1;
438 for(int i=0; i<ns.nops(); i++) {
439 if(is_a<numeric>(ns.op(i)) && ns.op(i)<=1) continue;
440 else {
441 for(auto &fe : ret) {
442 if(is_zero(fe)) continue;
443 let_op_append(fe, 0, x(i));
444 let_op_append(fe, 1, ns.op(i)-1);
445 }
446 }
447 }
448
449 for(auto &fe : ret) {
450 if(is_zero(fe)) continue;
451 let_op_append(fe, 0, pre);
452 let_op_append(fe, 1, 1);
453 if(xpre != 1) {
454 let_op_append(fe, 0, xpre);
455 let_op_append(fe, 1, 1);
456 }
457 auto nnn = fe.op(0).nops();
458 for(int j=0; j<nnn; j++) {
459 fe.let_op(0).let_op(j) = collect_common_factors(fe.op(0).op(j));
460 fe.let_op(1).let_op(j) = collect_common_factors(fe.op(1).op(j));
461 }
462 }
463
464 lst delta;
465 for(int i=0; i<ns.nops(); i++) {
466 if(is_a<numeric>(ns.op(i)) && ns.op(i)<=0) continue;
467 delta.append(x(i));
468 }
469 FunExp.clear();
470 for(auto &fe : ret) {
471 if(is_zero(fe)) continue;
472 let_op_append(fe, lst{delta});
473 FunExp.push_back(fe);
474 }
475 Normalizes();
476 exmap eps_map;
477 ex epn = ex(1)/111;
478 for(auto epi : eps_lst) {
479 eps_map[epi.op(0)] = epn;
480 epn = epn / 13;
481 }
482 // final check non-f term positive
483 for(auto fe : FunExp) {
484 auto fs = fe.op(0);
485 auto ns = fe.op(1);
486 for(int i=0; i<fs.nops(); i++) {
487 if(i==1 || ns.op(i).info(info_flags::integer)) continue;
488 auto nv = Symbol::set_all(fs.op(i)).subs(nReplacement).subs(lst{CV(w1,w2)==w2}).subs(eps_map);
489 if(!xPositive(nv)) {
490 cout << "fs = " << fs << endl << "ns = " << ns << endl;
491 throw Error("Initialize: non-positive u-term found.");
492 }
493 }
494 }
495
496 if(fp.isAsy) DoAsy();
497 XReOrders();
498 Normalizes();
499 }
500
502 IsZero = false;
505
506 for(int di=0; di<xint.Deltas.nops(); di++) {
507 auto delta = xint.Deltas.op(di);
508 if(!is_a<lst>(delta) || delta.nops()<1) {
509 cout << ErrColor << "Deltas is NOT valide: " << xint.Deltas << RESET << endl;
510 exit(1);
511 }
512 }
513
514 FunExp.clear();
515 FunExp.shrink_to_fit();
516 if(xint.Deltas.nops()>0) FunExp.push_back(lst{xint.Function, xint.Exponent, xint.Deltas});
517 else FunExp.push_back(lst{xint.Function, xint.Exponent});
518
519 Normalizes();
520 if(xint.isAsy) DoAsy();
521 XReOrders();
522 Normalizes();
523 }
524
525 void SecDec::Evaluate(FeynmanParameter fp, const string & key) {
526
527 if(Verbose>1) cout << endl << " Starting @ " << now() << endl;
528
529 Initialize(fp);
530 MB();
531 if(FunExp.size()<1) return;
532 Scalelesses();
533 ChengWu();
534 RemoveDeltas();
535 KillPowers();
536 SDPrepares();
537 EpsExpands();
538 CIPrepares(key);
539 auto pps = GiNaC_Parallel_Process;
541 Contours(key);
542 Integrates(key);
544 if(Verbose>1) cout << " Finished @ " << now() << endl << endl;
545 }
546
547 void SecDec::Evaluate(XIntegrand xint, const string & key) {
548
549 if(Verbose>1) cout << endl << " Starting @ " << now() << endl;
550
551 Initialize(xint);
552 MB();
553 if(FunExp.size()<1) return;
554 Scalelesses();
555 ChengWu();
556 RemoveDeltas();
557 KillPowers();
558 SDPrepares();
559 EpsExpands();
560 CIPrepares(key);
561 auto pps = GiNaC_Parallel_Process;
563 Contours(key);
564 Integrates(key);
566 if(Verbose>1) cout << " Finished @ " << now() << endl << endl;
567 }
568
569 void SecDec::Evaluate(const exvector & funexp, const string & key) {
570
571 if(Verbose>1) cout << endl << " Starting @ " << now() << endl;
572
573 FunExp = funexp;
574 MB();
575 if(FunExp.size()<1) return;
576 Scalelesses();
577 ChengWu();
578 RemoveDeltas();
579 KillPowers();
580 SDPrepares();
581 EpsExpands();
582 CIPrepares(key);
583 auto pps = GiNaC_Parallel_Process;
585 Contours(key);
586 Integrates(key);
588 if(Verbose>1) cout << " Finished @ " << now() << endl << endl;
589 }
590
591}
int * a
#define RESET
Definition BASIC.h:79
SecDec header file.
class used to wrap error message
Definition BASIC.h:242
class to manipulate with Cheng-Wu theorem
Definition SD.h:387
SecDec the main class to use Sector Decompostion method.
Definition SD.h:413
void KillPowers(int bits=1+2)
Kill Powers will call KillPowerD or KillPower.
exmap nReplacement
Definition SD.h:425
SecDecBase * SecDec
Definition SD.h:429
MinimizeBase * Minimizer
Definition SD.h:431
void Contours(const string &key="", const string &pkey="")
Contours, note that here we need to provide the specific Parameter.
Definition Contours.cpp:17
IntegratorBase * Integrator
Definition SD.h:430
void Initialize(FeynmanParameter fpi)
Definition InitEval.cpp:28
exvector FunExp
Definition SD.h:426
void Integrates(const string &key="", const string &pkey="", int kid=0)
Contours, note that here we need to provide the specific Parameter.
void Evaluate(FeynmanParameter fpi, const string &key="")
Definition InitEval.cpp:525
void CIPrepares(const string &key="")
Prepare for the Contours and Integrates calls .so will be generated, for more detailed exported funct...
static ex set_all(const ex &expr)
Definition BASIC.cpp:147
namespace for Numerical integration with Sector Decomposition method
Definition AsyMB.cpp:10
ex FactorOutX(const ex expr)
Definition Helpers.cpp:278
void Replacement2(exmap &repl)
Definition InitEval.cpp:21
ex expand_ex(ex const &expr_in, std::function< bool(const ex &)> has_func)
the expand like Mathematica
Definition BASIC.cpp:1188
const char * Color_HighLight
Definition BASIC.cpp:248
const iSymbol iEpsilon
int GiNaC_Parallel_Process
Definition Init.cpp:146
void let_op(ex &ex_in, int index1, int index2, const ex item)
update index1-th.index2-th of expression with item
Definition BASIC.cpp:1560
bool xPositive(ex const expr)
check the expr is xPositive, i.e., each x-monomial item is postive
Definition BASIC.cpp:1290
const char * ErrColor
Definition BASIC.cpp:246
const Symbol ep
bool has_w(const ex &e)
Definition BASIC.cpp:2233
const char * WarnColor
Definition BASIC.cpp:247
string now(bool use_date)
date/time string
Definition BASIC.cpp:525
ex w
Definition Init.cpp:93
ex diff_ex(ex const expr, ex const xp, unsigned nth, bool expand)
the differential like Mathematica
Definition BASIC.cpp:1063
int Verbose
Definition Init.cpp:142
void let_op_append(ex &ex_in, const ex item)
append item into expression
Definition BASIC.cpp:1324
string ex2str(const ex &expr)
convert ex to output string, the defalut printer format will be used
Definition BASIC.cpp:715
ex w1
Definition BASIC.h:499
ex w2
Definition BASIC.h:499
ex subs(const ex &e, init_list sl)
Definition BASIC.h:51
wrap parameters for loop integrals
Definition SD.h:66
wrap parameters for generic parameter integrals
Definition SD.h:82
exmap nReplacement
Definition SD.h:85