1function [simDoc, section] = saveTimingStrategies(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVETIMINGSTRATEGIES(SIMDOC, SECTION, NODEIDX)
4% Copyright (c) 2012-2026, Imperial College London
7strategyNode = simDoc.createElement(
'parameter');
8strategyNode.setAttribute(
'array',
'true');
9strategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategy');
10strategyNode.setAttribute(
'name',
'timingStrategies');
13numOfModes = sn.nodeparam{ind}.nmodes;
16 timimgStrategyNode = simDoc.createElement(
'subParameter');
18 if sn.nodeparam{ind}.timing(m) == TimingStrategy.IMMEDIATE
19 timimgStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ZeroServiceTimeStrategy');
20 timimgStrategyNode.setAttribute(
'name',
'ZeroServiceTimeStrategy');
21 elseif sn.nodeparam{ind}.firingprocid(m) == ProcessType.APH|| sn.nodeparam{ind}.firingprocid(m) == ProcessType.COXIAN || (sn.nodeparam{ind}.firingphases(m)>2 && sn.nodeparam{ind}.firingprocid(m) == ProcessType.HYPEREXP) %|| (sn.phases(i,r)>2 && sn.procid(i,r) == ProcessType.COXIAN) || (sn.phases(i,r)>2 && sn.procid(i,r) == ProcessType.HYPEREXP)
22 % Coxian and HyperExp have 2 parameters when they have a {mu, p} input specification
23 timimgStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
24 timimgStrategyNode.setAttribute(
'name',
'timingStrategy');
25 distributionNode = simDoc.createElement(
'subParameter');
26 distributionNode.setAttribute(
'classPath',
'jmt.engine.random.PhaseTypeDistr');
27 distributionNode.setAttribute(
'name',
'Phase-Type');
28 distrParNode = simDoc.createElement(
'subParameter');
29 distrParNode.setAttribute(
'classPath',
'jmt.engine.random.PhaseTypePar');
30 distrParNode.setAttribute(
'name',
'distrPar');
32 subParNodeAlpha = simDoc.createElement(
'subParameter');
33 subParNodeAlpha.setAttribute(
'array',
'true');
34 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Object');
35 subParNodeAlpha.setAttribute(
'name',
'alpha');
36 subParNodeAlphaVec = simDoc.createElement(
'subParameter');
37 subParNodeAlphaVec.setAttribute(
'array',
'true');
38 subParNodeAlphaVec.setAttribute(
'classPath',
'java.lang.Object');
39 subParNodeAlphaVec.setAttribute(
'name',
'vector');
40 PH=sn.nodeparam{ind}.firingproc{m};
41 alpha = abs(map_pie(PH));
42 nphases=sn.nodeparam{ind}.firingphases(m);
44 subParNodeAlphaElem = simDoc.createElement(
'subParameter');
45 subParNodeAlphaElem.setAttribute(
'classPath',
'java.lang.Double');
46 subParNodeAlphaElem.setAttribute(
'name',
'entry');
47 subParValue = simDoc.createElement(
'value');
48 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',alpha(k))));
49 subParNodeAlphaElem.appendChild(subParValue);
50 subParNodeAlphaVec.appendChild(subParNodeAlphaElem);
53 subParNodeT = simDoc.createElement(
'subParameter');
54 subParNodeT.setAttribute(
'array',
'true');
55 subParNodeT.setAttribute(
'classPath',
'java.lang.Object');
56 subParNodeT.setAttribute(
'name',
'T');
59 subParNodeTvec = simDoc.createElement(
'subParameter');
60 subParNodeTvec.setAttribute(
'array',
'true');
61 subParNodeTvec.setAttribute(
'classPath',
'java.lang.Object');
62 subParNodeTvec.setAttribute(
'name',
'vector');
64 subParNodeTElem = simDoc.createElement(
'subParameter');
65 subParNodeTElem.setAttribute(
'classPath',
'java.lang.Double');
66 subParNodeTElem.setAttribute(
'name',
'entry');
67 subParValue = simDoc.createElement(
'value');
69 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',-abs(T(k,j)))));
71 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',abs(T(k,j)))));
73 subParNodeTElem.appendChild(subParValue);
74 subParNodeTvec.appendChild(subParNodeTElem);
76 subParNodeT.appendChild(subParNodeTvec);
79 subParNodeAlpha.appendChild(subParNodeAlphaVec);
80 distrParNode.appendChild(subParNodeAlpha);
81 distrParNode.appendChild(subParNodeT);
82 timimgStrategyNode.appendChild(distributionNode);
83 timimgStrategyNode.appendChild(distrParNode);
84 elseif sn.nodeparam{ind}.firingprocid(m) == ProcessType.MAP
85 timimgStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
86 timimgStrategyNode.setAttribute(
'name',
'timingStrategy');
87 distributionNode = simDoc.createElement(
'subParameter');
88 distributionNode.setAttribute(
'classPath',
'jmt.engine.random.MAPDistr');
89 distributionNode.setAttribute(
'name',
'Burst (MAP)');
90 distrParNode = simDoc.createElement(
'subParameter');
91 distrParNode.setAttribute(
'classPath',
'jmt.engine.random.MAPPar');
92 distrParNode.setAttribute(
'name',
'distrPar');
94 MAP = sn.nodeparam{ind}.firingproc{m};
96 subParNodeD0 = simDoc.createElement(
'subParameter');
97 subParNodeD0.setAttribute(
'array',
'true');
98 subParNodeD0.setAttribute(
'classPath',
'java.lang.Object');
99 subParNodeD0.setAttribute(
'name',
'D0');
103 subParNodeD0vec = simDoc.createElement(
'subParameter');
104 subParNodeD0vec.setAttribute(
'array',
'true');
105 subParNodeD0vec.setAttribute(
'classPath',
'java.lang.Object');
106 subParNodeD0vec.setAttribute(
'name',
'vector');
108 subParNodeD0Elem = simDoc.createElement(
'subParameter');
109 subParNodeD0Elem.setAttribute(
'classPath',
'java.lang.Double');
110 subParNodeD0Elem.setAttribute(
'name',
'entry');
111 subParValue = simDoc.createElement(
'value');
112 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',D0(k,j))));
113 subParNodeD0Elem.appendChild(subParValue);
114 subParNodeD0vec.appendChild(subParNodeD0Elem);
116 subParNodeD0.appendChild(subParNodeD0vec);
118 distrParNode.appendChild(subParNodeD0);
120 subParNodeD1 = simDoc.createElement(
'subParameter');
121 subParNodeD1.setAttribute(
'array',
'true');
122 subParNodeD1.setAttribute(
'classPath',
'java.lang.Object');
123 subParNodeD1.setAttribute(
'name',
'D1');
126 subParNodeD1vec = simDoc.createElement(
'subParameter');
127 subParNodeD1vec.setAttribute(
'array',
'true');
128 subParNodeD1vec.setAttribute(
'classPath',
'java.lang.Object');
129 subParNodeD1vec.setAttribute(
'name',
'vector');
131 subParNodeD1Elem = simDoc.createElement(
'subParameter');
132 subParNodeD1Elem.setAttribute(
'classPath',
'java.lang.Double');
133 subParNodeD1Elem.setAttribute(
'name',
'entry');
134 subParValue = simDoc.createElement(
'value');
135 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',D1(k,j))));
136 subParNodeD1Elem.appendChild(subParValue);
137 subParNodeD1vec.appendChild(subParNodeD1Elem);
139 subParNodeD1.appendChild(subParNodeD1vec);
141 distrParNode.appendChild(subParNodeD1);
142 timimgStrategyNode.appendChild(distributionNode);
143 timimgStrategyNode.appendChild(distrParNode);
145 timimgStrategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
146 timimgStrategyNode.setAttribute(
'name',
'timingStrategy');
148 distributionNode = simDoc.createElement(
'subParameter');
149 switch sn.nodeparam{ind}.firingprocid(m)
151 javaClass =
'jmt.engine.random.DeterministicDistr';
152 javaParClass =
'jmt.engine.random.DeterministicDistrPar';
153 case ProcessType.COXIAN
154 javaClass =
'jmt.engine.random.CoxianDistr';
155 javaParClass =
'jmt.engine.random.CoxianPar';
156 case ProcessType.ERLANG
157 javaClass =
'jmt.engine.random.Erlang';
158 javaParClass =
'jmt.engine.random.ErlangPar';
160 javaClass =
'jmt.engine.random.Exponential';
161 javaParClass =
'jmt.engine.random.ExponentialPar';
162 case ProcessType.GAMMA
163 javaClass =
'jmt.engine.random.GammaDistr';
164 javaParClass =
'jmt.engine.random.GammaDistrPar';
165 case ProcessType.HYPEREXP
166 javaClass =
'jmt.engine.random.HyperExp';
167 javaParClass =
'jmt.engine.random.HyperExpPar';
168 case ProcessType.PARETO
169 javaClass =
'jmt.engine.random.Pareto';
170 javaParClass =
'jmt.engine.random.ParetoPar';
171 case ProcessType.WEIBULL
172 javaClass =
'jmt.engine.random.Weibull';
173 javaParClass =
'jmt.engine.random.WeibullPar';
174 case ProcessType.LOGNORMAL
175 javaClass =
'jmt.engine.random.Lognormal';
176 javaParClass =
'jmt.engine.random.LognormalPar';
177 case ProcessType.UNIFORM
178 javaClass =
'jmt.engine.random.Uniform';
179 javaParClass =
'jmt.engine.random.UniformPar';
180 case ProcessType.MMPP2
181 javaClass =
'jmt.engine.random.MMPP2Distr';
182 javaParClass =
'jmt.engine.random.MMPP2Par';
183 case {ProcessType.REPLAYER, ProcessType.TRACE}
184 javaClass =
'jmt.engine.random.Replayer';
185 javaParClass =
'jmt.engine.random.ReplayerPar';
187 distributionNode.setAttribute(
'classPath', javaClass);
188 switch sn.nodeparam{ind}.firingprocid(m)
189 case {ProcessType.REPLAYER, ProcessType.TRACE}
190 distributionNode.setAttribute(
'name',
'Replayer');
192 distributionNode.setAttribute(
'name',
'Exponential');
193 case ProcessType.HYPEREXP
194 distributionNode.setAttribute(
'name',
'Hyperexponential');
196 distributionNode.setAttribute(
'name', ProcessType.toText(ProcessType.fromId(sn.nodeparam{ind}.firingprocid(m))));
198 timimgStrategyNode.appendChild(distributionNode);
200 distrParNode = simDoc.createElement(
'subParameter');
201 distrParNode.setAttribute(
'classPath', javaParClass);
202 distrParNode.setAttribute(
'name',
'distrPar');
204 switch sn.nodeparam{ind}.firingprocid(m)
206 subParNodeAlpha = simDoc.createElement(
'subParameter');
207 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
208 subParNodeAlpha.setAttribute(
'name',
't');
209 subParValue = simDoc.createElement(
'value');
210 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',map_lambda(sn.nodeparam{ind}.firingproc{m}))));
211 subParNodeAlpha.appendChild(subParValue);
212 distrParNode.appendChild(subParNodeAlpha);
214 subParNodeAlpha = simDoc.createElement(
'subParameter');
215 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
216 subParNodeAlpha.setAttribute(
'name',
'lambda');
217 subParValue = simDoc.createElement(
'value');
218 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',map_lambda(sn.nodeparam{ind}.firingproc{m}))));
219 subParNodeAlpha.appendChild(subParValue);
220 distrParNode.appendChild(subParNodeAlpha);
221 case ProcessType.HYPEREXP
222 subParNodeAlpha = simDoc.createElement(
'subParameter');
223 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
224 subParNodeAlpha.setAttribute(
'name',
'p');
225 subParValue = simDoc.createElement(
'value');
226 pie = map_pie(sn.nodeparam{ind}.firingproc{m});
227 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',pie(1))));
228 subParNodeAlpha.appendChild(subParValue);
229 distrParNode.appendChild(subParNodeAlpha);
230 subParNodeAlpha = simDoc.createElement(
'subParameter');
231 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
232 subParNodeAlpha.setAttribute(
'name',
'lambda1');
233 subParValue = simDoc.createElement(
'value');
234 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',-sn.nodeparam{ind}.firingproc{m}{1}(1,1))));
235 subParNodeAlpha.appendChild(subParValue);
236 distrParNode.appendChild(subParNodeAlpha);
237 subParNodeAlpha = simDoc.createElement(
'subParameter');
238 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
239 subParNodeAlpha.setAttribute(
'name',
'lambda2');
240 subParValue = simDoc.createElement(
'value');
241 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',-sn.nodeparam{ind}.firingproc{m}{1}(2,2))));
242 subParNodeAlpha.appendChild(subParValue);
243 distrParNode.appendChild(subParNodeAlpha);
244 case ProcessType.ERLANG
245 subParNodeAlpha = simDoc.createElement(
'subParameter');
246 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
247 subParNodeAlpha.setAttribute(
'name',
'alpha');
248 subParValue = simDoc.createElement(
'value');
249 timingrate = map_lambda(sn.nodeparam{ind}.firingproc{m});
250 nphases = sn.nodeparam{ind}.firingphases(m);
251 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',timingrate*nphases)));
252 subParNodeAlpha.appendChild(subParValue);
253 distrParNode.appendChild(subParNodeAlpha);
254 subParNodeAlpha = simDoc.createElement(
'subParameter');
255 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Long');
256 subParNodeAlpha.setAttribute(
'name',
'r');
257 subParValue = simDoc.createElement(
'value');
258 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%d',nphases)));
259 subParNodeAlpha.appendChild(subParValue);
260 distrParNode.appendChild(subParNodeAlpha);
261 case ProcessType.MMPP2
262 subParNodeAlpha = simDoc.createElement(
'subParameter');
263 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
264 subParNodeAlpha.setAttribute(
'name',
'lambda0');
265 subParValue = simDoc.createElement(
'value');
266 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.nodeparam{ind}.firingproc{m}{2}(1,1))));
267 subParNodeAlpha.appendChild(subParValue);
268 distrParNode.appendChild(subParNodeAlpha);
269 subParNodeAlpha = simDoc.createElement(
'subParameter');
270 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
271 subParNodeAlpha.setAttribute(
'name',
'lambda1');
272 subParValue = simDoc.createElement(
'value');
273 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.nodeparam{ind}.firingproc{m}{2}(2,2))));
274 subParNodeAlpha.appendChild(subParValue);
275 distrParNode.appendChild(subParNodeAlpha);
276 subParNodeAlpha = simDoc.createElement(
'subParameter');
277 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
278 subParNodeAlpha.setAttribute(
'name',
'sigma0');
279 subParValue = simDoc.createElement(
'value');
280 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.nodeparam{ind}.firingproc{m}{1}(1,2))));
281 subParNodeAlpha.appendChild(subParValue);
282 distrParNode.appendChild(subParNodeAlpha);
283 subParNodeAlpha = simDoc.createElement(
'subParameter');
284 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
285 subParNodeAlpha.setAttribute(
'name',
'sigma1');
286 subParValue = simDoc.createElement(
'value');
287 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',sn.nodeparam{ind}.firingproc{m}{1}(2,1))));
288 subParNodeAlpha.appendChild(subParValue);
289 distrParNode.appendChild(subParNodeAlpha);
290 case ProcessType.GAMMA
291 param_mean = sn.nodeparam{ind}.firingproc{1}(1);
292 param_scv = sn.nodeparam{ind}.firingproc{1}(2);
293 subParNodeAlpha = simDoc.createElement(
'subParameter');
294 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
295 subParNodeAlpha.setAttribute(
'name',
'alpha');
296 subParValue = simDoc.createElement(
'value');
297 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',1/param_scv)));
298 subParNodeAlpha.appendChild(subParValue);
299 distrParNode.appendChild(subParNodeAlpha);
300 subParNodeAlpha = simDoc.createElement(
'subParameter');
301 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
302 subParNodeAlpha.setAttribute(
'name',
'beta');
303 subParValue = simDoc.createElement(
'value');
304 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',param_mean*param_scv)));
305 subParNodeAlpha.appendChild(subParValue);
306 distrParNode.appendChild(subParNodeAlpha);
307 case ProcessType.PARETO
308 % firingproc contains {shape, scale} from Pareto.getProcess()
309 shape = sn.nodeparam{ind}.firingproc{m}{1};
310 scale = sn.nodeparam{ind}.firingproc{m}{2};
311 subParNodeAlpha = simDoc.createElement(
'subParameter');
312 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
313 subParNodeAlpha.setAttribute(
'name',
'alpha'); % shape
314 subParValue = simDoc.createElement(
'value');
315 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',shape)));
316 subParNodeAlpha.appendChild(subParValue);
317 distrParNode.appendChild(subParNodeAlpha);
318 subParNodeAlpha = simDoc.createElement(
'subParameter');
319 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
320 subParNodeAlpha.setAttribute(
'name',
'k'); % scale
321 subParValue = simDoc.createElement(
'value');
322 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',scale)));
323 subParNodeAlpha.appendChild(subParValue);
324 distrParNode.appendChild(subParNodeAlpha);
325 case ProcessType.WEIBULL
326 line_error(mfilename,sprintf(
'Unsupported firing distribution for mode %d',m));
327 case ProcessType.LOGNORMAL
328 %line_error(mfilename,sprintf(
'Unsupported firing distribution for mode %d',m));
329 param_mean = sn.nodeparam{ind}.firingproc{1}(1);
330 param_scv = sn.nodeparam{ind}.firingproc{1}(2);
332 shape = log(param_mean / sqrt(c*c + 1)); % mu
333 scale = sqrt(log(c*c + 1)); % sigma
334 subParNodeAlpha = simDoc.createElement(
'subParameter');
335 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
336 subParNodeAlpha.setAttribute(
'name',
'mu'); % shape
337 subParValue = simDoc.createElement(
'value');
338 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',shape)));
339 subParNodeAlpha.appendChild(subParValue);
340 distrParNode.appendChild(subParNodeAlpha);
341 subParNodeAlpha = simDoc.createElement(
'subParameter');
342 subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
343 subParNodeAlpha.setAttribute(
'name',
'sigma'); % scale
344 subParValue = simDoc.createElement(
'value');
345 subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',scale)));
346 subParNodeAlpha.appendChild(subParValue);
347 distrParNode.appendChild(subParNodeAlpha);
348 case ProcessType.UNIFORM
349 line_error(mfilename,sprintf(
'Unsupported firing distribution for mode %d',m));
350 % maxVal = ((sqrt(12*sn.scv(i,r)/sn.rates(i,r)^2))+2/sn.rates(i,r))/2;
351 % minVal = 2/sn.rates(i,r)-maxVal;
352 % subParNodeAlpha = simDoc.createElement(
'subParameter');
353 % subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
354 % subParNodeAlpha.setAttribute(
'name',
'min'); % shape
355 % subParValue = simDoc.createElement(
'value');
356 % subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',minVal)));
357 % subParNodeAlpha.appendChild(subParValue);
358 % distrParNode.appendChild(subParNodeAlpha);
359 % subParNodeAlpha = simDoc.createElement(
'subParameter');
360 % subParNodeAlpha.setAttribute(
'classPath',
'java.lang.Double');
361 % subParNodeAlpha.setAttribute(
'name',
'max'); % scale
362 % subParValue = simDoc.createElement(
'value');
363 % subParValue.appendChild(simDoc.createTextNode(sprintf(
'%.12f',maxVal)));
364 % subParNodeAlpha.appendChild(subParValue);
365 % distrParNode.appendChild(subParNodeAlpha);
366 case {ProcessType.REPLAYER, ProcessType.TRACE}
367 line_error(mfilename,sprintf(
'Unsupported firing distribution for mode %d',m));
368 % subParNodeAlpha = simDoc.createElement(
'subParameter');
369 % subParNodeAlpha.setAttribute(
'classPath',
'java.lang.String');
370 % subParNodeAlpha.setAttribute(
'name',
'fileName');
371 % subParValue = simDoc.createElement(
'value');
372 % subParValue.appendChild(simDoc.createTextNode(sn.nodeparam{ind}{r}.fileName));
373 % subParNodeAlpha.appendChild(subParValue);
374 % distrParNode.appendChild(subParNodeAlpha);
376 timimgStrategyNode.appendChild(distrParNode);
378 strategyNode.appendChild(timimgStrategyNode);
380section.appendChild(strategyNode);