Couenne 0.5.8
CouenneDisjCuts.hpp
Go to the documentation of this file.
1/* $Id: CouenneDisjCuts.hpp 945 2013-04-06 20:25:21Z stefan $
2 *
3 * Name: CouenneDisjCuts.hpp
4 * Author: Pietro Belotti
5 * Purpose: a generator of disjunctive cuts for MINLP problems
6 *
7 * (C) Carnegie-Mellon University, 2008.
8 * This file is licensed under the Eclipse Public License (EPL)
9 */
10
11#ifndef COUENNE_DISJUNCTIVE_CUTS_HPP
12#define COUENNE_DISJUNCTIVE_CUTS_HPP
13
15
17#include "CglConfig.h"
18#include "CglCutGenerator.hpp"
20#include "BonBabSetupBase.hpp"
21#include "BonBabInfos.hpp"
22#include "OsiChooseVariable.hpp"
23#include "CouenneTypes.hpp"
24#include "CouenneJournalist.hpp"
25
26namespace Couenne {
27
28class CouenneCutGenerator;
29
31
33
35
36 protected:
37
40
42 mutable int nrootcuts_;
43
45 mutable int ntotalcuts_;
46
48 mutable double septime_;
49
51 mutable double objValue_;
52
56
59
62
65
67 mutable int numDisjunctions_;
68
71
74
77
80
83
86
89
91 double cpuTime_;
92
93 public:
94
97 Bonmin::BabSetupBase *base = NULL,
98 CouenneCutGenerator *cg = NULL,
99 OsiChooseVariable *bcv = NULL,
100 bool is_strong = false,
101 JnlstPtr journalist = NULL,
102 const Ipopt::SmartPtr<Ipopt::OptionsList> options = NULL);
103
106
109
112 {return new CouenneDisjCuts (*this);}
113
116 {return couenneCG_;}
117
120 OsiCuts &,
121 const CglTreeInfo = CglTreeInfo ())
122#if CGL_VERSION_MAJOR == 0 && CGL_VERSION_MINOR <= 57
123 const
124#endif
125 ;
126
129
131 inline ConstJnlstPtr Jnlst() const
132 {return ConstPtr (jnlst_);}
133
135 int getDisjunctions (std::vector <std::pair <OsiCuts *, OsiCuts *> > &disjunctions,
137 OsiCuts &cs,
138 const CglTreeInfo &info) const;
139
143 OsiCuts &cs,
144 const CglTreeInfo &info) const;
145
147 int generateDisjCuts (std::vector <std::pair <OsiCuts *, OsiCuts *> > &disjs,
149 OsiCuts &cs,
150 const CglTreeInfo &info) const;
151
154
157 OsiCuts *left, OsiCuts *right,
158 CoinPackedVector &lower, CoinPackedVector &upper) const;
159
160protected:
161
164
166 void mergeBoxes (int dir, // direction (negative for "<", positive for ">")
167 CoinPackedVector &left, // input
168 CoinPackedVector &right, // input
169 CoinPackedVector merged) const; // output
170
173 OsiCuts *cuts) const;
174
177 OsiColCut *cut) const;
178
179 // construct reduced, standard form matrix M from coefficient matrix of si
182 OsiSolverInterface &si) const;
183
187 OsiCuts *cuts,
188 int displRow,
189 int displRhs) const;
190};
191
192
194inline void CoinInvN (register const double *orig,
195 register int n,
196 register double *inverted) {
197
198 while (n--) *inverted++ = - *orig++;
199}
200
201
203inline void CoinCopyDisp (register const int *src,
204 register int num,
205 register int *dst,
206 register int displacement) {
207 while (num--)
208 *dst++ = *src++ + displacement;
209}
210
211}
212
213#endif
Cut Generator for linear convexifications.
Cut Generator for linear convexifications.
bool addPreviousCut_
add previous disj cut to current CGLP?
double cpuTime_
maximum CPU time
~CouenneDisjCuts()
destructor
int depthStopSeparate_
Depth of the BB tree where stop separation.
JnlstPtr jnlst_
SmartPointer to the Journalist.
void OsiSI2MatrVec(CoinPackedMatrix &M, CoinPackedVector &r, OsiSolverInterface &si) const
OsiCuts * getSingleDisjunction(OsiSolverInterface &si) const
create single osicolcut disjunction
bool activeRows_
only include active rows in CGLP
int initDisjNumber_
Initial number of objects to use for generating cuts.
double septime_
separation time (includes generation of problem)
int ntotalcuts_
total number of cuts generated
CouenneCutGenerator * couenneCG() const
return pointer to symbolic problem
int getDisjunctions(std::vector< std::pair< OsiCuts *, OsiCuts * > > &disjunctions, OsiSolverInterface &si, OsiCuts &cs, const CglTreeInfo &info) const
get all disjunctions
int separateWithDisjunction(OsiCuts *cuts, OsiSolverInterface &si, OsiCuts &cs, const CglTreeInfo &info) const
separate couenne cuts on both sides of single disjunction
CouenneCutGenerator * couenneCG_
pointer to symbolic repr. of constraint, variables, and bounds
int depthLevelling_
Depth of the BB tree where start decreasing number of objects.
void generateCuts(const OsiSolverInterface &, OsiCuts &, const CglTreeInfo=CglTreeInfo()) const
the main CglCutGenerator
void applyColCuts(OsiSolverInterface &si, OsiCuts *cuts) const
our own applyColCuts
int generateDisjCuts(std::vector< std::pair< OsiCuts *, OsiCuts * > > &disjs, OsiSolverInterface &si, OsiCuts &cs, const CglTreeInfo &info) const
generate one disjunctive cut from one CGLP
int OsiCuts2MatrVec(OsiSolverInterface *cglp, OsiCuts *cuts, int displRow, int displRhs) const
add CGLP columns to solver interface; return number of columns added (for later removal)
CouenneDisjCuts(const CouenneDisjCuts &)
copy constructor
void mergeBoxes(int dir, CoinPackedVector &left, CoinPackedVector &right, CoinPackedVector merged) const
utility to merge vectors into one
int checkDisjSide(OsiSolverInterface &si, OsiCuts *cuts) const
check if (column!) cuts compatible with solver interface
int numDisjunctions_
Number of disjunction to consider at each separation.
void applyColCuts(OsiSolverInterface &si, OsiColCut *cut) const
our own applyColCut, single cut
ConstJnlstPtr Jnlst() const
Provide Journalist.
OsiChooseVariable * branchingMethod_
Branching scheme (if strong, we can use SB candidates)
int getBoxUnion(OsiSolverInterface &si, OsiCuts *left, OsiCuts *right, CoinPackedVector &lower, CoinPackedVector &upper) const
compute smallest box containing both left and right boxes.
Bonmin::OsiTMINLPInterface * minlp_
nonlinear solver interface as used within Bonmin (used at first Couenne pass of each b&b node)
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Add list of options to be read from file.
double objValue_
Record obj value at final point of CouenneConv.
bool isBranchingStrong_
Is branchMethod_ referred to a strong branching scheme?
double initDisjPercentage_
Initial percentage of objects to use for generating cuts, in [0,1].
CouenneDisjCuts(Bonmin::OsiTMINLPInterface *minlp=NULL, Bonmin::BabSetupBase *base=NULL, CouenneCutGenerator *cg=NULL, OsiChooseVariable *bcv=NULL, bool is_strong=false, JnlstPtr journalist=NULL, const Ipopt::SmartPtr< Ipopt::OptionsList > options=NULL)
constructor
bool activeCols_
only include active columns in CGLP
CouenneDisjCuts * clone() const
clone method (necessary for the abstract CglCutGenerator class)
int nrootcuts_
number of cuts generated at the first call
general include file for different compilers
void CoinCopyDisp(register const int *src, register int num, register int *dst, register int displacement)
a CoinCopyN with a += on each element
void CoinInvN(register const double *orig, register int n, register double *inverted)
invert all contents
SmartPtr< const U > ConstPtr(const SmartPtr< U > &smart_ptr)