1function [XN,UN,QN,RN,TN,CN,tranSysState,tranSync,snc]=solver_ssa_analyzer_parallel(sn, init_state, laboptions)
2% [XN,UN,QN,RN,TN,CN]=SOLVER_SSA_ANALYZER_PARALLEL(LABOPTIONS, QN, PH)
4snc = sn; % required due to spmd parallelism
5M = snc.nstations; %number of stations
6K = snc.nclasses; %number of
classes
9NK = snc.njobs
'; % initial population per class
12 if isMATLABReleaseOlderThan("R2022b")
13 nLabs = numlabs; %#ok<DNUMLABS>
18 % eventCache is not shared across labs
19 if isfield(laboptions,'config
') && isfield(laboptions.config,'eventcache
')
20 eventCache = EventCache.create(laboptions.config.eventcache, sn);
22 eventCache = EventCache.create(false, sn);
25 laboptions.samples = ceil(laboptions.samples / nLabs);
26 laboptions.verbose = VerboseLevel.SILENT;
28 [probSysState,SSq,arvRates,depRates,~,~,snc] = solver_ssa(snc, init_state, laboptions, eventCache);
38 refsf = snc.stationToStateful(snc.refstat(k));
39 XN(k) = probSysState*depRates(:,refsf,k);
41 isf = snc.stationToStateful(ist);
42 TN(ist,k) = probSysState*depRates(:,isf,k);
43 QN(ist,k) = probSysState*SSq(:,(ist-1)*K+k);
45 case SchedStrategy.INF
46 UN(ist,k) = QN(ist,k);
48 % we use Little's law, otherwise there are issues in
49 % estimating the fraction of time assigned to
class k (to
51 if ~isempty(PH{ist}{k})
52 UN(ist,k) = probSysState*arvRates(:,ist,k)/rates(ist,k)/S(ist);
61 RN(ist,k) = QN(ist,k)./TN(ist,k);
76 % now update the routing probabilities in
nodes with state-dependent routing
78 for isf=1:snc.nstateful
79 if snc.nodetype(isf) == NodeType.Cache
80 TNcache(isf,k) = probSysState*depRates(:,isf,k);
85 % updates cache actual hit and miss data
87 for isf=1:snc.nstateful
88 if snc.nodetype(isf) == NodeType.Cache
89 ind = snc.statefulToNode(isf);
90 if length(snc.nodeparam{ind}.hitclass)>=k
91 h = snc.nodeparam{ind}.hitclass(k);
92 m = snc.nodeparam{ind}.missclass(k);
93 snc.nodeparam{ind}.actualhitprob(k) = TNcache(isf,h)/sum(TNcache(isf,[h,m]));
94 snc.nodeparam{ind}.actualmissprob(k) = TNcache(isf,m)/sum(TNcache(isf,[h,m]));
101QN = cellsum(QN)/nLabs;
102UN = cellsum(UN)/nLabs;
103RN = cellsum(RN)/nLabs;
104TN = cellsum(TN)/nLabs;
105CN = cellsum(CN)/nLabs;
106XN = cellsum(XN)/nLabs;
109 for isf=1:sn.nstateful
110 if sn.nodetype(isf) == NodeType.Cache
111 ind = sn.statefulToNode(isf);
112 sn.nodeparam{ind}.actualhitprob(k) = 0;
113 sn.nodeparam{ind}.actualmissprob(k) = 0;
116 if length(qntmp.nodeparam{ind}.hitclass)>=k
117 sn.nodeparam{ind}.actualhitprob(k) = sn.nodeparam{ind}.actualhitprob(k) + (1/nLabs) * qntmp.nodeparam{ind}.actualhitprob(k);
118 sn.nodeparam{ind}.actualmissprob(k) = sn.nodeparam{ind}.actualmissprob(k) + (1/nLabs) * qntmp.nodeparam{ind}.actualmissprob(k);