LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
NetworkSolver.m
1classdef NetworkSolver < Solver
2 % NetworkSolver Abstract base class for queueing network solvers
3 %
4 % NetworkSolver provides the common interface and functionality for all
5 % solvers that can analyze Network models. It handles performance metric
6 % computation, language switching between MATLAB and Java implementations,
7 % and provides standardized solver initialization and execution patterns.
8 %
9 % @brief Abstract base class for all queueing network analysis solvers
10 %
11 % Key characteristics:
12 % - Abstract base for all network-specific solvers
13 % - Manages performance metric handles and computation
14 % - Supports both MATLAB native and Java/JLINE implementations
15 % - Provides standardized solver options and configuration
16 % - Handles model language switching and delegation
17 %
18 % NetworkSolver serves as the foundation for:
19 % - Analytical solvers (MVA, NC, CTMC, etc.)
20 % - Simulation solvers (JMT, SSA)
21 % - Approximation methods (Fluid, MAM, NN)
22 % - Automatic solver selection (AUTO)
23 %
24 % Example usage pattern:
25 % @code
26 % solver = SolverMVA(model, 'MyMVASolver');
27 % solver.getAvg(); % Get average performance metrics
28 % @endcode
29 %
30 % Copyright (c) 2012-2026, Imperial College London
31 % All rights reserved.
32
33
34 properties (Access = protected)
35 handles; % performance metric handles
36 end
37
38 methods
39
40 function self = NetworkSolver(model, name, options)
41 % NETWORKSOLVER Create a NetworkSolver instance
42 %
43 % @brief Creates a NetworkSolver with the specified model and options
44 % @param model Network model to be analyzed
45 % @param name String identifier for the solver instance
46 % @param options Optional SolverOptions structure for configuration
47 % @return self NetworkSolver instance ready for analysis
48 %
49 % The constructor initializes the solver with the provided model,
50 % validates inputs, sets options, and prepares performance metric handles.
51 self@Solver(model, name);
52 if isempty(model)
53 line_error(mfilename,'The model supplied in input is empty');
54 end
55 if nargin>=3 %exist('options','var'),
56 self.setOptions(options);
57 end
58 self.result = [];
59
60 if isempty(model.obj) % not a Java object
61 initHandles(self)
62 end
63 end
64
65 function setLang(self)
66 % NOTE: self.model is passed by reference so it affects the
67 % user model content
68 switch self.options.lang %
69 case 'matlab' % matlab solver
70 if self.model.isJavaNative() % java model
71 matlab_model = JLINE.jline_to_line(self.model.obj);
72 matlab_model.obj = self.model.obj;
73 self.model = matlab_model;
74 self.initHandles;
75 else % matlab model
76 % no-op
77 end
78 case 'java' % solver lang
79 joptions = self.options;
80 if ~isempty(self.model.obj) % java model
81 % no-op
82 else % matlab model
83 self.model.obj = JLINE.line_to_jline(self.model);
84 end
85 switch self.name
86 case 'SolverCTMC'
87 self.obj = JLINE.SolverCTMC(self.model.obj, joptions);
88 case 'SolverDES'
89 self.obj = JLINE.SolverDES(self.model.obj, joptions);
90 case {'SolverFluid','SolverFLD'}
91 self.obj = JLINE.SolverFluid(self.model.obj, joptions);
92 case 'SolverJMT'
93 self.obj = JLINE.SolverJMT(self.model.obj, joptions);
94 case 'SolverMAM'
95 self.obj = JLINE.SolverMAM(self.model.obj, joptions);
96 case 'SolverMVA'
97 self.obj = JLINE.SolverMVA(self.model.obj, joptions);
98 case 'SolverNC'
99 self.obj = JLINE.SolverNC(self.model.obj, joptions);
100 case 'SolverSSA'
101 self.obj = JLINE.SolverSSA(self.model.obj, joptions);
102 end
103 end
104 end
105
106 function initHandles(self)
107 [Q,U,R,T,A,W] = self.model.getAvgHandles();
108
109 % Get tardiness handles if available
110 if ismethod(self.model, 'getAvgTardHandles')
111 Tard = self.model.getAvgTardHandles();
112 else
113 Tard = [];
114 end
115 if ismethod(self.model, 'getAvgSysTardHandles')
116 SysTard = self.model.getAvgSysTardHandles();
117 else
118 SysTard = [];
119 end
120
121 self.setAvgHandles(Q,U,R,T,A,W,Tard,SysTard);
122
123 [Qt,Ut,Tt] = self.model.getTranHandles;
124 self.setTranHandles(Qt,Ut,Tt);
125
126 % refreshStruct is called lazily by model.getStruct() when first needed
127 end
128
129 function self = runAnalyzerChecks(self, options)
130 % Propagate solver verbose level to global so that model-level
131 % messages (e.g., priority info in refreshStruct) respect it
132 GlobalConstants.setVerbose(options.verbose);
133 if self.enableChecks && ~self.supports(self.model)
134 line_error(mfilename,'This model contains features not supported by the solver.\n');
135 end
136 if self.enableChecks && ~any(cellfun(@(s) strcmp(s,options.method),self.listValidMethods))
137 line_error(mfilename,sprintf('The ''%s'' method is unsupported by this solver.\n',options.method));
138 end
139 end
140
141 function self = setTranHandles(self,Qt,Ut,Tt)
142 self.handles.Qt = Qt;
143 self.handles.Ut = Ut;
144 self.handles.Tt = Tt;
145 end
146
147 function self = setAvgHandles(self,Q,U,R,T,A,W,Tard,SysTard)
148 self.handles.Q = Q;
149 self.handles.U = U;
150 self.handles.R = R;
151 self.handles.T = T;
152 self.handles.A = A;
153 self.handles.W = W;
154 if nargin >= 8
155 self.handles.Tard = Tard;
156 end
157 if nargin >= 9
158 self.handles.SysTard = SysTard;
159 end
160 end
161
162 function [Qt,Ut,Tt] = getTranHandles(self)
163 Qt = self.handles.Qt;
164 Ut = self.handles.Ut;
165 Tt = self.handles.Tt;
166 end
167
168 function [Q,U,R,T,A,W] = getAvgHandles(self)
169 if isempty(self.handles)
170 self.handles.Q = [];
171 self.handles.U = [];
172 self.handles.R = [];
173 self.handles.T = [];
174 self.handles.A = [];
175 self.handles.W = [];
176 self.handles.Tard = [];
177 self.handles.SysTard = [];
178 initHandles(self);
179 end
180 Q = self.handles.Q;
181 U = self.handles.U;
182 R = self.handles.R;
183 T = self.handles.T;
184 A = self.handles.A;
185 W = self.handles.W;
186 end
187
188 function Q = getAvgQLenHandles(self)
189 if isempty(self.handles) || ~isstruct(self.handles)
190 self.getAvgHandles();
191 end
192 Q = self.handles.Q;
193 end
194
195 function U = getAvgUtilHandles(self)
196 if isempty(self.handles) || ~isstruct(self.handles)
197 self.getAvgHandles();
198 end
199 U = self.handles.U;
200 end
201
202 function R = getAvgRespTHandles(self)
203 if isempty(self.handles) || ~isstruct(self.handles)
204 self.getAvgHandles();
205 end
206 R = self.handles.R;
207 end
208
209 function T = getAvgTputHandles(self)
210 if isempty(self.handles) || ~isstruct(self.handles)
211 self.getAvgHandles();
212 end
213 T = self.handles.T;
214 end
215
216 function A = getAvgArvRHandles(self)
217 if isempty(self.handles) || ~isstruct(self.handles)
218 self.getAvgHandles();
219 end
220 A = self.handles.A;
221 end
222
223 function W = getAvgResidTHandles(self)
224 if isempty(self.handles) || ~isstruct(self.handles)
225 self.getAvgHandles();
226 end
227 W = self.handles.W;
228 end
229 end
230
231
232 methods (Access = 'protected')
233 function bool = hasAvgResults(self)
234 % BOOL = HASAVGRESULTS()
235
236 % Returns true if the solver has computed steady-state average metrics.
237 bool = false;
238 if self.hasResults
239 if isfield(self.result,'Avg')
240 bool = true;
241 end
242 end
243 end
244
245 function bool = hasTranResults(self)
246 % BOOL = HASTRANRESULTS()
247
248 % Return true if the solver has computed transient average metrics.
249 bool = false;
250 if self.hasResults
251 if isfield(self.result,'Tran')
252 if isfield(self.result.Tran,'Avg')
253 bool = isfield(self.result.Tran.Avg,'Q');
254 end
255 end
256 end
257 end
258
259 function bool = hasDistribResults(self)
260 % BOOL = HASDISTRIBRESULTS()
261
262 % Return true if the solver has computed steady-state distribution metrics.
263 bool = false;
264 if self.hasResults
265 bool = isfield(self.result.Distribution,'C');
266 end
267 end
268 end
269
270 methods (Sealed)
271
272 function self = setModel(self, model)
273 % SELF = SETMODEL(MODEL)
274
275 % Assign the model to be solved.
276 self.model = model;
277 end
278
279 function QN = getAvgQLen(self)
280 % QN = GETAVGQLEN()
281
282 % Compute average queue-lengths at steady-state
283 Q = getAvgQLenHandles(self);
284 [QN,~,~,~] = self.getAvg(Q,[],[],[],[],[]);
285 end
286
287 function UN = getAvgUtil(self)
288 % UN = GETAVGUTIL()
289
290 % Compute average utilizations at steady-state
291 U = getAvgUtilHandles(self);
292 [~,UN,~,~] = self.getAvg([],U,[],[],[],[]);
293 end
294
295 function RN = getAvgRespT(self)
296 % RN = GETAVGRESPT()
297
298 % Compute average response times at steady-state
299 R = getAvgRespTHandles(self);
300 [~,~,RN,~] = self.getAvg([],[],R,[],[],[]);
301 end
302
303 function WN = getAvgResidT(self)
304 % WN = GETAVGRESIDT()
305
306 % Compute average residence times at steady-state
307 R = getAvgRespTHandles(self);
308 W = getAvgResidTHandles(self);
309 [~,~,~,~,~,WN] = self.getAvg([],[],R,[],[],W);
310 end
311
312 function WT = getAvgWaitT(self)
313 % RN = GETAVGWAITT()
314 % Compute average waiting time in queue excluding service
315 R = getAvgRespTHandles(self);
316 [~,~,RN,~] = self.getAvg([],[],R,[],[],[]);
317 if isempty(RN)
318 WT = [];
319 return
320 end
321 sn = self.model.getStruct;
322 WT = RN - 1./ sn.rates(:);
323 WT(sn.nodetype==NodeType.Source) = 0;
324 end
325
326 function TN = getAvgTput(self)
327 % TN = GETAVGTPUT()
328
329 % Compute average throughputs at steady-state
330 T = getAvgTputHandles(self);
331 [~,~,~,TN] = self.getAvg([],[],[],T,[],[]);
332 end
333
334 function AN = getAvgArvR(self)
335 % AN = GETAVGARVR()
336 sn = self.model.getStruct();
337
338 % Compute average arrival rate at steady-state
339 TH = getAvgTputHandles(self);
340 [~,~,~,TN] = self.getAvg([],[],[],TH,[],[]);
341 AN = sn_get_arvr_from_tput(sn, TN, TH);
342 end
343
344 % also accepts a cell array with the handlers in it
345 [QN,UN,RN,TN,AN,WN] = getAvg(self,Q,U,R,T,A,W);
346 [QN,UN,RN,TN,AN,WN] = getAvgNode(self,Q,U,R,T,A,W);
347
348 [AvgTable,QT,UT,RT,WT,AT,TT] = getAvgTable(self,Q,U,R,T,A,keepDisabled);
349
350 [AvgTable,QT] = getAvgQLenTable(self,Q,keepDisabled);
351 [AvgTable,UT] = getAvgUtilTable(self,U,keepDisabled);
352 [AvgTable,RT] = getAvgRespTTable(self,R,keepDisabled);
353 [AvgTable,TT] = getAvgTputTable(self,T,keepDisabled);
354
355 [NodeAvgTable,QTn,UTn,RTn,WTn,ATn,TTn] = getAvgNodeTable(self,Q,U,R,T,A,keepDisabled);
356 [AvgChain,QTc,UTc,RTc,WTc,ATc,TTc] = getAvgChainTable(self,Q,U,R,T);
357 [AvgChain,QTc,UTc,RTc,WTc,ATc,TTc] = getAvgNodeChainTable(self,Q,U,R,T);
358
359 [QNc,UNc,RNc,WNc,ANc,TNc] = getAvgChain(self,Q,U,R,T);
360 [QNc] = getAvgQLenChain(self,Q);
361 [UNc] = getAvgUtilChain(self,U);
362 [RNc] = getAvgRespTChain(self,R);
363 [WNc] = getAvgResidTChain(self,W);
364 [TNc] = getAvgTputChain(self,T);
365 [ANc] = getAvgArvRChain(self,A);
366 [QNc] = getAvgNodeQLenChain(self,Q);
367 [UNc] = getAvgNodeUtilChain(self,U);
368 [RNc] = getAvgNodeRespTChain(self,R);
369 [WNc] = getAvgNodeResidTChain(self,W);
370 [TNc] = getAvgNodeTputChain(self,T);
371 [ANc] = getAvgNodeArvRChain(sef,A);
372
373 [CNc,XNc] = getAvgSys(self,R,T);
374 [CT,XT] = getAvgSysTable(self,R,T);
375 [RN] = getAvgSysRespT(self,R);
376 [TN] = getAvgSysTput(self,T);
377
378
379 function self = setAvgResults(self,Q,U,R,T,A,W,C,X,runtime,method,iter)
380 % SELF = SETAVGRESULTS(SELF,Q,U,R,T,A,W,C,X,RUNTIME,METHOD,ITER)
381 % Store average metrics at steady-state
382 self.result.('solver') = getName(self);
383 if nargin<11 %~exist('method','var')
384 method = getOptions(self).method;
385 end
386 if nargin<12 %~exist('iter','var')
387 iter = NaN;
388 end
389 self.result.Avg.('method') = method;
390 self.result.Avg.('iter') = iter;
391 if isnan(Q), Q=[]; end
392 if isnan(R), R=[]; end
393 if isnan(T), T=[]; end
394 if isnan(U), U=[]; end
395 if isnan(X), X=[]; end
396 if isnan(C), C=[]; end
397 if isnan(A), A=[]; end
398 if isnan(W), W=[]; end
399 self.result.Avg.Q = real(Q);
400 self.result.Avg.R = real(R);
401 self.result.Avg.X = real(X);
402 self.result.Avg.U = real(U);
403 self.result.Avg.T = real(T);
404 self.result.Avg.C = real(C);
405 self.result.Avg.A = real(A);
406 self.result.Avg.W = real(W);
407 self.result.Avg.runtime = runtime;
408 if getOptions(self).verbose
409 try
410 solvername = erase(self.result.solver,'Solver');
411 catch
412 solvername = self.result.solver(7:end);
413 end
414 if isnan(iter) || iter==1 || strcmp(solvername,'DES') || strcmp(solvername,'SSA')
415 line_printf('%s analysis [method: %s, lang: %s, env: %s] completed in %fs.',solvername,self.result.Avg.method,self.options.lang,version("-release"),runtime);
416 else
417 line_printf('%s analysis [method: %s, lang: %s, env: %s] completed in %fs. Iterations: %d.',solvername,self.result.Avg.method,self.options.lang,version("-release"),runtime,iter);
418 end
419 line_printf('\n');
420 end
421 end
422
423 function self = setAvgResultsCI(self, QCI, UCI, RCI, TCI, ACI, WCI, CCI, XCI)
424 % SELF = SETAVGRESULTSCI(SELF, QCI, UCI, RCI, TCI, ACI, WCI, CCI, XCI)
425 % Store confidence interval bounds for average metrics
426 % Each CI parameter is an [M x K x 2] array with lower/upper bounds
427 % or an [M x K] array with half-widths (mean ± halfwidth)
428 if nargin >= 2 && ~isempty(QCI)
429 self.result.Avg.QCI = QCI;
430 end
431 if nargin >= 3 && ~isempty(UCI)
432 self.result.Avg.UCI = UCI;
433 end
434 if nargin >= 4 && ~isempty(RCI)
435 self.result.Avg.RCI = RCI;
436 end
437 if nargin >= 5 && ~isempty(TCI)
438 self.result.Avg.TCI = TCI;
439 end
440 if nargin >= 6 && ~isempty(ACI)
441 self.result.Avg.ACI = ACI;
442 end
443 if nargin >= 7 && ~isempty(WCI)
444 self.result.Avg.WCI = WCI;
445 end
446 if nargin >= 8 && ~isempty(CCI)
447 self.result.Avg.CCI = CCI;
448 end
449 if nargin >= 9 && ~isempty(XCI)
450 self.result.Avg.XCI = XCI;
451 end
452 end
453
454 function self = setDistribResults(self,Cd,runtime)
455 % SELF = SETDISTRIBRESULTS(SELF,CD,RUNTIME)
456
457 % Store distribution metrics at steady-state
458 self.result.('solver') = getName(self);
459 self.result.Distribution.('method') = getOptions(self).method;
460 self.result.Distribution.C = Cd;
461 self.result.Distribution.runtime = runtime;
462 end
463
464 function self = setTranProb(self,t,pi_t,SS,runtimet)
465 % SELF = SETTRANPROB(SELF,T,PI_T,SS,RUNTIMET)
466
467 % Store transient average metrics
468 self.result.('solver') = getName(self);
469 self.result.Tran.Prob.('method') = getOptions(self).method;
470 self.result.Tran.Prob.t = t;
471 self.result.Tran.Prob.pi_t = pi_t;
472 self.result.Tran.Prob.SS = SS;
473 self.result.Tran.Prob.runtime = runtimet;
474 end
475
476 function self = setTranAvgResults(self,Qt,Ut,Rt,Tt,Ct,Xt,runtimet)
477 % SELF = SETTRANAVGRESULTS(SELF,QT,UT,RT,TT,CT,XT,RUNTIMET)
478
479 % Store transient average metrics
480 self.result.('solver') = getName(self);
481 self.result.Tran.Avg.('method') = getOptions(self).method;
482 % Clear individual cells that are scalar NaN (not entire array)
483 for i=1:size(Qt,1), for r=1:size(Qt,2), if isscalar(Qt{i,r}) && any(isnan(Qt{i,r})), Qt{i,r}=[]; end, end, end
484 for i=1:size(Rt,1), for r=1:size(Rt,2), if isscalar(Rt{i,r}) && any(isnan(Rt{i,r})), Rt{i,r}=[]; end, end, end
485 for i=1:size(Ut,1), for r=1:size(Ut,2), if isscalar(Ut{i,r}) && any(isnan(Ut{i,r})), Ut{i,r}=[]; end, end, end
486 for i=1:size(Tt,1), for r=1:size(Tt,2), if isscalar(Tt{i,r}) && any(isnan(Tt{i,r})), Tt{i,r}=[]; end, end, end
487 for i=1:size(Xt,1), for r=1:size(Xt,2), if isscalar(Xt{i,r}) && any(isnan(Xt{i,r})), Xt{i,r}=[]; end, end, end
488 for i=1:size(Ct,1), for r=1:size(Ct,2), if isscalar(Ct{i,r}) && any(isnan(Ct{i,r})), Ct{i,r}=[]; end, end, end
489 self.result.Tran.Avg.Q = Qt;
490 self.result.Tran.Avg.R = Rt;
491 self.result.Tran.Avg.U = Ut;
492 self.result.Tran.Avg.T = Tt;
493 self.result.Tran.Avg.X = Xt;
494 self.result.Tran.Avg.C = Ct;
495 self.result.Tran.Avg.runtime = runtimet;
496 end
497
498 end
499
500 methods
501 [QNt,UNt,TNt] = getTranAvg(self,Qt,Ut,Tt);
502
503 function [lNormConst] = getProbNormConstAggr(self)
504 % [LNORMCONST] = GETPROBNORMCONST()
505
506 % Return normalizing constant of state probabilities
507 line_error(mfilename,sprintf('getProbNormConstAggr is not supported by %s',class(self)));
508 end
509
510 function Pstate = getProb(self, node, state)
511 % PSTATE = GETPROBSTATE(NODE, STATE)
512
513 % Return marginal state probability for station ist state
514 line_error(mfilename,sprintf('getProb is not supported by %s',class(self)));
515 end
516
517 function Psysstate = getProbSys(self)
518 % PSYSSTATE = GETPROBSYSSTATE()
519
520 % Return joint state probability
521 line_error(mfilename,sprintf('getProbSys is not supported by %s',class(self)));
522 end
523
524 function Pnir = getProbAggr(self, node, state_a)
525 % PNIR = GETPROBSTATEAGGR(NODE, STATE_A)
526
527 % Return marginal state probability for station ist state
528 line_error(mfilename,sprintf('getProbAggr is not supported by %s',class(self)));
529 end
530
531 function Pnjoint = getProbSysAggr(self)
532 % PNJOINT = GETPROBSYSSTATEAGGR()
533
534 % Return joint state probability
535 line_error(mfilename,sprintf('getProbSysAggr is not supported by %s',class(self)));
536 end
537
538 function Pmarg = getProbMarg(self, node, jobclass, state_m)
539 % PMARG = GETPROBMARG(NODE, JOBCLASS, STATE_M)
540
541 % Return marginalized state probability for station and class
542 % This computes probabilities marginalized on a given class, in contrast to
543 % getProbAggr which aggregates over all classes.
544 line_error(mfilename,sprintf('getProbMarg is not supported by %s',class(self)));
545 end
546
547 function tstate = sample(self, node, numEvents)
548 % TSTATE = SAMPLE(NODE, numEvents)
549
550 % Return marginal state probability for station ist state
551 line_error(mfilename,sprintf('sample is not supported by %s',class(self)));
552 end
553
554 function tstate = sampleAggr(self, node, numEvents)
555 % TSTATE = SAMPLEAGGR(NODE, numEvents)
556
557 % Return marginal state probability for station ist state
558 line_error(mfilename,sprintf('sampleAggr is not supported by %s',class(self)));
559 end
560
561 function tstate = sampleSys(self, numEvents)
562 % TSTATE = SAMPLESYS(numEvents)
563
564 % Return joint state probability
565 line_error(mfilename,sprintf('sampleSys is not supported by %s',class(self)));
566 end
567
568 function tstate = sampleSysAggr(self, numEvents)
569 % TSTATE = SAMPLESYSAGGR(numEvents)
570
571 % Return joint state probability
572 line_error(mfilename,sprintf('sampleSysAggr is not supported by %s',class(self)));
573 end
574
575 function RD = getCdfRespT(self, R)
576 % RD = GETCDFRESPT(R)
577
578 % Return cumulative distribution of response times at steady-state
579 % This uses a trivial approximation that assumes exponential
580 % distributions everywhere with mean as RN(i,r)
581
582 sn = self.getStruct;
583 RD = cell(sn.nstations,sn.nclasses);
584 if GlobalConstants.DummyMode
585 return
586 end
587 T0 = tic;
588 if nargin<2 %~exist('R','var')
589 R = self.getAvgRespTHandles;
590 % to do: check if some R are disabled
591 end
592 if ~self.hasAvgResults
593 self.getAvg; % get steady-state solution
594 end
595 for i=1:sn.nstations
596 if sn.nodetype(sn.stationToNode(i)) ~= NodeType.Source
597 for c=1:sn.nclasses
598 if isfinite(self.result.Avg.R(i,c)) && self.result.Avg.R(i,c)>0
599 lambda = 1/self.result.Avg.R(i,c);
600 n = 100; % number of points
601 quantiles = linspace(0.001, 0.999, n);
602 RD{i,c} = [quantiles;-log(1 - quantiles) / lambda]';
603 else
604 RD{i,c} = [1,0];
605 end
606 end
607 end
608 end
609 runtime = toc(T0);
610 self.setDistribResults(RD, runtime);
611 end
612
613 function RD = getTranCdfRespT(self, R)
614 % RD = GETTRANCDFRESPT(R)
615
616 % Return cumulative distribution of response times during transient
617 line_error(mfilename,sprintf('getTranCdfRespT is not supported by %s',class(self)));
618 end
619
620 function RD = getCdfPassT(self, R)
621 % RD = GETCDFPASST(R)
622
623 % Return cumulative distribution of passage times at steady-state
624 line_error(mfilename,sprintf('getCdfPassT is not supported by %s',class(self)));
625 end
626
627 function RD = getTranCdfPassT(self, R)
628 % RD = GETTRANCDFPASST(R)
629
630 % Return cumulative distribution of passage times during transient
631 line_error(mfilename,sprintf('getTranCdfPassT is not supported by %s',class(self)));
632 end
633
634 % Kotlin-style aliases for getAvg* methods
635 function avg_table = avgTable(self)
636 % AVGTABLE Kotlin-style alias for getAvgTable
637 avg_table = self.getAvgTable();
638 end
639
640 function avg_sys_table = avgSysTable(self)
641 % AVGSYSTABLE Kotlin-style alias for getAvgSysTable
642 avg_sys_table = self.getAvgSysTable();
643 end
644
645 function avg_node_table = avgNodeTable(self)
646 % AVGNODETABLE Kotlin-style alias for getAvgNodeTable
647 avg_node_table = self.getAvgNodeTable();
648 end
649
650 function avg_chain_table = avgChainTable(self)
651 % AVGCHAINTABLE Kotlin-style alias for getAvgChainTable
652 avg_chain_table = self.getAvgChainTable();
653 end
654
655 function avg_node_chain_table = avgNodeChainTable(self)
656 % AVGNODECHAINTABLE Kotlin-style alias for getAvgNodeChainTable
657 avg_node_chain_table = self.getAvgNodeChainTable();
658 end
659
660 % Table -> T aliases
661 function avg_table = avgT(self)
662 % AVGT Short alias for avgTable
663 avg_table = self.avgTable();
664 end
665
666 function avg_sys_table = avgSysT(self)
667 % AVGSYST Short alias for avgSysTable
668 avg_sys_table = self.avgSysTable();
669 end
670
671 function avg_node_table = avgNodeT(self)
672 % AVGNODET Short alias for avgNodeTable
673 avg_node_table = self.avgNodeTable();
674 end
675
676 function avg_chain_table = avgChainT(self)
677 % AVGCHAINT Short alias for avgChainTable
678 avg_chain_table = self.avgChainTable();
679 end
680
681 function avg_node_chain_table = avgNodeChainT(self)
682 % AVGNODECHAINT Short alias for avgNodeChainTable
683 avg_node_chain_table = self.avgNodeChainTable();
684 end
685
686 function varargout = avgChain(self, varargin)
687 % AVGCHAIN Kotlin-style alias for getAvgChain
688 [varargout{1:nargout}] = self.getAvgChain(varargin{:});
689 end
690
691 function varargout = avgSys(self, varargin)
692 % AVGSYS Kotlin-style alias for getAvgSys
693 [varargout{1:nargout}] = self.getAvgSys(varargin{:});
694 end
695
696 function varargout = avgNode(self, varargin)
697 % AVGNODE Kotlin-style alias for getAvgNode
698 [varargout{1:nargout}] = self.getAvgNode(varargin{:});
699 end
700
701 function sys_resp_time = avgSysRespT(self, varargin)
702 % AVGSYSRESPT Kotlin-style alias for getAvgSysRespT
703 sys_resp_time = self.getAvgSysRespT(varargin{:});
704 end
705
706 function sys_tput = avgSysTput(self, varargin)
707 % AVGSYSTPUT Kotlin-style alias for getAvgSysTput
708 sys_tput = self.getAvgSysTput(varargin{:});
709 end
710
711 function arvr_chain = avgArvRChain(self, varargin)
712 % AVGARVCHAIN Kotlin-style alias for getAvgArvRChain
713 arvr_chain = self.getAvgArvRChain(varargin{:});
714 end
715
716 function qlen_chain = avgQLenChain(self, varargin)
717 % AVGQLENCHAIN Kotlin-style alias for getAvgQLenChain
718 qlen_chain = self.getAvgQLenChain(varargin{:});
719 end
720
721 function util_chain = avgUtilChain(self, varargin)
722 % AVGUTILCHAIN Kotlin-style alias for getAvgUtilChain
723 util_chain = self.getAvgUtilChain(varargin{:});
724 end
725
726 function resp_t_chain = avgRespTChain(self, varargin)
727 % AVGRESPTCHAIN Kotlin-style alias for getAvgRespTChain
728 resp_t_chain = self.getAvgRespTChain(varargin{:});
729 end
730
731 function resid_t_chain = avgResidTChain(self, varargin)
732 % AVGRESIDTCHAIN Kotlin-style alias for getAvgResidTChain
733 resid_t_chain = self.getAvgResidTChain(varargin{:});
734 end
735
736 function tput_chain = avgTputChain(self, varargin)
737 % AVGTPUTCHAIN Kotlin-style alias for getAvgTputChain
738 tput_chain = self.getAvgTputChain(varargin{:});
739 end
740
741 function node_arvr_chain = avgNodeArvRChain(self, varargin)
742 % AVGNODERVRCHAIN Kotlin-style alias for getAvgNodeArvRChain
743 node_arvr_chain = self.getAvgNodeArvRChain(varargin{:});
744 end
745
746 function node_qlen_chain = avgNodeQLenChain(self, varargin)
747 % AVGNODEQLENCHAIN Kotlin-style alias for getAvgNodeQLenChain
748 node_qlen_chain = self.getAvgNodeQLenChain(varargin{:});
749 end
750
751 function node_util_chain = avgNodeUtilChain(self, varargin)
752 % AVGNODEUTILCHAIN Kotlin-style alias for getAvgNodeUtilChain
753 node_util_chain = self.getAvgNodeUtilChain(varargin{:});
754 end
755
756 function node_resp_t_chain = avgNodeRespTChain(self, varargin)
757 % AVGNODERESPTCHAIN Kotlin-style alias for getAvgNodeRespTChain
758 node_resp_t_chain = self.getAvgNodeRespTChain(varargin{:});
759 end
760
761 function node_resid_t_chain = avgNodeResidTChain(self, varargin)
762 % AVGNODERESIDTCHAIN Kotlin-style alias for getAvgNodeResidTChain
763 node_resid_t_chain = self.getAvgNodeResidTChain(varargin{:});
764 end
765
766 function node_tput_chain = avgNodeTputChain(self, varargin)
767 % AVGNODETPUTCHAIN Kotlin-style alias for getAvgNodeTputChain
768 node_tput_chain = self.getAvgNodeTputChain(varargin{:});
769 end
770
771 % Kotlin-style aliases for getTran* methods
772 function varargout = tranAvg(self, varargin)
773 % TRANAVG Kotlin-style alias for getTranAvg
774 [varargout{1:nargout}] = self.getTranAvg(varargin{:});
775 end
776
777 function rd = tranCdfRespT(self, varargin)
778 % TRANCDFRESPT Kotlin-style alias for getTranCdfRespT
779 rd = self.getTranCdfRespT(varargin{:});
780 end
781
782 function rd = tranCdfPassT(self, varargin)
783 % TRANCDFPASST Kotlin-style alias for getTranCdfPassT
784 rd = self.getTranCdfPassT(varargin{:});
785 end
786
787 % Kotlin-style aliases for getCdf* methods
788 function rd = cdfRespT(self, varargin)
789 % CDFRESPT Kotlin-style alias for getCdfRespT
790 rd = self.getCdfRespT(varargin{:});
791 end
792
793 function rd = cdfPassT(self, varargin)
794 % CDFPASST Kotlin-style alias for getCdfPassT
795 rd = self.getCdfPassT(varargin{:});
796 end
797
798 % Kotlin-style aliases for getProb* methods
799 function pstate = prob(self, varargin)
800 % PROB Kotlin-style alias for getProb
801 pstate = self.getProb(varargin{:});
802 end
803
804 function psysstate = probSys(self)
805 % PROBSYS Kotlin-style alias for getProbSys
806 psysstate = self.getProbSys();
807 end
808
809 function pnir = probAggr(self, varargin)
810 % PROBAGGR Kotlin-style alias for getProbAggr
811 pnir = self.getProbAggr(varargin{:});
812 end
813
814 function pnjoint = probSysAggr(self)
815 % PROBSYSAGGR Kotlin-style alias for getProbSysAggr
816 pnjoint = self.getProbSysAggr();
817 end
818
819 function pmarg = probMarg(self, varargin)
820 % PROBMARG Kotlin-style alias for getProbMarg
821 pmarg = self.getProbMarg(varargin{:});
822 end
823
824 function lnormconst = probNormConstAggr(self)
825 % PROBNORMCONSTAGGR Kotlin-style alias for getProbNormConstAggr
826 lnormconst = self.getProbNormConstAggr();
827 end
828
829 % Kotlin-style aliases for get*Handles methods
830 function varargout = avgHandles(self)
831 % AVGHANDLES Kotlin-style alias for getAvgHandles
832 [varargout{1:nargout}] = self.getAvgHandles();
833 end
834
835 function varargout = tranHandles(self)
836 % TRANHANDLES Kotlin-style alias for getTranHandles
837 [varargout{1:nargout}] = self.getTranHandles();
838 end
839
840 function q = avgQLenHandles(self)
841 % AVGQLENHANDLES Kotlin-style alias for getAvgQLenHandles
842 q = self.getAvgQLenHandles();
843 end
844
845 function u = avgUtilHandles(self)
846 % AVGUTILHANDLES Kotlin-style alias for getAvgUtilHandles
847 u = self.getAvgUtilHandles();
848 end
849
850 function r = avgRespTHandles(self)
851 % AVGRESPTHANDLES Kotlin-style alias for getAvgRespTHandles
852 r = self.getAvgRespTHandles();
853 end
854
855 function t = avgTputHandles(self)
856 % AVGTPUTHANDLES Kotlin-style alias for getAvgTputHandles
857 t = self.getAvgTputHandles();
858 end
859
860 function a = avgArvRHandles(self)
861 % AVGARVRHANDLES Kotlin-style alias for getAvgArvRHandles
862 a = self.getAvgArvRHandles();
863 end
864
865 function w = avgResidTHandles(self)
866 % AVGRESIDTHANDLES Kotlin-style alias for getAvgResidTHandles
867 w = self.getAvgResidTHandles();
868 end
869
870 % Kotlin-style aliases for basic get* methods
871 function qn = avgQLen(self)
872 % AVGQLEN Kotlin-style alias for getAvgQLen
873 qn = self.getAvgQLen();
874 end
875
876 function un = avgUtil(self)
877 % AVGUTIL Kotlin-style alias for getAvgUtil
878 un = self.getAvgUtil();
879 end
880
881 function rn = avgRespT(self)
882 % AVGRESPT Kotlin-style alias for getAvgRespT
883 rn = self.getAvgRespT();
884 end
885
886 function wn = avgResidT(self)
887 % AVGRESIDT Kotlin-style alias for getAvgResidT
888 wn = self.getAvgResidT();
889 end
890
891 function wt = avgWaitT(self)
892 % AVGWAITT Kotlin-style alias for getAvgWaitT
893 wt = self.getAvgWaitT();
894 end
895
896 function tn = avgTput(self)
897 % AVGTPUT Kotlin-style alias for getAvgTput
898 tn = self.getAvgTput();
899 end
900
901 function an = avgArvR(self)
902 % AVGARVR Kotlin-style alias for getAvgArvR
903 an = self.getAvgArvR();
904 end
905
906 end
907
908 methods (Static)
909 function solvers = getAllSolvers(model, options)
910 % SOLVERS = GETALLSOLVERS(MODEL, OPTIONS)
911
912 % Return a cell array with all Network solvers
913 if nargin<2 %~exist('options','var')
914 options = Solver.defaultOptions;
915 end
916 solvers = {};
917 solvers{end+1} = SolverCTMC(model, options);
918 solvers{end+1} = SolverFluid(model, options);
919 solvers{end+1} = SolverJMT(model, options);
920 solvers{end+1} = SolverMAM(model, options);
921 solvers{end+1} = SolverMVA(model, options);
922 solvers{end+1} = SolverNC(model, options);
923 solvers{end+1} = SolverSSA(model, options);
924 end
925 end
926
927end