LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
cache_pos_drift_graph.m
1%{ @file cache_pos_drift_graph.m
2 % @brief General position-resolved mean-field drift honouring a per-item
3 % cache access graph, for FIFO(m) and strict FIFO(m).
4 %
5 % @author LINE Development Team
6%}
7
8%{
9 % @brief Position-resolved DDPP drift with a per-item access graph.
10 %
11 % @details
12 % G{k} is the (h+1)x(h+1) access graph of item k: row 1 is miss admission
13 % (col 1 = reject, col 1+l = admit to list l), row 1+i is a hit in list i
14 % (col 1+b = promote to list b>=i; b==i means STAY in place, the FIFO/SFIFO
15 % convention). A miss admits at the head of the target list (its tail evicted);
16 % a hit at position j of list i promotes to the head of target b>i (the tail of
17 % b demoted to list i -- to the vacated position j for FIFO, to the head with a
18 % 1..j-1 shift for SFIFO). REINSERT is 'head' (SFIFO) or 'pos' (FIFO). Reduces
19 % exactly to the linear drift when G is the standard chain; requires a cold
20 % (empty) initial state so non-admissible items drain.
21%}
22function dX = cache_pos_drift_graph(x, p, G, m, n, h, slots, sidx, S, reinsert)
23x = max(0, min(1, x));
24isHead = strcmp(reinsert, 'head');
25Kidx = @(k, i, j) (k-1)*S + sidx(i, j);
26
27MI = zeros(1, h); % MI(l): miss admission into list l
28HP = zeros(h, h); % HP(i,b): promotion i->b (b>i)
29for k = 1:n
30 ok = 1 - pos_sumocc(x, k, S, size(slots,1));
31 gk = G{k};
32 for l = 1:h
33 MI(l) = MI(l) + p(k) * ok * gk(1, l+1);
34 end
35 for i = 1:h
36 oc = 0;
37 for jj = 1:m(i), oc = oc + x(Kidx(k, i, jj)); end
38 for b = (i+1):h
39 HP(i, b) = HP(i, b) + p(k) * oc * gk(i+1, b+1);
40 end
41 end
42end
43Sin = zeros(1, h);
44for l = 1:h
45 Sin(l) = MI(l);
46 for s = 1:(l-1), Sin(l) = Sin(l) + HP(s, l); end
47end
48POp = zeros(h, max(m));
49for s = 1:S
50 i = slots(s,1); j = slots(s,2);
51 acc = 0;
52 for k = 1:n
53 acc = acc + p(k) * x(Kidx(k, i, j)) * (1 - G{k}(i+1, i+1));
54 end
55 POp(i, j) = acc;
56end
57
58dX = zeros(n*S, 1);
59for k = 1:n
60 gk = G{k};
61 ok = 1 - pos_sumocc(x, k, S, size(slots,1));
62 for s = 1:S
63 i = slots(s,1); j = slots(s,2);
64 xk = x(Kidx(k, i, j));
65 o = p(k) * xk * (1 - gk(i+1, i+1));
66 if isHead
67 o = o + (Sin(i) + pos_gg(POp, i, j, m)) * xk;
68 else
69 o = o + Sin(i) * xk;
70 end
71 dX(Kidx(k, i, j)) = dX(Kidx(k, i, j)) - o;
72 if j >= 2
73 if isHead
74 dX(Kidx(k,i,j)) = dX(Kidx(k,i,j)) + (Sin(i) + pos_gg(POp,i,j-1,m)) * x(Kidx(k,i,j-1));
75 else
76 dX(Kidx(k,i,j)) = dX(Kidx(k,i,j)) + Sin(i) * x(Kidx(k,i,j-1));
77 end
78 else
79 dX(Kidx(k,i,1)) = dX(Kidx(k,i,1)) + p(k) * ok * gk(1, i+1);
80 for ss = 1:(i-1)
81 occ_s = 0;
82 for jj = 1:m(ss), occ_s = occ_s + x(Kidx(k, ss, jj)); end
83 dX(Kidx(k,i,1)) = dX(Kidx(k,i,1)) + p(k) * occ_s * gk(ss+1, i+1);
84 end
85 end
86 for b = (i+1):h
87 if isHead
88 if j == 1
89 dX(Kidx(k,i,1)) = dX(Kidx(k,i,1)) + HP(i,b) * x(Kidx(k, b, m(b)));
90 end
91 else
92 poj = 0;
93 for kk = 1:n
94 poj = poj + p(kk) * x(Kidx(kk, i, j)) * G{kk}(i+1, b+1);
95 end
96 dX(Kidx(k,i,j)) = dX(Kidx(k,i,j)) + poj * x(Kidx(k, b, m(b)));
97 end
98 end
99 end
100end
101end
102
103function s = pos_sumocc(x, k, S, ns)
104s = 0;
105for t = 1:ns
106 s = s + x((k-1)*S + t);
107end
108end
109
110function g = pos_gg(POp, i, jp, m)
111g = 0;
112for jj = (jp+1):m(i)
113 g = g + POp(i, jj);
114end
115end