LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
sn_get_demands_chain.m
1%{ @file sn_get_demands_chain.m
2 % @brief Computes aggregated demand parameters per chain
3 %
4 % @author LINE Development Team
5%}
6
7%{
8 % @brief Computes aggregated demand parameters per chain
9 %
10 % @details
11 % This function aggregates class-level service demands and related parameters
12 % to chain-level parameters, computing total demands, service times, visits,
13 % and aggregation factors.
14 %
15 % @par Syntax:
16 % @code
17 % [Lchain,STchain,Vchain,alpha,Nchain,SCVchain,refstatchain] = sn_get_demands_chain(sn)
18 % @endcode
19 %
20 % @par Parameters:
21 % <table>
22 % <tr><th>Name<th>Description
23 % <tr><td>sn<td>Network structure
24 % </table>
25 %
26 % @par Returns:
27 % <table>
28 % <tr><th>Name<th>Description
29 % <tr><td>Lchain<td>Total service demand per station per chain
30 % <tr><td>STchain<td>Mean service time per station per chain
31 % <tr><td>Vchain<td>Mean number of visits per station per chain
32 % <tr><td>alpha<td>Aggregation factors mapping classes to chains
33 % <tr><td>Nchain<td>Population of each chain
34 % <tr><td>SCVchain<td>Squared coefficient of variation of service times per station per chain
35 % <tr><td>refstatchain<td>Reference station index for each chain
36 % </table>
37%}
38function [Lchain,STchain,Vchain,alpha,Nchain,SCVchain,refstatchain] = sn_get_demands_chain(sn)
39M = sn.nstations; %number of stations
40%K = sn.nclasses; %number of classes
41C = sn.nchains;
42N = sn.njobs'; % initial population per class
43
44%PH = sn.proc;
45SCV = sn.scv;
46SCV(isnan(SCV))=1;
47% determine service times
48ST = 1./sn.rates;
49ST(isnan(ST))=0;
50
51alpha = zeros(sn.nstations,sn.nclasses);
52Vchain = zeros(sn.nstations,sn.nchains);
53for c=1:sn.nchains
54 inchain = sn.inchain{c};
55 if sn.refclass(c)>0 % if the model has a ref class
56 for i=1:sn.nstations
57 Vchain(i,c) = sum(sn.visits{c}(sn.stationToStateful(i),inchain)) / sum(sn.visits{c}(sn.stationToStateful(sn.refstat(inchain(1))),sn.refclass(c)));
58 for k=inchain
59 alpha(i,k) = alpha(i,k) + sn.visits{c}(sn.stationToStateful(i),k) / sum(sn.visits{c}(sn.stationToStateful(i),inchain));
60 end
61 end
62 else
63 for i=1:sn.nstations
64 Vchain(i,c) = sum(sn.visits{c}(sn.stationToStateful(i),inchain)) / sum(sn.visits{c}(sn.stationToStateful(sn.refstat(inchain(1))),inchain));
65 for k=inchain
66 alpha(i,k) = alpha(i,k) + sn.visits{c}(sn.stationToStateful(i),k) / sum(sn.visits{c}(sn.stationToStateful(i),inchain));
67 end
68 end
69 end
70end
71
72Vchain(~isfinite(Vchain))=0;
73for c=1:sn.nchains
74 inchain = sn.inchain{c};
75 Vchain(:,c) = Vchain(:,c) / Vchain(sn.refstat(inchain(1)),c);
76end
77alpha(~isfinite(alpha))=0;
78alpha(alpha<GlobalConstants.Zero)=0;
79
80Lchain = zeros(M,C);
81STchain = zeros(M,C);
82SCVchain = zeros(1,C);
83Nchain = zeros(1,C);
84refstatchain = zeros(C,1);
85for c=1:sn.nchains
86 inchain = sn.inchain{c};
87 Nchain(c) = sum(N(inchain));
88 isOpenChain = any(isinf(N(inchain)));
89 for i=1:sn.nstations
90 % we assume that the visits in L(i,inchain) are equal to 1
91 STchain(i,c) = ST(i,inchain) * alpha(i,inchain)';
92 if isOpenChain && i == sn.refstat(inchain(1)) % if this is a source ST = 1 / arrival rates
93 STchain(i,c) = 1 / sumfinite(sn.rates(i,inchain)); % ignore degenerate classes with zero arrival rates
94 else
95 STchain(i,c) = ST(i,inchain) * alpha(i,inchain)';
96 end
97 Lchain(i,c) = Vchain(i,c) * STchain(i,c);
98 alphachain = sum(alpha(i,inchain(isfinite(SCV(i,inchain))))');
99 if alphachain>0
100 SCVchain(i,c) = SCV(i,inchain) * alpha(i,inchain)' / alphachain;
101 end
102 end
103 refstatchain(c) = sn.refstat(inchain(1));
104 if any((sn.refstat(inchain(1))-refstatchain(c))~=0)
105 line_error(mfilename,sprintf('Classes in chain %d have different reference station.',c));
106 end
107end
108Lchain(~isfinite(Lchain))=0;
109STchain(~isfinite(STchain))=0;
110end