LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solver_mna_closed.m
1function [Q,U,R,T,C,X,lG,totiter] = solver_mna_closed(sn, options)
2
3config = options.config;
4config.space_max = 16;
5
6K = sn.nclasses;
7rt = sn.rt;
8S = 1./sn.rates;
9scv = sn.scv; scv(isnan(scv))=0;
10N = sn.njobs';
11PH = sn.proc;
12I = sn.nnodes;
13M = sn.nstations;
14C = sn.nchains;
15V = cellsum(sn.visits);
16Q = zeros(M,K);
17
18
19U = zeros(M,K);
20R = zeros(M,K);
21T = zeros(M,K);
22X = zeros(1,K);
23
24lambda = zeros(1,C);
25
26
27pie = {};
28D0 = {};
29% get service process
30for ist=1:M
31 switch sn.sched(ist)
32 case {SchedStrategy.FCFS, SchedStrategy.INF,SchedStrategy.PS}
33 for k=1:K
34 pie{ist}{k} = map_pie(PH{ist}{k});
35 D0{ist,k} = PH{ist}{k}{1};
36 if any(isnan(D0{ist,k}))
37 D0{ist,k} = -GlobalConstants.Immediate;
38 pie{ist}{k} = 1;
39 PH{ist}{k} = map_exponential(GlobalConstants.Immediate);
40 end
41 end
42 end
43end
44
45QNc = sn.njobs;
46lambda_lb = zeros(1,K);
47lambda_ub = zeros(1,K);
48for k=1:K
49 lambda_ub(k) = min(sn.rates(find(sn.nservers<Inf),k));
50end
51
52QN = zeros(1,K);
53it_out = 0;
54
55%% main iteration
56while max(abs(QN-QNc))>options.iter_tol && it_out < options.iter_max
57 it_out = it_out+1;
58
59 if it_out ~=1
60 for k=1:K
61 if QN(k) < QNc(k)
62 lambda_lb(k) = lambda(k);
63 else
64 lambda_ub(k) = lambda(k);
65 end
66 lambda(k) = (lambda_ub(k) + lambda_lb(k)) / 2;
67 end
68 else
69 lambda = lambda_ub;
70 end
71 it =0;
72 Q = zeros(M,K);
73
74
75 U = zeros(M,K);
76 R = zeros(M,K);
77 T = zeros(M,K);
78 X = zeros(1,K);
79
80 a1 = zeros(M,K);
81 a2 = zeros(M,K);
82 a1_1 = a1+Inf;
83 a2_1 = a2+Inf;
84
85 d2 = zeros(M,1);
86 f2 = zeros(M*K,M*K);
87 for ist=1:M
88 for jst=1:M
89 if sn.nodetype(sn.stationToNode(jst)) ~= NodeType.Source
90 for r=1:K
91 for s=1:K
92 if rt((ist-1)*K+r, (jst-1)*K+s)>0
93 f2((ist-1)*K+r, (jst-1)*K+s) = 1; % C^2ij,r
94 end
95 end
96 end
97 end
98 end
99 end
100
101 while (max(max(abs(a1_1-a1))) > options.iter_tol || max(max(abs(a2_1-a2))) > options.iter_tol )&& it <= options.iter_max %#ok<max>
102 it = it + 1;
103 for c=1:C
104 inchain = sn.inchain{c};
105 Q(:,c) = sn.njobs(c) .* Q(:,c) / sum(Q(:,c));
106 end
107 Q_1 = Q;
108
109 for k=1:K
110 if sn.isslc(k)
111 Q(:,k) = 0;
112 Q(sn.refstat(k),k) = sn.njobs(k);
113 end
114 end
115
116 a1_1 = a1;
117 a2_1 = a2;
118
119
120 % update throughputs at all stations
121 if it==1
122 for c=1:C
123 inchain = sn.inchain{c};
124 for m=1:M
125 T(m,inchain) = V(m,inchain) .* lambda(c);
126 end
127 end
128 end
129
130 % superposition
131 for ist=1:M
132 a1(ist,:) = 0;
133 a2(ist,:) = 0;
134 lambda_i = sum(T(ist,:));
135 for jst=1:M
136 for r=1:K
137 for s=1:K
138 a1(ist,r) = a1(ist,r) + T(jst,s)*rt((jst-1)*K+s, (ist-1)*K+r);
139 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);
140 end
141 end
142 end
143 end
144
145 % update flow trhough queueing station
146 for ind=1:I
147 if sn.isstation(ind)
148 ist = sn.nodeToStation(ind);
149 switch sn.nodetype(ind)
150 case NodeType.Join
151 % no-op
152
153 otherwise
154 switch sn.sched(ist)
155 case SchedStrategy.INF
156 for r=1:K
157 for s=1:K
158 d2(ist,s) = a2(ist,s);
159 end
160 end
161 for c=1:C
162 inchain = sn.inchain{c};
163 for k=inchain
164 T(ist,k) = a1(ist,k);
165 U(ist,k) = S(ist,k)*T(ist,k);
166 Q(ist,k) = T(ist,k).*S(ist,k)*V(ist,k);
167 R(ist,k) = Q(ist,k)/T(ist,k);
168 end
169 end
170 case SchedStrategy.PS
171 for c=1:C
172 inchain = sn.inchain{c};
173 for k=inchain
174 T(ist,k) = lambda(c)*V(ist,k);
175 U(ist,k) = S(ist,k)*T(ist,k);
176 end
177 %Nc = sum(sn.njobs(inchain)); % closed population
178 Uden = min([1-GlobalConstants.FineTol,sum(U(ist,:))]);
179 for k=inchain
180 Q(ist,k) = (U(ist,k)-U(ist,k)^(sum(sn.njobs(inchain))+1))/(1-Uden); % geometric bound type approximation
181 %Q(ist,k) = UN(ist,k)/(1-Uden);
182 R(ist,k) = Q(ist,k)/T(ist,k);
183 end
184 end
185 case {SchedStrategy.FCFS}
186 mu_ist = sn.rates(ist,1:K);
187 mu_ist(isnan(mu_ist))=0;
188 rho_ist_class = a1(ist,1:K)./(GlobalConstants.FineTol+sn.rates(ist,1:K));
189 rho_ist_class(isnan(rho_ist_class))=0;
190 lambda_ist = sum(a1(ist,:));
191 mi = sn.nservers(ist);
192 rho_ist = sum(rho_ist_class) / mi;
193 if rho_ist < 1-options.tol
194
195 for k=1:K
196 mubar(ist) = lambda_ist ./ rho_ist;
197 c2(ist) = -1;
198 for r=1:K
199 if mu_ist(r)>0
200 c2(ist) = c2(ist) + a1(ist,r)/lambda_ist * (mubar(ist)/mi/mu_ist(r))^2 * (scv(ist,r)+1 );
201 end
202 end
203 end
204
205 d2(ist) = 1 + rho_ist^2*(c2(ist)-1)/sqrt(mi) + (1 - rho_ist^2) *(sum(a2(ist,:))-1);
206 else
207 for k=1:K
208 Q(ist,k) = sn.njobs(k);
209 end
210 d2(ist) = 1;
211 end
212 for k=1:K
213 T(ist,k) = a1(ist,k);
214 U(ist,k) = T(ist,k) * S(ist,k) /sn.nservers(ist);
215 R(ist,k) = Q(ist,k) ./ T(ist,k);
216 end
217
218 end
219 end
220 else % not a station
221 switch sn.nodetype(ind)
222 case NodeType.Fork
223 line_error(mfilename,'Fork nodes not supported yet by QNA solver.');
224 end
225 end
226 end
227
228
229 % splitting - update flow scvs
230 for ist=1:M
231 for jst=1:M
232 if sn.nodetype(sn.stationToNode(jst)) ~= NodeType.Source
233 for r=1:K
234 for s=1:K
235 if rt((ist-1)*K+r, (jst-1)*K+s)>0
236 f2((ist-1)*K+r, (jst-1)*K+s) = 1 + rt((ist-1)*K+r, (jst-1)*K+s) * (d2(ist)-1);
237 end
238 end
239 end
240 end
241 end
242 end
243 end
244
245 for ind=1:I
246 if sn.isstation(ind)
247 ist = sn.nodeToStation(ind);
248 switch sn.sched(ist)
249 case {SchedStrategy.FCFS}
250 mu_ist = sn.rates(ist,1:K);
251 mu_ist(isnan(mu_ist))=0;
252 rho_ist_class = a1(ist,1:K)./(GlobalConstants.FineTol+sn.rates(ist,1:K));
253 rho_ist_class(isnan(rho_ist_class))=0;
254 lambda_ist = sum(a1(ist,:));
255 mi = sn.nservers(ist);
256 rho_ist = sum(rho_ist_class) / mi;
257 if rho_ist < 1-options.tol
258 for k=1:K
259
260 if a1(ist,k)==0
261 arri_class = map_exponential(Inf);
262 else
263 arri_class = APH.fitMeanAndSCV(1/a1(ist,k),a2(ist,k)).getProcess; % MMAP repres of arrival process for class k at node ist
264 %arri_class = map_exponential(1/a1(ist,k));
265 arri_class = {arri_class{1},arri_class{2},arri_class{2}};
266 end
267 if k==1
268 arri_node = arri_class;
269 else
270 %arri_node = mmap_super(arri_node,arri_class, 'default');
271
272 arri_node = mmap_super_safe({arri_node,arri_class}, config.space_max, 'default'); % combine arrival process from different class
273 end
274
275 end
276 Qret = cell(1,K);
277 maxLevel = sum(N(isfinite(N)))+1;
278 D = {arri_node{[1,3:end]}};
279 pdistr = cell(1,K);
280 if map_lambda(D)< GlobalConstants.FineTol
281 for k=1:K
282 pdistr = [1-GlobalConstants.FineTol, GlobalConstants.FineTol];
283 Qret{k} = GlobalConstants.FineTol / sn.rates(ist);
284 end
285 else
286 [pdistr] = MMAPPH1FCFS(D, {pie{ist}{:}}, {D0{ist,:}}, 'ncDistr', maxLevel);
287 % rough approximation
288 for k=1:K
289 pdistr_k = abs(pdistr(1:(N(k)+1)));
290 pdistr_k(end) = abs(1-sum(pdistr(1:end-1)));
291 pdistr_k = pdistr_k / sum(pdistr_k(1:(N(k)+1)));
292 Qret{k} = max(0,min(N(k),(0:N(k))*pdistr_k(1:(N(k)+1))'));
293 end
294
295 end
296 Q(ist,:) = cell2mat(Qret);
297 else
298 for k=1:K
299 Q(ist,k) = sn.njobs(k);
300 end
301 end
302
303 for k=1:K
304 R(ist,k) = Q(ist,k) ./ T(ist,k);
305 end
306 end
307 end
308 end
309 QN = sum(Q,1);
310end
311
312for k=1:K
313 if sn.isslc(k)
314 Q(:,k) = 0;
315 ist = sn.refstat(k);
316 Q(ist,k) = sn.njobs(k);
317 T(ist,k) = sn.njobs(k)*sn.rates(ist,k);
318 R(ist,k) = Q(ist,k) ./ T(ist,k);
319 U(ist,k) = S(ist,k)*T(ist,k);
320 end
321end
322
323for c=1:C
324 inchain = sn.inchain{c};
325 if isfinite(sn.njobs(c))
326 Q(:,c) = sn.njobs(c) .* Q(:,c) / sum(Q(:,c));
327 end
328end
329for ist=1:sn.nstations
330 switch sn.sched(ist)
331 case SchedStrategy.INF
332 U(ist,:) = Q(ist,:);
333 end
334end
335
336%it_out
337C = sum(R,1);
338Q = abs(Q);
339Q(isnan(Q))=0;
340U(isnan(U))=0;
341R(isnan(R))=0;
342C(isnan(C))=0;
343X(isnan(X))=0;
344lG = 0;
345totiter = it_out;
346end
Definition mmt.m:124