LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solver_nc_margaggr.m
1function [Pr,G,lG,runtime] = solver_nc_margaggr(sn, options, lG)
2% [PR,G,LG,RUNTIME] = SOLVER_NC_MARGAGGR(QN, OPTIONS)
3
4% Copyright (c) 2012-2026, Imperial College London
5% All rights reserved.
6
7M = sn.nstations; %number of stations
8K = sn.nclasses; %number of classes
9state = sn.state;
10S = sn.nservers;
11NK = sn.njobs'; % initial population per class
12C = sn.nchains;
13
14PH = sn.proc;
15
16%% initialization
17
18% determine service times
19ST = zeros(M,K);
20for k = 1:K
21 for ist=1:M
22 ST(ist,k) = 1 ./ map_lambda(PH{ist}{k});
23 end
24end
25ST(isnan(ST))=0;
26
27[Lchain,STchain,~,~,Nchain] = sn_get_demands_chain(sn);
28
29V = zeros(sn.nstations,sn.nclasses);
30for c=1:sn.nchains
31 inchain = sn.inchain{c};
32 for ist=1:sn.nstations
33 for k=inchain
34 V(ist,k) = sn.visits{c}(ist,k);
35 end
36 end
37end
38
39Tstart = tic;
40
41[M,~]=size(STchain);
42
43mu = ones(M,sum(Nchain));
44for ist=1:M
45 if isinf(S(ist)) % infinite server
46 mu(ist,1:sum(Nchain)) = 1:sum(Nchain);
47 else
48 mu(ist,1:sum(Nchain)) = min(1:sum(Nchain), S(ist)*ones(1,sum(Nchain)));
49 end
50end
51
52if nargin == 2
53 lG = pfqn_ncld(Lchain, Nchain, 0*Nchain, mu, options);
54end
55G = exp(lG);
56
57lPr = zeros(sn.nstations,1);
58for ist=1:sn.nstations
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
63 lPr(ist) = NaN;
64 else
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;
70 end
71end
72Pr = exp(lPr);
73Pr(isnan(Pr))=0;
74lG = log(G);
75runtime = toc(Tstart);
76%if options.verbose
77% line_printf('Normalizing constant (NC) analysis completed. Runtime: %f seconds.\n',runtime);
78%end
79end