6 #ifndef CoinSearchTree_H 7 #define CoinSearchTree_H 24 unsigned int bits_[4];
29 void set(
unsigned int bits[4]);
32 std::string
str()
const;
58 true_lower_bound_(tlb),
62 fractionality_(x.fractionality_),
64 true_lower_bound_(x.true_lower_bound_),
65 preferred_(x.preferred_) {}
69 fractionality_ = x.fractionality_;
70 quality_ = x.quality_;
71 true_lower_bound_ = x.true_lower_bound_;
72 preferred_ = x.preferred_;
89 double true_lower_bound_;
98 inline double getTrueLB()
const {
return true_lower_bound_; }
104 inline void setTrueLB(
double tlb) { true_lower_bound_ = tlb; }
120 current_(0), numSiblings_(n), siblings_(new
CoinTreeNode*[n])
125 current_(s.current_),
126 numSiblings_(s.numSiblings_),
135 inline int toProcess()
const {
return numSiblings_ - current_; }
136 inline int size()
const {
return numSiblings_; }
138 for (
int i = 0; i < numSiblings_; ++i) {
140 printf(
"prefs of sibligs: sibling[%i]: %s\n", i, pref.c_str());
153 static inline const char*
name() {
return "CoinSearchTreeComparePreferred"; }
163 }
else if (yPref < xPref) {
169 printf(
"Comparing xpref (%s) and ypref (%s) : %s\n",
170 xpref.str().c_str(), ypref.str().c_str(), retval ?
"T" :
"F");
179 static inline const char*
name() {
return "CoinSearchTreeCompareDepth"; }
198 static inline const char*
name() {
return "CoinSearchTreeCompareBreadth"; }
208 static inline const char*
name() {
return "CoinSearchTreeCompareBest"; }
233 virtual void fixTop() = 0;
237 virtual const char*
compName()
const = 0;
251 candidateList_.front()->currentNode()->getPreferred().print(output);
252 printf(
"top's pref: %s\n", output);
270 const bool incrInserted =
true) {
279 const bool incrInserted =
true) {
295 #ifdef CAN_TRUST_STL_HEAP 297 template <
class Comp>
325 const char*
compName()
const {
return Comp::name(); }
330 template <
class Comp>
351 for (ch = 2; ch <
size; pos = ch, ch *= 2) {
352 if (comp_(candidates[ch+1], candidates[ch]))
354 if (comp_(s, candidates[ch]))
356 candidates[pos] = candidates[ch];
359 if (comp_(candidates[ch], s)) {
360 candidates[pos] = candidates[ch];
373 for (ch = pos/2; ch != 0; pos = ch, ch /= 2) {
374 if (comp_(candidates[ch], s))
376 candidates[pos] = candidates[ch];
391 const char*
compName()
const {
return Comp::name(); }
417 bool recentlyReevaluatedSearchStrategy_;
423 recentlyReevaluatedSearchStrategy_(true)
438 inline size_t size()
const {
return candidates_->
size(); }
441 inline void pop() { candidates_->
pop(); }
443 candidates_->
push(1, &node, incrInserted);
446 candidates_->
push(s, incrInserted);
449 const bool incrInserted =
true) {
450 candidates_->
push(n, nodes, incrInserted);
454 return candidates_->
top();
const char * compName() const
bool operator<(const BitVector128 &b0, const BitVector128 &b1)
void CoinDisjointCopyN(register const T *from, const int size, register T *to)
This helper function copies an array to another location.
int getFractionality() const
CoinTreeNode * top() const
CoinTreeSiblings(const int n, CoinTreeNode **nodes)
double getQuality() const
virtual void fixTop()
After changing data in the top node, fix the heap.
void push(CoinTreeNode *node, const bool incrInserted=true)
bool operator()(const CoinTreeSiblings *x, const CoinTreeSiblings *y) const
void setQuality(double q)
bool operator()(const CoinTreeSiblings *x, const CoinTreeSiblings *y) const
BitVector128 getPreferred() const
CoinSearchTreeBase * getTree() const
CoinTreeNode * top() const
CoinSearchTree(const CoinSearchTreeBase &t)
Function objects to compare search tree nodes.
bool advanceNode()
returns false if cannot be advanced
static const char * name()
void push(int numNodes, CoinTreeNode **nodes, const bool incrInserted=true)
virtual const char * compName() const =0
std::vector< CoinTreeSiblings * > candidateList_
virtual ~CoinSearchTreeManager()
CoinTreeNode & operator=(const CoinTreeNode &x)
friend bool operator<(const BitVector128 &b0, const BitVector128 &b1)
bool operator()(const CoinTreeSiblings *x, const CoinTreeSiblings *y) const
static const char * name()
void push(const int n, CoinTreeNode **nodes, const bool incrInserted=true)
const std::vector< CoinTreeSiblings * > & getCandidates() const
void push(const CoinTreeSiblings &s, const bool incrInserted=true)
void newSolution(double solValue)
CoinTreeSiblings(const CoinTreeSiblings &s)
static const char * name()
CoinTreeNode(int d, int f=-1, double q=-COIN_DBL_MAX, double tlb=-COIN_DBL_MAX, BitVector128 p=BitVector128())
double bestQuality() const
bool operator()(const CoinTreeSiblings *x, const CoinTreeSiblings *y) const
size_t numInserted() const
virtual ~CoinSearchTree()
static const char * name()
void push(const CoinTreeSiblings &sib, const bool incrInserted=true)
void setTree(CoinSearchTreeBase *t)
CoinTreeNode(const CoinTreeNode &x)
A class from which the real tree nodes should be derived from.
void reevaluateSearchStrategy()
virtual void realpush(CoinTreeSiblings *s)
void setPreferred(BitVector128 p)
CoinTreeNode * bestQualityCandidate() const
void setFractionality(int f)
void pop()
pop will advance the next pointer among the siblings on the top and then moves the top to its correct...
CoinTreeNode * currentNode() const
const double COIN_DBL_MAX
void setTrueLB(double tlb)
virtual void realpush(CoinTreeSiblings *s)=0
virtual ~CoinSearchTreeBase()