limp-cbc-0.3.2.0: cbits/coin/ClpNode.hpp
/* $Id: ClpNode.hpp 1910 2013-01-27 02:00:13Z stefan $ */
// Copyright (C) 2008, International Business Machines
// Corporation and others. All Rights Reserved.
// This code is licensed under the terms of the Eclipse Public License (EPL).
#ifndef ClpNode_H
#define ClpNode_H
#include "CoinPragma.hpp"
// This implements all stuff for Clp fathom
/** This contains what is in a Clp "node"
*/
class ClpFactorization;
class ClpDualRowSteepest;
class ClpNodeStuff;
class ClpNode {
public:
/**@name Useful methods */
//@{
/** Applies node to model
0 - just tree bounds
1 - tree bounds and basis etc
2 - saved bounds and basis etc
*/
void applyNode(ClpSimplex * model, int doBoundsEtc );
/// Choose a new variable
void chooseVariable(ClpSimplex * model, ClpNodeStuff * info);
/// Fix on reduced costs
int fixOnReducedCosts(ClpSimplex * model);
/// Create odd arrays
void createArrays(ClpSimplex * model);
/// Clean up as crunch is different model
void cleanUpForCrunch();
//@}
/**@name Gets and sets */
//@{
/// Objective value
inline double objectiveValue() const {
return objectiveValue_;
}
/// Set objective value
inline void setObjectiveValue(double value) {
objectiveValue_ = value;
}
/// Primal solution
inline const double * primalSolution() const {
return primalSolution_;
}
/// Dual solution
inline const double * dualSolution() const {
return dualSolution_;
}
/// Initial value of integer variable
inline double branchingValue() const {
return branchingValue_;
}
/// Sum infeasibilities
inline double sumInfeasibilities() const {
return sumInfeasibilities_;
}
/// Number infeasibilities
inline int numberInfeasibilities() const {
return numberInfeasibilities_;
}
/// Relative depth
inline int depth() const {
return depth_;
}
/// Estimated solution value
inline double estimatedSolution() const {
return estimatedSolution_;
}
/** Way for integer variable -1 down , +1 up */
int way() const;
/// Return true if branch exhausted
bool fathomed() const;
/// Change state of variable i.e. go other way
void changeState();
/// Sequence number of integer variable (-1 if none)
inline int sequence() const {
return sequence_;
}
/// If odd arrays exist
inline bool oddArraysExist() const {
return lower_ != NULL;
}
/// Status array
inline const unsigned char * statusArray() const {
return status_;
}
//@}
/**@name Constructors, destructor */
//@{
/** Default constructor. */
ClpNode();
/// Constructor from model
ClpNode (ClpSimplex * model, const ClpNodeStuff * stuff, int depth);
/// Does work of constructor (partly so gdb will work)
void gutsOfConstructor(ClpSimplex * model, const ClpNodeStuff * stuff,
int arraysExist, int depth);
/** Destructor */
virtual ~ClpNode();
//@}
/**@name Copy methods (at present illegal - will abort) */
//@{
/** The copy constructor. */
ClpNode(const ClpNode&);
/// Operator =
ClpNode& operator=(const ClpNode&);
//@}
protected:
// For state of branch
typedef struct {
unsigned int firstBranch: 1; // nonzero if first branch on variable is up
unsigned int branch: 2; // 0 means do first branch next, 1 second, 2 finished
unsigned int spare: 29;
} branchState;
/**@name Data */
//@{
/// Initial value of integer variable
double branchingValue_;
/// Value of objective
double objectiveValue_;
/// Sum of infeasibilities
double sumInfeasibilities_;
/// Estimated solution value
double estimatedSolution_;
/// Factorization
ClpFactorization * factorization_;
/// Steepest edge weights
ClpDualRowSteepest * weights_;
/// Status vector
unsigned char * status_;
/// Primal solution
double * primalSolution_;
/// Dual solution
double * dualSolution_;
/// Integer lower bounds (only used in fathomMany)
int * lower_;
/// Integer upper bounds (only used in fathomMany)
int * upper_;
/// Pivot variables for factorization
int * pivotVariables_;
/// Variables fixed by reduced costs (at end of branch) 0x10000000 added if fixed to UB
int * fixed_;
/// State of branch
branchState branchState_;
/// Sequence number of integer variable (-1 if none)
int sequence_;
/// Number of infeasibilities
int numberInfeasibilities_;
/// Relative depth
int depth_;
/// Number fixed by reduced cost
int numberFixed_;
/// Flags - 1 duals scaled
int flags_;
/// Maximum number fixed by reduced cost
int maximumFixed_;
/// Maximum rows so far
int maximumRows_;
/// Maximum columns so far
int maximumColumns_;
/// Maximum Integers so far
int maximumIntegers_;
//@}
};
class ClpNodeStuff {
public:
/**@name Constructors, destructor */
//@{
/** Default constructor. */
ClpNodeStuff();
/** Destructor */
virtual ~ClpNodeStuff();
//@}
/**@name Copy methods (only copies ints etc, nulls arrays) */
//@{
/** The copy constructor. */
ClpNodeStuff(const ClpNodeStuff&);
/// Operator =
ClpNodeStuff& operator=(const ClpNodeStuff&);
/// Zaps stuff 1 - arrays, 2 ints, 3 both
void zap(int type);
//@}
/**@name Fill methods */
//@{
/** Fill with pseudocosts */
void fillPseudoCosts(const double * down, const double * up,
const int * priority,
const int * numberDown, const int * numberUp,
const int * numberDownInfeasible, const int * numberUpInfeasible,
int number);
/// Update pseudo costs
void update(int way, int sequence, double change, bool feasible);
/// Return maximum number of nodes
int maximumNodes() const;
/// Return maximum space for nodes
int maximumSpace() const;
//@}
public:
/**@name Data */
//@{
/// Integer tolerance
double integerTolerance_;
/// Integer increment
double integerIncrement_;
/// Small change in branch
double smallChange_;
/// Down pseudo costs
double * downPseudo_;
/// Up pseudo costs
double * upPseudo_;
/// Priority
int * priority_;
/// Number of times down
int * numberDown_;
/// Number of times up
int * numberUp_;
/// Number of times down infeasible
int * numberDownInfeasible_;
/// Number of times up infeasible
int * numberUpInfeasible_;
/// Copy of costs (local)
double * saveCosts_;
/// Array of ClpNodes
ClpNode ** nodeInfo_;
/// Large model if crunched
ClpSimplex * large_;
/// Which rows in large model
int * whichRow_;
/// Which columns in large model
int * whichColumn_;
#ifndef NO_FATHOM_PRINT
/// Cbc's message handler
CoinMessageHandler * handler_;
#endif
/// Number bounds in large model
int nBound_;
/// Save of specialOptions_ (local)
int saveOptions_;
/** Options to pass to solver
1 - create external reduced costs for columns
2 - create external reduced costs for rows
4 - create external row activity (columns always done)
Above only done if feasible
32 - just create up to nDepth_+1 nodes
65536 - set if activated
*/
int solverOptions_;
/// Maximum number of nodes to do
int maximumNodes_;
/// Number before trust from CbcModel
int numberBeforeTrust_;
/// State of search from CbcModel
int stateOfSearch_;
/// Number deep
int nDepth_;
/// Number nodes returned (-1 if fathom aborted)
int nNodes_;
/// Number of nodes explored
int numberNodesExplored_;
/// Number of iterations
int numberIterations_;
/// Type of presolve - 0 none, 1 crunch
int presolveType_;
#ifndef NO_FATHOM_PRINT
/// Depth passed in
int startingDepth_;
/// Node at which called
int nodeCalled_;
#endif
//@}
};
class ClpHashValue {
public:
/**@name Useful methods */
//@{
/// Return index or -1 if not found
int index(double value) const;
/// Add value to list and return index
int addValue(double value) ;
/// Number of different entries
inline int numberEntries() const {
return numberHash_;
}
//@}
/**@name Constructors, destructor */
//@{
/** Default constructor. */
ClpHashValue();
/** Useful constructor. */
ClpHashValue(ClpSimplex * model);
/** Destructor */
virtual ~ClpHashValue();
//@}
/**@name Copy method */
//@{
/** The copy constructor. */
ClpHashValue(const ClpHashValue&);
/// =
ClpHashValue& operator=(const ClpHashValue&);
//@}
private:
/**@name private stuff */
//@{
/** returns hash */
int hash(double value) const;
/// Resizes
void resize(bool increaseMax);
//@}
protected:
/**@name Data members
The data members are protected to allow access for derived classes. */
//@{
/// Data
// for hashing
typedef struct {
double value;
int index, next;
} CoinHashLink;
/// Hash table
mutable CoinHashLink *hash_;
/// Number of entries in hash table
int numberHash_;
/// Maximum number of entries in hash table i.e. size
int maxHash_;
/// Last used space
int lastUsed_;
//@}
};
#endif