LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
CacheClassSwitcher.m
1classdef CacheClassSwitcher < StatefulClassSwitcher
2 % A class switcher section based on cache hits and misses
3 %
4 % Copyright (c) 2012-2026, Imperial College London
5 % All rights reserved.
6
7 properties
8 items;
9 cap;
10 levels;
11 hitClass;
12 missClass;
13 retrievalClasses; % [items x classes] -1 where no retrieval class is defined
14 actualHitProb;
15 actualMissProb;
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)
20 end
21
22 methods
23 function self = CacheClassSwitcher(classes, items, capacity, levels)
24 % SELF = CACHECLASSSWITCHER(CLASSES, ITEMS, CAPACITY, LEVELS)
25
26 if nargin<4 %~exist('levels','var')
27 levels = 1;
28 end
29 self@StatefulClassSwitcher(classes, 'Cache');
30 self.classes = classes;
31 self.items = items;
32 self.cap = capacity;
33 self.levels = levels;
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
44 end
45 end
46
47 methods
48 function prob = simpleHitMiss(self, r, s, state, statep)
49 % PROB = SIMPLEHITMISS(R, S, STATE, STATEP)
50
51 if nargin <= 3
52 state = []; %local server state
53 statep = []; %local server state
54 end
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
64 prob = 1;
65 else
66 prob = 0;
67 end
68 else
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)
72 % prob = 1;
73 % else
74 % prob = 0;
75 % end
76 % else % miss
77 % if (r <= length(self.missClass)) && s == self.missClass(r)
78 % prob = 1;
79 % else
80 % prob = 0;
81 % end
82 % end
83 end
84 end
85 end
86
87end