416 using namespace aoi_detail;
417 const std::size_t k = Tm.
cols(), l = Sm.
cols();
418 if (k == 0 || l == 0)
throw InputError(
"aoi_solve_bufferless: empty representation");
419 if (tau.size() != k || sigma.size() != l)
420 throw InputError(
"aoi_solve_bufferless: the initial vectors do not match their generators");
421 const std::size_t z = 2 * k * l + k + 1, a = 1, b = z - 1;
423 std::vector<double> kappa(k, 0.0), nu(l, 0.0);
424 for (std::size_t i = 0; i < k; ++i)
425 for (std::size_t j = 0; j < k; ++j) kappa[i] -= Tm(i, j);
426 for (std::size_t i = 0; i < l; ++i)
427 for (std::size_t j = 0; j < l; ++j) nu[i] -= Sm(i, j);
439 for (std::size_t i = 0; i < k * l; ++i)
440 for (std::size_t j = 0; j < k * l; ++j) Q11(i, j) += t2(i, j) + (1.0 - p) * t3(i, j);
445 for (std::size_t i = 0; i < k * l; ++i)
446 for (std::size_t j = 0; j < k * l; ++j) Q33(i, j) += p * t4(i, j);
454 for (std::size_t i = 0; i < k * l; ++i) Q(i, z - 1) = p * lastcol(i, 0);
456 put(Q, k * l, k * l, Tm);
458 put(Q, k * l + k, k * l + k, Q33);
461 for (std::size_t i = 0; i < k * l; ++i) Q(k * l + k + i, z - 1) = lastcol(i, 0);
465 Rd(z - 1, z - 1) = -1.0;
469 for (std::size_t j = 0; j < k * l; ++j) Qtil(z - 1, j) = ts(0, j);
470 Qtil(z - 1, z - 1) = -1.0;
474 for (std::size_t i = 0; i < z; ++i) QR(i, z - 1) = -QR(i, z - 1);
476 const AlgOneSplit s = alg_one(QR, householder_p(z), Rd, Qtil, a);
482 std::vector<double> sel(z, 0.0);
483 for (std::size_t i = k * l; i < k * l + k * l + k; ++i) sel[i] = 1.0;
484 std::vector<double> h(b, 0.0);
485 for (std::size_t i = 0; i < b; ++i)
486 for (std::size_t j = 0; j < z; ++j) h[i] += s.H(i, j) * sel[j];
487 out.
aoi = finish_me(s.g, s.A, h);
489 std::vector<double> selp(z, 0.0);
492 for (std::size_t i = 0; i < k * l; ++i) selp[k * l + k + i] = kn(i, 0);
494 std::vector<double> hp(b, 0.0);
495 for (std::size_t i = 0; i < b; ++i)
496 for (std::size_t j = 0; j < z; ++j) hp[i] += s.H(i, j) * selp[j];
497 out.
paoi = finish_me(s.g, s.A, hp);
514 using namespace aoi_detail;
515 const std::size_t l = Sm.
cols();
516 if (l == 0)
throw InputError(
"aoi_solve_singlebuffer: empty representation");
517 if (sigma.size() != l)
518 throw InputError(
"aoi_solve_singlebuffer: sigma does not match its generator");
519 if (!(lambda > 0.0))
throw InputError(
"aoi_solve_singlebuffer: the arrival rate must be positive");
521 std::vector<double> nu(l, 0.0);
522 for (std::size_t i = 0; i < l; ++i)
523 for (std::size_t j = 0; j < l; ++j) nu[i] -= Sm(i, j);
527 std::size_t z = l + 2;
528 const std::size_t a1 = 2, b1 = l;
531 for (std::size_t i = 0; i < l; ++i) Q(i, l) = nu[i];
533 Q(l, l + 1) = lambda;
536 Rd(z - 2, z - 2) = -1.0;
537 Rd(z - 1, z - 1) = -1.0;
540 for (std::size_t j = 0; j < l; ++j) {
541 Qtil(l, j) = lambda * sigma[j];
542 Qtil(l + 1, j) = sigma[j];
544 Qtil(l, l) = -lambda;
545 Qtil(l + 1, l + 1) = -1.0;
548 for (std::size_t i = 0; i < z; ++i) {
549 QR(i, z - 2) = -QR(i, z - 2);
550 QR(i, z - 1) = -QR(i, z - 1);
554 std::vector<double> pik;
557 for (std::size_t i = 0; i < z; ++i)
558 for (std::size_t j = 0; j < z; ++j) Aug(i, j) = Q(i, j) + 1.0;
559 pik = rdivide(std::vector<double>(z, 1.0), Aug);
564 std::vector<double> xR(z, 0.0);
565 for (std::size_t i = 0; i < z; ++i)
566 for (std::size_t j = 0; j < z; ++j) xR[i] += Rd(i, j);
568 for (std::size_t i = 0; i < z; ++i) den += pik[i] * xR[i];
569 for (std::size_t i = 0; i < z; ++i)
570 for (std::size_t j = 0; j < z; ++j) A1(i, j) += xR[i] * pik[j] / den;
576 std::vector<double> key(z, 0.0);
577 for (std::size_t i = 0; i < z; ++i) key[i] = (sc.
T(i, i) >= 0.0) ? 1.0 : 0.0;
581 const AlgOneSplit s1 = alg_one(QR, P, Rd, Qtil, a1);
582 const double c_0 = s1.d.empty() ? 0.0 : s1.d[0];
586 for (std::size_t i = 0; i < b1; ++i) wait_A(i, i) -= r * lambda;
587 std::vector<double> selw(z, 0.0);
590 std::vector<double> wait_H(b1, 0.0);
591 for (std::size_t i = 0; i < b1; ++i)
592 for (std::size_t j = 0; j < z; ++j) wait_H[i] += s1.H(i, j) * selw[j];
593 std::vector<double> wait_g = s1.g;
595 const double n1 = 1.0 / (-moment_form(wait_g, wait_A, wait_H, 1) + c_0);
596 for (std::size_t i = 0; i < b1; ++i) wait_g[i] *= n1;
598 const std::vector<double> Mdiag = [&]() {
599 std::vector<double> y =
solve(wait_A, wait_H);
600 for (std::size_t i = 0; i < y.size(); ++i) y[i] = -y[i];
604 for (std::size_t i = 0; i < l; ++i)
605 for (std::size_t j = 0; j < l; ++j) B(i, j) = wait_A(i, j) * Mdiag[j] / Mdiag[i];
606 std::vector<double> beta(l, 0.0);
607 for (std::size_t i = 0; i < l; ++i) beta[i] = wait_g[i] * Mdiag[i];
609 for (std::size_t i = 0; i < l; ++i) beta_0 -= beta[i];
610 std::vector<double> psi(l, 0.0);
611 for (std::size_t i = 0; i < l; ++i)
612 for (std::size_t j = 0; j < l; ++j) psi[i] -= B(i, j);
616 const std::size_t a2 = 1, b2 = z - 1;
619 put(Q2, 0, l,
mam::kron(col(psi), sigr));
620 for (std::size_t i = 0; i < l; ++i) {
621 for (std::size_t j = 0; j < l; ++j) {
622 Q2(l + i, l + j) = Sm(i, j) - (i == j ? lambda : 0.0);
623 Q2(l + i, 2 * l + j) = (i == j) ? lambda : 0.0;
624 Q2(2 * l + i, 2 * l + j) = Sm(i, j);
625 Q2(3 * l + 1 + i, 3 * l + 1 + j) = Sm(i, j);
627 Q2(l + i, 3 * l) = nu[i];
628 Q2(3 * l + 1 + i, z - 1) = nu[i];
630 put(Q2, 2 * l, 3 * l + 1,
mam::kron(nuc, sigr));
631 Q2(3 * l, 3 * l) = -lambda;
632 for (std::size_t j = 0; j < l; ++j) Q2(3 * l, 3 * l + 1 + j) = lambda * sigma[j];
635 Rd2(z - 1, z - 1) = -1.0;
637 for (std::size_t j = 0; j < l; ++j) {
638 Qtil2(z - 1, j) = beta[j];
639 Qtil2(z - 1, l + j) = beta_0 * sigma[j];
641 Qtil2(z - 1, z - 1) = -1.0;
643 for (std::size_t i = 0; i < z; ++i) QR2(i, z - 1) = -QR2(i, z - 1);
645 const AlgOneSplit s2 = alg_one(QR2, householder_p(z), Rd2, Qtil2, a2);
650 std::vector<double> sel(z, 0.0);
651 for (std::size_t i = 3 * l; i < 4 * l + 1; ++i) sel[i] = 1.0;
652 std::vector<double> h(b2, 0.0);
653 for (std::size_t i = 0; i < b2; ++i)
654 for (std::size_t j = 0; j < z; ++j) h[i] += s2.H(i, j) * sel[j];
655 out.
aoi = finish_me(s2.g, s2.A, h);
657 std::vector<double> selp(z, 0.0);
658 for (std::size_t i = 0; i < l; ++i) selp[3 * l + 1 + i] = nu[i];
659 std::vector<double> hp(b2, 0.0);
660 for (std::size_t i = 0; i < b2; ++i)
661 for (std::size_t j = 0; j < z; ++j) hp[i] += s2.H(i, j) * selp[j];
662 out.
paoi = finish_me(s2.g, s2.A, hp);