LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ode_statedep.m
1function dx = ode_statedep(x, Phi, Mu, PH, M, K, enabled, q_indices, rt, Kic, nservers, w, sched_id)
2% RATES = ODE_RATES_STATEDEP(X, M, K, Q_INDICES, KIC, NSERVERS, W, SCHED_ID)
3
4% This script is slower than ODE_RATES_STATEINDEP, but allows to have rates
5% that are more complex function of x
6
7dx = 0*x;
8for i = 1:M
9 switch sched_id(i) % source
10 case SchedStrategy.INF
11 % phase changes
12 for c = 1:K
13 if enabled(i,c)
14 xic = q_indices(i,c);
15 for kic = 1 : (Kic(i,c) - 1)
16 for kic_p = 1:Kic(i,c)
17 if kic ~= kic_p
18 rate = PH{i}{c}{1}(kic,kic_p);
19 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
20 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate;
21 end
22 end
23 end
24 end
25 end
26 % service completions
27 for c = 1:K
28 if enabled(i,c)
29 xic = q_indices(i,c);
30 for j = 1 : M
31 for l = 1:K
32 xjl = q_indices(j,l);
33 if enabled(j,l)
34 pie = map_pie(PH{j}{l});
35 if rt((i-1)*K+c,(j-1)*K+l) > 0
36 for kic = 1 : Kic(i,c)
37 for kjl = 1 : Kic(j,l)
38 if j~=i
39 rate = Phi{i}{c}(kic) * Mu{i}{c}(kic) * rt((i-1)*K+c,(j-1)*K+l) * pie(kjl);
40 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1) * rate;
41 dx(xjl+kjl-1) = dx(xjl+kjl-1) + x(xic+kic-1) * rate;
42 end
43 end
44 end
45 end
46 end
47 end
48 end
49 end
50 end
51 case SchedStrategy.EXT %EXT
52 % todo
53 line_error(mfilename,'State dependent ODE method does not support open models. Try with the ''closing'' method.');
54 case SchedStrategy.PS
55 idxIni = q_indices(i,1);
56 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
57 ni = sum( x(idxIni:idxEnd) );
58 % phase changes
59 for c = 1:K
60 if enabled(i,c)
61 xic = q_indices(i,c);
62 for kic = 1 : (Kic(i,c) - 1)
63 for kic_p = 1:Kic(i,c)
64 if kic ~= kic_p
65 rate = PH{i}{c}{1}(kic,kic_p);
66 if ni > nservers(i)
67 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate* nservers(i) /ni;
68 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate* nservers(i) /ni;
69 else
70 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
71 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate;
72 end
73 end
74 end
75 end
76 end
77 end
78 % service completions
79 for c = 1:K
80 if enabled(i,c)
81 xic = q_indices(i,c);
82 for j = 1 : M
83 for l = 1:K
84 xjl = q_indices(j,l);
85 if enabled(j,l)
86 pie = map_pie(PH{j}{l});
87 if rt((i-1)*K+c,(j-1)*K+l) > 0
88 for kic = 1 : Kic(i,c)
89 for kjl = 1 : Kic(j,l)
90 rate = Phi{i}{c}(kic) * Mu{i}{c}(kic) * rt((i-1)*K+c,(j-1)*K+l) * pie(kjl);
91 if ni > nservers(i)
92 rate = 1/ni * nservers(i) * rate;
93 end
94 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
95 dx(xjl+kjl-1) = dx(xjl+kjl-1) + x(xic+kic-1)*rate;
96 end
97 end
98 end
99 end
100 end
101 end
102 end
103 end
104 case SchedStrategy.FCFS
105 idxIni = q_indices(i,1);
106 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
107 ni = sum( x(idxIni:idxEnd) );
108 wni = GlobalConstants.FineTol;
109 for c=1:K
110 for kic = 1 : Kic(i,c)
111 if enabled(i,c)
112 xic = q_indices(i,c);
113 w(c,kic) = -1/PH{i}{c}{1}(kic,kic);
114 wni = wni + w(c,kic)*x(xic + kic - 1);
115 end
116 end
117 end
118
119 % phase changes
120 for c = 1:K
121 if enabled(i,c)
122 xic = q_indices(i,c);
123 for kic = 1 : (Kic(i,c) - 1)
124 for kic_p = 1:Kic(i,c)
125 if kic ~= kic_p
126 rate = PH{i}{c}{1}(kic,kic_p);
127 rate = rate * min(ni,nservers(i)) * w(c,kic) /wni;
128 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
129 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate;
130 end
131 end
132 end
133 end
134 end
135 % service completions
136 for c = 1:K
137 if enabled(i,c)
138 xic = q_indices(i,c);
139 for j = 1 : M
140 for l = 1:K
141 xjl = q_indices(j,l);
142 if enabled(j,l)
143 pie = map_pie(PH{j}{l});
144 if rt((i-1)*K+c,(j-1)*K+l) > 0
145 for kic = 1 : Kic(i,c)
146 for kjl = 1 : Kic(j,l)
147 rate = Phi{i}{c}(kic) * Mu{i}{c}(kic) * rt((i-1)*K+c,(j-1)*K+l) * pie(kjl);
148 rate = rate * min(ni,nservers(i)) * w(c,kic) /wni;
149 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
150 dx(xjl+kjl-1) = dx(xjl+kjl-1) + x(xic+kic-1)*rate;
151 end
152 end
153 end
154 end
155 end
156 end
157 end
158 end
159 case SchedStrategy.DPS %DPS
160 w(i,:) = w(i,:)/sum(w(i,:));
161 % Compute weighted queue length for rate normalization
162 wni = GlobalConstants.FineTol;
163 for k=1:K
164 idxIni = q_indices(i,k);
165 idxEnd = q_indices(i,k) + Kic(i,k) - 1;
166 wni = wni + w(i,k) * sum(x(idxIni:idxEnd));
167 end
168 % Compute total queue length for capacity comparison
169 idxIni = q_indices(i,1);
170 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
171 ni = sum( x(idxIni:idxEnd) );
172 % phase changes
173 for c = 1:K
174 if enabled(i,c)
175 xic = q_indices(i,c);
176 for kic = 1 : (Kic(i,c) - 1)
177 for kic_p = 1:Kic(i,c)
178 if kic ~= kic_p
179 rate = PH{i}{c}{1}(kic,kic_p);
180 if ni > nservers(i)
181 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate* nservers(i) * w(i,c)/wni;
182 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate* nservers(i) * w(i,c)/wni;
183 else
184 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
185 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate;
186 end
187 end
188 end
189 end
190 end
191 end
192 % service completions
193 for c = 1:K
194 if enabled(i,c)
195 xic = q_indices(i,c);
196 for j = 1 : M
197 for l = 1:K
198 xjl = q_indices(j,l);
199 if enabled(j,l)
200 pie = map_pie(PH{j}{l});
201 if rt((i-1)*K+c,(j-1)*K+l) > 0
202 for kic = 1 : Kic(i,c)
203 for kjl = 1 : Kic(j,l)
204 rate = Phi{i}{c}(kic) * Mu{i}{c}(kic) * rt((i-1)*K+c,(j-1)*K+l) * pie(kjl);
205 if ni > nservers(i)
206 rate = w(i,c)/wni * nservers(i) * rate;
207 end
208 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
209 dx(xjl+kjl-1) = dx(xjl+kjl-1) + x(xic+kic-1)*rate;
210 end
211 end
212 end
213 end
214 end
215 end
216 end
217 end
218 end
219end
220end