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));
35% see _kb/03-api-layer.md
for rationale
37cum_prob = cumsum(prob(:,nbClasses*nbNodes+1));
38testset = zeros(likelihood_sample,nbClasses*nbNodes);
39for k = 1:likelihood_sample
41 index = find(uni_value<cum_prob);
42 testset(k,:) = prob(index(1),1:(nbClasses*nbNodes));
47for k = 3:sum(nbJobs)+1
48 LV(k) = LV(k-1)+log(k-1);
51A=feval(@(x) LV(x+1), testset);
54initial = zeros(1,nbClasses*nbNodes-nbClasses);
56logG_initial = sum(nbJobs.*log(think_time));
58 logG_initial = logG_initial - sum(log(1:nbJobs(k)));
61smpl = zeros(nbSamples,nbClasses*(nbNodes-1));
64for k = 1:round(nbSamples/50)
66 sample_index = sample_index + 1;
67 for h = 1:nbClasses*(nbNodes-1)
69 theta = [smpl(sample_index,1:h-1),initial(h:end)];
71 theta = [smpl(sample_index,1:h-1),smpl(sample_index-1,h:end)];
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);
76 range_size(h) = range_size_dim*2;
82 demand_old = mean(smpl(51:sample_index,:));
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);
92 demand_old = demand_now;
97nbSample = sample_index-1;
98N = round(nbSample/2)+1;
99demand = mean(smpl(N:nbSample,:)*usedCores);
103function [prob_nbCustomer, N, N0] = analyseData( data, nbJobs, nbClasses, nbNodes, data_needed)
105%number of customer classes, start from 1.
108%total number of jobs in the system
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];
122[ts index] = sort(tempTS);
123class_id = tempClass(index);
124logger_id = tempLogger(index);
126burnin = length(ts)-data_needed;
128if burnin < 0 || data_needed == 0
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
138for i = 1:total_length-1
139 count(i+1,:,:) = count(i,:,:);
140 count(i+1,:,:) = count(i,:,:);
142 count(i+1,class_id(i),logger_id(i)) = count(i,class_id(i),logger_id(i))-1;
144 if logger_id(i) == nbNodes
145 count(i+1,class_id(i),1) = count(i,class_id(i),1)+1;
147 count(i+1,class_id(i),logger_id(i)+1) = count(i,class_id(i),logger_id(i)+1)+1;
153 N(i) = max(max(count(:,i,:)));
157for i = 1:total_length
159 count(i,j,1) = count(i,j,1) + N(j);
165%
for i = 1:total_length-1
166% count(i+1,:,:) = count(i,:,:);
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;
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;
180count = reshape(count,total_length,nbClasses*nbNodes);
182%calculate the interval between each timestamp
183%time_interval(1) = ts(1);
185time_interval(2:total_length) = diff(ts);
187count(:,end+1) = time_interval
';
188count = count(burnin:end,:);
190count = sortrows(count,[1:size(count,2)-1]);
192[C ia ic] = unique(count(:,1:end-1),'rows
','legacy
');
196Time(1,end+1) = sum(count(1:ia(1),end));
198 Time(i,end) = sum(count(ia(i-1)+1:ia(i),end));
202obs_length = ts(end)-ts(burnin);
203%calculate the probability
204prob_nbCustomer = Time;
205prob_nbCustomer(:,end) = prob_nbCustomer(:,end)/obs_length;
208 N0(i) = sum(prob_nbCustomer(:,end).*prob_nbCustomer(:,K+i));
212function [value, logG_current, range_size_dim] = gibbsSamplerSimple(alg,think_time,theta,testset,index,nbNodes,nbClasses,nbJobs,logG_initial,interval,range_size,LV,sumA)
214range = (0:interval:range_size);
218 x = zeros(nbNodes,nbClasses);
221 x(i+1,:) = theta(i*nbClasses+1-nbClasses:i*nbClasses);
224 index_i = floor((index-1)/nbClasses)+2;
225 index_j = index-(index_i-2)*nbClasses;
229 [~,QN]=pfqn_bs(x(2:end,:),nbJobs,x(1,:));
231 index_previous = find(range==theta(index));
232 logG(index_previous) = logG_initial;
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
241 logG(i) = logG(i+1) + log(1+QN(index_i-1,index_j)/(range(i+1)+eps)*-interval);
245 x(index_i,index_j) = theta(index);
246 [~,QN]=pfqn_bs(x(2:end,:),nbJobs,x(1,:));
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
255 logG(i) = logG(i-1) + log(1+QN(index_i-1,index_j)/(range(i-1)+eps)*interval);
260log_prob = zeros(1,N);
262 theta(index) = range(i);
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));
268 log_prob(i) = pdf_slice(alg,interval,theta,nbJobs,think_time,testset,nbClasses,nbNodes,LV,sumA);
271log_prob = log_prob-max(log_prob);
274prob = prob/sum(prob);
276cum_prob = cumsum(prob);
277rand_variable = rand(1);
278index_prob = find(rand_variable<cum_prob);
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
285if isempty(index_prob)
286 value = theta(index);
288 logG_current = logG_initial;
291 value = range(index_prob(1));
293 logG_current = logG(index_prob(1));
302function [result] = pdf_slice(alg,interval,theta,nbJobs,think_time,testset,nbClasses,nbNodes,LV,sumA,logG)
309theta = reshape(theta,nbClasses,nbNodes-1)';
311if strcmp(alg,
'TE') && exist(
'logG',
'var') == 0
312 logG = approLogG([think_time;theta],nbJobs,interval);
314%logG = log(pfqn_ca(theta,nbJobs,think_time));
317n_node = zeros(size(testset,1),nbNodes);
319 n_node(:,j) = sum(testset(:, nbClasses*j-nbClasses+1:nbClasses*j),2);
321B=feval(@(x) LV(x+1), n_node(:,2:nbNodes));
322result = result + sum(B(:));
324y = [log(think_time+eps);log(theta+eps)];
325temp = reshape(y
',nbClasses*nbNodes,1);
327result = result + sum(testset*temp);
329result = result - logG*size(testset,1);
331result = result - sumA;