LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_mvamx.m
1%{
2%{
3 % @file pfqn_mvamx.m
4 % @brief Exact MVA for mixed open/closed single-server networks.
5%}
6%}
7
8%{
9%{
10 % @brief Exact MVA for mixed open/closed single-server networks.
11 % @fn pfqn_mvamx(lambda, D, N, Z, mi)
12 % @param lambda Arrival rate vector.
13 % @param D Service demand matrix.
14 % @param N Population vector.
15 % @param Z Think time vector.
16 % @param mi Queue replication factors (default: ones).
17 % @return XN System throughput.
18 % @return QN Mean queue lengths.
19 % @return UN Utilization.
20 % @return CN Cycle times.
21 % @return lGN Logarithm of normalizing constant.
22%}
23%}
24function [XN,QN,UN,CN,lGN] = pfqn_mvamx(lambda,D,N,Z, mi)
25% [XN,QN,UN,CN,LGN] = PFQN_MVAMX(LAMBDA,D,N,Z, MI)
26
27[M,R] = size(D);
28if nargin<5 %~exist('mi','var')
29 mi = ones(M,1);
30end
31
32for r = 1:R
33 if lambda(r) > 0 && isfinite(N(r)) && N(r) > 0
34 line_error(mfilename,'Arrival rate cannot be specified on closed classes.');
35 end
36end
37
38openClasses = zeros(1,R);
39closedClasses = zeros(1,R);
40nOpen = 0;
41nClosed = 0;
42for r = 1:R
43 if isinf(N(r))
44 nOpen = nOpen + 1;
45 openClasses(nOpen) = r;
46 else
47 nClosed = nClosed + 1;
48 closedClasses(nClosed) = r;
49 end
50end
51openClasses = openClasses(1:nOpen);
52closedClasses = closedClasses(1:nClosed);
53
54XN = zeros(1,R);
55UN = zeros(M,R);
56CN = zeros(M,R);
57QN = zeros(M,R);
58QNc = zeros(M,0);
59lGN = NaN;
60for ridx=1:nOpen
61 r = openClasses(ridx);
62 for ist=1:M
63 UN(ist,r) = lambda(r)*D(ist,r);
64 end
65 XN(r) = lambda(r);
66end
67
68UNt = sum(UN,2);
69
70if isempty(Z)
71 Z = zeros(1,R);
72end
73
74if nClosed > 0
75 Dc = D(:,closedClasses) ./ (1-repmat(UNt,1,nClosed));
76 [XNc,QNc,~,CNc,lGN] = pfqn_mva(Dc,N(closedClasses),Z(closedClasses),mi);
77 XN(closedClasses) = XNc;
78 QN(:,closedClasses) = QNc;
79 CN(:,closedClasses) = CNc;
80end
81for ist = 1:M
82 for ridx=1:nClosed
83 r = closedClasses(ridx);
84 UN(ist,r) = XN(r)*D(ist,r);
85 end
86end
87for ist = 1:M
88 for ridx=1:nOpen
89 r = openClasses(ridx);
90 if isempty(QNc)
91 CN(ist,r) = D(ist,r) / (1-UNt(ist));
92 else
93 CN(ist,r) = D(ist,r) * (1+sum(QNc(ist,:))) / (1-UNt(ist));
94 end
95 QN(ist,r) = CN(ist,r) * XN(r);
96 end
97end
98end