5#ifndef LINE_API_MAPQN_MAPQN_BND_QR_H
6#define LINE_API_MAPQN_MAPQN_BND_QR_H
107 for (
int j = 0; j < p.
M; ++j)
108 for (
int nj = 0; nj <= p.
N; ++nj)
109 for (
int k = 0; k < p.
K[j]; ++k)
110 for (
int h = 0; h < p.
K[j]; ++h)
111 if (h != k) m.
fix(x.
p2(j, nj, k, j, nj, h), T());
117 for (
int j = 0; j < p.
M; ++j)
118 for (
int nj = 0; nj <= p.
N; ++nj)
119 for (
int k = 0; k < p.
K[j]; ++k)
120 for (
int ni = 0; ni <= p.
N; ++ni)
122 for (
int h = 0; h < p.
K[j]; ++h) m.
fix(x.
p2(j, nj, k, j, ni, h), T());
128 for (
int j = 0; j < p.
M; ++j)
129 for (
int nj = 0; nj <= p.
N; ++nj)
130 for (
int k = 0; k < p.
K[j]; ++k)
131 for (
int i = 0; i < p.
M; ++i)
133 for (
int ni = 0; ni <= p.
N; ++ni)
135 for (
int h = 0; h < p.
K[i]; ++h)
136 m.
fix(x.
p2(j, nj, k, i, ni, h), T());
142 for (
int i = 0; i < p.
M; ++i)
143 for (
int j = 0; j < p.
M; ++j)
144 for (
int ni = 1; ni <= p.
N; ++ni)
145 for (
int nj = 1; nj <= p.
N; ++nj)
146 for (
int h = 0; h < p.
K[i]; ++h)
147 for (
int k = 0; k < p.
K[j]; ++k)
155 for (
int j = 0; j < p.
M; ++j) {
156 for (
int k = 0; k < p.
K[j]; ++k) {
157 for (
int i = 0; i < p.
M; ++i) {
158 for (
int ni = 0; ni <= p.
N; ++ni) {
159 for (
int h = 0; h < p.
K[i]; ++h) {
161 for (
int nj = 1; nj <= p.
N; ++nj)
174 for (
int j = 0; j < p.
M; ++j) {
175 for (
int k = 0; k < p.
K[j]; ++k) {
176 for (
int i = 0; i < p.
M; ++i) {
177 for (
int ni = 0; ni <= p.
N; ++ni) {
178 for (
int h = 0; h < p.
K[i]; ++h) {
197 for (
int j = 0; j < p.
M; ++j) {
198 for (
int nj = 0; nj <= p.
N; ++nj) {
199 for (
int k = 0; k < p.
K[j]; ++k) {
200 for (
int i = 0; i < p.
M; ++i) {
201 for (
int ni = 0; ni <= p.
N; ++ni) {
202 for (
int h = 0; h < p.
K[i]; ++h) {
203 const bool ordered = (j < i) || (j == i && nj < ni) ||
204 (j == i && nj == ni && k < h);
205 if (!ordered)
continue;
206 const std::size_t a = x.
p2(i, ni, h, j, nj, k);
207 const std::size_t b = x.
p2(j, nj, k, i, ni, h);
208 if (a == b)
continue;
227 for (
int j = 0; j < p.
M; ++j) {
228 for (
int k = 0; k < p.
K[j]; ++k) {
229 for (
int nj = 0; nj <= p.
N; ++nj) {
230 for (
int i = 0; i < p.
M; ++i) {
231 if (i == j)
continue;
233 for (
int ni = 0; ni <= p.
N - nj; ++ni)
234 for (
int h = 0; h < p.
K[i]; ++h)
249 for (
int j = 0; j < p.
M; ++j) {
250 for (
int k = 0; k < p.
K[j]; ++k) {
251 for (
int nj = 0; nj <= p.
N; ++nj) {
252 for (
int i = 0; i < p.
M; ++i)
253 for (
int ni = 1; ni <= p.
N; ++ni)
254 for (
int h = 0; h < p.
K[i]; ++h)
270 for (
int i = 0; i < p.
M; ++i) {
271 for (
int u = 0; u < p.
K[i]; ++u) {
272 for (
int j = 0; j < p.
M; ++j) {
273 if (j == i)
continue;
274 for (
int nj = 1; nj <= p.
N; ++nj)
275 for (
int k = 0; k < p.
K[j]; ++k)
276 for (
int h = 0; h < p.
K[j]; ++h)
277 m.
row_add(x.
p2(j, nj, k, i, 0, u), qr_rate(p, j, i, k, h));
278 for (
int nj = 0; nj <= p.
N; ++nj)
279 for (
int k = 0; k < p.
K[i]; ++k)
280 for (
int h = 0; h < p.
K[j]; ++h)
281 m.
row_add(x.
p2(j, nj, h, i, 1, k), T(-qr_rate(p, i, j, k, u)));
297 for (
int i = 0; i < p.
M; ++i) {
298 for (
int ni = 0; ni <= p.
N - 1; ++ni) {
299 for (
int j = 0; j < p.
M; ++j) {
300 if (j == i)
continue;
301 for (
int nj = 1; nj <= p.
N; ++nj)
302 for (
int k = 0; k < p.
K[j]; ++k)
303 for (
int h = 0; h < p.
K[j]; ++h)
304 for (
int u = 0; u < p.
K[i]; ++u)
305 m.
row_add(x.
p2(j, nj, k, i, ni, u), qr_rate(p, j, i, k, h));
306 for (
int nj = 0; nj <= p.
N; ++nj)
307 for (
int k = 0; k < p.
K[i]; ++k)
308 for (
int u = 0; u < p.
K[j]; ++u)
309 for (
int h = 0; h < p.
K[i]; ++h)
311 T(-qr_rate(p, i, j, k, h)));
321 for (
int j = 0; j < p.
M; ++j) {
322 for (
int k = 0; k < p.
K[j]; ++k) {
323 for (
int i = 0; i < p.
M; ++i) {
325 for (
int h = 0; h < p.
K[i]; ++h) m.
row_add_int(x.
Q(i, h), -1);
335 for (
int j = 0; j < p.
M; ++j) {
336 for (
int k = 0; k < p.
K[j]; ++k) {
337 for (
int i = 0; i < p.
M; ++i) {
349 for (
int j = 0; j < p.
M; ++j) {
350 for (
int k = 0; k < p.
K[j]; ++k) {
351 for (
int i = 0; i < p.
M; ++i) {
352 for (
int h = 0; h < p.
K[i]; ++h)
353 for (
int nj = 0; nj <= p.
N; ++nj)
354 for (
int ni = 1; ni <= p.
N; ++ni)
356 for (
int t = 0; t < p.
M; ++t)
357 for (
int h = 0; h < p.
K[t]; ++h)
358 for (
int nj = 0; nj <= p.
N; ++nj)
359 for (
int nt = 0; nt <= p.
N; ++nt)
383 detail::p1_check_objective(p, objective_queue, objective_phase);
387 detail::p1_bounds(p, x, m);
392 detail::p1_zer1(p, x, m);
393 detail::p1_zer2(p, x, m);
394 detail::p1_zer3(p, x, m);
395 detail::p1_zer4(p, x, m);
396 detail::qr_zer5(p, x, m);
397 detail::qr_zer6(p, x, m);
398 detail::qr_zer7(p, x, m);
399 detail::p1_cequ(p, x, m);
400 detail::p1_one1(p, x, m);
401 detail::p1_utlb(p, x, m);
402 detail::p1_utlc(p, x, m);
403 detail::p1_qlen(p, x, m);
404 detail::p1_srvb(p, x, m);
405 detail::p1_popc(p, x, m);
406 detail::p1_one(p, x, m);
407 detail::qr_pcl2(p, x, m);
408 detail::qr_pi21(p, x, m);
409 detail::qr_pi22(p, x, m);
410 detail::qr_pi23(p, x, m);
411 detail::p1_clen(p, x, m);
412 detail::qr_marg(p, x, m);
413 detail::qr_thm2(p, x, m);
414 detail::qr_thm30(p, x, m);
415 detail::qr_thm3(p, x, m);
416 detail::p1_uub1(p, x, m);
417 detail::p1_qub1(p, x, m);
418 detail::qr_cub1(p, x, m);
419 detail::qr_cub2(p, x, m);
420 detail::qr_thm4(p, x, m);
435 if (!out.
ok)
return out;
437 std::size_t maxK = 0;
438 for (
int i = 0; i < p.
M; ++i)
439 if (
static_cast<std::size_t
>(p.
K[i]) > maxK) maxK =
static_cast<std::size_t
>(p.
K[i]);
440 out.
U =
Matrix<T>(
static_cast<std::size_t
>(p.
M), maxK);
441 out.
IT =
Matrix<T>(
static_cast<std::size_t
>(p.
M), maxK);
442 out.
Q =
Matrix<T>(
static_cast<std::size_t
>(p.
M), maxK);
443 for (
int i = 0; i < p.
M; ++i) {
444 for (
int k = 0; k < p.
K[i]; ++k) {
445 const std::size_t ii =
static_cast<std::size_t
>(i), kk =
static_cast<std::size_t
>(k);
446 out.
U(ii, kk) = sol.
x[x.
U(i, k)];
447 out.
IT(ii, kk) = sol.
x[x.
IT(i, k)];
448 out.
Q(ii, kk) = sol.
x[x.
Q(i, k)];
Sparse LP in the natural form, with per-variable bounds.
void set_maximize(bool m)
true to maximize c'x (the default), false to minimize.
std::size_t num_rows() const
void emit_eq_int(long rhs)
void row_add_int(std::size_t j, long v)
void set_cost(std::size_t j, const T &v)
std::size_t num_vars() const
void fix(std::size_t j, const T &v)
Pin a variable to a value; it is substituted out of the tableau.
void row_add(std::size_t j, const T &v)
row(j) += v, the accumulation the MATLAB reference performs.
void emit_le_int(long rhs)
The exception types the port throws.
The variable layout and the constraint families shared by the two reductions that carry singly-indexe...
Model parameters and variable indexing shared by the mapqn QR bounds.
Dense matrix and non-owning view.
const char * lp_status_name(LpStatus s)
LpSolution< T > simplex_solve(const LpModel< T > &model, std::size_t max_iterations=0)
Solve the model.
void qr_thm4(const MapqnParams< T > &p, const P2Index &idx, lp::LpModel< T > &m)
THM4 (QMIN): for each (j,k,i), sum_{t,h,nj,nt} nt p2(j,nj,k,t,nt,h) >= N sum_{h,nj,...
MapqnP1Index QrIndex
Variable layout of the general QR model: the shared p1-level blocks plus the joint p2 block.
MapqnSense
Which direction the bound is taken in.
MapqnBndQrResult< T > mapqn_bnd_qr(const MapqnParams< T > &p, int objective_queue, int objective_phase, MapqnSense sense=MapqnSense::Max)
Bound U(objective_queue, objective_phase) over the general QR polytope.
void qr_thm2(const MapqnParams< T > &p, const P2Index &idx, lp::LpModel< T > &m)
THM2 (phase balance): for each (i,k) the total rate out of phase k at queue i equals the total rate i...
Number-type abstraction for the templated API port.
Templated primal simplex with Bland's rule.
T objective
c'x, in the sense requested (max or min)
std::vector< T > x
primal solution in the ORIGINAL variable space
Result of a general QR bound solve.
Matrix< T > U
M x max(K) utilizations, 0 beyond K(i).
std::vector< T > x
full solution vector, indexed by QrIndex
bool ok
the LP reached an optimal vertex
std::string status
textual LP status
Matrix< T > Q
M x max(K) mean queue lengths, 0 beyond K(i).
Matrix< T > IT
M x max(K) idle times, 0 beyond K(i).
T objective
the bound on U(objective_queue, objective_phase)
Variable layout of the p1-level models.
std::size_t Q(int i, int k) const
std::size_t p1c(int j, int k, int i, int ni, int h) const
std::size_t IT(int i, int k) const
std::size_t C(int j, int k, int i) const
std::size_t p1(int j, int k, int i, int ni, int h) const
std::size_t U(int i, int k) const
std::size_t num_vars() const
std::size_t p2(int j, int nj, int k, int i, int ni, int h) const
Parameters of a MAP queueing network for the QR bounds.
std::vector< int > K
K[i] = number of phases at queue i.