1function [eqModel, eqNode] = buildClosedEquivalentForPS(self, node)
2% BUILDCLOSEDEQUIVALENTFORPS Build a closed equivalent model
for open/mixed networks.
3% For open
classes, uses the equivalence Z_r = N_r / lambda_r where
4% N_r
is the effective population (from options.openPopulation) and
5% lambda_r
is the arrival rate from the Source node.
6% Closed
classes retain their original population and Delay rates.
8% Returns a 2-node closed queueing network (Delay + PS Queue) suitable
9%
for use with MLPS and FMLPS estimators.
11% Copyright (c) 2012-2026, Imperial College London
13% This code
is released under the 3-Clause BSD License.
15sn = self.model.getStruct;
18% Get effective population
for open
classes
19if isfield(self.options,
'openPopulation') && ~isempty(self.options.openPopulation)
20 Nopen = self.options.openPopulation;
25% Determine populations and think times per class
29allNodes = self.model.getNodes;
30for n = 1:length(allNodes)
31 if isa(allNodes{n},
'Delay')
32 svcProc = allNodes{n}.getService;
35 Z(r) = Z(r) + svcProc{r}.getMean();
38 elseif isa(allNodes{n},
'Source')
39 svcProc = allNodes{n}.getService;
42 lambda_r = 1 / svcProc{r}.getMean();
43 Z(r) = Nopen / lambda_r;
57% Convert think times to rates
60% Get queue service processes from original node
61queueSvcProc = node.getService;
63% Build closed equivalent model
64eqModel = Network(
'closed_equiv');
65eqDelay = Delay(eqModel,
'Think');
66eqQueue = Queue(eqModel,
'Queue1', SchedStrategy.PS);
67eqQueue.setNumberOfServers(node.getNumberOfServers());
71 eqClass{r} = ClosedClass(eqModel, sprintf(
'Class%d', r), N(r), eqDelay, 0);
72 eqDelay.setService(eqClass{r}, Exp(delayRate(r)));
73 eqQueue.setService(eqClass{r}, queueSvcProc{r});
76P = eqModel.initRoutingMatrix;
78 P{r} = Network.serialRouting({eqDelay, eqQueue});