LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
getAvgTable.m
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
4%
5% When confint option is enabled, values are displayed as 'mean ± ci_halfwidth'
6%
7% Copyright (c) 2012-2026, Imperial College London
8% All rights reserved.
9if GlobalConstants.DummyMode
10 [AvgTable, QT, UT, RT, TT, WT, AT] = deal(Table());
11 AvgTable = IndexedTable(AvgTable);
12 return
13end
14
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);
18 return
19end
20
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');
24
25if strcmp(self.options.lang,'java') && ~strcmp(self.name,'SolverLDES')
26 sn = self.model.getStruct;
27 M = sn.nstations;
28 R = sn.nclasses;
29 [QN,UN,RN,TN,AN,WN] = self.getAvg([],[],[],[],[],[]);
30
31 % Update hasCI after getAvg call
32 hasCI = confintEnabled && self.hasResults && isfield(self.result, 'Avg') && isfield(self.result.Avg, 'QCI');
33
34 [Qval, Uval, Rval, Tval, Wval, Aval] = deal([]);
35 [QCIval, UCIval, RCIval, TCIval, WCIval, ACIval] = deal([]);
36 JobClass = {};
37 Station = {};
38 for ist=1:M
39 for k=1:R
40 if any(sum([QN(ist,k),UN(ist,k),RN(ist,k),TN(ist,k),AN(ist,k),WN(ist,k)])>0)
41 c = sn.chains(:,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);
51 if hasCI
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);
58 end
59 end
60 end
61 end
62 Station = label(Station);
63 JobClass = label(JobClass);
64
65 if hasCI
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(:));
73 else
74 QLen = Qval(:);
75 Util = Uval(:);
76 RespT = Rval(:);
77 ResidT = Wval(:);
78 Tput = Tval(:);
79 ArvR = Aval(:);
80 end
81 QT = Table(Station,JobClass,QLen);
82 UT = Table(Station,JobClass,Util);
83 RT = Table(Station,JobClass,RespT);
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);
89 return
90end
91
92sn = getStruct(self);
93
94if nargin<8
95 keepDisabled = false;
96elseif isempty(Q) && isempty(U) && isempty(R) && isempty(T) && isempty(A) && isempty(W)
97 [Q,U,R,T,A,W] = getAvgHandles(self);
98end
99
100M = sn.nstations;
101K = sn.nclasses;
102if nargin == 2
103 if islogical(Q)
104 keepDisabled = Q;
105 elseif iscell(Q) && ~isempty(Q)
106 param = Q;
107 keepDisabled = param{5};
108 % case where varargin is passed as input
109 end
110 [Q,U,R,T,A,W] = getAvgHandles(self);
111elseif nargin == 1
112 [Q,U,R,T,A,W] = getAvgHandles(self);
113end
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)));
121else
122 [QN,UN,RN,TN,AN,WN] = self.getAvg(Q,U,R,T,A,W);
123end
124
125% Update hasCI after getAvg call
126hasCI = confintEnabled && self.hasResults && isfield(self.result, 'Avg') && isfield(self.result.Avg, 'QCI');
127
128% this is required because getAvg can alter the chain structure in the
129% presence of caches
130sn = self.model.getStruct;
131
132if isempty(QN)
133 [AvgTable, QT, UT, RT, TT, AT, WT] = deal(Table());
134elseif ~keepDisabled
135 [Qval, Uval, Rval, Tval, Wval, Aval] = deal([]);
136 [QCIval, UCIval, RCIval, TCIval, WCIval, ACIval] = deal([]);
137 JobClass = {};
138 Station = {};
139 for ist=1:M
140 for k=1:K
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);
152 if hasCI
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);
159 end
160 end
161 end
162 end
163 Station = label(Station);
164 JobClass = label(JobClass);
165
166 if hasCI
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(:));
174 else
175 QLen = Qval(:);
176 Util = Uval(:);
177 RespT = Rval(:);
178 ResidT = Wval(:);
179 Tput = Tval(:);
180 ArvR = Aval(:);
181 end
182 QT = Table(Station,JobClass,QLen);
183 UT = Table(Station,JobClass,Util);
184 RT = Table(Station,JobClass,RespT);
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);
189else
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);
193 Station = cell(K*M,1);
194 for ist=1:M
195 for k=1:K
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);
204 if hasCI
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);
211 end
212 end
213 end
214 Station = label(Station);
215 JobClass = label(JobClass);
216
217 if hasCI
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(:));
225 else
226 QLen = Qval(:);
227 Util = Uval(:);
228 RespT = Rval(:);
229 ResidT = Wval(:);
230 Tput = Tval(:);
231 ArvR = Aval(:);
232 end
233 QT = Table(Station,JobClass,QLen);
234 UT = Table(Station,JobClass,Util);
235 RT = Table(Station,JobClass,RespT);
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);
240end
241AvgTable = IndexedTable(AvgTable);
242end
243
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'
247 n = length(vals);
248 strVals = cell(n, 1);
249 for i = 1:n
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));
254 else
255 strVals{i} = sprintf('%.4g ± %.4g', vals(i), ciVals(i));
256 end
257 end
258end
259
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);
265 else
266 val = 0;
267 end
268end
Definition Station.m:245