1function [simDoc, section] = saveCacheStrategy(self, simDoc, section, ind)
2% [SIMDOC, SECTION] = SAVECACHESTRATEGY(SIMDOC, SECTION, NODEIDX)
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
8% Copyright (c) 2012-2026, Imperial College London
13nodeparam = sn.nodeparam{ind};
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);
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);
39section.appendChild(capNode);
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);
50 rowNode = simDoc.createElement(
'subParameter');
51 rowNode.setAttribute(
'array',
'true');
52 rowNode.setAttribute(
'classPath',
'java.lang.Float');
53 rowNode.setAttribute(
'name',
'row');
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)
66 valNode.appendChild(simDoc.createTextNode('1.0'));
68 valNode.appendChild(simDoc.createTextNode('0.0'));
70 else % last list: stay in place
72 valNode.appendChild(simDoc.createTextNode('1.0'));
74 valNode.appendChild(simDoc.createTextNode('0.0'));
78 % FIFO, RR: identity matrix
80 valNode.appendChild(simDoc.createTextNode('1.0'));
82 valNode.appendChild(simDoc.createTextNode('0.0'));
85 cellNode.appendChild(valNode);
86 rowNode.appendChild(cellNode);
88 matrixNode.appendChild(rowNode);
90section.appendChild(matrixNode);
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');
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);
109section.appendChild(jobClassesNode);
111% Parameter 5: hitClasses (JobClass[])
112hitClassesNode = simDoc.createElement(
'parameter');
113hitClassesNode.setAttribute(
'array',
'true');
114hitClassesNode.setAttribute(
'classPath',
'jmt.engine.QueueNet.JobClass');
115hitClassesNode.setAttribute(
'name',
'hitClasses');
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);
128section.appendChild(hitClassesNode);
130% Parameter 6: missClasses (JobClass[])
131missClassesNode = simDoc.createElement(
'parameter');
132missClassesNode.setAttribute(
'array',
'true');
133missClassesNode.setAttribute(
'classPath',
'jmt.engine.QueueNet.JobClass');
134missClassesNode.setAttribute(
'name',
'missClasses');
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);
147section.appendChild(missClassesNode);
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');
166 replaceNode.setAttribute(
'classPath',
'jmt.engine.NetStrategies.CacheStrategies.LRUCache');
168section.appendChild(replaceNode);
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');
178 refClassNode = simDoc.createElement(
'refClass');
179 refClassNode.appendChild(simDoc.createTextNode(sn.classnames{r}));
180 popNode.appendChild(refClassNode);
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);
191 % Get the original distribution from the Cache node
192 % popularity
is indexed by {itemclass,
jobclass}
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};
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
');
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
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);
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');
238 % Get min/max from the distribution
's support
239 minVal = distrib.support(1);
240 maxVal = distrib.support(2);
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);
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);
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);
269 popNode.appendChild(subParNode);
271section.appendChild(popNode);