1function estVal = estimator_qmle(self,
nodes)
2% ESTIMATORQMLE Quick Maximum Likelihood Estimation
3% Estimates service demands from mean queue-lengths
using the QMLE
4% closed-form formula. Supports closed, open, and mixed queueing networks.
5% For open
classes, uses the open-to-closed equivalence Z_r = N_r / lambda_r.
7% Copyright (c) 2012-2026, Imperial College London
9% This code
is released under the 3-Clause BSD License.
11sn = self.model.getStruct;
20% Get effective population
for open
classes
21if isfield(self.options,
'openPopulation') && ~isempty(self.options.openPopulation)
22 Nopen = self.options.openPopulation;
27% Determine population per class
37% Extract think times: from Delay
nodes for closed
classes,
38% from Source arrival rates for open
classes (Z_r = N_r / lambda_r)
40allNodes = self.model.getNodes;
41for n = 1:length(allNodes)
42 if isa(allNodes{n},
'Delay')
43 svcProc = allNodes{n}.getService;
46 Z(r) = Z(r) + svcProc{r}.getMean();
49 elseif isa(allNodes{n},
'Source')
50 svcProc = allNodes{n}.getService;
53 lambda_r = 1 / svcProc{r}.getMean();
54 Z(r) = N(r) / lambda_r;
60% extract mean queue-lengths Q(M,R)
64 qlData = self.getQLen(
nodes{n}, self.model.classes{r});
66 error(
'Queue-length data for node %s in class %d is missing.',
nodes{n}.name, r);
71 Q(n, r) = mean(qlData.data);
75estVal = infer_qmle(Q, N, Z);