11 #include "CoinHelperFunctions.hpp"
18 using namespace Couenne;
25 std::cout<<
"Expression has "<<
lcoeff_.size () <<
" linear terms and "
26 <<
nqterms_ <<
" quadratic terms." << std::endl;
29 for (sparseQ::iterator row =
matrix_.begin (); row !=
matrix_.end (); ++row) {
30 int xind = row -> first ->
Index ();
31 for (sparseQcol::iterator col = row -> second.begin (); col != row -> second.end (); ++col)
32 printf (
" <%d,%d,%g>", xind, col -> first ->
Index (), col -> second);
36 for (lincoeff::iterator el =
lcoeff_.begin (); el !=
lcoeff_.end (); ++el)
38 printf (
" <%d,%g>", el -> first ->
Index (), el -> second);
41 printf (
"; <c0 = %g>",
c0_);
43 printf (
"\nBounds: var val lb ub eigval scaled\n");
47 for (std::map <
exprVar *, std::pair <CouNumber, CouNumber> >::iterator i =
bounds_.begin ();
48 i !=
bounds_.end (); ++i, index++) {
50 printf (
"%3d:\t", index);
51 i -> first ->
print (); printf (
"\t");
52 printf (
" %8g [%8g, %8g]",
53 (*(i -> first)) (), i -> second.first, i -> second.second);
56 lb = cg -> Problem () -> Lb (i -> first ->
Index ()),
57 ub = cg -> Problem () -> Ub (i -> first ->
Index ());
59 if ((
eigen_.size () > 0) &&
61 printf (
" --> %8g %8g",
63 eigen_.begin () -> first / (ub-lb));
75 (
eigen_.size () == 0) ? 0. :
77 CoinMin (0.,
eigen_.begin () -> first) :
78 CoinMax (0.,
eigen_.rbegin () -> first),
81 enum auxSign sign = cg -> Problem () -> Var (w ->
Index ()) -> sign ();
89 const int numcols = problem.
nVars ();
92 *colsol = problem.
X (),
93 *lower = problem.
Lb (),
94 *upper = problem.
Ub ();
105 for (std::map <
exprVar *, std::pair <CouNumber, CouNumber> >::iterator i =
bounds_.begin ();
108 int ind = i -> first ->
Index ();
117 convVal += lambda * (xi-lb) * (ub-xi) / (delta * delta);
120 if (varVal < exprVal) {
if (convVal < varVal)
return;}
121 else {
if (convVal > varVal)
return;}
125 std::cout <<
"Point to cut: ";
126 for (
int i = 0 ; i < numcols ; i++) std::cout << colsol [i] <<
", ";
127 printf (
" (w,f(x),c) = (%g,%g,%g) -- lambda = %g\n", (*w) (), exprVal, convVal, lambda);
132 *Qxs =
new double [numcols],
135 CoinFillN (Qxs, numcols, 0.);
138 for (sparseQ::iterator row =
matrix_.begin (); row !=
matrix_.end (); ++row) {
140 int qi = row -> first ->
Index ();
142 for (sparseQcol::iterator col = row -> second.begin (); col != row -> second.end (); ++col) {
144 int qj = col -> first ->
Index ();
154 a0 += 2 * qc * xi * xj;
171 Qxs [qi] += 2 * qc * xi;
177 printf (
"2Qx = (");
for (
int i = 0; i < numcols; i++) printf (
"%g ", Qxs [i]); printf (
")\n");
181 for (lincoeff::iterator el =
lcoeff_.begin (); el !=
lcoeff_.end (); ++el)
182 Qxs [el -> first ->
Index ()] += el -> second;
195 Qxs [w ->
Index ()] -= 1;
198 printf (
"2Qx = (");
for(
int i = 0; i < numcols; i++) printf (
"%g ", Qxs [i]); printf (
")[%g]\n",a0);
205 for (std::map <
exprVar *, std::pair <CouNumber, CouNumber> >::iterator i =
bounds_.begin ();
208 int ind = i -> first ->
Index ();
218 CouNumber normlambda = lambda / (delta*delta),
219 coeff = normlambda * (lb + ub - 2. * xi);
221 a0 += normlambda * (lb*ub - xi*xi);
237 for (
int i=0; i < numcols ; i++)
242 printf (
"2Qx = (");
for(
int i=0;i<numcols;i++)printf(
"%g ",Qxs[i]);printf (
")[%g], %d nz\n",a0,nnz);
246 CoinPackedVector
a (
false);
251 *optimum = cg -> Problem () -> bestSol (),
252 *current = cg -> Problem () -> X ();
255 for (
int i=0; i < numcols; i++)
257 if (fabs (Qxs [i]) > 1.0
e-21) {
262 printf (
"%+g * %g ", Qxs [i], optimum [i]);
263 lhs += Qxs [i] * optimum [i];
265 lhsc += Qxs [i] * current [i];
267 a.insert (i, Qxs [i]);
275 if (varVal < exprVal) {
281 printf (
"cut violates optimal solution: %g > %g\n", lhs, a0);
285 printf (
"cut (+) is not cutting: ");
296 printf (
"cut violates optimal solution: %g < %g\n", lhs, a0);
300 printf (
"cut (-) is not cutting: ");
Cut Generator for linear convexifications.
CouNumber & Ub(int i) const
upper bound on
int nVars() const
Total number of variables.
void fint fint fint real * a
CouNumber c0_
constant term
CouNumber & X(int i) const
CouNumber & Lb(int i) const
lower bound on
int nqterms_
number of non-zeroes in Q
void fint fint fint real fint real real real real real real real real real * e
virtual int Index() const
Return index of variable (only valid for exprVar and exprAux)
void quadCuts(expression *w, OsiCuts &cs, const CouenneCutGenerator *cg)
method exprQuad::quadCuts
auxSign
"sign" of the constraint defining an auxiliary.
lincoeff lcoeff_
coefficients and indices of the linear term
Class for MINLP problems with symbolic information.
std::vector< std::pair< CouNumber, std::vector< std::pair< exprVar *, CouNumber > > > > eigen_
eigenvalues and eigenvectors
std::map< exprVar *, std::pair< CouNumber, CouNumber > > bounds_
current bounds (checked before re-computing eigenvalues/vectors)
double CouNumber
main number type in Couenne
int nnz
ATTENTION: Filter expect the jacobian to be ordered by row.
void fint fint fint real fint real real real real real real real real * w
virtual void print(std::ostream &=std::cout, bool=false) const
Print expression to an iostream.