LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_stdf_heur.m
1%{
2%{
3 % @file pfqn_stdf_heur.m
4 % @brief Heuristic sojourn time distribution for multiserver FCFS nodes (McKenna 1987 variant).
5%}
6%}
7
8%{
9%{
10 % @brief Heuristic sojourn time distribution for multiserver FCFS nodes (McKenna 1987 variant).
11 % @fn pfqn_stdf_heur(L, N, Z, S, fcfsNodes, rates, tset)
12 % @param L Service demand matrix.
13 % @param N Population vector.
14 % @param Z Think time vector.
15 % @param S Number of servers per station.
16 % @param fcfsNodes Indices of FCFS nodes to analyze.
17 % @param rates Service rates (MxR matrix).
18 % @param tset Time points for CDF evaluation.
19 % @return RD Cell array of sojourn time distributions {station,class}.
20%}
21%}
22function RD = pfqn_stdf_heur(L,N,Z,S,fcfsNodes,rates,tset)
23% Heuristic sojourn time distribution analysis at multiserver FCFS nodes
24% based on a variant of the method in J. McKenna 1987 JACM
25stabilityWarnIssued = false;
26[M,R]=size(L);
27T=length(tset);
28mu = zeros(M,sum(N));
29for k=1:M
30 for n=1:sum(N)
31 mu(k,n) = min(S(k),n);
32 end
33end
34
35% when t==0 the hkc function is not well defined
36tset(tset == 0) = GlobalConstants.FineTol;
37hkc = cell(1,R);
38for k=fcfsNodes(:)'
39 for r=1:R
40 if L(k,r) > GlobalConstants.FineTol
41 Nr = oner(N,r);
42 if M==1
43 options = SolverNC.defaultOptions;
44 [~,lGr] = pfqn_comomrm_ld(L,Nr,Z,mu,options);
45 m = 2; [~,lGra] = pfqn_comomrm_ld(L,Nr,Z,pfqn_mu_ms(sum(N),m,S(k)),options);
46 Q1 = zeros(1,R);
47 for s=1:R
48 Q1(k,s) = L(k,s)* exp(lGra-lGr);
49 end
50 isNumStable = true;
51 else
52 [~,Q1,~,~,lGr,isNumStable] = pfqn_mvald(L,Nr,Z,mu);
53 end
54
55 hMAPr = cell(1,1+sum(N));
56 for n=0:sum(N)
57 if n < S(k)
58 % the heuristic here is to use the average rates
59 hMAPr{1+n} = map_exponential(1/rates(k,r));
60 else
61 % the heuristic here is to use the rates per class
62 C = {map_exponential(1/rates(k,r))};
63 for s=1:R
64 C = {C{:}, map_exponential(Q1(k,s)*(n-S(k)+1)/sum(Q1(k,:))/rates(k,s))};
65 end
66 hMAPr{1+n} = map_sumind(C);
67 end
68 hkc{r}(1:T,1+n) = map_cdf(hMAPr{1+n}, tset)';
69 end
70
71 lGr = lGr(end);
72 if ~isNumStable && ~stabilityWarnIssued
73 stabilityWarnIssued = true;
74 line_warning(mfilename,'The computation of the sojourn time distribution is numerically unstable.\n');
75 end
76 RD{k,r} = zeros(length(tset),2);
77 RD{k,r}(:,2) = tset(:);
78
79 %% this is the original code in the paper
80 % Gkrt = zeros(T,1);
81 % nvec = pprod(Nr);
82 % while nvec >= 0
83 % [~,~,~,~,lGk,isNumStable] = pfqn_mvald(L(setdiff(1:M,k),:),Nr-nvec,Z,mu(setdiff(1:M,k),:));
84 % lGk = lGk(end);
85 % if ~isNumStable && ~stabilityWarnIssued
86 % stabilityWarnIssued = true;
87 % line_warning(mfilename,'The computation of the sojourn time distribution is numerically unstable');
88 % end
89 % for t=1:T
90 % if sum(nvec)==0
91 % Gkrt(t) = Gkrt(t) + hkc(t,1+0) * exp(lGk);
92 % else
93 % lFk = nvec*log(L(k,:))' +factln(sum(nvec)) - sum(factln(nvec)) - sum(log(mu(k,1:sum(nvec))));
94 % Gkrt(t) = Gkrt(t) + hkc(t,1+sum(nvec)) * exp(lFk + lGk);
95 % end
96 % end % nvec
97 % nvec = pprod(nvec, Nr);
98 % end
99 % lGkrt = log(Gkrt);
100 % RD{k,r}(1:T,1) = exp(lGkrt - lGr);
101
102 %% this is faster as it uses the recursive form for LD models
103 Hkrt = [];
104 [~,~,~,~,lGk] = pfqn_mvald(L(setdiff(1:M,k),:),Nr,Z,mu(setdiff(1:M,k),:));
105 lGk = lGk(end);
106 for t=1:T
107 %[t,T]
108 gammat = mu;
109 for m=1:sum(Nr)
110 gammat(k,m) = mu(k,m) * hkc{r}(t,1+m-1) / hkc{r}(t,1+m);
111 end
112 gammak = mushift(gammat,k);
113 Hkrt(t) = hkc{r}(t,1+0) * exp(lGk); % nvec = 0
114 for s=1:R % nvec >= 1s
115 if Nr(s)>0
116 lYks_t = pfqn_rd(L,oner(Nr,s),Z,gammak);
117 %[~,~,~,~,lYks_t] = pfqn_mvald(L,oner(Nr,s),Z,gammak);
118 lYks_t = lYks_t(end);
119 Hkrt(t) = Hkrt(t) + (L(k,s) * hkc{r}(t,1+0) / gammat(k,1)) * exp(lYks_t); % nvec = 0
120 end
121 end
122 end
123 Hkrt(isnan(Hkrt)) = GlobalConstants.FineTol;
124 lHkrt = log(Hkrt);
125
126 RD{k,r}(1:T,1) = exp(lHkrt - lGr);
127 end
128 end
129end
130end
131
132function Fmx=Fm(m,x)
133if m==1
134 Fmx = 1-exp(-x);
135else
136 A = 0;
137 for j=0:(m-1)
138 A = A + x^j/factorial(j);
139 end
140 Fmx = 1-exp(-x)*A;
141end
142end
143
144function mushifted = mushift(mu,i)
145% shifts the service rate vector
146[M,N]=size(mu);
147for m=1:M
148 if m==i
149 mushifted(m,1:(N-1))=mu(m,2:N);
150 else
151 mushifted(m,1:(N-1))=mu(m,1:(N-1));
152 end
153end
154end
Definition mmt.m:92