LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solver_nc_joint.m
1function [Pr,G,lG,runtime] = solver_nc_joint(sn, options)
2% [PR,G,LG,RUNTIME] = SOLVER_NC_JOINT(QN, OPTIONS)
3
4% Copyright (c) 2012-2026, Imperial College London
5% All rights reserved.
6
7%% initialization
8state = sn.state;
9S = sn.nservers;
10rates = sn.rates;
11% determine service times
12ST = 1./rates;
13ST(isnan(ST))=0;
14
15[~,STchain,Vchain,alpha,Nchain] = sn_get_demands_chain(sn);
16
17Tstart = tic;
18
19[M,K]=size(STchain);
20
21Lchain = zeros(M,K);
22mu_chain = ones(M,sum(Nchain));
23for ist=1:M
24 Lchain(ist,:) = STchain(ist,:) .* Vchain(ist,:);
25 if isinf(S(ist)) % infinite server
26 mu_chain(ist,1:sum(Nchain)) = 1:sum(Nchain);
27 else
28 mu_chain(ist,1:sum(Nchain)) = min(1:sum(Nchain), S(ist)*ones(1,sum(Nchain)));
29 end
30end
31
32lG = pfqn_ncld(Lchain, Nchain, 0*Nchain, mu_chain, options);
33lPr = 0;
34for ist=1:M
35 isf = sn.stationToStateful(ist);
36 [~,nivec] = State.toMarginal(sn, ist, state{isf});
37 nivec_chain = nivec * sn.chains';
38 lF_i = pfqn_ncld(Lchain(ist,:), nivec_chain, 0*nivec_chain,mu_chain(ist,:), options);
39 lg0_i = pfqn_ncld(ST(ist,:).*alpha(ist,:), nivec, 0*nivec, mu_chain(ist,:), options);
40 lG0_i = pfqn_ncld(STchain(ist,:), nivec_chain, 0*nivec_chain, mu_chain(ist,:), options);
41 lPr = lPr + lF_i + (lg0_i - lG0_i);
42end
43Pr = exp(lPr - lG);
44
45runtime = toc(Tstart);
46
47G = exp(lG);
48%if options.verbose
49% line_printf('\nNormalizing constant (NC) analysis completed. Runtime: %f seconds.\n',runtime);
50%end
51end