LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
runAnalyzer.m
1function runtime = runAnalyzer(self, options)
2% RUNTIME = RUNANALYZER(OPTIONS)
3% Run the solver
4
5if nargin<2
6 options = self.getOptions;
7end
8
9% Wall-clock time-budget launch marker (see options.timeout / lineTimeoutExceeded)
10options.timeout_tic = tic;
11
12[pyHandled, options, pyRuntime] = self.runAnalyzerPreamble(options, 'MVA');
13if pyHandled
14 runtime = pyRuntime;
15 return
16end
17
18self.runAnalyzerChecks(options);
19
20sn = self.getStruct();
21% Finite Capacity Region: MVA does not enforce the aggregate per-region job
22% limit and would silently return the unconstrained product-form answer.
23if isfield(sn,'nregions') && sn.nregions > 0
24 line_error(mfilename,'This model uses a Finite Capacity Region (addRegion), which is not supported by SolverMVA. Use SolverJMT, or setCapacity for a single-station limit.');
25end
26if isfield(sn,'immfeed') && ~isempty(sn.immfeed) && any(sn.immfeed(:))
27 line_warning(mfilename,'SolverMVA does not handle immediate feedback (immfeed); the solver will treat self-loops as class-switching with re-queueing.\n');
28end
29
30Solver.resetRandomGeneratorSeed(options.seed);
31
32
33iter = 0;
34%options.lang='java';
35
36switch options.lang
37 case 'java'
38 line_debug(options, 'MVA: using lang=java, delegating to JLINE');
39 sn = getStruct(self); % doesn't need initial state
40 jmodel = LINE2JLINE(self.model);
41 %M = jmodel.getNumberOfStatefulNodes;
42 M = jmodel.getNumberOfStations;
43 R = jmodel.getNumberOfClasses;
44 jsolver = JLINE.SolverMVA(jmodel, options);
45 % carry the JAR-side fork-join (MMT) iterate across the rebuilt JLINE solver;
46 % see _kb/06-solver-catalog.md (MVA section) on the fork-join fixed point
47 if options.config.fj_warmstart && ~isempty(self.fjForkLambda)
48 jsolver.setForkWarmStart(JLINE.from_line_matrix(self.fjForkLambda));
49 end
50 [QN,UN,RN,WN,AN,TN] = JLINE.arrayListToResults(jsolver.getAvgTable);
51 if self.model.hasFork
52 self.fjForkLambda = JLINE.from_jline_matrix(jsolver.getForkWarmStart());
53 end
54 runtime = jsolver.result.runtime;
55 CN = [];
56 XN = [];
57 QN = reshape(QN',R,M)';
58 UN = reshape(UN',R,M)';
59 RN = reshape(RN',R,M)';
60 TN = reshape(TN',R,M)';
61 WN = reshape(WN',R,M)';
62 AN = reshape(AN',R,M)';
63 lG = NaN;
64 lastiter = NaN;
65 for ind = 1:sn.nnodes
66 if sn.nodetype(ind) == NodeType.Cache
67 jnode = jmodel.getNodeByIndex(ind-1);
68 self.model.nodes{ind}.setResultHitProb(JLINE.from_jline_matrix(jnode.getHitRatio()));
69 self.model.nodes{ind}.setResultMissProb(JLINE.from_jline_matrix(jnode.getMissRatio()));
70 % Retrieval-cache extras (delayed-hit ratio, per-list hit ratio
71 % and expected latency) so getAvgCacheTable matches the native path.
72 self.model.nodes{ind}.setResultDelayedHitProb(JLINE.from_jline_matrix(jnode.getDelayedHitRatio()));
73 self.model.nodes{ind}.setResultHitProbList(JLINE.from_jline_matrix(jnode.getHitRatioByList()));
74 self.model.nodes{ind}.setResultItemProb(JLINE.from_jline_matrix(jnode.getItemProb()));
75 self.model.nodes{ind}.setResultResidT(JLINE.from_jline_matrix(jnode.getResidT()));
76 end
77 end
78 %self.model.refreshChains();
79 self.model.refreshStruct(true);
80 self.setAvgResults(QN,UN,RN,TN,AN,WN,CN,XN,runtime,options.method,lastiter);
81 self.result.Prob.logNormConstAggr = lG;
82 return
83 case 'matlab'
84 line_debug(options, 'MVA: using lang=matlab');
85 % solver-agnostic fork-join fixed point (fjFixedPoint) driven with
86 % mvaDispatch as callback; see _kb/06-solver-catalog.md (MVA section)
87 fjres = self.fjFixedPoint(options, @(sn_, opt_) self.mvaDispatch(sn_, opt_));
88 QN = fjres.QN; UN = fjres.UN; RN = fjres.RN; TN = fjres.TN;
89 CN = fjres.CN; XN = fjres.XN; lG = fjres.lG;
90 runtime = fjres.runtime; iter = fjres.iter; method = fjres.method;
91 actualmethod = fjres.actualmethod;
92
93 sn = self.model.getStruct();
94
95 % Compute average residence time at steady-state
96 AN = sn_get_arvr_from_tput(sn, TN, self.getAvgTputHandles());
97 WN = sn_get_residt_from_respt(sn, RN, self.getAvgResidTHandles());
98 if strcmp(method,'default') && ~isempty(actualmethod)
99 self.setAvgResults(QN,UN,RN,TN,AN,WN,CN,XN,runtime,['default/' actualmethod],iter);
100 else
101 self.setAvgResults(QN,UN,RN,TN,AN,WN,CN,XN,runtime,method,iter);
102 end
103 self.result.Prob.logNormConstAggr = lG;
104 if lineTimeoutExceeded(options)
105 self.result.Avg.timedOut = true;
106 line_warning(mfilename,'Solver stopped after the wall-clock time budget (options.timeout=%gs) was exceeded; returning the interim solution.\n', options.timeout);
107 end
108end
109end
110
111