Class Pfqn_qdlin
Array-level twin of what SolverMVA computes for method='qdlin': the Linearizer of
Chandy and Neuse, Commun. ACM 25(2), 1982, run inside the queue-dependent AMVA framework of
Casale, Perez and Wang (IFIP PERFORMANCE 2015), so the load-dependent term g_k is evaluated at
the CORRECTED arrival-instant queue rather than at the plain one.
THIS IS A TRANSCRIPTION of solver_amvald.m together with
solver_amvald_forward.m, restricted to the domain a demand matrix describes: closed
classes only, one chain per class, unit visits, PS queueing stations and one optional delay
carrying Z. It is NOT an independent re-derivation. Ported from
python/line_solver/api/pfqn/qdlin.py, which reproduces the native-Python
SolverMVA(model,'qdlin') to machine precision over 640 random closed models.
FOUR PROPERTIES OF THE REFERENCE ARE REPRODUCED DELIBERATELY:
- THE GAMMA CORRECTION IS CLASS-AGGREGATE, IN SLICE 0.
solver_amvald.mallocates the (K,M,K) per-class Linearizer array for qdlin but writesgamma(s,k) = sum_r Q_s(k,r)/(Nt-1) - sum_r Q(k,r)/Ntinto it with two subscripts, which MATLAB linear-indexes to (s,k,1); the other class slices stay zero while every reader indexes gamma per class. The correction that reaches the residence time isN_0*gamma(r,k,0) - [r==0]*gamma(r,k,0), which coincides with the queue-dependent AMVA form(Nt-1)*gamma_aggiff K == 1.method='lin'takes the per-class form instead. - A SINGLE-SERVER STATION STILL CARRIES A SOFTMIN TERM. The multiserver factor is
Pfqn_lldfunat the arrival-instant total with the server counts, and its softmin at c = 1 is not exactly 1, so qdlin does not reduce to a textbook single-server AMVA even when every station has one server. - THE WAIT FACTOR IS FLOORED AT
wtol, LINE'soptions.tol. That is a DIFFERENT knob from the convergence tolerance and SolverMVA never sets it, so it stays at the lineDefaults 1e-4 while the fixed point converges toiter_tol1e-6. MATLAB and the JAR solver do NOT carry this floor; native Python does, and removing it there was tried and reverted on 2026-09-04 because the unfloored Python recursion diverges where MATLAB and C++ do not. See_kb/06-solver-catalog.md. - WHICH UTILIZATION IS REPORTED DEPENDS ON THE MODEL. The analyzer forwards the iterated Uchain to the deaggregation ONLY under lld, cd or jd scaling; with none of those the deaggregation recomputes T*S/c from the NOMINAL demand, and the two differ by the iteration residual.
MU AND NSERVERS ARE DIFFERENT MECHANISMS, unlike in Pfqn_qdamva, which folds the
multiserver curve into mu. Here mu is sn.lldscaling, an interpolated rate multiplier per
station, and nservers is the server count feeding the softmin. A c-server station is
nservers(k)=c, NOT a mu row of min(1..smax,c); the latter reproduces
Queue.setLoadDependence, a different station.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classThe fixed pointpfqn_qdlin(jline.util.matrix.Matrix, jline.util.matrix.Matrix, jline.util.matrix.Matrix, jline.util.matrix.Matrix, jline.util.matrix.Matrix)reaches, and how many sweeps it took. -
Method Summary
Modifier and TypeMethodDescriptionstatic Pfqn_qdlin.ResultQD-LIN with the reference's default tolerances and iteration cap.static Pfqn_qdlin.Resultpfqn_qdlin(Matrix L, Matrix N, Matrix Z, Matrix mu, Matrix nservers, double tol, int maxiter, double wtol) QD-LIN.
-
Method Details
-
pfqn_qdlin
public static Pfqn_qdlin.Result pfqn_qdlin(Matrix L, Matrix N, Matrix Z, Matrix mu, Matrix nservers) QD-LIN with the reference's default tolerances and iteration cap.- Parameters:
L- (M x R) service demand matrix, queueing stations onlyN- (1 x R) population vector, finiteZ- (1 x R) think time vector, or null for nonemu- (M x smax) load-dependent rate multipliers, or null for nonenservers- (M x 1) server counts, or null for one server everywhere- Returns:
- the fixed point
-
pfqn_qdlin
public static Pfqn_qdlin.Result pfqn_qdlin(Matrix L, Matrix N, Matrix Z, Matrix mu, Matrix nservers, double tol, int maxiter, double wtol) QD-LIN.- Parameters:
L- (M x R) service demand matrix, queueing stations onlyN- (1 x R) population vector, finiteZ- (1 x R) think time vector, or null for none; a delay station carrying it is prepended to the station list when any entry is positive, exactly as the equivalent Network would hold onemu- (M x smax) load-dependent rate multipliers, or null for nonenservers- (M x 1) server counts, or null for one server everywheretol- convergence tolerance on the queue lengths, LINE's iter_tolmaxiter- iteration budget, LINE's iter_max; the outer sweep and each inner sweep are capped at sqrt(maxiter) and the forward evaluations at min(maxiter,10000)wtol- floor on the wait factor, LINE's options.tol- Returns:
- the fixed point
-