1function [simDoc, section] = saveImpatience(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVEIMPATIENCE(SIMDOC, SECTION, IND)
4% Generates XML
for impatience (reneging) distributions
for JMT Queue sections
6% Copyright (c) 2012-2026, Imperial College London
9impatienceNode = simDoc.createElement(
'parameter');
10impatienceNode.setAttribute(
'array',
'true');
11impatienceNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ImpatienceStrategies.Impatience');
12impatienceNode.setAttribute(
'name',
'Impatience');
15numOfClasses = sn.nclasses;
16exportClasses = self.getExportableClasses();
17i = sn.nodeToStation(ind);
20 % Skip
classes that should not be exported to JMT
25 refClassNode = simDoc.createElement(
'refClass');
26 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
27 impatienceNode.appendChild(refClassNode);
29 impatienceStrategyNode = simDoc.createElement(
'subParameter');
30 impatienceStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ImpatienceStrategies.Impatience');
31 impatienceStrategyNode.setAttribute(
'name',
'Impatience');
33 % Check
if impatience
is defined
for this station-
class pair
34 % impatienceType
is a matrix indexed by (station,
class)
35 % i > 0 check: nodeToStation returns 0
for non-station
nodes (Fork, Join, etc.)
36 hasImpatience = false;
37 if i > 0 && isfield(sn, 'impatienceType') && ~isempty(sn.impatienceType)
38 if sn.impatienceType(i, r) ~= 0
44 % No impatience defined - use null
45 subParValue = simDoc.createElement('value');
46 subParValue.appendChild(simDoc.createTextNode('null'));
47 impatienceStrategyNode.appendChild(subParValue);
49 % Impatience
is defined - generate distribution XML
50 procType = sn.impatienceType(i, r);
52 distributionNode = simDoc.createElement('subParameter');
56 javaClass = 'jmt.engine.random.DeterministicDistr';
57 javaParClass = 'jmt.engine.random.DeterministicDistrPar';
58 case ProcessType.ERLANG
59 javaClass = 'jmt.engine.random.Erlang';
60 javaParClass = 'jmt.engine.random.ErlangPar';
62 javaClass = 'jmt.engine.random.Exponential';
63 javaParClass = 'jmt.engine.random.ExponentialPar';
64 case ProcessType.GAMMA
65 javaClass = 'jmt.engine.random.GammaDistr';
66 javaParClass = 'jmt.engine.random.GammaDistrPar';
67 case ProcessType.HYPEREXP
68 javaClass = 'jmt.engine.random.HyperExp';
69 javaParClass = 'jmt.engine.random.HyperExpPar';
70 case ProcessType.PARETO
71 javaClass = 'jmt.engine.random.Pareto';
72 javaParClass = 'jmt.engine.random.ParetoPar';
73 case ProcessType.WEIBULL
74 javaClass = 'jmt.engine.random.Weibull';
75 javaParClass = 'jmt.engine.random.WeibullPar';
76 case ProcessType.LOGNORMAL
77 javaClass = 'jmt.engine.random.Lognormal';
78 javaParClass = 'jmt.engine.random.LognormalPar';
79 case ProcessType.UNIFORM
80 javaClass = 'jmt.engine.random.Uniform';
81 javaParClass = 'jmt.engine.random.UniformPar';
82 case {ProcessType.PH, ProcessType.APH, ProcessType.COXIAN}
83 javaClass =
'jmt.engine.random.PhaseTypeDistr';
84 javaParClass =
'jmt.engine.random.PhaseTypePar';
86 line_error(mfilename, sprintf(
'Unsupported impatience distribution type: %s', ProcessType.toText(procType)));
89 distributionNode.setAttribute(
'classPath', javaClass);
92 distributionNode.setAttribute(
'name',
'Exponential');
93 case ProcessType.HYPEREXP
94 distributionNode.setAttribute(
'name',
'Hyperexponential');
95 case {ProcessType.PH, ProcessType.APH, ProcessType.COXIAN}
96 distributionNode.setAttribute(
'name',
'Phase-Type');
98 distributionNode.setAttribute(
'name', ProcessType.toText(procType));
100 impatienceStrategyNode.appendChild(distributionNode);
102 % Create distribution parameters
103 distrParNode = simDoc.createElement(
'subParameter');
104 distrParNode.setAttribute(
'classPath', javaParClass);
105 distrParNode.setAttribute(
'name',
'distrPar');
107 % Get impatience parameters
108 impatienceMu = sn.impatienceMu(i, r);
109 impatiencePhi = sn.impatiencePhi(i, r);
113 subParNodeAlpha = simDoc.createElement(
'subParameter');
114 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
115 subParNodeAlpha.setAttribute(
'name',
't');
116 subParValue = simDoc.createElement(
'value');
117 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', 1/impatienceMu(1))));
118 subParNodeAlpha.appendChild(subParValue);
119 distrParNode.appendChild(subParNodeAlpha);
122 subParNodeLambda = simDoc.createElement(
'subParameter');
123 subParNodeLambda.setAttribute(
'classPath',
'java.lang.Double');
124 subParNodeLambda.setAttribute(
'name',
'lambda');
125 subParValue = simDoc.createElement(
'value');
126 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', impatienceMu(1))));
127 subParNodeLambda.appendChild(subParValue);
128 distrParNode.appendChild(subParNodeLambda);
130 case ProcessType.ERLANG
131 phases = sn.impatiencePhases(i, r);
132 subParNodeAlpha = simDoc.createElement(
'subParameter');
133 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
134 subParNodeAlpha.setAttribute(
'name',
'alpha');
135 subParValue = simDoc.createElement(
'value');
136 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', impatienceMu(1) * phases)));
137 subParNodeAlpha.appendChild(subParValue);
138 distrParNode.appendChild(subParNodeAlpha);
139 subParNodeR = simDoc.createElement(
'subParameter');
140 subParNodeR.setAttribute(
'classPath',
'java.lang.Long');
141 subParNodeR.setAttribute(
'name',
'r');
142 subParValue = simDoc.createElement(
'value');
143 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%d', phases)));
144 subParNodeR.appendChild(subParValue);
145 distrParNode.appendChild(subParNodeR);
147 case ProcessType.HYPEREXP
148 impatienceProc = sn.impatienceProc(i, r);
149 impatiencePie = sn.impatiencePie(i, r);
150 subParNodeP = simDoc.createElement(
'subParameter');
151 subParNodeP.setAttribute(
'classPath',
'java.lang.Double');
152 subParNodeP.setAttribute(
'name',
'p');
153 subParValue = simDoc.createElement(
'value');
154 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', impatiencePie(1))));
155 subParNodeP.appendChild(subParValue);
156 distrParNode.appendChild(subParNodeP);
157 subParNodeLambda1 = simDoc.createElement(
'subParameter');
158 subParNodeLambda1.setAttribute(
'classPath',
'java.lang.Double');
159 subParNodeLambda1.setAttribute(
'name',
'lambda1');
160 subParValue = simDoc.createElement(
'value');
161 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', -impatienceProc{1}(1,1))));
162 subParNodeLambda1.appendChild(subParValue);
163 distrParNode.appendChild(subParNodeLambda1);
164 subParNodeLambda2 = simDoc.createElement(
'subParameter');
165 subParNodeLambda2.setAttribute(
'classPath',
'java.lang.Double');
166 subParNodeLambda2.setAttribute(
'name',
'lambda2');
167 subParValue = simDoc.createElement(
'value');
168 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', -impatienceProc{1}(2,2))));
169 subParNodeLambda2.appendChild(subParValue);
170 distrParNode.appendChild(subParNodeLambda2);
172 case ProcessType.GAMMA
173 scv = impatiencePhi(1);
174 subParNodeAlpha = simDoc.createElement(
'subParameter');
175 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
176 subParNodeAlpha.setAttribute(
'name',
'alpha');
177 subParValue = simDoc.createElement(
'value');
178 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', 1/scv)));
179 subParNodeAlpha.appendChild(subParValue);
180 distrParNode.appendChild(subParNodeAlpha);
181 subParNodeBeta = simDoc.createElement(
'subParameter');
182 subParNodeBeta.setAttribute(
'classPath',
'java.lang.Double');
183 subParNodeBeta.setAttribute(
'name',
'beta');
184 subParValue = simDoc.createElement(
'value');
185 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', scv/impatienceMu(1))));
186 subParNodeBeta.appendChild(subParValue);
187 distrParNode.appendChild(subParNodeBeta);
189 case ProcessType.PARETO
190 scv = impatiencePhi(1);
191 shape = sqrt(1 + 1/scv) + 1;
192 scale = 1/impatienceMu(1) * (shape - 1) / shape;
193 subParNodeAlpha = simDoc.createElement(
'subParameter');
194 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
195 subParNodeAlpha.setAttribute(
'name',
'alpha');
196 subParValue = simDoc.createElement(
'value');
197 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', shape)));
198 subParNodeAlpha.appendChild(subParValue);
199 distrParNode.appendChild(subParNodeAlpha);
200 subParNodeK = simDoc.createElement(
'subParameter');
201 subParNodeK.setAttribute(
'classPath',
'java.lang.Double');
202 subParNodeK.setAttribute(
'name',
'k');
203 subParValue = simDoc.createElement(
'value');
204 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', scale)));
205 subParNodeK.appendChild(subParValue);
206 distrParNode.appendChild(subParNodeK);
208 case ProcessType.WEIBULL
209 scv = impatiencePhi(1);
211 rval = c^(-1.086); % Justus approximation (1976)
212 alpha = 1/impatienceMu(1) / gamma(1+1/rval);
213 subParNodeAlpha = simDoc.createElement('subParameter');
214 subParNodeAlpha.setAttribute('classPath', 'java.lang.Double');
215 subParNodeAlpha.setAttribute('name', 'alpha');
216 subParValue = simDoc.createElement('value');
217 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', alpha)));
218 subParNodeAlpha.appendChild(subParValue);
219 distrParNode.appendChild(subParNodeAlpha);
220 subParNodeR = simDoc.createElement('subParameter');
221 subParNodeR.setAttribute('classPath', 'java.lang.Double');
222 subParNodeR.setAttribute('name', 'r');
223 subParValue = simDoc.createElement('value');
224 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', rval)));
225 subParNodeR.appendChild(subParValue);
226 distrParNode.appendChild(subParNodeR);
228 case ProcessType.LOGNORMAL
229 scv = impatiencePhi(1);
231 mu = log(1/impatienceMu(1) / sqrt(c*c + 1));
232 sigma = sqrt(log(c*c + 1));
233 subParNodeMu = simDoc.createElement('subParameter');
234 subParNodeMu.setAttribute('classPath', 'java.lang.Double');
235 subParNodeMu.setAttribute('name', 'mu');
236 subParValue = simDoc.createElement('value');
237 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', mu)));
238 subParNodeMu.appendChild(subParValue);
239 distrParNode.appendChild(subParNodeMu);
240 subParNodeSigma = simDoc.createElement('subParameter');
241 subParNodeSigma.setAttribute('classPath', 'java.lang.Double');
242 subParNodeSigma.setAttribute('name', 'sigma');
243 subParValue = simDoc.createElement('value');
244 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', sigma)));
245 subParNodeSigma.appendChild(subParValue);
246 distrParNode.appendChild(subParNodeSigma);
248 case ProcessType.UNIFORM
249 mean = 1/impatienceMu(1);
250 % For uniform [a,b]: mean = (a+b)/2, use a=0 for simplicity
252 subParNodeMin = simDoc.createElement('subParameter');
253 subParNodeMin.setAttribute('classPath', 'java.lang.Double');
254 subParNodeMin.setAttribute('name', 'min');
255 subParValue = simDoc.createElement('value');
256 subParValue.appendChild(simDoc.createTextNode('0.0'));
257 subParNodeMin.appendChild(subParValue);
258 distrParNode.appendChild(subParNodeMin);
259 subParNodeMax = simDoc.createElement('subParameter');
260 subParNodeMax.setAttribute('classPath', 'java.lang.Double');
261 subParNodeMax.setAttribute('name', 'max');
262 subParValue = simDoc.createElement('value');
263 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', b)));
264 subParNodeMax.appendChild(subParValue);
265 distrParNode.appendChild(subParNodeMax);
267 case {ProcessType.PH, ProcessType.APH, ProcessType.COXIAN}
268 impatienceProc = sn.impatienceProc(i, r);
269 impatiencePie = sn.impatiencePie(i, r);
270 phases = sn.impatiencePhases(i, r);
271 PH = impatienceProc{1};
272 alpha = abs(impatiencePie);
275 subParNodeAlpha = simDoc.createElement(
'subParameter');
276 subParNodeAlpha.setAttribute(
'array',
'true');
277 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Object');
278 subParNodeAlpha.setAttribute(
'name',
'alpha');
279 subParNodeAlphaVec = simDoc.createElement(
'subParameter');
280 subParNodeAlphaVec.setAttribute(
'array',
'true');
281 subParNodeAlphaVec.setAttribute(
'classPath',
'java.lang.Object');
282 subParNodeAlphaVec.setAttribute(
'name',
'vector');
284 subParNodeAlphaElem = simDoc.createElement(
'subParameter');
285 subParNodeAlphaElem.setAttribute(
'classPath',
'java.lang.Double');
286 subParNodeAlphaElem.setAttribute(
'name',
'entry');
287 subParValue = simDoc.createElement(
'value');
288 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', alpha(k))));
289 subParNodeAlphaElem.appendChild(subParValue);
290 subParNodeAlphaVec.appendChild(subParNodeAlphaElem);
294 subParNodeT = simDoc.createElement(
'subParameter');
295 subParNodeT.setAttribute(
'array',
'true');
296 subParNodeT.setAttribute(
'classPath',
'java.lang.Object');
297 subParNodeT.setAttribute(
'name',
'T');
299 subParNodeTvec = simDoc.createElement(
'subParameter');
300 subParNodeTvec.setAttribute(
'array',
'true');
301 subParNodeTvec.setAttribute(
'classPath',
'java.lang.Object');
302 subParNodeTvec.setAttribute(
'name',
'vector');
304 subParNodeTElem = simDoc.createElement(
'subParameter');
305 subParNodeTElem.setAttribute(
'classPath',
'java.lang.Double');
306 subParNodeTElem.setAttribute(
'name',
'entry');
307 subParValue = simDoc.createElement(
'value');
309 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', -abs(PH(k,j)))));
311 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f', abs(PH(k,j)))));
313 subParNodeTElem.appendChild(subParValue);
314 subParNodeTvec.appendChild(subParNodeTElem);
316 subParNodeT.appendChild(subParNodeTvec);
319 subParNodeAlpha.appendChild(subParNodeAlphaVec);
320 distrParNode.appendChild(subParNodeAlpha);
321 distrParNode.appendChild(subParNodeT);
324 impatienceStrategyNode.appendChild(distrParNode);
327 impatienceNode.appendChild(impatienceStrategyNode);
330section.appendChild(impatienceNode);