nonduplpool.inc

Go to the documentation of this file.
00001 
00029 #ifndef ABA_NONDUPLPOOL_INC
00030 #define ABA_NONDUPLPOOL_INC
00031 
00032 #include "abacus/nonduplpool.h"
00033 #include "abacus/cutbuffer.h"
00034 #include "abacus/master.h"
00035 #include "abacus/poolslot.h"
00036 #include "abacus/constraint.h"
00037 #include "abacus/variable.h"
00038 #include "abacus/sub.h"
00039 #include "abacus/bheap.h"
00040 
00041 #include <iostream>
00042 using namespace std;
00043 
00044   template<class BaseType, class CoType>
00045   inline ABA_NONDUPLPOOL<BaseType, CoType>::ABA_NONDUPLPOOL(ABA_MASTER *master, 
00046                                                      int size, 
00047                                                      bool autoRealloc)
00048   :  
00049     ABA_STANDARDPOOL<BaseType, CoType>(master, size, autoRealloc),  
00050     hash_(ABA_POOL<BaseType, CoType>::master_, size),  
00051     nDuplications_(0)
00052   { }
00053 
00054   template<class BaseType, class CoType>
00055   ABA_NONDUPLPOOL<BaseType, CoType>::~ABA_NONDUPLPOOL()
00056   { 
00057 #ifdef ABACUSSAFE
00058       ABA_POOL<BaseType, CoType>::master_->out() << "Number of duplicated constraints: " <<
00059           nDuplications_ << endl;
00060 #endif
00061   }
00062 
00063   template<class BaseType, class CoType>
00064   ABA_POOLSLOT<BaseType, CoType> * ABA_NONDUPLPOOL<BaseType, CoType>::insert(
00065                                                                BaseType *cv)
00066   {
00067     
00068     ABA_POOLSLOT<BaseType, CoType>* slot;
00069 
00070     slot = present(cv);
00071     if (slot == 0) {
00072       slot = ABA_STANDARDPOOL<BaseType, CoType>::insert(cv);
00073       if (slot) 
00074         hash_.insert(cv->hashKey(), slot);
00075     }
00076     else {
00077       delete cv;
00078       nDuplications_++;
00079     }
00080     return slot;
00081   }
00082 
00083   template<class BaseType, class CoType>
00084   ABA_POOLSLOT<BaseType, CoType> *ABA_NONDUPLPOOL<BaseType, CoType>::present(
00085                                                                   BaseType *cv)
00086   {
00087     int key = cv->hashKey();
00088 
00089     ABA_POOLSLOT<BaseType, CoType> **cand = hash_.initializeIteration(key);
00090     while(cand) {
00091       if (cv->equal((*cand)->conVar())) {
00092         return *cand;
00093       }cand = hash_.next(key);
00094     }
00095     return 0;
00096   }
00097 
00098   template<class BaseType, class CoType>
00099   void ABA_NONDUPLPOOL<BaseType, CoType>::increase(int size)
00100   {
00101     ABA_STANDARDPOOL<BaseType, CoType>::increase(size);
00102     hash_.resize(size);
00103   }
00104 
00105   template<class BaseType, class CoType>
00106   int ABA_NONDUPLPOOL<BaseType, CoType>::softDeleteConVar(ABA_POOLSLOT<BaseType, CoType> *slot)
00107   {
00108     int key = slot->conVar()->hashKey();
00109 
00110     if (ABA_POOL<BaseType, CoType>::softDeleteConVar(slot) == 0) {
00111       if (hash_.remove(key, slot)) {
00112         ABA_POOL<BaseType, CoType>::master_->err() << "ABA_NONDUPLPOOL::softDeleteCon(): slot not ";
00113         ABA_POOL<BaseType, CoType>::master_->err() << "found in hash table." << endl;
00114         exit(ABA_ABACUSROOT::Fatal);
00115       }
00116       return 0;
00117     }
00118     return 1;
00119   }
00120 
00121   template<class BaseType, class CoType>
00122   void ABA_NONDUPLPOOL<BaseType, CoType>::hardDeleteConVar(
00123                                               ABA_POOLSLOT<BaseType, CoType> *slot)
00124   {
00125     if (hash_.remove(slot->conVar()->hashKey(), slot)) {
00126       ABA_POOL<BaseType, CoType>::master_->err() << "ABA_NONDUPLPOOL::hardDeleteConVar(): constraint ";
00127       ABA_POOL<BaseType, CoType>::master_->err() << "not found in hash table." << endl;
00128       exit(ABA_ABACUSROOT::Fatal);
00129     }
00130     ABA_POOL<BaseType, CoType>::hardDeleteConVar(slot);
00131   }
00132 
00133   template<class BaseType, class CoType>
00134   void ABA_NONDUPLPOOL<BaseType, CoType>::statistics(int &nDuplications, 
00135                                                      int &nCollisions) const
00136   {
00137     nDuplications = nDuplications_;
00138     nCollisions   = hash_.nCollisions();
00139   }
00140     
00141 
00142 #endif   // ABA_NONDUPLPOOL_INC

Generated on Tue Aug 14 18:09:54 2007 for ABACUS by  doxygen 1.5.1