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
23if (strcmp(options.method,'exact
')||strcmp(options.method,'mva
')) && ~self.model.hasProductFormSolution
24 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.
');
27method = options.method;
31 options.config.multiserver = 'conway
';
33 options.config.multiserver = 'rolia
';
35 options.config.multiserver = 'zhou
';
37 options.config.multiserver = 'suri
';
39 options.config.multiserver = 'reiser
';
41 options.config.multiserver = 'schmidt
';
43 options.config.multiserver = 'rolia
';
46if self.model.hasProductFormSolution() || self.model.hasOpenClasses()
47 % Use qnsolver directly for product-form networks or open networks
48 % (QN2LQN does not support Source/Sink nodes for open networks)
49 [QN,UN,RN,TN,CN,XN,runtime,actualMethod] = solver_qns_analyzer(sn, options);
51 lqnmodel=QN2LQN(self.model);
52 lqn = lqnmodel.getStruct;
54 lqnsoptions = SolverLQNS.defaultOptions;
55 lqnsoptions.verbose = false;
56 actualMethod = options.method; % Track the actual method for LQNS path
59 lqnsoptions.config.multiserver = 'conway
';
60 actualMethod = 'conway
';
62 lqnsoptions.config.multiserver = 'rolia
';
63 actualMethod = 'rolia
';
65 lqnsoptions.config.multiserver = 'zhou
';
66 actualMethod = 'zhou
';
68 lqnsoptions.config.multiserver = 'suri
';
69 actualMethod = 'suri
';
71 lqnsoptions.config.multiserver = 'reiser
';
72 actualMethod = 'reiser
';
74 lqnsoptions.config.multiserver = 'schmidt
';
75 actualMethod = 'schmidt
';
77 actualMethod = 'rolia
'; % Default is rolia for LQNS
79 AvgTable = SolverLQNS(lqnmodel,lqnsoptions).getAvgTable;
83 t = lqn.ashift + r + (i-1)*sn.nclasses;
84 QN(i,r) = AvgTable.QLen(t);
85 if ~isinf(sn.nservers(i))
86 UN(i,r) = AvgTable.Util(t)/sn.nservers(i);
88 UN(i,r) = AvgTable.Util(t);
90 RN(i,r) = AvgTable.RespT(t);
91 WN(i,r) = AvgTable.ResidT(t);
92 TN(i,r) = AvgTable.Tput(t);
100 analyzer = @(sn) solver_qns_analyzer(sn, options);
104T = getAvgTputHandles(self);
105AN = sn_get_arvr_from_tput(sn, TN, T);
107% Apply default(...) convention based on actual method used
108if strcmp(method, 'default')
109 method = ['default/
' actualMethod];
111 method = actualMethod;
114self.setAvgResults(QN,UN,RN,TN,AN,[],CN,XN,runtime,method);