466 "qsys_mmapgk1_lcfspr requires transcendental arithmetic");
467 using namespace mmapgk1detail;
471 throw InputError(
"qsys_mmapgk1_lcfspr: The MMAP must carry at least one marked arrival block.");
472 const std::size_t K = MMAP.size() - 2;
474 throw InputError(
"qsys_mmapgk1_lcfspr: One service law per marked type is required (" +
475 std::to_string(svc.size()) +
" given, " + std::to_string(K) +
" types).");
476 const std::size_t quad =
opt.quadNodes;
477 const double tol =
opt.tol;
479 const std::size_t ma = D0.
rows();
481 const std::vector<T> e(ma, one);
482 std::vector<Matrix<T> > Dk;
484 for (std::size_t k = 0; k < K; ++k) {
485 Dk.push_back(MMAP[k + 2]);
486 for (std::size_t i = 0; i < ma; ++i)
487 for (std::size_t j = 0; j < ma; ++j) Dsum(i, j) += Dk[k](i, j);
490 const std::vector<T> piArr = stat_left_null(Dsum);
491 std::vector<T> lambdas(K, zero), meanS(K, zero);
493 for (std::size_t k = 0; k < K; ++k) {
494 const std::vector<T> De =
mulvec(Dk[k], e);
496 for (std::size_t i = 0; i < ma; ++i) lam += piArr[i] * De[i];
498 meanS[k] = raw_moment(svc[k], 1);
499 rho += lam * meanS[k];
504 throw InputError(std::string(
"qsys_mmapgk1_lcfspr: The load ") + buf +
505 " of the system is not below one.");
510 std::vector<Matrix<T> > FQ(K);
511 for (std::size_t it = 0; it < 10000; ++it) {
513 for (std::size_t k = 0; k < K; ++k) {
514 FQ[k] = matrix_lst(svc[k], Q, quad);
516 for (std::size_t i = 0; i < ma; ++i)
517 for (std::size_t j = 0; j < ma; ++j) Qnew(i, j) += P(i, j);
520 for (std::size_t i = 0; i < ma; ++i)
521 for (std::size_t j = 0; j < ma; ++j)
524 if (diff <= tol)
break;
528 for (std::size_t i = 0; i < ma; ++i) {
530 for (std::size_t j = 0; j < ma; ++j) rowsum += Q(i, j);
533 for (std::size_t k = 0; k < K; ++k) FQ[k] = matrix_lst(svc[k], Q, quad);
534 const std::vector<T> kappa = stat_left_null(Q);
538 for (std::size_t i = 0; i < ma; ++i)
539 for (std::size_t j = 0; j < ma; ++j) ekQ(i, j) = kappa[j] - Q(i, j);
541 std::vector<Matrix<T> > Rk(K);
543 for (std::size_t k = 0; k < K; ++k) {
544 const std::vector<T> De =
mulvec(Dk[k], e);
546 for (std::size_t i = 0; i < ma; ++i)
547 for (std::size_t j = 0; j < ma; ++j) IF(i, j) -= FQ[k](i, j);
549 for (std::size_t i = 0; i < ma; ++i)
550 for (std::size_t j = 0; j < ma; ++j) Bk(i, j) += De[i] * meanS[k] * kappa[j];
552 for (std::size_t i = 0; i < ma; ++i)
553 for (std::size_t j = 0; j < ma; ++j) R(i, j) += Rk[k](i, j);
556 for (std::size_t i = 0; i < ma; ++i)
557 for (std::size_t j = 0; j < ma; ++j) IR(i, j) -= R(i, j);
564 for (std::size_t k = 0; k < K; ++k) {
565 const std::vector<T> v =
vecmul(piArr, Rk[k]);
567 for (std::size_t i = 0; i < ma; ++i) q += v[i] * IRinve[i];
568 if (q < zero) q = zero;
575 const std::size_t nMax =
static_cast<std::size_t
>(
opt.nMax);
576 std::vector<T> y0(ma, zero);
577 for (std::size_t i = 0; i < ma; ++i) y0[i] = (one - rho) * kappa[i];
579 std::vector<T> v = y0;
580 for (std::size_t n = 0; n <= nMax; ++n) {
582 for (std::size_t i = 0; i < ma; ++i) s += v[i];
587 for (std::size_t k = 0; k < K; ++k) {
589 for (std::size_t i = 0; i < ma; ++i)
590 for (std::size_t j = 0; j < ma; ++j) M(i, j) += Rk[k](i, j);
592 const std::vector<T> Ake =
mulvec(Ak, e);
595 for (std::size_t m = 0; m <= nMax; ++m) {
597 for (std::size_t i = 0; i < ma; ++i) s += v[i] * Ake[i];
604 const std::vector<MmapGk1Service<T> > svcCopy = svc;
605 r.
respLST = [D0, Dk, svcCopy, piArr, lambdas, quad, tol](cdbl s) {
610 if (!
opt.wPoints.empty()) {
611 r.
respCDF.assign(K, std::vector<T>(
opt.wPoints.size(), zero));
612 for (std::size_t it = 0; it <
opt.wPoints.size(); ++it) {
614 for (std::size_t k = 0; k < K; ++k) {
615 const auto& lstAll = r.
respLST;
616 const std::function<cdbl(cdbl)> f = [&lstAll, k](cdbl s) {
return lstAll(s)[k]; };
625 for (std::size_t k = 0; k < K; ++k) r.
arrivalRate += lambdas[k];
631 r.
analyzer =
"LINE:MMAP[" + std::to_string(K) +
"]/G[" + std::to_string(K) +
"]/1-LCFSPR";