LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
saveDelayOffStrategy.m
1function [simDoc, section] = saveDelayOffStrategy(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVEDELAYOFFSTRATEGY(SIMDOC, SECTION, NODEIDX)
3%
4% Saves delay-off and setup time strategies for Queue nodes.
5% This exports the delayOffTime and setUpTime parameters to JMT XML format
6% when the queue has delay-off times enabled.
7
8% Copyright (c) 2012-2026, Imperial College London
9% All rights reserved.
10
11sn = self.getStruct;
12K = sn.nclasses;
13currentNode = self.model.getNodes{ind};
14
15% Check if this node has delay-off enabled
16if ~isa(currentNode, 'Queue') || isempty(currentNode.setupTime) || isempty(currentNode.delayoffTime)
17 return;
18end
19
20% Check if any class has delay-off configured
21hasDelayOff = false;
22for r = 1:K
23 if r <= length(currentNode.setupTime) && ~isempty(currentNode.setupTime{r})
24 hasDelayOff = true;
25 break;
26 end
27end
28
29if ~hasDelayOff
30 return;
31end
32
33% Export delayOffTime parameter
34delayOffParamNode = simDoc.createElement('parameter');
35delayOffParamNode.setAttribute('array', 'true');
36delayOffParamNode.setAttribute('classPath', 'java.lang.Object');
37delayOffParamNode.setAttribute('name', 'delayOffTime');
38
39for r = 1:K
40 refClassNode = simDoc.createElement('refClass');
41 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
42 delayOffParamNode.appendChild(refClassNode);
43
44 % JMT casts each per-class entry to ServiceStrategy[] and reads element
45 % [0] of it (Server.java:1281), so the strategy must sit inside a
46 % single-element array rather than directly under the class.
47 classRowNode = simDoc.createElement('subParameter');
48 classRowNode.setAttribute('array', 'true');
49 classRowNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategy');
50 classRowNode.setAttribute('name', 'delayOffTime');
51
52 subParamNode = simDoc.createElement('subParameter');
53 subParamNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
54 subParamNode.setAttribute('name', 'ServiceTimeStrategy');
55
56 if r <= length(currentNode.delayoffTime) && ~isempty(currentNode.delayoffTime{r})
57 dist = currentNode.delayoffTime{r};
58 subParamNode = appendDistributionXml(simDoc, subParamNode, dist);
59 else
60 % Zero time (Immediate)
61 subParamNode = appendZeroTimeXml(simDoc, subParamNode);
62 end
63
64 classRowNode.appendChild(subParamNode);
65 delayOffParamNode.appendChild(classRowNode);
66end
67section.appendChild(delayOffParamNode);
68
69% Export setUpTime parameter
70setupParamNode = simDoc.createElement('parameter');
71setupParamNode.setAttribute('array', 'true');
72setupParamNode.setAttribute('classPath', 'java.lang.Object');
73setupParamNode.setAttribute('name', 'setUpTime');
74
75for r = 1:K
76 refClassNode = simDoc.createElement('refClass');
77 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
78 setupParamNode.appendChild(refClassNode);
79
80 classRowNode = simDoc.createElement('subParameter');
81 classRowNode.setAttribute('array', 'true');
82 classRowNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategy');
83 classRowNode.setAttribute('name', 'setUpTime');
84
85 subParamNode = simDoc.createElement('subParameter');
86 subParamNode.setAttribute('classPath', 'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
87 subParamNode.setAttribute('name', 'ServiceTimeStrategy');
88
89 if r <= length(currentNode.setupTime) && ~isempty(currentNode.setupTime{r})
90 dist = currentNode.setupTime{r};
91 subParamNode = appendDistributionXml(simDoc, subParamNode, dist);
92 else
93 % Zero time (Immediate)
94 subParamNode = appendZeroTimeXml(simDoc, subParamNode);
95 end
96
97 classRowNode.appendChild(subParamNode);
98 setupParamNode.appendChild(classRowNode);
99end
100section.appendChild(setupParamNode);
101
102end
103
104function parentNode = appendZeroTimeXml(simDoc, parentNode)
105% Append zero/immediate service time XML
106
107distributionNode = simDoc.createElement('subParameter');
108distributionNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistr');
109distributionNode.setAttribute('name', 'Deterministic');
110parentNode.appendChild(distributionNode);
111
112distrParNode = simDoc.createElement('subParameter');
113distrParNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistrPar');
114distrParNode.setAttribute('name', 'distrPar');
115
116tNode = simDoc.createElement('subParameter');
117tNode.setAttribute('classPath', 'java.lang.Double');
118tNode.setAttribute('name', 't');
119tValue = simDoc.createElement('value');
120tValue.appendChild(simDoc.createTextNode('0.0'));
121tNode.appendChild(tValue);
122distrParNode.appendChild(tNode);
123parentNode.appendChild(distrParNode);
124
125end
126
127function parentNode = appendDistributionXml(simDoc, parentNode, dist)
128% Append distribution XML elements to a parent node for JMT export
129% Supports Exp, Erlang, Det, and Immediate distributions
130
131if isa(dist, 'Immediate')
132 % Zero/Immediate service time
133 parentNode = appendZeroTimeXml(simDoc, parentNode);
134
135elseif isa(dist, 'Exp')
136 distributionNode = simDoc.createElement('subParameter');
137 distributionNode.setAttribute('classPath', 'jmt.engine.random.Exponential');
138 distributionNode.setAttribute('name', 'Exponential');
139 parentNode.appendChild(distributionNode);
140
141 distrParNode = simDoc.createElement('subParameter');
142 distrParNode.setAttribute('classPath', 'jmt.engine.random.ExponentialPar');
143 distrParNode.setAttribute('name', 'distrPar');
144
145 lambdaNode = simDoc.createElement('subParameter');
146 lambdaNode.setAttribute('classPath', 'java.lang.Double');
147 lambdaNode.setAttribute('name', 'lambda');
148 lambdaValue = simDoc.createElement('value');
149 lambdaValue.appendChild(simDoc.createTextNode(sprintf('%.12f', dist.getRate())));
150 lambdaNode.appendChild(lambdaValue);
151 distrParNode.appendChild(lambdaNode);
152 parentNode.appendChild(distrParNode);
153
154elseif isa(dist, 'Erlang')
155 distributionNode = simDoc.createElement('subParameter');
156 distributionNode.setAttribute('classPath', 'jmt.engine.random.Erlang');
157 distributionNode.setAttribute('name', 'Erlang');
158 parentNode.appendChild(distributionNode);
159
160 distrParNode = simDoc.createElement('subParameter');
161 distrParNode.setAttribute('classPath', 'jmt.engine.random.ErlangPar');
162 distrParNode.setAttribute('name', 'distrPar');
163
164 alphaNode = simDoc.createElement('subParameter');
165 alphaNode.setAttribute('classPath', 'java.lang.Double');
166 alphaNode.setAttribute('name', 'alpha');
167 alphaValue = simDoc.createElement('value');
168 meanVal = dist.getMean();
169 phases = dist.getNumberOfPhases();
170 alpha = phases / meanVal;
171 alphaValue.appendChild(simDoc.createTextNode(sprintf('%.12f', alpha)));
172 alphaNode.appendChild(alphaValue);
173 distrParNode.appendChild(alphaNode);
174
175 rNode = simDoc.createElement('subParameter');
176 rNode.setAttribute('classPath', 'java.lang.Long');
177 rNode.setAttribute('name', 'r');
178 rValue = simDoc.createElement('value');
179 rValue.appendChild(simDoc.createTextNode(sprintf('%d', phases)));
180 rNode.appendChild(rValue);
181 distrParNode.appendChild(rNode);
182 parentNode.appendChild(distrParNode);
183
184elseif isa(dist, 'Det')
185 distributionNode = simDoc.createElement('subParameter');
186 distributionNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistr');
187 distributionNode.setAttribute('name', 'Deterministic');
188 parentNode.appendChild(distributionNode);
189
190 distrParNode = simDoc.createElement('subParameter');
191 distrParNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistrPar');
192 distrParNode.setAttribute('name', 'distrPar');
193
194 tNode = simDoc.createElement('subParameter');
195 tNode.setAttribute('classPath', 'java.lang.Double');
196 tNode.setAttribute('name', 't');
197 tValue = simDoc.createElement('value');
198 tValue.appendChild(simDoc.createTextNode(sprintf('%.12f', dist.getMean())));
199 tNode.appendChild(tValue);
200 distrParNode.appendChild(tNode);
201 parentNode.appendChild(distrParNode);
202
203else
204 % Default fallback: use mean as deterministic value
205 distributionNode = simDoc.createElement('subParameter');
206 distributionNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistr');
207 distributionNode.setAttribute('name', 'Deterministic');
208 parentNode.appendChild(distributionNode);
209
210 distrParNode = simDoc.createElement('subParameter');
211 distrParNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistrPar');
212 distrParNode.setAttribute('name', 'distrPar');
213
214 tNode = simDoc.createElement('subParameter');
215 tNode.setAttribute('classPath', 'java.lang.Double');
216 tNode.setAttribute('name', 't');
217 tValue = simDoc.createElement('value');
218 tValue.appendChild(simDoc.createTextNode(sprintf('%.12f', dist.getMean())));
219 tNode.appendChild(tValue);
220 distrParNode.appendChild(tNode);
221 parentNode.appendChild(distrParNode);
222end
223
224end
Definition fjtag.m:157
Definition Station.m:245