LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
buildClosedEquivalentForPS.m
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.
7%
8% Returns a 2-node closed queueing network (Delay + PS Queue) suitable
9% for use with MLPS and FMLPS estimators.
10%
11% Copyright (c) 2012-2026, Imperial College London
12% All rights reserved.
13% This code is released under the 3-Clause BSD License.
14
15sn = self.model.getStruct;
16R = sn.nclasses;
17
18% Get effective population for open classes
19if isfield(self.options, 'openPopulation') && ~isempty(self.options.openPopulation)
20 Nopen = self.options.openPopulation;
21else
22 Nopen = 100;
23end
24
25% Determine populations and think times per class
26N = zeros(1, R);
27Z = zeros(1, R);
28
29allNodes = self.model.getNodes;
30for n = 1:length(allNodes)
31 if isa(allNodes{n}, 'Delay')
32 svcProc = allNodes{n}.getService;
33 for r = 1:R
34 if sn.njobs(r) < Inf
35 Z(r) = Z(r) + svcProc{r}.getMean();
36 end
37 end
38 elseif isa(allNodes{n}, 'Source')
39 svcProc = allNodes{n}.getService;
40 for r = 1:R
41 if sn.njobs(r) == Inf
42 lambda_r = 1 / svcProc{r}.getMean();
43 Z(r) = Nopen / lambda_r;
44 end
45 end
46 end
47end
48
49for r = 1:R
50 if sn.njobs(r) < Inf
51 N(r) = sn.njobs(r);
52 else
53 N(r) = Nopen;
54 end
55end
56
57% Convert think times to rates
58delayRate = 1 ./ Z;
59
60% Get queue service processes from original node
61queueSvcProc = node.getService;
62
63% Build closed equivalent model
64eqModel = Network('closed_equiv');
65eqDelay = Delay(eqModel, 'Think');
66eqQueue = Queue(eqModel, 'Queue1', SchedStrategy.PS);
67eqQueue.setNumberOfServers(node.getNumberOfServers());
68
69eqClass = cell(1, R);
70for r = 1:R
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});
74end
75
76P = eqModel.initRoutingMatrix;
77for r = 1:R
78 P{r} = Network.serialRouting({eqDelay, eqQueue});
79end
80eqModel.link(P);
81
82eqNode = eqQueue;
83
84end