1function estVal = estimator_mcmc(self,
nodes)
2 % Gibbs Sampling MCMC-based optimization
3 % Supports closed, open, and mixed queueing networks.
4 % For open
classes, uses the open-to-closed equivalence Z_r = N_r / lambda_r.
6 % Copyright (c) 2012-2026, Imperial College London
8 % This code
is released under the 3-Clause BSD License.
10 sn = self.model.getStruct;
12 % Get effective population
for open
classes
13 if isfield(self.options,
'openPopulation') && ~isempty(self.options.openPopulation)
14 Nopen = self.options.openPopulation;
19 % Determine population per class
20 P = zeros(1, sn.nclasses);
30 Z = zeros(1, sn.nclasses);
31 allNodes = self.model.getNodes;
32 for n = 1:length(allNodes)
33 if isa(allNodes{n},
'Delay')
34 svcProc = allNodes{n}.getService;
37 Z(r) = Z(r) + svcProc{r}.getMean();
40 elseif isa(allNodes{n},
'Source')
41 svcProc = allNodes{n}.getService;
44 lambda_r = 1 / svcProc{r}.getMean();
45 Z(r) =
P(r) / lambda_r;
51 % obtain per
class metrics
56 avgAQLen{n,r} = self.getAggrQLen(node); % aggregate queue-length
57 if isempty(avgAQLen{n,r})
58 error(
'Transient queue-length data for node %d in class %d is missing.', self.model.getNodeIndex(node), r);
60 avgAQLen{n,r} = avgAQLen{n,r}.data;
66 avgQL = cell2mat(avgAQLen);
67 experiments = size(avgQL,1);
68 avgQL = reshape(avgQL, size(avgQL,1)/size(avgAQLen, 1), size(avgAQLen, 1), sn.nclasses);
69 avgQL = squeeze(mean(avgQL,1))
';
72 case 'MATLAB:catenate:dimensionMismatch
'
73 error('Sampled metrics have different number of samples, use interpolate() before starting this estimation algorithm.');
77 estVal = mcmc_data(avgQL, self.model.getStruct.
visits, experiments, self.options.iter_max,
P, Z);
80% mcmc procedure based on the comon data format
81function demEst = mcmc_data(avgQL,
visits, experiments, ITERMAX,
P, Z)
83 %% number of resources
88 %% Number of experiments
91 %% Number of Gibbs samples
95 integralRange = [0, max(avgQL(:))];
96 thetaStep = integralRange(2) / 400;
99 %% assuming uniform prior distribution - TODO add as option
100 function p = prior(integralRange, delta)
101 p = delta / (integralRange(2) - integralRange(1));
104 theta = zeros(S, M, R);
105 steps = integralRange(1):thetaStep:integralRange(2);
108 sampleTheta = theta(s,:,:);
111 logPosteriors = zeros(size(steps));
112 for st=1:length(steps)
113 stepTheta = steps(st);
114 logPrior = log(prior(integralRange, thetaStep));
115 gNormalizingConstant = pfqn_mci(squeeze(sampleTheta)',
P, Z, N, mciVariant);
117 logPosteriors(st) = N*avgQL(i, c)*log(stepTheta)-N*log(gNormalizingConstant)+logPrior;
120 probs = exp(logPosteriors-max(logPosteriors));
121 probs = probs / sum(probs);
123 cumulativeProb = cumsum(probs);
125 index = find(u<cumulativeProb, 1, 'first');
126 sampleTheta(i, c) = steps(index);
129 theta(s+1,:,:) = sampleTheta;
132 visitPerClass = zeros(R, M);
134 visitPerClass(i, :) =
visits{i}(2:M+1, i); %TODO investigate
137 theta = arrayfun(@(x) x ./ visitPerClass
', theta, 'UniformOutput
', false);
139 cutoff = round(S / 2);
140 theta = theta(cutoff:end);
142 thetaAvg = mean(cat(3,theta{:}),3);