![]() |
LINE Solver (C++)
Templated C++ port of the LINE queueing solver
|
MVAC, exact mean value analysis BY CHAIN (Conway, de Souza e Silva and Lavenberg, IEEE Trans. More...
#include <cmath>#include <cstddef>#include <limits>#include <string>#include <vector>#include "line/api/pfqn/pfqn_mvac.h"#include "line/lang/qn/network_struct.h"#include "line/solvers/mva/mva_types.h"#include "line/solvers/mva/sn_chain.h"#include "line/util/error.h"Go to the source code of this file.
Namespaces | |
| namespace | line |
| namespace | line::mva |
Functions | |
| template<class T> | |
| MvaSolution< T > | line::mva::solver_mvac_analyzer (const qn::NetworkStruct< T > &L, const MvaOptions &opt) |
| Port of solver_mvac.m. | |
MVAC, exact mean value analysis BY CHAIN (Conway, de Souza e Silva and Lavenberg, IEEE Trans.
Computers 38(3):432-442, 1989). Port of solver_mvac.m.
MVAC IS EXACT for its model class, not an approximation: it returns what the classic MVA recursion returns, by a different route. Where pfqn_mva recurs on the population vector at a cost of prod(N+1), MVAC recurs on the CHAINS, replacing each removed chain by self-looping single-customer chains, so its cost is governed by the number of DISTINCT demand columns. That is the whole reason to offer it beside exact, and it is why any disagreement with exact MVA on a model both accept is a defect rather than a tolerance.
ITS MODEL CLASS IS NARROWER THAN THE exact PATH's, and every restriction is refused by name rather than approximated:
closed only an open chain has no population to recur on product form only the recursion is the BCMP one single server only the api implements the SSFR arrival theorem, and has no multiserver correction; pfqn_mvacld is the load-dependent sibling, and the reference does NOT route here to it – it refuses, so that a multiserver model takes the exact path it is already solved by
TWO CHAIN-LEVEL QUANTITIES ARE COMPUTED AND THEN DISCARDED by the reference, which passes an empty Qchain and Uchain to the deaggregation. The class-level queue length is therefore reconstructed from the residence time by Little's law and the utilization from the utilization law, NOT split from the chain matrices by the visit share. Handing the chain matrices over instead would change the numbers on any chain holding more than one class, which is why the reference's utilization renormalization (its sum(Uchain) > 1 rescaling) is not reproduced here: it cannot reach the answer, and porting dead arithmetic would suggest it does. The cycle time is discarded the same way, and survives only as the divisor that turns the population into the throughput.
Arithmetic: EXACT-CAPABLE, and therefore ungated. pfqn_mvac forms no normalizing constant and evaluates no logarithm – additions, multiplications and divisions in the field of the inputs only – so this analyzer runs under exact arithmetic and returns exact fractions there. Contrast solver_sqd, whose calibration is transcendental and is gated for that reason. lG is NaN: MVAC forms no normalizing constant, and the reference says so rather than reporting a zero that reads as one.
Definition in file solver_mvac.h.