2function [runtime, tranSysState, tranSync] = runAnalyzer(self, options)
3% [RUNTIME, TRANSYSSTATE] = RUN()
6if nargin<2 %~exist('options','var')
7 options = self.getOptions;
9self.runAnalyzerChecks(options);
10Solver.resetRandomGeneratorSeed(options.seed);
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);
17 line_printf('The solver will leverage %s.\n', strjoin(libs, ', '));
18 GlobalConstants.setLibraryAttributionShown(true);
22% Check if confidence intervals are requested
23[confintEnabled, confintLevel] = Solver.parseConfInt(options.confint);
25%options.lang = 'java';
31 line_debug(options, 'SSA: using lang=java, delegating to JLINE');
33 case {
'default',
'serial',
'parallel'}
36 options.verbose = VerboseLevel.SILENT;
37 actualmethod =
'parallel';
39 jmodel = LINE2JLINE(self.model);
40 M = jmodel.getNumberOfStations;
41 R = jmodel.getNumberOfClasses;
43 jsolver = JLINE.SolverSSA(jmodel, options);
44 [QN,UN,RN,WN,AN,TN] = JLINE.arrayListToResults(jsolver.getAvgTable);
45 CN = JLINE.from_jline_matrix(jsolver.getAvgSysRespT());
46 XN = JLINE.from_jline_matrix(jsolver.getAvgSysTput());
47 runtime = jsolver.result.runtime;
48 QN = reshape(QN
',R,M)';
49 UN = reshape(UN
',R,M)';
50 RN = reshape(RN
',R,M)';
51 TN = reshape(TN
',R,M)';
52 WN = reshape(WN
',R,M)';
53 AN = reshape(AN
',R,M)';
54 % Extract cache hit/miss probabilities from Java model
56 if sn.nodetype(ind) == NodeType.Cache
57 hitRatioVec = JLINE.from_jline_matrix(jmodel.getNodeByIndex(ind-1).getHitRatio());
58 missRatioVec = JLINE.from_jline_matrix(jmodel.getNodeByIndex(ind-1).getMissRatio());
59 hitClass = self.model.nodes{ind}.getHitClass;
60 nk = length(hitClass);
61 hitprob = zeros(1, nk);
62 missprob = zeros(1, nk);
64 if hitClass(k) > 0 && k <= length(hitRatioVec)
65 hitprob(k) = hitRatioVec(k);
66 missprob(k) = missRatioVec(k);
69 self.model.nodes{ind}.setResultHitProb(hitprob);
70 self.model.nodes{ind}.setResultMissProb(missprob);
73 if any(sn.nodetype == NodeType.Cache)
74 self.model.refreshStruct(true);
76 self.setAvgResults(QN,UN,RN,TN,AN,WN,CN,XN,runtime);
78 % Extract confidence intervals from Java solver results
80 result = jsolver.result;
81 % Helper to check for non-null Java objects
82 isValidMatrix = @(x) ~isempty(x) && isa(x, 'jline.util.matrix.Matrix');
83 if isValidMatrix(result.QNCI)
84 QNCI = JLINE.from_jline_matrix(result.QNCI);
85 QNCI = reshape(QNCI', R, M)';
89 if isValidMatrix(result.UNCI)
90 UNCI = JLINE.from_jline_matrix(result.UNCI);
91 UNCI = reshape(UNCI', R, M)';
95 if isValidMatrix(result.RNCI)
96 RNCI = JLINE.from_jline_matrix(result.RNCI);
97 RNCI = reshape(RNCI', R, M)';
101 if isValidMatrix(result.TNCI)
102 TNCI = JLINE.from_jline_matrix(result.TNCI);
103 TNCI = reshape(TNCI', R, M)';
107 if isValidMatrix(result.ANCI)
108 ANCI = JLINE.from_jline_matrix(result.ANCI);
109 ANCI = reshape(ANCI', R, M)';
113 if isValidMatrix(result.WNCI)
114 WNCI = JLINE.from_jline_matrix(result.WNCI);
115 WNCI = reshape(WNCI', R, M)';
120 self.setAvgResultsCI(QNCI, UNCI, RNCI, TNCI, ANCI, WNCI, [], []);
123 line_error(mfilename, ['the ',options.method',' method
is not available.']);
126 line_debug(options, 'SSA: using lang=matlab');
127 [QN,UN,RN,TN,CN,XN,~,actualmethod,tranSysState, tranSync, sn, QNCI, UNCI, RNCI, TNCI, ANCI, WNCI] = solver_ssa_analyzer(sn, options);
129 for isf=1:sn.nstateful
130 ind = sn.statefulToNode(isf);
131 switch sn.nodetype(sn.statefulToNode(isf))
133 self.model.
nodes{sn.statefulToNode(isf)}.setResultHitProb(sn.nodeparam{ind}.actualhitprob);
134 self.model.nodes{sn.statefulToNode(isf)}.setResultMissProb(sn.nodeparam{ind}.actualmissprob);
135 self.model.refreshChains();
138 line_debug(options,
'SSA analysis complete: extracting results (nstations=%d, nclasses=%d)', sn.nstations, sn.nclasses);
140 T = getAvgTputHandles(self);
141 AN = sn_get_arvr_from_tput(sn, TN, T);
142 if strcmp(options.method,
'default') && exist(
'actualmethod',
'var')
143 self.setAvgResults(QN,UN,RN,TN,AN,[],CN,XN,runtime,['default/' actualmethod]);
145 self.setAvgResults(QN,UN,RN,TN,AN,[],CN,XN,runtime,options.method);
147 self.result.space = sn.space;
149 % Store CI data if computed
150 if confintEnabled && ~isempty(QNCI)
151 self.setAvgResultsCI(QNCI, UNCI, RNCI, TNCI, ANCI, WNCI, [], []);