Class Pfqn_qdlin

java.lang.Object
jline.api.pfqn.ld.Pfqn_qdlin

public final class Pfqn_qdlin extends Object
QD-LIN: the Linearizer arm of AMVA-LD, on a plain demand matrix.

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:

  1. THE GAMMA CORRECTION IS CLASS-AGGREGATE, IN SLICE 0. solver_amvald.m allocates the (K,M,K) per-class Linearizer array for qdlin but writes gamma(s,k) = sum_r Q_s(k,r)/(Nt-1) - sum_r Q(k,r)/Nt into 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 is N_0*gamma(r,k,0) - [r==0]*gamma(r,k,0), which coincides with the queue-dependent AMVA form (Nt-1)*gamma_agg iff K == 1. method='lin' takes the per-class form instead.
  2. A SINGLE-SERVER STATION STILL CARRIES A SOFTMIN TERM. The multiserver factor is Pfqn_lldfun at 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.
  3. THE WAIT FACTOR IS FLOORED AT wtol, LINE's options.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 to iter_tol 1e-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.
  4. 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.

  • 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 only
      N - (1 x R) population vector, finite
      Z - (1 x R) think time vector, or null for none
      mu - (M x smax) load-dependent rate multipliers, or null for none
      nservers - (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 only
      N - (1 x R) population vector, finite
      Z - (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 one
      mu - (M x smax) load-dependent rate multipliers, or null for none
      nservers - (M x 1) server counts, or null for one server everywhere
      tol - convergence tolerance on the queue lengths, LINE's iter_tol
      maxiter - 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