LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solver_mvac.m
1function [Q,U,R,T,C,X,lG] = solver_mvac(sn,options)
2% [Q,U,R,T,C,X,LG] = SOLVER_MVAC(SN,OPTIONS)
3%
4% Exact mean value analysis by chain (MVAC, Conway-de Souza e Silva-Lavenberg
5% 1989) via pfqn_mvac. Closed product-form networks of single-server
6% fixed-rate (SSFR) queues and infinite-server centers only.
7
8% Copyright (c) 2012-2026, Imperial College London
9% All rights reserved.
10
11if nargin < 2
12 options = SolverMVA.defaultOptions;
13end
14
15[Lchain,STchain,Vchain,alpha,Nchain,~,refstatchain] = sn_get_demands_chain(sn);
16
17nservers = sn.nservers;
18sched = sn.sched;
19M = sn.nstations;
20K = sn.nchains;
21
22if ~sn_has_product_form(sn)
23 line_error(mfilename, 'MVAC requires a product-form model.');
24end
25if any(isinf(Nchain))
26 line_error(mfilename, 'MVAC supports closed models only; use method ''exact'' for open/mixed networks.');
27end
28
29infSET =[]; % set of infinite server stations
30qSET =[]; % set of single-server fixed-rate stations
31for ist=1:M
32 switch sched(ist)
33 case SchedStrategy.EXT
34 % no-op
35 case SchedStrategy.INF
36 infSET(1,end+1) = ist;
37 case {SchedStrategy.PS, SchedStrategy.LCFSPR, SchedStrategy.FCFS, SchedStrategy.SIRO}
38 qSET(1,end+1) = ist;
39 otherwise
40 line_error(mfilename, sprintf('MVAC does not support %s scheduling.',SchedStrategy.toText(sched(ist))));
41 end
42end
43if any(nservers(qSET) ~= 1)
44 line_error(mfilename, 'MVAC supports single-server (SSFR) queues only; use method ''exact'' for multiserver stations.');
45end
46
47Uchain = zeros(M,K); Tchain = zeros(M,K); C = zeros(1,K); Wchain = zeros(M,K); Qchain = zeros(M,K);
48
49% Zero-population chains carry no work; solve on the active set and re-expand.
50rset = setdiff(1:K,find(Nchain==0));
51
52Lq = STchain(qSET,:).*Vchain(qSET,:);
53Zq = STchain(infSET,:).*Vchain(infSET,:);
54[Xr,Qr] = pfqn_mvac(Lq(:,rset), Nchain(rset), sum(Zq(:,rset),1));
55Xchain = zeros(1,K); Xchain(rset) = Xr;
56Qchain(qSET,rset) = Qr;
57Qchain(infSET,:) = repmat(Xchain,numel(infSET),1) .* STchain(infSET,:) .* Vchain(infSET,:);
58lG = NaN; % MVAC forms no normalizing constant
59
60ccl = find(isfinite(Nchain));
61for r=rset
62 for k=infSET(:)'
63 Wchain(k,r) = STchain(k,r);
64 end
65 for k=qSET(:)'
66 if isinf(nservers(k)) % infinite server
67 Wchain(k,r) = STchain(k,r);
68 else
69 if Vchain(k,r) == 0 || Xchain(r) == 0
70 Wchain(k,r) = 0;
71 else
72 Wchain(k,r) = Qchain(k,r) / (Xchain(r) * Vchain(k,r));
73 end
74 end
75 end
76end
77
78for r=rset
79 if sum(Wchain(:,r)) == 0
80 Xchain(r) = 0;
81 else
82 if isinf(Nchain(r))
83 C(r) = Vchain(:,r)'*Wchain(:,r);
84 % X(r) remains constant
85 elseif Nchain(r)==0
86 Xchain(r) = 0;
87 C(r) = 0;
88 else
89 C(r) = Vchain(:,r)'*Wchain(:,r);
90 Xchain(r) = Nchain(r) / C(r);
91 end
92 end
93
94 for k=1:M
95 Qchain(k,r) = Xchain(r) * Vchain(k,r) * Wchain(k,r);
96 Tchain(k,r) = Xchain(r) * Vchain(k,r);
97 end
98end
99
100for k=1:M
101 for r=rset
102 if isinf(nservers(k)) % infinite server
103 Uchain(k,r) = Vchain(k,r)*STchain(k,r)*Xchain(r);
104 else
105 Uchain(k,r) = Vchain(k,r)*STchain(k,r)*Xchain(r)/nservers(k);
106 end
107 end
108end
109
110for k=1:M
111 for r=1:K
112 if Vchain(k,r)*STchain(k,r) > options.tol
113 switch sched(k)
114 case {SchedStrategy.FCFS,SchedStrategy.PS}
115 if sum(Uchain(k,:))>1+options.tol
116 Uchain(k,r) = min(1,sum(Uchain(k,:))) * Vchain(k,r)*STchain(k,r)*Xchain(r) / ((Vchain(k,:).*STchain(k,:))*Xchain(:));
117 end
118 end
119 end
120 end
121end
122
123%Vsink = cellsum(sn.nodevisits);
124%Vsink = Vsink(find(sn.nodetype==NodeType.Sink),:);
125%for r=find(isinf(Nchain)) % open classes
126 %Xchain(r) = Vsink(r) ./ STchain(refstatchain(r),r);
127%end
128
129Rchain = Qchain./Tchain;
130Xchain(~isfinite(Xchain))=0;
131Uchain(~isfinite(Uchain))=0;
132Qchain(~isfinite(Qchain))=0;
133Rchain(~isfinite(Rchain))=0;
134
135Xchain(Nchain==0)=0;
136Uchain(:,Nchain==0)=0;
137Qchain(:,Nchain==0)=0;
138Rchain(:,Nchain==0)=0;
139Tchain(:,Nchain==0)=0;
140Wchain(:,Nchain==0)=0;
141
142[Q,U,R,T,C,X] = sn_deaggregate_chain_results(sn, Lchain, [], STchain, Vchain, alpha, [], [], Rchain, Tchain, [], Xchain);
143end