1classdef CacheClassSwitcher < StatefulClassSwitcher
2 % A
class switcher section based on cache hits and misses
4 % Copyright (c) 2012-2026, Imperial College London
13 retrievalClasses; % [items x
classes] -1 where no retrieval
class is defined
16 actualDelayedHitProb; % delayed-hit fraction per arrival
class (retrieval system; filled after solve)
17 actualHitProbList; % [
classes x lists] per-list (per-level) hit fraction (filled after solve, where available)
18 actualItemProb; % [items x (lists+1)] per-item occupancy: col 1 = miss, cols 2..end = per-list (filled after solve, where available)
19 actualResidT; % expected latency per arrival
class (filled after solve)
23 function self = CacheClassSwitcher(
classes, items, capacity, levels)
24 % SELF = CACHECLASSSWITCHER(CLASSES, ITEMS, CAPACITY, LEVELS)
26 if nargin<4 %~exist(
'levels',
'var')
29 self@StatefulClassSwitcher(
classes, 'Cache');
34 self.csFun = @(r, s, state, statep) self.simpleHitMiss(r, s, state, statep); % do nothing by default
35 self.hitClass = sparse([]);
36 self.missClass = sparse([]);
37 self.retrievalClasses = -ones(items, numel(
classes));
38 self.actualHitProb = sparse([]); % this field
is filled after model solution
39 self.actualMissProb = sparse([]); % this field
is filled after model solution
40 self.actualDelayedHitProb = sparse([]); % filled after model solution (retrieval system)
41 self.actualHitProbList = sparse([]); % filled after model solution (per-list hit fractions)
42 self.actualItemProb = sparse([]); % filled after model solution (per-item per-list occupancy)
43 self.actualResidT = sparse([]); % filled after model solution
48 function prob = simpleHitMiss(self, r, s, state, statep)
49 % PROB = SIMPLEHITMISS(R, S, STATE, STATEP)
52 state = []; %local server state
53 statep = []; %local server state
55 if isempty(state) % get csMask (B matrix)
56 % A retrieval class
is an output class of the cache: it departs
57 % unchanged (r==s) toward the retrieval system, so it must pass the
58 % class-switch filter just like hitClass / missClass.
59 isReceived = ~isempty(self.retrievalClasses) && any(self.retrievalClasses(:) == r);
60 if (r==s ... % hit and miss in the cache can depart in the same class
61 || ((r <= length(self.hitClass) && r <= length(self.missClass)) ... % since hitClass and missClass are sparse, check entry for r exists
62 && (s == self.hitClass(r) || s == self.missClass(r)))) ... % route out hit or miss
classes
63 && (~isempty(find(r == self.hitClass)) || ~isempty(find(r == self.missClass)) || isReceived) % don't route out
classes that are not hit/miss/retrieval-pending
69 % un-comment to restore class-switching in routing
70 % if sum(state) == sum(statep)+1 % hit
71 % if (r <= length(self.hitClass)) && s == self.hitClass(r)
77 % if (r <= length(self.missClass)) && s == self.missClass(r)