1function demand = infer_gibbs(data,nbCores,tol)
3if exist(
'tol',
'var') == 0
10likelihood_sample = 5000;
13nbClasses = size(data,2)-1;
15nbJobs = zeros(1,nbClasses);
16[prob, nbJobs, N0] = analyseData(data, nbJobs, nbClasses, nbNodes, data_needed);
20 if (sum(prob(k,nbClasses+1:nbClasses*2)) > nbCores)
21 usedCores = usedCores + nbCores*prob(k,end);
23 usedCores = usedCores + sum(prob(k,nbClasses+1:nbClasses*2))*prob(k,end);
26usedCores = usedCores/(1-prob(end,end));
28think_time = zeros(1,nbClasses);
30 think_time(k) = (nbJobs(k)-N0(k))/mean(data{6,k});
33range_size = ones(1,nbClasses*(nbNodes-1));
36%
for k = 1:size(prob,1)
37% testset = [testset; repmat(prob(k,1:(nbClasses*nbNodes)),round(prob(k,end)*likelihood_sample),1)];
40cum_prob = cumsum(prob(:,nbClasses*nbNodes+1));
41testset = zeros(likelihood_sample,nbClasses*nbNodes);
42for k = 1:likelihood_sample
44 index = find(uni_value<cum_prob);
45 testset(k,:) = prob(index(1),1:(nbClasses*nbNodes));
50for k = 3:sum(nbJobs)+1
51 LV(k) = LV(k-1)+log(k-1);
54A=feval(@(x) LV(x+1), testset);
57initial = zeros(1,nbClasses*nbNodes-nbClasses);
59logG_initial = sum(nbJobs.*log(think_time));
61 logG_initial = logG_initial - sum(log(1:nbJobs(k)));
64smpl = zeros(nbSamples,nbClasses*(nbNodes-1));
67for k = 1:round(nbSamples/50)
69 sample_index = sample_index + 1;
70 for h = 1:nbClasses*(nbNodes-1)
72 theta = [smpl(sample_index,1:h-1),initial(h:end)];
74 theta = [smpl(sample_index,1:h-1),smpl(sample_index-1,h:end)];
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);
79 range_size(h) = range_size_dim*2;
85 demand_old = mean(smpl(51:sample_index,:));
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);
95 demand_old = demand_now;
100nbSample = sample_index-1;
101N = round(nbSample/2)+1;
102demand = mean(smpl(N:nbSample,:)*usedCores);
106function [prob_nbCustomer, N, N0] = analyseData( data, nbJobs, nbClasses, nbNodes, data_needed)
108%number of customer
classes, start from 1.
111%total number of jobs in the system
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];
125[ts index] = sort(tempTS);
126class_id = tempClass(index);
127logger_id = tempLogger(index);
129burnin = length(ts)-data_needed;
131if burnin < 0 || data_needed == 0
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
141for i = 1:total_length-1
142 count(i+1,:,:) = count(i,:,:);
143 count(i+1,:,:) = count(i,:,:);
145 count(i+1,class_id(i),logger_id(i)) = count(i,class_id(i),logger_id(i))-1;
147 if logger_id(i) == nbNodes
148 count(i+1,class_id(i),1) = count(i,class_id(i),1)+1;
150 count(i+1,class_id(i),logger_id(i)+1) = count(i,class_id(i),logger_id(i)+1)+1;
156 N(i) = max(max(count(:,i,:)));
160for i = 1:total_length
162 count(i,j,1) = count(i,j,1) + N(j);
168%
for i = 1:total_length-1
169% count(i+1,:,:) = count(i,:,:);
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;
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;
183count = reshape(count,total_length,nbClasses*nbNodes);
185%calculate the interval between each timestamp
186%time_interval(1) = ts(1);
188time_interval(2:total_length) = diff(ts);
190count(:,end+1) = time_interval
';
191count = count(burnin:end,:);
193count = sortrows(count,[1:size(count,2)-1]);
195[C ia ic] = unique(count(:,1:end-1),'rows
','legacy
');
199Time(1,end+1) = sum(count(1:ia(1),end));
201 Time(i,end) = sum(count(ia(i-1)+1:ia(i),end));
205obs_length = ts(end)-ts(burnin);
206%calculate the probability
207prob_nbCustomer = Time;
208prob_nbCustomer(:,end) = prob_nbCustomer(:,end)/obs_length;
211 N0(i) = sum(prob_nbCustomer(:,end).*prob_nbCustomer(:,K+i));
215function [value, logG_current, range_size_dim] = gibbsSamplerSimple(alg,think_time,theta,testset,index,nbNodes,nbClasses,nbJobs,logG_initial,interval,range_size,LV,sumA)
217range = (0:interval:range_size);
221 x = zeros(nbNodes,nbClasses);
224 x(i+1,:) = theta(i*nbClasses+1-nbClasses:i*nbClasses);
227 index_i = floor((index-1)/nbClasses)+2;
228 index_j = index-(index_i-2)*nbClasses;
232 [~,QN]=pfqn_bs(x(2:end,:),nbJobs,x(1,:));
234 index_previous = find(range==theta(index));
235 logG(index_previous) = logG_initial;
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
244 logG(i) = logG(i+1) + log(1+QN(index_i-1,index_j)/(range(i+1)+eps)*-interval);
248 x(index_i,index_j) = theta(index);
249 [~,QN]=pfqn_bs(x(2:end,:),nbJobs,x(1,:));
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
258 logG(i) = logG(i-1) + log(1+QN(index_i-1,index_j)/(range(i-1)+eps)*interval);
263log_prob = zeros(1,N);
265 theta(index) = range(i);
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));
271 log_prob(i) = pdf_slice(alg,interval,theta,nbJobs,think_time,testset,nbClasses,nbNodes,LV,sumA);
274log_prob = log_prob-max(log_prob);
277prob = prob/sum(prob);
279cum_prob = cumsum(prob);
280rand_variable = rand(1);
281index_prob = find(rand_variable<cum_prob);
284range_size_dim = find(cum_prob > 1-1e-10, 1, 'first
');
285range_size_dim = range(range_size_dim)*2;
287% if strcmp(alg,'MCI
')
291if isempty(index_prob)
292 value = theta(index);
294 logG_current = logG_initial;
297 value = range(index_prob(1));
299 logG_current = logG(index_prob(1));
308function [result] = pdf_slice(alg,interval,theta,nbJobs,think_time,testset,nbClasses,nbNodes,LV,sumA,logG)
315theta = reshape(theta,nbClasses,nbNodes-1)';
317if strcmp(alg,
'TE') && exist(
'logG',
'var') == 0
318 logG = approLogG([think_time;theta],nbJobs,interval);
320%logG = log(pfqn_ca(theta,nbJobs,think_time));
323n_node = zeros(size(testset,1),nbNodes);
325 n_node(:,j) = sum(testset(:, nbClasses*j-nbClasses+1:nbClasses*j),2);
327B=feval(@(x) LV(x+1), n_node(:,2:nbNodes));
328result = result + sum(B(:));
330y = [log(think_time+eps);log(theta+eps)];
331temp = reshape(y
',nbClasses*nbNodes,1);
333result = result + sum(testset*temp);
335result = result - logG*size(testset,1);
337result = result - sumA;