![]() |
LINE Solver (C++)
Templated C++ port of the LINE queueing solver
|
Tay's arrival-instant approximate MVA. More...
#include <cmath>#include <cstddef>#include <vector>#include "line/api/pfqn/pfqn_bs.h"#include "line/num/number.h"#include "line/util/error.h"#include "line/util/lu.h"#include "line/util/matrix.h"Go to the source code of this file.
Namespaces | |
| namespace | line |
| namespace | line::pfqn |
Functions | |
| template<class T> | |
| AmvaResult< T > | line::pfqn::pfqn_tay (const Matrix< T > &L, const std::vector< T > &N, const std::vector< T > &Z, double tol=1e-6, std::size_t maxiter=1000, const Matrix< T > &QN0=Matrix< T >()) |
| Tay's arrival-instant approximate MVA. | |
| template<class T> | |
| AmvaResult< T > | line::pfqn::pfqn_tay (const Matrix< T > &L, const std::vector< T > &N) |
Tay's arrival-instant approximate MVA.
Templated port of matlab/src/api/pfqn/pfqn_tay.m, cross-checked against jar/src/main/java/jline/api/pfqn/mva/Pfqn_tay.java.
WHAT MAKES IT DIFFERENT. Every other AMVA in this directory estimates the arrival-instant queue length by shifting the population: Bard-Schweitzer scales Q by (N-1)/N, Linearizer solves R auxiliary networks, AQL carries an aggregate correction. Tay estimates it from the THROUGHPUT ELASTICITIES instead. With E_mkc = (D_mk/X_c) dX_c/dD_mk the elasticity of the class-c throughput in the class-k demand at station m, and B_ir = 1/(1 + D_ir X_r/N_r), the elasticities satisfy R linear equations
E_mkj sum_t B_tj Q_jt (1+Q_jt) = -[(delta_jk + Q_jm) B_mk Q_km + sum_{c/=j} E_mkc sum_t B_tc Q_jt Q_ct]
and the arrival-instant queue length is then simply Q_km^(r) = Q_km + E_mkr, which closes the recursion R_rm = D_rm (1 + sum_k Q_km^(r)).
COST. One R x R solve per (station, class) pair per sweep, so O(M R (R^3 + M R^2)) per iteration: more than Bard-Schweitzer, less than Linearizer's R+1 auxiliary networks.
DELAY STATIONS enter through Z only. They are "AS" servers in the survey's notation (d_t = 0), contributing Z_j X_j to the DENOMINATOR of the elasticity equations and nothing to the numerator.
EMPTY CLASSES are solved out and re-expanded, exactly as pfqn_bs does. Their elasticity denominator is identically zero, so leaving them in makes the R x R system singular rather than merely redundant.
Reference: Y. C. Tay and R. Suri, "Error bounds for performance prediction in queueing networks", ACM TOCS 3(4), 1985; Y. C. Tay, "An approach to analyzing the behavior of some queueing networks", Operations Research 40(S2), 1992; P. J. Schweitzer, G. Serazzi and M. Broglia, "A survey of bottleneck analysis in closed queueing networks", Sec. 4.8.2, eqs. 4.8.2-1..3.
Iterates to an absolute tolerance on the queue lengths, so exact arithmetic buys nothing and the static_assert records that, as in pfqn_aql.h.
Definition in file pfqn_tay.h.