1function [simDoc, section] = saveRetrialDistributions(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVERETRIALDISTRIBUTIONS(SIMDOC, SECTION, IND)
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.
8% Copyright (c) 2012-2026, Imperial College London
11retrialNode = simDoc.createElement(
'parameter');
12retrialNode.setAttribute(
'array',
'true');
13retrialNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategy');
14retrialNode.setAttribute(
'name',
'retrialDistributions');
17numOfClasses = sn.nclasses;
18exportClasses = self.getExportableClasses();
20% Get the actual Queue node to access retrialDelays
21nodes = self.model.getNodes();
22currentNode =
nodes{ind};
29 refClassNode = simDoc.createElement(
'refClass');
30 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
31 retrialNode.appendChild(refClassNode);
33 serviceTimeStrategyNode = simDoc.createElement(
'subParameter');
34 serviceTimeStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
35 serviceTimeStrategyNode.setAttribute(
'name',
'ServiceTimeStrategy');
37 % Check
if retrial delay
is defined
for this class
40 if isa(currentNode,
'Queue') && ~isempty(currentNode.retrialDelays)
41 if r <= size(currentNode.retrialDelays, 2) && ~isempty(currentNode.retrialDelays{1, r})
43 retrialDist = currentNode.retrialDelays{1, r};
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);
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);
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';
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';
88 elseif isa(retrialDist, 'Uniform')
89 javaClass = 'jmt.engine.random.Uniform';
90 javaParClass = 'jmt.engine.random.UniformPar';
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';
99 distributionNode = simDoc.createElement('subParameter');
100 distributionNode.setAttribute('classPath', javaClass);
101 distributionNode.setAttribute('name', distName);
102 serviceTimeStrategyNode.appendChild(distributionNode);
104 distrParNode = simDoc.createElement('subParameter');
105 distrParNode.setAttribute('classPath', javaParClass);
106 distrParNode.setAttribute('name', 'distrPar');
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);
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);
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);
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);
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);
154 serviceTimeStrategyNode.appendChild(distrParNode);
157 retrialNode.appendChild(serviceTimeStrategyNode);
160section.appendChild(retrialNode);