LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ode_rates_closing.m
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)
3
4rates = x; % basic vector valid for INF and PS case min(ni,nservers(i))=ni
5for i = 1:M
6 switch sched_id(i) % source
7 case SchedStrategy.INF
8 % do nothing
9 case SchedStrategy.EXT %EXT
10 % this is treated by a delay except that we require mass
11 % conservation in the local population
12 for k=1:K
13 idxIni = q_indices(i,k);
14 idxEnd = q_indices(i,k) + Kic(i,k) - 1;
15 if enabled(i,k)
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
17 end
18 end
19 case SchedStrategy.PS
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);
25 end
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);
32 end
33 case SchedStrategy.DPS %DPS
34 w(i,:) = w(i,:)/sum(w(i,:));
35
36 ni = mean(w(i,:));
37 for k=1:K
38 idxIni = q_indices(i,k);
39 idxEnd = q_indices(i,k) + Kic(i,k) - 1;
40 if enabled(i,k)
41 ni = ni + sum( w(i,k)*x(idxIni:idxEnd) );
42 end
43 end
44 for k=1:K
45 idxIni = q_indices(i,k);
46 idxEnd = q_indices(i,k) + Kic(i,k) - 1;
47 if enabled(i,k)
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
49 end
50 end
51 end
52end
53rates = rates(eventIdx);
54rates = rateBase.*rates;
55end
56
57% THIS PART TO BE KEPT AS IT ALLOWS TO MAKE RATES STATE-DEPENDENT
58% function xj = get_index(j,k)
59% XJ = GET_INDEX(J,K)
60
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
65% xj = 1;
66% for z = 1 : (j-1)
67% for y = 1:K
68% xj = xj + Kic(z,y);
69% end
70% end
71% for y = 1:k-1
72% xj = xj + Kic(j,y);
73% end
74%
75% end
76%
77% function rates = ode_rates(x)
78% RATES = ODE_RATES(X)
79
80% rates = [];
81% n = zeros(1,M); % total number of jobs in each station
82% for i = 1:M
83% for c = 1:K
84% xic = q_indices(i,c);
85% n(i) = n(i) + sum( x(xic:xic+Kic(i,c)-1 ) );
86% end
87% if S(i) == sum(N)
88% n(i) = 1;
89% end
90% end
91%
92%
93%
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)
96% if match(i,c)>0
97% xic = q_indices(i,c);
98% for j = 1 : M
99% for l = 1:K
100% if P((i-1)*K+c,(j-1)*K+l) > 0
101% for k = 1:Kic(i,c)
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}
107% else
108% rates = [rates; 0;]; % f_k^{dep}
109% end
110% end
111% end
112% end
113% end
114% end
115% end
116% end
117%
118% for i = 1 : M %transition rates for "next service phase" (phases 2...)
119% for c = 1:K
120% if match(i,c)>0
121% xic = q_indices(i,c);
122% for k = 1 : (Kic(i,c) - 1)
123% if x(xic+k-1) > 0
124% rates = [rates; (1-Phi{i}{c}(k))*Mu{i}{c}(k)*x(xic+k-1)/n(i)];
125% else
126% rates = [rates; 0 ]
127% end
128% end
129% end
130% end
131% end
132%
133% end
134%
135% function d = ode_jumps(x)
136% D = ODE_JUMPS(X)
137
138% d = []; %returns state changes triggered by all the events
139% for i = 1 : M %state changes from departures in service phases 2...
140% for c = 1:K
141% if match(i,c)>0
142% xic = q_indices(i,c);
143% for j = 1 : M
144% for l = 1:K
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
151% d = [d jump;];
152% end
153% end
154% end
155% end
156% end
157% end
158% end
159%
160% for i = 1 : M %state changes from "next service phase" transition in phases 2...
161% for c = 1:K
162% if match(i,c)>0
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;
168% d = [d jump;];
169% end
170% end
171% end
172% end
173% end
174