|
Prev
| Next
|
|
|
|
|
|
lp_box.hpp |
Headings |
@(@\newcommand{\W}[1]{ \; #1 \; }
\newcommand{\R}[1]{ {\rm #1} }
\newcommand{\B}[1]{ {\bf #1} }
\newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} }
\newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} }
\newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} }
\newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@This is cppad-20221105 documentation. Here is a link to its
current documentation
.
lp_box Source Code
namespace CppAD { // BEGIN_CPPAD_NAMESPACE
// BEGIN PROTOTYPE
template <class Vector>
bool lp_box(
size_t level ,
const Vector& A ,
const Vector& b ,
const Vector& c ,
const Vector& d ,
size_t maxitr ,
Vector& xout )
// END PROTOTYPE
{ double inf = std::numeric_limits<double>::infinity();
//
size_t m = b.size();
size_t n = c.size();
//
CPPAD_ASSERT_KNOWN(
level <= 3, "lp_box: level is greater than 3");
CPPAD_ASSERT_KNOWN(
size_t(A.size()) == m * n, "lp_box: size of A is not m * n"
);
CPPAD_ASSERT_KNOWN(
size_t(d.size()) == n, "lp_box: size of d is not n"
);
if( level > 0 )
{ std::cout << "start lp_box\n";
CppAD::abs_print_mat("A", m, n, A);
CppAD::abs_print_mat("b", m, 1, b);
CppAD::abs_print_mat("c", n, 1, c);
CppAD::abs_print_mat("d", n, 1, d);
}
//
// count number of limits
size_t n_limit = 0;
for(size_t j = 0; j < n; j++)
{ if( d[j] < inf )
n_limit += 1;
}
//
// A_simplex and b_simplex define the extended constraints
Vector A_simplex((m + 2 * n_limit) * (2 * n) ), b_simplex(m + 2 * n_limit);
for(size_t i = 0; i < size_t(A_simplex.size()); i++)
A_simplex[i] = 0.0;
//
// put A * x + b <= 0 in A_simplex, b_simplex
for(size_t i = 0; i < m; i++)
{ b_simplex[i] = b[i];
for(size_t j = 0; j < n; j++)
{ // x_j^+ coefficient (positive component)
A_simplex[i * (2 * n) + 2 * j] = A[i * n + j];
// x_j^- coefficient (negative component)
A_simplex[i * (2 * n) + 2 * j + 1] = - A[i * n + j];
}
}
//
// put | x_j | <= d_j in A_simplex, b_simplex
size_t i_limit = 0;
for(size_t j = 0; j < n; j++) if( d[j] < inf )
{
// x_j^+ <= d_j constraint
b_simplex[ m + 2 * i_limit] = - d[j];
A_simplex[(m + 2 * i_limit) * (2 * n) + 2 * j] = 1.0;
//
// x_j^- <= d_j constraint
b_simplex[ m + 2 * i_limit + 1] = - d[j];
A_simplex[(m + 2 * i_limit + 1) * (2 * n) + 2 * j + 1] = 1.0;
//
++i_limit;
}
//
// c_simples
Vector c_simplex(2 * n);
for(size_t j = 0; j < n; j++)
{ // x_j+ component
c_simplex[2 * j] = c[j];
// x_j^- component
c_simplex[2 * j + 1] = - c[j];
}
size_t level_simplex = 0;
if( level >= 2 )
level_simplex = level - 1;
//
Vector x_simplex(2 * n);
bool ok = CppAD::simplex_method(
level_simplex, A_simplex, b_simplex, c_simplex, maxitr, x_simplex
);
for(size_t j = 0; j < n; j++)
xout[j] = x_simplex[2 * j] - x_simplex[2 * j + 1];
if( level > 0 )
{ CppAD::abs_print_mat("xout", n, 1, xout);
if( ok )
std::cout << "end lp_box: ok = true\n";
else
std::cout << "end lp_box: ok = false\n";
}
return ok;
}
} // END_CPPAD_NAMESPACE
Input File: example/abs_normal/lp_box.omh