1classdef NetworkSolver < Solver
2 % NetworkSolver Abstract base
class for queueing network solvers
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.
9 % @brief Abstract base
class for all queueing network analysis solvers
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
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)
24 % Example usage pattern:
26 % solver = SolverMVA(model,
'MyMVASolver');
27 % solver.getAvg(); % Get average performance metrics
30 % Copyright (c) 2012-2026, Imperial College London
31 % All rights reserved.
34 properties (Access = protected)
35 handles; % performance metric handles
40 function self = NetworkSolver(model, name, options)
41 % NETWORKSOLVER Create a NetworkSolver instance
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
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);
53 line_error(mfilename,
'The model supplied in input is empty');
55 if nargin>=3 %exist(
'options',
'var'),
56 self.setOptions(options);
60 if isempty(model.obj) % not a Java
object
65 function setLang(self)
66 % NOTE: self.model
is passed by reference so it affects the
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;
78 case 'java' % solver lang
79 joptions = self.options;
80 if ~isempty(self.model.obj) % java model
83 self.model.obj = JLINE.line_to_jline(self.model.copy());
87 self.obj = JLINE.SolverCTMC(self.model.obj, joptions);
89 self.obj = JLINE.SolverDES(self.model.obj, joptions);
91 self.obj = JLINE.SolverFluid(self.model.obj, joptions);
93 self.obj = JLINE.SolverJMT(self.model.obj, joptions);
95 self.obj = JLINE.SolverMAM(self.model.obj, joptions);
97 self.obj = JLINE.SolverMVA(self.model.obj, joptions);
99 self.obj = JLINE.SolverNC(self.model.obj, joptions);
101 self.obj = JLINE.SolverSSA(self.model.obj, joptions);
106 function initHandles(self)
107 [Q,U,R,T,A,W] = self.model.getAvgHandles();
109 % Get tardiness handles
if available
110 if ismethod(self.model,
'getAvgTardHandles')
111 Tard = self.model.getAvgTardHandles();
115 if ismethod(self.model, 'getAvgSysTardHandles')
116 SysTard = self.model.getAvgSysTardHandles();
121 self.setAvgHandles(Q,U,R,T,A,W,Tard,SysTard);
123 [Qt,Ut,Tt] = self.model.getTranHandles;
124 self.setTranHandles(Qt,Ut,Tt);
126 if ~self.model.hasStruct
127 self.model.refreshStruct(); % force model to refresh
131 function self = runAnalyzerChecks(self, options)
132 if self.enableChecks && ~self.supports(self.model)
133 line_error(mfilename,'This model contains features not supported by the solver.\n');
135 if self.enableChecks && ~any(cellfun(@(s) strcmp(s,options.method),self.listValidMethods))
136 line_error(mfilename,sprintf('The ''%s'' method
is unsupported by this solver.\n',options.method));
140 function self = setTranHandles(self,Qt,Ut,Tt)
141 self.handles.Qt = Qt;
142 self.handles.Ut = Ut;
143 self.handles.Tt = Tt;
146 function self = setAvgHandles(self,Q,U,R,T,A,W,Tard,SysTard)
154 self.handles.Tard = Tard;
157 self.handles.SysTard = SysTard;
161 function [Qt,Ut,Tt] = getTranHandles(self)
162 Qt = self.handles.Qt;
163 Ut = self.handles.Ut;
164 Tt = self.handles.Tt;
167 function [Q,U,R,T,A,W] = getAvgHandles(self)
168 if isempty(self.handles)
175 self.handles.Tard = [];
176 self.handles.SysTard = [];
187 function Q = getAvgQLenHandles(self)
188 if isempty(self.handles) || ~isstruct(self.handles)
189 self.getAvgHandles();
194 function U = getAvgUtilHandles(self)
195 if isempty(self.handles) || ~isstruct(self.handles)
196 self.getAvgHandles();
201 function R = getAvgRespTHandles(self)
202 if isempty(self.handles) || ~isstruct(self.handles)
203 self.getAvgHandles();
208 function T = getAvgTputHandles(self)
209 if isempty(self.handles) || ~isstruct(self.handles)
210 self.getAvgHandles();
215 function A = getAvgArvRHandles(self)
216 if isempty(self.handles) || ~isstruct(self.handles)
217 self.getAvgHandles();
222 function W = getAvgResidTHandles(self)
223 if isempty(self.handles) || ~isstruct(self.handles)
224 self.getAvgHandles();
231 methods (Access = 'protected')
232 function
bool = hasAvgResults(self)
233 % BOOL = HASAVGRESULTS()
235 % Returns true if the solver has computed steady-state average metrics.
238 if isfield(self.result,'Avg')
244 function
bool = hasTranResults(self)
245 % BOOL = HASTRANRESULTS()
247 % Return true if the solver has computed transient average metrics.
250 if isfield(self.result,'Tran')
251 if isfield(self.result.Tran,'Avg')
252 bool = isfield(self.result.Tran.Avg,'Q');
258 function
bool = hasDistribResults(self)
259 % BOOL = HASDISTRIBRESULTS()
261 % Return true if the solver has computed steady-state distribution metrics.
264 bool = isfield(self.result.Distribution,'C');
271 function self = setModel(self, model)
272 % SELF = SETMODEL(MODEL)
274 % Assign the model to be solved.
278 function QN = getAvgQLen(self)
281 % Compute average queue-lengths at steady-state
282 Q = getAvgQLenHandles(self);
283 [QN,~,~,~] = self.getAvg(Q,[],[],[],[],[]);
286 function UN = getAvgUtil(self)
289 % Compute average utilizations at steady-state
290 U = getAvgUtilHandles(self);
291 [~,UN,~,~] = self.getAvg([],U,[],[],[],[]);
294 function RN = getAvgRespT(self)
297 % Compute average response times at steady-state
298 R = getAvgRespTHandles(self);
299 [~,~,RN,~] = self.getAvg([],[],R,[],[],[]);
302 function WN = getAvgResidT(self)
303 % WN = GETAVGRESIDT()
305 % Compute average residence times at steady-state
306 R = getAvgRespTHandles(self);
307 W = getAvgResidTHandles(self);
308 [~,~,~,~,~,WN] = self.getAvg([],[],R,[],[],W);
311 function WT = getAvgWaitT(self)
313 % Compute average waiting time in queue excluding service
314 R = getAvgRespTHandles(self);
315 [~,~,RN,~] = self.getAvg([],[],R,[],[],[]);
320 sn = self.model.getStruct;
321 WT = RN - 1./ sn.rates(:);
322 WT(sn.nodetype==NodeType.Source) = 0;
325 function TN = getAvgTput(self)
328 % Compute average throughputs at steady-state
329 T = getAvgTputHandles(self);
330 [~,~,~,TN] = self.getAvg([],[],[],T,[],[]);
333 function AN = getAvgArvR(self)
335 sn = self.model.getStruct();
337 % Compute average arrival rate at steady-state
338 TH = getAvgTputHandles(self);
339 [~,~,~,TN] = self.getAvg([],[],[],TH,[],[]);
340 AN = sn_get_arvr_from_tput(sn, TN, TH);
343 % also accepts a cell array with the handlers in it
344 [QN,UN,RN,TN,AN,WN] = getAvg(self,Q,U,R,T,A,W);
345 [QN,UN,RN,TN,AN,WN] = getAvgNode(self,Q,U,R,T,A,W);
347 [AvgTable,QT,UT,
RT,WT,AT,TT] = getAvgTable(self,Q,U,R,T,A,keepDisabled);
349 [AvgTable,QT] = getAvgQLenTable(self,Q,keepDisabled);
350 [AvgTable,UT] = getAvgUtilTable(self,U,keepDisabled);
351 [AvgTable,
RT] = getAvgRespTTable(self,R,keepDisabled);
352 [AvgTable,TT] = getAvgTputTable(self,T,keepDisabled);
354 [NodeAvgTable,QTn,UTn,RTn,WTn,ATn,TTn] = getAvgNodeTable(self,Q,U,R,T,A,keepDisabled);
355 [AvgChain,QTc,UTc,RTc,WTc,ATc,TTc] = getAvgChainTable(self,Q,U,R,T);
356 [AvgChain,QTc,UTc,RTc,WTc,ATc,TTc] = getAvgNodeChainTable(self,Q,U,R,T);
358 [QNc,UNc,RNc,WNc,ANc,TNc] = getAvgChain(self,Q,U,R,T);
359 [QNc] = getAvgQLenChain(self,Q);
360 [UNc] = getAvgUtilChain(self,U);
361 [RNc] = getAvgRespTChain(self,R);
362 [WNc] = getAvgResidTChain(self,W);
363 [TNc] = getAvgTputChain(self,T);
364 [ANc] = getAvgArvRChain(self,A);
365 [QNc] = getAvgNodeQLenChain(self,Q);
366 [UNc] = getAvgNodeUtilChain(self,U);
367 [RNc] = getAvgNodeRespTChain(self,R);
368 [WNc] = getAvgNodeResidTChain(self,W);
369 [TNc] = getAvgNodeTputChain(self,T);
370 [ANc] = getAvgNodeArvRChain(sef,A);
372 [CNc,XNc] = getAvgSys(self,R,T);
373 [CT,XT] = getAvgSysTable(self,R,T);
374 [RN] = getAvgSysRespT(self,R);
375 [TN] = getAvgSysTput(self,T);
378 function self = setAvgResults(self,Q,U,R,T,A,W,C,X,runtime,method,iter)
379 % SELF = SETAVGRESULTS(SELF,Q,U,R,T,A,W,C,X,RUNTIME,METHOD,ITER)
380 % Store average metrics at steady-state
381 self.result.('solver') = getName(self);
382 if nargin<11 %~exist('method','var')
383 method = getOptions(self).method;
385 if nargin<12 %~exist('iter','var')
388 self.result.Avg.('method') = method;
389 self.result.Avg.('iter') = iter;
390 if isnan(Q), Q=[]; end
391 if isnan(R), R=[]; end
392 if isnan(T), T=[]; end
393 if isnan(U), U=[]; end
394 if isnan(X), X=[]; end
395 if isnan(C), C=[]; end
396 if isnan(A), A=[]; end
397 if isnan(W), W=[]; end
398 self.result.Avg.Q = real(Q);
399 self.result.Avg.R = real(R);
400 self.result.Avg.X = real(X);
401 self.result.Avg.U = real(U);
402 self.result.Avg.T = real(T);
403 self.result.Avg.C = real(C);
404 self.result.Avg.A = real(A);
405 self.result.Avg.W = real(W);
406 self.result.Avg.runtime = runtime;
407 if getOptions(self).verbose
409 solvername = erase(self.result.solver,'Solver');
411 solvername = self.result.solver(7:end);
413 if isnan(iter) || iter==1 || strcmp(solvername,'DES') || strcmp(solvername,'SSA')
414 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 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);
422 function self = setAvgResultsCI(self, QCI, UCI, RCI, TCI, ACI, WCI, CCI, XCI)
423 % SELF = SETAVGRESULTSCI(SELF, QCI, UCI, RCI, TCI, ACI, WCI, CCI, XCI)
424 % Store confidence interval bounds for average metrics
425 % Each CI parameter
is an [M x K x 2] array with lower/upper bounds
426 % or an [M x K] array with half-widths (mean ± halfwidth)
427 if nargin >= 2 && ~isempty(QCI)
428 self.result.Avg.QCI = QCI;
430 if nargin >= 3 && ~isempty(UCI)
431 self.result.Avg.UCI = UCI;
433 if nargin >= 4 && ~isempty(RCI)
434 self.result.Avg.RCI = RCI;
436 if nargin >= 5 && ~isempty(TCI)
437 self.result.Avg.TCI = TCI;
439 if nargin >= 6 && ~isempty(ACI)
440 self.result.Avg.ACI = ACI;
442 if nargin >= 7 && ~isempty(WCI)
443 self.result.Avg.WCI = WCI;
445 if nargin >= 8 && ~isempty(CCI)
446 self.result.Avg.CCI = CCI;
448 if nargin >= 9 && ~isempty(XCI)
449 self.result.Avg.XCI = XCI;
453 function self = setDistribResults(self,Cd,runtime)
454 % SELF = SETDISTRIBRESULTS(SELF,CD,RUNTIME)
456 % Store distribution metrics at steady-state
457 self.result.('solver') = getName(self);
458 self.result.Distribution.('method') = getOptions(self).method;
459 self.result.Distribution.C = Cd;
460 self.result.Distribution.runtime = runtime;
463 function self = setTranProb(self,t,pi_t,SS,runtimet)
464 % SELF = SETTRANPROB(SELF,T,PI_T,SS,RUNTIMET)
466 % Store transient average metrics
467 self.result.('solver') = getName(self);
468 self.result.Tran.Prob.('method') = getOptions(self).method;
469 self.result.Tran.Prob.t = t;
470 self.result.Tran.Prob.pi_t = pi_t;
471 self.result.Tran.Prob.SS = SS;
472 self.result.Tran.Prob.runtime = runtimet;
475 function self = setTranAvgResults(self,Qt,Ut,Rt,Tt,Ct,Xt,runtimet)
476 % SELF = SETTRANAVGRESULTS(SELF,QT,UT,
RT,TT,CT,XT,RUNTIMET)
478 % Store transient average metrics
479 self.result.('solver') = getName(self);
480 self.result.Tran.Avg.('method') = getOptions(self).method;
481 % Clear individual cells that are scalar NaN (not entire array)
482 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
483 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
484 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
485 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
486 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
487 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
488 self.result.Tran.Avg.Q = Qt;
489 self.result.Tran.Avg.R = Rt;
490 self.result.Tran.Avg.U = Ut;
491 self.result.Tran.Avg.T = Tt;
492 self.result.Tran.Avg.X = Xt;
493 self.result.Tran.Avg.C = Ct;
494 self.result.Tran.Avg.runtime = runtimet;
500 [QNt,UNt,TNt] = getTranAvg(self,Qt,Ut,Tt);
502 function [lNormConst] = getProbNormConstAggr(self)
503 % [LNORMCONST] = GETPROBNORMCONST()
505 % Return normalizing constant of state probabilities
506 line_error(mfilename,sprintf(
'getProbNormConstAggr is not supported by %s',
class(self)));
509 function Pstate = getProb(self, node, state)
510 % PSTATE = GETPROBSTATE(NODE, STATE)
512 % Return marginal state probability
for station ist state
513 line_error(mfilename,sprintf(
'getProb is not supported by %s',
class(self)));
516 function Psysstate = getProbSys(self)
517 % PSYSSTATE = GETPROBSYSSTATE()
519 % Return joint state probability
520 line_error(mfilename,sprintf(
'getProbSys is not supported by %s',
class(self)));
523 function Pnir = getProbAggr(self, node, state_a)
524 % PNIR = GETPROBSTATEAGGR(NODE, STATE_A)
526 % Return marginal state probability
for station ist state
527 line_error(mfilename,sprintf(
'getProbAggr is not supported by %s',
class(self)));
530 function Pnjoint = getProbSysAggr(self)
531 % PNJOINT = GETPROBSYSSTATEAGGR()
533 % Return joint state probability
534 line_error(mfilename,sprintf(
'getProbSysAggr is not supported by %s',
class(self)));
537 function Pmarg = getProbMarg(self, node,
jobclass, state_m)
538 % PMARG = GETPROBMARG(NODE, JOBCLASS, STATE_M)
540 % Return marginalized state probability
for station and
class
541 % This computes probabilities marginalized on a given
class, in contrast to
542 % getProbAggr which aggregates over all
classes.
543 line_error(mfilename,sprintf(
'getProbMarg is not supported by %s',
class(self)));
546 function tstate = sample(self, node, numEvents)
547 % TSTATE = SAMPLE(NODE, numEvents)
549 % Return marginal state probability
for station ist state
550 line_error(mfilename,sprintf(
'sample is not supported by %s',
class(self)));
553 function tstate = sampleAggr(self, node, numEvents)
554 % TSTATE = SAMPLEAGGR(NODE, numEvents)
556 % Return marginal state probability
for station ist state
557 line_error(mfilename,sprintf(
'sampleAggr is not supported by %s',
class(self)));
560 function tstate = sampleSys(self, numEvents)
561 % TSTATE = SAMPLESYS(numEvents)
563 % Return joint state probability
564 line_error(mfilename,sprintf(
'sampleSys is not supported by %s',
class(self)));
567 function tstate = sampleSysAggr(self, numEvents)
568 % TSTATE = SAMPLESYSAGGR(numEvents)
570 % Return joint state probability
571 line_error(mfilename,sprintf(
'sampleSysAggr is not supported by %s',
class(self)));
574 function
RD = getCdfRespT(self, R)
575 %
RD = GETCDFRESPT(R)
577 % Return cumulative distribution of response times at steady-state
578 % This uses a trivial approximation that assumes exponential
579 % distributions everywhere with mean as RN(i,r)
582 RD = cell(sn.nstations,sn.nclasses);
583 if GlobalConstants.DummyMode
587 if nargin<2 %~exist(
'R',
'var')
588 R = self.getAvgRespTHandles;
589 % to do: check if some R are disabled
591 if ~self.hasAvgResults
592 self.getAvg; % get steady-state solution
595 if sn.nodetype(sn.stationToNode(i)) ~= NodeType.Source
597 if isfinite(self.result.Avg.R(i,c)) && self.result.Avg.R(i,c)>0
598 lambda = 1/self.result.Avg.R(i,c);
599 n = 100; % number of points
600 quantiles = linspace(0.001, 0.999, n);
601 RD{i,c} = [quantiles;-log(1 - quantiles) / lambda]
';
609 self.setDistribResults(RD, runtime);
612 function RD = getTranCdfRespT(self, R)
613 % RD = GETTRANCDFRESPT(R)
615 % Return cumulative distribution of response times during transient
616 line_error(mfilename,sprintf('getTranCdfRespT
is not supported by %s
',class(self)));
619 function RD = getCdfPassT(self, R)
620 % RD = GETCDFPASST(R)
622 % Return cumulative distribution of passage times at steady-state
623 line_error(mfilename,sprintf('getCdfPassT
is not supported by %s
',class(self)));
626 function RD = getTranCdfPassT(self, R)
627 % RD = GETTRANCDFPASST(R)
629 % Return cumulative distribution of passage times during transient
630 line_error(mfilename,sprintf('getTranCdfPassT
is not supported by %s
',class(self)));
633 % Kotlin-style aliases for getAvg* methods
634 function avg_table = avgTable(self)
635 % AVGTABLE Kotlin-style alias for getAvgTable
636 avg_table = self.getAvgTable();
639 function avg_sys_table = avgSysTable(self)
640 % AVGSYSTABLE Kotlin-style alias for getAvgSysTable
641 avg_sys_table = self.getAvgSysTable();
644 function avg_node_table = avgNodeTable(self)
645 % AVGNODETABLE Kotlin-style alias for getAvgNodeTable
646 avg_node_table = self.getAvgNodeTable();
649 function avg_chain_table = avgChainTable(self)
650 % AVGCHAINTABLE Kotlin-style alias for getAvgChainTable
651 avg_chain_table = self.getAvgChainTable();
654 function avg_node_chain_table = avgNodeChainTable(self)
655 % AVGNODECHAINTABLE Kotlin-style alias for getAvgNodeChainTable
656 avg_node_chain_table = self.getAvgNodeChainTable();
660 function avg_table = avgT(self)
661 % AVGT Short alias for avgTable
662 avg_table = self.avgTable();
665 function avg_sys_table = avgSysT(self)
666 % AVGSYST Short alias for avgSysTable
667 avg_sys_table = self.avgSysTable();
670 function avg_node_table = avgNodeT(self)
671 % AVGNODET Short alias for avgNodeTable
672 avg_node_table = self.avgNodeTable();
675 function avg_chain_table = avgChainT(self)
676 % AVGCHAINT Short alias for avgChainTable
677 avg_chain_table = self.avgChainTable();
680 function avg_node_chain_table = avgNodeChainT(self)
681 % AVGNODECHAINT Short alias for avgNodeChainTable
682 avg_node_chain_table = self.avgNodeChainTable();
685 function varargout = avgChain(self, varargin)
686 % AVGCHAIN Kotlin-style alias for getAvgChain
687 [varargout{1:nargout}] = self.getAvgChain(varargin{:});
690 function varargout = avgSys(self, varargin)
691 % AVGSYS Kotlin-style alias for getAvgSys
692 [varargout{1:nargout}] = self.getAvgSys(varargin{:});
695 function varargout = avgNode(self, varargin)
696 % AVGNODE Kotlin-style alias for getAvgNode
697 [varargout{1:nargout}] = self.getAvgNode(varargin{:});
700 function sys_resp_time = avgSysRespT(self, varargin)
701 % AVGSYSRESPT Kotlin-style alias for getAvgSysRespT
702 sys_resp_time = self.getAvgSysRespT(varargin{:});
705 function sys_tput = avgSysTput(self, varargin)
706 % AVGSYSTPUT Kotlin-style alias for getAvgSysTput
707 sys_tput = self.getAvgSysTput(varargin{:});
710 function arvr_chain = avgArvRChain(self, varargin)
711 % AVGARVCHAIN Kotlin-style alias for getAvgArvRChain
712 arvr_chain = self.getAvgArvRChain(varargin{:});
715 function qlen_chain = avgQLenChain(self, varargin)
716 % AVGQLENCHAIN Kotlin-style alias for getAvgQLenChain
717 qlen_chain = self.getAvgQLenChain(varargin{:});
720 function util_chain = avgUtilChain(self, varargin)
721 % AVGUTILCHAIN Kotlin-style alias for getAvgUtilChain
722 util_chain = self.getAvgUtilChain(varargin{:});
725 function resp_t_chain = avgRespTChain(self, varargin)
726 % AVGRESPTCHAIN Kotlin-style alias for getAvgRespTChain
727 resp_t_chain = self.getAvgRespTChain(varargin{:});
730 function resid_t_chain = avgResidTChain(self, varargin)
731 % AVGRESIDTCHAIN Kotlin-style alias for getAvgResidTChain
732 resid_t_chain = self.getAvgResidTChain(varargin{:});
735 function tput_chain = avgTputChain(self, varargin)
736 % AVGTPUTCHAIN Kotlin-style alias for getAvgTputChain
737 tput_chain = self.getAvgTputChain(varargin{:});
740 function node_arvr_chain = avgNodeArvRChain(self, varargin)
741 % AVGNODERVRCHAIN Kotlin-style alias for getAvgNodeArvRChain
742 node_arvr_chain = self.getAvgNodeArvRChain(varargin{:});
745 function node_qlen_chain = avgNodeQLenChain(self, varargin)
746 % AVGNODEQLENCHAIN Kotlin-style alias for getAvgNodeQLenChain
747 node_qlen_chain = self.getAvgNodeQLenChain(varargin{:});
750 function node_util_chain = avgNodeUtilChain(self, varargin)
751 % AVGNODEUTILCHAIN Kotlin-style alias for getAvgNodeUtilChain
752 node_util_chain = self.getAvgNodeUtilChain(varargin{:});
755 function node_resp_t_chain = avgNodeRespTChain(self, varargin)
756 % AVGNODERESPTCHAIN Kotlin-style alias for getAvgNodeRespTChain
757 node_resp_t_chain = self.getAvgNodeRespTChain(varargin{:});
760 function node_resid_t_chain = avgNodeResidTChain(self, varargin)
761 % AVGNODERESIDTCHAIN Kotlin-style alias for getAvgNodeResidTChain
762 node_resid_t_chain = self.getAvgNodeResidTChain(varargin{:});
765 function node_tput_chain = avgNodeTputChain(self, varargin)
766 % AVGNODETPUTCHAIN Kotlin-style alias for getAvgNodeTputChain
767 node_tput_chain = self.getAvgNodeTputChain(varargin{:});
770 % Kotlin-style aliases for getTran* methods
771 function varargout = tranAvg(self, varargin)
772 % TRANAVG Kotlin-style alias for getTranAvg
773 [varargout{1:nargout}] = self.getTranAvg(varargin{:});
776 function rd = tranCdfRespT(self, varargin)
777 % TRANCDFRESPT Kotlin-style alias for getTranCdfRespT
778 rd = self.getTranCdfRespT(varargin{:});
781 function rd = tranCdfPassT(self, varargin)
782 % TRANCDFPASST Kotlin-style alias for getTranCdfPassT
783 rd = self.getTranCdfPassT(varargin{:});
786 % Kotlin-style aliases for getCdf* methods
787 function rd = cdfRespT(self, varargin)
788 % CDFRESPT Kotlin-style alias for getCdfRespT
789 rd = self.getCdfRespT(varargin{:});
792 function rd = cdfPassT(self, varargin)
793 % CDFPASST Kotlin-style alias for getCdfPassT
794 rd = self.getCdfPassT(varargin{:});
797 % Kotlin-style aliases for getProb* methods
798 function pstate = prob(self, varargin)
799 % PROB Kotlin-style alias for getProb
800 pstate = self.getProb(varargin{:});
803 function psysstate = probSys(self)
804 % PROBSYS Kotlin-style alias for getProbSys
805 psysstate = self.getProbSys();
808 function pnir = probAggr(self, varargin)
809 % PROBAGGR Kotlin-style alias for getProbAggr
810 pnir = self.getProbAggr(varargin{:});
813 function pnjoint = probSysAggr(self)
814 % PROBSYSAGGR Kotlin-style alias for getProbSysAggr
815 pnjoint = self.getProbSysAggr();
818 function pmarg = probMarg(self, varargin)
819 % PROBMARG Kotlin-style alias for getProbMarg
820 pmarg = self.getProbMarg(varargin{:});
823 function lnormconst = probNormConstAggr(self)
824 % PROBNORMCONSTAGGR Kotlin-style alias for getProbNormConstAggr
825 lnormconst = self.getProbNormConstAggr();
828 % Kotlin-style aliases for get*Handles methods
829 function varargout = avgHandles(self)
830 % AVGHANDLES Kotlin-style alias for getAvgHandles
831 [varargout{1:nargout}] = self.getAvgHandles();
834 function varargout = tranHandles(self)
835 % TRANHANDLES Kotlin-style alias for getTranHandles
836 [varargout{1:nargout}] = self.getTranHandles();
839 function q = avgQLenHandles(self)
840 % AVGQLENHANDLES Kotlin-style alias for getAvgQLenHandles
841 q = self.getAvgQLenHandles();
844 function u = avgUtilHandles(self)
845 % AVGUTILHANDLES Kotlin-style alias for getAvgUtilHandles
846 u = self.getAvgUtilHandles();
849 function r = avgRespTHandles(self)
850 % AVGRESPTHANDLES Kotlin-style alias for getAvgRespTHandles
851 r = self.getAvgRespTHandles();
854 function t = avgTputHandles(self)
855 % AVGTPUTHANDLES Kotlin-style alias for getAvgTputHandles
856 t = self.getAvgTputHandles();
859 function a = avgArvRHandles(self)
860 % AVGARVRHANDLES Kotlin-style alias for getAvgArvRHandles
861 a = self.getAvgArvRHandles();
864 function w = avgResidTHandles(self)
865 % AVGRESIDTHANDLES Kotlin-style alias for getAvgResidTHandles
866 w = self.getAvgResidTHandles();
869 % Kotlin-style aliases for basic get* methods
870 function qn = avgQLen(self)
871 % AVGQLEN Kotlin-style alias for getAvgQLen
872 qn = self.getAvgQLen();
875 function un = avgUtil(self)
876 % AVGUTIL Kotlin-style alias for getAvgUtil
877 un = self.getAvgUtil();
880 function rn = avgRespT(self)
881 % AVGRESPT Kotlin-style alias for getAvgRespT
882 rn = self.getAvgRespT();
885 function wn = avgResidT(self)
886 % AVGRESIDT Kotlin-style alias for getAvgResidT
887 wn = self.getAvgResidT();
890 function wt = avgWaitT(self)
891 % AVGWAITT Kotlin-style alias for getAvgWaitT
892 wt = self.getAvgWaitT();
895 function tn = avgTput(self)
896 % AVGTPUT Kotlin-style alias for getAvgTput
897 tn = self.getAvgTput();
900 function an = avgArvR(self)
901 % AVGARVR Kotlin-style alias for getAvgArvR
902 an = self.getAvgArvR();
908 function solvers = getAllSolvers(model, options)
909 % SOLVERS = GETALLSOLVERS(MODEL, OPTIONS)
911 % Return a cell array with all Network solvers
912 if nargin<2 %~exist('options
','var
')
913 options = Solver.defaultOptions;
916 solvers{end+1} = SolverCTMC(model, options);
917 solvers{end+1} = SolverFluid(model, options);
918 solvers{end+1} = SolverJMT(model, options);
919 solvers{end+1} = SolverMAM(model, options);
920 solvers{end+1} = SolverMVA(model, options);
921 solvers{end+1} = SolverNC(model, options);
922 solvers{end+1} = SolverSSA(model, options);