source: Couenne/src/convex/genColCuts.cpp @ 1

Last change on this file since 1 was 1, checked in by coin, 12 years ago

Initial import

File size: 3.0 KB
Line 
1/*
2 * Name:    genColCuts.cpp
3 * Author:  Pietro Belotti
4 * Purpose: generate Column Cuts for improved bounds
5 *
6 * (C) Carnegie-Mellon University, 2006-07.
7 * This file is licensed under the Common Public License (CPL)
8 */
9
10#include "CglCutGenerator.hpp"
11#include "CouenneCutGenerator.hpp"
12#include "CouenneProblem.hpp"
13
14//#define DEBUG
15
16/// generate OsiColCuts for improved (implied and propagated) bounds
17void CouenneCutGenerator::genColCuts (const OsiSolverInterface &si,
18                                      OsiCuts &cs,
19                                      int nchanged,
20                                      int *changed) const {
21
22#ifdef DEBUG
23  int nrc = cs.sizeRowCuts ();// Must go
24#endif
25
26  int  ncols  = problem_ -> nVars (),
27      *indLow = new int [ncols], // indices for OsiColCut
28      *indUpp = new int [ncols], //
29       nLow, nUpp = nLow = 0,
30       ind_obj = problem_ -> Obj (0) -> Body () -> Index ();
31
32  // values fo OsiColCut
33  CouNumber *bndLow = new CouNumber [ncols],
34            *bndUpp = new CouNumber [ncols];
35
36  const CouNumber
37    *oldLow = si.getColLower (), // old bounds
38    *oldUpp = si.getColUpper (),
39    *newLow = problem_ -> Lb (), // changed bounds
40    *newUpp = problem_ -> Ub ();
41
42#ifdef DEBUG
43  for (int i=0; i < problem_ -> nVars (); i++)
44    if ((newLow [i] > oldLow [i] + COUENNE_EPS) ||
45        (newUpp [i] < oldUpp [i] - COUENNE_EPS))
46      printf ("x%-3d. [%-10g , %10g] ---> [%-10g , %10g]\n",
47      i, oldLow [i], oldUpp [i], newLow [i], newUpp [i]);*/
48#endif
49
50  // check all changed bounds
51  for (int i = 0; i < nchanged; i++) {
52
53    int index = changed [i];
54
55    // fails with spectra2 with (abt=2,obbt=0) for variable x70
56    //assert (problem_ -> Var (index) -> Multiplicity () > 0);
57
58    if ((index == ind_obj) || 
59        (problem_ -> Var (index) -> Multiplicity () <= 0))
60      continue;
61
62    if (newLow [index] > newUpp [index])
63      problem_ -> Lb (index) = problem_ -> Ub (index);
64
65    CouNumber bd;
66
67    if ((((bd = newLow [index]) > oldLow [index] + COUENNE_EPS) || firstcall_) // better lb?
68        && (bd > -COUENNE_INFINITY / 10)) {                                    // finite?
69
70      //printf ("chging low %d %g -> %g\n", index, oldLow [index], newLow [index]);
71      if (problem_ -> Var (index) -> isInteger ()) 
72        bd = ceil (bd);
73      indLow [nLow]   = index;
74      bndLow [nLow++] = bd;
75    }
76
77    if ((((bd = newUpp [index]) < oldUpp [index] - COUENNE_EPS) || firstcall_) // better ub?
78        && (bd < COUENNE_INFINITY / 10)) {                                     // finite?
79
80      //printf ("chging upp %d %g -> %g\n", index, oldUpp [index], newUpp [index]);
81      if (problem_ -> Var (index) -> isInteger ()) 
82        bd = floor (bd);
83      indUpp [nUpp]   = index;
84      bndUpp [nUpp++] = bd;
85    }
86  }
87
88  // create Column Cut
89
90  if (nUpp || nLow) {
91
92    OsiColCut *cut = new OsiColCut;
93
94    if (cut) {
95      cut -> setLbs (nLow, indLow, bndLow);
96      cut -> setUbs (nUpp, indUpp, bndUpp);
97
98      cs.insert (cut);
99      delete cut;
100    }
101  }
102
103#ifdef DEBUG
104  printf ("column cuts\n");
105  for (int jj = nrc; jj < cs.sizeRowCuts (); jj++) cs.rowCutPtr (jj) -> print ();
106#endif
107
108  delete [] bndLow; delete [] indLow;
109  delete [] bndUpp; delete [] indUpp;
110}
Note: See TracBrowser for help on using the repository browser.