1function [Q,U,R,T,C,X,lG,runtime,totiter] = solver_mva_qsys_sizebased_analyzer(sn, options, schedType)
2% [Q,U,R,T,C,X,LG,RUNTIME,ITER] = SOLVER_MVA_QSYS_SIZEBASED_ANALYZER(SN, OPTIONS, SCHEDTYPE)
4% Analyzer
for M/G/1 queueing systems with size-based scheduling.
5% Supports: SRPT, PSJF, FB/LAS, LRPT, SETF
7% This function handles multiclass open queueing systems with size-based
8% scheduling policies
using the analytical formulas from:
9% A. Wierman and M. Harchol-Balter,
"Classifying scheduling policies with
10% respect to unfairness in an M/GI/1", SIGMETRICS 2003.
12% Copyright (c) 2012-2026, Imperial College London
21% Extract model parameters
22source_ist = sn.nodeToStation(sn.nodetype == NodeType.Source);
23queue_ist = sn.nodeToStation(sn.nodetype == NodeType.Queue);
31 lambda(k) = sn.rates(source_ist, k) * sn.visits{source_ist}(sn.stationToStateful(queue_ist), k);
32 mu(k) = sn.rates(queue_ist, k);
33 cs(k) = sqrt(sn.scv(queue_ist, k));
36% Check
for valid parameters
37if any(lambda <= 0) || any(mu <= 0)
38 line_error(mfilename, 'Invalid arrival or service rates (must be positive).');
41% Compute total utilization
42rho = sum(lambda ./ mu);
44 line_warning(mfilename, 'System
is unstable (rho = %.4f >= 1).', rho);
47% Call appropriate qsys function based on scheduling type
49 case SchedStrategy.SRPT
50 line_debug('Using M/G/1/SRPT exact solution');
51 [W, ~] = qsys_mg1_srpt(lambda, mu, cs);
52 case SchedStrategy.PSJF
53 line_debug('Using M/G/1/PSJF exact solution');
54 [W, ~] = qsys_mg1_psjf(lambda, mu, cs);
56 line_debug('Using M/G/1/FB (LAS) exact solution');
57 [W, ~] = qsys_mg1_fb(lambda, mu, cs);
58 case SchedStrategy.LRPT
59 line_debug('Using M/G/1/LRPT exact solution');
60 [W, ~] = qsys_mg1_lrpt(lambda, mu, cs);
61 case SchedStrategy.SETF
62 line_debug('Using M/G/1/SETF (non-preemptive FB) exact solution');
63 [W, ~] = qsys_mg1_setf(lambda, mu, cs);
65 line_error(mfilename, 'Unsupported scheduling type for size-based analyzer.');
68% Initialize result matrices
79 visits = sn.
visits{source_ist}(sn.stationToStateful(queue_ist), k);
80 R(queue_ist, k) = W(k) *
visits;
81 T(source_ist, k) = lambda(k);
82 T(queue_ist, k) = lambda(k);
83 X(queue_ist, k) = lambda(k);
84 U(queue_ist, k) = lambda(k) / mu(k);
85 Q(queue_ist, k) = lambda(k) * W(k);
86 C(queue_ist, k) = R(queue_ist, k);