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 getAvgTrdnHandles() and getAvgSysTrdnHandles()
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;
45if isempty(self.handles) || ~isfield(self.handles,
'Q')
46 Q = cell(M,K); % queue-length
49 Qir = Metric(MetricType.QLen,
classes{r}, stations{ist});
56 if ~hasServiceTunnel(ist)
57 if ~isServiceDefined(ist,r)
69if isempty(self.handles) || ~isfield(self.handles,
'U')
70 M = getNumberOfStations(self);
71 K = getNumberOfClasses(self);
73 U = cell(M,1); % utilizations
76 Uir = Metric(MetricType.Util,
classes{r}, stations{ist});
83 if isa(stations{ist},
'Join') || isa(stations{ist},
'Fork')
86 if ~hasServiceTunnel(ist)
87 if ~isServiceDefined(ist,r)
99if isempty(self.handles) || ~isfield(self.handles,
'R')
100 M = getNumberOfStations(self);
101 K = getNumberOfClasses(self);
103 R = cell(M,K); % response times
106 Rir = Metric(MetricType.RespT,
classes{r}, stations{ist});
113 if ~hasServiceTunnel(ist)
114 if ~isServiceDefined(ist,r)
126if isempty(self.handles) || ~isfield(self.handles,
'W')
127 M = getNumberOfStations(self);
128 K = getNumberOfClasses(self);
130 W = cell(M,K); % response times
133 Wir = Metric(MetricType.ResidT,
classes{r}, stations{ist});
140 if ~hasServiceTunnel(ist)
141 if ~isServiceDefined(ist,r)
154if isempty(self.handles) || ~isfield(self.handles,
'T')
155 M = getNumberOfStations(self);
156 K = getNumberOfClasses(self);
158 T = cell(1,K); % throughputs
161 Tir = Metric(MetricType.Tput,
classes{r}, stations{ist});
162 if ~hasServiceTunnel(ist)
163 if ~isServiceDefined(ist,r)
175if isempty(self.handles) || ~isfield(self.handles,
'A')
176 M = getNumberOfStations(self);
177 K = getNumberOfClasses(self);
179 A = cell(1,K); % arrival rate
182 Air = Metric(MetricType.ArvR,
classes{r}, stations{ist});
183 if ~hasServiceTunnel(ist)
184 if ~isServiceDefined(ist,r)
196if isempty(self.handles) || ~isfield(self.handles,
'Trdn')
197 M = getNumberOfStations(self);
198 K = getNumberOfClasses(self);
200 Trdn = cell(M,K); % tardiness
203 Trdnir = Metric(MetricType.Trdn,
classes{r}, stations{ist});
205 Trdnir.disabled =
true;
207 if ~hasServiceTunnel(ist)
208 if ~isServiceDefined(ist,r)
209 Trdnir.disabled =
true;
212 Trdn{ist,r} = Trdnir;
215 self.handles.Trdn = Trdn;
217 Trdn = self.handles.Trdn;
220if isempty(self.handles) || ~isfield(self.handles,
'SysTrdn')
221 M = getNumberOfStations(self);
222 K = getNumberOfClasses(self);
224 SysTrdn = cell(1,K); % system tardiness
226 SysTrdnr = Metric(MetricType.SysTrdn,
classes{r}, []);
227 SysTrdn{1,r} = SysTrdnr;
229 self.handles.SysTrdn = SysTrdn;
231 SysTrdn = self.handles.SysTrdn;