24 string spid = to_string(pid);
25 if(
get_env(
"GiNaC_Parallel_Host").length()>0) spid =
get_env(
"GiNaC_Parallel_Host")+
"_"+spid;
31 auto kv = expResult[idx];
33 auto xs = get_xy_from(expr);
35 return lst{kv.op(0), kv.op(1), 1};
39 expr.find(FTX(
w1,
w2), ftxset);
42 for(
auto item : ftxset) {
44 if((
int)xys.size() > ftxsize) {
50 bool need_contour_deformation =
false;
51 if(ft.has(x(
w)) && !ft.has(PL(
w))) {
55 eps_map[epi.op(0)] = epn;
60 for(
auto item : tmp) {
61 if(!is_a<numeric>(item.subs(x(
w)==1))) {
62 throw Error(
"CIPrepares: (!is_a<numeric>(item.subs(x(w)==1)))");
64 if(item.subs(x(
w)==1) < 0) {
65 need_contour_deformation =
true;
70 if(!is_a<numeric>(tmp.subs(x(
w)==1))) {
71 throw Error(
"CIPrepares: (!is_a<numeric>(tmp.subs(x(w)==1)))");
73 if(tmp.subs(x(
w)==1) < 0) need_contour_deformation =
true;
75 if(!need_contour_deformation) ft = 1;
76 }
else if(!ft.has(x(
w))) {
80 ft = collect_common_factors(ft);
81 return lst{ kv.op(0), kv.op(1), ft};
88 for(
auto item : resf) {
89 if(item.op(2).has(x(
w))) {
90 fts.append(item.op(2));
97 map<ex,int,ex_is_less> ftnmap;
101 for(
auto item : fts) {
102 ftnvec.push_back(lst{item, ft_n});
104 FT_N_XN.append(lst{item, ft_n,
get_xy_from(item).size()});
112 for(
auto &item : resf) {
113 auto ii = ex_to<lst>(item);
117 int ft_n = ftnmap[item.op(2)];
118 if(ft_n==0)
throw Error(
"CIPrepares: ft_n==0, " +
ex2str(item.op(2)));
121 if(ii.op(0).is_zero() || ii.op(1).subs(FTX(
w1,
w2)==1).is_zero())
continue;
122 if(IBF==0) res_vec.push_back(ii);
126 cf_int[key] += ii.op(1);
128 auto cvs =
collect_lst(ii.op(0), [](
const ex & e)->bool { return has_symbol(e); });
129 for(
auto const & cv : cvs) {
133 cf_int[key] += cv.op(0)*ii.op(1);
139 for(
auto kv : cf_int) {
140 lst ii = ex_to<lst>(kv.first);
142 res_vec.push_back(ii);
148 if(res_vec.size()<1) {
158 auto kv = ftnvec[idx];
161 auto fxs = get_xy_from(ft);
164 auto pls = get_pl_from(ft);
165 int npls = pls.size()>0 ? ex_to<numeric>(pls[pls.size()-1].subs(lst{PL(w)==w})).to_int() : -1;
167 for(
int i=0; i<npls+1; i++) {
169 pl <<
"pl[" << i <<
"]";
170 plRepl.append(PL(i) == Symbol(pl.str()));
173 ex DFs[fxs.size()], DDFs[fxs.size()][fxs.size()];
174 for(
int i=0; i<fxs.size(); i++) {
176 DFs[i] = collect_common_factors(df);
178 ilaos <<
"ilas[" << i <<
"]";
179 symbol ila(ilaos.str());
180 for(
int j=0; j<fxs.size(); j++) {
181 auto ddf =
diff_ex(DFs[i], fxs[j]);
182 DDFs[i][j] = collect_common_factors(ddf);
186 if(!
dir_exists(spid))
auto rc = system((
"mkdir -p "+spid).c_str());
187 ostringstream cppfn, sofn;
188 cppfn << spid <<
"/F" << ft_n <<
".cpp";
189 sofn << spid <<
"/F" << ft_n <<
".o";
191 ofs.open(cppfn.str(), ios::out);
192 if (!ofs)
throw Error(
"failed to open *.cpp file! (1)");
195 for (
int i=0; i<fxs.size(); i++) {
196 ostringstream sx, sz;
197 sx <<
"x[" << i <<
"]";
198 cxRepl.append(fxs[i] == Symbol(sx.str()));
199 sz <<
"z[" << i <<
"]";
200 czRepl.append(fxs[i] == Symbol(sz.str()));
204 ofs <<
"#include \"NFunctions.h\"" << endl;
206 auto cppL = CppFormat(ofs,
"L");
207 auto cppQ = CppFormat(ofs,
"Q");
208 auto cppMP = CppFormat(ofs,
"MP");
211 ofs <<
"dREAL FL_" << ft_n <<
"(const dREAL* x, const dREAL *pl) {" << endl;
212 ofs <<
"dREAL yy = ";
213 EvalL(ft.subs(plRepl).subs(cxRepl)).print(cppL);
215 ofs <<
"return yy;" << endl;
220 ofs <<
"qREAL FQ_" << ft_n <<
"(const qREAL* x, const qREAL *pl) {" << endl;
221 ofs <<
"qREAL yy = ";
222 EvalQ(ft.subs(plRepl).subs(cxRepl)).print(cppQ);
224 ofs <<
"return yy;" << endl;
229 ofs <<
"mpREAL FMP_" << ft_n <<
"(const mpREAL* x, const mpREAL *pl) {" << endl;
230 ofs <<
"mpREAL yy = ";
231 EvalMP(ft.subs(plRepl).subs(cxRepl)).print(cppMP);
233 ofs <<
"return yy;" << endl;
238 ofs <<
"dREAL FL_" << ft_n <<
"(const int i, const dREAL* x, const dREAL *pl) {" << endl;
239 for(
int i=0; i<fxs.size(); i++) {
240 ofs <<
"if("<<i<<
"==i) return ";
244 ofs <<
"return 0;" << endl;
249 ofs <<
"qREAL FQ_" << ft_n <<
"(const int i, const qREAL* x, const qREAL *pl) {" << endl;
250 for(
int i=0; i<fxs.size(); i++) {
251 ofs <<
"if("<<i<<
"==i) return ";
255 ofs <<
"return 0;" << endl;
260 ofs <<
"mpREAL FMP_" << ft_n <<
"(const int i, const mpREAL* x, const mpREAL *pl) {" << endl;
261 for(
int i=0; i<fxs.size(); i++) {
262 ofs <<
"if("<<i<<
"==i) return ";
266 ofs <<
"return 0;" << endl;
271 ofs <<
"dREAL FL_" << ft_n <<
"(const int i, const int j, const dREAL* x, const dREAL *pl) {" << endl;
272 for(
int i=0; i<fxs.size(); i++) {
273 for(
int j=0; j<fxs.size(); j++) {
274 ofs <<
"if("<<i<<
"==i && "<<j<<
"==j) return ";
278 ofs <<
"return 0;" << endl;
283 ofs <<
"qREAL FQ_" << ft_n <<
"(const int i, const int j, const qREAL* x, const qREAL *pl) {" << endl;
284 for(
int i=0; i<fxs.size(); i++) {
285 for(
int j=0; j<fxs.size(); j++) {
286 ofs <<
"if("<<i<<
"==i && "<<j<<
"==j) return ";
290 ofs <<
"return 0;" << endl;
295 ofs <<
"mpREAL FMP_" << ft_n <<
"(const int i, const int j, const mpREAL* x, const mpREAL *pl) {" << endl;
296 for(
int i=0; i<fxs.size(); i++) {
297 for(
int j=0; j<fxs.size(); j++) {
298 ofs <<
"if("<<i<<
"==i && "<<j<<
"==j) return ";
302 ofs <<
"return 0;" << endl;
307 ofs <<
"void X2ZL_" << ft_n <<
"(const dREAL* x, dCOMPLEX* z, dCOMPLEX* r, dREAL* dff, const dREAL* pl, const dREAL* las) {" << endl;
308 ofs <<
"X2Z("<<fxs.size()<<
",FL_"<<ft_n<<
",FL_"<<ft_n<<
",x,z,r,dff,pl,las);" << endl;
313 ofs <<
"void X2ZQ_" << ft_n <<
"(const qREAL* x, qCOMPLEX* z, qCOMPLEX* r, qREAL* dff, const qREAL* pl, const qREAL* las) {" << endl;
314 ofs <<
"X2Z("<<fxs.size()<<
",FQ_"<<ft_n<<
",FQ_"<<ft_n<<
",x,z,r,dff,pl,las);" << endl;
319 ofs <<
"void X2ZMP_" << ft_n <<
"(const mpREAL* x, mpCOMPLEX* z, mpCOMPLEX* r, mpREAL* dff, const mpREAL* pl, const mpREAL* las) {" << endl;
320 ofs <<
"X2Z("<<fxs.size()<<
",FMP_"<<ft_n<<
",FMP_"<<ft_n<<
",x,z,r,dff,pl,las);" << endl;
325 ofs <<
"void MatL_"<<ft_n<<
"(dCOMPLEX* mat, const dREAL* x, const dREAL* dff, const dREAL* pl, const dREAL* las) {" << endl;
326 ofs <<
"Mat("<<fxs.size()<<
",FL_"<<ft_n<<
",mat,x,dff,pl,las);" << endl;
331 ofs <<
"void MatQ_"<<ft_n<<
"(qCOMPLEX *mat, const qREAL* x, const qREAL* dff, const qREAL *pl, const qREAL *las) {" << endl;
332 ofs <<
"Mat("<<fxs.size()<<
",FQ_"<<ft_n<<
",mat,x,dff,pl,las);" << endl;
337 ofs <<
"void MatMP_"<<ft_n<<
"(mpCOMPLEX *mat, const mpREAL* x, const mpREAL* dff, const mpREAL *pl, const mpREAL *las) {" << endl;
338 ofs <<
"Mat("<<fxs.size()<<
",FMP_"<<ft_n<<
",mat,x,dff,pl,las);" << endl;
343 ofs <<
"extern \"C\" " << endl;
344 ofs <<
"dREAL imgF_"<<ft_n<<
"(const int xn, const dREAL* x, const dREAL *pl, const dREAL *las_in) {" << endl;
345 ofs <<
"dREAL las[xn-1];" <<endl;
346 ofs <<
"for(int i=0; i<xn-1; i++) las[i] = las_in[i]*x[xn-1];" <<endl;
347 ofs <<
"dCOMPLEX z[xn], r[xn];" << endl;
348 ofs <<
"dREAL dff[xn+1];" << endl;
349 ofs <<
"X2ZL_"<<ft_n<<
"(x,z,r,dff,pl,las);" << endl;
350 ofs <<
"dCOMPLEX zf = ";
351 EvalL(ft.subs(plRepl).subs(czRepl)).print(cppL);
353 ofs <<
"return -zf.imag()/x[xn-1];" << endl;
358 ofs <<
"extern \"C\" " << endl;
359 ofs <<
"dREAL minF_"<<ft_n<<
"(const int xn, const dREAL* x, const dREAL *pl, const dREAL *las_in) {" << endl;
360 ofs <<
"return FL_"<<ft_n<<
"(x,pl);" << endl;
365 ofs <<
"extern \"C\" " << endl;
366 ofs <<
"dREAL minFM_"<<ft_n<<
"(const int xn, const dREAL* x, const dREAL *pl, const dREAL *las_in) {" << endl;
367 ofs <<
"return 0.L-FL_"<<ft_n<<
"(x,pl);" << endl;
372 for(
int i=0; i<fxs.size(); i++) {
373 ofs <<
"extern \"C\" " << endl;
374 ofs <<
"dREAL dirC_"<<ft_n<<
"_"<<i<<
"(const int xn, const dREAL* x, const dREAL *pl, const dREAL *las) {" << endl;
375 ofs <<
"int i = " << i <<
";" << endl;
376 ofs <<
"dREAL yy = x[i]*(1-x[i])*FL_"<<ft_n<<
"(i, x, pl);" << endl;
377 ofs <<
"return -fabs(yy);" << endl;
383 cmd << cpp <<
" -fPIC -c " <<
INC_FLAGS <<
" -include NFunctions.h -o " << sofn.str() <<
" " << cppfn.str();
384 auto rc = system(cmd.str().c_str());
389 cmd <<
"cp " << sofn.str() <<
" . ";
390 rc = system(cmd.str().c_str());
397 bool hasF = (ftnvec.size()>0);
399 ostringstream sofn, cmd;
401 sofn << key <<
"F.so";
403 sofn << spid <<
"F.so";
405 cmd << cpp <<
" " <<
LIB_FLAGS <<
" -Wl,-rpath,. -rdynamic -fPIC -shared -lHepLib -lquadmath -lmpfr -lgmp " <<
" -o " << sofn.str() <<
" " << spid <<
"/F*.o";
406 cmd <<
" -lHepLib -lquadmath -lmpfr -lgmp";
407 cmd <<
" 1> /dev/null 2> /dev/null";
408 rc = system(cmd.str().c_str());
412 cmd <<
"rm -rf " << spid;
413 if(!
Debug) rc = system(cmd.str().c_str());
421 if(!
dir_exists(spid)) cmd <<
"mkdir -p " << spid;
422 rc = system(cmd.str().c_str());
425 cmd <<
"echo ''>" << spid <<
"/null.cpp;";
426 cmd << cpp <<
" -fPIC -c -o " << spid <<
"/null.o " << spid <<
"/null.cpp";
427 rc = system(cmd.str().c_str());
437 static symbol xwra(
"xwra");
438 auto kvf = res_vec[idx];
439 auto expr = kvf.op(1);
440 auto xs = get_xy_from(expr);
441 auto ft_n = kvf.op(3);
442 bool hasF = (ft_n>0);
446 cmd <<
"cp " << spid <<
"/null.o " << spid <<
"/" << idx <<
".o";
447 auto rc = system(cmd.str().c_str());
448 return lst{ expr.subs(lst{FTX(w1,w2)==1}), xs.size(), kvf.op(0), -1};
451 if(xs.size()<1) xs.push_back(x(0));
457 expr.find(FTX(
w1,
w2), ftxset);
459 for(
auto it : ftxset) ftxlst.append(it);
461 vector<pair<ex,ex>> ft_expr;
462 for(
auto item : ftxlst) {
463 ft_expr.push_back(make_pair(item.op(1), expr.coeff(item)));
466 lst cxRepl, czRepl, czzRepl, plRepl;
467 for (
int i=0; i<fxs.size(); i++) {
468 ostringstream xs, zs, zzs;
469 xs <<
"x[" << i <<
"]";
470 zs <<
"z[" << i <<
"]";
471 zzs <<
"zz[" << i <<
"]";
472 cxRepl.append(fxs[i] == Symbol(xs.str()));
473 czRepl.append(fxs[i] == Symbol(zs.str()));
474 czzRepl.append(fxs[i] == Symbol(zzs.str()));
476 int count = fxs.size();
478 auto xii = xi.subs(czRepl);
479 if(is_zero(xii-xi)) {
480 ostringstream xs, zs;
481 xs <<
"x[" << count <<
"]";
482 cxRepl.append(xi == Symbol(xs.str()));
483 czRepl.append(xi == Symbol(xs.str()));
484 czzRepl.append(xi == Symbol(xs.str()));
488 if(count!=xs.size())
throw Error(
"CIPrepares: (count!=xs.size())");
490 int npls = pls.size()>0 ? ex_to<numeric>(pls[pls.size()-1].subs(lst{PL(w)==w})).to_int() : -1;
491 for(
int i=0; i<npls+1; i++) {
493 pl <<
"pl[" << i <<
"]";
494 plRepl.append(PL(i) == Symbol(pl.str()));
497 if(!
dir_exists(spid))
auto rc = system((
"mkdir -p "+spid).c_str());
499 cppfn << spid <<
"/" << idx <<
".cpp";
501 ofs.open(cppfn.str(), ios::out);
502 if (!ofs)
throw Error(
"failed to open *.cpp file! (2)");
505 ofs <<
"#include \"NFunctions.h\"" << endl;
508 ofs <<
"qREAL FQ_"<<ft_n<<
"(const qREAL*, const qREAL*);" << endl;
509 ofs <<
"dREAL FL_"<<ft_n<<
"(const int, const dREAL*, const dREAL*);" << endl;
510 ofs <<
"qREAL FQ_"<<ft_n<<
"(const int, const qREAL*, const qREAL*);" << endl;
511 ofs <<
"qREAL FMP_"<<ft_n<<
"(const int, const mpREAL*, const mpREAL*);" << endl;
512 ofs <<
"dREAL FL_"<<ft_n<<
"(const int, const int, const dREAL*, const dREAL*);" << endl;
513 ofs <<
"qREAL FQ_"<<ft_n<<
"(const int, const int, const qREAL*, const qREAL*);" << endl;
514 ofs <<
"qREAL FMP_"<<ft_n<<
"(const int, const int, const mpREAL*, const mpREAL*);" << endl;
515 ofs <<
"void X2ZL_"<<ft_n<<
"(const dREAL*, dCOMPLEX*, dCOMPLEX*, dREAL*, const dREAL*, const dREAL*);" << endl;
516 ofs <<
"void X2ZQ_"<<ft_n<<
"(const qREAL*, qCOMPLEX*, qCOMPLEX*, qREAL*, const qREAL*, const qREAL*);" << endl;
517 ofs <<
"void X2ZMP_"<<ft_n<<
"(const mpREAL*, mpCOMPLEX*, mpCOMPLEX*, mpREAL*, const mpREAL*, const mpREAL*);" << endl;
518 ofs <<
"void MatL_"<<ft_n<<
"(dCOMPLEX*, const dREAL*, const dREAL*, const dREAL*, const dREAL*);" << endl;
519 ofs <<
"void MatQ_"<<ft_n<<
"(qCOMPLEX*, const qREAL*, const qREAL*, const qREAL*, const qREAL*);" << endl;
520 ofs <<
"void MatMP_"<<ft_n<<
"(mpCOMPLEX*, const mpREAL*, const mpREAL*, const mpREAL*, const mpREAL*);" << endl;
527 auto cppL = CppFormat(ofs,
"L");
530 ofs <<
"extern \"C\" " << endl;
531 ofs <<
"int SDD_"<<idx<<
"(const unsigned int xn, const dREAL x[], const unsigned int yn, dREAL y[], const dREAL pl[], const dREAL las[]) {" << endl;
533 auto tmp = expr.subs(FTX(
w1,
w2)==1).subs(cxRepl).subs(plRepl);
534 ofs <<
"//for debug, intg: " << endl <<
"//" << tmp << endl;
537 auto intg = expr.subs(FTX(
w1,
w2)==1);
542 hasF2 = hasF2 ||
intg.has(WRA(
w));
543 if(
intg.has(WRA(
w))) {
545 find(
intg, WRA(
w), wras);
546 if(wras.size()!=1)
throw Error(
"CIPrepares: Too many WRA(w).");
547 auto wra = (*(wras.begin())).op(0);
549 ofs <<
"dREAL wra = ";
EvalL(wra).print(cppL); ofs <<
";" << endl;
553 find(
intg, sqrt(
w), pows_set);
555 for(
auto item : pows_set) {
557 if(item.match(pow(
w1,
w2)) && !item.op(1).info(info_flags::integer)) {
558 pow_subs.append(item == exp(item.op(1)*log(item.op(0))));
559 }
else if(item.match(sqrt(
w))) {
560 pow_subs.append(item == exp(log(item.op(0))/2));
567 find(
intg, log(
w), logs_set);
569 for(
auto item : logs_set) {
570 if(item.has(xwra)) logs.append(item.op(0));
574 ofs <<
"int nlog = "<<logs.nops()<<
";" << endl;
575 ofs <<
"dCOMPLEX CLog[nlog], LogZ[nlog][NRCLog+1];" << endl;
577 lst clogs = ex_to<lst>(cse.Parse(logs));
579 ofs <<
"for(int ti=0; ti<=NRCLog; ti++) {" << endl;
580 ofs <<
"dREAL xwra;" << endl;
581 ofs <<
"if(ti==0) xwra = wra/(25*NRCLog);" << endl;
582 ofs <<
"else xwra = ti*wra/NRCLog;" << endl;
583 ofs <<
"dCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
584 for(
auto kv : cse.os()) {
585 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
586 EvalL(kv.second.subs(cxRepl).subs(plRepl)).print(cppL);
591 for(
int i=0; i<clogs.nops(); i++) {
592 ofs <<
"LogZ["<<i<<
"][ti] = ";
593 EvalL(clogs.op(i).subs(cxRepl).subs(plRepl)).print(cppL);
595 log_subs[log(logs.op(i))] = Symbol(
"CLog["+to_string(i)+
"]");
598 ofs <<
"for(int li=0; li<nlog; li++) CLog[li] = RCLog(LogZ[li],NRCLog);" << endl;
601 ofs <<
"dREAL xwra = wra;" << endl;
606 if(hasF2) ofs <<
"dCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
607 else ofs <<
"dREAL "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
608 for(
auto kv : cse.os()) {
609 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
610 EvalL(kv.second.subs(cxRepl).subs(plRepl)).print(cppL);
614 ofs <<
"dCOMPLEX yy = ";
615 EvalL(
intg.subs(cxRepl).subs(plRepl)).print(cppL);
618 ofs <<
"y[0] = yy.real();" << endl;
619 ofs <<
"y[1] = yy.imag();" << endl;
620 ofs <<
"return 0;" << endl;
626 ofs <<
"extern \"C\" " << endl;
627 ofs <<
"int CSDD_"<<idx<<
"(const unsigned int xn, const dREAL x[], const unsigned int yn, dREAL y[], const dREAL pl[], const dREAL las[]) {" << endl;
628 ofs <<
"dREAL x0[xn];" << endl;
629 ofs <<
"dCOMPLEX z[xn],zz[xn],r[xn];" << endl;
630 ofs <<
"dREAL dff[xn+1];" << endl;
631 ofs <<
"dCOMPLEX yy=0, ytmp, det;" << endl;
632 ofs <<
"int ii, nfxs="<<fxs.size()<<
";" << endl;
633 ofs <<
"dCOMPLEX mat[nfxs*nfxs];" << endl;
634 for(
auto &kv : ft_expr) {
637 for(
int ii=0; ii<fxs.size(); ii++) {
638 if(!kv.first.has(fxs[ii])) xs0.append(ii);
640 ofs <<
"for(int i=0; i<xn; i++) z[i] = x0[i] = x[i];" << endl;
641 for(
auto x0i : xs0) ofs <<
"x0["<<x0i<<
"]=0;" << endl;
642 ofs <<
"X2ZL_"<<ft_n<<
"(x0,z,r,dff,pl,las);" << endl;
643 ofs <<
"MatL_"<<ft_n<<
"(mat,x0,dff,pl,las);" << endl;
644 for(
auto x0i : xs0) {
645 ofs <<
"ii = " << x0i <<
";" << endl;
646 ofs <<
"z[ii] = x[ii]-x[ii]*(1.L-x[ii])*r[ii];" << endl;
647 ofs <<
"for(int j=0; j<nfxs;j++) mat[nfxs*ii+j] = 0;" << endl;
648 ofs <<
"for(int i=0; i<nfxs;i++) mat[nfxs*i+ii] = 0;" << endl;
649 ofs <<
"mat[ii*nfxs+ii] = 1.L-(1.L-2.L*x[ii])*r[ii];" << endl;
651 ofs <<
"det = MatDet(mat, nfxs);" << endl;
658 find(
intg, sqrt(
w), pows_set);
660 for(
auto item : pows_set) {
661 if(!item.op(0).match(x(
w))) {
662 if(item.match(pow(
w1,
w2)) && !item.op(1).info(info_flags::integer)) {
663 pow_subs.append(item == exp(item.op(1)*log(item.op(0))));
664 }
else if(item.match(sqrt(
w))) {
665 pow_subs.append(item == exp(log(item.op(0))/2));
672 find(
intg, log(
w), logs_set);
673 if(logs_set.size()>0) {
675 for(
auto item : logs_set) {
676 if(!item.op(0).match(x(
w))) logs.append(item.op(0));
679 ofs <<
"int nlog = "<<logs.nops()<<
";" << endl;
680 ofs <<
"dCOMPLEX CLog[nlog], LogZ[nlog][NRCLog+1];" << endl;
682 lst clogs = ex_to<lst>(cse.Parse(logs));
684 ofs <<
"for(int ti=0; ti<=NRCLog; ti++) {" << endl;
685 ofs <<
"if(ti==0) { for(int i=0; i<xn; i++) zz[i] = complex<dREAL>(z[i].real(), z[i].imag()/(25*NRCLog)); }" << endl;
686 ofs <<
"else { for(int i=0; i<xn; i++) zz[i] = complex<dREAL>(z[i].real(), ti*z[i].imag()/NRCLog); }" << endl;
687 ofs <<
"dCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
688 for(
auto kv : cse.os()) {
689 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
690 EvalL(kv.second.subs(czzRepl).subs(plRepl)).print(cppL);
695 for(
int i=0; i<clogs.nops(); i++) {
696 ofs <<
"LogZ["<<i<<
"][ti] = ";
697 EvalL(clogs.op(i).subs(czzRepl).subs(plRepl)).print(cppL);
699 log_subs[log(logs.op(i))] = Symbol(
"CLog["+to_string(i)+
"]");
702 ofs <<
"for(int li=0; li<nlog; li++) CLog[li] = RCLog(LogZ[li],NRCLog);" << endl;
710 ofs <<
"dCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
711 for(
auto kv : cse.os()) {
712 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
713 EvalL(kv.second.subs(czRepl).subs(plRepl)).print(cppL);
718 EvalL(
intg.subs(czRepl).subs(plRepl)).print(cppL);
720 ofs <<
"yy += det * ytmp;" << endl << endl;
724 ofs <<
"y[0] = yy.real();" << endl;
725 ofs <<
"y[1] = yy.imag();" << endl;
726 ofs <<
"return 0;" << endl;
736 auto cppQ = CppFormat(ofs,
"Q");
740 ofs <<
"extern \"C\" " << endl;
741 ofs <<
"int SDQ_"<<idx<<
"(const unsigned int xn, const qREAL x[], const int unsigned yn, qREAL y[], const qREAL pl[], const qREAL las[]) {" << endl;
743 auto intg = expr.subs(FTX(
w1,
w2)==1);
748 hasF2 = hasF2 ||
intg.has(WRA(
w));
749 if(
intg.has(WRA(
w))) {
751 find(
intg, WRA(
w), wras);
752 if(wras.size()!=1)
throw Error(
"CIPrepares: Too many WRA(w).");
753 auto wra = (*(wras.begin())).op(0);
755 ofs <<
"qREAL wra = ";
EvalQ(wra).print(cppQ); ofs <<
";" << endl;
759 find(
intg, sqrt(
w), pows_set);
761 for(
auto item : pows_set) {
763 if(item.match(pow(
w1,
w2)) && !item.op(1).info(info_flags::integer)) {
764 pow_subs.append(item == exp(item.op(1)*log(item.op(0))));
765 }
else if(item.match(sqrt(
w))) {
766 pow_subs.append(item == exp(log(item.op(0))/2));
773 find(
intg, log(
w), logs_set);
775 for(
auto item : logs_set) {
776 if(item.has(xwra)) logs.append(item.op(0));
780 ofs <<
"int nlog = "<<logs.nops()<<
";" << endl;
781 ofs <<
"qCOMPLEX CLog[nlog], LogZ[nlog][NRCLog+1];" << endl;
783 lst clogs = ex_to<lst>(cse.Parse(logs));
785 ofs <<
"for(int ti=0; ti<=NRCLog; ti++) {" << endl;
786 ofs <<
"qREAL xwra;" << endl;
787 ofs <<
"if(ti==0) xwra = wra/(25*NRCLog);" << endl;
788 ofs <<
"else xwra = ti*wra/NRCLog;" << endl;
789 ofs <<
"qCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
790 for(
auto kv : cse.os()) {
791 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
792 EvalQ(kv.second.subs(cxRepl).subs(plRepl)).print(cppQ);
797 for(
int i=0; i<clogs.nops(); i++) {
798 ofs <<
"LogZ["<<i<<
"][ti] = ";
799 EvalQ(clogs.op(i).subs(cxRepl).subs(plRepl)).print(cppQ);
801 log_subs[log(logs.op(i))] = Symbol(
"CLog["+to_string(i)+
"]");
804 ofs <<
"for(int li=0; li<nlog; li++) CLog[li] = RCLog(LogZ[li],NRCLog);" << endl;
807 ofs <<
"qREAL xwra = wra;" << endl;
812 if(hasF2) ofs <<
"qCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
813 else ofs <<
"qREAL "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
814 for(
auto kv : cse.os()) {
815 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
816 EvalQ(kv.second.subs(cxRepl).subs(plRepl)).print(cppQ);
820 ofs <<
"qCOMPLEX yy = ";
821 EvalQ(
intg.subs(cxRepl).subs(plRepl)).print(cppQ);
823 ofs <<
"y[0] = crealq(yy);" << endl;
824 ofs <<
"y[1] = cimagq(yy);" << endl;
825 ofs <<
"return 0;" << endl;
831 ofs <<
"extern \"C\" " << endl;
832 ofs <<
"int CSDQ_"<<idx<<
"(const unsigned int xn, const qREAL x[], const int unsigned yn, qREAL y[], const qREAL pl[], const qREAL las[]) {" << endl;
833 ofs <<
"qREAL x0[xn];" << endl;
834 ofs <<
"qCOMPLEX z[xn],zz[xn],r[xn];" << endl;
835 ofs <<
"qREAL dff[xn+1];" << endl;
836 ofs <<
"qCOMPLEX yy=0, ytmp, det;" << endl;
837 ofs <<
"int ii, nfxs="<<fxs.size()<<
";" << endl;
838 ofs <<
"qCOMPLEX mat[nfxs*nfxs];" << endl;
839 for(
auto &kv : ft_expr) {
842 for(
int ii=0; ii<fxs.size(); ii++) {
843 if(!kv.first.has(fxs[ii])) xs0.append(ii);
845 ofs <<
"for(int i=0; i<xn; i++) z[i] = x0[i] = x[i];" << endl;
846 for(
auto x0i : xs0) ofs <<
"x0["<<x0i<<
"]=0;" << endl;
847 ofs <<
"X2ZQ_"<<ft_n<<
"(x0,z,r,dff,pl,las);" << endl;
848 ofs <<
"MatQ_"<<ft_n<<
"(mat,x0,dff,pl,las);" << endl;
849 for(
auto x0i : xs0) {
850 ofs <<
"ii = " << x0i <<
";" << endl;
851 ofs <<
"z[ii] = x[ii]-x[ii]*(1.Q-x[ii])*r[ii];" << endl;
852 ofs <<
"for(int j=0; j<nfxs;j++) mat[nfxs*ii+j] = 0;" << endl;
853 ofs <<
"for(int i=0; i<nfxs;i++) mat[nfxs*i+ii] = 0;" << endl;
854 ofs <<
"mat[ii*nfxs+ii] = 1.Q-(1.Q-2.Q*x[ii])*r[ii];" << endl;
856 ofs <<
"det = MatDet(mat, nfxs);" << endl;
863 find(
intg, sqrt(
w), pows_set);
865 for(
auto item : pows_set) {
866 if(!item.op(0).match(x(
w))) {
867 if(item.match(pow(
w1,
w2)) && !item.op(1).info(info_flags::integer)) {
868 pow_subs.append(item == exp(item.op(1)*log(item.op(0))));
869 }
else if(item.match(sqrt(
w))) {
870 pow_subs.append(item == exp(log(item.op(0))/2));
877 find(
intg, log(
w), logs_set);
878 if(logs_set.size()>0) {
880 for(
auto item : logs_set) {
881 if(!item.op(0).match(x(
w))) logs.append(item.op(0));
884 ofs <<
"int nlog = "<<logs.nops()<<
";" << endl;
885 ofs <<
"qCOMPLEX CLog[nlog], LogZ[nlog][NRCLog+1];" << endl;
887 lst clogs = ex_to<lst>(cse.Parse(logs));
889 ofs <<
"for(int ti=0; ti<=NRCLog; ti++) {" << endl;
890 ofs <<
"if(ti==0) { for(int i=0; i<xn; i++) zz[i] = crealq(z[i]) + 1.Qi*cimagq(z[i])/(25.Q*NRCLog); }" << endl;
891 ofs <<
"else { for(int i=0; i<xn; i++) zz[i] = crealq(z[i]) + 1.Qi*ti*cimagq(z[i])/NRCLog; }" << endl;
892 ofs <<
"qCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
893 for(
auto kv : cse.os()) {
894 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
895 EvalQ(kv.second.subs(czzRepl).subs(plRepl)).print(cppQ);
900 for(
int i=0; i<clogs.nops(); i++) {
901 ofs <<
"LogZ["<<i<<
"][ti] = ";
902 EvalQ(clogs.op(i).subs(czzRepl).subs(plRepl)).print(cppQ);
904 log_subs[log(logs.op(i))] = Symbol(
"CLog["+to_string(i)+
"]");
907 ofs <<
"for(int li=0; li<nlog; li++) CLog[li] = RCLog(LogZ[li],NRCLog);" << endl;
915 ofs <<
"qCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
916 for(
auto kv : cse.os()) {
917 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
918 EvalQ(kv.second.subs(czRepl).subs(plRepl)).print(cppQ);
923 EvalQ(
intg.subs(czRepl).subs(plRepl)).print(cppQ);
925 ofs <<
"yy += det * ytmp;" << endl << endl;
928 ofs <<
"y[0] = crealq(yy);" << endl;
929 ofs <<
"y[1] = cimagq(yy);" << endl;
930 ofs <<
"return 0;" << endl;
935 ofs <<
"extern \"C\" " << endl;
936 ofs <<
"qREAL FT_"<<idx<<
"(const qREAL x[], const qREAL pl[]) {" << endl;
937 ofs <<
"qREAL yy = FQ_" << ft_n <<
"(x, pl);" << endl;
938 ofs <<
"return yy;" << endl;
947 auto cppMP = CppFormat(ofs,
"MP");
951 ofs <<
"extern \"C\" " << endl;
952 ofs <<
"int SDMP_"<<idx<<
"(const unsigned int xn, const mpREAL x[], const unsigned int yn, mpREAL y[], const mpREAL pl[], const mpREAL las[]) {" << endl;
953 auto intg = expr.subs(FTX(
w1,
w2)==1);
958 hasF2 = hasF2 ||
intg.has(WRA(
w));
959 if(
intg.has(WRA(
w))) {
961 find(
intg, WRA(
w), wras);
962 if(wras.size()!=1)
throw Error(
"CIPrepares: Too many WRA(w).");
963 auto wra = (*(wras.begin())).op(0);
965 ofs <<
"mpREAL wra = ";
EvalMP(wra).print(cppMP); ofs <<
";" << endl;
969 find(
intg, sqrt(
w), pows_set);
971 for(
auto item : pows_set) {
973 if(item.match(pow(
w1,
w2)) && !item.op(1).info(info_flags::integer)) {
974 pow_subs.append(item == exp(item.op(1)*log(item.op(0))));
975 }
else if(item.match(sqrt(
w))) {
976 pow_subs.append(item == exp(log(item.op(0))/2));
983 find(
intg, log(
w), logs_set);
985 for(
auto item : logs_set) {
986 if(item.has(xwra)) logs.append(item.op(0));
990 ofs <<
"int nlog = "<<logs.nops()<<
";" << endl;
991 ofs <<
"mpCOMPLEX CLog[nlog], LogZ[nlog][NRCLog+1];" << endl;
993 lst clogs = ex_to<lst>(cse.Parse(logs));
995 ofs <<
"for(int ti=0; ti<=NRCLog; ti++) {" << endl;
996 ofs <<
"mpREAL xwra;" << endl;
997 ofs <<
"if(ti==0) xwra = wra/(25*NRCLog);" << endl;
998 ofs <<
"else xwra = ti*wra/NRCLog;" << endl;
999 ofs <<
"mpCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
1000 for(
auto kv : cse.os()) {
1001 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
1002 EvalMP(kv.second.subs(cxRepl).subs(plRepl)).print(cppMP);
1007 for(
int i=0; i<clogs.nops(); i++) {
1008 ofs <<
"LogZ["<<i<<
"][ti] = ";
1009 EvalMP(clogs.op(i).subs(cxRepl).subs(plRepl)).print(cppMP);
1011 log_subs[log(logs.op(i))] = Symbol(
"CLog["+to_string(i)+
"]");
1014 ofs <<
"for(int li=0; li<nlog; li++) CLog[li] = RCLog(LogZ[li],NRCLog);" << endl;
1017 ofs <<
"mpREAL xwra = wra;" << endl;
1022 if(hasF2) ofs <<
"mpCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
1023 else ofs <<
"mpREAL "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
1024 for(
auto kv : cse.os()) {
1025 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
1026 EvalMP(kv.second.subs(cxRepl).subs(plRepl)).print(cppMP);
1030 ofs <<
"mpCOMPLEX yy = ";
1031 EvalMP(
intg.subs(cxRepl).subs(plRepl)).print(cppMP);
1033 ofs <<
"y[0] = yy.real();" << endl;
1034 ofs <<
"y[1] = yy.imag();" << endl;
1035 ofs <<
"return 0;" << endl;
1041 ofs <<
"extern \"C\" " << endl;
1042 ofs <<
"int CSDMP_"<<idx<<
"(const unsigned int xn, const mpREAL x[], const unsigned int yn, mpREAL y[], const mpREAL pl[], const mpREAL las[]) {" << endl;
1043 ofs <<
"mpREAL x0[xn];" << endl;
1044 ofs <<
"mpCOMPLEX z[xn],zz[xn],r[xn];" << endl;
1045 ofs <<
"mpREAL dff[xn+1];" << endl;
1046 ofs <<
"mpCOMPLEX yy=mpREAL(0), ytmp, det;" << endl;
1047 ofs <<
"int ii, nfxs="<<fxs.size()<<
";" << endl;
1048 ofs <<
"mpCOMPLEX mat[nfxs*nfxs];" << endl;
1049 for(
auto &kv : ft_expr) {
1052 for(
int ii=0; ii<fxs.size(); ii++) {
1053 if(!kv.first.has(fxs[ii])) xs0.append(ii);
1055 ofs <<
"for(int i=0; i<xn; i++) z[i] = x0[i] = x[i];" << endl;
1056 for(
auto x0i : xs0) ofs <<
"x0["<<x0i<<
"]=0;" << endl;
1057 ofs <<
"X2ZMP_"<<ft_n<<
"(x0,z,r,dff,pl,las);" << endl;
1058 ofs <<
"MatMP_"<<ft_n<<
"(mat,x0,dff,pl,las);" << endl;
1059 for(
auto x0i : xs0) {
1060 ofs <<
"ii = " << x0i <<
";" << endl;
1061 ofs <<
"z[ii] = x[ii]-x[ii]*(1-x[ii])*r[ii];" << endl;
1062 ofs <<
"for(int j=0; j<nfxs;j++) mat[nfxs*ii+j] = mpREAL(0);" << endl;
1063 ofs <<
"for(int i=0; i<nfxs;i++) mat[nfxs*i+ii] = mpREAL(0);" << endl;
1064 ofs <<
"mat[ii*nfxs+ii] = mpREAL(1)-(1-2*x[ii])*r[ii];" << endl;
1066 ofs <<
"det = MatDet(mat, nfxs);" << endl;
1068 ex
intg = kv.second;
1073 find(
intg, sqrt(
w), pows_set);
1075 for(
auto item : pows_set) {
1076 if(!item.op(0).match(x(
w))) {
1077 if(item.match(pow(
w1,
w2)) && !item.op(1).info(info_flags::integer)) {
1078 pow_subs.append(item == exp(item.op(1)*log(item.op(0))));
1079 }
else if(item.match(sqrt(
w))) {
1080 pow_subs.append(item == exp(log(item.op(0))/2));
1087 find(
intg, log(
w), logs_set);
1088 if(logs_set.size()>0) {
1090 for(
auto item : logs_set) {
1091 if(!item.op(0).match(x(
w))) logs.append(item.op(0));
1094 ofs <<
"int nlog = "<<logs.nops()<<
";" << endl;
1095 ofs <<
"mpCOMPLEX CLog[nlog], LogZ[nlog][NRCLog+1];" << endl;
1097 lst clogs = ex_to<lst>(cse.Parse(logs));
1099 ofs <<
"for(int ti=0; ti<=NRCLog; ti++) {" << endl;
1100 ofs <<
"if(ti==0) { for(int i=0; i<xn; i++) zz[i] = complex<mpREAL>(z[i].real(), z[i].imag()/(25*NRCLog)); }" << endl;
1101 ofs <<
"else { for(int i=0; i<xn; i++) zz[i] = complex<mpREAL>(z[i].real(), ti*z[i].imag()/NRCLog); }" << endl;
1102 ofs <<
"mpCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
1103 for(
auto kv : cse.os()) {
1104 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
1105 EvalMP(kv.second.subs(czzRepl).subs(plRepl)).print(cppMP);
1110 for(
int i=0; i<clogs.nops(); i++) {
1111 ofs <<
"LogZ["<<i<<
"][ti] = ";
1112 EvalMP(clogs.op(i).subs(czzRepl).subs(plRepl)).print(cppMP);
1114 log_subs[log(logs.op(i))] = Symbol(
"CLog["+to_string(i)+
"]");
1117 ofs <<
"for(int li=0; li<nlog; li++) CLog[li] = RCLog(LogZ[li],NRCLog);" << endl;
1125 ofs <<
"mpCOMPLEX "<<cse.oc<<
"[" << cse.on()+1 <<
"];" << endl;
1126 for(
auto kv : cse.os()) {
1127 ofs <<cse.oc<<
"["<<kv.first<<
"] = ";
1128 EvalMP(kv.second.subs(czRepl).subs(plRepl)).print(cppMP);
1133 EvalMP(
intg.subs(czRepl).subs(plRepl)).print(cppMP);
1135 ofs <<
"yy += det * ytmp;" << endl << endl;
1139 ofs <<
"y[0] = yy.real();" << endl;
1140 ofs <<
"y[1] = yy.imag();" << endl;
1141 ofs <<
"return 0;" << endl;
1147 ostringstream ofn, cmd;
1148 ofn << spid <<
"/" << idx <<
".o";
1149 cmd << cpp <<
" -pipe -fPIC " <<
INC_FLAGS <<
" -include NFunctions.h -c -o " << ofn.str() <<
" " << cppfn.str();
1150 auto rc = system(cmd.str().c_str());
1151 if(!
Debug) remove(cppfn.str().c_str());
1152 return lst{ idx, xs.size(), kvf.op(0), ft_n };
1164 ostringstream fsofn, sofn, garfn, cmd;
1166 fsofn << key <<
"F.so";
1167 sofn << key <<
".so";
1168 garfn << key <<
".ci.gar";
1170 for(
auto &item : res) gar_res.append(item);
1172 ar.archive_ex(gar_res,
"res");
1173 ar.archive_ex(19790923,
"c");
1174 ar.archive_ex(FT_N_XN,
"ftnxn");
1175 ar.archive_ex(soLimit,
"soLimit");
1176 ar.archive_ex(eps_lst,
"eps_lst");
1177 ofstream out(garfn.str());
1182 cmd <<
"rm -f " << key <<
"X*.so";
1183 rc = system(cmd.str().c_str());
1185 fsofn << spid <<
"F.so";
1186 sofn << spid <<
".so";
1187 for(
auto &item : res) ciResult.push_back(ex_to<lst>(item));
1190 cmd <<
"rm -f " << spid <<
"X*.so";
1191 rc = system(cmd.str().c_str());
1194 int res_size = res.size();
1195 if(soLimit<100) soLimit = 100;
1196 if(res_size>soLimit) {
1199 cmd << cpp <<
" " <<
LIB_FLAGS <<
" -Wl,-rpath,. -rdynamic -fPIC -shared -lHepLib -lquadmath -lmpfr -lgmp";
1200 if(hasF) cmd <<
" " << fsofn.str();
1201 cmd <<
" -o " << sofn.str() <<
" $(seq -f '" << spid <<
"/%g.o' 0 " << (soLimit-1) <<
")";
1202 cmd <<
" -lHepLib -lquadmath -lmpfr -lgmp";
1203 cmd <<
" 1> /dev/null 2> /dev/null";
1204 rc = system(cmd.str().c_str());
1206 for(
int n=1;
true; n++) {
1207 int start = n*soLimit;
1208 int end = (n+1)*soLimit-1;
1209 if(end>res_size-1) end = res_size-1;
1212 if(key !=
"") sofn << key <<
"X" << n <<
".so";
1213 else sofn << spid <<
"X" << n <<
".so";
1216 cmd << cpp <<
" " <<
LIB_FLAGS <<
" -Wl,-rpath,. -rdynamic -fPIC -shared -lHepLib -lquadmath -lmpfr -lgmp";
1217 if(hasF) cmd <<
" " << fsofn.str();
1218 cmd <<
" -o " << sofn.str() <<
" $(seq -f '" << spid <<
"/%g.o' " << start <<
" " << end <<
")";
1219 if(hasF) cmd <<
" " << fsofn.str();
1220 cmd <<
" -lHepLib -lquadmath -lmpfr -lgmp";
1221 cmd <<
" 1> /dev/null 2> /dev/null";
1222 rc = system(cmd.str().c_str());
1223 if(end>=res_size-1)
break;
1228 cmd << cpp <<
" " <<
LIB_FLAGS <<
" -Wl,-rpath,. -rdynamic -fPIC -shared -lHepLib -lquadmath -lmpfr -lgmp";
1229 if(hasF) cmd <<
" " << fsofn.str();
1230 cmd <<
" -o " << sofn.str() <<
" " << spid <<
"/*.o";
1231 if(hasF) cmd <<
" " << fsofn.str();
1232 cmd <<
" -lHepLib -lquadmath -lmpfr -lgmp";
1233 cmd <<
" 1> /dev/null 2> /dev/null";
1234 rc = system(cmd.str().c_str());
1238 if(
Debug) cmd <<
"rm -rf " << key <<
"_debug;mv -f " << spid <<
" " << key <<
"_debug;rm -f " << key <<
"_debug/*.o";
1239 else cmd <<
"rm -rf " << spid;
1240 rc = system(cmd.str().c_str());