LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solver_nc_marg.m
1function [lPr,G,runtime] = solver_nc_marg(sn, options, lG)
2% [PR,G,RUNTIME] = SOLVER_NC_MARG(QN, OPTIONS)
3
4% Copyright (c) 2012-2026, Imperial College London
5% All rights reserved.
6
7
8%% initialization
9M = sn.nstations; %number of stations
10K = sn.nclasses; %number of classes
11state = sn.state;
12S = sn.nservers;
13V = cellsum(sn.visits);
14rates = sn.rates;
15ST = 1./rates;
16ST(isnan(ST))=0;
17
18
19[Lchain,STchain,~,~,Nchain] = sn_get_demands_chain(sn);
20
21Tstart = tic;
22
23[M,K]=size(STchain);
24
25mu = ones(M,sum(Nchain));
26for ist=1:M
27 if isinf(S(ist)) % infinite server
28 mu(ist,1:sum(Nchain)) = 1:sum(Nchain);
29 else
30 mu(ist,1:sum(Nchain)) = min(1:sum(Nchain), S(ist)*ones(1,sum(Nchain)));
31 end
32end
33
34if nargin < 3
35 lG = pfqn_ncld(Lchain, Nchain, 0*Nchain, mu, options);
36end
37G = exp(lG);
38
39lPr = zeros(sn.nstations,1);
40for ist=1:sn.nstations
41 ind = sn.stationToNode(ist);
42 isf = sn.stationToStateful(ist);
43 [~,nirvec,sivec,kirvec] = State.toMarginal(sn, ind, state{isf});
44 if min(nirvec) < 0 % user flags that state of i should be ignored
45 lPr(ist) = NaN;
46 else
47 set_ist = setdiff(1:sn.nstations,ist);
48 nivec_chain = nirvec * sn.chains';
49 lG_minus_i = pfqn_ncld(Lchain(set_ist,:), Nchain-nivec_chain, 0*Nchain, mu(set_ist,:), options);
50 lF_i = 0;
51 switch sn.sched(ist)
52 case SchedStrategy.FCFS
53 for r=1:K
54 PHr = sn.proc{ist}{r};
55 if ~isempty(PHr)
56 kir = kirvec(1,r,:); kir=kir(:)';
57 if length(kir)>1
58 line_error(mfilename,'Cannot return state probability because the product-form solution requires exponential service times at FCFS nodes.');
59 end
60 if ST(ist,r)~=max(ST(ist,:))
61 line_error(mfilename,'Cannot return state probability because the product-form solution requires identical service times at FCFS nodes.');
62 end
63 end
64 end
65 ci = find(sivec, 1);
66 if ~isempty(ci)
67 lF_i = lF_i + sum((nirvec(1,:).*log(V(ist,r)))) - sum(log(mu(ist,1:sum(kirvec(:)))));
68 else
69 lF_i = 0;
70 end
71 case SchedStrategy.SIRO
72 for r=1:K
73 PHr = sn.proc{ist}{r};
74 if ~isempty(PHr)
75 kir = kirvec(1,r,:); kir=kir(:)';
76 if length(kir)>1
77 line_error(mfilename,'Cannot return state probability because the product-form solution requires exponential service times at RAND nodes.');
78 end
79 if ST(ist,r)~=max(ST(ist,:))
80 line_error(mfilename,'Cannot return state probability because the product-form solution requires identical service times at RAND nodes.');
81 end
82 end
83 end
84 ci = find(sivec);
85 if ~isempty(ci)
86 lF_i = lF_i + log(nirvec(ci)) - log(sum(nirvec)) + pfqn_ncld(ST(ist,:).*V(ist,:), nirvec, 0*nirvec, mu(ist,:), options);
87 else
88 lF_i = 0;
89 end
90 case SchedStrategy.PS
91 for r=1:K
92 PHr = sn.proc{ist}{r};
93 if ~isempty(PHr)
94 kir = kirvec(1,r,:); kir=kir(:)';
95 Ar = -PHr{1}\ map_pie(PHr);
96 lF_i = lF_i + sum(kir.*log(V(ist,r)*Ar)) - sum(factln(kir));
97 end
98 end
99 lF_i = lF_i + factln(sum(kirvec(:))) - sum(log(mu(ist,1:sum(kirvec(:)))));
100 case SchedStrategy.INF
101 for r=1:K
102 PHr = sn.proc{ist}{r};
103 if ~isempty(PHr)
104 kir = kirvec(1,r,:); kir=kir(:)';
105 Ar = -PHr{1}\map_pie(PHr);
106 lF_i = lF_i + sum(kir.*log(V(ist,r)*Ar)) - sum(factln(kir));
107 end
108 end
109 end
110 lPr(ist) = lF_i + lG_minus_i - lG;
111 end
112end
113
114runtime = toc(Tstart);
115lPr(isnan(lPr))=0;
116%if options.verbose
117% line_printf('\nNormalizing constant (NC) analysis completed. Runtime: %f seconds.\n',runtime);
118%end
119end
Definition mmt.m:92