![]() |
LINE Solver (C++)
Templated C++ port of the LINE queueing solver
|
ProCoMoM: marginal queue-length probabilities of a closed multiclass product-form network by the class-oriented method of moments. More...
#include <cstddef>#include <vector>#include "line/api/pfqn/pfqn_comb_common.h"#include "line/api/pfqn/pfqn_comom.h"#include "line/num/number.h"#include "line/util/error.h"#include "line/util/lstsq.h"#include "line/util/matrix.h"Go to the source code of this file.
Classes | |
| struct | line::pfqn::ProcomomResult< T > |
| Return value of pfqn_procomom, mirroring [Pr, Q]. More... | |
| struct | line::pfqn::Procomom2Result< T > |
| Return value of pfqn_procomom2, mirroring [pk, lG, G, T, F, B]. More... | |
Namespaces | |
| namespace | line |
| namespace | line::pfqn |
Functions | |
| template<class T> | |
| ProcomomResult< T > | line::pfqn::pfqn_procomom (const Matrix< T > &L, const std::vector< int > &N, const std::vector< T > &Z, const T &atol) |
| Marginal queue-length distributions of every station. | |
| template<class T> | |
| ProcomomResult< T > | line::pfqn::pfqn_procomom (const Matrix< T > &L, const std::vector< int > &N, const std::vector< T > &Z) |
| Overload with the reference's default tolerance. | |
| template<class T> | |
| Procomom2Result< T > | line::pfqn::pfqn_procomom2 (const std::vector< T > &L, const std::vector< int > &N, const std::vector< T > &Z, const std::vector< T > &mu, int m) |
| Queue-plus-delay marginal by the transfer-matrix form of ProCoMoM. | |
| template<class T> | |
| Procomom2Result< T > | line::pfqn::pfqn_procomom2 (const std::vector< T > &L, const std::vector< int > &N, const std::vector< T > &Z) |
| Overload with the load-independent, unit-multiplicity defaults. | |
ProCoMoM: marginal queue-length probabilities of a closed multiclass product-form network by the class-oriented method of moments.
Templated port of matlab/src/api/pfqn/pfqn_procomom.m and matlab/src/api/pfqn/pfqn_procomom2.m.
pfqn_procomom carries, instead of the plain moments of pfqn_comom, the generating coefficients of ONE station's marginal distribution: pk(:, j+1) holds the basis coefficients of P(n_station = j). The basis is the same Dn = multichoose(R,M) layout as pfqn_comom, with the reference's UP shifts (Dn + e_s) where pfqn_comom uses down shifts, and the station of interest is rotated into the last row of L so the two extra couplings, DC (same level, one job less at the station) and DD (previous level), always refer to row M. Every station is solved in turn and its distribution normalized to sum 1.
pfqn_procomom2 is the two-node special case, a queue plus a delay, where the whole recursion collapses to a product of bidiagonal transfer matrices,
F = prod_r T_r^{N_r} / N_r!, T_r(row,row) = Z_r, T_r(row,row+1) = (n + m - 1) L_r / mu(n),
and the unnormalized marginal is F e_last. No linear system is solved at all.
SYSTEM SHAPE. The ProCoMoM matrix is NOT square: countrows(r) contributes M rows per basis vector in the propagation branch but M + r - 1 (or 1) in the equation branch, so for M = R = 2 the class-1 step is 6 x 6 and the class-2 step is 7 x 6. The reference solves it with an economy QR when full rank and with a truncated SVD when not. Both are done here by util/lstsq.h in exact arithmetic: the normal equations give the identical least-squares vector, and a full-rank factorization gives the identical minimum-norm vector.
NOT PORTED, deliberately: the reference's rank-deficiency remedy, which re-solves the whole problem with the demands randomly perturbed by 1e-10..1e-4 of their scale (rng(23000,'twister')) and keeps whichever attempt looks best behaved. It is a floating-point workaround for a floating-point rank test, it changes the answer, and reproducing it would require MATLAB's Mersenne-Twister stream bit for bit. This port returns the exact pseudoinverse solution, which is what the perturbation approximates, and reports the rank deficiency in rankdef instead of hiding it.
Arithmetic: EXACT-CAPABLE. Field operations and least-squares solves only.
REFERENCE DEFECTS in pfqn_procomom2.m, all reproducible, none corrected in MATLAB by this port (it does not edit MATLAB):
This port implements the transfer-matrix method only, with no printing and no MVA call, and accepts the three-argument form.
Definition in file pfqn_procomom.h.