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 M==0
22 lGn = - sum(factln(N)) + sum(N.*log(sum(Z,1)));
23 Gn = exp(lGn);
24 return
25end
26
27if min(N)<0
28 Gn=0;
29 lGn=-Inf;
30 return;
31end
32
33if sum(N)==0
34 Gn=1;
35 lGn=0;
36 return;
37end
38
39
40if nargin<3 || isempty(Z)
41 Z=zeros(1,R);
42end
43
44G = ones(M+1,prod(N+1)); % stores G across recursion
45n = pprod(N);
46while sum(n)~=-1
47 idxn = hashpop(n,N);
48 G(1,idxn) = Fz(Z,n);
49 for m=2:M+1
50 G(m,idxn) = G(m-1,idxn); % norm constant with m-1 queues
51 for r=1:R
52 if n(r)>=1
53 n(r) = n(r)-1;
54 idxn_1r = hashpop(n,N);
55 n(r) = n(r)+1;
56 G(m,idxn) = G(m,idxn) + L(m-1,r)*G(m,idxn_1r);
57 end
58 end
59 end
60 n=pprod(n,N);
61end
62Gn=G(M+1,end);
63lGn=log(Gn);
64end
65
66function idx=hashpop(n,N,R,prods)
67% IDX=HASHPOP(N,N,R,PRODS)
68
69% hash a population vector in n: 0<=n<=N
70idx=1;
71if nargin==2
72 R=length(N);
73 for r=1:R
74 idx= idx + prod(N(1:r-1)+1)*n(r);
75 end
76 return
77else
78 for r=1:R
79 idx= idx + prods(r)*n(r);
80 end
81end
82end
83
84function [n]=pprod(n,N)
85% [N]=PPROD(N,N)
86
87% sequentially generate all vectors n: 0<=n<=N
88% n=pprod(N) - init
89% n=pprod(n,N) - next state
90if nargin==1
91 N=n;
92 n=zeros(size(N));
93 return;
94end
95
96R=length(N);
97if sum(n==N)==R
98 n=-1;
99 return
100end
101
102s=R;
103while s>0 && n(s)==N(s)
104 n(s)=0;
105 s=s-1;
106end
107if s==0
108 %n=-1*ones(1,R);
109 return
110end
111n(s)=n(s)+1;
112return;
113end
114
115function f=Fz(Z,n)
116% F=FZ(Z,N)
117
118R=length(n);
119if sum(n)==0
120 f=1;
121 return
122end
123f=0;
124for r=1:R
125 if Z(r)>0
126 f=f+log(Z(r))*n(r);
127 f=f-gammaln(1+n(r));
128 elseif n(r)>0
129 f = 0;
130 return
131 end
132end
133f=exp(f);
134end