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
15% Check if confidence intervals should be displayed
16[confintEnabled, ~] = Solver.parseConfInt(self.options.confint);
17hasCI = confintEnabled && self.hasResults && isfield(self.result, 'Avg') && isfield(self.result.Avg, 'QCI');
18
19if strcmp(self.options.lang,'java') && ~strcmp(self.name,'SolverDES')
20 sn = self.model.getStruct;
21 M = sn.nstations;
22 R = sn.nclasses;
23 [QN,UN,RN,TN,AN,WN] = self.getAvg([],[],[],[],[],[]);
24
25 % Update hasCI after getAvg call
26 hasCI = confintEnabled && self.hasResults && isfield(self.result, 'Avg') && isfield(self.result.Avg, 'QCI');
27
28 [Qval, Uval, Rval, Tval, Wval, Aval] = deal([]);
29 [QCIval, UCIval, RCIval, TCIval, WCIval, ACIval] = deal([]);
30 JobClass = {};
31 Station = {};
32 for ist=1:M
33 for k=1:R
34 if any(sum([QN(ist,k),UN(ist,k),RN(ist,k),TN(ist,k),AN(ist,k),WN(ist,k)])>0)
35 c = sn.chains(:,k)>0;
36 inchain = sn.inchain{c};
37 JobClass{end+1,1} = sn.classnames{k};
38 Station{end+1,1} = sn.nodenames{sn.stationToNode(ist)};
39 Qval(end+1) = QN(ist,k);
40 Uval(end+1) = UN(ist,k);
41 Rval(end+1) = RN(ist,k);
42 Tval(end+1) = TN(ist,k);
43 Wval(end+1) = WN(ist,k);
44 Aval(end+1) = AN(ist,k);
45 if hasCI
46 QCIval(end+1) = getCIValue(self.result.Avg, 'QCI', ist, k);
47 UCIval(end+1) = getCIValue(self.result.Avg, 'UCI', ist, k);
48 RCIval(end+1) = getCIValue(self.result.Avg, 'RCI', ist, k);
49 TCIval(end+1) = getCIValue(self.result.Avg, 'TCI', ist, k);
50 WCIval(end+1) = getCIValue(self.result.Avg, 'WCI', ist, k);
51 ACIval(end+1) = getCIValue(self.result.Avg, 'ACI', ist, k);
52 end
53 end
54 end
55 end
56 Station = label(Station);
57 JobClass = label(JobClass);
58
59 if hasCI
60 % Format values with CI as strings
61 QLen = formatWithCI(Qval(:), QCIval(:));
62 Util = formatWithCI(Uval(:), UCIval(:));
63 RespT = formatWithCI(Rval(:), RCIval(:));
64 ResidT = formatWithCI(Wval(:), WCIval(:));
65 Tput = formatWithCI(Tval(:), TCIval(:));
66 ArvR = formatWithCI(Aval(:), ACIval(:));
67 else
68 QLen = Qval(:);
69 Util = Uval(:);
70 RespT = Rval(:);
71 ResidT = Wval(:);
72 Tput = Tval(:);
73 ArvR = Aval(:);
74 end
75 QT = Table(Station,JobClass,QLen);
76 UT = Table(Station,JobClass,Util);
77 RT = Table(Station,JobClass,RespT);
78 WT = Table(Station,JobClass,ResidT);
79 TT = Table(Station,JobClass,Tput);
80 AT = Table(Station,JobClass,ArvR);
81 AvgTable = Table(Station, JobClass, QLen, Util, RespT, ResidT, ArvR, Tput);
82 AvgTable = IndexedTable(AvgTable);
83 return
84end
85
86sn = getStruct(self);
87
88if nargin<8
89 keepDisabled = false;
90elseif isempty(Q) && isempty(U) && isempty(R) && isempty(T) && isempty(A) && isempty(W)
91 [Q,U,R,T,A,W] = getAvgHandles(self);
92end
93
94M = sn.nstations;
95K = sn.nclasses;
96if nargin == 2
97 if islogical(Q)
98 keepDisabled = Q;
99 elseif iscell(Q) && ~isempty(Q)
100 param = Q;
101 keepDisabled = param{5};
102 % case where varargin is passed as input
103 end
104 [Q,U,R,T,A,W] = getAvgHandles(self);
105elseif nargin == 1
106 [Q,U,R,T,A,W] = getAvgHandles(self);
107end
108if isfinite(self.getOptions.timespan(2))
109 [Qt,Ut,Tt] = getTranHandles(self);
110 [QNt,UNt,TNt] = self.getTranAvg(Qt,Ut,Tt);
111 QN = cellfun(@(c) c.metric(end),QNt);
112 UN = cellfun(@(c) c.metric(end),UNt);
113 TN = cellfun(@(c) c.metric(end),TNt);
114 [RN, WN, AN] = deal(zeros(size(QN)));
115else
116 [QN,UN,RN,TN,AN,WN] = self.getAvg(Q,U,R,T,A,W);
117end
118
119% Update hasCI after getAvg call
120hasCI = confintEnabled && self.hasResults && isfield(self.result, 'Avg') && isfield(self.result.Avg, 'QCI');
121
122% this is required because getAvg can alter the chain structure in the
123% presence of caches
124sn = self.model.getStruct;
125
126if isempty(QN)
127 [AvgTable, QT, UT, RT, TT, AT, WT] = deal(Table());
128elseif ~keepDisabled
129 [Qval, Uval, Rval, Tval, Wval, Aval] = deal([]);
130 [QCIval, UCIval, RCIval, TCIval, WCIval, ACIval] = deal([]);
131 JobClass = {};
132 Station = {};
133 for ist=1:M
134 for k=1:K
135 if any(sum([QN(ist,k),UN(ist,k),RN(ist,k),TN(ist,k),AN(ist,k),WN(ist,k)])>0)
136 c = sn.chains(:,k)>0;
137 inchain = sn.inchain{c};
138 JobClass{end+1,1} = char(Q{ist,k}.class.name);
139 Station{end+1,1} = char(Q{ist,k}.station.name);
140 Qval(end+1) = QN(ist,k);
141 Uval(end+1) = UN(ist,k);
142 Rval(end+1) = RN(ist,k);
143 Wval(end+1) = WN(ist,k);
144 Tval(end+1) = TN(ist,k);
145 Aval(end+1) = AN(ist,k);
146 if hasCI
147 QCIval(end+1) = getCIValue(self.result.Avg, 'QCI', ist, k);
148 UCIval(end+1) = getCIValue(self.result.Avg, 'UCI', ist, k);
149 RCIval(end+1) = getCIValue(self.result.Avg, 'RCI', ist, k);
150 WCIval(end+1) = getCIValue(self.result.Avg, 'WCI', ist, k);
151 TCIval(end+1) = getCIValue(self.result.Avg, 'TCI', ist, k);
152 ACIval(end+1) = getCIValue(self.result.Avg, 'ACI', ist, k);
153 end
154 end
155 end
156 end
157 Station = label(Station);
158 JobClass = label(JobClass);
159
160 if hasCI
161 % Format values with CI as strings
162 QLen = formatWithCI(Qval(:), QCIval(:));
163 Util = formatWithCI(Uval(:), UCIval(:));
164 RespT = formatWithCI(Rval(:), RCIval(:));
165 ResidT = formatWithCI(Wval(:), WCIval(:));
166 Tput = formatWithCI(Tval(:), TCIval(:));
167 ArvR = formatWithCI(Aval(:), ACIval(:));
168 else
169 QLen = Qval(:);
170 Util = Uval(:);
171 RespT = Rval(:);
172 ResidT = Wval(:);
173 Tput = Tval(:);
174 ArvR = Aval(:);
175 end
176 QT = Table(Station,JobClass,QLen);
177 UT = Table(Station,JobClass,Util);
178 RT = Table(Station,JobClass,RespT);
179 WT = Table(Station,JobClass,ResidT);
180 TT = Table(Station,JobClass,Tput);
181 AT = Table(Station,JobClass,ArvR);
182 AvgTable = Table(Station, JobClass, QLen, Util, RespT, ResidT, ArvR, Tput);
183else
184 [Qval, Uval, Rval, Wval, Tval, Aval] = deal(zeros(M, K));
185 [QCIval, UCIval, RCIval, WCIval, TCIval, ACIval] = deal(zeros(M, K));
186 JobClass = cell(K*M,1);
187 Station = cell(K*M,1);
188 for ist=1:M
189 for k=1:K
190 JobClass{(ist-1)*K+k} = Q{ist,k}.class.name;
191 Station{(ist-1)*K+k} = Q{ist,k}.station.name;
192 Qval((ist-1)*K+k) = QN(ist,k);
193 Uval((ist-1)*K+k) = UN(ist,k);
194 Rval((ist-1)*K+k) = RN(ist,k);
195 Wval((ist-1)*K+k) = WN(ist,k);
196 Tval((ist-1)*K+k) = TN(ist,k);
197 Aval((ist-1)*K+k) = AN(ist,k);
198 if hasCI
199 QCIval((ist-1)*K+k) = getCIValue(self.result.Avg, 'QCI', ist, k);
200 UCIval((ist-1)*K+k) = getCIValue(self.result.Avg, 'UCI', ist, k);
201 RCIval((ist-1)*K+k) = getCIValue(self.result.Avg, 'RCI', ist, k);
202 WCIval((ist-1)*K+k) = getCIValue(self.result.Avg, 'WCI', ist, k);
203 TCIval((ist-1)*K+k) = getCIValue(self.result.Avg, 'TCI', ist, k);
204 ACIval((ist-1)*K+k) = getCIValue(self.result.Avg, 'ACI', ist, k);
205 end
206 end
207 end
208 Station = label(Station);
209 JobClass = label(JobClass);
210
211 if hasCI
212 % Format values with CI as strings
213 QLen = formatWithCI(Qval(:), QCIval(:));
214 Util = formatWithCI(Uval(:), UCIval(:));
215 RespT = formatWithCI(Rval(:), RCIval(:));
216 ResidT = formatWithCI(Wval(:), WCIval(:));
217 Tput = formatWithCI(Tval(:), TCIval(:));
218 ArvR = formatWithCI(Aval(:), ACIval(:));
219 else
220 QLen = Qval(:);
221 Util = Uval(:);
222 RespT = Rval(:);
223 ResidT = Wval(:);
224 Tput = Tval(:);
225 ArvR = Aval(:);
226 end
227 QT = Table(Station,JobClass,QLen);
228 UT = Table(Station,JobClass,Util);
229 RT = Table(Station,JobClass,RespT);
230 WT = Table(Station,JobClass,ResidT);
231 TT = Table(Station,JobClass,Tput);
232 AT = Table(Station,JobClass,ArvR);
233 AvgTable = Table(Station, JobClass, QLen, Util, RespT, ResidT, ArvR, Tput);
234end
235AvgTable = IndexedTable(AvgTable);
236end
237
238function strVals = formatWithCI(vals, ciVals)
239% FORMATWITHCI Format values with confidence intervals as strings
240% Returns a cell array of strings in format 'mean ± ci_halfwidth'
241 n = length(vals);
242 strVals = cell(n, 1);
243 for i = 1:n
244 if isnan(vals(i)) || vals(i) == 0
245 strVals{i} = sprintf('%.4g', vals(i));
246 elseif isnan(ciVals(i)) || ciVals(i) == 0
247 strVals{i} = sprintf('%.4g', vals(i));
248 else
249 strVals{i} = sprintf('%.4g ± %.4g', vals(i), ciVals(i));
250 end
251 end
252end
253
254function val = getCIValue(avgStruct, fieldName, ist, k)
255% GETCIVALUE Safely retrieve a CI value from the Avg structure
256% Returns 0 if the field doesn't exist or is empty
257 if isfield(avgStruct, fieldName) && ~isempty(avgStruct.(fieldName))
258 val = avgStruct.(fieldName)(ist, k);
259 else
260 val = 0;
261 end
262end