71#define GSL_FN_EVAL(F,x) (*((F)->function))(x,(F)->params)
98 double epsabs,
double epsrel,
size_t limit,
101 double *
result,
double *abserr);
106 double epsabs,
double epsrel,
size_t limit,
108 double *
result,
double * abserr) ;
112 double epsabs,
double epsrel,
size_t limit,
114 double *
result,
double *abserr) ;
119 double epsabs,
double epsrel,
size_t limit,
121 double *
result,
double *abserr) ;
126 double epsabs,
double epsrel,
size_t limit,
128 double *
result,
double *abserr) ;
138namespace RooFit_internal {
141 static void registerIntegrator()
148struct Roo_reg_AGKInteg1D {
149 Roo_reg_AGKInteg1D() { Roo_internal_AGKInteg1D::registerIntegrator(); }
161 RooRealVar maxSeg(
"maxSeg",
"maximum number of segments", 100);
162 RooCategory method(
"method",
"Integration method for each segment");
173 return std::make_unique<RooAdaptiveGaussKronrodIntegrator1D>(function, config);
176 fact.
registerPlugin(
"RooAdaptiveGaussKronrodIntegrator1D", creator, {maxSeg, method},
182 oocoutI(
nullptr,Integration) <<
"RooAdaptiveGaussKronrodIntegrator1D has been registered " << std::endl;
192 _epsAbs(config.epsRel()),
193 _epsRel(config.epsAbs())
213 _epsAbs(config.epsRel()),
214 _epsRel(config.epsAbs()),
262 coutE(Integration) <<
"RooAdaptiveGaussKronrodIntegrator1D::setLimits: cannot override integrand's limits" << endl;
289 if (!infLo && !infHi) {
291 }
else if (infLo && infHi) {
293 }
else if (infLo && !infHi) {
388#define GSL_EBADTOL 13
390#define GSL_ERROR(a,b) oocoutE(nullptr,Integration) << "RooAdaptiveGaussKronrodIntegrator1D::integral() ERROR: " << a << endl ; return b ;
391#define GSL_DBL_MIN 2.2250738585072014e-308
392#define GSL_DBL_MAX 1.7976931348623157e+308
393#define GSL_DBL_EPSILON 2.2204460492503131e-16
396#define GSL_EMAXITER 3
399#define GSL_EDIVERGE 6
402#define GSL_ERROR_VAL(reason, gsl_errno, value) return value ;
404#define GSL_MAX(a,b) ((a) > (b) ? (a) : (b))
420#define GSL_COERCE_DBL(x) (gsl_coerce_double(x))
433 double *
result,
double *abserr,
434 double *defabs,
double *resabs);
437 double *
result,
double *abserr,
438 double *resabs,
double *resasc);
441 double *
result,
double *abserr,
442 double *resabs,
double *resasc);
445 double *
result,
double *abserr,
446 double *resabs,
double *resasc);
449 double *
result,
double *abserr,
450 double *resabs,
double *resasc);
453 double *
result,
double *abserr,
454 double *resabs,
double *resasc);
457 double *
result,
double *abserr,
458 double *resabs,
double *resasc);
461 double *cheb12,
double *cheb24);
479 const double wg[],
const double wgk[],
480 double fv1[],
double fv2[],
482 double *
result,
double * abserr,
483 double * resabs,
double * resasc);
488 double epsabs,
double epsrel,
size_t limit,
491 double *
result,
double *abserr);
502 workspace->
nrmax = 0;
506 workspace->
rlist[0] = 0.0;
507 workspace->
elist[0] = 0.0;
508 workspace->
order[0] = 0;
509 workspace->
level[0] = 0;
517 double result,
double error);
521 double result,
double error)
525 workspace->
elist[0] = error;
535 const size_t last = workspace->
size - 1;
536 const size_t limit = workspace->
limit;
538 double * elist = workspace->
elist;
539 size_t * order = workspace->
order;
545 size_t i_nrmax = workspace->
nrmax;
546 size_t i_maxerr = order[i_nrmax] ;
554 workspace->
i = i_maxerr ;
558 errmax = elist[i_maxerr] ;
565 while (i_nrmax > 0 && errmax > elist[order[i_nrmax - 1]])
567 order[i_nrmax] = order[i_nrmax - 1] ;
575 if(last < (limit/2 + 2))
581 top = limit - last + 1;
592 while (i < top && errmax < elist[order[i]])
594 order[i-1] = order[i] ;
598 order[i-1] = i_maxerr ;
602 errmin = elist[last] ;
606 while (k > i - 2 && errmin >= elist[order[k]])
608 order[k+1] = order[k] ;
616 i_maxerr = order[i_nrmax] ;
618 workspace->
i = i_maxerr ;
619 workspace->
nrmax = i_nrmax ;
627 double a1,
double b1,
double area1,
double error1,
628 double a2,
double b2,
double area2,
double error2);
632 double *
a,
double *
b,
double *
r,
double *
e);
638 double a1,
double b1,
double area1,
double error1,
639 double a2,
double b2,
double area2,
double error2)
641 double * alist = workspace->
alist ;
642 double * blist = workspace->
blist ;
643 double * rlist = workspace->
rlist ;
644 double * elist = workspace->
elist ;
645 size_t * level = workspace->
level ;
647 const size_t i_max = workspace->
i ;
648 const size_t i_new = workspace->
size ;
650 const size_t new_level = workspace->
level[i_max] + 1;
657 rlist[i_max] = area2;
658 elist[i_max] = error2;
659 level[i_max] = new_level;
663 rlist[i_new] = area1;
664 elist[i_new] = error1;
665 level[i_new] = new_level;
670 rlist[i_max] = area1;
671 elist[i_max] = error1;
672 level[i_max] = new_level;
676 rlist[i_new] = area2;
677 elist[i_new] = error2;
678 level[i_new] = new_level;
693 double *
a,
double *
b,
double *
r,
double *
e)
695 const size_t i = workspace->
i;
696 double * alist = workspace->
alist;
697 double * blist = workspace->
blist;
698 double * rlist = workspace->
rlist;
699 double * elist = workspace->
elist;
713 const double *
const rlist = workspace->
rlist ;
714 const size_t n = workspace->
size;
717 double result_sum = 0;
719 for (k = 0; k <
n; k++)
721 result_sum += rlist[k];
736 double tmp = (1 + 100 *
e) * (std::abs(a2) + 1000 * u);
738 int status = std::abs(a1) <= tmp && std::abs(b2) <= tmp;
746 const double a,
const double b,
747 const double epsabs,
const double epsrel,
750 double *
result,
double * abserr,
756 double epsabs,
double epsrel,
size_t limit,
759 double *
result,
double * abserr)
795 status =
qag (
f,
a,
b, epsabs, epsrel, limit,
805 const double a,
const double b,
806 const double epsabs,
const double epsrel,
809 double *
result,
double *abserr,
813 double result0, abserr0, resabs0, resasc0;
815 size_t iteration = 0;
816 int roundoff_type1 = 0, roundoff_type2 = 0, error_type = 0;
827 if (limit > workspace->
limit)
832 if (epsabs <= 0 && (epsrel < 50 *
GSL_DBL_EPSILON || epsrel < 0.5e-28))
834 GSL_ERROR (
"tolerance cannot be acheieved with given epsabs and epsrel",
840 q (
f,
a,
b, &result0, &abserr0, &resabs0, &resasc0);
846 tolerance =
GSL_MAX_DBL (epsabs, epsrel * std::abs(result0));
852 if (abserr0 <= round_off && abserr0 > tolerance)
857 GSL_ERROR (
"cannot reach tolerance because of roundoff error "
860 else if ((abserr0 <= tolerance && abserr0 != resasc0) || abserr0 == 0.0)
882 double a1, b1, a2, b2;
883 double a_i, b_i, r_i, e_i;
884 double area1 = 0, area2 = 0, area12 = 0;
885 double error1 = 0, error2 = 0, error12 = 0;
886 double resasc1, resasc2;
887 double resabs1, resabs2;
891 retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
894 b1 = 0.5 * (a_i + b_i);
898 q (
f, a1, b1, &area1, &error1, &resabs1, &resasc1);
899 q (
f, a2, b2, &area2, &error2, &resabs2, &resasc2);
901 area12 = area1 + area2;
902 error12 = error1 + error2;
904 errsum += (error12 - e_i);
905 area += area12 - r_i;
907 if (resasc1 != error1 && resasc2 != error2)
909 double delta = r_i - area12;
911 if (std::abs(delta) <= 1.0e-5 * std::abs(area12) && error12 >= 0.99 * e_i)
915 if (iteration >= 10 && error12 > e_i)
921 tolerance =
GSL_MAX_DBL (epsabs, epsrel * std::abs(area));
923 if (errsum > tolerance)
925 if (roundoff_type1 >= 6 || roundoff_type2 >= 20)
939 update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
941 retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
946 while (iteration < limit && !error_type && errsum > tolerance);
951 if (errsum <= tolerance)
955 else if (error_type == 2)
957 GSL_ERROR (
"roundoff error prevents tolerance from being achieved",
960 else if (error_type == 3)
962 GSL_ERROR (
"bad integrand behavior found in the integration interval",
965 else if (iteration == limit)
975static double rescale_error (
double err,
const double result_abs,
const double result_asc) ;
980 err = std::abs(err) ;
982 if (result_asc != 0 && err != 0)
984 double scale =
TMath::Power((200 * err / result_asc), 1.5) ;
988 err = result_asc * scale ;
1011 const double xgk[],
const double wg[],
const double wgk[],
1012 double fv1[],
double fv2[],
1014 double *
result,
double *abserr,
1015 double *resabs,
double *resasc)
1018 const double center = 0.5 * (
a +
b);
1019 const double half_length = 0.5 * (
b -
a);
1020 const double abs_half_length = std::abs(half_length);
1023 double result_gauss = 0;
1024 double result_kronrod = f_center * wgk[
n - 1];
1026 double result_abs = std::abs(result_kronrod);
1027 double result_asc = 0;
1028 double mean = 0, err = 0;
1034 result_gauss = f_center * wg[
n / 2 - 1];
1037 for (j = 0; j < (
n - 1) / 2; j++)
1039 const int jtw = j * 2 + 1;
1040 const double abscissa = half_length * xgk[jtw];
1041 const double fval1 =
GSL_FN_EVAL (
f, center - abscissa);
1042 const double fval2 =
GSL_FN_EVAL (
f, center + abscissa);
1043 const double fsum = fval1 + fval2;
1046 result_gauss += wg[j] * fsum;
1047 result_kronrod += wgk[jtw] * fsum;
1048 result_abs += wgk[jtw] * (std::abs(fval1) + std::abs(fval2));
1051 for (j = 0; j <
n / 2; j++)
1054 const double abscissa = half_length * xgk[jtwm1];
1055 const double fval1 =
GSL_FN_EVAL (
f, center - abscissa);
1056 const double fval2 =
GSL_FN_EVAL (
f, center + abscissa);
1059 result_kronrod += wgk[jtwm1] * (fval1 + fval2);
1060 result_abs += wgk[jtwm1] * (std::abs(fval1) + std::abs(fval2));
1063 mean = result_kronrod * 0.5;
1065 result_asc = wgk[
n - 1] * std::abs(f_center - mean);
1067 for (j = 0; j <
n - 1; j++)
1069 result_asc += wgk[j] * (std::abs(fv1[j] - mean) + std::abs(fv2[j] - mean));
1074 err = (result_kronrod - result_gauss) * half_length;
1076 result_kronrod *= half_length;
1077 result_abs *= abs_half_length;
1078 result_asc *= abs_half_length;
1080 *
result = result_kronrod;
1081 *resabs = result_abs;
1082 *resasc = result_asc;
1093 0.991455371120812639206854697526329,
1094 0.949107912342758524526189684047851,
1095 0.864864423359769072789712788640926,
1096 0.741531185599394439863864773280788,
1097 0.586087235467691130294144838258730,
1098 0.405845151377397166906606412076961,
1099 0.207784955007898467600689403773245,
1100 0.000000000000000000000000000000000
1108 0.129484966168869693270611432679082,
1109 0.279705391489276667901467771423780,
1110 0.381830050505118944950369775488975,
1111 0.417959183673469387755102040816327
1116 0.022935322010529224963732008058970,
1117 0.063092092629978553290700663189204,
1118 0.104790010322250183839876322541518,
1119 0.140653259715525918745189590510238,
1120 0.169004726639267902826583426598550,
1121 0.190350578064785409913256402421014,
1122 0.204432940075298892414161999234649,
1123 0.209482141084727828012999174891714
1128 double *
result,
double *abserr,
1129 double *resabs,
double *resasc)
1131 double fv1[8], fv2[8];
1133 gsl_integration_qk (8,
xgkA,
wgA,
wgkA, fv1, fv2,
f,
a,
b,
result, abserr, resabs, resasc);
1142 0.995657163025808080735527280689003,
1143 0.973906528517171720077964012084452,
1144 0.930157491355708226001207180059508,
1145 0.865063366688984510732096688423493,
1146 0.780817726586416897063717578345042,
1147 0.679409568299024406234327365114874,
1148 0.562757134668604683339000099272694,
1149 0.433395394129247190799265943165784,
1150 0.294392862701460198131126603103866,
1151 0.148874338981631210884826001129720,
1152 0.000000000000000000000000000000000
1160 0.066671344308688137593568809893332,
1161 0.149451349150580593145776339657697,
1162 0.219086362515982043995534934228163,
1163 0.269266719309996355091226921569469,
1164 0.295524224714752870173892994651338
1169 0.011694638867371874278064396062192,
1170 0.032558162307964727478818972459390,
1171 0.054755896574351996031381300244580,
1172 0.075039674810919952767043140916190,
1173 0.093125454583697605535065465083366,
1174 0.109387158802297641899210590325805,
1175 0.123491976262065851077958109831074,
1176 0.134709217311473325928054001771707,
1177 0.142775938577060080797094273138717,
1178 0.147739104901338491374841515972068,
1179 0.149445554002916905664936468389821
1185 double *
result,
double *abserr,
1186 double *resabs,
double *resasc)
1188 double fv1[11], fv2[11];
1190 gsl_integration_qk (11,
xgkB,
wgB,
wgkB, fv1, fv2,
f,
a,
b,
result, abserr, resabs, resasc);
1199 0.998002298693397060285172840152271,
1200 0.987992518020485428489565718586613,
1201 0.967739075679139134257347978784337,
1202 0.937273392400705904307758947710209,
1203 0.897264532344081900882509656454496,
1204 0.848206583410427216200648320774217,
1205 0.790418501442465932967649294817947,
1206 0.724417731360170047416186054613938,
1207 0.650996741297416970533735895313275,
1208 0.570972172608538847537226737253911,
1209 0.485081863640239680693655740232351,
1210 0.394151347077563369897207370981045,
1211 0.299180007153168812166780024266389,
1212 0.201194093997434522300628303394596,
1213 0.101142066918717499027074231447392,
1214 0.000000000000000000000000000000000
1222 0.030753241996117268354628393577204,
1223 0.070366047488108124709267416450667,
1224 0.107159220467171935011869546685869,
1225 0.139570677926154314447804794511028,
1226 0.166269205816993933553200860481209,
1227 0.186161000015562211026800561866423,
1228 0.198431485327111576456118326443839,
1229 0.202578241925561272880620199967519
1234 0.005377479872923348987792051430128,
1235 0.015007947329316122538374763075807,
1236 0.025460847326715320186874001019653,
1237 0.035346360791375846222037948478360,
1238 0.044589751324764876608227299373280,
1239 0.053481524690928087265343147239430,
1240 0.062009567800670640285139230960803,
1241 0.069854121318728258709520077099147,
1242 0.076849680757720378894432777482659,
1243 0.083080502823133021038289247286104,
1244 0.088564443056211770647275443693774,
1245 0.093126598170825321225486872747346,
1246 0.096642726983623678505179907627589,
1247 0.099173598721791959332393173484603,
1248 0.100769845523875595044946662617570,
1249 0.101330007014791549017374792767493
1254 double *
result,
double *abserr,
1255 double *resabs,
double *resasc)
1257 double fv1[16], fv2[16];
1259 gsl_integration_qk (16,
xgkC,
wgC,
wgkC, fv1, fv2,
f,
a,
b,
result, abserr, resabs, resasc);
1268 0.998859031588277663838315576545863,
1269 0.993128599185094924786122388471320,
1270 0.981507877450250259193342994720217,
1271 0.963971927277913791267666131197277,
1272 0.940822633831754753519982722212443,
1273 0.912234428251325905867752441203298,
1274 0.878276811252281976077442995113078,
1275 0.839116971822218823394529061701521,
1276 0.795041428837551198350638833272788,
1277 0.746331906460150792614305070355642,
1278 0.693237656334751384805490711845932,
1279 0.636053680726515025452836696226286,
1280 0.575140446819710315342946036586425,
1281 0.510867001950827098004364050955251,
1282 0.443593175238725103199992213492640,
1283 0.373706088715419560672548177024927,
1284 0.301627868114913004320555356858592,
1285 0.227785851141645078080496195368575,
1286 0.152605465240922675505220241022678,
1287 0.076526521133497333754640409398838,
1288 0.000000000000000000000000000000000
1296 0.017614007139152118311861962351853,
1297 0.040601429800386941331039952274932,
1298 0.062672048334109063569506535187042,
1299 0.083276741576704748724758143222046,
1300 0.101930119817240435036750135480350,
1301 0.118194531961518417312377377711382,
1302 0.131688638449176626898494499748163,
1303 0.142096109318382051329298325067165,
1304 0.149172986472603746787828737001969,
1305 0.152753387130725850698084331955098
1310 0.003073583718520531501218293246031,
1311 0.008600269855642942198661787950102,
1312 0.014626169256971252983787960308868,
1313 0.020388373461266523598010231432755,
1314 0.025882133604951158834505067096153,
1315 0.031287306777032798958543119323801,
1316 0.036600169758200798030557240707211,
1317 0.041668873327973686263788305936895,
1318 0.046434821867497674720231880926108,
1319 0.050944573923728691932707670050345,
1320 0.055195105348285994744832372419777,
1321 0.059111400880639572374967220648594,
1322 0.062653237554781168025870122174255,
1323 0.065834597133618422111563556969398,
1324 0.068648672928521619345623411885368,
1325 0.071054423553444068305790361723210,
1326 0.073030690332786667495189417658913,
1327 0.074582875400499188986581418362488,
1328 0.075704497684556674659542775376617,
1329 0.076377867672080736705502835038061,
1330 0.076600711917999656445049901530102
1335 double *
result,
double *abserr,
1336 double *resabs,
double *resasc)
1338 double fv1[21], fv2[21];
1340 gsl_integration_qk (21,
xgkD,
wgD,
wgkD, fv1, fv2,
f,
a,
b,
result, abserr, resabs, resasc);
1349 0.999262104992609834193457486540341,
1350 0.995556969790498097908784946893902,
1351 0.988035794534077247637331014577406,
1352 0.976663921459517511498315386479594,
1353 0.961614986425842512418130033660167,
1354 0.942974571228974339414011169658471,
1355 0.920747115281701561746346084546331,
1356 0.894991997878275368851042006782805,
1357 0.865847065293275595448996969588340,
1358 0.833442628760834001421021108693570,
1359 0.797873797998500059410410904994307,
1360 0.759259263037357630577282865204361,
1361 0.717766406813084388186654079773298,
1362 0.673566368473468364485120633247622,
1363 0.626810099010317412788122681624518,
1364 0.577662930241222967723689841612654,
1365 0.526325284334719182599623778158010,
1366 0.473002731445714960522182115009192,
1367 0.417885382193037748851814394594572,
1368 0.361172305809387837735821730127641,
1369 0.303089538931107830167478909980339,
1370 0.243866883720988432045190362797452,
1371 0.183718939421048892015969888759528,
1372 0.122864692610710396387359818808037,
1373 0.061544483005685078886546392366797,
1374 0.000000000000000000000000000000000
1382 0.011393798501026287947902964113235,
1383 0.026354986615032137261901815295299,
1384 0.040939156701306312655623487711646,
1385 0.054904695975835191925936891540473,
1386 0.068038333812356917207187185656708,
1387 0.080140700335001018013234959669111,
1388 0.091028261982963649811497220702892,
1389 0.100535949067050644202206890392686,
1390 0.108519624474263653116093957050117,
1391 0.114858259145711648339325545869556,
1392 0.119455763535784772228178126512901,
1393 0.122242442990310041688959518945852,
1394 0.123176053726715451203902873079050
1399 0.001987383892330315926507851882843,
1400 0.005561932135356713758040236901066,
1401 0.009473973386174151607207710523655,
1402 0.013236229195571674813656405846976,
1403 0.016847817709128298231516667536336,
1404 0.020435371145882835456568292235939,
1405 0.024009945606953216220092489164881,
1406 0.027475317587851737802948455517811,
1407 0.030792300167387488891109020215229,
1408 0.034002130274329337836748795229551,
1409 0.037116271483415543560330625367620,
1410 0.040083825504032382074839284467076,
1411 0.042872845020170049476895792439495,
1412 0.045502913049921788909870584752660,
1413 0.047982537138836713906392255756915,
1414 0.050277679080715671963325259433440,
1415 0.052362885806407475864366712137873,
1416 0.054251129888545490144543370459876,
1417 0.055950811220412317308240686382747,
1418 0.057437116361567832853582693939506,
1419 0.058689680022394207961974175856788,
1420 0.059720340324174059979099291932562,
1421 0.060539455376045862945360267517565,
1422 0.061128509717053048305859030416293,
1423 0.061471189871425316661544131965264,
1424 0.061580818067832935078759824240066
1431 double *
result,
double *abserr,
1432 double *resabs,
double *resasc)
1434 double fv1[26], fv2[26];
1436 gsl_integration_qk (26,
xgkE,
wgE,
wgkE, fv1, fv2,
f,
a,
b,
result, abserr, resabs, resasc);
1445 0.999484410050490637571325895705811,
1446 0.996893484074649540271630050918695,
1447 0.991630996870404594858628366109486,
1448 0.983668123279747209970032581605663,
1449 0.973116322501126268374693868423707,
1450 0.960021864968307512216871025581798,
1451 0.944374444748559979415831324037439,
1452 0.926200047429274325879324277080474,
1453 0.905573307699907798546522558925958,
1454 0.882560535792052681543116462530226,
1455 0.857205233546061098958658510658944,
1456 0.829565762382768397442898119732502,
1457 0.799727835821839083013668942322683,
1458 0.767777432104826194917977340974503,
1459 0.733790062453226804726171131369528,
1460 0.697850494793315796932292388026640,
1461 0.660061064126626961370053668149271,
1462 0.620526182989242861140477556431189,
1463 0.579345235826361691756024932172540,
1464 0.536624148142019899264169793311073,
1465 0.492480467861778574993693061207709,
1466 0.447033769538089176780609900322854,
1467 0.400401254830394392535476211542661,
1468 0.352704725530878113471037207089374,
1469 0.304073202273625077372677107199257,
1470 0.254636926167889846439805129817805,
1471 0.204525116682309891438957671002025,
1472 0.153869913608583546963794672743256,
1473 0.102806937966737030147096751318001,
1474 0.051471842555317695833025213166723,
1475 0.000000000000000000000000000000000
1483 0.007968192496166605615465883474674,
1484 0.018466468311090959142302131912047,
1485 0.028784707883323369349719179611292,
1486 0.038799192569627049596801936446348,
1487 0.048402672830594052902938140422808,
1488 0.057493156217619066481721689402056,
1489 0.065974229882180495128128515115962,
1490 0.073755974737705206268243850022191,
1491 0.080755895229420215354694938460530,
1492 0.086899787201082979802387530715126,
1493 0.092122522237786128717632707087619,
1494 0.096368737174644259639468626351810,
1495 0.099593420586795267062780282103569,
1496 0.101762389748405504596428952168554,
1497 0.102852652893558840341285636705415
1502 0.001389013698677007624551591226760,
1503 0.003890461127099884051267201844516,
1504 0.006630703915931292173319826369750,
1505 0.009273279659517763428441146892024,
1506 0.011823015253496341742232898853251,
1507 0.014369729507045804812451432443580,
1508 0.016920889189053272627572289420322,
1509 0.019414141193942381173408951050128,
1510 0.021828035821609192297167485738339,
1511 0.024191162078080601365686370725232,
1512 0.026509954882333101610601709335075,
1513 0.028754048765041292843978785354334,
1514 0.030907257562387762472884252943092,
1515 0.032981447057483726031814191016854,
1516 0.034979338028060024137499670731468,
1517 0.036882364651821229223911065617136,
1518 0.038678945624727592950348651532281,
1519 0.040374538951535959111995279752468,
1520 0.041969810215164246147147541285970,
1521 0.043452539701356069316831728117073,
1522 0.044814800133162663192355551616723,
1523 0.046059238271006988116271735559374,
1524 0.047185546569299153945261478181099,
1525 0.048185861757087129140779492298305,
1526 0.049055434555029778887528165367238,
1527 0.049795683427074206357811569379942,
1528 0.050405921402782346840893085653585,
1529 0.050881795898749606492297473049805,
1530 0.051221547849258772170656282604944,
1531 0.051426128537459025933862879215781,
1532 0.051494729429451567558340433647099
1537 double *
result,
double *abserr,
1538 double *resabs,
double *resasc)
1540 double fv1[31], fv2[31];
1542 gsl_integration_qk (31,
xgkF,
wgF,
wgkF, fv1, fv2,
f,
a,
b,
result, abserr, resabs, resasc);
1552 GSL_ERROR_VAL (
"workspace length n must be positive integer",
1561 GSL_ERROR_VAL (
"failed to allocate space for workspace struct",
1565 w->alist = (
double *)
malloc (
n *
sizeof (
double));
1567 if (
w->alist ==
nullptr)
1575 w->blist = (
double *)
malloc (
n *
sizeof (
double));
1577 if (
w->blist ==
nullptr)
1586 w->rlist = (
double *)
malloc (
n *
sizeof (
double));
1588 if (
w->rlist ==
nullptr)
1599 w->elist = (
double *)
malloc (
n *
sizeof (
double));
1601 if (
w->elist ==
nullptr)
1612 w->order = (
size_t *)
malloc (
n *
sizeof (
size_t));
1614 if (
w->order ==
nullptr)
1626 w->level = (
size_t *)
malloc (
n *
sizeof (
size_t));
1628 if (
w->level ==
nullptr)
1643 w->maximum_level = 0 ;
1669 workspace->
nrmax = 0;
1670 workspace->
i = workspace->
order[0] ;
1686 int id = workspace->
nrmax;
1689 const size_t * level = workspace->
level;
1690 const size_t * order = workspace->
order;
1692 size_t limit = workspace->
limit ;
1693 size_t last = workspace->
size - 1 ;
1695 if (last > (1 + limit / 2))
1697 jupbnd = limit + 1 - last;
1704 for (k =
id; k <= jupbnd; k++)
1706 size_t i_max = order[workspace->
nrmax];
1708 workspace->
i = i_max ;
1724 size_t i = workspace->
i ;
1725 const size_t * level = workspace->
level;
1788 double *epstab = table->
rlist2;
1789 double *res3la = table->
res3la;
1790 const size_t n = table->
n - 1;
1792 const double current = epstab[
n];
1797 const size_t newelm =
n / 2;
1798 const size_t n_orig =
n;
1802 const size_t nres_orig = table->
nres;
1814 epstab[
n + 2] = epstab[
n];
1817 for (i = 0; i < newelm; i++)
1819 double res = epstab[
n - 2 * i + 2];
1820 double e0 = epstab[
n - 2 * i - 2];
1821 double e1 = epstab[
n - 2 * i - 1];
1824 double e1abs = std::abs(e1);
1825 double delta2 = e2 - e1;
1826 double err2 = std::abs(delta2);
1828 double delta3 = e1 - e0;
1829 double err3 = std::abs(delta3);
1832 double e3, delta1, err1, tol1, ss;
1834 if (err2 <= tol2 && err3 <= tol3)
1840 absolute = err2 + err3;
1846 e3 = epstab[
n - 2 * i];
1847 epstab[
n - 2 * i] = e1;
1849 err1 = std::abs(delta1);
1855 if (err1 <= tol1 || err2 <= tol2 || err3 <= tol3)
1861 ss = (1 / delta1 + 1 / delta2) - 1 / delta3;
1867 if (std::abs(ss * e1) <= 0.0001)
1877 epstab[
n - 2 * i] = res;
1880 const double error = err2 + std::abs(res - e2) + err3;
1882 if (error <= *abserr)
1893 const size_t limexp = 50 - 1;
1895 if (n_final == limexp)
1897 n_final = 2 * (limexp / 2);
1901 if (n_orig % 2 == 1)
1903 for (i = 0; i <= newelm; i++)
1905 epstab[1 + i * 2] = epstab[i * 2 + 3];
1910 for (i = 0; i <= newelm; i++)
1912 epstab[i * 2] = epstab[i * 2 + 2];
1916 if (n_orig != n_final)
1918 for (i = 0; i <= n_final; i++)
1920 epstab[i] = epstab[n_orig - n_final + i];
1924 table->
n = n_final + 1;
1928 res3la[nres_orig] = *
result;
1933 *abserr = (std::abs(*
result - res3la[2]) + std::abs(*
result - res3la[1])
1934 + std::abs(*
result - res3la[0]));
1936 res3la[0] = res3la[1];
1937 res3la[1] = res3la[2];
1947 table->
nres = nres_orig + 1;
1971 b,
const double epsabs,
const double epsrel,
const size_t limit,
1978 double epsabs,
double epsrel,
size_t limit,
1980 double *
result,
double * abserr)
1982 int status =
qags (
f,
a,
b, epsabs, epsrel, limit,
1996static double i_transform (
double t,
void *params);
2000 double epsabs,
double epsrel,
size_t limit,
2002 double *
result,
double *abserr)
2011 status =
qags (&f_transform, 0.0, 1.0,
2012 epsabs, epsrel, limit,
2024 double x = (1 - t) / t;
2044 double epsabs,
double epsrel,
size_t limit,
2046 double *
result,
double *abserr)
2053 transform_params.
b =
b ;
2054 transform_params.
f =
f ;
2057 f_transform.
params = &transform_params;
2059 status =
qags (&f_transform, 0.0, 1.0,
2060 epsabs, epsrel, limit,
2074 double x =
b - (1 - t) / t;
2093 double epsabs,
double epsrel,
size_t limit,
2095 double *
result,
double *abserr)
2102 transform_params.
a =
a ;
2103 transform_params.
f =
f ;
2106 f_transform.
params = &transform_params;
2108 status =
qags (&f_transform, 0.0, 1.0,
2109 epsabs, epsrel, limit,
2123 double x =
a + (1 - t) / t;
2132 const double a,
const double b,
2133 const double epsabs,
const double epsrel,
2136 double *
result,
double *abserr,
2139 double area, errsum;
2140 double res_ext, err_ext;
2141 double result0, abserr0, resabs0, resasc0;
2145 double error_over_large_intervals = 0;
2146 double reseps = 0, abseps = 0, correc = 0;
2148 int roundoff_type1 = 0, roundoff_type2 = 0, roundoff_type3 = 0;
2149 int error_type = 0, error_type2 = 0;
2151 size_t iteration = 0;
2153 int positive_integrand = 0;
2154 int extrapolate = 0;
2155 int disallow_extrapolation = 0;
2166 if (limit > workspace->
limit)
2173 if (epsabs <= 0 && (epsrel < 50 *
GSL_DBL_EPSILON || epsrel < 0.5e-28))
2175 GSL_ERROR (
"tolerance cannot be achieved with given epsabs and epsrel",
2181 q (
f,
a,
b, &result0, &abserr0, &resabs0, &resasc0);
2185 tolerance =
GSL_MAX_DBL (epsabs, epsrel * std::abs(result0));
2187 if (abserr0 <= 100 * GSL_DBL_EPSILON * resabs0 && abserr0 > tolerance)
2192 GSL_ERROR (
"cannot reach tolerance because of roundoff error"
2195 else if ((abserr0 <= tolerance && abserr0 != resasc0) || abserr0 == 0.0)
2202 else if (limit == 1)
2227 size_t current_level;
2228 double a1, b1, a2, b2;
2229 double a_i, b_i, r_i, e_i;
2230 double area1 = 0, area2 = 0, area12 = 0;
2231 double error1 = 0, error2 = 0, error12 = 0;
2232 double resasc1, resasc2;
2233 double resabs1, resabs2;
2238 retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
2240 current_level = workspace->
level[workspace->
i] + 1;
2243 b1 = 0.5 * (a_i + b_i);
2249 q (
f, a1, b1, &area1, &error1, &resabs1, &resasc1);
2250 q (
f, a2, b2, &area2, &error2, &resabs2, &resasc2);
2252 area12 = area1 + area2;
2253 error12 = error1 + error2;
2263 errsum = errsum + error12 - e_i;
2264 area = area + area12 - r_i;
2266 tolerance =
GSL_MAX_DBL (epsabs, epsrel * std::abs(area));
2268 if (resasc1 != error1 && resasc2 != error2)
2270 double delta = r_i - area12;
2272 if (std::abs(delta) <= 1.0e-5 * std::abs(area12) && error12 >= 0.99 * e_i)
2283 if (iteration > 10 && error12 > e_i)
2291 if (roundoff_type1 + roundoff_type2 >= 10 || roundoff_type3 >= 20)
2296 if (roundoff_type2 >= 5)
2311 update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
2313 if (errsum <= tolerance)
2315 goto compute_result;
2323 if (iteration >= limit - 1)
2331 error_over_large_intervals = errsum;
2337 if (disallow_extrapolation)
2342 error_over_large_intervals += -last_e_i;
2344 if (current_level < workspace->maximum_level)
2346 error_over_large_intervals += error12;
2358 workspace->
nrmax = 1;
2361 if (!error_type2 && error_over_large_intervals > ertest)
2371 qelg (&table, &reseps, &abseps);
2375 if (ktmin > 5 && err_ext < 0.001 * errsum)
2380 if (abseps < err_ext)
2385 correc = error_over_large_intervals;
2386 ertest =
GSL_MAX_DBL (epsabs, epsrel * std::abs(reseps));
2387 if (err_ext <= ertest)
2395 disallow_extrapolation = 1;
2398 if (error_type == 5)
2407 error_over_large_intervals = errsum;
2410 while (iteration < limit);
2416 goto compute_result;
2418 if (error_type || error_type2)
2428 if (res_ext != 0.0 && area != 0.0)
2430 if (err_ext / std::abs(res_ext) > errsum / std::abs(area))
2431 goto compute_result;
2433 else if (err_ext > errsum)
2435 goto compute_result;
2437 else if (area == 0.0)
2446 double max_area =
GSL_MAX_DBL (std::abs(res_ext), std::abs(area));
2448 if (!positive_integrand && max_area < 0.01 * resabs0)
2453 double ratio = res_ext / area;
2455 if (ratio < 0.01 || ratio > 100.0 || errsum > std::abs(area))
2473 if (error_type == 0)
2477 else if (error_type == 1)
2481 else if (error_type == 2)
2483 GSL_ERROR (
"cannot reach tolerance because of roundoff error",
2486 else if (error_type == 3)
2488 GSL_ERROR (
"bad integrand behavior found in the integration interval",
2491 else if (error_type == 4)
2493 GSL_ERROR (
"roundoff error detected in the extrapolation table",
2496 else if (error_type == 5)
2498 GSL_ERROR (
"integral is divergent, or slowly convergent",
static void update(gsl_integration_workspace *workspace, double a1, double b1, double area1, double error1, double a2, double b2, double area2, double error2)
void gsl_integration_qk61(const gsl_function *f, double a, double b, double *result, double *abserr, double *resabs, double *resasc)
gsl_integration_workspace * gsl_integration_workspace_alloc(const size_t n)
static int increase_nrmax(gsl_integration_workspace *workspace)
static double rescale_error(double err, const double result_abs, const double result_asc)
void gsl_integration_qk51(const gsl_function *f, double a, double b, double *result, double *abserr, double *resabs, double *resasc)
static void retrieve(const gsl_integration_workspace *workspace, double *a, double *b, double *r, double *e)
static void set_initial_result(gsl_integration_workspace *workspace, double result, double error)
static const double wgD[11]
static void qelg(struct extrapolation_table *table, double *result, double *abserr)
static double il_transform(double t, void *params)
void gsl_integration_qk(const int n, const double xgk[], const double wg[], const double wgk[], double fv1[], double fv2[], const gsl_function *f, double a, double b, double *result, double *abserr, double *resabs, double *resasc)
static void initialise_table(struct extrapolation_table *table)
static const double wgC[8]
static int test_positivity(double result, double resabs)
static const double wgkE[26]
static const double wgkB[11]
static int large_interval(gsl_integration_workspace *workspace)
static const double wgkF[31]
static void qpsrt(gsl_integration_workspace *workspace)
#define GSL_ERROR_VAL(reason, gsl_errno, value)
double GSL_MAX_DBL(double a, double b)
static const double wgB[5]
double RooAdaptiveGaussKronrodIntegrator1D_GSL_GlueFunction(double x, void *data)
Glue function interacing to GSL code.
static int qag(const gsl_function *f, const double a, const double b, const double epsabs, const double epsrel, const size_t limit, gsl_integration_workspace *workspace, double *result, double *abserr, gsl_integration_rule *q)
static const double xgkE[26]
int gsl_integration_qagil(gsl_function *f, double b, double epsabs, double epsrel, size_t limit, gsl_integration_workspace *workspace, double *result, double *abserr)
static Roo_reg_AGKInteg1D instance
int gsl_integration_qag(const gsl_function *f, double a, double b, double epsabs, double epsrel, size_t limit, int key, gsl_integration_workspace *workspace, double *result, double *abserr)
static void reset_nrmax(gsl_integration_workspace *workspace)
#define GSL_COERCE_DBL(x)
static const double wgkC[16]
static const double xgkA[8]
static const double wgF[15]
void gsl_integration_qk21(const gsl_function *f, double a, double b, double *result, double *abserr, double *resabs, double *resasc)
int gsl_integration_qagi(gsl_function *f, double epsabs, double epsrel, size_t limit, gsl_integration_workspace *workspace, double *result, double *abserr)
void gsl_integration_rule(const gsl_function *f, double a, double b, double *result, double *abserr, double *defabs, double *resabs)
static int qags(const gsl_function *f, const double a, const double b, const double epsabs, const double epsrel, const size_t limit, gsl_integration_workspace *workspace, double *result, double *abserr, gsl_integration_rule *q)
static double sum_results(const gsl_integration_workspace *workspace)
void gsl_integration_qk15(const gsl_function *f, double a, double b, double *result, double *abserr, double *resabs, double *resasc)
static int subinterval_too_small(double a1, double a2, double b2)
int gsl_integration_qagiu(gsl_function *f, double a, double epsabs, double epsrel, size_t limit, gsl_integration_workspace *workspace, double *result, double *abserr)
static const double xgkD[21]
static const double wgA[4]
void gsl_integration_qk41(const gsl_function *f, double a, double b, double *result, double *abserr, double *resabs, double *resasc)
void gsl_integration_qcheb(gsl_function *f, double a, double b, double *cheb12, double *cheb24)
static const double wgkD[21]
void gsl_integration_workspace_free(gsl_integration_workspace *w)
int gsl_integration_qags(const gsl_function *f, double a, double b, double epsabs, double epsrel, size_t limit, gsl_integration_workspace *workspace, double *result, double *abserr)
#define GSL_FN_EVAL(F, x)
static const double xgkF[31]
static const double wgE[13]
static double i_transform(double t, void *params)
double gsl_coerce_double(const double x)
void gsl_integration_qk31(const gsl_function *f, double a, double b, double *result, double *abserr, double *resabs, double *resasc)
static double iu_transform(double t, void *params)
static const double xgkC[16]
static void append_table(struct extrapolation_table *table, double y)
static const double xgkB[11]
static const double wgkA[8]
static void initialise(gsl_integration_workspace *workspace, double a, double b)
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
double getRealValue(const char *name, double defVal=0.0, bool verbose=false) const
Get value of a RooAbsReal stored in set with given name.
Int_t getCatIndex(const char *name, Int_t defVal=0, bool verbose=false) const
Get index value of a RooAbsCategory stored in set with given name.
Abstract interface for evaluating a real-valued function of one real variable and performing numerica...
virtual double getMaxLimit(UInt_t dimension) const =0
virtual double getMinLimit(UInt_t dimension) const =0
UInt_t getDimension() const
Abstract interface for integrators of real-valued functions that implement the RooAbsFunc interface.
bool isValid() const
Is integrator in valid state.
const RooAbsFunc * _function
Pointer to function binding of integrand.
const RooAbsFunc * integrand() const
Return integrand function binding.
bool _valid
Is integrator in valid state?
RooAdaptiveGaussKronrodIntegrator1D implements the Gauss-Kronrod integration algorithm.
double integral(const double *yvec=nullptr) override
Calculate and return integral at at given parameter values.
RooAdaptiveGaussKronrodIntegrator1D(const RooAbsFunc &function, const RooNumIntConfig &config)
Constructor taking a function binding and a configuration object.
bool initialize()
Initialize integrator allocate buffers and setup GSL workspace.
double _epsAbs
Current coordinate.
bool setLimits(double *xmin, double *xmax) override
Change our integration limits.
bool checkLimits() const override
Check that our integration range is finite and otherwise return false.
friend double RooAdaptiveGaussKronrodIntegrator1D_GSL_GlueFunction(double x, void *data)
Glue function interacing to GSL code.
~RooAdaptiveGaussKronrodIntegrator1D() override
Destructor.
double _xmax
Lower integration bound.
static void registerIntegrator(RooNumIntFactory &fact)
Register this class with RooNumIntConfig as a possible choice of numeric integrator for one-dimension...
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Object to represent discrete states.
bool setIndex(Int_t index, bool printError=true) override
Set value by specifying the index code of the desired state.
bool defineType(const std::string &label)
Define a state with given name.
RooNumIntConfig holds the configuration parameters of the various numeric integrators used by RooReal...
const RooArgSet & getConfigSection(const char *name) const
Retrieve configuration information specific to integrator with given name.
RooNumIntFactory is a factory to instantiate numeric integrators from a given function binding and a ...
static RooNumIntFactory & instance()
Static method returning reference to singleton instance of factory.
bool registerPlugin(std::string const &name, Creator const &creator, const RooArgSet &defConfig, bool canIntegrate1D, bool canIntegrate2D, bool canIntegrateND, bool canIntegrateOpenEnded, const char *depName="")
Method accepting registration of a prototype numeric integrator along with a RooArgSet of its default...
static constexpr int isInfinite(double x)
Return true if x is infinite by RooNumber internal specification.
RooRealVar represents a variable that can be changed from the outside.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
double(* function)(double x, void *params)