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).
5 % @author LINE Development Team
9 % @brief Position-resolved DDPP drift with a per-item access graph.
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.
22function dX = cache_pos_drift_graph(x, p, G, m, n, h, slots, sidx, S, reinsert)
24isHead = strcmp(reinsert, 'head');
25Kidx = @(k, i, j) (k-1)*S + sidx(i, j);
27MI = zeros(1, h); % MI(l): miss admission into list l
28HP = zeros(h, h); % HP(i,b): promotion i->b (b>i)
30 ok = 1 - pos_sumocc(x, k, S, size(slots,1));
33 MI(l) = MI(l) + p(k) * ok * gk(1, l+1);
37 for jj = 1:m(i), oc = oc + x(Kidx(k, i, jj)); end
39 HP(i, b) = HP(i, b) + p(k) * oc * gk(i+1, b+1);
46 for s = 1:(l-1), Sin(l) = Sin(l) + HP(s, l); end
48POp = zeros(h, max(m));
50 i = slots(s,1); j = slots(s,2);
53 acc = acc + p(k) * x(Kidx(k, i, j)) * (1 - G{k}(i+1, i+1));
61 ok = 1 - pos_sumocc(x, k, S, size(slots,1));
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));
67 o = o + (Sin(i) + pos_gg(POp, i, j, m)) * xk;
71 dX(Kidx(k, i, j)) = dX(Kidx(k, i, j)) - o;
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));
76 dX(Kidx(k,i,j)) = dX(Kidx(k,i,j)) + Sin(i) * x(Kidx(k,i,j-1));
79 dX(Kidx(k,i,1)) = dX(Kidx(k,i,1)) + p(k) * ok * gk(1, i+1);
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);
89 dX(Kidx(k,i,1)) = dX(Kidx(k,i,1)) + HP(i,b) * x(Kidx(k, b, m(b)));
94 poj = poj + p(kk) * x(Kidx(kk, i, j)) * G{kk}(i+1, b+1);
96 dX(Kidx(k,i,j)) = dX(Kidx(k,i,j)) + poj * x(Kidx(k, b, m(b)));
103function s = pos_sumocc(x, k, S, ns)
106 s = s + x((k-1)*S + t);
110function g = pos_gg(POp, i, jp, m)