LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_panacea.m
1%{
2%{
3 % @file pfqn_panacea.m
4 % @brief PANACEA (PAth-based Normal Approximation for Closed networks Estimation Algorithm).
5%}
6%}
7
8%{
9%{
10 % @brief PANACEA (PAth-based Normal Approximation for Closed networks Estimation Algorithm).
11 % @fn pfqn_panacea(L, N, Z, terms)
12 % @param L Service demand matrix.
13 % @param N Population vector.
14 % @param Z Think time vector.
15 % @param terms Number of terms in the normal-usage asymptotic series
16 % (1, 2, or 3; default 3), as selectable in the original PANACEA
17 % package (Ramakrishnan-Mitra, BSTJ 61(10):2849-2872, 1982).
18 % @return Gn Normalizing constant.
19 % @return lGn Logarithm of normalizing constant.
20%}
21%}
22function [Gn,lGn]=pfqn_panacea(L,N,Z,terms)
23% [GN,LGN]=PFQN_PANACEA(L,N,Z,TERMS)
24
25% K = population vector
26[q,p]=size(L);
27if nargin==2 || isempty(Z)
28 Z=N*0+1e-8;
29end
30if nargin<4 || isempty(terms)
31 terms=3;
32end
33if ~isscalar(terms) || terms<1 || terms>3 || terms~=round(terms)
34 line_error(mfilename,'The terms parameter must be 1, 2, or 3 (higher-order coefficients are not implemented).');
35end
36if isempty(L) | sum(L,1)==zeros(1,p)
37 lGn = - sum(factln(N)) + sum(N.*log(sum(Z,1)));
38 Gn=exp(lGn);
39 return
40end
41r = L./repmat(Z,q,1);
42Nt = max(1./r(r>0)); % ignore structural zeros (classes not visiting a station)
43beta = N/Nt;
44gamma = r * Nt;
45alpha = 1-N*r';
46gammatilde = gamma ./ repmat(alpha',1,p);
47if min(alpha)<0
48 % line_warning(mfilename,'Model is not in normal usage');
49 Gn=NaN;
50 lGn=NaN;
51 return
52end
53
54A0 = 1;
55A1 = 0;
56if terms>=2
57 for j=1:p
58 m = zeros(1,p); m(j)=2;
59 A1 = A1 -beta(j) * pfqn_ca(gammatilde,m);
60 end
61end
62
63A2 = 0;
64if terms>=3
65 for j=1:p
66 m = zeros(1,p); m(j)=3;
67 A2 = A2 + 2 * beta(j) * pfqn_ca(gammatilde,m);
68 m = zeros(1,p); m(j)=4;
69 A2 = A2 + 3 * beta(j)^2 * pfqn_ca(gammatilde,m);
70 for k=1:p
71 if k~=j
72 m = zeros(1,p); m(j)=2; m(k)=2;
73 A2 = A2 + 0.5 * beta(j) * beta(k) * pfqn_ca(gammatilde,m);
74 end
75 end
76 end
77end
78
79% if false
80% A3 = 0;
81% for j=1:p
82% m = zeros(1,p); m(j)=4;
83% A3 = A3 - 6 * beta(j) * pfqn_ca(gammatilde,m);
84% m = zeros(1,p); m(j)=5;
85% A3 = A3 - 20 * beta(j)^2 * pfqn_ca(gammatilde,m);
86% m = zeros(1,p); m(j)=6;
87% A3 = A3 - 15 * beta(j)^3 * pfqn_ca(gammatilde,m);
88% for k=setdiff(1:p,j)
89% m = zeros(1,p); m(j)=4; m(k)=2;
90% A3 = A3 - 2 * beta(j) * beta(k) * pfqn_ca(gammatilde,m);
91% m = zeros(1,p); m(j)=2; m(k)=3;
92% A3 = A3 - 3 * beta(j)^2 * beta(k) * pfqn_ca(gammatilde,m);
93% for l=setdiff(1:p,[j,k])
94% m = zeros(1,p); m(j)=2; m(k)=2; m(l)=2;
95% A3 = A3 - (1/6) * beta(j) * beta(k) * beta(l) * pfqn_ca(gammatilde,m);
96% end
97% end
98% end
99% end
100I = [A0, A1/Nt, A2/Nt^2];
101I = I(1:terms);
102%, A3/N^3*0];
103
104lGn = - sum(factln(N)) + sum(N.*log(sum(Z,1))) + log(sum(I)) - sum(log(alpha));
105Gn = exp(lGn);
106if ~isfinite(lGn)
107 Gn=NaN;
108 lGn=NaN;
109end
110end
Definition Station.m:245