LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
saveRetrialDistributions.m
1function [simDoc, section] = saveRetrialDistributions(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVERETRIALDISTRIBUTIONS(SIMDOC, SECTION, IND)
3%
4% Generates XML for retrial delay distributions for JMT Queue sections.
5% The retrial distribution tells JMT how long a blocked customer waits
6% in the orbit before retrying.
7%
8% Copyright (c) 2012-2026, Imperial College London
9% All rights reserved.
10
11retrialNode = simDoc.createElement('parameter');
12retrialNode.setAttribute('array', 'true');
13retrialNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategy');
14retrialNode.setAttribute('name', 'retrialDistributions');
15
16sn = self.getStruct;
17numOfClasses = sn.nclasses;
18exportClasses = self.getExportableClasses();
19
20% Get the actual Queue node to access retrialDelays
21nodes = self.model.getNodes();
22currentNode = nodes{ind};
23
24for r=1:numOfClasses
25 if ~exportClasses(r)
26 continue;
27 end
28
29 refClassNode = simDoc.createElement('refClass');
30 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
31 retrialNode.appendChild(refClassNode);
32
33 serviceTimeStrategyNode = simDoc.createElement('subParameter');
34 serviceTimeStrategyNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
35 serviceTimeStrategyNode.setAttribute('name', 'ServiceTimeStrategy');
36
37 % Check if retrial delay is defined for this class
38 hasRetrial = false;
39 retrialDist = [];
40 if isa(currentNode, 'Queue') && ~isempty(currentNode.retrialDelays)
41 if r <= size(currentNode.retrialDelays, 2) && ~isempty(currentNode.retrialDelays{1, r})
42 hasRetrial = true;
43 retrialDist = currentNode.retrialDelays{1, r};
44 end
45 end
46
47 if ~hasRetrial
48 % Default: Exp(1) placeholder
49 distributionNode = simDoc.createElement('subParameter');
50 distributionNode.setAttribute('classPath', 'jmt.engine.random.Exponential');
51 distributionNode.setAttribute('name', 'Exponential');
52 serviceTimeStrategyNode.appendChild(distributionNode);
53
54 distrParNode = simDoc.createElement('subParameter');
55 distrParNode.setAttribute('classPath', 'jmt.engine.random.ExponentialPar');
56 distrParNode.setAttribute('name', 'distrPar');
57 subParNodeLambda = simDoc.createElement('subParameter');
58 subParNodeLambda.setAttribute('classPath', 'java.lang.Double');
59 subParNodeLambda.setAttribute('name', 'lambda');
60 subParValue = simDoc.createElement('value');
61 subParValue.appendChild(simDoc.createTextNode('1.000000000000'));
62 subParNodeLambda.appendChild(subParValue);
63 distrParNode.appendChild(subParNodeLambda);
64 serviceTimeStrategyNode.appendChild(distrParNode);
65 else
66 % Write the actual retrial distribution
67 % Determine distribution type from the distribution object
68 if isa(retrialDist, 'Exp')
69 javaClass = 'jmt.engine.random.Exponential';
70 javaParClass = 'jmt.engine.random.ExponentialPar';
71 distName = 'Exponential';
72 elseif isa(retrialDist, 'Erlang')
73 javaClass = 'jmt.engine.random.Erlang';
74 javaParClass = 'jmt.engine.random.ErlangPar';
75 distName = 'Erlang';
76 elseif isa(retrialDist, 'HyperExp')
77 javaClass = 'jmt.engine.random.HyperExp';
78 javaParClass = 'jmt.engine.random.HyperExpPar';
79 distName = 'Hyperexponential';
80 elseif isa(retrialDist, 'Det')
81 javaClass = 'jmt.engine.random.DeterministicDistr';
82 javaParClass = 'jmt.engine.random.DeterministicDistrPar';
83 distName = 'Deterministic';
84 elseif isa(retrialDist, 'Gamma')
85 javaClass = 'jmt.engine.random.GammaDistr';
86 javaParClass = 'jmt.engine.random.GammaDistrPar';
87 distName = 'Gamma';
88 elseif isa(retrialDist, 'Uniform')
89 javaClass = 'jmt.engine.random.Uniform';
90 javaParClass = 'jmt.engine.random.UniformPar';
91 distName = 'Uniform';
92 else
93 % Fallback: treat as exponential with the distribution's rate
94 javaClass = 'jmt.engine.random.Exponential';
95 javaParClass = 'jmt.engine.random.ExponentialPar';
96 distName = 'Exponential';
97 end
98
99 distributionNode = simDoc.createElement('subParameter');
100 distributionNode.setAttribute('classPath', javaClass);
101 distributionNode.setAttribute('name', distName);
102 serviceTimeStrategyNode.appendChild(distributionNode);
103
104 distrParNode = simDoc.createElement('subParameter');
105 distrParNode.setAttribute('classPath', javaParClass);
106 distrParNode.setAttribute('name', 'distrPar');
107
108 if isa(retrialDist, 'Exp')
109 subParNodeLambda = simDoc.createElement('subParameter');
110 subParNodeLambda.setAttribute('classPath', 'java.lang.Double');
111 subParNodeLambda.setAttribute('name', 'lambda');
112 subParValue = simDoc.createElement('value');
113 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', retrialDist.getRate())));
114 subParNodeLambda.appendChild(subParValue);
115 distrParNode.appendChild(subParNodeLambda);
116
117 elseif isa(retrialDist, 'Det')
118 subParNodeT = simDoc.createElement('subParameter');
119 subParNodeT.setAttribute('classPath', 'java.lang.Double');
120 subParNodeT.setAttribute('name', 't');
121 subParValue = simDoc.createElement('value');
122 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', retrialDist.getMean())));
123 subParNodeT.appendChild(subParValue);
124 distrParNode.appendChild(subParNodeT);
125
126 elseif isa(retrialDist, 'Erlang')
127 subParNodeAlpha = simDoc.createElement('subParameter');
128 subParNodeAlpha.setAttribute('classPath', 'java.lang.Double');
129 subParNodeAlpha.setAttribute('name', 'alpha');
130 subParValue = simDoc.createElement('value');
131 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', retrialDist.getRate())));
132 subParNodeAlpha.appendChild(subParValue);
133 distrParNode.appendChild(subParNodeAlpha);
134
135 subParNodeR = simDoc.createElement('subParameter');
136 subParNodeR.setAttribute('classPath', 'java.lang.Long');
137 subParNodeR.setAttribute('name', 'r');
138 subParValue = simDoc.createElement('value');
139 subParValue.appendChild(simDoc.createTextNode(sprintf('%d', retrialDist.getNumberOfPhases())));
140 subParNodeR.appendChild(subParValue);
141 distrParNode.appendChild(subParNodeR);
142
143 else
144 % Generic fallback: use rate as exponential
145 subParNodeLambda = simDoc.createElement('subParameter');
146 subParNodeLambda.setAttribute('classPath', 'java.lang.Double');
147 subParNodeLambda.setAttribute('name', 'lambda');
148 subParValue = simDoc.createElement('value');
149 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', 1/retrialDist.getMean())));
150 subParNodeLambda.appendChild(subParValue);
151 distrParNode.appendChild(subParNodeLambda);
152 end
153
154 serviceTimeStrategyNode.appendChild(distrParNode);
155 end
156
157 retrialNode.appendChild(serviceTimeStrategyNode);
158end
159
160section.appendChild(retrialNode);
161end
Definition mmt.m:124