LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
saveRegions.m
1function [simElem, simDoc] = saveRegions(self, simElem, simDoc)
2% [SIMELEM, SIMDOC] = SAVEREGIONS(SIMELEM, SIMDOC)
3
4% Copyright (c) 2012-2026, Imperial College London
5% All rights reserved.
6
7sn = self.getStruct;
8
9% <blockingRegion name="FCRegion1" type="default">
10% <regionNode nodeName="Queue 1"/>
11% <regionNode nodeName="Queue 2"/>
12% <globalConstraint maxJobs="2"/>
13% <globalMemoryConstraint maxMemory="-1"/>
14% <classConstraint jobClass="Class1" maxJobsPerClass="-1"/>
15% <classMemoryConstraint jobClass="Class1" maxMemoryPerClass="-1"/>
16% <dropRules dropThisClass="false" jobClass="Class1"/>
17% <classWeight jobClass="Class1" weight="1"/>
18% <classSize jobClass="Class1" size="1"/>
19% </blockingRegion>
20
21% First, create implicit FCR regions for LPS queues
22% LPS uses FCR to limit concurrent jobs at PS station
23lpsRegionIdx = length(self.model.regions); % Start numbering after explicit regions
24for i = 1:sn.nstations
25 ist = i;
26 if sn.sched(ist) == SchedStrategy.LPS
27 lpsRegionIdx = lpsRegionIdx + 1;
28 lpsLimit = sn.schedparam(ist, 1); % LPS limit stored in first column
29 ind = sn.stationToNode(ist);
30 nodeName = sn.nodenames{ind};
31
32 blockingRegion = simDoc.createElement('blockingRegion');
33 blockingRegion.setAttribute('name', ['LPSRegion', num2str(lpsRegionIdx)]);
34 blockingRegion.setAttribute('type', 'default');
35
36 regionNode = simDoc.createElement('regionNode');
37 regionNode.setAttribute('nodeName', nodeName);
38 blockingRegion.appendChild(regionNode);
39
40 globalConstraint = simDoc.createElement('globalConstraint');
41 globalConstraint.setAttribute('maxJobs', num2str(lpsLimit));
42 blockingRegion.appendChild(globalConstraint);
43
44 globalMemoryConstraint = simDoc.createElement('globalMemoryConstraint');
45 globalMemoryConstraint.setAttribute('maxMemory', '-1');
46 blockingRegion.appendChild(globalMemoryConstraint);
47
48 for c = 1:sn.nclasses
49 % Skip closed classes with 0 customers (JMT cannot handle these)
50 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
51 continue;
52 end
53
54 % dropRules - LPS uses blocking (waitq), not drop
55 dropRuleElem = simDoc.createElement('dropRules');
56 dropRuleElem.setAttribute('jobClass', sn.classnames{c});
57 dropRuleElem.setAttribute('dropThisClass', 'false');
58 blockingRegion.appendChild(dropRuleElem);
59 end
60
61 simElem.appendChild(blockingRegion);
62 end
63end
64
65% Now save explicit user-defined regions
66% JMT XML schema requires elements in specific order:
67% regionNode*, globalConstraint, globalMemoryConstraint,
68% classConstraint*, classMemoryConstraint*, dropRules*, classWeight*, classSize*, classSoftDeadline*
69for r=1:length(self.model.regions)
70 blockingRegion = simDoc.createElement('blockingRegion');
71 blockingRegion.setAttribute('name', ['FCRegion',num2str(r)]);
72 blockingRegion.setAttribute('type', 'default');
73
74 % 1. regionNode elements
75 for i=1:length(self.model.regions{r}.nodes)
76 regionNode = simDoc.createElement('regionNode');
77 regionNode.setAttribute('nodeName', self.model.regions{r}.nodes{i}.getName);
78 blockingRegion.appendChild(regionNode);
79 end
80
81 % 2. globalConstraint
82 globalConstraint = simDoc.createElement('globalConstraint');
83 globalConstraint.setAttribute('maxJobs', num2str(self.model.regions{r}.globalMaxJobs));
84 blockingRegion.appendChild(globalConstraint);
85
86 % 3. globalMemoryConstraint
87 globalMemoryConstraint = simDoc.createElement('globalMemoryConstraint');
88 globalMemoryConstraint.setAttribute('maxMemory', num2str(self.model.regions{r}.globalMaxMemory));
89 blockingRegion.appendChild(globalMemoryConstraint);
90
91 % 4. All classConstraint elements (for all classes)
92 for c=1:sn.nclasses
93 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
94 continue;
95 end
96 if self.model.regions{r}.classMaxJobs(c) ~= Region.UNBOUNDED
97 classConstraint = simDoc.createElement('classConstraint');
98 classConstraint.setAttribute('jobClass', self.model.regions{r}.classes{c}.getName);
99 classConstraint.setAttribute('maxJobsPerClass', num2str(self.model.regions{r}.classMaxJobs(c)));
100 blockingRegion.appendChild(classConstraint);
101 end
102 end
103
104 % 5. All classMemoryConstraint elements (for all classes)
105 for c=1:sn.nclasses
106 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
107 continue;
108 end
109 if self.model.regions{r}.classMaxMemory(c) ~= Region.UNBOUNDED
110 classMemoryConstraint = simDoc.createElement('classMemoryConstraint');
111 classMemoryConstraint.setAttribute('jobClass', self.model.regions{r}.classes{c}.getName);
112 classMemoryConstraint.setAttribute('maxMemoryPerClass', num2str(self.model.regions{r}.classMaxMemory(c)));
113 blockingRegion.appendChild(classMemoryConstraint);
114 end
115 end
116
117 % 6. All dropRules elements (for all classes)
118 for c=1:sn.nclasses
119 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
120 continue;
121 end
122 % Always write dropRules element - JMT defaults to drop when not specified
123 dropRuleElem = simDoc.createElement('dropRules');
124 dropRuleElem.setAttribute('jobClass', self.model.regions{r}.classes{c}.getName);
125 if self.model.regions{r}.dropRule(c) == DropStrategy.DROP
126 dropRuleElem.setAttribute('dropThisClass', 'true');
127 else
128 dropRuleElem.setAttribute('dropThisClass', 'false');
129 end
130 blockingRegion.appendChild(dropRuleElem);
131 end
132
133 % 7. classWeight elements (currently disabled in JMT)
134 % for c=1:sn.nclasses
135 % if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
136 % continue;
137 % end
138 % if self.model.regions{r}.classWeight(c) ~= 1
139 % classWeightElem = simDoc.createElement('classWeight');
140 % classWeightElem.setAttribute('jobClass', self.model.regions{r}.classes{c}.getName);
141 % classWeightElem.setAttribute('weight', num2str(self.model.regions{r}.classWeight(c)));
142 % blockingRegion.appendChild(classWeightElem);
143 % end
144 % end
145
146 % 8. All classSize elements (for all classes)
147 for c=1:sn.nclasses
148 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
149 continue;
150 end
151 if self.model.regions{r}.classSize(c) ~= 1
152 classSizeElem = simDoc.createElement('classSize');
153 classSizeElem.setAttribute('jobClass', self.model.regions{r}.classes{c}.getName);
154 classSizeElem.setAttribute('size', num2str(self.model.regions{r}.classSize(c)));
155 blockingRegion.appendChild(classSizeElem);
156 end
157 end
158
159 simElem.appendChild(blockingRegion);
160end
161end