LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
MMAPPH1NPPR.m
1% Ret = MMAPPH1NPPR(D, sigma, S, ...)
2%
3% Returns various performane measures of a continuous time
4% MMAP[K]/PH[K]/1 non-preemptive priority queue, see [1]_.
5%
6% Parameters
7% ----------
8% D : list of matrices of shape (N,N), length (K+1)
9% The D0...DK matrices of the arrival process.
10% D1 corresponds to the lowest, DK to the highest priority.
11% sigma : list of row vectors, length (K)
12% The list containing the initial probability vectors of the service
13% time distributions of the various customer types. The length of the
14% vectors does not have to be the same.
15% S : list of square matrices, length (K)
16% The transient generators of the phase type distributions representing
17% the service time of the jobs belonging to various types.
18% further parameters :
19% The rest of the function parameters specify the options
20% and the performance measures to be computed.
21%
22% The supported performance measures and options in this
23% function are:
24%
25% +----------------+--------------------+----------------------------------------+
26% | Parameter name | Input parameters | Output |
27% +================+====================+========================================+
28% | "ncMoms" | Number of moments | The moments of the number of customers |
29% +----------------+--------------------+----------------------------------------+
30% | "ncDistr" | Upper limit K | The distribution of the number of |
31% | | | customers from level 0 to level K-1 |
32% +----------------+--------------------+----------------------------------------+
33% | "stMoms" | Number of moments | The sojourn time moments |
34% +----------------+--------------------+----------------------------------------+
35% | "stDistr" | A vector of points | The sojourn time distribution at the |
36% | | | requested points (cummulative, cdf) |
37% +----------------+--------------------+----------------------------------------+
38% | "prec" | The precision | Numerical precision used as a stopping |
39% | | | condition when solving the Riccati and |
40% | | | the matrix-quadratic equations |
41% +----------------+--------------------+----------------------------------------+
42% | "erlMaxOrder" | Integer number | The maximal Erlang order used in the |
43% | | | erlangization procedure. The default |
44% | | | value is 200. |
45% +----------------+--------------------+----------------------------------------+
46% | "classes" | Vector of integers | Only the performance measures |
47% | | | belonging to these classes are |
48% | | | returned. If not given, all classes |
49% | | | are analyzed. |
50% +----------------+--------------------+----------------------------------------+
51%
52% (The quantities related to the number of customers in
53% the system include the customer in the server, and the
54% sojourn time related quantities include the service
55% times as well)
56%
57% Returns
58% -------
59% Ret : list of the performance measures
60% Each entry of the list corresponds to a performance
61% measure requested. Each entry is a matrix, where the
62% columns belong to the various job types.
63% If there is just a single item,
64% then it is not put into a list.
65%
66% References
67% ----------
68% .. [1] G. Horvath, "Efficient analysis of the MMAP[K]/PH[K]/1
69% priority queue", European Journal of Operational
70% Research, 246(1), 128-139, 2015.
71
72function varargout = MMAPPH1NPPR(D, sigma, S, varargin)
73
74 K = length(D)-1;
75
76 % parse options
77 erlMaxOrder = 200;
78 precision = 1e-14;
79 classes = 1:K;
80 eaten = [];
81 for i=1:length(varargin)
82 if strcmp(varargin{i},'erlMaxOrder')
83 erlMaxOrder = varargin{i+1};
84 eaten = [eaten, i, i+1];
85 elseif strcmp(varargin{i},'prec')
86 precision = varargin{i+1};
87 eaten = [eaten, i, i+1];
88 elseif strcmp(varargin{i},'classes')
89 classes = varargin{i+1};
90 eaten = [eaten, i, i+1];
91 end
92 end
93
94 global BuToolsCheckInput;
95
96 if isempty(BuToolsCheckInput)
97 BuToolsCheckInput = true;
98 end
99
100 if BuToolsCheckInput && ~CheckMMAPRepresentation(D)
101 error('MMAPPH1PRPR: The arrival process is not a valid MMAP representation!');
102 end
103
104 if BuToolsCheckInput
105 for k=1:K
106 if ~CheckPHRepresentation(sigma{k},S{k})
107 error('MMAPPH1PRPR: the vector and matrix describing the service times is not a valid PH representation!');
108 end
109 end
110 end
111
112 % some preparation
113 D0 = D{1};
114 N = size(D0,1);
115 I = eye(N);
116 sD = zeros(N);
117 for i=1:K+1
118 sD = sD + D{i};
119 end
120
121 s = cell(length(S));
122 M = zeros(1,K);
123 for i=1:K
124 s{i} = sum(-S{i},2);
125 M(i) = M(i) + length(sigma{i});
126 end
127
128 % step 1. solution of the workload process of the joint queue
129 % ===========================================================
130 Qwmm = D0;
131 Qwpp = zeros(N*sum(M));
132 Qwmp = zeros(N,N*sum(M));
133 Qwpm = zeros(N*sum(M),N);
134 kix = 1;
135 for i=1:K
136 bs = N*M(i);
137 Qwpp(kix:kix+bs-1,kix:kix+bs-1) = kron(eye(N),S{i});
138 Qwmp(:,kix:kix+bs-1) = kron(D{i+1},sigma{i});
139 Qwpm(kix:kix+bs-1,:) = kron(eye(N),s{i});
140 kix = kix + bs;
141 end
142
143 % calculate fundamental matrices
144 [Psiw, Kw, Uw] = FluidFundamentalMatrices (Qwpp, Qwpm, Qwmp, Qwmm, 'PKU', precision);
145
146 % calculate boundary vector
147 Ua = ones(N,1) + 2*sum(Qwmp*inv(-Kw),2);
148 pm = linsolve ([Uw,Ua]', [zeros(1,N),1]')';
149
150 ro = ((1-sum(pm))/2)/(sum(pm)+(1-sum(pm))/2); % calc idle time with weight=1, and the busy time with weight=1/2
151 kappa = pm/sum(pm);
152
153 pi = CTMCSolve (sD);
154 lambda = zeros(K,1);
155 for i=1:K
156 lambda(i) = sum(pi*D{i+1});
157 end
158
159 Psiw = {};
160 Qwmp = {}; Qwzp = {}; Qwpp = {};
161 Qwmz = {}; Qwpz = {}; Qwzz = {};
162 Qwmm = {}; Qwpm = {}; Qwzm = {};
163 for k=1:K
164 % step 2. construct a workload process for classes k...K
165 % ======================================================
166 Mlo = sum(M(1:k-1));
167 Mhi = sum(M(k:K));
168
169 Qkwpp = zeros(N*Mlo*Mhi+N*Mhi);
170 Qkwpz = zeros(N*Mlo*Mhi+N*Mhi, N*Mlo);
171 Qkwpm = zeros(N*Mlo*Mhi+N*Mhi, N);
172 Qkwmz = zeros(N, N*Mlo);
173 Qkwmp = zeros(N, N*Mlo*Mhi+N*Mhi);
174 Dlo = D0;
175 for i=1:k-1
176 Dlo = Dlo + D{i+1};
177 end
178 Qkwmm = Dlo;
179 Qkwzp = zeros(N*Mlo, N*Mlo*Mhi+N*Mhi);
180 Qkwzm = zeros(N*Mlo, N);
181 Qkwzz = zeros(N*Mlo);
182 kix = 1;
183 for i=k:K
184 kix2 = 1;
185 for j=1:k-1
186 bs = N*M(j)*M(i);
187 bs2 = N*M(j);
188 Qkwpp(kix:kix+bs-1,kix:kix+bs-1) = kron(eye(N),kron(eye(M(j)),S{i}));
189 Qkwpz(kix:kix+bs-1,kix2:kix2+bs2-1) = kron(eye(N),kron(eye(M(j)),s{i}));
190 Qkwzp(kix2:kix2+bs2-1,kix:kix+bs-1) = kron(D{i+1},kron(eye(M(j)), sigma{i}));
191 kix = kix + bs;
192 kix2 = kix2 + bs2;
193 end
194 end
195 for i=k:K
196 bs = N*M(i);
197 Qkwpp(kix:kix+bs-1,kix:kix+bs-1) = kron(eye(N),S{i});
198 Qkwpm(kix:kix+bs-1,:) = kron(eye(N),s{i});
199 Qkwmp(:,kix:kix+bs-1) = kron(D{i+1},sigma{i});
200 kix = kix + bs;
201 end
202 kix = 1;
203 for j=1:k-1
204 bs = N*M(j);
205 Qkwzz(kix:kix+bs-1,kix:kix+bs-1) = kron(Dlo, eye(M(j))) + kron(eye(N), S{j});
206 Qkwzm(kix:kix+bs-1,:) = kron(eye(N), s{j});
207 kix = kix + bs;
208 end
209
210 Psikw = FluidFundamentalMatrices (Qkwpp+Qkwpz*inv(-Qkwzz)*Qkwzp, Qkwpm+Qkwpz*inv(-Qkwzz)*Qkwzm, Qkwmp, Qkwmm, 'P', precision);
211 Psiw{k} = Psikw;
212
213 Qwzp{k} = Qkwzp; Qwmp{k} = Qkwmp; Qwpp{k} = Qkwpp;
214 Qwmz{k} = Qkwmz; Qwpz{k} = Qkwpz; Qwzz{k} = Qkwzz;
215 Qwmm{k} = Qkwmm; Qwpm{k} = Qkwpm; Qwzm{k} = Qkwzm;
216 end
217
218 % step 3. calculate Phi vectors
219 % =============================
220 lambdaS = sum(lambda);
221 phi{1} = (1-ro)*kappa*(-D0) / lambdaS;
222 q0{1} = [];
223 qL{1} = [];
224 for k=1:K-1
225 sDk = D{1};
226 for j=1:k
227 sDk = sDk + D{j+1};
228 end
229 % pk
230 pk(k) = sum(lambda(1:k))/lambdaS - (1-ro)*kappa*sum(sDk,2)/lambdaS;
231 % A^(k,1)
232 Qwzpk = Qwzp{k+1};
233 vix = 1;
234 for ii=1:k
235 bs = N*M(ii);
236 V1 = Qwzpk(vix:vix+bs-1,:);
237 Ak{ii} = kron(I,sigma{ii}) * inv(-kron(sDk,eye(M(ii)))-kron(I,S{ii})) * (kron(I,s{ii}) + V1*Psiw{k+1});
238 vix = vix+ bs;
239 end
240 % B^k
241 Qwmpk = Qwmp{k+1};
242 Bk = Qwmpk * Psiw{k+1};
243 ztag = phi{1}*(inv(-D0)*D{k+1}*Ak{k} - Ak{1} + inv(-D0)*Bk);
244 for i=1:k-1
245 ztag = ztag + phi{i+1}*(Ak{i}-Ak{i+1}) + phi{1}*inv(-D0)*D{i+1}*Ak{i};
246 end
247 Mx = eye(size(Ak{k}))-Ak{k};
248 Mx(:,1) = ones(N,1);
249 phi{k+1} = [pk(k), ztag(2:end)]*inv(Mx); % phi(k) = Psi^(k)_k * p(k). Psi^(k)_i = phi(i) / p(k)
250
251 q0{k+1} = phi{1}*inv(-D0);
252 qL{k+1} = [];
253 for ii=1:k
254 qLii = (phi{ii+1} - phi{ii} + phi{1}*inv(-D0)*D{ii+1}) * kron(I,sigma{ii}) * inv(-kron(sDk,eye(M(ii)))-kron(I,S{ii}));
255 qL{k+1} = [qL{k+1}, qLii];
256 end
257 end
258
259 % step 4. calculate performance measures
260 % ======================================
261 Ret = {};
262 for k=classes
263 sD0k = D0;
264 for i=1:k-1
265 sD0k = sD0k + D{i+1};
266 end
267 if k<K
268 % step 4.1 calculate distribution of the workload process right
269 % before the arrivals of class k jobs
270 % ============================================================
271 Kw = Qwpp{k}+Qwpz{k}*inv(-Qwzz{k})*Qwzp{k} + Psiw{k}*Qwmp{k};
272 BM = []; CM = []; DM = [];
273 for i=1:k-1
274 BM = blkdiag(BM,kron(I,S{i}));
275 CM = [CM; kron(I,s{i})];
276 DM = blkdiag(DM,kron(D{k+1},eye(M(i))));
277 end
278 Kwu = [Kw, (Qwpz{k}+Psiw{k}*Qwmz{k})*inv(-Qwzz{k})*DM; zeros(size(BM,1),size(Kw,2)), BM];
279 Bwu = [Psiw{k}*D{k+1}; CM];
280 if k>1
281 iniw = [q0{k}*Qwmp{k}+qL{k}*Qwzp{k}, qL{k}*DM];
282 pwu = q0{k}*D{k+1};
283 else
284 iniw = pm*Qwmp{k};
285 pwu = pm*D{k+1};
286 end
287 norm = sum(pwu) + sum(iniw*inv(-Kwu)*Bwu);
288 pwu = pwu / norm;
289 iniw = iniw / norm;
290
291 % step 4.2 create the fluid model whose first passage time equals the
292 % WAITING time of the low prioroity customers
293 % ==================================================================
294 KN = size(Kwu,1);
295 Qspp = zeros(KN+N*sum(M(k+1:end)));
296 Qspm = zeros(KN+N*sum(M(k+1:end)), N);
297 Qsmp = zeros(N, KN+N*sum(M(k+1:end)));
298 Qsmm = sD0k + D{k+1};
299 kix = 1;
300 for i=k+1:K
301 bs = N*M(i);
302 Qspp(KN+kix:KN+kix+bs-1,KN+kix:KN+kix+bs-1) = kron(I,S{i});
303 Qspm(KN+kix:KN+kix+bs-1,:) = kron(I,s{i});
304 Qsmp(:,KN+kix:KN+kix+bs-1) = kron(D{i+1},sigma{i});
305 kix = kix + bs;
306 end
307 Qspp(1:KN,1:KN) = Kwu;
308 Qspm(1:KN,:) = Bwu;
309 inis = [iniw, zeros(1,N*sum(M(k+1:end)))];
310
311 % calculate fundamental matrix
312 Psis = FluidFundamentalMatrices (Qspp, Qspm, Qsmp, Qsmm, 'P', precision);
313
314 % step 4.3. calculate the performance measures
315 % ==========================================
316 argIx = 1;
317 while argIx<=length(varargin)
318 if any(ismember(eaten, argIx))
319 argIx = argIx + 1;
320 continue;
321 elseif strcmp(varargin{argIx},'stMoms')
322 % MOMENTS OF THE SOJOURN TIME
323 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~
324 numOfSTMoms = varargin{argIx+1};
325 % calculate waiting time moments
326 Pn = {Psis};
327 wtMoms = zeros(1,numOfSTMoms);
328 for n=1:numOfSTMoms
329 A = Qspp + Psis*Qsmp;
330 B = Qsmm + Qsmp*Psis;
331 C = -2*n*Pn{n};
332 bino = 1;
333 for i=1:n-1
334 bino = bino * (n-i+1) / i;
335 C = C + bino * Pn{i+1}*Qsmp*Pn{n-i+1};
336 end
337 P = lyap(A, B, C);
338 Pn{n+1} = P;
339 wtMoms(n) = sum(inis*P*(-1)^n) / 2^n;
340 end
341 % calculate RESPONSE time moments
342 Pnr = {sum(inis*Pn{1})*sigma{k}}; %{sigmaL};
343 rtMoms = zeros(1,numOfSTMoms);
344 for n=1:numOfSTMoms
345 P = n*Pnr{n}*inv(-S{k}) + (-1)^n*sum(inis*Pn{n+1})*sigma{k} / 2^n;
346 Pnr{n+1} = P;
347 rtMoms(n) = sum(P)+sum(pwu)*factorial(n)*sum(sigma{k}*inv(-S{k})^n);
348 end
349 Ret{end+1} = rtMoms;
350 argIx = argIx + 1;
351 elseif strcmp(varargin{argIx},'stDistr')
352 % DISTRIBUTION OF THE SOJOURN TIME
353 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
354 stCdfPoints = varargin{argIx+1};
355 res = [];
356 for t=stCdfPoints
357 L = erlMaxOrder;
358 lambdae = L/t/2;
359 Psie = FluidFundamentalMatrices (Qspp-lambdae*eye(size(Qspp)), Qspm, Qsmp, Qsmm-lambdae*eye(size(Qsmm)), 'P', precision);
360 Pn = {Psie};
361 pr = (sum(pwu) + sum(inis*Psie)) * (1-sum(sigma{k}*inv(eye(size(S{k}))-S{k}/2/lambdae)^L));
362 for n=1:L-1
363 A = Qspp + Psie*Qsmp - lambdae*eye(size(Qspp));
364 B = Qsmm + Qsmp*Psie - lambdae*eye(size(Qsmm));
365 C = 2*lambdae*Pn{n};
366 for i=1:n-1
367 C = C + Pn{i+1}*Qsmp*Pn{n-i+1};
368 end
369 P = lyap(A, B, C);
370 Pn{n+1} = P;
371 pr = pr + sum(inis*P) * (1-sum(sigma{k}*inv(eye(size(S{k}))-S{k}/2/lambdae)^(L-n)));
372 end
373 res = [res, pr];
374 end
375 Ret{end+1} = res;
376 argIx = argIx + 1;
377 elseif strcmp(varargin{argIx},'ncMoms') || strcmp(varargin{argIx},'ncDistr')
378 W = inv(-kron(sD-D{k+1},eye(M(k)))-kron(I,S{k}))*kron(D{k+1},eye(M(k)));
379 iW = inv(eye(size(W))-W);
380 w = kron(eye(N),sigma{k});
381 omega = inv(-kron(sD-D{k+1},eye(M(k)))-kron(I,S{k}))*kron(I,s{k});
382 if strcmp(varargin{argIx},'ncMoms')
383 % MOMENTS OF THE NUMBER OF JOBS
384 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
385 numOfQLMoms = varargin{argIx+1};
386 % calculate queue length moments at departures
387 Psii = {Psis};
388 QLDPn = {inis*Psii{1}*w*iW};
389 for n=1:numOfQLMoms
390 A = Qspp + Psis*Qsmp;
391 B = Qsmm + Qsmp*Psis;
392 C = n*Psii{n}*D{k+1};
393 bino = 1;
394 for i=1:n-1
395 bino = bino * (n-i+1) / i;
396 C = C + bino * Psii{i+1}*Qsmp*Psii{n-i+1};
397 end
398 P = lyap(A, B, C);
399 Psii{n+1} = P;
400 QLDPn{n+1} = n*QLDPn{n}*iW*W + inis*P*w*iW;
401 end
402 for n=0:numOfQLMoms
403 QLDPn{n+1} = (QLDPn{n+1} + pwu*w*iW^(n+1)*W^n)*omega;
404 end
405 % now calculate it at random time instance
406 QLPn = {pi};
407 qlMoms = zeros(1,numOfQLMoms);
408 iTerm = inv(ones(N,1)*pi - sD);
409 for n=1:numOfQLMoms
410 sumP = sum(QLDPn{n+1}) + n*(QLDPn{n} - QLPn{n}*D{k+1}/lambda(k))*iTerm*sum(D{k+1},2);
411 P = sumP*pi + n*(QLPn{n}*D{k+1} - QLDPn{n}*lambda(k))*iTerm;
412 QLPn{n+1} = P;
413 qlMoms(n) = sum(P);
414 end
415 qlMoms = MomsFromFactorialMoms(qlMoms);
416 Ret{end+1} = qlMoms;
417 argIx = argIx + 1;
418 elseif strcmp(varargin{argIx},'ncDistr')
419 % DISTRIBUTION OF THE NUMBER OF JOBS
420 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
421 numOfQLProbs = varargin{argIx+1};
422 Psid = FluidFundamentalMatrices (Qspp, Qspm, Qsmp, sD0k, 'P', precision);
423 Pn = {Psid};
424 XDn = inis*Psid*w;
425 dqlProbs = (XDn+pwu*w)*omega;
426 for n=1:numOfQLProbs-1
427 A = Qspp + Psid*Qsmp;
428 B = sD0k + Qsmp*Psid;
429 C = Pn{n}*D{k+1};
430 for i=1:n-1
431 C = C + Pn{i+1}*Qsmp*Pn{n-i+1};
432 end
433 P = lyap(A, B, C);
434 Pn{n+1} = P;
435 XDn = XDn*W + inis*P*w;
436 dqlProbs = [dqlProbs; (XDn+pwu*w*W^n)*omega];
437 end
438 iTerm = inv(-(sD-D{k+1}));
439 qlProbs = lambda(k)*dqlProbs(1,:)*iTerm;
440 for n=1:numOfQLProbs-1
441 P = (qlProbs(n,:)*D{k+1}+lambda(k)*(dqlProbs(n+1,:)-dqlProbs(n,:)))*iTerm;
442 qlProbs = [qlProbs; P];
443 end
444 Ret{end+1} = sum(qlProbs,2)';
445 argIx = argIx + 1;
446 end
447 else
448 error (['MMAPPH1NPPR: Unknown parameter ' varargin{argIx}])
449 end
450 argIx = argIx + 1;
451 end
452 elseif k==K
453 % step 3. calculate the performance measures
454 % ==========================================
455 retIx = 1;
456 argIx = 1;
457 while argIx<=length(varargin)
458 if any(ismember(eaten, argIx))
459 argIx = argIx + 1;
460 continue;
461 elseif strcmp(varargin{argIx},'stMoms') || strcmp(varargin{argIx},'stDistr')
462 Kw = Qwpp{k}+Qwpz{k}*inv(-Qwzz{k})*Qwzp{k} + Psiw{k}*Qwmp{k};
463 AM = []; BM = []; CM = []; DM = [];
464 for i=1:k-1
465 AM = blkdiag(AM, kron(ones(N,1),kron(eye(M(i)),s{k})));
466 BM = blkdiag(BM,S{i});
467 CM = [CM; s{i}];
468 DM = blkdiag(DM,kron(D{k+1},eye(M(i))));
469 end
470 Z = [Kw, [AM;zeros(N*M(k),size(AM,2))]; zeros(size(BM,1),size(Kw,2)), BM];
471 z = [zeros(size(AM,1),1); kron(ones(N,1),s{k}); CM];
472 iniw = [q0{k}*Qwmp{k}+qL{k}*Qwzp{k}, zeros(1,size(BM,1))];
473 zeta = iniw/sum(iniw*inv(-Z)*z);
474 if strcmp(varargin{argIx},'stMoms')
475 % MOMENTS OF THE SOJOURN TIME
476 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~
477 numOfSTMoms = varargin{argIx+1};
478 rtMomsH = zeros(1,numOfSTMoms);
479 for i=1:numOfSTMoms
480 rtMomsH(i) = factorial(i)*zeta*inv(-Z)^(i+1)*z;
481 end
482 Ret{end+1} = rtMomsH;
483 elseif strcmp(varargin{argIx},'stDistr')
484 % DISTRIBUTION OF THE SOJOURN TIME
485 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
486 stCdfPoints = varargin{argIx+1};
487 rtDistr = [];
488 for t=stCdfPoints
489 rtDistr = [rtDistr, zeta*inv(-Z)*(eye(size(Z))-expm(Z*t))*z];
490 end
491 Ret{end+1} = rtDistr;
492 end
493 argIx = argIx + 1;
494 elseif strcmp(varargin{argIx},'ncMoms') || strcmp(varargin{argIx},'ncDistr')
495 L = zeros(N*sum(M));
496 B = zeros(N*sum(M));
497 F = zeros(N*sum(M));
498 kix = 1;
499 for i=1:K
500 bs = N*M(i);
501 F(kix:kix+bs-1,kix:kix+bs-1) = kron(D{k+1},eye(M(i)));
502 L(kix:kix+bs-1,kix:kix+bs-1) = kron(sD0k,eye(M(i))) + kron(I,S{i});
503 if i<K
504 L(kix:kix+bs-1,N*sum(M(1:k-1))+1:end) = kron(I,s{i}*sigma{k});
505 else
506 B(kix:kix+bs-1,N*sum(M(1:k-1))+1:end) = kron(I,s{i}*sigma{k});
507 end
508 kix = kix + bs;
509 end
510 R = QBDFundamentalMatrices (B, L, F, 'R', precision);
511 p0 = [qL{k}, q0{k}*kron(I,sigma{k})];
512 p0 = p0/sum(p0*inv(eye(size(R))-R));
513 if strcmp(varargin{argIx},'ncMoms')
514 % MOMENTS OF THE NUMBER OF JOBS
515 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
516 numOfQLMoms = varargin{argIx+1};
517 qlMoms = zeros(1,numOfQLMoms);
518 for i=1:numOfQLMoms
519 qlMoms(i) = sum(factorial(i)*p0*R^i*inv(eye(size(R))-R)^(i+1));
520 end
521 Ret{end+1} = MomsFromFactorialMoms(qlMoms);
522 elseif strcmp(varargin{argIx},'ncDistr')
523 % DISTRIBUTION OF THE NUMBER OF JOBS
524 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
525 numOfQLProbs = varargin{argIx+1};
526 qlProbs = p0;
527 for i=1:numOfQLProbs-1
528 qlProbs = [qlProbs; p0*R^i];
529 end
530 Ret{end+1} = sum(qlProbs,2)';
531 end
532 argIx = argIx + 1;
533 else
534 error (['MMAPPH1NPPR: Unknown parameter ' varargin{argIx}])
535 end
536 argIx = argIx + 1;
537 end
538 end
539 end
540 varargout = Ret;
541end