LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solver_mam_ldqbd_avg.m
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.
3%
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.
9%
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.
13%
14% Copyright (c) 2012-2026, Imperial College London
15% All rights reserved.
16
17Nlev = ld.Nlev;
18M = ld.M;
19qi = ld.queueIdx;
20ri = ld.refIdx;
21c = ld.nServers;
22
23% Aggregate the flat distribution to per-level probabilities.
24piflat = piflat(:)';
25piflat(piflat < 0) = 0;
26if sum(piflat) > 0
27 piflat = piflat / sum(piflat);
28end
29pLevel = zeros(1, Nlev + 1);
30for n = 0:Nlev
31 pLevel(n+1) = sum(piflat(levelOf == n));
32end
33
34mean_queue = (0:Nlev) * pLevel(:);
35
36% Utilization: P(busy) for a (load-dependent) single server, else average
37% fraction of c servers in use.
38if ld.hasLLD || c == 1
39 util = 1 - pLevel(1);
40else
41 util = 0;
42 for n = 1:Nlev
43 util = util + (min(n, c) / c) * pLevel(n+1);
44 end
45end
46
47QN = zeros(M, 1);
48UN = zeros(M, 1);
49RN = zeros(M, 1);
50TN = zeros(M, 1);
51
52if ld.isOpen
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;
57else
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;
64end
65end