Cbc 2.10.13
Loading...
Searching...
No Matches
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
22
24
25public:
28
37 int way, double value);
38
45
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 }
96
97 inline const double *upBounds() const
98 {
99 return up_;
100 }
101
102 inline void setDownBounds(const double bounds[2])
103 {
104 memcpy(down_, bounds, 2 * sizeof(double));
105 }
106
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
171/// Define a single integer class
172
173class CbcSimpleInteger : public CbcObject {
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
202 using CbcObject::feasibleRegion;
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
219 using CbcObject::solverBranch;
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 }
271
271 /// Breakeven e.g 0.7 -> >= 0.7 go up first
272 inline double breakEven() const
273 {
274 return breakEven_;
275 }
277 inline void setBreakEven(double value)
278 {
279 breakEven_ = value;
280 }
281
282protected:
284
286 double originalLower_;
290 double breakEven_;
295};
296#endif
297
298/* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
299*/
CbcRangeCompare
@ SimpleIntegerBranchObj
int way() const
bool active() const
Returns true if active.
Definition CbcNode.hpp:322
CbcModel * model() const
Return model.
int preferredWay() const
If -1 down always chosen first, +1 up always, 0 normal.
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.
CbcBranchingObject & operator=(const CbcBranchingObject &rhs)
Assignment operator.
virtual CbcBranchingObject * clone() const =0
Clone.
CbcBranchingObject()
Default Constructor.
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.
*Lower and upper bounds for up branch const double * upBounds() const
virtual bool tighten(OsiSolverInterface *)
Change (tighten) bounds in object to reflect bounds in solver.
*Set lower and upper bounds for down branch void setDownBounds(const double bounds[2])
virtual double branch()
Create a degenerate branch object.
virtual void print()
Print something about branch - only if log level high.
CbcIntegerBranchingObject(CbcModel *model, int variable, int way, double value)
Create a standard floor/ceiling branch object.
*Lower and upper bounds for down branch const double * downBounds() const
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.
*Set lower and upper bounds for up branch void setUpBounds(const double bounds[2])
virtual CbcRangeCompare compareBranchingObject(const CbcBranchingObject *brObj, const bool replaceIfOverlap=false)
Compare the this with brObj.
virtual CbcBranchObjType type() const
Return the type (an integer identifier) of this.
Simple Branch and bound class.
Definition CbcModel.hpp:100
virtual void resetSequenceEtc(int numberColumns, const int *originalColumns)
Change column numbers after preprocessing.
*Infeasibility large virtual is double infeasibility(const OsiBranchingInformation *info, int &preferredWay) const
*If down always chosen up normal int preferredWay_
*Original bounds double originalLowerBound() const
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.
*Fills in a created branching object void fillCreateBranch(CbcIntegerBranchingObject *branching, const OsiBranchingInformation *info, int way)
virtual void resetBounds(const OsiSolverInterface *solver)
Reset variable bounds to their original values.
*Column number in model int columnNumber_
CbcSimpleInteger(const CbcSimpleInteger &)
void setOriginalUpperBound(double value)
void setOriginalLowerBound(double value)
*virtual Clone CbcObject * clone() const
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.
*Construct an OsiSimpleInteger object OsiSimpleInteger * osiObject() const
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
virtual ~CbcSimpleInteger()
CbcSimpleInteger & operator=(const CbcSimpleInteger &rhs)
*Set column number void setColumnNumber(int value)
*Original upper bound double originalUpper_