1function [QN, UN, RN, TN] = solver_mam_ldqbd_avg(ld, piflat, levelOf)
2% SOLVER_MAM_LDQBD_AVG Map an LD-QBD state distribution to mean metrics.
4% [QN,UN,RN,TN] = SOLVER_MAM_LDQBD_AVG(LD, PIFLAT, LEVELOF) takes a probability
5% vector PIFLAT over the flat LD-QBD state space (with per-state level LEVELOF
6% from solver_mam_ldqbd_flatten) and returns the per-(station,
class) mean queue
7% length, utilization, response time and throughput
for the single-
class
8% Delay/Queue (closed) or Source/Queue (open) model described by LD.
10% Mirrors the steady-state metric formulas in solver_mam_ldqbd, applied to an
11% arbitrary (e.g. transient-averaged) distribution rather than the stationary
12% one. Used by the SolverENV state-vector analyzer
's MAM backend.
14% Copyright (c) 2012-2026, Imperial College London
23% Aggregate the flat distribution to per-level probabilities.
25piflat(piflat < 0) = 0;
27 piflat = piflat / sum(piflat);
29pLevel = zeros(1, Nlev + 1);
31 pLevel(n+1) = sum(piflat(levelOf == n));
34mean_queue = (0:Nlev) * pLevel(:);
36% Utilization:
P(busy)
for a (load-dependent) single server,
else average
37% fraction of c servers in use.
43 util = util + (min(n, c) / c) * pLevel(n+1);
53 X = ld.lambda_eff * (1 - pLevel(Nlev + 1));
54 if X > 0, R_queue = mean_queue / X;
else, R_queue = 0; end
55 QN(ri) = 0; UN(ri) = 0; RN(ri) = 0; TN(ri) = X;
56 QN(qi) = mean_queue; UN(qi) = util; RN(qi) = R_queue; TN(qi) = X;
58 mean_delay = ld.N - mean_queue;
59 X = mean_delay * ld.lambda_eff;
60 if X > 0, R_queue = mean_queue / X;
else, R_queue = 0; end
61 R_delay = 1 / ld.delayRate;
62 QN(ri) = mean_delay; UN(ri) = mean_delay; RN(ri) = R_delay; TN(ri) = X;
63 QN(qi) = mean_queue; UN(qi) = util / c; RN(qi) = R_queue; TN(qi) = X;