LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
sn_deaggregate_chain_results.m
1%{ @file sn_deaggregate_chain_results.m
2 % @brief Deaggregates chain-level performance metrics to class-level metrics
3 %
4 % @author LINE Development Team
5%}
6
7%{
8 % @brief Deaggregates chain-level performance metrics to class-level metrics
9 %
10 % @details
11 % This function converts chain-level performance metrics (queue lengths,
12 % utilizations, response times, throughputs) to class-level metrics using
13 % aggregation factors.
14 %
15 % @par Syntax:
16 % @code
17 % [Q,U,R,T,C,X] = sn_deaggregate_chain_results(sn, Lchain, ST, STchain, Vchain, alpha, Qchain, Uchain, Rchain, Tchain, Cchain, Xchain)
18 % @endcode
19 %
20 % @par Parameters:
21 % <table>
22 % <tr><th>Name<th>Description
23 % <tr><td>sn<td>Network structure
24 % <tr><td>Lchain<td>Chain demands
25 % <tr><td>ST<td>Class service times
26 % <tr><td>STchain<td>Chain service times
27 % <tr><td>Vchain<td>Chain visits
28 % <tr><td>alpha<td>Aggregation factors mapping classes to chains
29 % <tr><td>Qchain<td>Chain queue lengths
30 % <tr><td>Uchain<td>Chain utilizations
31 % <tr><td>Rchain<td>Chain response times
32 % <tr><td>Tchain<td>Chain throughputs
33 % <tr><td>Cchain<td>Chain system response times
34 % <tr><td>Xchain<td>Chain system throughputs
35 % </table>
36 %
37 % @par Returns:
38 % <table>
39 % <tr><th>Name<th>Description
40 % <tr><td>Q<td>Class queue lengths
41 % <tr><td>U<td>Class utilizations
42 % <tr><td>R<td>Class response times
43 % <tr><td>T<td>Class throughputs
44 % <tr><td>C<td>Class system response times
45 % <tr><td>X<td>Class system throughputs
46 % </table>
47%}
48function [Q,U,R,T,C,X] = sn_deaggregate_chain_results(sn, Lchain, ST, STchain, Vchain, alpha, Qchain, Uchain, Rchain, Tchain, Cchain, Xchain)
49
50if isempty(ST)
51 ST = 1 ./ sn.rates;
52 ST(isnan(ST))=0;
53end
54
55if ~isempty(Cchain)
56 error('Cchain input to sn_deaggregate_chain_results not yet supported');
57end
58
59Vsink = cellsum(sn.nodevisits);
60Vsink = Vsink(sn.nodetype==NodeType.Sink,:);
61
62S = sn.nservers;
63%mu = sn.lldscaling;
64%gamma = sn.cdscaling;
65
66for c=1:sn.nchains
67 inchain = sn.inchain{c};
68 for k=inchain(:)'
69 if isinf(sum(sn.njobs(inchain)))
70 % open chain
71 X(k) = Xchain(c) * Vsink(k);
72 else
73 X(k) = Xchain(c) * alpha(sn.refstat(k),k);
74 end
75 for i=1:sn.nstations
76 if isempty(Uchain)
77 if isinf(S(i))
78 U(i,k) = ST(i,k) * (Xchain(c) * Vchain(i,c) / Vchain(sn.refstat(k),c)) * alpha(i,k);
79 else
80 U(i,k) = ST(i,k) * (Xchain(c) * Vchain(i,c) / Vchain(sn.refstat(k),c)) * alpha(i,k) / S(i);
81 end
82 else
83 if isinf(S(i))
84 U(i,k) = ST(i,k) * (Xchain(c) * Vchain(i,c) / Vchain(sn.refstat(k),c)) * alpha(i,k);
85 else
86 U(i,k) = Uchain(i,c) * alpha(i,k);
87 end
88 end
89 if Lchain(i,c) > 0
90 if ~isempty(Qchain)
91 Q(i,k) = Qchain(i,c) * alpha(i,k);
92 else
93 Q(i,k) = Rchain(i,c) * ST(i,k) / STchain(i,c) * Xchain(c) * Vchain(i,c) / Vchain(sn.refstat(k),c) * alpha(i,k);
94 end
95 T(i,k) = Tchain(i,c) * alpha(i,k);
96 R(i,k) = Q(i,k) / T(i,k);
97 %R(i,k) = Rchain(i,c) * ST(i,k) / STchain(i,c) * alpha(i,k) / sum(alpha(sn.refstat(k),inchain)');
98 else
99 T(i,k) = 0;
100 R(i,k) = 0;
101 Q(i,k) = 0;
102 end
103 end
104 C(k) = sn.njobs(k) / X(k);
105 end
106end
107
108Q=abs(Q);
109R=abs(R);
110X=abs(X);
111U=abs(U);
112T=abs(T);
113C=abs(C);
114T(~isfinite(T))=0;
115U(~isfinite(U))=0;
116Q(~isfinite(Q))=0;
117R(~isfinite(R))=0;
118X(~isfinite(X))=0;
119C(~isfinite(C))=0;
120
121end