![]() |
LINE Solver (C++)
Templated C++ port of the LINE queueing solver
|
MVAC: exact mean value analysis BY CHAIN of a closed multichain product-form network (Conway, de Souza e Silva and Lavenberg, IEEE Trans. More...
#include <algorithm>#include <cstddef>#include <vector>#include "line/api/pfqn/pfqn_comb_common.h"#include "line/num/number.h"#include "line/util/error.h"#include "line/util/matrix.h"Go to the source code of this file.
Classes | |
| struct | line::pfqn::MvacResult< T > |
| Return value of pfqn_mvac, mirroring [XN, QN, UN, CN]. More... | |
Namespaces | |
| namespace | line |
| namespace | line::pfqn |
Functions | |
| template<class T> | |
| MvacResult< T > | line::pfqn::pfqn_mvac (const Matrix< T > &L, const std::vector< int > &N, const Matrix< T > &Z) |
| MVAC: exact mean value analysis BY CHAIN of a closed multichain product-form network (Conway, de Souza e Silva and Lavenberg, IEEE Trans. | |
| template<class T> | |
| MvacResult< T > | line::pfqn::pfqn_mvac (const Matrix< T > &L, const std::vector< int > &N) |
| Overload with the zero think-time default. | |
MVAC: exact mean value analysis BY CHAIN of a closed multichain product-form network (Conway, de Souza e Silva and Lavenberg, IEEE Trans.
Computers 38(3):432-442, 1989).
Templated port of matlab/src/api/pfqn/pfqn_mvac.m.
Where the classic MVA recursion of pfqn_mva recurs on the POPULATION vector and costs O(prod(N+1)), MVAC recurs on the CHAINS: each chain is reduced to single-customer chains and the removed ones are replaced by self-looping single-customer (SCSL) chains pinned at a service center. The multiplicity vector v = (v_1,...,v_J), v_j the number of SCSL chains at center j, indexes the recursion in place of the population. Writing L^k_j(v) for the mean number at center j with the SCSL customers excluded,
lambda^k_k(v) = 1 / ( a_k + sum_{j SSFR} a_jk (L^{k-1}_j(v) + v_j) ) (10) L^k_{jk}(v) = lambda^k_k(v) a_jk (1 + L^{k-1}_j(v) + v_j), j SSFR (9a) L^k_{jk}(v) = lambda^k_k(v) a_jk, j IS (9b) L^k_i(v) = sum_j L^k_{jk}(v) L^{k-1}_i(v + 1_j) + L^k_{ik}(v) (7) L^k_{il}(v) = sum_j L^k_{jk}(v) L^{k-1}_{il}(v + 1_j), l < k (6)
with L^0 = 0, read off at k = K, v = 0. Part 1 evaluates (10), (9) and (7); part 2 evaluates (6) for the chains that visit at least one IS center, whose throughput then follows from Little's law there; the chains that visit only SSFR centers need a re-execution of part 1 with their label interchanged with K, which is cheap because the levels below the interchanged label are untouched and are reused.
IDENTICAL CHAINS. Classes with N_r > 1, and classes with identical demand columns, collapse into one subset of identical single-customer chains: only the representative is analyzed and its per-chain measures are multiplied by the class population. The cost therefore depends on the number of DISTINCT chains, not on K. The subsets are found by MATLAB's unique(...,'rows','stable'), whose first-appearance order the port reproduces, because the chain labelling (representatives last, IS-visiting ones before the rest) is built from it and part 3 interchanges labels by position.
NO NORMALIZING CONSTANT is formed anywhere, so MVAC does not suffer the underflow and overflow that complicate RECAL and convolution.
Arithmetic: EXACT-CAPABLE. Additions, multiplications and divisions in the field of the inputs only, no logarithm and no tolerance. Instantiated at Rational it returns the same throughputs and queue lengths as pfqn_mva and pfqn_ca as exact fractions.
REFERENCE DEFECTS: none found. Agreement with pfqn_mva is to the last ulp on every model tried, including models with a delay, without a delay, with repeated demand columns and with empty classes.
Definition in file pfqn_mvac.h.