LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_stdf.m
1% Sojourn time distribution for multiserver FCFS nodes (McKenna 1987).
2function RD = pfqn_stdf(L,N,Z,S,fcfsNodes,rates,tset)
3stabilityWarnIssued = false;
4[M,R]=size(L);
5T=length(tset);
6mu = zeros(M,sum(N));
7for k=1:M
8 for n=1:sum(N)
9 mu(k,n) = min(S(k),n);
10 end
11end
12
13% when t==0 the hkc function is not well defined
14tset(tset == 0) = GlobalConstants.FineTol;
15
16for k=fcfsNodes(:)'
17 if range(rates(k,:))>GlobalConstants.FineTol
18 line_error(mfilename,'The FCFS stations has distinct service rates, the model is invalid.');
19 end
20 hMAP = cell(1,1+sum(N));
21 for n=0:sum(N)
22 if n < S(k)
23 hMAP{1+n} = map_exponential(1/rates(k,1));
24 else
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)});
26 end
27 hkc(1:T,1+n) = map_cdf(hMAP{1+n}, tset)';
28 end
29
30 for r=1:R
31 if L(k,r) > GlobalConstants.FineTol
32 Nr = oner(N,r);
33 if size(L,1)==1
34 options = SolverNC.defaultOptions;
35 [~,lGr] = pfqn_comomrm_ld(L,Nr,Z,mu,options);
36 isNumStable = true;
37 else
38 [~,~,~,~,lGr,isNumStable] = pfqn_mvald(L,Nr,Z,mu);
39 end
40 lGr = lGr(end);
41 if ~isNumStable && ~stabilityWarnIssued
42 stabilityWarnIssued = true;
43 line_warning(mfilename,'The computation of the sojourn time distribution is numerically unstable.\n');
44 end
45 RD{k,r} = zeros(length(tset),2);
46 RD{k,r}(:,2) = tset(:);
47
48 %% this is the original code in the paper
49 % Gkrt = zeros(T,1);
50 % nvec = pprod(Nr);
51 % while nvec >= 0
52 % [~,~,~,~,lGk,isNumStable] = pfqn_mvald(L(setdiff(1:M,k),:),Nr-nvec,Z,mu(setdiff(1:M,k),:));
53 % lGk = lGk(end);
54 % if ~isNumStable && ~stabilityWarnIssued
55 % stabilityWarnIssued = true;
56 % line_warning(mfilename,'The computation of the sojourn time distribution is numerically unstable');
57 % end
58 % for t=1:T
59 % if sum(nvec)==0
60 % Gkrt(t) = Gkrt(t) + hkc(t,1+0) * exp(lGk);
61 % else
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);
64 % end
65 % end % nvec
66 % nvec = pprod(nvec, Nr);
67 % end
68 % lGkrt = log(Gkrt);
69 % RD{k,r}(1:T,1) = exp(lGkrt - lGr);
70
71 %% this is faster as it uses the recursive form for LD models
72 Hkrt = [];
73 if size(L,1)==1
74 options = SolverNC.defaultOptions;
75 [~,lGk] = pfqn_comomrm_ld(L(setdiff(1:M,k),:),Nr,Z,mu(setdiff(1:M,k),:),options);
76 else
77 [~,~,~,~,lGk] = pfqn_mvald(L(setdiff(1:M,k),:),Nr,Z,mu(setdiff(1:M,k),:));
78 end
79 lGk = lGk(end);
80 for t=1:T
81 %[t,T]
82 gammat = mu;
83 for m=1:sum(Nr)
84 gammat(k,m) = mu(k,m) * hkc(t,1+m-1) / hkc(t,1+m);
85 end
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
89 if Nr(s)>0
90 %gammak
91 %lYks_t = pfqn_rd(L,oner(Nr,s),Z,gammak);
92 %RD = lYks_t
93 %NRP
94 %lYks_t = pfqn_nrp(L,oner(Nr,s),Z,gammak);
95 if size(L,1)==1
96 options = SolverNC.defaultOptions;
97 [~,lYks_t] = pfqn_comomrm_ld(L,oner(Nr,s),Z,gammak,options);
98 else
99 [~,~,~,~,lYks_t] = pfqn_mvald(L,oner(Nr,s),Z,gammak);
100 end
101 lYks_t = lYks_t(end);
102 %if t==10
103 % %keyboard
104 %end
105 Hkrt(t) = Hkrt(t) + (L(k,s) * hkc(t,1+0) / gammat(k,1)) * exp(lYks_t); % nvec = 0
106 end
107 end
108 end
109 Hkrt(isnan(Hkrt)) = GlobalConstants.FineTol;
110 lHkrt = log(Hkrt);
111
112 RD{k,r}(1:T,1) = min(1,exp(lHkrt - lGr));
113 end
114 end
115end
116end
117
118function Fmx=Fm(m,x)
119if m==1
120 Fmx = 1-exp(-x);
121else
122 A = 0;
123 for j=0:(m-1)
124 A = A + x^j/factorial(j);
125 end
126 Fmx = 1-exp(-x)*A;
127end
128end
129
130function mushifted = mushift(mu,i)
131% shifts the service rate vector
132[M,N]=size(mu);
133for m=1:M
134 if m==i
135 mushifted(m,1:(N-1))=mu(m,2:N);
136 else
137 mushifted(m,1:(N-1))=mu(m,1:(N-1));
138 end
139end
140end
Definition mmt.m:92