LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
saveImpatience.m
1function [simDoc, section] = saveImpatience(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVEIMPATIENCE(SIMDOC, SECTION, IND)
3%
4% Generates XML for impatience (reneging) distributions for JMT Queue sections
5%
6% Copyright (c) 2012-2026, Imperial College London
7% All rights reserved.
8
9impatienceNode = simDoc.createElement('parameter');
10impatienceNode.setAttribute('array', 'true');
11impatienceNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ImpatienceStrategies.Impatience');
12impatienceNode.setAttribute('name', 'Impatience');
13
14sn = self.getStruct;
15numOfClasses = sn.nclasses;
16exportClasses = self.getExportableClasses();
17i = sn.nodeToStation(ind);
18
19for r=1:numOfClasses
20 % Skip classes that should not be exported to JMT
21 if ~exportClasses(r)
22 continue;
23 end
24
25 refClassNode = simDoc.createElement('refClass');
26 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
27 impatienceNode.appendChild(refClassNode);
28
29 impatienceStrategyNode = simDoc.createElement('subParameter');
30 impatienceStrategyNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ImpatienceStrategies.Impatience');
31 impatienceStrategyNode.setAttribute('name', 'Impatience');
32
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
39 hasImpatience = true;
40 end
41 end
42
43 if ~hasImpatience
44 % No impatience defined - use null
45 subParValue = simDoc.createElement('value');
46 subParValue.appendChild(simDoc.createTextNode('null'));
47 impatienceStrategyNode.appendChild(subParValue);
48 else
49 % Impatience is defined - generate distribution XML
50 procType = sn.impatienceType(i, r);
51
52 distributionNode = simDoc.createElement('subParameter');
53
54 switch procType
55 case ProcessType.DET
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';
61 case ProcessType.EXP
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';
85 otherwise
86 line_error(mfilename, sprintf('Unsupported impatience distribution type: %s', ProcessType.toText(procType)));
87 end
88
89 distributionNode.setAttribute('classPath', javaClass);
90 switch procType
91 case ProcessType.EXP
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');
97 otherwise
98 distributionNode.setAttribute('name', ProcessType.toText(procType));
99 end
100 impatienceStrategyNode.appendChild(distributionNode);
101
102 % Create distribution parameters
103 distrParNode = simDoc.createElement('subParameter');
104 distrParNode.setAttribute('classPath', javaParClass);
105 distrParNode.setAttribute('name', 'distrPar');
106
107 % Get impatience parameters
108 impatienceMu = sn.impatienceMu(i, r);
109 impatiencePhi = sn.impatiencePhi(i, r);
110
111 switch procType
112 case ProcessType.DET
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);
120
121 case ProcessType.EXP
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);
129
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);
146
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);
171
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);
188
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);
207
208 case ProcessType.WEIBULL
209 scv = impatiencePhi(1);
210 c = sqrt(scv);
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);
227
228 case ProcessType.LOGNORMAL
229 scv = impatiencePhi(1);
230 c = sqrt(scv);
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);
247
248 case ProcessType.UNIFORM
249 mean = 1/impatienceMu(1);
250 % For uniform [a,b]: mean = (a+b)/2, use a=0 for simplicity
251 b = 2 * mean;
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);
266
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);
273
274 % Alpha vector
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');
283 for k=1:phases
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);
291 end
292
293 % T matrix
294 subParNodeT = simDoc.createElement('subParameter');
295 subParNodeT.setAttribute('array', 'true');
296 subParNodeT.setAttribute('classPath', 'java.lang.Object');
297 subParNodeT.setAttribute('name', 'T');
298 for k=1:phases
299 subParNodeTvec = simDoc.createElement('subParameter');
300 subParNodeTvec.setAttribute('array', 'true');
301 subParNodeTvec.setAttribute('classPath', 'java.lang.Object');
302 subParNodeTvec.setAttribute('name', 'vector');
303 for j=1:phases
304 subParNodeTElem = simDoc.createElement('subParameter');
305 subParNodeTElem.setAttribute('classPath', 'java.lang.Double');
306 subParNodeTElem.setAttribute('name', 'entry');
307 subParValue = simDoc.createElement('value');
308 if k==j
309 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', -abs(PH(k,j)))));
310 else
311 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f', abs(PH(k,j)))));
312 end
313 subParNodeTElem.appendChild(subParValue);
314 subParNodeTvec.appendChild(subParNodeTElem);
315 end
316 subParNodeT.appendChild(subParNodeTvec);
317 end
318
319 subParNodeAlpha.appendChild(subParNodeAlphaVec);
320 distrParNode.appendChild(subParNodeAlpha);
321 distrParNode.appendChild(subParNodeT);
322 end
323
324 impatienceStrategyNode.appendChild(distrParNode);
325 end
326
327 impatienceNode.appendChild(impatienceStrategyNode);
328end
329
330section.appendChild(impatienceNode);
331end
Definition mmt.m:92