1%{ @file retrieval_mva.m
2 % @brief Exact MVA-style recursion
for delayed-hit (list-based) cache metrics
4 % @author LINE Development Team
8 % @brief Computes exact miss, hit and delayed-hit metrics via the MVA recursion
11 % Implements the exact recursive characterization of the paper (Theorems
12 %
"thm:arvthm" and
"thm:pi_xi", and eq. motivation_to_pi0_FPI) that the FPI
13 % heuristic (retrieval_fpi) approximates. For a list-based cache with delayed
14 % hits whose retrieval system has one IS station (s=0) and r PS stations
15 % (s=1,...,r), with phi^{(k)}_{s,i} the delayed-hit probability of item i at
16 % station s in the system WITHOUT item k:
18 % theta_{ij}(m) = gamma_{ij} / (1 + lambda_i eta_{0,i}
19 % + sum_{s=1}^r lambda_i eta_{s,i}(1 + sum_{k!=i} phi^{(i)}_{s,k}(m-1_j)))
20 % xi_j(m) = m_j / sum_i theta_{ij}(m)(1 - pihit_i(m-1_j))
21 % pi_{ij}(m) = theta_{ij}(m) xi_j(m) (1 - pihit_i(m-1_j))
22 % pihit_i(m) = sum_j pi_{ij}(m)
23 % pi_{i0}(m) = (1 - pihit_i(m)) / (1 + lambda_i eta_{0,i}
24 % + sum_{s=1}^r lambda_i eta_{s,i}(1 + sum_{k!=i} phi^{(i)}_{s,k}(m)))
25 % phi_{sk}(m) = lambda_k pi_{k0}(m) eta_{s,k}(1 + sum_{i!=k} phi^{(k)}_{s,i}(m)) (s=1..r)
26 % phi_{0k}(m) = lambda_k eta_{0,k} pi_{k0}(m)
28 % The recursion terminates at the empty item set and at the empty cache
29 % (pihit_i = 0). This
is exact and agrees with retrieval_nc / retrieval_metrics;
30 % it
is memoized over (item-subset, capacity) with O(2^n n^2 h r prod_j(1+m_j))
31 % time, so it
is feasible only
for small systems (use retrieval_fpi otherwise).
35 % [pmiss, phit, pdh] = retrieval_mva(m, lambda, eta, gamma)
40 % <tr><th>Name<th>Description
41 % <tr><td>m<td>Cache list capacities (1 x h)
42 % <tr><td>lambda<td>Per-item arrival rates (1 x n)
43 % <tr><td>eta<td>Fetching demands eta(i,s+1)=eta_{s,i} (column 1 = IS station s=0, columns 2..r+1 = PS stations), (n x (r+1))
44 % <tr><td>gamma<td>Access factors gamma(i,j)=gamma_{i,j}, (n x h)
49 % <tr><th>Name<th>Description
50 % <tr><td>pmiss<td>Miss ratios pi_{i,0}, (1 x n)
51 % <tr><td>phit<td>Hit ratios pi_{i,j}, (h x n)
52 % <tr><td>pdh<td>Delayed-hit probabilities phi_{s,i} for s=0,...,r, ((r+1) x n)
55function [pmiss,phit,pdh]=retrieval_mva(m,lambda,eta,gamma)
60lambda = lambda(:).'; % 1 x n
61eta0 = eta(:,1).
'; % 1 x n
62etaPS = eta(:,2:end); % n x r
68done = false(nmask, ncap);
69PI0 = zeros(nmask, ncap, n);
70PIHIT = zeros(nmask, ncap, n);
71PIJ = zeros(nmask, ncap, n, h);
72PHI = zeros(nmask, ncap, n, r+1); % station index s=0..r -> page 1..r+1
82 pmiss(i) = PI0(fullmask+1, ci, i);
84 phit(j,i) = PIJ(fullmask+1, ci, i, j);
87 pdh(s,i) = PHI(fullmask+1, ci, i, s);
91 function idx = capidx(c)
94 idx = idx + c(jj)*mul;
99 function solve(mask, c)
101 if done(mask+1, ci_), return; end
103 done(mask+1, ci_) = true;
106 active = find(bitget(mask, 1:n));
108 % boundary: when the cache can hold every active item (sum(c) >= |active|),
109 % all items are permanently cached -> pihit=1, pi0=0, phi=0 (no fetching).
110 if sum(c) >= numel(active)
112 PIHIT(mask+1, ci_, i) = 1;
114 done(mask+1, ci_) = true;
118 % --- ensure dependencies are solved ---
121 cj = c; cj(jj) = cj(jj) - 1;
124 solve(bitset(mask, i, 0), cj);
129 solve(bitset(mask, k, 0), c);
132 % --- theta, xi, pi_{ij} (cache recursion on m-1_j) ---
135 cj = c; cj(jj) = cj(jj) - 1; cjx = capidx(cj);
138 maski = bitset(mask, i, 0);
144 sphi = sphi + PHI(maski+1, cjx, k, s+1);
147 acc = acc + lambda(i)*etaPS(i,s)*(1 + sphi);
149 theta(i) = gamma(i,jj) / (1 + lambda(i)*eta0(i) + acc);
153 sden = sden + theta(i)*(1 - PIHIT(mask+1, cjx, i));
157 PIJ(mask+1, ci_, i, jj) = theta(i)*xi_j*(1 - PIHIT(mask+1, cjx, i));
162 % --- pihit_i = sum_j pi_{ij} ---
166 ph = ph + PIJ(mask+1, ci_, i, jj);
168 PIHIT(mask+1, ci_, i) = ph;
171 % --- pi_{i0} (uses phi^{(i)}(m) at same capacity) ---
173 maski = bitset(mask, i, 0);
179 sphi = sphi + PHI(maski+1, ci_, k, s+1);
182 acc = acc + lambda(i)*etaPS(i,s)*(1 + sphi);
184 PI0(mask+1, ci_, i) = (1 - PIHIT(mask+1, ci_, i)) / (1 + lambda(i)*eta0(i) + acc);
187 % --- phi_{sk}(m) ---
189 maskk = bitset(mask, k, 0);
190 pi0k = PI0(mask+1, ci_, k);
191 PHI(mask+1, ci_, k, 1) = lambda(k)*eta0(k)*pi0k; % s = 0 (IS)
196 sphi = sphi + PHI(maskk+1, ci_, i, s+1);
199 PHI(mask+1, ci_, k, s+1) = lambda(k)*pi0k*etaPS(k,s)*(1 + sphi);
203 done(mask+1, ci_) = true;