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
22
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.');
25end
26
27method = options.method;
28
29switch options.method
30 case 'conway'
31 options.config.multiserver = 'conway';
32 case 'rolia'
33 options.config.multiserver = 'rolia';
34 case 'zhou'
35 options.config.multiserver = 'zhou';
36 case 'suri'
37 options.config.multiserver = 'suri';
38 case 'reiser'
39 options.config.multiserver = 'reiser';
40 case 'schmidt'
41 options.config.multiserver = 'schmidt';
42 case 'default'
43 options.config.multiserver = 'rolia';
44end
45
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);
50else
51 lqnmodel=QN2LQN(self.model);
52 lqn = lqnmodel.getStruct;
53 tic;
54 lqnsoptions = SolverLQNS.defaultOptions;
55 lqnsoptions.verbose = false;
56 actualMethod = options.method; % Track the actual method for LQNS path
57 switch options.method
58 case 'conway'
59 lqnsoptions.config.multiserver = 'conway';
60 actualMethod = 'conway';
61 case 'rolia'
62 lqnsoptions.config.multiserver = 'rolia';
63 actualMethod = 'rolia';
64 case 'zhou'
65 lqnsoptions.config.multiserver = 'zhou';
66 actualMethod = 'zhou';
67 case 'suri'
68 lqnsoptions.config.multiserver = 'suri';
69 actualMethod = 'suri';
70 case 'reiser'
71 lqnsoptions.config.multiserver = 'reiser';
72 actualMethod = 'reiser';
73 case 'schmidt'
74 lqnsoptions.config.multiserver = 'schmidt';
75 actualMethod = 'schmidt';
76 case 'default'
77 actualMethod = 'rolia'; % Default is rolia for LQNS
78 end
79 AvgTable = SolverLQNS(lqnmodel,lqnsoptions).getAvgTable;
80 runtime=toc;
81 for r=1:sn.nclasses
82 for i=1:sn.nstations
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);
87 else
88 UN(i,r) = AvgTable.Util(t);
89 end
90 RN(i,r) = AvgTable.RespT(t);
91 WN(i,r) = AvgTable.ResidT(t);
92 TN(i,r) = AvgTable.Tput(t);
93 end
94 end
95 XN=[];
96 CN=[];
97end
98
99if nargout > 1
100 analyzer = @(sn) solver_qns_analyzer(sn, options);
101end
102
103sn = self.getStruct;
104T = getAvgTputHandles(self);
105AN = sn_get_arvr_from_tput(sn, TN, T);
106
107% Apply default(...) convention based on actual method used
108if strcmp(method, 'default')
109 method = ['default/' actualMethod];
110else
111 method = actualMethod;
112end
113
114self.setAvgResults(QN,UN,RN,TN,AN,[],CN,XN,runtime,method);
115
116runtime = toc(T0);
117end