1function [Q,U,R,T,C,X,lG,totiter] = solver_mna_open(sn, options)
3config = options.config;
9scv = sn.scv; scv(isnan(scv))=0;
15V = cellsum(sn.visits);
33 case {SchedStrategy.FCFS, SchedStrategy.INF,SchedStrategy.PS}
35 pie{ist}{k} = map_pie(PH{ist}{k});
36 D0{ist,k} = PH{ist}{k}{1};
37 if any(isnan(D0{ist,k}))
38 D0{ist,k} = -GlobalConstants.Immediate;
40 PH{ist}{k} = map_exponential(GlobalConstants.Immediate);
54 if sn.nodetype(sn.stationToNode(jst)) ~= NodeType.Source
57 if rt((ist-1)*K+r, (jst-1)*K+s)>0
58 f2((ist-1)*K+r, (jst-1)*K+s) = 1; % C^2ij,r
65lambdas_inchain = cell(1,C);
66scvs_inchain = cell(1,C);
69 inchain = sn.inchain{c};
70 sourceIdx = sn.refstat(inchain(1));
71 lambdas_inchain{c} = sn.rates(sourceIdx,inchain);
72 scvs_inchain{c} = scv(sourceIdx,inchain);
73 lambda(c) = sum(lambdas_inchain{c}(isfinite(lambdas_inchain{c})));
74 d2c(c) = qna_superpos(lambdas_inchain{c},scvs_inchain{c});
75 T(sourceIdx,inchain
') = lambdas_inchain{c};
78d2(sourceIdx)=d2c(sourceIdx,:)*lambda'/sum(lambda);
82while (max(max(abs(a1_1-a1))) > options.iter_tol || max(max(abs(a2_1-a2))) > options.iter_tol )&& it <= options.iter_max %#ok<max>
87 % update throughputs at all stations
90 inchain = sn.inchain{c};
92 T(m,inchain) = V(m,inchain) .* lambda(c);
101 lambda_i = sum(T(ist,:));
105 a1(ist,r) = a1(ist,r) + T(jst,s)*rt((jst-1)*K+s, (ist-1)*K+r);
106 a2(ist,r) = a2(ist,r) + (1/lambda_i) * f2((jst-1)*K+s, (ist-1)*K+r)*T(jst,s)*rt((jst-1)*K+s, (ist-1)*K+r);
112 % update flow trhough queueing station
115 ist = sn.nodeToStation(ind);
118 case SchedStrategy.INF
121 d2(ist,s) = a2(ist,s);
125 inchain = sn.inchain{c};
127 T(ist,k) = a1(ist,k);
128 U(ist,k) = S(ist,k)*T(ist,k);
129 Q(ist,k) = T(ist,k).*S(ist,k)*V(ist,k);
130 R(ist,k) = Q(ist,k)/T(ist,k);
133 case SchedStrategy.PS
135 inchain = sn.inchain{c};
137 TN(ist,k) = lambda(c)*V(ist,k);
138 UN(ist,k) = S(ist,k)*TN(ist,k);
140 %Nc = sum(sn.njobs(inchain)); % closed population
141 Uden = min([1-GlobalConstants.FineTol,sum(UN(ist,:))]);
143 %QN(ist,k) = (UN(ist,k)-UN(ist,k)^(Nc+1))/(1-Uden); % geometric bound type approximation
144 QN(ist,k) = UN(ist,k)/(1-Uden);
145 RN(ist,k) = QN(ist,k)/TN(ist,k);
148 case {SchedStrategy.FCFS}
149 mu_ist = sn.rates(ist,1:K);
150 mu_ist(isnan(mu_ist))=0;
151 rho_ist_class = a1(ist,1:K)./(GlobalConstants.FineTol+sn.rates(ist,1:K));
152 rho_ist_class(isnan(rho_ist_class))=0;
153 lambda_ist = sum(a1(ist,:));
154 mi = sn.nservers(ist);
155 rho_ist = sum(rho_ist_class) / mi;
156 if rho_ist < 1-options.tol
159 mubar(ist) = lambda_ist ./ rho_ist;
163 c2(ist) = c2(ist) + a1(ist,r)/lambda_ist * (mubar(ist)/mi/mu_ist(r))^2 * (scv(ist,r)+1 );
167 d2(ist) = 1 + rho_ist^2*(c2(ist)-1)/sqrt(mi) + (1 - rho_ist^2) *(sum(a2(ist,:))-1);
170 Q(ist,k) = sn.njobs(k);
175 T(ist,k) = a1(ist,k);
176 U(ist,k) = T(ist,k) * S(ist,k) /sn.nservers(ist);
182 switch sn.nodetype(ind)
184 line_error(mfilename,
'Fork nodes not supported yet by QNA solver.');
190 % splitting - update flow scvs
193 if sn.nodetype(sn.stationToNode(jst)) ~= NodeType.Source
196 if rt((ist-1)*K+r, (jst-1)*K+s)>0
197 f2((ist-1)*K+r, (jst-1)*K+s) = 1 + rt((ist-1)*K+r, (jst-1)*K+s) * (d2(ist)-1);
209 ist = sn.nodeToStation(ind);
211 case {SchedStrategy.FCFS}
212 mu_ist = sn.rates(ist,1:K);
213 mu_ist(isnan(mu_ist))=0;
214 rho_ist_class = a1(ist,1:K)./(GlobalConstants.FineTol+sn.rates(ist,1:K));
215 rho_ist_class(isnan(rho_ist_class))=0;
216 lambda_ist = sum(a1(ist,:));
217 mi = sn.nservers(ist);
218 rho_ist = sum(rho_ist_class) / mi;
219 if rho_ist < 1-options.tol
222 arri_class = map_exponential(Inf);
224 arri_class = APH.fitMeanAndSCV(1/a1(ist,k),a2(ist,k)).getProcess; %
MMAP repres of arrival process
for class k at node ist
225 %arri_class = Erlang.fit(1/a1(ist,k),a2(ist,k)).getProcess;
226 %arri_class = map_exponential(1/a1(ist,k));
227 arri_class = {arri_class{1},arri_class{2},arri_class{2}};
230 arri_node = arri_class;
232 arri_node = mmap_super(arri_node,arri_class,
'default');
234 %arri_node = mmap_super_safe({arri_node,arri_class}, config.space_max,
'default'); % combine arrival process from different
class
238 [Qret{1:K}] = MMAPPH1FCFS({arri_node{[1,3:end]}}, {pie{ist}{:}}, {D0{ist,:}},
'ncMoms', 1);
239 Q(ist,:) = cell2mat(Qret);
242 Q(ist,k) = sn.njobs(k);
246 R(ist,k) = Q(ist,k) ./ T(ist,k);
265function [d2]=qna_superpos(lambda,a2)
266a2 = a2(isfinite(lambda));
267lambda = lambda(isfinite(lambda));
268d2 = a2(:)
'*lambda(:) / sum(lambda);