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