1function dx = ode_softmin(x, Phi, Mu, PH, M, K, enabled, q_indices, rt, Kic, nservers, w, sched_id, alpha)
2% RATES = ODE_SOFTMIN(X, M, K, Q_INDICES, KIC, NSERVERS, W, SCHED_ID, ALPHA)
4% Variance of ODE_STATEDEP with softmin function replacing the min function
8 switch sched_id(i) % source
14 for kic = 1 : (Kic(i,c) - 1)
15 for kic_p = 1:Kic(i,c)
17 rate = PH{i}{c}{1}(kic,kic_p);
18 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
19 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate;
33 pie = map_pie(PH{j}{l});
34 if rt((i-1)*K+c,(j-1)*K+l) > 0
35 for kic = 1 : Kic(i,c)
36 for kjl = 1 : Kic(j,l)
38 rate = Phi{i}{c}(kic) * Mu{i}{c}(kic) * rt((i-1)*K+c,(j-1)*K+l) * pie(kjl);
39 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1) * rate;
40 dx(xjl+kjl-1) = dx(xjl+kjl-1) + x(xic+kic-1) * rate;
50 case SchedStrategy.EXT %EXT
51 % For open models, use options.method=
'matrix' or options.method=
'pnorm' instead
52 line_error(mfilename,
'Softmin ODE method does not support open models. Use options.method=''matrix'' or ''pnorm'' instead.');
54 idxIni = q_indices(i,1);
55 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
56 ni = sum( x(idxIni:idxEnd) );
61 for kic = 1 : (Kic(i,c) - 1)
62 for kic_p = 1:Kic(i,c)
64 rate = PH{i}{c}{1}(kic,kic_p);
66 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate* nservers(i) /ni;
67 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate* nservers(i) /ni;
69 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
70 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate;
85 pie = map_pie(PH{j}{l});
86 if rt((i-1)*K+c,(j-1)*K+l) > 0
87 for kic = 1 : Kic(i,c)
88 for kjl = 1 : Kic(j,l)
89 rate = Phi{i}{c}(kic) * Mu{i}{c}(kic) * rt((i-1)*K+c,(j-1)*K+l) * pie(kjl);
91 rate = 1/ni * nservers(i) * rate;
93 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
94 dx(xjl+kjl-1) = dx(xjl+kjl-1) + x(xic+kic-1)*rate;
103 case SchedStrategy.FCFS
104 idxIni = q_indices(i,1);
105 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
106 ni = sum( x(idxIni:idxEnd) );
107 wni = GlobalConstants.FineTol;
109 for kic = 1 : Kic(i,c)
111 xic = q_indices(i,c);
112 w(c,kic) = -1/PH{i}{c}{1}(kic,kic);
113 wni = wni + w(c,kic)*x(xic + kic - 1);
121 xic = q_indices(i,c);
122 for kic = 1 : (Kic(i,c) - 1)
123 for kic_p = 1:Kic(i,c)
125 rate = PH{i}{c}{1}(kic,kic_p);
126 rate = rate * softmin(ni,nservers(i),alpha) * w(c,kic) /wni;
127 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
128 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate;
134 % service completions
137 xic = q_indices(i,c);
140 xjl = q_indices(j,l);
142 pie = map_pie(PH{j}{l});
143 if rt((i-1)*K+c,(j-1)*K+l) > 0
144 for kic = 1 : Kic(i,c)
145 for kjl = 1 : Kic(j,l)
146 rate = Phi{i}{c}(kic) * Mu{i}{c}(kic) * rt((i-1)*K+c,(j-1)*K+l) * pie(kjl);
147 rate = rate * softmin(ni,nservers(i),alpha) * w(c,kic) /wni;
148 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
149 dx(xjl+kjl-1) = dx(xjl+kjl-1) + x(xic+kic-1)*rate;
158 case SchedStrategy.DPS %DPS
159 w(i,:) = w(i,:)/sum(w(i,:));
160 % Compute weighted queue length
for rate normalization
161 wni = GlobalConstants.FineTol;
163 idxIni = q_indices(i,k);
164 idxEnd = q_indices(i,k) + Kic(i,k) - 1;
165 wni = wni + w(i,k) * sum(x(idxIni:idxEnd));
167 % Compute total queue length
for capacity comparison
168 idxIni = q_indices(i,1);
169 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
170 ni = sum( x(idxIni:idxEnd) );
174 xic = q_indices(i,c);
175 for kic = 1 : (Kic(i,c) - 1)
176 for kic_p = 1:Kic(i,c)
178 rate = PH{i}{c}{1}(kic,kic_p);
180 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate* nservers(i) * w(i,c)/wni;
181 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate* nservers(i) * w(i,c)/wni;
183 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
184 dx(xic+kic_p-1) = dx(xic+kic_p-1) + x(xic+kic-1)*rate;
191 % service completions
194 xic = q_indices(i,c);
197 xjl = q_indices(j,l);
199 pie = map_pie(PH{j}{l});
200 if rt((i-1)*K+c,(j-1)*K+l) > 0
201 for kic = 1 : Kic(i,c)
202 for kjl = 1 : Kic(j,l)
203 rate = Phi{i}{c}(kic) * Mu{i}{c}(kic) * rt((i-1)*K+c,(j-1)*K+l) * pie(kjl);
205 rate = w(i,c)/wni * nservers(i) * rate;
207 dx(xic+kic-1) = dx(xic+kic-1) - x(xic+kic-1)*rate;
208 dx(xjl+kjl-1) = dx(xjl+kjl-1) + x(xic+kic-1)*rate;