LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_gld.m
1%{
2%{
3 % @file pfqn_gld.m
4 % @brief Exact normalizing constant for load-dependent queueing networks.
5%}
6%}
7
8%{
9%{
10 % @brief Exact normalizing constant for load-dependent queueing networks.
11 % @fn pfqn_gld(L, N, mu, options)
12 % @param L Service demand matrix (MxR).
13 % @param N Population vector (1xR).
14 % @param mu Load-dependent rate matrix (Mx sum(N)).
15 % @param options Solver options.
16 % @return G Normalizing constant.
17 % @return lG Logarithm of normalizing constant.
18%}
19%}
20function [G,lG]=pfqn_gld(L,N,mu,options)
21% [G,LG]=PFQN_GLD(L,N,MU,OPTIONS)
22
23% G=pfqn_gld(L,N,mu)
24% mu: MxN matrix of load-dependent rates
25[M,R]=size(L);
26lambda = zeros(1,R);
27if M==1
28 lG = factln(sum(N)) - sum(factln(N)) + N(L>0)*log(L(L>0))' - sum(log(mu(1,1:sum(N))));
29 G = exp(lG);
30 return
31end
32
33if R==1
34 [lG,G] = pfqn_gldsingle(L,N,mu);
35 return
36end
37
38if isempty(L)
39 G = 0; lG = -Inf; return
40end
41
42if nargin==2
43 mu=ones(M,sum(N));
44end
45
46if nargin<4
47 options = SolverNC.defaultOptions;
48end
49
50isLoadDep = false;
51isInfServer = [];
52for ist=1:M
53 if min(mu(ist,1:sum(N))) == 1 & max(mu(ist,1:sum(N))) == 1
54 isInfServer(ist) = false;
55 continue; % this is a LI station
56 elseif all(mu(ist,1:sum(N)) == 1:sum(N))
57 isInfServer(ist) = true;
58 continue; % this is a infinite server station
59 else
60 isInfServer(ist) = false;
61 isLoadDep = true;
62 end
63end
64
65if ~isLoadDep
66 % if load-independent model then use faster pfqn_gmva solver
67 Lli = L(find(~isInfServer),:);
68 if isempty(Lli)
69 Lli = 0*N;
70 end
71 Zli = L(find(isInfServer),:);
72 if isempty(Zli)
73 Zli = 0*N;
74 end
75 options.method='exact';
76 lG = pfqn_nc(lambda,Lli, N, sum(Zli,1), options);
77 G = exp(lG);
78 return
79end
80
81G=0;
82if M==0
83 G=0;
84 lG=log(G);
85 return;
86end
87if sum(N==zeros(1,R))==R
88 G=1;
89 lG=log(G);
90 return;
91end
92
93if R==1
94 G=pfqn_gldsingle(L,N,mu);
95 lG=log(G);
96 return
97end
98
99G=G + pfqn_gld(L(1:(M-1),:),N,mu(1:(M-1),:),options);
100for r=1:R
101 if N(r)>0
102 if R>1
103 N_1 = oner(N,r);
104 else
105 N_1 = N-1;
106 end
107 G = G + (L(M,r)/mu(M,1))*pfqn_gld(L,N_1,pfqn_mushift(mu,M),options);
108 end
109end
110lG=log(G);
111return
112end