LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
estimator_ubo.m
1function [estVal, fObjFun] = estimator_ubo(self, nodes)
2% UBO Utilization-based optimization
3% This demand estimator is based on the method proposed in:
4%
5% Liu, Z., Wynter, L., Xia, C. H. and Zhang, F.
6% Parameter inference of queueing models for IT systems using end-to-end measurements
7% Performance Evaluation, Elsevier, 2006.
8%
9% Implements the single-experiment QP formulation (Eq. 9-13, Section 4.2)
10% applied as a Bundle over all experiments (Single-QP, Section 4.3).
11%
12% Copyright (c) 2012-2026, Imperial College London
13% All rights reserved.
14% This code is released under the 3-Clause BSD License.
15
16sn = self.model.getStruct;
17
18%% Collect measurements
19for n = 1:size(nodes, 2)
20 node = nodes{n};
21 if isfinite(node.getNumberOfServers())
22 U = self.getAggrUtil(node);
23 if ~isempty(U)
24 avgU{n} = U.data * node.getNumberOfServers();
25 end
26 end
27
28 for r = 1:sn.nclasses
29 avgArvR{n, r} = self.getArvR(node, self.model.classes{r});
30 if isempty(avgArvR{n, r})
31 error('Arrival rate data for node %d in class %d is missing.', self.model.getNodeIndex(node), r);
32 else
33 avgArvR{n, r} = avgArvR{n, r}.data;
34 end
35 avgRespT{n, r} = self.getRespT(node, self.model.classes{r});
36 if isempty(avgRespT{n, r})
37 error('Response time data for node %d in class %d is missing.', self.model.getNodeIndex(node), r);
38 else
39 avgRespT{n, r} = avgRespT{n, r}.data;
40 end
41 end
42end
43
44try
45 avgA = cell2mat(avgArvR);
46 avgA = reshape(avgA, size(avgA,1)/size(avgArvR, 1), size(avgArvR, 1), sn.nclasses);
47 avgR = cell2mat(avgRespT);
48 avgR = reshape(avgR, size(avgR,1)/size(avgRespT, 1), size(avgRespT, 1), sn.nclasses);
49 avgU = cell2mat(avgU);
50catch me
51 switch me.identifier
52 case 'MATLAB:catenate:dimensionMismatch'
53 error('Sampled metrics have different number of samples, use interpolate() before starting this estimation algorithm.');
54 end
55end
56
57[estVal, fObjFun] = ubo_qp(avgU, avgR, avgA);
58end
59
60function [demEst, fObjFun] = ubo_qp(cpuUtil, rAvgTimes, avgArvR)
61% Solves the UBO demand estimation as a quadratic program following
62% Liu et al. 2006, Eq. 9-13 (single experiment) applied as Bundle QP
63% (Section 4.3) over all experiments.
64%
65% Inputs:
66% cpuUtil: N x M - measured aggregate utilization per station
67% rAvgTimes: N x M x R - measured per-station response times
68% avgArvR: N x M x R - measured arrival rates per station per class
69%
70% The QP minimizes (Eq. 9):
71% sum_j w_j * delta_j^2 + sum_i epsilon_i^2
72% where:
73% delta_j = E_j^e - E_j^m (end-to-end delay error, Eq. 12)
74% epsilon_i = rho_i^e - rho_i^m (utilization error, Eq. 11)
75% w_j = lambda_j / sum(lambda) (class weights)
76% subject to s_ji >= 0 (Eq. 13)
77
78%% Clean input data
79a = sum(isnan(cpuUtil), 2);
80if sum(a) > 0
81 cpuUtil = cpuUtil(a == 0, :);
82 rAvgTimes = rAvgTimes(a == 0, :, :);
83 avgArvR = avgArvR(a == 0, :, :);
84end
85
86a = sum(sum(avgArvR, 3), 2) == 0;
87if sum(a) > 0
88 cpuUtil = cpuUtil(a == 0, :);
89 rAvgTimes = rAvgTimes(a == 0, :, :);
90 avgArvR = avgArvR(a == 0, :, :);
91end
92
93N = size(cpuUtil, 1); % number of experiments
94M = size(cpuUtil, 2); % number of stations (I in paper)
95R = size(rAvgTimes, 3); % number of classes (J in paper)
96MR = M * R;
97
98%% Build Bundle QP by summing over experiments
99% Variables: s_vec of length MR, where s_vec((r-1)*M + i) = s_{ir}
100%
101% For each experiment n:
102% beta_i^n = 1/(1 - rho_i^n) (p.45)
103% E_r^n = sum_i R_{ir}^n (end-to-end delay, Eq. 7 with v=1)
104% w_r^n = lambda_r^n / sum_r lambda_r^n (Eq. 9)
105% delta_r = sum_i s_{ir} * beta_i^n - E_r^n (Eq. 12)
106% epsilon_i = sum_r lambda_{ir}^n * s_{ir} - rho_i^n (Eq. 11)
107%
108% QP: min (1/2) s^T H s + h^T s + const
109% s.t. s >= 0
110
111H = zeros(MR, MR);
112h = zeros(MR, 1);
113
114for n = 1:N
115 rho_n = cpuUtil(n, :); % 1 x M
116 beta_n = 1 ./ (1 - rho_n); % 1 x M
117
118 % Per-station arrival rates and response times for this experiment
119 if M == 1 && R == 1
120 lambda_n = avgArvR(n, 1, 1); % scalar
121 R_n = rAvgTimes(n, 1, 1); % scalar
122 elseif M == 1
123 lambda_n = reshape(avgArvR(n, 1, :), 1, R); % 1 x R
124 R_n = reshape(rAvgTimes(n, 1, :), 1, R); % 1 x R
125 else
126 lambda_n = reshape(avgArvR(n, :, :), M, R); % M x R
127 R_n = reshape(rAvgTimes(n, :, :), M, R); % M x R
128 end
129
130 % Class weights w_r = lambda_r / sum(lambda) (Eq. 9)
131 % lambda_r = total arrival rate for class r (sum over stations for multi-station)
132 lambda_r = sum(lambda_n, 1); % 1 x R
133 w_n = lambda_r / sum(lambda_r); % 1 x R
134
135 % End-to-end delay: E_r = sum_i R_{ir} (Eq. 7, assuming v=1)
136 E_n = sum(R_n, 1); % 1 x R
137
138 % Build A_delta: R x MR (Eq. 7)
139 % Row r has beta_i at column (r-1)*M + i
140 A_delta = zeros(R, MR);
141 for r = 1:R
142 A_delta(r, (r-1)*M + (1:M)) = beta_n;
143 end
144
145 % Build A_epsilon: M x MR (Eq. 8)
146 % Row i has lambda_{ir} at column (r-1)*M + i
147 A_eps = zeros(M, MR);
148 for i = 1:M
149 for r = 1:R
150 A_eps(i, (r-1)*M + i) = lambda_n(i, r);
151 end
152 end
153
154 W_n = diag(w_n);
155
156 % Accumulate QP matrices (Bundle, Section 4.3)
157 % H^n = 2(A_delta^T W A_delta + A_eps^T A_eps)
158 H = H + 2 * (A_delta' * W_n * A_delta + A_eps' * A_eps);
159 % h^n = -2(A_delta^T W E^m + A_eps^T rho^m)
160 h = h - 2 * (A_delta' * W_n * E_n' + A_eps' * rho_n');
161end
162
163%% Solve QP: min (1/2) s^T H s + h^T s, s.t. s >= 0 (Eq. 13-17)
164lb = zeros(MR, 1);
165opts = optimoptions('quadprog', 'Display', 'off');
166[s_vec, fObjFun] = quadprog(H, h, [], [], [], [], lb, [], [], opts);
167
168%% Reshape to M x R
169demEst = reshape(s_vec, M, R);
170end
Definition mmt.m:124