LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
runAnalyzer.m
1
2function [runtime, tranSysState, tranSync] = runAnalyzer(self, options)
3% [RUNTIME, TRANSYSSTATE] = RUN()
4
5T0=tic;
6if nargin<2 %~exist('options','var')
7 options = self.getOptions;
8end
9self.runAnalyzerChecks(options);
10Solver.resetRandomGeneratorSeed(options.seed);
11
12% Show library attribution if verbose and not yet shown
13if options.verbose ~= VerboseLevel.SILENT && ~GlobalConstants.isLibraryAttributionShown()
14 sn_temp = self.getStruct();
15 libs = SolverSSA.getLibrariesUsed(sn_temp, options);
16 if ~isempty(libs)
17 line_printf('The solver will leverage %s.\n', strjoin(libs, ', '));
18 GlobalConstants.setLibraryAttributionShown(true);
19 end
20end
21
22% Check if confidence intervals are requested
23[confintEnabled, confintLevel] = Solver.parseConfInt(options.confint);
24
25%options.lang = 'java';
26
27sn = getStruct(self);
28
29switch options.lang
30 case 'java'
31 line_debug(options, 'SSA: using lang=java, delegating to JLINE');
32 if nargout > 1
33 % The JLINE delegation only returns steady-state averages; the
34 % transient state trajectory (tranSysState/tranSync) required by
35 % sample*/getProb* is not available under lang=java.
36 line_error(mfilename,'SolverSSA transient sampling (sample/sampleAggr/sampleSys/sampleSysAggr/getProb/getProbAggr/getProbSys/getProbSysAggr) is not supported with lang=''java''. Use lang=''matlab'' or SolverCTMC.');
37 end
38 switch options.method
39 case {'default','serial','parallel'}
40 switch options.method
41 case 'default'
42 options.verbose = VerboseLevel.SILENT;
43 actualmethod = 'parallel';
44 end
45 jmodel = LINE2JLINE(self.model);
46 M = jmodel.getNumberOfStations;
47 R = jmodel.getNumberOfClasses;
48 tic;
49 jsolver = JLINE.SolverSSA(jmodel, options);
50 [QN,UN,RN,WN,AN,TN] = JLINE.arrayListToResults(jsolver.getAvgTable);
51 CN = JLINE.from_jline_matrix(jsolver.getAvgSysRespT());
52 XN = JLINE.from_jline_matrix(jsolver.getAvgSysTput());
53 runtime = jsolver.result.runtime;
54 QN = reshape(QN',R,M)';
55 UN = reshape(UN',R,M)';
56 RN = reshape(RN',R,M)';
57 TN = reshape(TN',R,M)';
58 WN = reshape(WN',R,M)';
59 AN = reshape(AN',R,M)';
60 % Extract cache hit/miss probabilities from Java model
61 for ind = 1:sn.nnodes
62 if sn.nodetype(ind) == NodeType.Cache
63 hitRatioVec = JLINE.from_jline_matrix(jmodel.getNodeByIndex(ind-1).getHitRatio());
64 missRatioVec = JLINE.from_jline_matrix(jmodel.getNodeByIndex(ind-1).getMissRatio());
65 hitClass = self.model.nodes{ind}.getHitClass;
66 nk = length(hitClass);
67 hitprob = zeros(1, nk);
68 missprob = zeros(1, nk);
69 for k = 1:nk
70 if hitClass(k) > 0 && k <= length(hitRatioVec)
71 hitprob(k) = hitRatioVec(k);
72 missprob(k) = missRatioVec(k);
73 end
74 end
75 self.model.nodes{ind}.setResultHitProb(hitprob);
76 self.model.nodes{ind}.setResultMissProb(missprob);
77 end
78 end
79 if any(sn.nodetype == NodeType.Cache)
80 self.model.refreshStruct(true);
81 end
82 self.setAvgResults(QN,UN,RN,TN,AN,WN,CN,XN,runtime);
83
84 % Extract confidence intervals from Java solver results
85 if confintEnabled
86 result = jsolver.result;
87 % Helper to check for non-null Java objects
88 isValidMatrix = @(x) ~isempty(x) && isa(x, 'jline.util.matrix.Matrix');
89 if isValidMatrix(result.QNCI)
90 QNCI = JLINE.from_jline_matrix(result.QNCI);
91 QNCI = reshape(QNCI', R, M)';
92 else
93 QNCI = [];
94 end
95 if isValidMatrix(result.UNCI)
96 UNCI = JLINE.from_jline_matrix(result.UNCI);
97 UNCI = reshape(UNCI', R, M)';
98 else
99 UNCI = [];
100 end
101 if isValidMatrix(result.RNCI)
102 RNCI = JLINE.from_jline_matrix(result.RNCI);
103 RNCI = reshape(RNCI', R, M)';
104 else
105 RNCI = [];
106 end
107 if isValidMatrix(result.TNCI)
108 TNCI = JLINE.from_jline_matrix(result.TNCI);
109 TNCI = reshape(TNCI', R, M)';
110 else
111 TNCI = [];
112 end
113 if isValidMatrix(result.ANCI)
114 ANCI = JLINE.from_jline_matrix(result.ANCI);
115 ANCI = reshape(ANCI', R, M)';
116 else
117 ANCI = [];
118 end
119 if isValidMatrix(result.WNCI)
120 WNCI = JLINE.from_jline_matrix(result.WNCI);
121 WNCI = reshape(WNCI', R, M)';
122 else
123 WNCI = [];
124 end
125 % Store CI results
126 self.setAvgResultsCI(QNCI, UNCI, RNCI, TNCI, ANCI, WNCI, [], []);
127 end
128 otherwise
129 line_error(mfilename, ['the ',options.method',' method is not available.']);
130 end
131 case 'matlab'
132 line_debug(options, 'SSA: using lang=matlab');
133 [QN,UN,RN,TN,CN,XN,~,actualmethod,tranSysState, tranSync, sn, QNCI, UNCI, RNCI, TNCI, ANCI, WNCI] = solver_ssa_analyzer(sn, options);
134
135 for isf=1:sn.nstateful
136 ind = sn.statefulToNode(isf);
137 switch sn.nodetype(sn.statefulToNode(isf))
138 case NodeType.Cache
139 self.model.nodes{sn.statefulToNode(isf)}.setResultHitProb(sn.nodeparam{ind}.actualhitprob);
140 self.model.nodes{sn.statefulToNode(isf)}.setResultMissProb(sn.nodeparam{ind}.actualmissprob);
141 if isfield(sn.nodeparam{ind}, 'actualresidt')
142 self.model.nodes{sn.statefulToNode(isf)}.setResultResidT(sn.nodeparam{ind}.actualresidt);
143 end
144 self.model.refreshChains();
145 end
146 end
147 line_debug(options, 'SSA analysis complete: extracting results (nstations=%d, nclasses=%d)', sn.nstations, sn.nclasses);
148 runtime = toc(T0);
149 T = getAvgTputHandles(self);
150 AN = sn_get_arvr_from_tput(sn, TN, T);
151 if strcmp(options.method,'default') && exist('actualmethod','var')
152 self.setAvgResults(QN,UN,RN,TN,AN,[],CN,XN,runtime,['default/' actualmethod]);
153 else
154 self.setAvgResults(QN,UN,RN,TN,AN,[],CN,XN,runtime,options.method);
155 end
156 self.result.space = sn.space;
157
158 % Store CI data if computed
159 if confintEnabled && ~isempty(QNCI)
160 self.setAvgResultsCI(QNCI, UNCI, RNCI, TNCI, ANCI, WNCI, [], []);
161 end
162end
163end
Definition mmt.m:124