Couenne  0.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CouenneCutGenerator.hpp
Go to the documentation of this file.
1 /* $Id: CouenneCutGenerator.hpp 945 2013-04-06 20:25:21Z stefan $
2  *
3  * Name: CouenneCutGenerator.hpp
4  * Author: Pietro Belotti
5  * Purpose: a convexification cut generator for MINLP problems
6  *
7  * (C) Carnegie-Mellon University, 2006-09.
8  * This file is licensed under the Eclipse Public License (EPL)
9  */
10 
11 #ifndef COUENNE_CUT_GENERATOR_HPP
12 #define COUENNE_CUT_GENERATOR_HPP
13 
14 //#include "BonRegisteredOptions.hpp"
15 
16 #include "BonOaDecBase.hpp"
17 #include "CglConfig.h"
18 #include "CglCutGenerator.hpp"
19 #include "OsiRowCut.hpp"
20 #include "BonAuxInfos.hpp"
21 #include "BonBabInfos.hpp"
22 #include "OsiSolverInterface.hpp"
23 #include "CouenneConfig.h"
24 #include "CouenneJournalist.hpp"
25 #include "CouenneTypes.hpp"
26 
27 namespace Ipopt {
28  template <class T> class SmartPtr;
29  class OptionsList;
30  class Journalist;
31 }
32 
33 namespace Bonmin {
34  class RegisteredOptions;
35  class BabInfo;
36  class OsiTMINLPInterface;
37  class BabSetupBase;
38 }
39 
40 struct ASL;
41 
42 namespace Couenne {
43 
44 class CouenneProblem;
45 class funtriplet;
46 
48 
49 class CouenneCutGenerator: public CglCutGenerator {
50 
51  protected:
52 
55  mutable bool firstcall_;
56 
59  mutable bool addviolated_;
60 
63 
65  int nSamples_;
66 
69 
71  mutable int nrootcuts_;
72 
74  mutable int ntotalcuts_;
75 
77  mutable double septime_;
78 
80  mutable double objValue_;
81 
84  Bonmin::OsiTMINLPInterface *nlp_;
85 
88  Bonmin::Bab *BabPtr_;
89 
91  mutable bool infeasNode_;
92 
95 
97  mutable double rootTime_;
98 
101  bool check_lp_;
102 
106 
108  mutable int lastPrintLine;
109 
110  public:
111 
113  CouenneCutGenerator (Bonmin::OsiTMINLPInterface * = NULL,
114  Bonmin::BabSetupBase *base = NULL,
115  CouenneProblem * = NULL,
116  struct ASL * = NULL);
117 
120 
123 
126  {return new CouenneCutGenerator (*this);}
127 
129  inline CouenneProblem *Problem () const
130  {return problem_;}
131 
133  inline void setProblem (CouenneProblem *p)
134  {problem_ = p;}
135 
137  int getnvars () const;
138 
140  inline bool isFirst () const
141  {return firstcall_;}
142 
144  inline bool addViolated () const
145  {return addviolated_;}
146 
148  inline enum conv_type ConvType () const
149  {return convtype_;}
150 
152  inline int nSamples () const
153  {return nSamples_;}
154 
156  void generateCuts (const OsiSolverInterface &,
157  OsiCuts &,
158  const CglTreeInfo = CglTreeInfo ())
159 #if CGL_VERSION_MAJOR == 0 && CGL_VERSION_MINOR <= 57
160  const
161 #endif
162  ;
163 
165  int createCut (OsiCuts &, // cutset to insert
166  CouNumber, // lb
167  CouNumber, // ub
168  // index, coeff (index -1: "don't care")
169  int, CouNumber, // of first term
170  int=-1, CouNumber=0., // of second term
171  int=-1, CouNumber=0., // of third term
172  bool = false) const; // is it a global cut? No, by default
173 
175  int createCut (OsiCuts &, // cutset to insert
176  CouNumber, // rhs
177  int, // sign: -1: <=, 0: =, +1: >=
178  // index, coeff (index -1: "don't care")
179  int, CouNumber, // of first term
180  int=-1, CouNumber=0., // of second term
181  int=-1, CouNumber=0., // of third term
182  bool = false) const; // is it a global cut? No, by default
183 
187  void addEnvelope (OsiCuts &,
188  int,
190  int, int,
192  t_chg_bounds * = NULL,
193  bool = false) const;
194 
198  void addEnvelope (OsiCuts &,
199  int,
200  funtriplet *,
201  int, int,
203  t_chg_bounds * = NULL,
204  bool = false) const;
205 
208  int addSegment (OsiCuts &, int, int,
210  CouNumber, CouNumber, int) const;
211 
213  int addTangent (OsiCuts &, int, int,
215  CouNumber, int) const;
216 
218  void setBabPtr (Bonmin::Bab *p)
219  {BabPtr_ = p;}
220 
222  void getStats (int &nrc, int &ntc, double &st) {
223  nrc = nrootcuts_;
224  ntc = ntotalcuts_;
225  st = septime_;
226  }
227 
229  bool &infeasNode () const
230  {return infeasNode_;}
231 
233  void genRowCuts (const OsiSolverInterface &, OsiCuts &cs,
234  int, int *, t_chg_bounds * = NULL) const;
235 
237  void genColCuts (const OsiSolverInterface &, OsiCuts &, int, int *) const;
238 
241 
243  void printLineInfo() const;
244 
246  inline ConstJnlstPtr Jnlst() const
247  {return ConstPtr (jnlst_);}
248 
249  void setJnlst (JnlstPtr jnlst__)
250  { jnlst_ = jnlst__; }
251 
253  double &rootTime ()
254  {return rootTime_;}
255 
257  bool check_lp () const
258  {return check_lp_;}
259 
261  bool enableLpImpliedBounds () const
262  {return enable_lp_implied_bounds_;}
263 };
264 
265 
267 void sparse2dense (int ncols, t_chg_bounds *chg_bds, int *&changed, int &nchanged);
268 
269 }
270 
271 #endif
Cut Generator for linear convexifications.
bool firstcall_
True if no convexification cuts have been generated yet for this problem.
bool addviolated_
True if we should add the violated cuts only, false if all of them should be added.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Add list of options to be read from file.
Bonmin::OsiTMINLPInterface * nlp_
nonlinear solver interface as used within Bonmin (used at first Couenne pass of each b&amp;b node ...
ConstJnlstPtr Jnlst() const
Provide Journalist.
int lastPrintLine
Running count of printed info lines.
status of lower/upper bound of a variable, to be checked/modified in bound tightening ...
enum conv_type convtype_
what kind of sampling should be performed?
void genRowCuts(const OsiSolverInterface &, OsiCuts &cs, int, int *, t_chg_bounds *=NULL) const
generate OsiRowCuts for current convexification
double objValue_
Record obj value at final point of CouenneConv.
bool check_lp_
Check all generated LPs through an independent call to OsiClpSolverInterface::initialSolve() ...
CouenneCutGenerator(Bonmin::OsiTMINLPInterface *=NULL, Bonmin::BabSetupBase *base=NULL, CouenneProblem *=NULL, struct ASL *=NULL)
constructor
enum conv_type ConvType() const
get convexification type (see CouenneTypes.h)
bool check_lp() const
return check_lp flag (used in CouenneSolverInterface)
void getStats(int &nrc, int &ntc, double &st)
Get statistics.
JnlstPtr jnlst_
SmartPointer to the Journalist.
bool enableLpImpliedBounds() const
returns value of enable_lp_implied_bounds_
double septime_
separation time (includes generation of problem)
CouenneProblem * Problem() const
return pointer to symbolic problem
int createCut(OsiCuts &, CouNumber, CouNumber, int, CouNumber, int=-1, CouNumber=0., int=-1, CouNumber=0., bool=false) const
create cut and check violation. Insert and return status
void sparse2dense(int ncols, t_chg_bounds *chg_bds, int *&changed, int &nchanged)
translate sparse to dense vector (should be replaced)
double & rootTime()
Time spent at root node.
void setBabPtr(Bonmin::Bab *p)
Method to set the Bab pointer.
void printLineInfo() const
print node, depth, LB/UB/LP info
CouNumber(* unary_function)(CouNumber)
unary function, used in all exprUnary
Class for MINLP problems with symbolic information.
bool isFirst() const
has generateCuts been called yet?
bool enable_lp_implied_bounds_
Take advantage of OsiClpSolverInterface::tightenBounds (), known to have caused some problems some ti...
int nSamples() const
get number of convexification samples
void addEnvelope(OsiCuts &, int, unary_function, unary_function, int, int, CouNumber, CouNumber, CouNumber, t_chg_bounds *=NULL, bool=false) const
Add general linear envelope to convex function, given its variables&#39; indices, the (univariate) functi...
void setProblem(CouenneProblem *p)
return pointer to symbolic problem
bool & infeasNode() const
Allow to get and set the infeasNode_ flag (used only in generateCuts())
int getnvars() const
total number of variables (original + auxiliary)
double CouNumber
main number type in Couenne
bool infeasNode_
signal infeasibility of current node (found through bound tightening)
Bonmin::Bab * BabPtr_
pointer to the Bab object (used to retrieve the current primal bound through bestObj()) ...
CouenneProblem * problem_
pointer to symbolic repr. of constraint, variables, and bounds
void genColCuts(const OsiSolverInterface &, OsiCuts &, int, int *) const
generate OsiColCuts for improved (implied and propagated) bounds
CouenneCutGenerator * clone() const
clone method (necessary for the abstract CglCutGenerator class)
double rootTime_
Time spent at the root node.
int ntotalcuts_
total number of cuts generated
int addTangent(OsiCuts &, int, int, CouNumber, CouNumber, CouNumber, int) const
add tangent at given poing (x,w) with given slope
bool addViolated() const
should we add the violated cuts only (true), or all of them (false)?
int nrootcuts_
number of cuts generated at the first call
void generateCuts(const OsiSolverInterface &, OsiCuts &, const CglTreeInfo=CglTreeInfo()) const
the main CglCutGenerator
int addSegment(OsiCuts &, int, int, CouNumber, CouNumber, CouNumber, CouNumber, int) const
Add half-plane through (x1,y1) and (x2,y2) – resp.
conv_type
position and number of convexification cuts added for a lower convex (upper concave) envelope ...
int nSamples_
how many cuts should be added for each function?