39 #pragma GCC visibility push(default)
42 template<
class BaseType,
class CoType>
48 Pool<BaseType, CoType>(master),
50 autoRealloc_(autoRealloc)
52 for (
int i = 0; i <
size; i++) {
53 pool_[i] =
new PoolSlot<BaseType, CoType>(master,
this);
54 freeSlots_.pushBack(pool_[i]);
59 template<
class BaseType,
class CoType>
60 StandardPool<BaseType, CoType>::~StandardPool()
64 for (
int i = 0; i < s; i++)
69 template<
class BaseType,
class CoType>
70 std::ostream &
operator<<(std::ostream &out,
const StandardPool<BaseType, CoType> &rhs)
72 const int s = rhs.size();
74 for (
int i = 0; i < s; i++) {
75 if (rhs.pool_[i]->conVar()) {
77 rhs.pool_[i]->conVar()->print(out);
86 template<
class BaseType,
class CoType>
87 PoolSlot<BaseType, CoType> * StandardPool<BaseType, CoType>::insert(
90 PoolSlot<BaseType, CoType>* slot = getSlot();
91 if (slot ==
nullptr) {
94 increase((
int) (
size()*1.1 + 1));
96 if (removeNonActive(
size()/10 + 1) == 0)
104 ++Pool<BaseType, CoType>::number_;
109 template<
class BaseType,
class CoType>
110 void StandardPool<BaseType, CoType>::increase(
int size)
112 int oldSize = pool_.size();
114 if (size < oldSize) {
115 Logger::ifout() <<
"StandardPool::increase(): the pool size cannot be decreased.\n";
121 for(
int i = oldSize; i <
size; i++) {
122 pool_[i] =
new PoolSlot<BaseType, CoType>(Pool<BaseType, CoType>::master_,
this);
123 freeSlots_.pushBack(pool_[i]);
128 template<
class BaseType,
class CoType>
129 int StandardPool<BaseType, CoType>::cleanup()
133 for(
int i = 0; i < Pool<BaseType, CoType>::number(); i++)
135 if(this->softDeleteConVar(pool_[i]) == 0)
140 if (i != Pool<BaseType, CoType>::number())
143 PoolSlot<BaseType, CoType> *CMslot = pool_[i];
144 pool_[i] = pool_[Pool<BaseType, CoType>::number()];
145 pool_[Pool<BaseType, CoType>::number()] = CMslot;
151 Logger::ilout(Logger::Level::Minor) <<
"StandardPool::cleanup(): " << nDeleted <<
" items removed." << std::endl;
156 template<
class BaseType,
class CoType>
157 int StandardPool<BaseType, CoType>::removeNonActive(
int maxRemove)
160 ArrayBuffer<int> elems(
size(),
false);
161 ArrayBuffer<int> keys(
size(),
false);
163 const int s =
size();
165 for (
int i = 0; i < s; i++) {
166 BaseType *cv = pool_[i]->conVar();
167 if (cv && !cv->active() && !cv->locked()) {
169 keys.push(cv->nReferences());
173 AbaBHeap<int, int> candidates(elems, keys);
181 while(nRemoved < maxRemove && !candidates.empty()) {
182 int c = candidates.extractMin();
183 this->hardDeleteConVar(pool_[c]);
187 Logger::ilout(Logger::Level::Minor) << nRemoved <<
" inactive items removed from pool." << std::endl;
193 template<
class BaseType,
class CoType>
194 int StandardPool<BaseType, CoType>::separate(
196 Active<CoType, BaseType> *active,
198 CutBuffer<BaseType, CoType> *cutBuffer,
199 double minAbsViolation,
203 int oldSep = cutBuffer->number();
205 Logger::ilout(Logger::Level::Minor) <<
"StandardPool::separate(): " <<
"size = " <<
size() <<
" n = " << Pool<BaseType, CoType>::number_;
207 PoolSlot<BaseType, CoType> *slot;
208 const int s =
size();
210 for (
int i = 0; i < s; i++) {
212 BaseType *cv = slot->conVar();
213 if (cv && !cv->active() && (cv->global() || cv->valid(sub)))
214 if (cv->violated(active, z, &violation) && fabs(violation) > minAbsViolation) {
216 if (cutBuffer->insert(slot,
true))
219 else if (ranking == 1) {
220 if (cutBuffer->insert(slot,
true, violation))
223 else if (ranking == 2) {
224 if (cutBuffer->insert(slot,
true, fabs(violation)))
227 else if (ranking == 3) {
228 if (cutBuffer->insert(slot,
true, cv->rank()))
234 Logger::ilout(Logger::Level::Minor) <<
" generated = " << cutBuffer->number() - oldSep << std::endl;
235 return cutBuffer->number() - oldSep;
239 #pragma GCC visibility pop