LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
infer_gibbs.m
1function demand = infer_gibbs(data,nbCores,tol)
2
3if exist('tol','var') == 0
4 tol = 10^-3;
5end
6
7alg = 'TE'; % or MCI
8
9data_needed = 200000;
10likelihood_sample = 5000;
11nbSamples = 2000;
12
13nbClasses = size(data,2)-1;
14nbNodes = 2;
15nbJobs = zeros(1,nbClasses);
16[prob, nbJobs, N0] = analyseData(data, nbJobs, nbClasses, nbNodes, data_needed);
17
18usedCores = 0;
19for k = 1:size(prob,1)
20 if (sum(prob(k,nbClasses+1:nbClasses*2)) > nbCores)
21 usedCores = usedCores + nbCores*prob(k,end);
22 else
23 usedCores = usedCores + sum(prob(k,nbClasses+1:nbClasses*2))*prob(k,end);
24 end
25end
26usedCores = usedCores/(1-prob(end,end));
27
28think_time = zeros(1,nbClasses);
29for k = 1:nbClasses
30 think_time(k) = (nbJobs(k)-N0(k))/mean(data{6,k});
31end
32
33range_size = ones(1,nbClasses*(nbNodes-1));
34
35% see _kb/03-api-layer.md for rationale
36
37cum_prob = cumsum(prob(:,nbClasses*nbNodes+1));
38testset = zeros(likelihood_sample,nbClasses*nbNodes);
39for k = 1:likelihood_sample
40 uni_value = rand(1);
41 index = find(uni_value<cum_prob);
42 testset(k,:) = prob(index(1),1:(nbClasses*nbNodes));
43end
44
45LV(1) = 0; %log(0!)
46LV(2) = 0; %log(1!)
47for k = 3:sum(nbJobs)+1
48 LV(k) = LV(k-1)+log(k-1);
49end
50
51A=feval(@(x) LV(x+1), testset);
52sumA = sum(A(:));
53
54initial = zeros(1,nbClasses*nbNodes-nbClasses);
55
56logG_initial = sum(nbJobs.*log(think_time));
57for k = 1:nbClasses
58 logG_initial = logG_initial - sum(log(1:nbJobs(k)));
59end
60
61smpl = zeros(nbSamples,nbClasses*(nbNodes-1));
62sample_index = 0;
63
64for k = 1:round(nbSamples/50)
65 for s = 1:50
66 sample_index = sample_index + 1;
67 for h = 1:nbClasses*(nbNodes-1)
68 if sample_index==1
69 theta = [smpl(sample_index,1:h-1),initial(h:end)];
70 else
71 theta = [smpl(sample_index,1:h-1),smpl(sample_index-1,h:end)];
72 end
73
74 [smpl(sample_index,h), logG_initial, range_size_dim]= gibbsSamplerSimple(alg,think_time,theta,testset,h,nbNodes,nbClasses,nbJobs,logG_initial,tol,range_size(h),LV,sumA);
75
76 range_size(h) = range_size_dim*2;
77
78 end
79 end
80
81 if k == 2
82 demand_old = mean(smpl(51:sample_index,:));
83 elseif k > 2
84 demand_now = mean(smpl((k-1)*50+1:sample_index,:));
85 demand_now = demand_now/(k+1)+demand_old/(k+1)*k;
86 if mean(abs((demand_now-demand_old)./demand_old)) < tol
87 nbSample = sample_index-1;
88 N = round(nbSample/2)+1;
89 demand = mean(smpl(N:nbSample,:)*usedCores);
90 return
91 else
92 demand_old = demand_now;
93 end
94 end
95
96end
97nbSample = sample_index-1;
98N = round(nbSample/2)+1;
99demand = mean(smpl(N:nbSample,:)*usedCores);
100
101end
102
103function [prob_nbCustomer, N, N0] = analyseData( data, nbJobs, nbClasses, nbNodes, data_needed)
104
105%number of customer classes, start from 1.
106K = nbClasses;
107
108%total number of jobs in the system
109N = nbJobs;
110N0 = zeros(1,K);
111
112tempTS=[];
113tempClass=[];
114tempLogger=[];
115for i = 1:K
116 temp_length = size(data{3,i},1);
117 tempTS = [tempTS;data{3,i};data{3,i}+data{4,i}*1000];
118 tempClass = [tempClass;ones(temp_length*2,1)*i];
119 tempLogger = [tempLogger;ones(temp_length,1);ones(temp_length,1)*2];
120end
121
122[ts index] = sort(tempTS);
123class_id = tempClass(index);
124logger_id = tempLogger(index);
125
126burnin = length(ts)-data_needed;
127
128if burnin < 0 || data_needed == 0
129 burnin = 1;
130end
131
132%Initialise
133total_length = length(ts);
134count = zeros(total_length,K,nbNodes); %number of customers in the queue, start from time 0
135count(1,:,1) = N; %initialise delay center with N jobs
136
137% serial
138for i = 1:total_length-1
139 count(i+1,:,:) = count(i,:,:);
140 count(i+1,:,:) = count(i,:,:);
141
142 count(i+1,class_id(i),logger_id(i)) = count(i,class_id(i),logger_id(i))-1;
143
144 if logger_id(i) == nbNodes
145 count(i+1,class_id(i),1) = count(i,class_id(i),1)+1;
146 else
147 count(i+1,class_id(i),logger_id(i)+1) = count(i,class_id(i),logger_id(i)+1)+1;
148 end
149end
150
151if sum(N) == 0
152 for i = 1:K
153 N(i) = max(max(count(:,i,:)));
154 end
155end
156
157for i = 1:total_length
158 for j = 1:K
159 count(i,j,1) = count(i,j,1) + N(j);
160 end
161end
162
163
164% parallel
165% for i = 1:total_length-1
166% count(i+1,:,:) = count(i,:,:);
167%
168% if logger_id(i) < 5
169% count(i+1,class_id(i),1) = count(i,class_id(i),1)-1;
170% count(i+1,class_id(i),logger_id(i)+1) = count(i,class_id(i),logger_id(i)+1)+1;
171% end
172%
173% if logger_id(i) > 5
174% count(i+1,class_id(i),1) = count(i,class_id(i),1)+1;
175% count(i+1,class_id(i),logger_id(i)-9) = count(i,class_id(i),logger_id(i)-9)-1;
176% end
177%
178% end
179
180count = reshape(count,total_length,nbClasses*nbNodes);
181
182%calculate the interval between each timestamp
183%time_interval(1) = ts(1);
184time_interval(1) = 0;
185time_interval(2:total_length) = diff(ts);
186
187count(:,end+1) = time_interval';
188count = count(burnin:end,:);
189
190count = sortrows(count,[1:size(count,2)-1]);
191
192[C ia ic] = unique(count(:,1:end-1),'rows','legacy');
193
194%the first one
195Time = C;
196Time(1,end+1) = sum(count(1:ia(1),end));
197for i =2:size(C,1)
198 Time(i,end) = sum(count(ia(i-1)+1:ia(i),end));
199end
200
201%observed time period
202obs_length = ts(end)-ts(burnin);
203%calculate the probability
204prob_nbCustomer = Time;
205prob_nbCustomer(:,end) = prob_nbCustomer(:,end)/obs_length;
206
207for i = 1:K
208 N0(i) = sum(prob_nbCustomer(:,end).*prob_nbCustomer(:,K+i));
209end
210end
211
212function [value, logG_current, range_size_dim] = gibbsSamplerSimple(alg,think_time,theta,testset,index,nbNodes,nbClasses,nbJobs,logG_initial,interval,range_size,LV,sumA)
213
214range = (0:interval:range_size);
215N = length(range);
216
217if strcmp(alg,'TE')
218 x = zeros(nbNodes,nbClasses);
219 x(1,:) = think_time;
220 for i = 1:nbNodes-1
221 x(i+1,:) = theta(i*nbClasses+1-nbClasses:i*nbClasses);
222 end
223
224 index_i = floor((index-1)/nbClasses)+2;
225 index_j = index-(index_i-2)*nbClasses;
226
227 logG = zeros(1,N);
228
229 [~,QN]=pfqn_bs(x(2:end,:),nbJobs,x(1,:));
230
231 index_previous = find(range==theta(index));
232 logG(index_previous) = logG_initial;
233
234 for i = index_previous-1:-1:1
235 x(index_i,index_j) = range(i+1);
236 %[~,QN]=aql(x(2:end,:),nbJobs,x(1,:),interval);
237 [~,QN]=pfqn_bs(x(2:end,:),nbJobs,x(1,:),interval,1000,QN);
238 if 1+QN(index_i-1,index_j)/(range(i+1)+eps)*-interval < 0
239 logG(i) = logG(i+1);
240 else
241 logG(i) = logG(i+1) + log(1+QN(index_i-1,index_j)/(range(i+1)+eps)*-interval);
242 end
243 end
244
245 x(index_i,index_j) = theta(index);
246 [~,QN]=pfqn_bs(x(2:end,:),nbJobs,x(1,:));
247
248 for i = index_previous+1:N
249 x(index_i,index_j) = range(i-1);
250 %[~,QN]=aql(x(2:end,:),nbJobs,x(1,:),interval);
251 [~,QN]=pfqn_bs(x(2:end,:),nbJobs,x(1,:),interval,1000,QN);
252 if 1+QN(index_i-1,index_j)/(range(i-1)+eps)*interval < 0
253 logG(i) = logG(i-1);
254 else
255 logG(i) = logG(i-1) + log(1+QN(index_i-1,index_j)/(range(i-1)+eps)*interval);
256 end
257 end
258end
259
260log_prob = zeros(1,N);
261for i = 1:N
262 theta(index) = range(i);
263 if strcmp(alg,'TE')
264 log_prob(i) = sum(testset(:,index+nbClasses))*log(range(i))-logG(i)*size(testset,1);
265 %log_prob(i) = pdf_slice(alg,method,interval,tol,theta,nbJobs,think_time,testset,nbClasses,nbNodes,LV,sumA,logG(i));
266 end
267 if strcmp(alg,'MCI')
268 log_prob(i) = pdf_slice(alg,interval,theta,nbJobs,think_time,testset,nbClasses,nbNodes,LV,sumA);
269 end
270end
271log_prob = log_prob-max(log_prob);
272
273prob = exp(log_prob);
274prob = prob/sum(prob);
275
276cum_prob = cumsum(prob);
277rand_variable = rand(1);
278index_prob = find(rand_variable<cum_prob);
279
280% if strcmp(alg,'TE')
281range_size_dim = find(cum_prob > 1-1e-10, 1, 'first');
282range_size_dim = range(range_size_dim)*2;
283% see _kb/03-api-layer.md for rationale
284
285if isempty(index_prob)
286 value = theta(index);
287 if strcmp(alg,'TE')
288 logG_current = logG_initial;
289 end
290else
291 value = range(index_prob(1));
292 if strcmp(alg,'TE')
293 logG_current = logG(index_prob(1));
294 end
295end
296
297if strcmp(alg,'MCI')
298 logG_current = 0;
299end
300end
301
302function [result] = pdf_slice(alg,interval,theta,nbJobs,think_time,testset,nbClasses,nbNodes,LV,sumA,logG)
303
304if sum(theta < 0) > 0
305 result = -inf;
306 return;
307end
308
309theta = reshape(theta,nbClasses,nbNodes-1)';
310
311if strcmp(alg,'TE') && exist('logG','var') == 0
312 logG = approLogG([think_time;theta],nbJobs,interval);
313end
314%logG = log(pfqn_ca(theta,nbJobs,think_time));
315
316result = 0;
317n_node = zeros(size(testset,1),nbNodes);
318for j = 2:nbNodes
319 n_node(:,j) = sum(testset(:, nbClasses*j-nbClasses+1:nbClasses*j),2);
320end
321B=feval(@(x) LV(x+1), n_node(:,2:nbNodes));
322result = result + sum(B(:));
323
324y = [log(think_time+eps);log(theta+eps)];
325temp = reshape(y',nbClasses*nbNodes,1);
326
327result = result + sum(testset*temp);
328
329result = result - logG*size(testset,1);
330
331result = result - sumA;
332end