LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
saveServiceStrategy.m
1function [simDoc, section] = saveServiceStrategy(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVESERVICESTRATEGY(SIMDOC, SECTION, NODEIDX)
3
4% Copyright (c) 2012-2026, Imperial College London
5% All rights reserved.
6strategyNode = simDoc.createElement('parameter');
7strategyNode.setAttribute('array', 'true');
8strategyNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategy');
9strategyNode.setAttribute('name', 'ServiceStrategy');
10
11sn = self.getStruct;
12numOfClasses = sn.nclasses;
13exportClasses = self.getExportableClasses();
14i = sn.nodeToStation(ind);
15
16for r=1:numOfClasses
17 % Skip classes that should not be exported to JMT
18 if ~exportClasses(r)
19 continue;
20 end
21
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');
41
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');
50 PH = sn.proc{i}{r};
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);
60 end
61
62 subParNodeT = simDoc.createElement('subParameter');
63 subParNodeT.setAttribute('array', 'true');
64 subParNodeT.setAttribute('classPath', 'java.lang.Object');
65 subParNodeT.setAttribute('name', 'T');
66 T = PH{1};
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');
77 if k==j
78 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',-abs(T(k,j)))));
79 else
80 subParValue.appendChild(simDoc.createTextNode(sprintf('%.12f',abs(T(k,j)))));
81 end
82 subParNodeTElem.appendChild(subParValue);
83 subParNodeTvec.appendChild(subParNodeTElem);
84 end
85 subParNodeT.appendChild(subParNodeTvec);
86 end
87
88 subParNodeAlpha.appendChild(subParNodeAlphaVec);
89 distrParNode.appendChild(subParNodeAlpha);
90 distrParNode.appendChild(subParNodeT);
91 serviceTimeStrategyNode.appendChild(distributionNode);
92 serviceTimeStrategyNode.appendChild(distrParNode);
93
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');
103
104 MAP = sn.proc{i}{r};
105
106 subParNodeD0 = simDoc.createElement('subParameter');
107 subParNodeD0.setAttribute('array', 'true');
108 subParNodeD0.setAttribute('classPath', 'java.lang.Object');
109 subParNodeD0.setAttribute('name', 'D0');
110 D0 = MAP{1};
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);
124 end
125 subParNodeD0.appendChild(subParNodeD0vec);
126 end
127 distrParNode.appendChild(subParNodeD0);
128
129 subParNodeD1 = simDoc.createElement('subParameter');
130 subParNodeD1.setAttribute('array', 'true');
131 subParNodeD1.setAttribute('classPath', 'java.lang.Object');
132 subParNodeD1.setAttribute('name', 'D1');
133 D1 = MAP{2};
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);
147 end
148 subParNodeD1.appendChild(subParNodeD1vec);
149 end
150 distrParNode.appendChild(subParNodeD1);
151 serviceTimeStrategyNode.appendChild(distributionNode);
152 serviceTimeStrategyNode.appendChild(distrParNode);
153 else
154 serviceTimeStrategyNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
155 serviceTimeStrategyNode.setAttribute('name', 'ServiceTimeStrategy');
156
157 distributionNode = simDoc.createElement('subParameter');
158 switch sn.procid(i,r)
159 case ProcessType.DET
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';
168 case ProcessType.EXP
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';
195 end
196 distributionNode.setAttribute('classPath', javaClass);
197 switch sn.procid(i,r)
198 case {ProcessType.REPLAYER, ProcessType.TRACE}
199 distributionNode.setAttribute('name', 'Replayer');
200 case ProcessType.EXP
201 distributionNode.setAttribute('name', 'Exponential');
202 case ProcessType.HYPEREXP
203 distributionNode.setAttribute('name', 'Hyperexponential');
204 otherwise
205 distributionNode.setAttribute('name', ProcessType.toText(ProcessType.fromId(sn.procid(i,r))));
206 end
207 serviceTimeStrategyNode.appendChild(distributionNode);
208
209 distrParNode = simDoc.createElement('subParameter');
210 distrParNode.setAttribute('classPath', javaParClass);
211 distrParNode.setAttribute('name', 'distrPar');
212
213 switch sn.procid(i,r)
214 case ProcessType.DET
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);
222 case ProcessType.EXP
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);
389 end
390 serviceTimeStrategyNode.appendChild(distrParNode);
391 end
392 strategyNode.appendChild(serviceTimeStrategyNode);
393 section.appendChild(strategyNode);
394end
395end