1function [Q,U,R,T,A,W] = getAvgHandles(self)
2% [Q,U,R,T,A,W] = GETAVGHANDLES()
3% Get handles
for mean performance metrics.
5% Q(i,r): mean queue-length of class r at node i
6% U(i,r): mean utilization of class r at node i
7% R(i,r): mean response time of class r at node i (summed across
visits)
8% T(i,r): mean throughput of class r at node i
9% A(i,r): mean arrival rate of class r at node i
10% W(i,r): mean residence time of class r at node i
12% For tardiness metrics, use getAvgTardHandles() and getAvgSysTardHandles()
14% Copyright (c) 2012-2026, Imperial College London
16% Q = self.getAvgQLenHandles;
17% U = self.getAvgUtilHandles;
18% R = self.getAvgRespTHandles;
19% T = self.getAvgTputHandles;
20% A = self.getAvgArvRHandles;
21% W = self.getAvgResidTHandles;
23M = getNumberOfStations(self);
24K = getNumberOfClasses(self);
26stations = self.stations;
30hasServiceTunnel =
false(M,1);
31isServiceDefined =
true(M,K);
33 isSource(ist) = isa(stations{ist},
'Source');
34 isSink(ist) = isa(stations{ist},
'Sink');
35 hasServiceTunnel(ist) = strcmpi(
class(stations{ist}.server),
'ServiceTunnel');
36 if ~hasServiceTunnel(ist)
38 if isempty(stations{ist}.server.serviceProcess{r}) || stations{ist}.server.serviceProcess{r}{end}.isDisabled()
39 isServiceDefined(ist,r) =
false;
45% Identify cache hit/miss
classes (these should not have their throughput disabled)
46isCacheClass =
false(1,K);
49 if isa(
nodes{i},
'Cache')
50 hitClasses =
nodes{i}.server.hitClass;
51 missClasses =
nodes{i}.server.missClass;
52 for r=1:length(hitClasses)
53 if hitClasses(r) > 0 && hitClasses(r) <= K
54 isCacheClass(hitClasses(r)) =
true;
57 for r=1:length(missClasses)
58 if missClasses(r) > 0 && missClasses(r) <= K
59 isCacheClass(missClasses(r)) =
true;
65if isempty(self.handles) || ~isfield(self.handles,
'Q')
66 Q = cell(M,K); % queue-length
69 Qir = Metric(MetricType.QLen,
classes{r}, stations{ist});
76 if ~hasServiceTunnel(ist)
77 if ~isServiceDefined(ist,r)
89if isempty(self.handles) || ~isfield(self.handles,
'U')
90 M = getNumberOfStations(self);
91 K = getNumberOfClasses(self);
93 U = cell(M,1); % utilizations
96 Uir = Metric(MetricType.Util,
classes{r}, stations{ist});
103 if isa(stations{ist},
'Join') || isa(stations{ist},
'Fork')
106 if ~hasServiceTunnel(ist)
107 if ~isServiceDefined(ist,r)
119if isempty(self.handles) || ~isfield(self.handles,
'R')
120 M = getNumberOfStations(self);
121 K = getNumberOfClasses(self);
123 R = cell(M,K); % response times
126 Rir = Metric(MetricType.RespT,
classes{r}, stations{ist});
133 if ~hasServiceTunnel(ist)
134 if ~isServiceDefined(ist,r)
146if isempty(self.handles) || ~isfield(self.handles,
'W')
147 M = getNumberOfStations(self);
148 K = getNumberOfClasses(self);
150 W = cell(M,K); % response times
153 Wir = Metric(MetricType.ResidT,
classes{r}, stations{ist});
160 if ~hasServiceTunnel(ist)
161 if ~isServiceDefined(ist,r)
174if isempty(self.handles) || ~isfield(self.handles,
'T')
175 M = getNumberOfStations(self);
176 K = getNumberOfClasses(self);
178 T = cell(1,K); % throughputs
181 Tir = Metric(MetricType.Tput,
classes{r}, stations{ist});
182 if ~hasServiceTunnel(ist)
183 % Don
't disable throughput for cache hit/miss classes
184 if ~isServiceDefined(ist,r) && ~isCacheClass(r)
196if isempty(self.handles) || ~isfield(self.handles,'A
')
197 M = getNumberOfStations(self);
198 K = getNumberOfClasses(self);
200 A = cell(1,K); % arrival rate
203 Air = Metric(MetricType.ArvR, classes{r}, stations{ist});
204 if ~hasServiceTunnel(ist)
205 % Don't disable arrival rate
for cache hit/miss
classes
206 if ~isServiceDefined(ist,r) && ~isCacheClass(r)
218if isempty(self.handles) || ~isfield(self.handles,
'Tard')
219 M = getNumberOfStations(self);
220 K = getNumberOfClasses(self);
222 Tard = cell(M,K); % tardiness
225 Tardir = Metric(MetricType.Tard,
classes{r}, stations{ist});
227 Tardir.disabled =
true;
230 Tardir.disabled =
true;
232 if ~hasServiceTunnel(ist)
233 if ~isServiceDefined(ist,r)
234 Tardir.disabled =
true;
237 Tard{ist,r} = Tardir;
240 self.handles.Tard = Tard;
242 Tard = self.handles.Tard;
245if isempty(self.handles) || ~isfield(self.handles,
'SysTard')
246 M = getNumberOfStations(self);
247 K = getNumberOfClasses(self);
249 SysTard = cell(1,K); % system tardiness
251 SysTardr = Metric(MetricType.SysTard,
classes{r}, []);
252 SysTard{1,r} = SysTardr;
254 self.handles.SysTard = SysTard;
256 SysTard = self.handles.SysTard;