Cbc 2.10.10
CbcSimpleInteger.hpp
Go to the documentation of this file.
1// $Id$
2// Copyright (C) 2002, International Business Machines
3// Corporation and others. All Rights Reserved.
4// This code is licensed under the terms of the Eclipse Public License (EPL).
5
6// Edwin 11/9/2009-- carved out of CbcBranchActual
7
8#ifndef CbcSimpleInteger_H
9#define CbcSimpleInteger_H
10
12
24
25public:
28
37 int way, double value);
38
47 double lowerValue, double upperValue);
48
51
54
56 virtual CbcBranchingObject *clone() const;
57
60
62 void fillPart(int variable, int way, double value);
68 virtual double branch();
71 virtual void fix(OsiSolverInterface *solver,
72 double *lower, double *upper,
73 int branchState) const;
76 virtual bool tighten(OsiSolverInterface *);
77
78#ifdef JJF_ZERO
79 // No need to override. Default works fine.
83 virtual void previousBranch();
84#endif
85
89 virtual void print();
90
92 inline const double *downBounds() const
93 {
94 return down_;
95 }
97 inline const double *upBounds() const
98 {
99 return up_;
100 }
102 inline void setDownBounds(const double bounds[2])
103 {
104 memcpy(down_, bounds, 2 * sizeof(double));
105 }
107 inline void setUpBounds(const double bounds[2])
108 {
109 memcpy(up_, bounds, 2 * sizeof(double));
110 }
111#ifdef FUNNY_BRANCHING
114 inline const int *variables() const
115 {
116 return variables_;
117 }
118 // New bound
119 inline const double *newBounds() const
120 {
121 return newBounds_;
122 }
124 inline int numberExtraChangedBounds() const
125 {
126 return numberExtraChangedBounds_;
127 }
129 int applyExtraBounds(int iColumn, double lower, double upper, int way);
131 void deactivate();
133 inline bool active() const
134 {
135 return (down_[1] != -COIN_DBL_MAX);
136 }
137#endif
138
140 virtual CbcBranchObjType type() const
141 {
143 }
144
153 virtual CbcRangeCompare compareBranchingObject(const CbcBranchingObject *brObj, const bool replaceIfOverlap = false);
154
155protected:
157 double down_[2];
159 double up_[2];
160#ifdef FUNNY_BRANCHING
163 int *variables_;
164 // New bound
165 double *newBounds_;
167 int numberExtraChangedBounds_;
168#endif
169};
170
172
174
175public:
176 // Default Constructor
178
179 // Useful constructor - passed model and index
180 CbcSimpleInteger(CbcModel *model, int iColumn, double breakEven = 0.5);
181
182 // Useful constructor - passed model and Osi object
183 CbcSimpleInteger(CbcModel *model, const OsiSimpleInteger *object);
184
185 // Copy constructor
187
189 virtual CbcObject *clone() const;
190
191 // Assignment operator
193
194 // Destructor
197 OsiSimpleInteger *osiObject() const;
199 virtual double infeasibility(const OsiBranchingInformation *info,
200 int &preferredWay) const;
201
208 virtual double feasibleRegion(OsiSolverInterface *solver, const OsiBranchingInformation *info) const;
209
215 virtual CbcBranchingObject *createCbcBranch(OsiSolverInterface *solver, const OsiBranchingInformation *info, int way);
217 /*virtual*/ void fillCreateBranch(CbcIntegerBranchingObject *branching, const OsiBranchingInformation *info, int way);
218
224 virtual OsiSolverBranch *solverBranch(OsiSolverInterface *solver, const OsiBranchingInformation *info) const;
225
232 virtual void feasibleRegion();
233
238 virtual int columnNumber() const;
240 inline void setColumnNumber(int value)
241 {
242 columnNumber_ = value;
243 }
244
249 virtual void resetBounds(const OsiSolverInterface *solver);
250
253 virtual void resetSequenceEtc(int numberColumns, const int *originalColumns);
255 inline double originalLowerBound() const
256 {
257 return originalLower_;
258 }
259 inline void setOriginalLowerBound(double value)
260 {
261 originalLower_ = value;
262 }
263 inline double originalUpperBound() const
264 {
265 return originalUpper_;
266 }
267 inline void setOriginalUpperBound(double value)
268 {
269 originalUpper_ = value;
270 }
272 inline double breakEven() const
273 {
274 return breakEven_;
275 }
277 inline void setBreakEven(double value)
278 {
279 breakEven_ = value;
280 }
281
282protected:
284
295};
296#endif
297
298/* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
299*/
CbcRangeCompare
CbcBranchObjType
@ SimpleIntegerBranchObj
Abstract branching object base class Now just difference with OsiBranchingObject.
virtual void previousBranch()
Reset every information so that the branching object appears to point to the previous child.
virtual double branch()=0
Execute the actions required to branch, as specified by the current state of the branching object,...
CbcModel * model() const
Return model.
int variable() const
Index identifying the associated CbcObject within its class.
int way() const
Get the state of the branching object.
virtual void print() const
Print something about branch - only if log level high.
Simple branching object for an integer variable.
virtual CbcBranchingObject * clone() const
Clone.
virtual bool tighten(OsiSolverInterface *)
Change (tighten) bounds in object to reflect bounds in solver.
CbcIntegerBranchingObject(const CbcIntegerBranchingObject &)
Copy constructor.
double up_[2]
Lower [0] and upper [1] bounds for the up arm (way_ = 1)
virtual double branch()
Sets the bounds for the variable according to the current arm of the branch and advances the object s...
const double * upBounds() const
Lower and upper bounds for up branch.
CbcIntegerBranchingObject & operator=(const CbcIntegerBranchingObject &rhs)
Assignment operator.
CbcIntegerBranchingObject(CbcModel *model, int variable, int way, double lowerValue, double upperValue)
Create a degenerate branch object.
void setDownBounds(const double bounds[2])
Set lower and upper bounds for down branch.
virtual void print()
Print something about branch - only if log level high.
virtual ~CbcIntegerBranchingObject()
Destructor.
CbcIntegerBranchingObject(CbcModel *model, int variable, int way, double value)
Create a standard floor/ceiling branch object.
CbcIntegerBranchingObject()
Default constructor.
virtual void fix(OsiSolverInterface *solver, double *lower, double *upper, int branchState) const
Update bounds in solver as in 'branch' and update given bounds.
const double * downBounds() const
Lower and upper bounds for down branch.
double down_[2]
Lower [0] and upper [1] bounds for the down arm (way_ = -1)
void setUpBounds(const double bounds[2])
Set lower and upper bounds for up branch.
virtual CbcRangeCompare compareBranchingObject(const CbcBranchingObject *brObj, const bool replaceIfOverlap=false)
Compare the this with brObj.
void fillPart(int variable, int way, double value)
Does part of constructor.
virtual CbcBranchObjType type() const
Return the type (an integer identifier) of this.
Simple Branch and bound class.
Definition: CbcModel.hpp:100
virtual void feasibleRegion()=0
For the variable(s) referenced by the object, look at the current solution and set bounds to match th...
CbcModel * model() const
Return model.
Definition: CbcObject.hpp:252
int preferredWay() const
If -1 down always chosen first, +1 up always, 0 normal.
Definition: CbcObject.hpp:258
virtual OsiSolverBranch * solverBranch() const
Create an OsiSolverBranch object.
Define a single integer class.
virtual CbcObject * clone() const
Clone.
virtual void resetSequenceEtc(int numberColumns, const int *originalColumns)
Change column numbers after preprocessing.
void setColumnNumber(int value)
Set column number.
double originalUpper_
Original upper bound.
void setBreakEven(double value)
Set breakeven e.g 0.7 -> >= 0.7 go up first.
double breakEven_
Breakeven i.e. >= this preferred is up.
virtual int columnNumber() const
Column number if single column object -1 otherwise, so returns >= 0 Used by heuristics.
CbcSimpleInteger(CbcModel *model, int iColumn, double breakEven=0.5)
virtual void feasibleRegion()
Set bounds to fix the variable at the current (integer) value.
double originalLowerBound() const
Original bounds.
virtual void resetBounds(const OsiSolverInterface *solver)
Reset variable bounds to their original values.
OsiSimpleInteger * osiObject() const
Construct an OsiSimpleInteger object.
CbcSimpleInteger(const CbcSimpleInteger &)
void setOriginalUpperBound(double value)
int columnNumber_
Column number in model.
void setOriginalLowerBound(double value)
CbcSimpleInteger(CbcModel *model, const OsiSimpleInteger *object)
virtual double feasibleRegion(OsiSolverInterface *solver, const OsiBranchingInformation *info) const
Set bounds to fix the variable at the current (integer) value.
void fillCreateBranch(CbcIntegerBranchingObject *branching, const OsiBranchingInformation *info, int way)
Fills in a created branching object.
virtual CbcBranchingObject * createCbcBranch(OsiSolverInterface *solver, const OsiBranchingInformation *info, int way)
Create a branching object and indicate which way to branch first.
virtual OsiSolverBranch * solverBranch(OsiSolverInterface *solver, const OsiBranchingInformation *info) const
Create an OsiSolverBranch object.
double originalUpperBound() const
double breakEven() const
Breakeven e.g 0.7 -> >= 0.7 go up first.
virtual ~CbcSimpleInteger()
virtual double infeasibility(const OsiBranchingInformation *info, int &preferredWay) const
Infeasibility - large is 0.5.
CbcSimpleInteger & operator=(const CbcSimpleInteger &rhs)
int preferredWay_
If -1 down always chosen first, +1 up always, 0 normal.