LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ode_softmin.m
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)
3
4% Variance of ODE_STATEDEP with softmin function replacing the min function
5
6dx = 0*x;
7for i = 1:M
8 switch sched_id(i) % source
9 case SchedStrategy.INF
10 % phase changes
11 for c = 1:K
12 if enabled(i,c)
13 xic = q_indices(i,c);
14 for kic = 1 : (Kic(i,c) - 1)
15 for kic_p = 1:Kic(i,c)
16 if kic ~= kic_p
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;
20 end
21 end
22 end
23 end
24 end
25 % service completions
26 for c = 1:K
27 if enabled(i,c)
28 xic = q_indices(i,c);
29 for j = 1 : M
30 for l = 1:K
31 xjl = q_indices(j,l);
32 if enabled(j,l)
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)
37 if j~=i
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;
41 end
42 end
43 end
44 end
45 end
46 end
47 end
48 end
49 end
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.');
53 case SchedStrategy.PS
54 idxIni = q_indices(i,1);
55 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
56 ni = sum( x(idxIni:idxEnd) );
57 % phase changes
58 for c = 1:K
59 if enabled(i,c)
60 xic = q_indices(i,c);
61 for kic = 1 : (Kic(i,c) - 1)
62 for kic_p = 1:Kic(i,c)
63 if kic ~= kic_p
64 rate = PH{i}{c}{1}(kic,kic_p);
65 if ni > nservers(i)
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;
68 else
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;
71 end
72 end
73 end
74 end
75 end
76 end
77 % service completions
78 for c = 1:K
79 if enabled(i,c)
80 xic = q_indices(i,c);
81 for j = 1 : M
82 for l = 1:K
83 xjl = q_indices(j,l);
84 if enabled(j,l)
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);
90 if ni > nservers(i)
91 rate = 1/ni * nservers(i) * rate;
92 end
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;
95 end
96 end
97 end
98 end
99 end
100 end
101 end
102 end
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;
108 for c=1:K
109 for kic = 1 : Kic(i,c)
110 if enabled(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);
114 end
115 end
116 end
117
118 % phase changes
119 for c = 1:K
120 if enabled(i,c)
121 xic = q_indices(i,c);
122 for kic = 1 : (Kic(i,c) - 1)
123 for kic_p = 1:Kic(i,c)
124 if kic ~= kic_p
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;
129 end
130 end
131 end
132 end
133 end
134 % service completions
135 for c = 1:K
136 if enabled(i,c)
137 xic = q_indices(i,c);
138 for j = 1 : M
139 for l = 1:K
140 xjl = q_indices(j,l);
141 if enabled(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;
150 end
151 end
152 end
153 end
154 end
155 end
156 end
157 end
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;
162 for k=1:K
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));
166 end
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) );
171 % phase changes
172 for c = 1:K
173 if enabled(i,c)
174 xic = q_indices(i,c);
175 for kic = 1 : (Kic(i,c) - 1)
176 for kic_p = 1:Kic(i,c)
177 if kic ~= kic_p
178 rate = PH{i}{c}{1}(kic,kic_p);
179 if ni > nservers(i)
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;
182 else
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;
185 end
186 end
187 end
188 end
189 end
190 end
191 % service completions
192 for c = 1:K
193 if enabled(i,c)
194 xic = q_indices(i,c);
195 for j = 1 : M
196 for l = 1:K
197 xjl = q_indices(j,l);
198 if enabled(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);
204 if ni > nservers(i)
205 rate = w(i,c)/wni * nservers(i) * rate;
206 end
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;
209 end
210 end
211 end
212 end
213 end
214 end
215 end
216 end
217 end
218end
219end