1function [AvgTable,QT,UT,
RT,WT,AT,TT] = getAvgTable(self,Q,U,R,T,A,W,keepDisabled)
2% [AVGTABLE,QT,UT,
RT,WT,TT,AT] = GETAVGTABLE(SELF,Q,U,R,T,A,W,KEEPDISABLED)
3% Return table of average station metrics
5% When confint option
is enabled, values are displayed as
'mean ± ci_halfwidth'
7% Copyright (c) 2012-2026, Imperial College London
9if GlobalConstants.DummyMode
10 [AvgTable, QT, UT,
RT, TT, WT, AT] = deal(Table());
11 AvgTable = IndexedTable(AvgTable);
15if isa(self.model,
'LayeredNetwork')
16 % Java-backed LQN simulation (SolverLDES): per-LQN-element table
17 [AvgTable,QT,UT,
RT,WT,AT,TT] = getAvgTableLayered(self);
21% Check
if confidence intervals should be displayed
22[confintEnabled, ~] = Solver.parseConfInt(self.options.confint);
23hasCI = confintEnabled && self.hasResults && isfield(self.result,
'Avg') && isfield(self.result.Avg,
'QCI');
25if strcmp(self.options.lang,
'java') && ~strcmp(self.name,
'SolverLDES')
26 sn = self.model.getStruct;
29 [QN,UN,RN,TN,AN,WN] = self.getAvg([],[],[],[],[],[]);
31 % Update hasCI after getAvg call
32 hasCI = confintEnabled && self.hasResults && isfield(self.result, 'Avg') && isfield(self.result.Avg, 'QCI');
34 [Qval, Uval, Rval, Tval, Wval, Aval] = deal([]);
35 [QCIval, UCIval, RCIval, TCIval, WCIval, ACIval] = deal([]);
40 if any(sum([QN(ist,k),UN(ist,k),RN(ist,k),TN(ist,k),AN(ist,k),WN(ist,k)])>0)
42 inchain = sn.inchain{c};
43 JobClass{end+1,1} = sn.classnames{k};
44 Station{end+1,1} = sn.nodenames{sn.stationToNode(ist)};
45 Qval(end+1) = QN(ist,k);
46 Uval(end+1) = UN(ist,k);
47 Rval(end+1) = RN(ist,k);
48 Tval(end+1) = TN(ist,k);
49 Wval(end+1) = WN(ist,k);
50 Aval(end+1) = AN(ist,k);
52 QCIval(end+1) = getCIValue(self.result.Avg,
'QCI', ist, k);
53 UCIval(end+1) = getCIValue(self.result.Avg,
'UCI', ist, k);
54 RCIval(end+1) = getCIValue(self.result.Avg,
'RCI', ist, k);
55 TCIval(end+1) = getCIValue(self.result.Avg,
'TCI', ist, k);
56 WCIval(end+1) = getCIValue(self.result.Avg,
'WCI', ist, k);
57 ACIval(end+1) = getCIValue(self.result.Avg,
'ACI', ist, k);
63 JobClass = label(JobClass);
66 % Format values with CI as strings
67 QLen = formatWithCI(Qval(:), QCIval(:));
68 Util = formatWithCI(Uval(:), UCIval(:));
69 RespT = formatWithCI(Rval(:), RCIval(:));
70 ResidT = formatWithCI(Wval(:), WCIval(:));
71 Tput = formatWithCI(Tval(:), TCIval(:));
72 ArvR = formatWithCI(Aval(:), ACIval(:));
81 QT = Table(
Station,JobClass,QLen);
82 UT = Table(
Station,JobClass,Util);
84 WT = Table(
Station,JobClass,ResidT);
85 TT = Table(
Station,JobClass,Tput);
86 AT = Table(
Station,JobClass,ArvR);
87 AvgTable = Table(
Station, JobClass, QLen, Util, RespT, ResidT, ArvR, Tput);
88 AvgTable = IndexedTable(AvgTable);
96elseif isempty(Q) && isempty(U) && isempty(R) && isempty(T) && isempty(A) && isempty(W)
97 [Q,U,R,T,A,W] = getAvgHandles(self);
105 elseif iscell(Q) && ~isempty(Q)
107 keepDisabled = param{5};
108 %
case where varargin
is passed as input
110 [Q,U,R,T,A,W] = getAvgHandles(self);
112 [Q,U,R,T,A,W] = getAvgHandles(self);
114if isfinite(self.getOptions.timespan(2))
115 [Qt,Ut,Tt] = getTranHandles(self);
116 [QNt,UNt,TNt] = self.getTranAvg(Qt,Ut,Tt);
117 QN = cellfun(@(c) c.metric(end),QNt);
118 UN = cellfun(@(c) c.metric(end),UNt);
119 TN = cellfun(@(c) c.metric(end),TNt);
120 [RN, WN, AN] = deal(zeros(size(QN)));
122 [QN,UN,RN,TN,AN,WN] = self.getAvg(Q,U,R,T,A,W);
125% Update hasCI after getAvg call
126hasCI = confintEnabled && self.hasResults && isfield(self.result,
'Avg') && isfield(self.result.Avg,
'QCI');
128%
this is required because getAvg can alter
the chain structure in
the
130sn = self.model.getStruct;
133 [AvgTable, QT, UT,
RT, TT, AT, WT] = deal(Table());
135 [Qval, Uval, Rval, Tval, Wval, Aval] = deal([]);
136 [QCIval, UCIval, RCIval, TCIval, WCIval, ACIval] = deal([]);
141 if any(sum([QN(ist,k),UN(ist,k),RN(ist,k),TN(ist,k),AN(ist,k),WN(ist,k)])>0)
142 c = sn.chains(:,k)>0;
143 inchain = sn.inchain{c};
144 JobClass{end+1,1} = char(Q{ist,k}.class.name);
145 Station{end+1,1} = char(Q{ist,k}.station.name);
146 Qval(end+1) = QN(ist,k);
147 Uval(end+1) = UN(ist,k);
148 Rval(end+1) = RN(ist,k);
149 Wval(end+1) = WN(ist,k);
150 Tval(end+1) = TN(ist,k);
151 Aval(end+1) = AN(ist,k);
153 QCIval(end+1) = getCIValue(self.result.Avg,
'QCI', ist, k);
154 UCIval(end+1) = getCIValue(self.result.Avg,
'UCI', ist, k);
155 RCIval(end+1) = getCIValue(self.result.Avg,
'RCI', ist, k);
156 WCIval(end+1) = getCIValue(self.result.Avg,
'WCI', ist, k);
157 TCIval(end+1) = getCIValue(self.result.Avg,
'TCI', ist, k);
158 ACIval(end+1) = getCIValue(self.result.Avg,
'ACI', ist, k);
164 JobClass = label(JobClass);
167 % Format values with CI as strings
168 QLen = formatWithCI(Qval(:), QCIval(:));
169 Util = formatWithCI(Uval(:), UCIval(:));
170 RespT = formatWithCI(Rval(:), RCIval(:));
171 ResidT = formatWithCI(Wval(:), WCIval(:));
172 Tput = formatWithCI(Tval(:), TCIval(:));
173 ArvR = formatWithCI(Aval(:), ACIval(:));
182 QT = Table(
Station,JobClass,QLen);
183 UT = Table(
Station,JobClass,Util);
185 WT = Table(
Station,JobClass,ResidT);
186 TT = Table(
Station,JobClass,Tput);
187 AT = Table(
Station,JobClass,ArvR);
188 AvgTable = Table(
Station, JobClass, QLen, Util, RespT, ResidT, ArvR, Tput);
190 [Qval, Uval, Rval, Wval, Tval, Aval] = deal(zeros(M, K));
191 [QCIval, UCIval, RCIval, WCIval, TCIval, ACIval] = deal(zeros(M, K));
192 JobClass = cell(K*M,1);
196 JobClass{(ist-1)*K+k} = Q{ist,k}.class.name;
197 Station{(ist-1)*K+k} = Q{ist,k}.station.name;
198 Qval((ist-1)*K+k) = QN(ist,k);
199 Uval((ist-1)*K+k) = UN(ist,k);
200 Rval((ist-1)*K+k) = RN(ist,k);
201 Wval((ist-1)*K+k) = WN(ist,k);
202 Tval((ist-1)*K+k) = TN(ist,k);
203 Aval((ist-1)*K+k) = AN(ist,k);
205 QCIval((ist-1)*K+k) = getCIValue(self.result.Avg,
'QCI', ist, k);
206 UCIval((ist-1)*K+k) = getCIValue(self.result.Avg,
'UCI', ist, k);
207 RCIval((ist-1)*K+k) = getCIValue(self.result.Avg,
'RCI', ist, k);
208 WCIval((ist-1)*K+k) = getCIValue(self.result.Avg,
'WCI', ist, k);
209 TCIval((ist-1)*K+k) = getCIValue(self.result.Avg,
'TCI', ist, k);
210 ACIval((ist-1)*K+k) = getCIValue(self.result.Avg,
'ACI', ist, k);
215 JobClass = label(JobClass);
218 % Format values with CI as strings
219 QLen = formatWithCI(Qval(:), QCIval(:));
220 Util = formatWithCI(Uval(:), UCIval(:));
221 RespT = formatWithCI(Rval(:), RCIval(:));
222 ResidT = formatWithCI(Wval(:), WCIval(:));
223 Tput = formatWithCI(Tval(:), TCIval(:));
224 ArvR = formatWithCI(Aval(:), ACIval(:));
233 QT = Table(
Station,JobClass,QLen);
234 UT = Table(
Station,JobClass,Util);
236 WT = Table(
Station,JobClass,ResidT);
237 TT = Table(
Station,JobClass,Tput);
238 AT = Table(
Station,JobClass,ArvR);
239 AvgTable = Table(
Station, JobClass, QLen, Util, RespT, ResidT, ArvR, Tput);
241AvgTable = IndexedTable(AvgTable);
244function strVals = formatWithCI(vals, ciVals)
245% FORMATWITHCI Format values with confidence intervals as strings
246% Returns a cell array of strings in format
'mean ± ci_halfwidth'
248 strVals = cell(n, 1);
250 if isnan(vals(i)) || vals(i) == 0
251 strVals{i} = sprintf(
'%.4g', vals(i));
252 elseif isnan(ciVals(i)) || ciVals(i) == 0
253 strVals{i} = sprintf(
'%.4g', vals(i));
255 strVals{i} = sprintf(
'%.4g ± %.4g', vals(i), ciVals(i));
260function val = getCIValue(avgStruct, fieldName, ist, k)
261% GETCIVALUE Safely retrieve a CI value from
the Avg structure
262% Returns 0
if the field doesn
't exist or is empty
263 if isfield(avgStruct, fieldName) && ~isempty(avgStruct.(fieldName))
264 val = avgStruct.(fieldName)(ist, k);