LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solver_nc_jointaggr.m
1function [Pr,G,runtime] = solver_nc_jointaggr(sn, options)
2% [PR,G,RUNTIME] = SOLVER_NC_JOINTAGGR(QN, OPTIONS)
3
4% Copyright (c) 2012-2026, Imperial College London
5% All rights reserved.
6
7Tstart = tic;
8
9V = cellsum(sn.visits);
10M = sn.nstations; %number of stations
11C = sn.nchains;
12Nchain = zeros(1,C);
13
14for c=1:C
15 inchain = sn.inchain{c};
16 Nchain(c) = sum(sn.njobs(inchain));
17end
18
19% transform everything into a LD model
20nservers = sn.nservers;
21mu = ones(M,sum(Nchain));
22for ist=1:M
23 if isinf(nservers(ist)) % infinite server
24 mu(ist,1:sum(Nchain)) = 1:sum(Nchain);
25 else
26 mu(ist,1:sum(Nchain)) = min(1:sum(Nchain), nservers(ist)*ones(1,sum(Nchain)));
27 end
28end
29state = sn.state;
30
31switch options.method
32 case 'exact'
33 Tstart = tic;
34 [Lchain,~,~,~,Nchain] = sn_get_demands_chain(sn);
35 lG = pfqn_ncld(Lchain, Nchain, 0*Nchain, mu);
36 ST = 1 ./ sn.rates;
37 ST(isnan(ST))=0;
38 otherwise
39 % unclear if this is correct as it doesn't consider the
40 % transformation to ld model
41 [~,~,~,~,~,~,lG,ST] = solver_nc(sn, options);
42end
43G = exp(lG);
44
45lPr = 0;
46for ist=1:M
47 isf = sn.stationToStateful(ist);
48 [~,nivec] = State.toMarginal(sn, ist, state{isf});
49 nivec = unique(nivec,'rows');
50 nivec_chain = nivec * sn.chains';
51 if any(nivec_chain>0)
52 lF_i = pfqn_ncld(ST(ist,:).*V(ist,:), nivec, 0*nivec, mu(ist,:), options);
53 lPr = lPr + lF_i ;
54 end
55end
56lPr = lPr - lG;
57Pr = exp(lPr);
58
59runtime = toc(Tstart);
60return
61end
62