LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_ca.m
1%{
2%{
3 % @file pfqn_ca.m
4 % @brief Convolution Algorithm for exact normalizing constant computation.
5%}
6%}
7
8function [Gn,lGn]=pfqn_ca(L,N,Z)
9%{
10%{
11 % @brief Convolution Algorithm for exact normalizing constant computation.
12 % @fn pfqn_ca(L, N, Z)
13 % @param L Service demand matrix.
14 % @param N Population vector.
15 % @param Z Think time vector.
16 % @return Gn Normalizing constant.
17 % @return lGn Logarithm of the normalizing constant.
18%}
19%}
20[M,R]=size(L);
21if nargin<3 || isempty(Z)
22 Z=zeros(1,R);
23end
24if M==0
25 lGn = - sum(factln(N)) + sum(N.*log(sum(Z,1)));
26 Gn = exp(lGn);
27 return
28end
29
30if min(N)<0
31 Gn=0;
32 lGn=-Inf;
33 return;
34end
35
36if sum(N)==0
37 Gn=1;
38 lGn=0;
39 return;
40end
41
42
43G = ones(M+1,prod(N+1)); % stores G across recursion
44n = pprod(N);
45while sum(n)~=-1
46 idxn = hashpop(n,N);
47 G(1,idxn) = Fz(Z,n);
48 for m=2:M+1
49 G(m,idxn) = G(m-1,idxn); % norm constant with m-1 queues
50 for r=1:R
51 if n(r)>=1
52 n(r) = n(r)-1;
53 idxn_1r = hashpop(n,N);
54 n(r) = n(r)+1;
55 G(m,idxn) = G(m,idxn) + L(m-1,r)*G(m,idxn_1r);
56 end
57 end
58 end
59 n=pprod(n,N);
60end
61Gn=G(M+1,end);
62lGn=log(Gn);
63end
64
65function idx=hashpop(n,N,R,prods)
66% IDX=HASHPOP(N,N,R,PRODS)
67
68% hash a population vector in n: 0<=n<=N
69idx=1;
70if nargin==2
71 R=length(N);
72 for r=1:R
73 idx= idx + prod(N(1:r-1)+1)*n(r);
74 end
75 return
76else
77 for r=1:R
78 idx= idx + prods(r)*n(r);
79 end
80end
81end
82
83function [n]=pprod(n,N)
84% [N]=PPROD(N,N)
85
86% sequentially generate all vectors n: 0<=n<=N
87% n=pprod(N) - init
88% n=pprod(n,N) - next state
89if nargin==1
90 N=n;
91 n=zeros(size(N));
92 return;
93end
94
95R=length(N);
96if sum(n==N)==R
97 n=-1;
98 return
99end
100
101s=R;
102while s>0 && n(s)==N(s)
103 n(s)=0;
104 s=s-1;
105end
106if s==0
107 %n=-1*ones(1,R);
108 return
109end
110n(s)=n(s)+1;
111return;
112end
113
114function f=Fz(Z,n)
115% F=FZ(Z,N)
116
117R=length(n);
118if sum(n)==0
119 f=1;
120 return
121end
122f=0;
123for r=1:R
124 if Z(r)>0
125 f=f+log(Z(r))*n(r);
126 f=f-gammaln(1+n(r));
127 elseif n(r)>0
128 f = 0;
129 return
130 end
131end
132f=exp(f);
133end