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)
4% This script
is slower than ODE_RATES_STATEINDEP, but allows to have rates
5% that are more complex function of x
9 switch sched_id(i) % source
10 case SchedStrategy.INF
15 for kic = 1 : (Kic(i,c) - 1)
16 for kic_p = 1:Kic(i,c)
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;
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)
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;
51 case SchedStrategy.EXT %EXT
53 line_error(mfilename,
'State dependent ODE method does not support open models. Try with the ''closing'' method.');
55 idxIni = q_indices(i,1);
56 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
57 ni = sum( x(idxIni:idxEnd) );
62 for kic = 1 : (Kic(i,c) - 1)
63 for kic_p = 1:Kic(i,c)
65 rate = PH{i}{c}{1}(kic,kic_p);
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;
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;
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);
92 rate = 1/ni * nservers(i) * rate;
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;
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;
110 for kic = 1 : Kic(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);
122 xic = q_indices(i,c);
123 for kic = 1 : (Kic(i,c) - 1)
124 for kic_p = 1:Kic(i,c)
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;
135 % service completions
138 xic = q_indices(i,c);
141 xjl = q_indices(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;
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;
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));
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) );
175 xic = q_indices(i,c);
176 for kic = 1 : (Kic(i,c) - 1)
177 for kic_p = 1:Kic(i,c)
179 rate = PH{i}{c}{1}(kic,kic_p);
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;
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;
192 % service completions
195 xic = q_indices(i,c);
198 xjl = q_indices(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);
206 rate = w(i,c)/wni * nservers(i) * rate;
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;