LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
runAnalyzer.m
1function [runtime, analyzer] = runAnalyzer(self, options)
2% RUNTIME = RUN()
3% Run the solver
4
5T0=tic;
6if nargin<2
7 options = self.getOptions;
8end
9
10QN = []; UN = [];
11RN = []; TN = [];
12CN = []; XN = [];
13lG = NaN;
14
15if self.enableChecks && ~self.supports(self.model)
16 line_error(mfilename,'This model contains features not supported by the solver.');
17end
18
19Solver.resetRandomGeneratorSeed(options.seed);
20
21sn = getStruct(self); % doesn't need initial state
22line_debug(options, 'QNS: starting (method=%s, multiserver=%s)', options.method, options.config.multiserver);
23
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.');
26end
27
28method = options.method;
29
30switch options.method
31 case 'conway'
32 options.config.multiserver = 'conway';
33 case 'rolia'
34 options.config.multiserver = 'rolia';
35 case 'zhou'
36 options.config.multiserver = 'zhou';
37 case 'suri'
38 options.config.multiserver = 'suri';
39 case 'reiser'
40 options.config.multiserver = 'reiser';
41 case 'schmidt'
42 options.config.multiserver = 'schmidt';
43 case 'default'
44 options.config.multiserver = 'rolia';
45end
46
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);
52else
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;
56 tic;
57 lqnsoptions = SolverLQNS.defaultOptions;
58 lqnsoptions.verbose = false;
59 actualMethod = options.method; % Track the actual method for LQNS path
60 switch options.method
61 case 'conway'
62 lqnsoptions.config.multiserver = 'conway';
63 actualMethod = 'conway';
64 case 'rolia'
65 lqnsoptions.config.multiserver = 'rolia';
66 actualMethod = 'rolia';
67 case 'zhou'
68 lqnsoptions.config.multiserver = 'zhou';
69 actualMethod = 'zhou';
70 case 'suri'
71 lqnsoptions.config.multiserver = 'suri';
72 actualMethod = 'suri';
73 case 'reiser'
74 lqnsoptions.config.multiserver = 'reiser';
75 actualMethod = 'reiser';
76 case 'schmidt'
77 lqnsoptions.config.multiserver = 'schmidt';
78 actualMethod = 'schmidt';
79 case 'default'
80 actualMethod = 'rolia'; % Default is rolia for LQNS
81 end
82 AvgTable = SolverLQNS(lqnmodel,lqnsoptions).getAvgTable;
83 runtime=toc;
84 for r=1:sn.nclasses
85 for i=1:sn.nstations
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);
90 else
91 UN(i,r) = AvgTable.Util(t);
92 end
93 RN(i,r) = AvgTable.RespT(t);
94 WN(i,r) = AvgTable.ResidT(t);
95 TN(i,r) = AvgTable.Tput(t);
96 end
97 end
98 XN=[];
99 CN=[];
100end
101
102if nargout > 1
103 analyzer = @(sn) solver_qns_analyzer(sn, options);
104end
105
106sn = self.getStruct;
107T = getAvgTputHandles(self);
108AN = sn_get_arvr_from_tput(sn, TN, T);
109
110% Apply default(...) convention based on actual method used
111if strcmp(method, 'default')
112 method = ['default/' actualMethod];
113else
114 method = actualMethod;
115end
116
117self.setAvgResults(QN,UN,RN,TN,AN,[],CN,XN,runtime,method);
118
119runtime = toc(T0);
120end