Couenne 0.5.8
Loading...
Searching...
No Matches
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"
23#include "CouenneConfig.h"
24#include "CouenneJournalist.hpp"
25#include "CouenneTypes.hpp"
26
27namespace Ipopt {
28 template <class T> class SmartPtr;
29 class OptionsList;
30 class Journalist;
31}
32
33namespace Bonmin {
35 class BabInfo;
37 class BabSetupBase;
38}
39
40struct ASL;
41
42namespace Couenne {
43
44class CouenneProblem;
45class funtriplet;
46
48
50
51 protected:
52
55 mutable bool firstcall_;
56
59 mutable bool addviolated_;
60
63
66
69
71 mutable int nrootcuts_;
72
74 mutable int ntotalcuts_;
75
77 mutable double septime_;
78
80 mutable double objValue_;
81
85
89
91 mutable bool infeasNode_;
92
95
97 mutable double rootTime_;
98
102
106
108 mutable int lastPrintLine;
109
110 public:
111
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
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
188 int,
190 int, int,
192 t_chg_bounds * = NULL,
193 bool = false) const;
194
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
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
234 int, int *, t_chg_bounds * = NULL) const;
235
237 void genColCuts (const OsiSolverInterface &, OsiCuts &, int, int *) const;
238
240 static void registerOptions (Ipopt::SmartPtr <Bonmin::RegisteredOptions> roptions);
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
263};
264
265
267void sparse2dense (int ncols, t_chg_bounds *chg_bds, int *&changed, int &nchanged);
268
269}
270
271#endif
ConstJnlstPtr Jnlst() const
Provide Journalist.
int nrootcuts_
number of cuts generated at the first call
int ntotalcuts_
total number of cuts generated
double rootTime_
Time spent at the root node.
bool infeasNode_
signal infeasibility of current node (found through bound tightening)
bool firstcall_
True if no convexification cuts have been generated yet for this problem.
void setBabPtr(Bonmin::Bab *p)
Method to set the Bab pointer.
CouenneCutGenerator * clone() const
clone method (necessary for the abstract CglCutGenerator class)
bool enableLpImpliedBounds() const
returns value of enable_lp_implied_bounds_
double & rootTime()
Time spent at root node.
bool addViolated() const
should we add the violated cuts only (true), or all of them (false)?
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Add list of options to be read from file.
int addTangent(OsiCuts &, int, int, CouNumber, CouNumber, CouNumber, int) const
add tangent at given poing (x,w) with given slope
Bonmin::Bab * BabPtr_
pointer to the Bab object (used to retrieve the current primal bound through bestObj())
enum conv_type ConvType() const
get convexification type (see CouenneTypes.h)
void addEnvelope(OsiCuts &, int, funtriplet *, int, int, CouNumber, CouNumber, CouNumber, t_chg_bounds *=NULL, bool=false) const
Add general linear envelope to convex function, given its variables' indices, the (univariate) functi...
bool enable_lp_implied_bounds_
Take advantage of OsiClpSolverInterface::tightenBounds (), known to have caused some problems some ti...
enum conv_type convtype_
what kind of sampling should be performed?
void generateCuts(const OsiSolverInterface &, OsiCuts &, const CglTreeInfo=CglTreeInfo()) const
the main CglCutGenerator
int lastPrintLine
Running count of printed info lines.
bool check_lp() const
return check_lp flag (used in CouenneSolverInterface)
void setProblem(CouenneProblem *p)
return pointer to symbolic problem
bool isFirst() const
has generateCuts been called yet?
void printLineInfo() const
print node, depth, LB/UB/LP info
int nSamples_
how many cuts should be added for each function?
void getStats(int &nrc, int &ntc, double &st)
Get statistics.
CouenneCutGenerator(Bonmin::OsiTMINLPInterface *=NULL, Bonmin::BabSetupBase *base=NULL, CouenneProblem *=NULL, struct ASL *=NULL)
constructor
CouenneProblem * Problem() const
return pointer to symbolic problem
int createCut(OsiCuts &, CouNumber, int, int, CouNumber, int=-1, CouNumber=0., int=-1, CouNumber=0., bool=false) const
create cut and check violation. Other version with only one bound
bool check_lp_
Check all generated LPs through an independent call to OsiClpSolverInterface::initialSolve()
CouenneProblem * problem_
pointer to symbolic repr. of constraint, variables, and bounds
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
bool addviolated_
True if we should add the violated cuts only, false if all of them should be added.
Bonmin::OsiTMINLPInterface * nlp_
nonlinear solver interface as used within Bonmin (used at first Couenne pass of each b&b node
double septime_
separation time (includes generation of problem)
JnlstPtr jnlst_
SmartPointer to the Journalist.
void genColCuts(const OsiSolverInterface &, OsiCuts &, int, int *) const
generate OsiColCuts for improved (implied and propagated) bounds
CouenneCutGenerator(const CouenneCutGenerator &)
copy constructor
int nSamples() const
get number of convexification samples
int getnvars() const
total number of variables (original + auxiliary)
bool & infeasNode() const
Allow to get and set the infeasNode_ flag (used only in generateCuts())
int addSegment(OsiCuts &, int, int, CouNumber, CouNumber, CouNumber, CouNumber, int) const
Add half-plane through (x1,y1) and (x2,y2) – resp.
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' indices, the (univariate) functi...
double objValue_
Record obj value at final point of CouenneConv.
void genRowCuts(const OsiSolverInterface &, OsiCuts &cs, int, int *, t_chg_bounds *=NULL) const
generate OsiRowCuts for current convexification
Class for MINLP problems with symbolic information.
status of lower/upper bound of a variable, to be checked/modified in bound tightening
general include file for different compilers
void sparse2dense(int ncols, t_chg_bounds *chg_bds, int *&changed, int &nchanged)
translate sparse to dense vector (should be replaced)
Ipopt::SmartPtr< Ipopt::Journalist > JnlstPtr
double CouNumber
main number type in Couenne
Ipopt::SmartPtr< const Ipopt::Journalist > ConstJnlstPtr
CouNumber(* unary_function)(CouNumber)
unary function, used in all exprUnary
conv_type
position and number of convexification cuts added for a lower convex (upper concave) envelope
SmartPtr< const U > ConstPtr(const SmartPtr< U > &smart_ptr)