1function [lPr,G,runtime] = solver_nc_marg(sn, options, lG)
2% [PR,G,RUNTIME] = SOLVER_NC_MARG(QN, OPTIONS)
4% Copyright (c) 2012-2026, Imperial College London
9M = sn.nstations; %number of stations
10K = sn.nclasses; %number of
classes
13V = cellsum(sn.visits);
19[Lchain,STchain,~,~,Nchain] = sn_get_demands_chain(sn);
25mu = ones(M,sum(Nchain));
27 if isinf(S(ist)) % infinite server
28 mu(ist,1:sum(Nchain)) = 1:sum(Nchain);
30 mu(ist,1:sum(Nchain)) = min(1:sum(Nchain), S(ist)*ones(1,sum(Nchain)));
35 lG = pfqn_ncld(Lchain, Nchain, 0*Nchain, mu, options);
39lPr = zeros(sn.nstations,1);
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
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);
52 case SchedStrategy.FCFS
54 PHr = sn.proc{ist}{r};
56 kir = kirvec(1,r,:); kir=kir(:)';
58 line_error(mfilename,
'Cannot return state probability because the product-form solution requires exponential service times at FCFS nodes.');
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.');
67 lF_i = lF_i + sum((nirvec(1,:).*log(V(ist,r)))) - sum(log(mu(ist,1:sum(kirvec(:)))));
71 case SchedStrategy.SIRO
73 PHr = sn.proc{ist}{r};
75 kir = kirvec(1,r,:); kir=kir(:)
';
77 line_error(mfilename,'Cannot return state probability because the product-form solution requires exponential service times at RAND
nodes.
');
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.
');
86 lF_i = lF_i + log(nirvec(ci)) - log(sum(nirvec)) + pfqn_ncld(ST(ist,:).*V(ist,:), nirvec, 0*nirvec, mu(ist,:), options);
92 PHr = sn.proc{ist}{r};
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));
99 lF_i = lF_i + factln(sum(kirvec(:))) - sum(log(mu(ist,1:sum(kirvec(:)))));
100 case SchedStrategy.INF
102 PHr = sn.proc{ist}{r};
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));
110 lPr(ist) = lF_i + lG_minus_i - lG;
114runtime = toc(Tstart);
117% line_printf('\nNormalizing constant (NC) analysis completed. Runtime: %f seconds.\n
',runtime);