1function [runtime, analyzer] = runAnalyzer(self, options)
7 options = self.getOptions;
15if self.enableChecks && ~self.supports(self.model)
16 line_error(mfilename,
'This model contains features not supported by the solver.');
19Solver.resetRandomGeneratorSeed(options.seed);
21sn = getStruct(self); % doesn
't need initial state
22line_debug(options, 'QNS: starting (method=%s, multiserver=%s)
', options.method, options.config.multiserver);
24if (strcmp(options.method,'exact
')||strcmp(options.method,'mva
')) && ~self.model.hasProductFormSolution
25 line_error(mfilename,'The exact method
requires the model to have a product-form solution. This model does not have one. You can use Network.hasProductFormSolution() to check before running the solver.
');
28method = options.method;
32 options.config.multiserver = 'conway
';
34 options.config.multiserver = 'rolia
';
36 options.config.multiserver = 'zhou
';
38 options.config.multiserver = 'suri
';
40 options.config.multiserver = 'reiser
';
42 options.config.multiserver = 'schmidt
';
44 options.config.multiserver = 'rolia
';
47if self.model.hasProductFormSolution() || self.model.hasOpenClasses()
48 % Use qnsolver directly for product-form networks or open networks
49 % (QN2LQN does not support Source/Sink nodes for open networks)
50 line_debug(options, 'QNS: product-form or open model, routing to qns_analyzer
');
51 [QN,UN,RN,TN,CN,XN,runtime,actualMethod] = solver_qns_analyzer(sn, options);
53 line_debug(options, 'QNS: non-product-form closed model, converting to LQN and
using SolverLQNS
');
54 lqnmodel=QN2LQN(self.model);
55 lqn = lqnmodel.getStruct;
57 lqnsoptions = SolverLQNS.defaultOptions;
58 lqnsoptions.verbose = false;
59 actualMethod = options.method; % Track the actual method for LQNS path
62 lqnsoptions.config.multiserver = 'conway
';
63 actualMethod = 'conway
';
65 lqnsoptions.config.multiserver = 'rolia
';
66 actualMethod = 'rolia
';
68 lqnsoptions.config.multiserver = 'zhou
';
69 actualMethod = 'zhou
';
71 lqnsoptions.config.multiserver = 'suri
';
72 actualMethod = 'suri
';
74 lqnsoptions.config.multiserver = 'reiser
';
75 actualMethod = 'reiser
';
77 lqnsoptions.config.multiserver = 'schmidt
';
78 actualMethod = 'schmidt
';
80 actualMethod = 'rolia
'; % Default is rolia for LQNS
82 AvgTable = SolverLQNS(lqnmodel,lqnsoptions).getAvgTable;
86 t = lqn.ashift + r + (i-1)*sn.nclasses;
87 QN(i,r) = AvgTable.QLen(t);
88 if ~isinf(sn.nservers(i))
89 UN(i,r) = AvgTable.Util(t)/sn.nservers(i);
91 UN(i,r) = AvgTable.Util(t);
93 RN(i,r) = AvgTable.RespT(t);
94 WN(i,r) = AvgTable.ResidT(t);
95 TN(i,r) = AvgTable.Tput(t);
103 analyzer = @(sn) solver_qns_analyzer(sn, options);
107T = getAvgTputHandles(self);
108AN = sn_get_arvr_from_tput(sn, TN, T);
110% Apply default(...) convention based on actual method used
111if strcmp(method, 'default')
112 method = ['default/
' actualMethod];
114 method = actualMethod;
117self.setAvgResults(QN,UN,RN,TN,AN,[],CN,XN,runtime,method);