2 % SolverAuto Automatic solver selection based on model characteristics
4 % SolverAuto
is an intelligent solver that automatically selects the most
5 % appropriate solution method based on the characteristics of the queueing
6 % network model. It analyzes model properties such as network type,
class
7 % types, scheduling policies, and size to determine the optimal solver.
9 % @brief Intelligent automatic solver selection
for queueing network models
11 % The solver can choose from multiple candidate solvers including:
12 % - MVA (Mean Value Analysis)
for product-form networks
13 % - NC (Normalizing Constant)
for closed networks
14 % - MAM (Matrix Analytic Methods)
for non-product-form features
15 % - Fluid approximation
for large-scale models
16 % - JMT simulation
for complex models
17 % - SSA (Stochastic State-space Analysis)
for detailed analysis
18 % - CTMC (Continuous Time Markov Chain)
for small state spaces
19 % - LQNS
for layered queueing networks
21 % The selection process considers model complexity, solver accuracy,
22 % and computational efficiency to provide optimal performance.
24 % Copyright (c) 2012-2026, Imperial College London
25 % All rights reserved.
27 properties (Hidden, Access =
public)
41 % LayeredNetwork solvers
46 CANDIDATE_LN_FLUID = 5;
48 CANDIDATE_ENV_MVA = 1;
50 CANDIDATE_ENV_FLUID = 3;
54 candidates; % feasible solvers
66 function self = SolverAUTO(model, varargin)
67 % SOLVERAUTO Create an automatic solver instance
69 % @brief Creates a SolverAUTO instance that automatically selects solvers
70 % @param model Network or LayeredNetwork model to be solved
71 % @param varargin Optional parameters for solver configuration
72 % @return self SolverAuto instance configured for the given model
73 self.options = Solver.parseOptions(varargin, Solver.defaultOptions);
75 self.name = 'SolverAuto';
76 if self.options.verbose
77 %line_printf('Running LINE version %s',model.getVersion);
79 switch self.options.method
81 % Best simulator - JMT for most cases
82 self.options.method = 'default';
85 self.solvers{1,1} = SolverJMT(model,self.options);
87 self.solvers{1,1} = SolverLQNS(model,self.options);
89 self.solvers{1,1} = SolverENV(model,@(m) SolverJMT(m,
'verbose',
false),self.options);
92 % Best exact method - NC
for closed, CTMC
for small state space
93 self.options.method =
'default';
96 sn = model.getStruct(
true);
97 if all(isfinite(sn.njobs)) % closed network
98 self.solvers{1,1} = SolverNC(model,self.options);
100 self.solvers{1,1} = SolverCTMC(model,self.options);
102 case 'LayeredNetwork'
103 self.solvers{1,1} = SolverLN(model,@(m) SolverNC(m,
'verbose',
false),self.options);
105 self.solvers{1,1} = SolverENV(model,@(m) SolverNC(m,
'verbose',
false),self.options);
108 % Fast approximate method - MVA (fastest analytical)
109 self.options.method =
'default';
112 self.solvers{1,1} = SolverMVA(model,self.options);
113 case 'LayeredNetwork'
114 self.solvers{1,1} = SolverLN(model,@(m) SolverMVA(m,
'verbose',
false),self.options);
116 self.solvers{1,1} = SolverENV(model,@(m) SolverMVA(m,
'verbose',
false),self.options);
119 % Accurate approximate method - Fluid or MAM
120 self.options.method =
'default';
123 self.solvers{1,1} = SolverFluid(model,self.options);
124 case 'LayeredNetwork'
125 self.solvers{1,1} = SolverLN(model,@(m) SolverFluid(m,
'verbose',
false),self.options);
127 self.solvers{1,1} = SolverENV(model,@(m) SolverFluid(m,
'verbose',
false),self.options);
130 self.options.method =
'default';
131 self.solvers{1,1} = SolverMAM(model,self.options);
133 self.options.method =
'default';
134 self.solvers{1,1} = SolverMVA(model,self.options);
136 self.options.method =
'default';
137 self.solvers{1,1} = SolverNC(model,self.options);
139 self.options.method =
'default';
140 self.solvers{1,1} = SolverFluid(model,self.options);
142 self.options.method =
'default';
143 self.solvers{1,1} = SolverJMT(model,self.options);
145 self.options.method =
'default';
146 self.solvers{1,1} = SolverSSA(model,self.options);
148 self.options.method =
'default';
149 self.solvers{1,1} = SolverCTMC(model,self.options);
151 self.options.method =
'default';
152 self.solvers{1,1} = SolverDES(model,self.options);
154 self.options.method =
'default';
155 self.solvers{1,1} = SolverENV(model,@(m) SolverMVA(m,
'verbose',
false),self.options);
157 self.options.method =
'default';
158 self.solvers{1,1} = SolverLN(model,self.options);
160 self.options.method =
'default';
161 self.solvers{1,1} = SolverLQNS(model,self.options);
162 case {
'default',
'heur'} %
'ai' method not yet available
163 %solvers sorted from fastest to slowest
167 self.solvers{1,self.CANDIDATE_MAM} = SolverMAM(model);
168 self.solvers{1,self.CANDIDATE_MVA} = SolverMVA(model);
169 self.solvers{1,self.CANDIDATE_NC} = SolverNC(model);
170 self.solvers{1,self.CANDIDATE_FLUID} = SolverFluid(model);
171 self.solvers{1,self.CANDIDATE_JMT} = SolverJMT(model);
172 self.solvers{1,self.CANDIDATE_SSA} = SolverSSA(model);
173 self.solvers{1,self.CANDIDATE_CTMC} = SolverCTMC(model);
174 self.solvers{1,self.CANDIDATE_DES} = SolverDES(model);
175 boolSolver =
false(length(self.solvers),1);
176 for s=1:length(self.solvers)
177 boolSolver(s) = self.solvers{s}.supports(self.model);
178 self.solvers{s}.setOptions(self.options);
180 self.candidates = {self.solvers{find(boolSolver)}}; %#ok<FNDSB>
181 case 'LayeredNetwork'
182 self.solvers{1,self.CANDIDATE_LQNS} = SolverLQNS(model,self.options);
183 self.solvers{1,self.CANDIDATE_LN_NC} = SolverLN(model,@(m) SolverNC(m,
'verbose',
false),self.options);
184 self.solvers{1,self.CANDIDATE_LN_MVA} = SolverLN(model,@(m) SolverMVA(m,
'verbose',
false),self.options);
185 self.solvers{1,self.CANDIDATE_LN_MAM} = SolverLN(model,@(m) SolverMAM(m,
'verbose',
false),self.options);
186 self.solvers{1,self.CANDIDATE_LN_FLUID} = SolverLN(model,@(m) SolverFluid(m,
'verbose',
false),self.options);
187 self.candidates = self.solvers;
189 self.solvers{1,self.CANDIDATE_ENV_MVA} = SolverENV(model,@(m) SolverMVA(m,
'verbose',
false),self.options);
190 self.solvers{1,self.CANDIDATE_ENV_NC} = SolverENV(model,@(m) SolverNC(m,
'verbose',
false),self.options);
191 self.solvers{1,self.CANDIDATE_ENV_FLUID} = SolverENV(model,@(m) SolverFluid(m,
'verbose',
false),self.options);
192 self.candidates = self.solvers;
195 %turn off warnings temporarily
196 wstatus = warning(
'query');
201 function sn = getStruct(self)
204 % Get data structure summarizing the model
205 sn = self.model.getStruct(
true);
208 function out = getName(self)
214 function model = getModel(self)
216 % Get the model being solved
220 function results = getResults(self)
221 % RESULTS = GETRESULTS()
222 % Return results data structure from chosen solver
223 results = self.delegate(
'getResults', 1);
226 function
bool = hasResults(self)
227 % BOOL = HASRESULTS()
228 % Check
if the solver has computed results
229 bool = self.delegate(
'hasResults', 1);
232 function options = getOptions(self)
233 % OPTIONS = GETOPTIONS()
234 % Return options data structure
235 options = self.options;
238 function self = setOptions(self, options)
239 % SELF = SETOPTIONS(OPTIONS)
240 % Set a
new options data structure
for all candidate solvers
241 self.options = options;
242 for s = 1:length(self.solvers)
243 if ~isempty(self.solvers{s})
244 self.solvers{s}.setOptions(options);
249 function
bool = supports(self, model)
250 % BOOL = SUPPORTS(MODEL)
251 % Check
if any candidate solver supports the given model
253 for s = 1:length(self.solvers)
254 if ~isempty(self.solvers{s}) && self.solvers{s}.supports(model)
261 function allMethods = listValidMethods(self)
262 % ALLMETHODS = LISTVALIDMETHODS()
263 % List valid methods from all candidate solvers
264 allMethods = {
'default',
'auto',
'heur',
'sim',
'exact',
'fast',
'accurate'}; %
'ai' not yet available
265 for s = 1:length(self.solvers)
266 if ~isempty(self.solvers{s})
268 solverMethods = self.solvers{s}.listValidMethods();
269 allMethods = unique([allMethods, solverMethods]);
271 % Solver doesn
't implement listValidMethods
280 % delegate execution of method to chosen solver
281 varargout = delegate(self, method, nretout, varargin);
283 % chooseSolver: choses a solver from static properties of the model
284 solver = chooseSolver(self, method);
285 % Heuristic choice of solver
286 solver = chooseSolverHeur(self, method);
287 % Heuristic choice of solver for Avg* methods
288 solver = chooseAvgSolverHeur(self);
294 for s=1:length(self.solvers)
295 self.solvers{s}.reset();
298 function setChecks(self,bool)
299 for s=1:length(self.solvers)
300 self.solvers{s}.setChecks(bool);
306 function AvgChainTable = getAvgChainTable(self)
307 % [AVGCHAINTABLE] = GETAVGCHAINTABLE(self)
309 AvgChainTable = self.delegate('getAvgChainTable
', 1);
311 line_error(mfilename, 'Fatal error in getAvgChainTable.
')
315 function [AvgQLenTable, QT] = getAvgQLenTable(self, Q, keepDisabled)
316 % [AVGQLENTABLE, QT] = GETAVGQLENTABLE(self, Q, keepDisabled)
321 keepDisabled = false;
323 [AvgQLenTable, QT] = self.delegate('getAvgQLenTable
', 2, Q, keepDisabled);
326 function [AvgTputTable, TT] = getAvgTputTable(self, T, keepDisabled)
327 % [AVGTPUTTABLE, TT] = GETAVGTPUTTABLE(self, T, keepDisabled)
332 keepDisabled = false;
334 [AvgTputTable, TT] = self.delegate('getAvgTputTable
', 2, T, keepDisabled);
337 function [AvgRespTTable, RT] = getAvgRespTTable(self, R, keepDisabled)
338 % [AVGRESPTTABLE, RT] = GETAVGRESPTTABLE(self, R, keepDisabled)
343 keepDisabled = false;
345 [AvgRespTTable, RT] = self.delegate('getAvgRespTTable
', 2, R, keepDisabled);
348 function [AvgUtilTable, UT] = getAvgUtilTable(self, U, keepDisabled)
349 % [AVGUTILTABLE, UT] = GETAVGUTILTABLE(self, U, keepDisabled)
354 keepDisabled = false;
356 [AvgUtilTable, UT] = self.delegate('getAvgUtilTable
', 2, U, keepDisabled);
359 function AvgSysTable = getAvgSysTable(self)
360 % [AVGSYSTABLE] = GETAVGSYSTABLE(self)
361 AvgSysTable = self.delegate('getAvgSysTable
', 1);
364 function AvgNodeTable = getAvgNodeTable(self)
365 % [AVGNODETABLE] = GETAVGNODETABLE(self)
366 AvgNodeTable = self.delegate('getAvgNodeTable
', 1);
369 function AvgTable = getAvgTable(self)
370 % [AVGTABLE] = GETAVGTABLE(self)
371 AvgTable = self.delegate('getAvgTable
', 1);
374 function [QN,UN,RN,TN,AN,WN] = getAvg(self,Q,U,R,T)
375 %[QN,UN,RN,TN] = GETAVG(SELF,Q,U,R,T)
378 [QN,UN,RN,TN,AN,WN] = self.delegate('getAvg
', 6, Q,U,R,T);
380 [QN,UN,RN,TN,AN,WN] = self.delegate('getAvg
', 6);
384 function [QNc,UNc,RNc,TNc] = getAvgChain(self,Q,U,R,T)
385 %[QNC,UNC,RNC,TNC] = GETAVGCHAIN(SELF,Q,U,R,T)
388 [QNc,UNc,RNc,TNc] = self.delegate('getAvgChain
', 4, Q,U,R,T);
390 [QNc,UNc,RNc,TNc] = self.delegate('getAvgChain
', 4);
394 function [CNc,XNc] = getAvgSys(self,R,T)
395 %[CNC,XNC] = GETAVGSYS(SELF,R,T)
398 [CNc,XNc] = self.delegate('getAvgSys
', 2, R,T);
400 [CNc,XNc] = self.delegate('getAvgSys
', 2);
404 function [QN,UN,RN,TN,AN,WN] = getAvgNode(self,Q,U,R,T,A)
406 [QN,UN,RN,TN,AN,WN] = self.delegate('getAvgNode
', 6, Q,U,R,T,A);
408 [QN,UN,RN,TN,AN,WN] = self.delegate('getAvgNode
', 6);
412 function [AN] = getAvgArvRChain(self,A)
414 AN = self.delegate('getAvgArvRChain
', 1, A);
416 AN = self.delegate('getAvgArvRChain
', 1);
420 function [QN] = getAvgQLenChain(self,Q)
422 QN = self.delegate('getAvgQLenChain
', 1, Q);
424 QN = self.delegate('getAvgQLenChain
', 1);
428 function [UN] = getAvgUtilChain(self,U)
430 UN = self.delegate('getAvgUtilChain
', 1, U);
432 UN = self.delegate('getAvgUtilChain
', 1);
436 function [RN] = getAvgRespTChain(self,R)
438 RN = self.delegate('getAvgRespTChain
', 1, R);
440 RN = self.delegate('getAvgRespTChain
', 1);
444 function [TN] = getAvgTputChain(self,T)
446 TN = self.delegate('getAvgTputChain
', 1, T);
448 TN = self.delegate('getAvgTputChain
', 1);
452 function [RN] = getAvgSysRespT(self,R)
454 RN = self.delegate('getAvgSysRespT
', 1, R);
456 RN = self.delegate('getAvgSysRespT
', 1);
460 function [TN] = getAvgSysTput(self,T)
462 TN = self.delegate('getAvgSysTput
', 1, T);
464 TN = self.delegate('getAvgSysTput
', 1);
468 function [QNt,UNt,TNt] = getTranAvg(self,Qt,Ut,Tt)
469 % [QNT,UNT,TNT] = GETTRANAVG(SELF,QT,UT,TT)
472 [QNt,UNt,TNt] = self.delegate('getTranAvg
', 3, Qt,Ut,Tt);
474 [QNt,UNt,TNt] = self.delegate('getTranAvg
', 3);
478 function RD = getTranCdfPassT(self, R)
479 % RD = GETTRANCDFPASST(R)
482 RD = self.delegate('getTranCdfPassT
', 1, R);
484 RD = self.delegate('getTranCdfPassT
', 1);
488 function RD = getTranCdfRespT(self, R)
489 % RD = GETTRANCDFRESPT(R)
492 RD = self.delegate('getTranCdfRespT
', 1, R);
494 RD = self.delegate('getTranCdfRespT
', 1);
498 function [Pi_t, SSnode] = getTranProb(self, node)
499 % [PI, SS] = GETTRANPROB(NODE)
500 [Pi_t, SSnode] = self.delegate('getTranProb
', 2, node);
503 function [Pi_t, SSnode_a] = getTranProbAggr(self, node)
504 % [PI, SS] = GETTRANPROBAGGR(NODE)
505 [Pi_t, SSnode_a] = self.delegate('getTranProbAggr
', 2, node);
508 function [Pi_t, SSsys] = getTranProbSys(self)
509 % [PI, SS] = GETTRANPROBSYS()
510 [Pi_t, SSsys] = self.delegate('getTranProbSys
', 2);
513 function [Pi_t, SSsysa] = getTranProbSysAggr(self)
514 % [PI, SS] = GETTRANPROBSYSAGGR()
515 [Pi_t, SSsysa] = self.delegate('getTranProbSysAggr
', 2);
518 function sampleNodeState = sample(self, node, numSamples)
519 sampleNodeState = self.delegate('sample
', 1, node, numSamples);
522 function stationStateAggr = sampleAggr(self, node, numSamples)
523 stationStateAggr = self.delegate('sampleAggr
', 1, node, numSamples);
526 function tranSysState = sampleSys(self, numSamples)
527 tranSysState = self.delegate('sampleSys
', 1, numSamples);
530 function sysStateAggr = sampleSysAggr(self, numSamples)
531 sysStateAggr = self.delegate('sampleSysAggr
', 1, numSamples);
534 function RD = getCdfRespT(self, R)
536 RD = self.delegate('getCdfRespT
', 1, R);
538 RD = self.delegate('getCdfRespT
', 1);
542 function Pnir = getProb(self, node, state)
543 Pnir = self.delegate('getProb
', 1, node, state);
546 function Pnir = getProbAggr(self, node, state_a)
547 Pnir = self.delegate('getProbAggr
', 1, node, state_a);
550 function Pn = getProbSys(self)
551 Pn = self.delegate('getProbSys
',1);
554 function Pn = getProbSysAggr(self)
555 Pn = self.delegate('getProbSysAggr
',1);
558 function [logNormConst] = getProbNormConstAggr(self)
559 logNormConst = self.delegate('getProbNormConstAggr
',1);
562 % Basic metric methods
563 function QN = getAvgQLen(self)
565 % Compute average queue-lengths at steady-state
566 QN = self.delegate('getAvgQLen
', 1);
569 function UN = getAvgUtil(self)
571 % Compute average utilizations at steady-state
572 UN = self.delegate('getAvgUtil
', 1);
575 function RN = getAvgRespT(self)
577 % Compute average response times at steady-state
578 RN = self.delegate('getAvgRespT
', 1);
581 function WN = getAvgResidT(self)
582 % WN = GETAVGRESIDT()
583 % Compute average residence times at steady-state
584 WN = self.delegate('getAvgResidT
', 1);
587 function WT = getAvgWaitT(self)
589 % Compute average waiting time in queue excluding service
590 WT = self.delegate('getAvgWaitT
', 1);
593 function TN = getAvgTput(self)
595 % Compute average throughputs at steady-state
596 TN = self.delegate('getAvgTput
', 1);
599 function AN = getAvgArvR(self)
601 % Compute average arrival rate at steady-state
602 AN = self.delegate('getAvgArvR
', 1);
605 % Additional chain methods
606 function [WN] = getAvgResidTChain(self, W)
608 WN = self.delegate('getAvgResidTChain
', 1, W);
610 WN = self.delegate('getAvgResidTChain
', 1);
614 function [QN] = getAvgNodeQLenChain(self, Q)
616 QN = self.delegate('getAvgNodeQLenChain
', 1, Q);
618 QN = self.delegate('getAvgNodeQLenChain
', 1);
622 function [UN] = getAvgNodeUtilChain(self, U)
624 UN = self.delegate('getAvgNodeUtilChain
', 1, U);
626 UN = self.delegate('getAvgNodeUtilChain
', 1);
630 function [RN] = getAvgNodeRespTChain(self, R)
632 RN = self.delegate('getAvgNodeRespTChain
', 1, R);
634 RN = self.delegate('getAvgNodeRespTChain
', 1);
638 function [WN] = getAvgNodeResidTChain(self, W)
640 WN = self.delegate('getAvgNodeResidTChain
', 1, W);
642 WN = self.delegate('getAvgNodeResidTChain
', 1);
646 function [TN] = getAvgNodeTputChain(self, T)
648 TN = self.delegate('getAvgNodeTputChain
', 1, T);
650 TN = self.delegate('getAvgNodeTputChain
', 1);
654 function [AN] = getAvgNodeArvRChain(self, A)
656 AN = self.delegate('getAvgNodeArvRChain
', 1, A);
658 AN = self.delegate('getAvgNodeArvRChain
', 1);
662 % Additional table method
663 function [AvgNodeChainTable, QTc, UTc, RTc, WTc, ATc, TTc] = getAvgNodeChainTable(self, Q, U, R, T)
665 [AvgNodeChainTable, QTc, UTc, RTc, WTc, ATc, TTc] = self.delegate('getAvgNodeChainTable
', 7, Q, U, R, T);
667 [AvgNodeChainTable, QTc, UTc, RTc, WTc, ATc, TTc] = self.delegate('getAvgNodeChainTable
', 7);
672 function Pmarg = getProbMarg(self, node, jobclass, state_m)
673 % PMARG = GETPROBMARG(NODE, JOBCLASS, STATE_M)
674 % Return marginalized state probability for station and class
675 Pmarg = self.delegate('getProbMarg
', 1, node, jobclass, state_m);
678 % Distribution method
679 function RD = getCdfPassT(self, R)
680 % RD = GETCDFPASST(R)
681 % Return cumulative distribution of passage times at steady-state
683 RD = self.delegate('getCdfPassT
', 1, R);
685 RD = self.delegate('getCdfPassT
', 1);
690 function [PercRT, PercTable] = getPerctRespT(self, percentiles, jobclass)
691 % [PERCRT, PERCTABLE] = GETPERCTRESPT(SELF, PERCENTILES, JOBCLASS)
692 % Extract response time percentiles from CDF or solver-specific results
694 [PercRT, PercTable] = self.delegate('getPerctRespT
', 2, percentiles);
696 [PercRT, PercTable] = self.delegate('getPerctRespT
', 2, percentiles, jobclass);
701 function [Q, U, R, T, A, W] = getAvgHandles(self)
702 % [Q,U,R,T,A,W] = GETAVGHANDLES()
703 [Q, U, R, T, A, W] = self.delegate('getAvgHandles
', 6);
706 function [Qt, Ut, Tt] = getTranHandles(self)
707 % [QT,UT,TT] = GETTRANHANDLES()
708 [Qt, Ut, Tt] = self.delegate('getTranHandles
', 3);
711 function Q = getAvgQLenHandles(self)
712 % Q = GETAVGQLENHANDLES()
713 Q = self.delegate('getAvgQLenHandles
', 1);
716 function U = getAvgUtilHandles(self)
717 % U = GETAVGUTILHANDLES()
718 U = self.delegate('getAvgUtilHandles
', 1);
721 function R = getAvgRespTHandles(self)
722 % R = GETAVGRESPTHANDLES()
723 R = self.delegate('getAvgRespTHandles
', 1);
726 function T = getAvgTputHandles(self)
727 % T = GETAVGTPUTHANDLES()
728 T = self.delegate('getAvgTputHandles
', 1);
731 function A = getAvgArvRHandles(self)
732 % A = GETAVGARVRHANDLES()
733 A = self.delegate('getAvgArvRHandles
', 1);
736 function W = getAvgResidTHandles(self)
737 % W = GETAVGRESIDTHANDLES()
738 W = self.delegate('getAvgResidTHandles
', 1);
741 % Kotlin-style aliases for table methods
742 function avg_table = avgTable(self)
743 % AVGTABLE Kotlin-style alias for getAvgTable
744 avg_table = self.getAvgTable();
747 function avg_sys_table = avgSysTable(self)
748 % AVGSYSTABLE Kotlin-style alias for getAvgSysTable
749 avg_sys_table = self.getAvgSysTable();
752 function avg_node_table = avgNodeTable(self)
753 % AVGNODETABLE Kotlin-style alias for getAvgNodeTable
754 avg_node_table = self.getAvgNodeTable();
757 function avg_chain_table = avgChainTable(self)
758 % AVGCHAINTABLE Kotlin-style alias for getAvgChainTable
759 avg_chain_table = self.getAvgChainTable();
762 function avg_node_chain_table = avgNodeChainTable(self)
763 % AVGNODECHAINTABLE Kotlin-style alias for getAvgNodeChainTable
764 avg_node_chain_table = self.getAvgNodeChainTable();
767 % Table -> T short aliases
768 function avg_table = avgT(self)
769 % AVGT Short alias for avgTable
770 avg_table = self.avgTable();
773 function avg_sys_table = avgSysT(self)
774 % AVGSYST Short alias for avgSysTable
775 avg_sys_table = self.avgSysTable();
778 function avg_node_table = avgNodeT(self)
779 % AVGNODET Short alias for avgNodeTable
780 avg_node_table = self.avgNodeTable();
783 function avg_chain_table = avgChainT(self)
784 % AVGCHAINT Short alias for avgChainTable
785 avg_chain_table = self.avgChainTable();
788 function avg_node_chain_table = avgNodeChainT(self)
789 % AVGNODECHAINT Short alias for avgNodeChainTable
790 avg_node_chain_table = self.avgNodeChainTable();
793 % Kotlin-style aliases for composite methods
794 function varargout = avgChain(self, varargin)
795 % AVGCHAIN Kotlin-style alias for getAvgChain
796 [varargout{1:nargout}] = self.getAvgChain(varargin{:});
799 function varargout = avgSys(self, varargin)
800 % AVGSYS Kotlin-style alias for getAvgSys
801 [varargout{1:nargout}] = self.getAvgSys(varargin{:});
804 function varargout = avgNode(self, varargin)
805 % AVGNODE Kotlin-style alias for getAvgNode
806 [varargout{1:nargout}] = self.getAvgNode(varargin{:});
809 function varargout = avg(self, varargin)
810 % AVG Kotlin-style alias for getAvg
811 [varargout{1:nargout}] = self.getAvg(varargin{:});
814 function sys_resp_time = avgSysRespT(self, varargin)
815 % AVGSYSRESPT Kotlin-style alias for getAvgSysRespT
816 sys_resp_time = self.getAvgSysRespT(varargin{:});
819 function sys_tput = avgSysTput(self, varargin)
820 % AVGSYSTPUT Kotlin-style alias for getAvgSysTput
821 sys_tput = self.getAvgSysTput(varargin{:});
824 % Kotlin-style aliases for chain methods
825 function arvr_chain = avgArvRChain(self, varargin)
826 % AVGARVCHAIN Kotlin-style alias for getAvgArvRChain
827 arvr_chain = self.getAvgArvRChain(varargin{:});
830 function qlen_chain = avgQLenChain(self, varargin)
831 % AVGQLENCHAIN Kotlin-style alias for getAvgQLenChain
832 qlen_chain = self.getAvgQLenChain(varargin{:});
835 function util_chain = avgUtilChain(self, varargin)
836 % AVGUTILCHAIN Kotlin-style alias for getAvgUtilChain
837 util_chain = self.getAvgUtilChain(varargin{:});
840 function resp_t_chain = avgRespTChain(self, varargin)
841 % AVGRESPTCHAIN Kotlin-style alias for getAvgRespTChain
842 resp_t_chain = self.getAvgRespTChain(varargin{:});
845 function resid_t_chain = avgResidTChain(self, varargin)
846 % AVGRESIDTCHAIN Kotlin-style alias for getAvgResidTChain
847 resid_t_chain = self.getAvgResidTChain(varargin{:});
850 function tput_chain = avgTputChain(self, varargin)
851 % AVGTPUTCHAIN Kotlin-style alias for getAvgTputChain
852 tput_chain = self.getAvgTputChain(varargin{:});
855 % Kotlin-style aliases for node chain methods
856 function node_arvr_chain = avgNodeArvRChain(self, varargin)
857 % AVGNODERVRCHAIN Kotlin-style alias for getAvgNodeArvRChain
858 node_arvr_chain = self.getAvgNodeArvRChain(varargin{:});
861 function node_qlen_chain = avgNodeQLenChain(self, varargin)
862 % AVGNODEQLENCHAIN Kotlin-style alias for getAvgNodeQLenChain
863 node_qlen_chain = self.getAvgNodeQLenChain(varargin{:});
866 function node_util_chain = avgNodeUtilChain(self, varargin)
867 % AVGNODEUTILCHAIN Kotlin-style alias for getAvgNodeUtilChain
868 node_util_chain = self.getAvgNodeUtilChain(varargin{:});
871 function node_resp_t_chain = avgNodeRespTChain(self, varargin)
872 % AVGNODERESPTCHAIN Kotlin-style alias for getAvgNodeRespTChain
873 node_resp_t_chain = self.getAvgNodeRespTChain(varargin{:});
876 function node_resid_t_chain = avgNodeResidTChain(self, varargin)
877 % AVGNODERESIDTCHAIN Kotlin-style alias for getAvgNodeResidTChain
878 node_resid_t_chain = self.getAvgNodeResidTChain(varargin{:});
881 function node_tput_chain = avgNodeTputChain(self, varargin)
882 % AVGNODETPUTCHAIN Kotlin-style alias for getAvgNodeTputChain
883 node_tput_chain = self.getAvgNodeTputChain(varargin{:});
886 % Kotlin-style aliases for transient methods
887 function varargout = tranAvg(self, varargin)
888 % TRANAVG Kotlin-style alias for getTranAvg
889 [varargout{1:nargout}] = self.getTranAvg(varargin{:});
892 function rd = tranCdfRespT(self, varargin)
893 % TRANCDFRESPT Kotlin-style alias for getTranCdfRespT
894 rd = self.getTranCdfRespT(varargin{:});
897 function rd = tranCdfPassT(self, varargin)
898 % TRANCDFPASST Kotlin-style alias for getTranCdfPassT
899 rd = self.getTranCdfPassT(varargin{:});
902 function varargout = tranProb(self, varargin)
903 % TRANPROB Kotlin-style alias for getTranProb
904 [varargout{1:nargout}] = self.getTranProb(varargin{:});
907 function varargout = tranProbAggr(self, varargin)
908 % TRANPROBAGGR Kotlin-style alias for getTranProbAggr
909 [varargout{1:nargout}] = self.getTranProbAggr(varargin{:});
912 function varargout = tranProbSys(self)
913 % TRANPROBSYS Kotlin-style alias for getTranProbSys
914 [varargout{1:nargout}] = self.getTranProbSys();
917 function varargout = tranProbSysAggr(self)
918 % TRANPROBSYSAGGR Kotlin-style alias for getTranProbSysAggr
919 [varargout{1:nargout}] = self.getTranProbSysAggr();
922 % Kotlin-style aliases for CDF methods
923 function rd = cdfRespT(self, varargin)
924 % CDFRESPT Kotlin-style alias for getCdfRespT
925 rd = self.getCdfRespT(varargin{:});
928 function rd = cdfPassT(self, varargin)
929 % CDFPASST Kotlin-style alias for getCdfPassT
930 rd = self.getCdfPassT(varargin{:});
933 function varargout = perctRespT(self, varargin)
934 % PERCTRESPT Kotlin-style alias for getPerctRespT
935 [varargout{1:nargout}] = self.getPerctRespT(varargin{:});
938 % Kotlin-style aliases for probability methods
939 function pstate = prob(self, varargin)
940 % PROB Kotlin-style alias for getProb
941 pstate = self.getProb(varargin{:});
944 function psysstate = probSys(self)
945 % PROBSYS Kotlin-style alias for getProbSys
946 psysstate = self.getProbSys();
949 function pnir = probAggr(self, varargin)
950 % PROBAGGR Kotlin-style alias for getProbAggr
951 pnir = self.getProbAggr(varargin{:});
954 function pnjoint = probSysAggr(self)
955 % PROBSYSAGGR Kotlin-style alias for getProbSysAggr
956 pnjoint = self.getProbSysAggr();
959 function pmarg = probMarg(self, varargin)
960 % PROBMARG Kotlin-style alias for getProbMarg
961 pmarg = self.getProbMarg(varargin{:});
964 function lnormconst = probNormConstAggr(self)
965 % PROBNORMCONSTAGGR Kotlin-style alias for getProbNormConstAggr
966 lnormconst = self.getProbNormConstAggr();
969 % Kotlin-style aliases for handle methods
970 function varargout = avgHandles(self)
971 % AVGHANDLES Kotlin-style alias for getAvgHandles
972 [varargout{1:nargout}] = self.getAvgHandles();
975 function varargout = tranHandles(self)
976 % TRANHANDLES Kotlin-style alias for getTranHandles
977 [varargout{1:nargout}] = self.getTranHandles();
980 function q = avgQLenHandles(self)
981 % AVGQLENHANDLES Kotlin-style alias for getAvgQLenHandles
982 q = self.getAvgQLenHandles();
985 function u = avgUtilHandles(self)
986 % AVGUTILHANDLES Kotlin-style alias for getAvgUtilHandles
987 u = self.getAvgUtilHandles();
990 function r = avgRespTHandles(self)
991 % AVGRESPTHANDLES Kotlin-style alias for getAvgRespTHandles
992 r = self.getAvgRespTHandles();
995 function t = avgTputHandles(self)
996 % AVGTPUTHANDLES Kotlin-style alias for getAvgTputHandles
997 t = self.getAvgTputHandles();
1000 function a = avgArvRHandles(self)
1001 % AVGARVRHANDLES Kotlin-style alias for getAvgArvRHandles
1002 a = self.getAvgArvRHandles();
1005 function w = avgResidTHandles(self)
1006 % AVGRESIDTHANDLES Kotlin-style alias for getAvgResidTHandles
1007 w = self.getAvgResidTHandles();
1010 % Kotlin-style aliases for basic metric methods
1011 function qn = avgQLen(self)
1012 % AVGQLEN Kotlin-style alias for getAvgQLen
1013 qn = self.getAvgQLen();
1016 function un = avgUtil(self)
1017 % AVGUTIL Kotlin-style alias for getAvgUtil
1018 un = self.getAvgUtil();
1021 function rn = avgRespT(self)
1022 % AVGRESPT Kotlin-style alias for getAvgRespT
1023 rn = self.getAvgRespT();
1026 function wn = avgResidT(self)
1027 % AVGRESIDT Kotlin-style alias for getAvgResidT
1028 wn = self.getAvgResidT();
1031 function wt = avgWaitT(self)
1032 % AVGWAITT Kotlin-style alias for getAvgWaitT
1033 wt = self.getAvgWaitT();
1036 function tn = avgTput(self)
1037 % AVGTPUT Kotlin-style alias for getAvgTput
1038 tn = self.getAvgTput();
1041 function an = avgArvR(self)
1042 % AVGARVR Kotlin-style alias for getAvgArvR
1043 an = self.getAvgArvR();
1046 % Kotlin-style aliases for table methods with parameters
1047 function varargout = avgQLenTable(self, varargin)
1048 % AVGQLENTABLE Kotlin-style alias for getAvgQLenTable
1049 [varargout{1:nargout}] = self.getAvgQLenTable(varargin{:});
1052 function varargout = avgUtilTable(self, varargin)
1053 % AVGUTILTABLE Kotlin-style alias for getAvgUtilTable
1054 [varargout{1:nargout}] = self.getAvgUtilTable(varargin{:});
1057 function varargout = avgRespTTable(self, varargin)
1058 % AVGRESPTTABLE Kotlin-style alias for getAvgRespTTable
1059 [varargout{1:nargout}] = self.getAvgRespTTable(varargin{:});
1062 function varargout = avgTputTable(self, varargin)
1063 % AVGTPUTTABLE Kotlin-style alias for getAvgTputTable
1064 [varargout{1:nargout}] = self.getAvgTputTable(varargin{:});
1067 %% LayeredNetwork / EnsembleSolver methods
1068 % These methods are available when solving LayeredNetwork models
1070 function [QN, UN, RN, TN, AN, WN] = getEnsembleAvg(self)
1071 % [QN, UN, RN, TN, AN, WN] = GETENSEMBLEAVG()
1072 % Get average performance metrics for LayeredNetwork ensemble models
1073 [QN, UN, RN, TN, AN, WN] = self.delegate('getEnsembleAvg
', 6);
1076 function solver = getSolver(self, e)
1077 % SOLVER = GETSOLVER(E)
1078 % Get solver for ensemble model e (LayeredNetwork only)
1079 solver = self.delegate('getSolver
', 1, e);
1082 function solver = setSolver(self, solver, e)
1083 % SOLVER = SETSOLVER(SOLVER, E)
1084 % Set solver for ensemble model e (LayeredNetwork only)
1086 solver = self.delegate('setSolver
', 1, solver);
1088 solver = self.delegate('setSolver
', 1, solver, e);
1092 function E = getNumberOfModels(self)
1093 % E = GETNUMBEROFMODELS()
1094 % Get number of ensemble models (LayeredNetwork only)
1095 E = self.delegate('getNumberOfModels
', 1);
1098 function it = getIteration(self)
1099 % IT = GETITERATION()
1100 % Get current iteration number (LayeredNetwork only)
1101 it = self.delegate('getIteration
', 1);
1104 function AvgTables = getEnsembleAvgTables(self)
1105 % AVGTABLES = GETENSEMBLEAVGTABLES()
1106 % Get average tables for all ensemble models (LayeredNetwork only)
1107 AvgTables = self.delegate('getEnsembleAvgTables
', 1);
1110 function state = get_state(self)
1111 % STATE = GET_STATE()
1112 % Export current solver state for continuation (SolverLN only)
1113 state = self.delegate('get_state
', 1);
1116 function set_state(self, state)
1118 % Import solution state for continuation (SolverLN only)
1119 self.delegate('set_state
', 0, state);
1122 function update_solver(self, solverFactory)
1123 % UPDATE_SOLVER(SOLVERFACTORY)
1124 % Change the solver for all layers (SolverLN only)
1125 self.delegate('update_solver
', 0, solverFactory);
1128 % Kotlin-style aliases for LayeredNetwork/EnsembleSolver methods
1129 function varargout = ensembleAvg(self)
1130 % ENSEMBLEAVG Kotlin-style alias for getEnsembleAvg
1131 [varargout{1:nargout}] = self.getEnsembleAvg();
1134 function solver = solver(self, e)
1135 % SOLVER Kotlin-style alias for getSolver
1136 solver = self.getSolver(e);
1139 function it = iteration(self)
1140 % ITERATION Kotlin-style alias for getIteration
1141 it = self.getIteration();
1144 function e = numberOfModels(self)
1145 % NUMBEROFMODELS Kotlin-style alias for getNumberOfModels
1146 e = self.getNumberOfModels();
1149 function avg_tables = ensembleAvgTables(self)
1150 % ENSEMBLEAVGTABLES Kotlin-style alias for getEnsembleAvgTables
1151 avg_tables = self.getEnsembleAvgTables();
1154 function avg_tables = getEnsembleAvgTs(self)
1155 % GETENSEMBLEAVGTS Short alias for getEnsembleAvgTables
1156 avg_tables = self.getEnsembleAvgTables();
1159 function avg_tables = ensembleAvgTs(self)
1160 % ENSEMBLEAVGTS Short alias for ensembleAvgTables
1161 avg_tables = self.ensembleAvgTables();