LINE Solver (C++)
Templated C++ port of the LINE queueing solver
Loading...
Searching...
No Matches
pfqn_mvac.h File Reference

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"
Include dependency graph for pfqn_mvac.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.

Detailed Description

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.