1function [Pr,G,lG,runtime] = solver_nc_joint(sn, options)
2% [PR,G,LG,RUNTIME] = SOLVER_NC_JOINT(QN, OPTIONS)
4% Copyright (c) 2012-2026, Imperial College London
11% determine service times
15[~,STchain,Vchain,alpha,Nchain] = sn_get_demands_chain(sn);
22mu_chain = ones(M,sum(Nchain));
24 Lchain(ist,:) = STchain(ist,:) .* Vchain(ist,:);
25 if isinf(S(ist)) % infinite server
26 mu_chain(ist,1:sum(Nchain)) = 1:sum(Nchain);
28 mu_chain(ist,1:sum(Nchain)) = min(1:sum(Nchain), S(ist)*ones(1,sum(Nchain)));
32lG = pfqn_ncld(Lchain, Nchain, 0*Nchain, mu_chain, options);
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);
49% line_printf('\nNormalizing constant (NC) analysis completed. Runtime: %f seconds.\n
',runtime);