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)
12 % @param L Service demand matrix.
13 % @param N Population vector.
14 % @param Z Think time vector.
15 % @return Gn Normalizing constant.
16 % @return lGn Logarithm of normalizing constant.
17%}
18%}
19function [Gn,lGn]=pfqn_panacea(L,N,Z)
20% [GN,LGN]=PFQN_PANACEA(L,N,Z)
21
22% K = population vector
23[q,p]=size(L);
24if nargin==2 || isempty(Z)
25 Z=N*0+1e-8;
26end
27if isempty(L) | sum(L,1)==zeros(1,p)
28 lGn = - sum(factln(N)) + sum(N.*log(sum(Z,1)));
29 Gn=exp(lGn);
30 return
31end
32r = L./repmat(Z,q,1);
33Nt = max(1./r(:));
34beta = N/Nt;
35gamma = r * Nt;
36alpha = 1-N*r';
37gammatilde = gamma ./ repmat(alpha',1,p);
38if min(alpha)<0
39 % line_warning(mfilename,'Model is not in normal usage');
40 Gn=NaN;
41 lGn=NaN;
42 return
43end
44
45A0 = 1;
46A1 = 0;
47for j=1:p
48 m = zeros(1,p); m(j)=2;
49 A1 = A1 -beta(j) * pfqn_ca(gammatilde,m);
50end
51
52A2 = 0;
53for j=1:p
54 m = zeros(1,p); m(j)=3;
55 A2 = A2 + 2 * beta(j) * pfqn_ca(gammatilde,m);
56 m = zeros(1,p); m(j)=4;
57 A2 = A2 + 3 * beta(j)^2 * pfqn_ca(gammatilde,m);
58 for k=setdiff(1:p,j)
59 m = zeros(1,p); m(j)=2; m(k)=2;
60 A2 = A2 + 0.5 * beta(j) * beta(k) * pfqn_ca(gammatilde,m);
61 end
62end
63
64% if false
65% A3 = 0;
66% for j=1:p
67% m = zeros(1,p); m(j)=4;
68% A3 = A3 - 6 * beta(j) * pfqn_ca(gammatilde,m);
69% m = zeros(1,p); m(j)=5;
70% A3 = A3 - 20 * beta(j)^2 * pfqn_ca(gammatilde,m);
71% m = zeros(1,p); m(j)=6;
72% A3 = A3 - 15 * beta(j)^3 * pfqn_ca(gammatilde,m);
73% for k=setdiff(1:p,j)
74% m = zeros(1,p); m(j)=4; m(k)=2;
75% A3 = A3 - 2 * beta(j) * beta(k) * pfqn_ca(gammatilde,m);
76% m = zeros(1,p); m(j)=2; m(k)=3;
77% A3 = A3 - 3 * beta(j)^2 * beta(k) * pfqn_ca(gammatilde,m);
78% for l=setdiff(1:p,[j,k])
79% m = zeros(1,p); m(j)=2; m(k)=2; m(l)=2;
80% A3 = A3 - (1/6) * beta(j) * beta(k) * beta(l) * pfqn_ca(gammatilde,m);
81% end
82% end
83% end
84% end
85I = [A0, A1/Nt, A2/Nt^2];
86%, A3/N^3*0];
87
88lGn = - sum(factln(N)) + sum(N.*log(sum(Z,1))) + log(sum(I)) - sum(log(alpha));
89Gn = exp(lGn);
90if ~isfinite(lGn)
91 Gn=NaN;
92 lGn=NaN;
93end
94end