1function rates = ode_rates_closing(x, M, K, enabled, q_indices, Kic, nservers, w, sched_id, rateBase, eventIdx)
2% RATES = ODE_RATES_BOTTQ(X, M, K, Q_INDICES, KIC, NSERVERS, W, STRATEGY, RATEBASE, EVENTIDX)
4rates = x; % basic vector valid
for INF and PS
case min(ni,nservers(i))=ni
6 switch sched_id(i) % source
9 case SchedStrategy.EXT %EXT
10 %
this is treated by a delay except that we require mass
11 % conservation in the local population
13 idxIni = q_indices(i,k);
14 idxEnd = q_indices(i,k) + Kic(i,k) - 1;
16 rates(idxIni) = 1-sum(x(idxIni+1:idxEnd)); % keep total mass 1 into the source
for all
classes at all times, not needed
for idxIni+1:idxEnd as rates
is initialized equal to x
20 idxIni = q_indices(i,1);
21 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
22 ni = sum( x(idxIni:idxEnd) );
23 if ni > nservers(i) %
case min = ni handled by rates = x
24 rates(idxIni:idxEnd) = x(idxIni:idxEnd)/ni * nservers(i);
26 case SchedStrategy.FCFS
27 idxIni = q_indices(i,1);
28 idxEnd = q_indices(i,K) + Kic(i,K) - 1;
29 ni = sum( x(idxIni:idxEnd) );
30 if ni > nservers(i) %
case min = ni handled by rates = x
31 rates(idxIni:idxEnd) = x(idxIni:idxEnd)/ni * nservers(i);
33 case SchedStrategy.DPS %DPS
34 w(i,:) = w(i,:)/sum(w(i,:));
38 idxIni = q_indices(i,k);
39 idxEnd = q_indices(i,k) + Kic(i,k) - 1;
41 ni = ni + sum( w(i,k)*x(idxIni:idxEnd) );
45 idxIni = q_indices(i,k);
46 idxEnd = q_indices(i,k) + Kic(i,k) - 1;
48 rates(idxIni:idxEnd) = w(i,k)*x(idxIni:idxEnd)/ni * nservers(i); % not needed
for idxIni+1:idxEnd as rates
is initiliazed equal to x
53rates = rates(eventIdx);
54rates = rateBase.*rates;
57% THIS PART TO BE KEPT AS IT ALLOWS TO MAKE RATES STATE-DEPENDENT
58% function xj = get_index(j,k)
61% % n
is the state vector
62% % j
is the queue station index
63% % k
is the
class index
64% % RETURNS THE INDEX of the queue-length element xi! % in the state description
77% function rates = ode_rates(x)
81% n = zeros(1,M); % total number of jobs in each station
84% xic = q_indices(i,c);
85% n(i) = n(i) + sum( x(xic:xic+Kic(i,c)-1 ) );
94%
for i = 1 : M %transition rates
for departures from any station to any other station
95%
for c = 1:K %considers only transitions from the first service phase (enough
for exp servers)
97% xic = q_indices(i,c);
100%
if P((i-1)*K+c,(j-1)*K+l) > 0
102% %pure ps + fcfs correction
103%
if x(xic+k-1) > 0 && n(i) > S(i)
104% rates = [rates; Phi{i}{c}(k) *
P((i-1)*K+c,(j-1)*K+l) * Mu{i}{c}(k) * x(xic+k-1)/n(i) * S(i);]; % f_k^{dep}
105% elseif x(xic+k-1) > 0
106% rates = [rates; Phi{i}{c}(k) *
P((i-1)*K+c,(j-1)*K+l) * Mu{i}{c}(k) * x(xic+k-1);]; % f_k^{dep}
108% rates = [rates; 0;]; % f_k^{dep}
118%
for i = 1 : M %transition rates
for "next service phase" (phases 2...)
121% xic = q_indices(i,c);
122%
for k = 1 : (Kic(i,c) - 1)
124% rates = [rates; (1-Phi{i}{c}(k))*Mu{i}{c}(k)*x(xic+k-1)/n(i)];
135% function d = ode_jumps(x)
138% d = []; %returns state changes triggered by all the events
139%
for i = 1 : M %state changes from departures in service phases 2...
142% xic = q_indices(i,c);
145%
if P((i-1)*K+c,(j-1)*K+l) > 0
146% xjl = q_indices(j,l);
147%
for k = 1 : Kic(i,c)
148% jump = zeros(length(x),1);
149% jump(xic) = jump(xic) - 1; %type c in stat i completes service
150% jump(xjl) = jump(xjl) + 1; %type c job starts in stat j
160%
for i = 1 : M %state changes from
"next service phase" transition in phases 2...
163% xic = q_indices(i,c);
164%
for k = 1 : (Kic(i,c) - 1)
165% jump = zeros(length(x),1);
166% jump(xic+k-1) = jump(xic+k-1) - 1;
167% jump(xic+k) = jump(xic+k) + 1;