LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
saveTimingStrategies.m
1function [simDoc, section] = saveTimingStrategies(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVETIMINGSTRATEGIES(SIMDOC, SECTION, NODEIDX)
3
4% Copyright (c) 2012-2026, Imperial College London
5% All rights reserved.
6
7strategyNode = simDoc.createElement('parameter');
8strategyNode.setAttribute('array', 'true');
9strategyNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategy');
10strategyNode.setAttribute('name', 'timingStrategies');
11
12sn = self.getStruct;
13numOfModes = sn.nodeparam{ind}.nmodes;
14for m=1:numOfModes
15
16 timimgStrategyNode = simDoc.createElement('subParameter');
17
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');
31
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);
43 for k=1:nphases
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);
51 end
52
53 subParNodeT = simDoc.createElement('subParameter');
54 subParNodeT.setAttribute('array', 'true');
55 subParNodeT.setAttribute('classPath', 'java.lang.Object');
56 subParNodeT.setAttribute('name', 'T');
57 T = PH{1};
58 for k=1:nphases
59 subParNodeTvec = simDoc.createElement('subParameter');
60 subParNodeTvec.setAttribute('array', 'true');
61 subParNodeTvec.setAttribute('classPath', 'java.lang.Object');
62 subParNodeTvec.setAttribute('name', 'vector');
63 for j=1:nphases
64 subParNodeTElem = simDoc.createElement('subParameter');
65 subParNodeTElem.setAttribute('classPath', 'java.lang.Double');
66 subParNodeTElem.setAttribute('name', 'entry');
67 subParValue = simDoc.createElement('value');
68 if k==j
69 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',-abs(T(k,j)))));
70 else
71 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',abs(T(k,j)))));
72 end
73 subParNodeTElem.appendChild(subParValue);
74 subParNodeTvec.appendChild(subParNodeTElem);
75 end
76 subParNodeT.appendChild(subParNodeTvec);
77 end
78
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');
93
94 MAP = sn.nodeparam{ind}.firingproc{m};
95
96 subParNodeD0 = simDoc.createElement('subParameter');
97 subParNodeD0.setAttribute('array', 'true');
98 subParNodeD0.setAttribute('classPath', 'java.lang.Object');
99 subParNodeD0.setAttribute('name', 'D0');
100
101 D0 = MAP{1};
102 for k=1:nphases
103 subParNodeD0vec = simDoc.createElement('subParameter');
104 subParNodeD0vec.setAttribute('array', 'true');
105 subParNodeD0vec.setAttribute('classPath', 'java.lang.Object');
106 subParNodeD0vec.setAttribute('name', 'vector');
107 for j=1:nphases
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);
115 end
116 subParNodeD0.appendChild(subParNodeD0vec);
117 end
118 distrParNode.appendChild(subParNodeD0);
119
120 subParNodeD1 = simDoc.createElement('subParameter');
121 subParNodeD1.setAttribute('array', 'true');
122 subParNodeD1.setAttribute('classPath', 'java.lang.Object');
123 subParNodeD1.setAttribute('name', 'D1');
124 D1 = MAP{2};
125 for k=1:nphases
126 subParNodeD1vec = simDoc.createElement('subParameter');
127 subParNodeD1vec.setAttribute('array', 'true');
128 subParNodeD1vec.setAttribute('classPath', 'java.lang.Object');
129 subParNodeD1vec.setAttribute('name', 'vector');
130 for j=1:nphases
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);
138 end
139 subParNodeD1.appendChild(subParNodeD1vec);
140 end
141 distrParNode.appendChild(subParNodeD1);
142 timimgStrategyNode.appendChild(distributionNode);
143 timimgStrategyNode.appendChild(distrParNode);
144 else
145 timimgStrategyNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
146 timimgStrategyNode.setAttribute('name', 'timingStrategy');
147
148 distributionNode = simDoc.createElement('subParameter');
149 switch sn.nodeparam{ind}.firingprocid(m)
150 case ProcessType.DET
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';
159 case ProcessType.EXP
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';
186 end
187 distributionNode.setAttribute('classPath', javaClass);
188 switch sn.nodeparam{ind}.firingprocid(m)
189 case {ProcessType.REPLAYER, ProcessType.TRACE}
190 distributionNode.setAttribute('name', 'Replayer');
191 case ProcessType.EXP
192 distributionNode.setAttribute('name', 'Exponential');
193 case ProcessType.HYPEREXP
194 distributionNode.setAttribute('name', 'Hyperexponential');
195 otherwise
196 distributionNode.setAttribute('name', ProcessType.toText(ProcessType.fromId(sn.nodeparam{ind}.firingprocid(m))));
197 end
198 timimgStrategyNode.appendChild(distributionNode);
199
200 distrParNode = simDoc.createElement('subParameter');
201 distrParNode.setAttribute('classPath', javaParClass);
202 distrParNode.setAttribute('name', 'distrPar');
203
204 switch sn.nodeparam{ind}.firingprocid(m)
205 case ProcessType.DET
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);
213 case ProcessType.EXP
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);
331 c = sqrt(param_scv);
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);
375 end
376 timimgStrategyNode.appendChild(distrParNode);
377 end
378 strategyNode.appendChild(timimgStrategyNode);
379end
380section.appendChild(strategyNode);
381end
382
383