1function [simDoc, section] = saveDelayOffStrategy(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVEDELAYOFFSTRATEGY(SIMDOC, SECTION, NODEIDX)
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.
8% Copyright (c) 2012-2026, Imperial College London
13currentNode = self.model.getNodes{ind};
15% Check
if this node has delay-off enabled
16if ~isa(currentNode,
'Queue') || isempty(currentNode.setupTime) || isempty(currentNode.delayoffTime)
20% Check if any class has delay-off configured
23 if r <= length(currentNode.setupTime) && ~isempty(currentNode.setupTime{r})
33% Export delayOffTime parameter
34delayOffParamNode = simDoc.createElement(
'parameter');
35delayOffParamNode.setAttribute(
'array',
'true');
36delayOffParamNode.setAttribute(
'classPath',
'java.lang.Object');
37delayOffParamNode.setAttribute(
'name',
'delayOffTime');
40 refClassNode = simDoc.createElement(
'refClass');
41 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
42 delayOffParamNode.appendChild(refClassNode);
44 subParamNode = simDoc.createElement(
'subParameter');
45 subParamNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
46 subParamNode.setAttribute(
'name',
'delayOffTime');
48 if r <= length(currentNode.delayoffTime) && ~isempty(currentNode.delayoffTime{r})
49 dist = currentNode.delayoffTime{r};
50 subParamNode = appendDistributionXml(simDoc, subParamNode, dist);
52 % Zero time (Immediate)
53 subParamNode = appendZeroTimeXml(simDoc, subParamNode);
56 delayOffParamNode.appendChild(subParamNode);
58section.appendChild(delayOffParamNode);
60% Export setUpTime parameter
61setupParamNode = simDoc.createElement(
'parameter');
62setupParamNode.setAttribute(
'array',
'true');
63setupParamNode.setAttribute(
'classPath',
'java.lang.Object');
64setupParamNode.setAttribute(
'name',
'setUpTime');
67 refClassNode = simDoc.createElement(
'refClass');
68 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
69 setupParamNode.appendChild(refClassNode);
71 subParamNode = simDoc.createElement(
'subParameter');
72 subParamNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy');
73 subParamNode.setAttribute(
'name',
'setUpTime');
75 if r <= length(currentNode.setupTime) && ~isempty(currentNode.setupTime{r})
76 dist = currentNode.setupTime{r};
77 subParamNode = appendDistributionXml(simDoc, subParamNode, dist);
79 % Zero time (Immediate)
80 subParamNode = appendZeroTimeXml(simDoc, subParamNode);
83 setupParamNode.appendChild(subParamNode);
85section.appendChild(setupParamNode);
89function parentNode = appendZeroTimeXml(simDoc, parentNode)
90% Append zero/immediate service time XML
92distributionNode = simDoc.createElement(
'subParameter');
93distributionNode.setAttribute(
'classPath',
'jmt.engine.random.DeterministicDistr');
94distributionNode.setAttribute(
'name',
'Deterministic');
95parentNode.appendChild(distributionNode);
97distrParNode = simDoc.createElement(
'subParameter');
98distrParNode.setAttribute(
'classPath',
'jmt.engine.random.DeterministicDistrPar');
99distrParNode.setAttribute(
'name',
'distrPar');
101tNode = simDoc.createElement(
'subParameter');
102tNode.setAttribute(
'classPath',
'java.lang.Double');
103tNode.setAttribute(
'name',
't');
104tValue = simDoc.createElement(
'value');
105tValue.appendChild(simDoc.createTextNode(
'0.0'));
106tNode.appendChild(tValue);
107distrParNode.appendChild(tNode);
108parentNode.appendChild(distrParNode);
112function parentNode = appendDistributionXml(simDoc, parentNode, dist)
113% Append distribution XML elements to a parent node
for JMT
export
114% Supports Exp, Erlang, Det, and Immediate distributions
116if isa(dist,
'Immediate')
117 % Zero/Immediate service time
118 parentNode = appendZeroTimeXml(simDoc, parentNode);
120elseif isa(dist,
'Exp')
121 distributionNode = simDoc.createElement('subParameter');
122 distributionNode.setAttribute('classPath', 'jmt.engine.random.Exponential');
123 distributionNode.setAttribute('name', 'Exponential');
124 parentNode.appendChild(distributionNode);
126 distrParNode = simDoc.createElement('subParameter');
127 distrParNode.setAttribute('classPath', 'jmt.engine.random.ExponentialPar');
128 distrParNode.setAttribute('name', 'distrPar');
130 lambdaNode = simDoc.createElement('subParameter');
131 lambdaNode.setAttribute('classPath', 'java.lang.Double');
132 lambdaNode.setAttribute('name', 'lambda');
133 lambdaValue = simDoc.createElement('value');
134 lambdaValue.appendChild(simDoc.createTextNode(sprintf('%.12f', dist.getRate())));
135 lambdaNode.appendChild(lambdaValue);
136 distrParNode.appendChild(lambdaNode);
137 parentNode.appendChild(distrParNode);
139elseif isa(dist, 'Erlang')
140 distributionNode = simDoc.createElement('subParameter');
141 distributionNode.setAttribute('classPath', 'jmt.engine.random.Erlang');
142 distributionNode.setAttribute('name', 'Erlang');
143 parentNode.appendChild(distributionNode);
145 distrParNode = simDoc.createElement('subParameter');
146 distrParNode.setAttribute('classPath', 'jmt.engine.random.ErlangPar');
147 distrParNode.setAttribute('name', 'distrPar');
149 alphaNode = simDoc.createElement('subParameter');
150 alphaNode.setAttribute('classPath', 'java.lang.Double');
151 alphaNode.setAttribute('name', 'alpha');
152 alphaValue = simDoc.createElement('value');
153 meanVal = dist.getMean();
154 phases = dist.getNumberOfPhases();
155 alpha = phases / meanVal;
156 alphaValue.appendChild(simDoc.createTextNode(sprintf('%.12f', alpha)));
157 alphaNode.appendChild(alphaValue);
158 distrParNode.appendChild(alphaNode);
160 rNode = simDoc.createElement('subParameter');
161 rNode.setAttribute('classPath', 'java.lang.Long');
162 rNode.setAttribute('name', 'r');
163 rValue = simDoc.createElement('value');
164 rValue.appendChild(simDoc.createTextNode(sprintf('%d', phases)));
165 rNode.appendChild(rValue);
166 distrParNode.appendChild(rNode);
167 parentNode.appendChild(distrParNode);
169elseif isa(dist, 'Det')
170 distributionNode = simDoc.createElement('subParameter');
171 distributionNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistr');
172 distributionNode.setAttribute('name', 'Deterministic');
173 parentNode.appendChild(distributionNode);
175 distrParNode = simDoc.createElement('subParameter');
176 distrParNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistrPar');
177 distrParNode.setAttribute('name', 'distrPar');
179 tNode = simDoc.createElement('subParameter');
180 tNode.setAttribute('classPath', 'java.lang.Double');
181 tNode.setAttribute('name', 't');
182 tValue = simDoc.createElement('value');
183 tValue.appendChild(simDoc.createTextNode(sprintf('%.12f', dist.getMean())));
184 tNode.appendChild(tValue);
185 distrParNode.appendChild(tNode);
186 parentNode.appendChild(distrParNode);
189 % Default fallback: use mean as deterministic value
190 distributionNode = simDoc.createElement('subParameter');
191 distributionNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistr');
192 distributionNode.setAttribute('name', 'Deterministic');
193 parentNode.appendChild(distributionNode);
195 distrParNode = simDoc.createElement('subParameter');
196 distrParNode.setAttribute('classPath', 'jmt.engine.random.DeterministicDistrPar');
197 distrParNode.setAttribute('name', 'distrPar');
199 tNode = simDoc.createElement('subParameter');
200 tNode.setAttribute('classPath', 'java.lang.Double');
201 tNode.setAttribute('name', 't');
202 tValue = simDoc.createElement('value');
203 tValue.appendChild(simDoc.createTextNode(sprintf('%.12f', dist.getMean())));
204 tNode.appendChild(tValue);
205 distrParNode.appendChild(tNode);
206 parentNode.appendChild(distrParNode);