1function [Q,U,R,T,C,X,lG,iter] = solver_mva_sum(sn, options)
2% [Q,U,R,T,C,X,LG,ITER] = SOLVER_MVA_SUM(SN, OPTIONS)
4% Summation method (SUM/ESUM) analyzer. Closed models are solved with
5% sum_closed; open and mixed models with sum_closing (closing method,
6% Kclosed=5000). FCFS and SIRO stations use their service SCVs (ESUM
7% corrections
for scv~=1); PS, LCFS-PR and infinite-server stations are
8% insensitive and are passed scv=1. See api/sum and Bolch et al., Secs.
9% 9.2, 10.1.4.4 and 10.1.5.
11% Copyright (c) 2012-2026, Imperial College London
14[Lchain,STchain,Vchain,alpha,Nchain,SCVchain,refstatchain] = sn_get_demands_chain(sn); %#ok<ASGLU>
19nservers = sn.nservers;
21% station rows passed to
the summation method (all but
the source)
26 case SchedStrategy.EXT
27 % no-op, external world handled by lambda/sum_closing
28 case SchedStrategy.INF
31 case {SchedStrategy.PS, SchedStrategy.LCFSPR, SchedStrategy.FCFS, SchedStrategy.SIRO}
33 mi(end+1,1) = nservers(ist);
35 line_error(mfilename, sprintf(
'The summation method does not support %s scheduling.', SchedStrategy.toText(sched(ist))));
39L = STchain(rows,:).*Vchain(rows,:);
40scv = ones(length(rows),K);
43 if any(sched(ist) == [SchedStrategy.FCFS, SchedStrategy.SIRO])
45 if isfinite(SCVchain(ist,r)) && SCVchain(ist,r) > 0
46 scv(j,r) = SCVchain(ist,r);
53ocl = find(isinf(Nchain));
55 [Xchain,Qrows,Urows,~,iter] = sum_closed(L,Nchain,Z,mi,scv,options.iter_tol,options.iter_max);
60 lambda(r) = 1 ./ STchain(refstatchain(r),r);
61 if isfinite(SCVchain(refstatchain(r),r)) && SCVchain(refstatchain(r),r) > 0
62 scva(r) = SCVchain(refstatchain(r),r); % interarrival SCV at
the source
65 [Xchain,Qrows,Urows,~,~,iter] = sum_closing(lambda,scva,L,mi,scv,Nchain,Z,5000,options.iter_tol,options.iter_max);
71Qchain(rows,:) = Qrows;
72Uchain(rows,:) = Urows;
75 Tchain(k,r) = Xchain(r) * Vchain(k,r);
78Rchain = Qchain./Tchain;
80Xchain(~isfinite(Xchain))=0;
81Uchain(~isfinite(Uchain))=0;
82Qchain(~isfinite(Qchain))=0;
83Rchain(~isfinite(Rchain))=0;
92[Q,U,R,T,C,X] = sn_deaggregate_chain_results(sn, Lchain, [], STchain, Vchain, alpha, [], [], Rchain, Tchain, [], Xchain);