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