LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
saveCacheStrategy.m
1function [simDoc, section] = saveCacheStrategy(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVECACHESTRATEGY(SIMDOC, SECTION, NODEIDX)
3%
4% Saves cache strategy parameters for JMT simulation
5% This includes: maxItems, cacheCapacity, transition matrix,
6% job classes, hit/miss classes, replacement policy, and popularity distributions
7
8% Copyright (c) 2012-2026, Imperial College London
9% All rights reserved.
10
11sn = self.getStruct;
12K = sn.nclasses;
13nodeparam = sn.nodeparam{ind};
14
15% Parameter 1: maxItems (Integer)
16maxItemsNode = simDoc.createElement('parameter');
17maxItemsNode.setAttribute('classPath', 'java.lang.Integer');
18maxItemsNode.setAttribute('name', 'maxItems');
19valNode = simDoc.createElement('value');
20valNode.appendChild(simDoc.createTextNode(sprintf('%d', nodeparam.nitems)));
21maxItemsNode.appendChild(valNode);
22section.appendChild(maxItemsNode);
23
24% Parameter 2: cacheCapacity (Integer[])
25capNode = simDoc.createElement('parameter');
26capNode.setAttribute('array', 'true');
27capNode.setAttribute('classPath', 'java.lang.Integer');
28capNode.setAttribute('name', 'cacheCapacity');
29itemcap = nodeparam.itemcap;
30for lvl = 1:length(itemcap)
31 subParNode = simDoc.createElement('subParameter');
32 subParNode.setAttribute('classPath', 'java.lang.Integer');
33 subParNode.setAttribute('name', 'capacity');
34 valNode = simDoc.createElement('value');
35 valNode.appendChild(simDoc.createTextNode(sprintf('%d', itemcap(lvl))));
36 subParNode.appendChild(valNode);
37 capNode.appendChild(subParNode);
38end
39section.appendChild(capNode);
40
41% Parameter 3: matrix (Object[] of Float[]) - Cache transition matrix
42% For LRU: items always move to level 0 (front) on hit
43% For FIFO/RR: items stay at their current level (identity matrix)
44matrixNode = simDoc.createElement('parameter');
45matrixNode.setAttribute('array', 'true');
46matrixNode.setAttribute('classPath', 'java.lang.Object');
47matrixNode.setAttribute('name', 'matrix');
48nLevels = length(itemcap);
49for lvl1 = 1:nLevels
50 rowNode = simDoc.createElement('subParameter');
51 rowNode.setAttribute('array', 'true');
52 rowNode.setAttribute('classPath', 'java.lang.Float');
53 rowNode.setAttribute('name', 'row');
54 for lvl2 = 1:nLevels
55 cellNode = simDoc.createElement('subParameter');
56 cellNode.setAttribute('classPath', 'java.lang.Float');
57 cellNode.setAttribute('name', 'cell');
58 valNode = simDoc.createElement('value');
59 % For LRU, items move to next level on hit (climb up)
60 % Hit at list i → move to list i+1; hit at last list → stay
61 % For other policies, use identity matrix (stay in place)
62 if nodeparam.replacestrat == ReplacementStrategy.LRU
63 if lvl1 < nLevels % not the last list
64 % Move to next level (lvl1+1)
65 if lvl2 == lvl1 + 1
66 valNode.appendChild(simDoc.createTextNode('1.0'));
67 else
68 valNode.appendChild(simDoc.createTextNode('0.0'));
69 end
70 else % last list: stay in place
71 if lvl2 == nLevels
72 valNode.appendChild(simDoc.createTextNode('1.0'));
73 else
74 valNode.appendChild(simDoc.createTextNode('0.0'));
75 end
76 end
77 else
78 % FIFO, RR: identity matrix
79 if lvl1 == lvl2
80 valNode.appendChild(simDoc.createTextNode('1.0'));
81 else
82 valNode.appendChild(simDoc.createTextNode('0.0'));
83 end
84 end
85 cellNode.appendChild(valNode);
86 rowNode.appendChild(cellNode);
87 end
88 matrixNode.appendChild(rowNode);
89end
90section.appendChild(matrixNode);
91
92% Parameter 4: jobClasses (JobClass[])
93% Classes that access the cache (have hit/miss behavior)
94jobClassesNode = simDoc.createElement('parameter');
95jobClassesNode.setAttribute('array', 'true');
96jobClassesNode.setAttribute('classPath', 'jmt.engine.QueueNet.JobClass');
97jobClassesNode.setAttribute('name', 'jobClasses');
98for r = 1:K
99 if nodeparam.hitclass(r) > 0 || nodeparam.missclass(r) > 0
100 subParNode = simDoc.createElement('subParameter');
101 subParNode.setAttribute('classPath', 'jmt.engine.QueueNet.JobClass');
102 subParNode.setAttribute('name', 'jobClass');
103 valNode = simDoc.createElement('value');
104 valNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
105 subParNode.appendChild(valNode);
106 jobClassesNode.appendChild(subParNode);
107 end
108end
109section.appendChild(jobClassesNode);
110
111% Parameter 5: hitClasses (JobClass[])
112hitClassesNode = simDoc.createElement('parameter');
113hitClassesNode.setAttribute('array', 'true');
114hitClassesNode.setAttribute('classPath', 'jmt.engine.QueueNet.JobClass');
115hitClassesNode.setAttribute('name', 'hitClasses');
116for r = 1:K
117 if nodeparam.hitclass(r) > 0
118 subParNode = simDoc.createElement('subParameter');
119 subParNode.setAttribute('classPath', 'jmt.engine.QueueNet.JobClass');
120 subParNode.setAttribute('name', 'hitClass');
121 valNode = simDoc.createElement('value');
122 hitIdx = nodeparam.hitclass(r);
123 valNode.appendChild(simDoc.createTextNode(sn.classnames{hitIdx}));
124 subParNode.appendChild(valNode);
125 hitClassesNode.appendChild(subParNode);
126 end
127end
128section.appendChild(hitClassesNode);
129
130% Parameter 6: missClasses (JobClass[])
131missClassesNode = simDoc.createElement('parameter');
132missClassesNode.setAttribute('array', 'true');
133missClassesNode.setAttribute('classPath', 'jmt.engine.QueueNet.JobClass');
134missClassesNode.setAttribute('name', 'missClasses');
135for r = 1:K
136 if nodeparam.missclass(r) > 0
137 subParNode = simDoc.createElement('subParameter');
138 subParNode.setAttribute('classPath', 'jmt.engine.QueueNet.JobClass');
139 subParNode.setAttribute('name', 'missClass');
140 valNode = simDoc.createElement('value');
141 missIdx = nodeparam.missclass(r);
142 valNode.appendChild(simDoc.createTextNode(sn.classnames{missIdx}));
143 subParNode.appendChild(valNode);
144 missClassesNode.appendChild(subParNode);
145 end
146end
147section.appendChild(missClassesNode);
148
149% Parameter 7: replacePolicy (CacheStrategy subclass)
150replaceNode = simDoc.createElement('parameter');
151replaceNode.setAttribute('name', 'replacePolicy');
152% Set classPath directly to the specific cache strategy class
153switch nodeparam.replacestrat
154 case ReplacementStrategy.LRU
155 replaceNode.setAttribute('classPath', 'jmt.engine.NetStrategies.CacheStrategies.LRUCache');
156 case ReplacementStrategy.FIFO
157 replaceNode.setAttribute('classPath', 'jmt.engine.NetStrategies.CacheStrategies.FIFOCache');
158 case ReplacementStrategy.SFIFO
159 % Strict FIFO also uses FIFOCache in JMT (see FIFOCache.java comment)
160 replaceNode.setAttribute('classPath', 'jmt.engine.NetStrategies.CacheStrategies.FIFOCache');
161 case ReplacementStrategy.RR
162 % Random Replacement maps to RandomCache in JMT
163 replaceNode.setAttribute('classPath', 'jmt.engine.NetStrategies.CacheStrategies.RandomCache');
164 otherwise
165 % Default to LRU
166 replaceNode.setAttribute('classPath', 'jmt.engine.NetStrategies.CacheStrategies.LRUCache');
167end
168section.appendChild(replaceNode);
169
170% Parameter 8: popularity (DiscreteDistribution[]) - Popularity distributions
171% Access the original Cache node to get distribution objects
172cacheNode = self.model.nodes{ind};
173popNode = simDoc.createElement('parameter');
174popNode.setAttribute('array', 'true');
175popNode.setAttribute('classPath', 'jmt.engine.random.discrete.DiscreteDistribution');
176popNode.setAttribute('name', 'popularity');
177for r = 1:K
178 refClassNode = simDoc.createElement('refClass');
179 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
180 popNode.appendChild(refClassNode);
181
182 subParNode = simDoc.createElement('subParameter');
183 if ~iscell(nodeparam.pread) || length(nodeparam.pread) < r || isnan(nodeparam.pread{r}(1))
184 % No popularity distribution for this class
185 subParNode.setAttribute('classPath', 'jmt.engine.random.discrete.DiscreteDistribution');
186 subParNode.setAttribute('name', 'null');
187 valNode = simDoc.createElement('value');
188 valNode.appendChild(simDoc.createTextNode('null'));
189 subParNode.appendChild(valNode);
190 else
191 % Get the original distribution from the Cache node
192 % popularity is indexed by {itemclass, jobclass}
193 distrib = [];
194 if isprop(cacheNode, 'popularity') && ~isempty(cacheNode.popularity)
195 % Find the distribution for this class
196 for iItem = 1:size(cacheNode.popularity, 1)
197 if size(cacheNode.popularity, 2) >= r && ~isempty(cacheNode.popularity{iItem, r})
198 distrib = cacheNode.popularity{iItem, r};
199 break;
200 end
201 end
202 end
203
204 if ~isempty(distrib) && isa(distrib, 'Zipf')
205 % Use JMT's native Zipf distribution
206 % Structure matches JLINE Java: single subParameter with classPath=Zipf, name=popularity
207 % containing alpha and numberOfElements as child subParameters
208 subParNode.setAttribute('classPath', 'jmt.engine.random.discrete.Zipf');
209 subParNode.setAttribute('name', 'popularity');
210
211 % Get Zipf parameters: alpha (shape) and n (number of elements)
212 alpha = distrib.getParam(3).paramValue; % 's' parameter
213 n = distrib.getParam(4).paramValue; % 'n' parameter
214
215 % alpha parameter (comes first in Java implementation)
216 alphaNode = simDoc.createElement('subParameter');
217 alphaNode.setAttribute('classPath', 'java.lang.Double');
218 alphaNode.setAttribute('name', 'alpha');
219 valNode = simDoc.createElement('value');
220 valNode.appendChild(simDoc.createTextNode(sprintf('%.12f', alpha)));
221 alphaNode.appendChild(valNode);
222 subParNode.appendChild(alphaNode);
223
224 % numberOfElements parameter
225 numElemNode = simDoc.createElement('subParameter');
226 numElemNode.setAttribute('classPath', 'java.lang.Integer');
227 numElemNode.setAttribute('name', 'numberOfElements');
228 valNode = simDoc.createElement('value');
229 valNode.appendChild(simDoc.createTextNode(sprintf('%d', n)));
230 numElemNode.appendChild(valNode);
231 subParNode.appendChild(numElemNode);
232 elseif ~isempty(distrib) && isa(distrib, 'DiscreteSampler')
233 % Use JMT's Uniform distribution for DiscreteSampler
234 % This maps the discrete sampler to a uniform distribution over its support
235 subParNode.setAttribute('classPath', 'jmt.engine.random.discrete.Uniform');
236 subParNode.setAttribute('name', 'popularity');
237
238 % Get min/max from the distribution's support
239 minVal = distrib.support(1);
240 maxVal = distrib.support(2);
241
242 % min parameter
243 minNode = simDoc.createElement('subParameter');
244 minNode.setAttribute('classPath', 'java.lang.Integer');
245 minNode.setAttribute('name', 'min');
246 valNode = simDoc.createElement('value');
247 valNode.appendChild(simDoc.createTextNode(sprintf('%d', minVal)));
248 minNode.appendChild(valNode);
249 subParNode.appendChild(minNode);
250
251 % max parameter
252 maxNode = simDoc.createElement('subParameter');
253 maxNode.setAttribute('classPath', 'java.lang.Integer');
254 maxNode.setAttribute('name', 'max');
255 valNode = simDoc.createElement('value');
256 valNode.appendChild(simDoc.createTextNode(sprintf('%d', maxVal)));
257 maxNode.appendChild(valNode);
258 subParNode.appendChild(maxNode);
259 else
260 % Fallback: use null for unsupported distributions
261 % JMT doesn't have a generic empirical discrete distribution
262 subParNode.setAttribute('classPath', 'jmt.engine.random.discrete.DiscreteDistribution');
263 subParNode.setAttribute('name', 'null');
264 valNode = simDoc.createElement('value');
265 valNode.appendChild(simDoc.createTextNode('null'));
266 subParNode.appendChild(valNode);
267 end
268 end
269 popNode.appendChild(subParNode);
270end
271section.appendChild(popNode);
272
273end