1function [Pr,G,lG,runtime] = solver_nc_margaggr(sn, options, lG)
2% [PR,G,LG,RUNTIME] = SOLVER_NC_MARGAGGR(QN, OPTIONS)
4% Copyright (c) 2012-2026, Imperial College London
7M = sn.nstations; %number of stations
8K = sn.nclasses; %number of
classes
11NK = sn.njobs
'; % initial population per class
18% determine service times
22 ST(ist,k) = 1 ./ map_lambda(PH{ist}{k});
27[Lchain,STchain,~,~,Nchain] = sn_get_demands_chain(sn);
29V = zeros(sn.nstations,sn.nclasses);
31 inchain = sn.inchain{c};
32 for ist=1:sn.nstations
34 V(ist,k) = sn.visits{c}(ist,k);
43mu = ones(M,sum(Nchain));
45 if isinf(S(ist)) % infinite server
46 mu(ist,1:sum(Nchain)) = 1:sum(Nchain);
48 mu(ist,1:sum(Nchain)) = min(1:sum(Nchain), S(ist)*ones(1,sum(Nchain)));
53 lG = pfqn_ncld(Lchain, Nchain, 0*Nchain, mu, options);
57lPr = zeros(sn.nstations,1);
59 ind = sn.stationToNode(ist);
60 isf = sn.stationToStateful(ist);
61 [~,nivec] = State.toMarginal(sn, ind, state{isf});
62 if min(nivec) < 0 % user flags that state of i should be ignored
65 set_ist = setdiff(1:sn.nstations,ist);
66 nivec_chain = nivec * sn.chains';
67 lG_minus_i = pfqn_ncld(Lchain(set_ist,:), Nchain-nivec_chain, 0*Nchain, mu(set_ist,:), options);
68 lF_i = pfqn_ncld(ST(ist,:).*V(ist,:), nivec, 0*nivec, mu(ist,:), options);
69 lPr(ist) = lF_i + lG_minus_i - lG;
77% line_printf(
'Normalizing constant (NC) analysis completed. Runtime: %f seconds.\n',runtime);