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