00001 00029 #ifndef ABA_SEPARATOR_INC 00030 #define ABA_SEPARATOR_INC 00031 00032 #include "abacus/separator.h" 00033 #include "abacus/lpsolution.h" 00034 #include "abacus/constraint.h" 00035 #include "abacus/variable.h" 00036 #include "abacus/hash.h" 00037 #include "abacus/master.h" 00038 00039 template <class BaseType, class CoType> 00040 ABA_SEPARATOR<BaseType, CoType>::ABA_SEPARATOR(ABA_LPSOLUTION<CoType, 00041 BaseType> *lpSolution, bool testDuplications, int maxGen 00042 #ifdef ABACUS_PARALLEL 00043 ,bool sendConstraints 00044 #endif 00045 ) 00046 00047 : 00048 master_(lpSolution->master_), 00049 lpSol_(lpSolution), 00050 minAbsViolation_(master_->eps()), 00051 newCons_(master_,maxGen), 00052 hash_(0), 00053 nDuplications_(0), 00054 #ifdef ABACUS_PARALLEL 00055 sendConstraints_(sendConstraints), 00056 #endif 00057 pool_(0) 00058 { 00059 if(testDuplications) 00060 hash_=new ABA_HASH<unsigned, BaseType *>((ABA_GLOBAL*)master_, 3*maxGen); 00061 } 00062 00063 template <class BaseType, class CoType> 00064 ABA_SEPARATOR<BaseType, CoType>::~ABA_SEPARATOR() 00065 { 00066 delete hash_; 00067 } 00068 00069 template <class BaseType, class CoType> 00070 ABA_SEPARATOR_CUTFOUND 00071 ABA_SEPARATOR<BaseType, CoType>::cutFound(BaseType *cv) 00072 { 00073 if(newCons_.full()) { 00074 delete cv; 00075 return Full; 00076 } 00077 00078 if(pool_&&pool_->present(cv)) { 00079 delete cv; 00080 nDuplications_++; 00081 return Duplication; 00082 } 00083 00084 if(hash_&&find(cv)) { 00085 delete cv; 00086 nDuplications_++; 00087 return Duplication; 00088 } 00089 00090 00091 newCons_.push(cv); 00092 if(hash_) 00093 hash_->insert(cv->hashKey(),cv); 00094 return Added; 00095 } 00096 00097 template <class BaseType, class CoType> 00098 ABA_BUFFER<BaseType *> &ABA_SEPARATOR<BaseType, CoType>::cutBuffer() 00099 { 00100 return newCons_; 00101 } 00102 00103 template <class BaseType, class CoType> 00104 int ABA_SEPARATOR<BaseType, CoType>::nGen() const 00105 { 00106 return newCons_.number(); 00107 } 00108 00109 template <class BaseType, class CoType> 00110 int ABA_SEPARATOR<BaseType, CoType>::nDuplications() const 00111 { 00112 return nDuplications_; 00113 } 00114 00115 template <class BaseType, class CoType> 00116 int ABA_SEPARATOR<BaseType, CoType>::nCollisions() const 00117 { 00118 if(!hash_) 00119 return 0; 00120 return hash_->nCollisions(); 00121 } 00122 00123 template <class BaseType, class CoType> 00124 int ABA_SEPARATOR<BaseType, CoType>::maxGen() const 00125 { 00126 return newCons_.size(); 00127 } 00128 00129 virtual void separate() 00130 00131 virtual bool terminateSeparation() 00132 00133 template <class BaseType, class CoType> 00134 bool ABA_SEPARATOR<BaseType, CoType>::find(BaseType *cv) 00135 { 00136 int key = cv->hashKey(); 00137 00138 BaseType **cand = hash_->initializeIteration(key); 00139 00140 while(cand) { 00141 if (cv->equal(*cand)) return true; 00142 cand = hash_->next(key); 00143 } 00144 return false; 00145 } 00146 00147 template <class BaseType, class CoType> 00148 double ABA_SEPARATOR<BaseType, CoType>::minAbsViolation() const 00149 { 00150 return minAbsViolation_; 00151 } 00152 00153 void minAbsViolation(double minAbsVio) 00154 00155 ABA_LPSOLUTION<CoType, BaseType> *lpSolution() 00156 00157 void watchNonDuplPool(ABA_NONDUPLPOOL<BaseType, CoType> *pool) 00158 00159 #endif // ABA_SEPERATOR_INC 00160 00161 00162