1% Sojourn time distribution
for multiserver FCFS
nodes (McKenna 1987).
2function
RD = pfqn_stdf(L,N,Z,S,fcfsNodes,rates,tset)
3stabilityWarnIssued =
false;
13% when t==0 the hkc function
is not well defined
14tset(tset == 0) = GlobalConstants.FineTol;
17 if range(rates(k,:))>GlobalConstants.FineTol
18 line_error(mfilename,'The FCFS stations has distinct service rates, the model
is invalid.
');
20 hMAP = cell(1,1+sum(N));
23 hMAP{1+n} = map_exponential(1/rates(k,1));
25 hMAP{1+n} = map_sumind({map_exponential(1/rates(k,1)), map_erlang((n-S(k)+1)/(S(k)*rates(k,1)),n-S(k)+1)});
27 hkc(1:T,1+n) = map_cdf(hMAP{1+n}, tset)';
31 if L(k,r) > GlobalConstants.FineTol
34 options = SolverNC.defaultOptions;
35 [~,lGr] = pfqn_comomrm_ld(L,Nr,Z,mu,options);
38 [~,~,~,~,lGr,isNumStable] = pfqn_mvald(L,Nr,Z,mu);
41 if ~isNumStable && ~stabilityWarnIssued
42 stabilityWarnIssued =
true;
43 line_warning(mfilename,
'The computation of the sojourn time distribution is numerically unstable.\n');
45 RD{k,r} = zeros(length(tset),2);
46 RD{k,r}(:,2) = tset(:);
48 %%
this is the original code in the paper
52 % [~,~,~,~,lGk,isNumStable] = pfqn_mvald(L(setdiff(1:M,k),:),Nr-nvec,Z,mu(setdiff(1:M,k),:));
54 %
if ~isNumStable && ~stabilityWarnIssued
55 % stabilityWarnIssued =
true;
56 % line_warning(mfilename,
'The computation of the sojourn time distribution is numerically unstable');
60 % Gkrt(t) = Gkrt(t) + hkc(t,1+0) * exp(lGk);
62 % lFk = nvec*log(L(k,:))
' +factln(sum(nvec)) - sum(factln(nvec)) - sum(log(mu(k,1:sum(nvec))));
63 % Gkrt(t) = Gkrt(t) + hkc(t,1+sum(nvec)) * exp(lFk + lGk);
66 % nvec = pprod(nvec, Nr);
69 % RD{k,r}(1:T,1) = exp(lGkrt - lGr);
71 %% this is faster as it uses the recursive form for LD models
74 options = SolverNC.defaultOptions;
75 [~,lGk] = pfqn_comomrm_ld(L(setdiff(1:M,k),:),Nr,Z,mu(setdiff(1:M,k),:),options);
77 [~,~,~,~,lGk] = pfqn_mvald(L(setdiff(1:M,k),:),Nr,Z,mu(setdiff(1:M,k),:));
84 gammat(k,m) = mu(k,m) * hkc(t,1+m-1) / hkc(t,1+m);
86 gammak = mushift(gammat,k); gammak=gammak(:,1:(sum(Nr)-1));
87 Hkrt(t) = hkc(t,1+0) * exp(lGk); % nvec = 0
88 for s=1:R % nvec >= 1s
91 %lYks_t = pfqn_rd(L,oner(Nr,s),Z,gammak);
94 %lYks_t = pfqn_nrp(L,oner(Nr,s),Z,gammak);
96 options = SolverNC.defaultOptions;
97 [~,lYks_t] = pfqn_comomrm_ld(L,oner(Nr,s),Z,gammak,options);
99 [~,~,~,~,lYks_t] = pfqn_mvald(L,oner(Nr,s),Z,gammak);
101 lYks_t = lYks_t(end);
105 Hkrt(t) = Hkrt(t) + (L(k,s) * hkc(t,1+0) / gammat(k,1)) * exp(lYks_t); % nvec = 0
109 Hkrt(isnan(Hkrt)) = GlobalConstants.FineTol;
112 RD{k,r}(1:T,1) = min(1,exp(lHkrt - lGr));
124 A = A + x^j/factorial(j);
130function mushifted = mushift(mu,i)
131% shifts the service rate vector
135 mushifted(m,1:(N-1))=mu(m,2:N);
137 mushifted(m,1:(N-1))=mu(m,1:(N-1));