1function [simDoc, section] = saveRoutingStrategy(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVEROUTINGSTRATEGY(SIMDOC, SECTION, NODEIDX)
4% Copyright (c) 2012-2026, Imperial College London
6strategyNode = simDoc.createElement(
'parameter');
7strategyNode.setAttribute(
'array',
'true');
8strategyNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.RoutingStrategy');
9strategyNode.setAttribute(
'name',
'RoutingStrategy');
14exportClasses = self.getExportableClasses();
16% since the
class switch node always outputs to a single node, it
is faster
17% to translate it to RAND. Also some problems with sn.rt value otherwise.
18if sn.nodetype(i) == NodeType.ClassSwitch
19 sn.routing(i,:) = RoutingStrategy.RAND;
22 % Skip classes that should not be exported to JMT
27 refClassNode = simDoc.createElement(
'refClass');
28 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
29 strategyNode.appendChild(refClassNode);
30 switch sn.routing(i,r)
31 case RoutingStrategy.RAND
32 concStratNode = simDoc.createElement(
'subParameter');
33 concStratNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.RoutingStrategies.RandomStrategy');
34 concStratNode.setAttribute(
'name',
'Random');
35 case RoutingStrategy.RROBIN
36 concStratNode = simDoc.createElement(
'subParameter');
37 concStratNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.RoutingStrategies.RoundRobinStrategy');
38 concStratNode.setAttribute(
'name',
'Round Robin');
39 case RoutingStrategy.JSQ
40 concStratNode = simDoc.createElement(
'subParameter');
41 concStratNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.RoutingStrategies.ShortestQueueLengthRoutingStrategy');
42 concStratNode.setAttribute(
'name',
'Join the Shortest Queue (JSQ)');
43 case RoutingStrategy.SQ
44 concStratNode = simDoc.createElement(
'subParameter');
45 concStratNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.RoutingStrategies.PowerOfKRoutingStrategy');
46 concStratNode.setAttribute(
'name',
'Power of k');
47 concStratNode2 = simDoc.createElement(
'subParameter');
48 concStratNode2.setAttribute(
'classPath',
'java.lang.Integer');
49 concStratNode2.setAttribute(
'name',
'k');
50 concStratNode2ValueNode = simDoc.createElement(
'value');
51 concStratNode2ValueNode.appendChild(simDoc.createTextNode(sprintf(
'%d',sn.nodeparam{ind}{r}.d)));
52 concStratNode2.appendChild(concStratNode2ValueNode);
53 concStratNode3 = simDoc.createElement(
'subParameter');
54 concStratNode3.setAttribute(
'classPath',
'java.lang.Boolean');
55 concStratNode3.setAttribute(
'name',
'withMemory');
56 concStratNode3ValueNode = simDoc.createElement(
'value');
57 % Always
false: LINE implements SQ(d) only. JMT
's <withMemory>
58 % selects Anselmi & Dufour SQ(d,N), a different policy that LINE
60 concStratNode3ValueNode.appendChild(simDoc.createTextNode('false'));
61 concStratNode3.appendChild(concStratNode3ValueNode);
62 concStratNode.appendChild(concStratNode2);
63 concStratNode.appendChild(concStratNode3);
64 case RoutingStrategy.WRROBIN
65 concStratNode = simDoc.createElement('subParameter
');
66 concStratNode.setAttribute('classPath
', 'jmt.engine.NetStrategies.RoutingStrategies.WeightedRoundRobinStrategy
');
67 concStratNode.setAttribute('name
', 'Weighted Round Robin
');
68 concStratNode2 = simDoc.createElement('subParameter
');
69 concStratNode2.setAttribute('array
', 'true');
70 concStratNode2.setAttribute('classPath
', 'jmt.engine.NetStrategies.RoutingStrategies.WeightEntry
');
71 concStratNode2.setAttribute('name
', 'WeightEntryArray
');
72 for j=find(sn.connmatrix(i,:)) % linked stations
73 weight = sn.nodeparam{ind}{r}.weights(j);
74 concStratNode3 = simDoc.createElement('subParameter
');
75 concStratNode3.setAttribute('classPath
', 'jmt.engine.NetStrategies.RoutingStrategies.WeightEntry
');
76 concStratNode3.setAttribute('name
', 'WeightEntry
');
77 concStratNode4Station = simDoc.createElement('subParameter
');
78 concStratNode4Station.setAttribute('classPath
', 'java.lang.String
');
79 concStratNode4Station.setAttribute('name
', 'stationName
');
80 concStratNode4StationValueNode = simDoc.createElement('value
');
81 concStratNode4StationValueNode.appendChild(simDoc.createTextNode(sprintf('%s
',sn.nodenames{j})));
82 concStratNode4Station.appendChild(concStratNode4StationValueNode);
83 concStratNode3.appendChild(concStratNode4Station);
84 concStratNode4Weight = simDoc.createElement('subParameter
');
85 concStratNode4Weight.setAttribute('classPath
', 'java.lang.Integer
');
86 concStratNode4Weight.setAttribute('name
', 'weight
');
87 concStratNode4WeightValueNode = simDoc.createElement('value
');
88 concStratNode4WeightValueNode.appendChild(simDoc.createTextNode(sprintf('%d
',weight)));
89 concStratNode4Weight.appendChild(concStratNode4WeightValueNode);
90 concStratNode3.appendChild(concStratNode4Station);
91 concStratNode3.appendChild(concStratNode4Weight);
92 concStratNode2.appendChild(concStratNode3);
94 concStratNode.appendChild(concStratNode2);
95 case RoutingStrategy.PROB
96 concStratNode = simDoc.createElement('subParameter
');
97 concStratNode.setAttribute('classPath
', 'jmt.engine.NetStrategies.RoutingStrategies.EmpiricalStrategy
');
98 concStratNode.setAttribute('name
', RoutingStrategy.toText(RoutingStrategy.PROB));
99 concStratNode2 = simDoc.createElement('subParameter
');
100 concStratNode2.setAttribute('array
', 'true');
101 concStratNode2.setAttribute('classPath
', 'jmt.engine.random.EmpiricalEntry
');
102 concStratNode2.setAttribute('name
', 'EmpiricalEntryArray
');
103 for j=find(sn.connmatrix(i,:)) % linked stations
104 probRouting = sn.rtnodes((i-1)*K+r,(j-1)*K+r);
106 concStratNode3 = simDoc.createElement('subParameter
');
107 concStratNode3.setAttribute('classPath
', 'jmt.engine.random.EmpiricalEntry
');
108 concStratNode3.setAttribute('name
', 'EmpiricalEntry
');
109 concStratNode4Station = simDoc.createElement('subParameter
');
110 concStratNode4Station.setAttribute('classPath
', 'java.lang.String
');
111 concStratNode4Station.setAttribute('name
', 'stationName
');
112 concStratNode4StationValueNode = simDoc.createElement('value
');
113 concStratNode4StationValueNode.appendChild(simDoc.createTextNode(sprintf('%s
',sn.nodenames{j})));
114 concStratNode4Station.appendChild(concStratNode4StationValueNode);
115 concStratNode3.appendChild(concStratNode4Station);
116 concStratNode4Probability = simDoc.createElement('subParameter
');
117 concStratNode4Probability.setAttribute('classPath
', 'java.lang.Double
');
118 concStratNode4Probability.setAttribute('name
', 'probability
');
119 concStratNode4ProbabilityValueNode = simDoc.createElement('value
');
120 concStratNode4ProbabilityValueNode.appendChild(simDoc.createTextNode(sprintf('%12.12f
',probRouting)));
121 concStratNode4Probability.appendChild(concStratNode4ProbabilityValueNode);
122 concStratNode3.appendChild(concStratNode4Station);
123 concStratNode3.appendChild(concStratNode4Probability);
124 concStratNode2.appendChild(concStratNode3);
127 concStratNode.appendChild(concStratNode2);
129 concStratNode = simDoc.createElement('subParameter
');
130 concStratNode.setAttribute('classPath
', 'jmt.engine.NetStrategies.RoutingStrategies.DisabledRoutingStrategy
');
131 concStratNode.setAttribute('name
', 'Random
');
133 strategyNode.appendChild(concStratNode);
134 section.appendChild(strategyNode);