LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
cache_xi_iter.m
1%{ @file cache_xi_iter.m
2 % @brief Computes Lagrange multipliers using Gast-van Houdt fixed-point iteration
3 %
4 % @author LINE Development Team
5%}
6
7%{
8 % @brief Computes Lagrange multipliers using Gast-van Houdt fixed-point iteration
9 %
10 % @details
11 % This function computes Lagrange multipliers for cache models using
12 % the Gast-van Houdt algorithm fixed-point iteration method.
13 %
14 % @par Syntax:
15 % @code
16 % z = cache_xi_iter(gamma, m)
17 % z = cache_xi_iter(gamma, m, tmax)
18 % @endcode
19 %
20 % @par Parameters:
21 % <table>
22 % <tr><th>Name<th>Description
23 % <tr><td>gamma<td>Item popularity probabilities
24 % <tr><td>m<td>Cache capacity
25 % <tr><td>tmax<td>(Optional) Maximum time limit
26 % </table>
27 %
28 % @par Returns:
29 % <table>
30 % <tr><th>Name<th>Description
31 % <tr><td>z<td>Converged Lagrange multipliers
32 % </table>
33%}
34function z=cache_xi_iter(gamma,m,tmax)
35if nargin<3
36 tmax=Inf;
37end
38
39n=size(gamma,1);
40f=m./n;
41h=size(f,2);
42
43pp=zeros(h+1,n);
44pp(1,:)=ones(1,n);
45for i=1:h
46 pp(i+1,:)=gamma(:,i);
47end
48
49z_old=zeros(1,h+1);
50z=ones(1,h+1);
51
52while (max(abs(z-z_old)) > 10^(-12)*max(abs(z_old)))
53 z_old=z;
54 temp=n*z*pp;
55 for i=1:h % update z(i+1)
56 a=temp-n*z(i+1)*pp(i+1,:);
57 Fi=sum(pp(i+1,:)./(n*pp(i+1,:)+a)); %Fi(1)
58 if (Fi > f(i))
59 zi_min=0;
60 zi_max=1;
61 else
62 zi_min=1;
63 zi_max=2;
64 while (sum(zi_max*pp(i+1,:)./(n*zi_max*pp(i+1,:)+a)) < f(i)) %Fi(zi_max)
65 zi_min=zi_max;
66 zi_max=zi_max*2;
67 end
68 end
69 for x=1:50
70 z(i+1)=(zi_min+zi_max)/2;
71 if (sum(z(i+1)*pp(i+1,:)./(n*z(i+1)*pp(i+1,:)+a)) < f(i)) %Fi(zi_max)
72 zi_min=z(i+1);
73 else
74 zi_max=z(i+1);
75 end
76 end
77 end
78end
79
80z=z(2:end);
81end