1function [simDoc, section] = saveServiceStrategy(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVESERVICESTRATEGY(SIMDOC, SECTION, NODEIDX)
4% Copyright (c) 2012-2026, Imperial College London
6strategyNode = simDoc.createElement(
'parameter');
7strategyNode.setAttribute(
'array',
'true');
8strategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategy');
9strategyNode.setAttribute(
'name',
'ServiceStrategy');
12numOfClasses = sn.nclasses;
13exportClasses = self.getExportableClasses();
14i = sn.nodeToStation(ind);
17 % Skip
classes that should not be exported to JMT
22 refClassNode2 = simDoc.createElement(
'refClass');
23 refClassNode2.appendChild(simDoc.createTextNode(sn.classnames{r}));
24 strategyNode.appendChild(refClassNode2);
25 serviceTimeStrategyNode = simDoc.createElement(
'subParameter');
26 if sn.procid(i,r) == ProcessType.DISABLED
27 serviceTimeStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.DisabledServiceTimeStrategy');
28 serviceTimeStrategyNode.setAttribute(
'name',
'DisabledServiceTimeStrategy');
29 elseif sn.procid(i,r) == ProcessType.IMMEDIATE
30 serviceTimeStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ZeroServiceTimeStrategy');
31 serviceTimeStrategyNode.setAttribute(
'name',
'ZeroServiceTimeStrategy');
32 elseif sn.procid(i,r) == ProcessType.PH || sn.procid(i,r) == ProcessType.APH || sn.procid(i,r) == ProcessType.COXIAN || (sn.phases(i,r)>2 && sn.procid(i,r) == ProcessType.HYPEREXP) %|| (sn.phases(i,r)>2 && sn.procid(i,r) == ProcessType.COXIAN) || (sn.phases(i,r)>2 && sn.procid(i,r) == ProcessType.HYPEREXP)
33 serviceTimeStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
34 serviceTimeStrategyNode.setAttribute(
'name',
'ServiceTimeStrategy');
35 distributionNode = simDoc.createElement(
'subParameter');
36 distributionNode.setAttribute(
'classPath',
'jmt.engine.random.PhaseTypeDistr');
37 distributionNode.setAttribute(
'name',
'Phase-Type');
38 distrParNode = simDoc.createElement(
'subParameter');
39 distrParNode.setAttribute(
'classPath',
'jmt.engine.random.PhaseTypePar');
40 distrParNode.setAttribute(
'name',
'distrPar');
42 subParNodeAlpha = simDoc.createElement(
'subParameter');
43 subParNodeAlpha.setAttribute(
'array',
'true');
44 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Object');
45 subParNodeAlpha.setAttribute(
'name',
'alpha');
46 subParNodeAlphaVec = simDoc.createElement(
'subParameter');
47 subParNodeAlphaVec.setAttribute(
'array',
'true');
48 subParNodeAlphaVec.setAttribute(
'classPath',
'java.lang.Object');
49 subParNodeAlphaVec.setAttribute(
'name',
'vector');
51 alpha = abs(sn.pie{i}{r});
52 for k=1:sn.phases(i,r)
53 subParNodeAlphaElem = simDoc.createElement(
'subParameter');
54 subParNodeAlphaElem.setAttribute(
'classPath',
'java.lang.Double');
55 subParNodeAlphaElem.setAttribute(
'name',
'entry');
56 subParValue = simDoc.createElement(
'value');
57 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',alpha(k))));
58 subParNodeAlphaElem.appendChild(subParValue);
59 subParNodeAlphaVec.appendChild(subParNodeAlphaElem);
62 subParNodeT = simDoc.createElement(
'subParameter');
63 subParNodeT.setAttribute(
'array',
'true');
64 subParNodeT.setAttribute(
'classPath',
'java.lang.Object');
65 subParNodeT.setAttribute(
'name',
'T');
67 for k=1:sn.phases(i,r)
68 subParNodeTvec = simDoc.createElement(
'subParameter');
69 subParNodeTvec.setAttribute(
'array',
'true');
70 subParNodeTvec.setAttribute(
'classPath',
'java.lang.Object');
71 subParNodeTvec.setAttribute(
'name',
'vector');
72 for j=1:sn.phases(i,r)
73 subParNodeTElem = simDoc.createElement(
'subParameter');
74 subParNodeTElem.setAttribute(
'classPath',
'java.lang.Double');
75 subParNodeTElem.setAttribute(
'name',
'entry');
76 subParValue = simDoc.createElement(
'value');
78 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',-abs(T(k,j)))));
80 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',abs(T(k,j)))));
82 subParNodeTElem.appendChild(subParValue);
83 subParNodeTvec.appendChild(subParNodeTElem);
85 subParNodeT.appendChild(subParNodeTvec);
88 subParNodeAlpha.appendChild(subParNodeAlphaVec);
89 distrParNode.appendChild(subParNodeAlpha);
90 distrParNode.appendChild(subParNodeT);
91 serviceTimeStrategyNode.appendChild(distributionNode);
92 serviceTimeStrategyNode.appendChild(distrParNode);
94 elseif sn.procid(i,r) == ProcessType.MAP || sn.procid(i,r) == ProcessType.MMPP2
95 serviceTimeStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
96 serviceTimeStrategyNode.setAttribute(
'name',
'ServiceTimeStrategy');
97 distributionNode = simDoc.createElement(
'subParameter');
98 distributionNode.setAttribute(
'classPath',
'jmt.engine.random.MAPDistr');
99 distributionNode.setAttribute(
'name',
'Burst (MAP)');
100 distrParNode = simDoc.createElement(
'subParameter');
101 distrParNode.setAttribute(
'classPath',
'jmt.engine.random.MAPPar');
102 distrParNode.setAttribute(
'name',
'distrPar');
106 subParNodeD0 = simDoc.createElement(
'subParameter');
107 subParNodeD0.setAttribute(
'array',
'true');
108 subParNodeD0.setAttribute(
'classPath',
'java.lang.Object');
109 subParNodeD0.setAttribute(
'name',
'D0');
111 for k=1:sn.phases(i,r)
112 subParNodeD0vec = simDoc.createElement(
'subParameter');
113 subParNodeD0vec.setAttribute(
'array',
'true');
114 subParNodeD0vec.setAttribute(
'classPath',
'java.lang.Object');
115 subParNodeD0vec.setAttribute(
'name',
'vector');
116 for j=1:sn.phases(i,r)
117 subParNodeD0Elem = simDoc.createElement(
'subParameter');
118 subParNodeD0Elem.setAttribute(
'classPath',
'java.lang.Double');
119 subParNodeD0Elem.setAttribute(
'name',
'entry');
120 subParValue = simDoc.createElement(
'value');
121 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',D0(k,j))));
122 subParNodeD0Elem.appendChild(subParValue);
123 subParNodeD0vec.appendChild(subParNodeD0Elem);
125 subParNodeD0.appendChild(subParNodeD0vec);
127 distrParNode.appendChild(subParNodeD0);
129 subParNodeD1 = simDoc.createElement(
'subParameter');
130 subParNodeD1.setAttribute(
'array',
'true');
131 subParNodeD1.setAttribute(
'classPath',
'java.lang.Object');
132 subParNodeD1.setAttribute(
'name',
'D1');
134 for k=1:sn.phases(i,r)
135 subParNodeD1vec = simDoc.createElement(
'subParameter');
136 subParNodeD1vec.setAttribute(
'array',
'true');
137 subParNodeD1vec.setAttribute(
'classPath',
'java.lang.Object');
138 subParNodeD1vec.setAttribute(
'name',
'vector');
139 for j=1:sn.phases(i,r)
140 subParNodeD1Elem = simDoc.createElement(
'subParameter');
141 subParNodeD1Elem.setAttribute(
'classPath',
'java.lang.Double');
142 subParNodeD1Elem.setAttribute(
'name',
'entry');
143 subParValue = simDoc.createElement(
'value');
144 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',D1(k,j))));
145 subParNodeD1Elem.appendChild(subParValue);
146 subParNodeD1vec.appendChild(subParNodeD1Elem);
148 subParNodeD1.appendChild(subParNodeD1vec);
150 distrParNode.appendChild(subParNodeD1);
151 serviceTimeStrategyNode.appendChild(distributionNode);
152 serviceTimeStrategyNode.appendChild(distrParNode);
154 serviceTimeStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
155 serviceTimeStrategyNode.setAttribute(
'name',
'ServiceTimeStrategy');
157 distributionNode = simDoc.createElement(
'subParameter');
158 switch sn.procid(i,r)
160 javaClass =
'jmt.engine.random.DeterministicDistr';
161 javaParClass =
'jmt.engine.random.DeterministicDistrPar';
162 case ProcessType.COXIAN
163 javaClass =
'jmt.engine.random.CoxianDistr';
164 javaParClass =
'jmt.engine.random.CoxianPar';
165 case ProcessType.ERLANG
166 javaClass =
'jmt.engine.random.Erlang';
167 javaParClass =
'jmt.engine.random.ErlangPar';
169 javaClass =
'jmt.engine.random.Exponential';
170 javaParClass =
'jmt.engine.random.ExponentialPar';
171 case ProcessType.GAMMA
172 javaClass =
'jmt.engine.random.GammaDistr';
173 javaParClass =
'jmt.engine.random.GammaDistrPar';
174 case ProcessType.HYPEREXP
175 javaClass =
'jmt.engine.random.HyperExp';
176 javaParClass =
'jmt.engine.random.HyperExpPar';
177 case ProcessType.PARETO
178 javaClass =
'jmt.engine.random.Pareto';
179 javaParClass =
'jmt.engine.random.ParetoPar';
180 case ProcessType.WEIBULL
181 javaClass =
'jmt.engine.random.Weibull';
182 javaParClass =
'jmt.engine.random.WeibullPar';
183 case ProcessType.LOGNORMAL
184 javaClass =
'jmt.engine.random.Lognormal';
185 javaParClass =
'jmt.engine.random.LognormalPar';
186 case ProcessType.UNIFORM
187 javaClass =
'jmt.engine.random.Uniform';
188 javaParClass =
'jmt.engine.random.UniformPar';
189 case ProcessType.MMPP2
190 javaClass =
'jmt.engine.random.MMPP2Distr';
191 javaParClass =
'jmt.engine.random.MMPP2Par';
192 case {ProcessType.REPLAYER, ProcessType.TRACE}
193 javaClass =
'jmt.engine.random.Replayer';
194 javaParClass =
'jmt.engine.random.ReplayerPar';
196 distributionNode.setAttribute(
'classPath', javaClass);
197 switch sn.procid(i,r)
198 case {ProcessType.REPLAYER, ProcessType.TRACE}
199 distributionNode.setAttribute(
'name',
'Replayer');
201 distributionNode.setAttribute(
'name',
'Exponential');
202 case ProcessType.HYPEREXP
203 distributionNode.setAttribute(
'name',
'Hyperexponential');
205 distributionNode.setAttribute(
'name', ProcessType.toText(ProcessType.fromId(sn.procid(i,r))));
207 serviceTimeStrategyNode.appendChild(distributionNode);
209 distrParNode = simDoc.createElement(
'subParameter');
210 distrParNode.setAttribute(
'classPath', javaParClass);
211 distrParNode.setAttribute(
'name',
'distrPar');
213 switch sn.procid(i,r)
215 subParNodeAlpha = simDoc.createElement(
'subParameter');
216 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
217 subParNodeAlpha.setAttribute(
'name',
't');
218 subParValue = simDoc.createElement(
'value');
219 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',1/sn.rates(i,r))));
220 subParNodeAlpha.appendChild(subParValue);
221 distrParNode.appendChild(subParNodeAlpha);
223 subParNodeAlpha = simDoc.createElement(
'subParameter');
224 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
225 subParNodeAlpha.setAttribute(
'name',
'lambda');
226 subParValue = simDoc.createElement(
'value');
227 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.rates(i,r))));
228 subParNodeAlpha.appendChild(subParValue);
229 distrParNode.appendChild(subParNodeAlpha);
230 case ProcessType.HYPEREXP
231 subParNodeAlpha = simDoc.createElement(
'subParameter');
232 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
233 subParNodeAlpha.setAttribute(
'name',
'p');
234 subParValue = simDoc.createElement(
'value');
235 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.pie{i}{r}(1))));
236 subParNodeAlpha.appendChild(subParValue);
237 distrParNode.appendChild(subParNodeAlpha);
238 subParNodeAlpha = simDoc.createElement(
'subParameter');
239 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
240 subParNodeAlpha.setAttribute(
'name',
'lambda1');
241 subParValue = simDoc.createElement(
'value');
242 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',-sn.proc{i}{r}{1}(1,1))));
243 subParNodeAlpha.appendChild(subParValue);
244 distrParNode.appendChild(subParNodeAlpha);
245 subParNodeAlpha = simDoc.createElement(
'subParameter');
246 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
247 subParNodeAlpha.setAttribute(
'name',
'lambda2');
248 subParValue = simDoc.createElement(
'value');
249 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',-sn.proc{i}{r}{1}(2,2))));
250 subParNodeAlpha.appendChild(subParValue);
251 distrParNode.appendChild(subParNodeAlpha);
252 case ProcessType.ERLANG
253 subParNodeAlpha = simDoc.createElement(
'subParameter');
254 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
255 subParNodeAlpha.setAttribute(
'name',
'alpha');
256 subParValue = simDoc.createElement(
'value');
257 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.rates(i,r)*sn.phases(i,r))));
258 subParNodeAlpha.appendChild(subParValue);
259 distrParNode.appendChild(subParNodeAlpha);
260 subParNodeAlpha = simDoc.createElement(
'subParameter');
261 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Long');
262 subParNodeAlpha.setAttribute(
'name',
'r');
263 subParValue = simDoc.createElement(
'value');
264 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%d',sn.phases(i,r))));
265 subParNodeAlpha.appendChild(subParValue);
266 distrParNode.appendChild(subParNodeAlpha);
267 case ProcessType.MMPP2
268 subParNodeAlpha = simDoc.createElement(
'subParameter');
269 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
270 subParNodeAlpha.setAttribute(
'name',
'lambda0');
271 subParValue = simDoc.createElement(
'value');
272 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.proc{i}{r}{2}(1,1))));
273 subParNodeAlpha.appendChild(subParValue);
274 distrParNode.appendChild(subParNodeAlpha);
275 subParNodeAlpha = simDoc.createElement(
'subParameter');
276 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
277 subParNodeAlpha.setAttribute(
'name',
'lambda1');
278 subParValue = simDoc.createElement(
'value');
279 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.proc{i}{r}{2}(2,2))));
280 subParNodeAlpha.appendChild(subParValue);
281 distrParNode.appendChild(subParNodeAlpha);
282 subParNodeAlpha = simDoc.createElement(
'subParameter');
283 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
284 subParNodeAlpha.setAttribute(
'name',
'sigma0');
285 subParValue = simDoc.createElement(
'value');
286 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.proc{i}{r}{1}(1,2))));
287 subParNodeAlpha.appendChild(subParValue);
288 distrParNode.appendChild(subParNodeAlpha);
289 subParNodeAlpha = simDoc.createElement(
'subParameter');
290 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
291 subParNodeAlpha.setAttribute(
'name',
'sigma1');
292 subParValue = simDoc.createElement(
'value');
293 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.proc{i}{r}{1}(2,1))));
294 subParNodeAlpha.appendChild(subParValue);
295 distrParNode.appendChild(subParNodeAlpha);
296 case ProcessType.GAMMA
297 subParNodeAlpha = simDoc.createElement(
'subParameter');
298 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
299 subParNodeAlpha.setAttribute(
'name',
'alpha');
300 subParValue = simDoc.createElement(
'value');
301 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',1/sn.scv(i,r))));
302 subParNodeAlpha.appendChild(subParValue);
303 distrParNode.appendChild(subParNodeAlpha);
304 subParNodeAlpha = simDoc.createElement(
'subParameter');
305 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
306 subParNodeAlpha.setAttribute(
'name',
'beta');
307 subParValue = simDoc.createElement(
'value');
308 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.scv(i,r)/sn.rates(i,r))));
309 subParNodeAlpha.appendChild(subParValue);
310 distrParNode.appendChild(subParNodeAlpha);
311 case ProcessType.PARETO
312 shape = sqrt(1+1/sn.scv(i,r))+1;
313 scale = 1/sn.rates(i,r) * (shape - 1) / shape;
314 subParNodeAlpha = simDoc.createElement(
'subParameter');
315 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
316 subParNodeAlpha.setAttribute(
'name',
'alpha'); % shape
317 subParValue = simDoc.createElement(
'value');
318 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',shape)));
319 subParNodeAlpha.appendChild(subParValue);
320 distrParNode.appendChild(subParNodeAlpha);
321 subParNodeAlpha = simDoc.createElement(
'subParameter');
322 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
323 subParNodeAlpha.setAttribute(
'name',
'k'); % scale
324 subParValue = simDoc.createElement(
'value');
325 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',scale)));
326 subParNodeAlpha.appendChild(subParValue);
327 distrParNode.appendChild(subParNodeAlpha);
328 case ProcessType.WEIBULL
329 c = sqrt(sn.scv(i,r));
330 rval = c^(-1.086); % Justus approximation (1976)
331 alpha = 1/sn.rates(i,r) / gamma(1+1/rval);
332 subParNodeAlpha = simDoc.createElement('subParameter');
333 subParNodeAlpha.setAttribute('classPath', 'java.lang.Double');
334 subParNodeAlpha.setAttribute('name', 'alpha'); % shape
335 subParValue = simDoc.createElement('value');
336 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',alpha)));
337 subParNodeAlpha.appendChild(subParValue);
338 distrParNode.appendChild(subParNodeAlpha);
339 subParNodeAlpha = simDoc.createElement('subParameter');
340 subParNodeAlpha.setAttribute('classPath', 'java.lang.Double');
341 subParNodeAlpha.setAttribute('name', 'r'); % scale
342 subParValue = simDoc.createElement('value');
343 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',rval)));
344 subParNodeAlpha.appendChild(subParValue);
345 distrParNode.appendChild(subParNodeAlpha);
346 case ProcessType.LOGNORMAL
347 c = sqrt(sn.scv(i,r));
348 mu = log(1/sn.rates(i,r) / sqrt(c*c + 1));
349 sigma = sqrt(log(c*c + 1));
350 subParNodeAlpha = simDoc.createElement('subParameter');
351 subParNodeAlpha.setAttribute('classPath', 'java.lang.Double');
352 subParNodeAlpha.setAttribute('name', 'mu'); % shape
353 subParValue = simDoc.createElement('value');
354 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',mu)));
355 subParNodeAlpha.appendChild(subParValue);
356 distrParNode.appendChild(subParNodeAlpha);
357 subParNodeAlpha = simDoc.createElement('subParameter');
358 subParNodeAlpha.setAttribute('classPath', 'java.lang.Double');
359 subParNodeAlpha.setAttribute('name', 'sigma'); % scale
360 subParValue = simDoc.createElement('value');
361 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',sigma)));
362 subParNodeAlpha.appendChild(subParValue);
363 distrParNode.appendChild(subParNodeAlpha);
364 case ProcessType.UNIFORM
365 maxVal = ((sqrt(12*sn.scv(i,r)/sn.rates(i,r)^2))+2/sn.rates(i,r))/2;
366 minVal = 2/sn.rates(i,r)-maxVal;
367 subParNodeAlpha = simDoc.createElement('subParameter');
368 subParNodeAlpha.setAttribute('classPath', 'java.lang.Double');
369 subParNodeAlpha.setAttribute('name', 'min'); % shape
370 subParValue = simDoc.createElement('value');
371 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',minVal)));
372 subParNodeAlpha.appendChild(subParValue);
373 distrParNode.appendChild(subParNodeAlpha);
374 subParNodeAlpha = simDoc.createElement('subParameter');
375 subParNodeAlpha.setAttribute('classPath', 'java.lang.Double');
376 subParNodeAlpha.setAttribute('name', 'max'); % scale
377 subParValue = simDoc.createElement('value');
378 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',maxVal)));
379 subParNodeAlpha.appendChild(subParValue);
380 distrParNode.appendChild(subParNodeAlpha);
381 case {ProcessType.REPLAYER, ProcessType.TRACE}
382 subParNodeAlpha = simDoc.createElement(
'subParameter');
383 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.String');
384 subParNodeAlpha.setAttribute(
'name',
'fileName');
385 subParValue = simDoc.createElement(
'value');
386 subParValue.appendChild(simDoc.createTextNode(sn.nodeparam{ind}{r}.fileName));
387 subParNodeAlpha.appendChild(subParValue);
388 distrParNode.appendChild(subParNodeAlpha);
390 serviceTimeStrategyNode.appendChild(distrParNode);
392 strategyNode.appendChild(serviceTimeStrategyNode);
393 section.appendChild(strategyNode);