| /***********************************************************************************[BoundedQueue.h] |
| Glucose -- Copyright (c) 2009, Gilles Audemard, Laurent Simon |
| CRIL - Univ. Artois, France |
| LRI - Univ. Paris Sud, France |
| |
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and |
| associated documentation files (the "Software"), to deal in the Software without restriction, |
| including without limitation the rights to use, copy, modify, merge, publish, distribute, |
| sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
| furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be included in all copies or |
| substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT |
| NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT |
| OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| **************************************************************************************************/ |
| |
| |
| #ifndef BoundedQueue_h |
| #define BoundedQueue_h |
| |
| #include "sat/glucose/Vec.h" |
| |
| ABC_NAMESPACE_CXX_HEADER_START |
| |
| //================================================================================================= |
| |
| namespace Gluco { |
| |
| template <class T> |
| class bqueue { |
| vec<T> elems; |
| int first; |
| int last; |
| uint64_t sumofqueue; |
| int maxsize; |
| int queuesize; // Number of current elements (must be < maxsize !) |
| bool expComputed; |
| double exp,value; |
| public: |
| bqueue(void) : first(0), last(0), sumofqueue(0), maxsize(0), queuesize(0),expComputed(false) { } |
| |
| void initSize(int size) {growTo(size);exp = 2.0/(size+1);} // Init size of bounded size queue |
| |
| void push(T x) { |
| expComputed = false; |
| if (queuesize==maxsize) { |
| assert(last==first); // The queue is full, next value to enter will replace oldest one |
| sumofqueue -= elems[last]; |
| if ((++last) == maxsize) last = 0; |
| } else |
| queuesize++; |
| sumofqueue += x; |
| elems[first] = x; |
| if ((++first) == maxsize) {first = 0;last = 0;} |
| } |
| |
| T peek() { assert(queuesize>0); return elems[last]; } |
| void pop() {sumofqueue-=elems[last]; queuesize--; if ((++last) == maxsize) last = 0;} |
| |
| uint64_t getsum() const {return sumofqueue;} |
| unsigned int getavg() const {return (unsigned int)(sumofqueue/((uint64_t)queuesize));} |
| int maxSize() const {return maxsize;} |
| double getavgDouble() const { |
| double tmp = 0; |
| for(int i=0;i<elems.size();i++) { |
| tmp+=elems[i]; |
| } |
| return tmp/elems.size(); |
| } |
| int isvalid() const {return (queuesize==maxsize);} |
| |
| void growTo(int size) { |
| elems.growTo(size); |
| first=0; maxsize=size; queuesize = 0;last = 0; |
| for(int i=0;i<size;i++) elems[i]=0; |
| } |
| |
| double getAvgExp() { |
| if(expComputed) return value; |
| double a=exp; |
| value = elems[first]; |
| for(int i = first;i<maxsize;i++) { |
| value+=a*((double)elems[i]); |
| a=a*exp; |
| } |
| for(int i = 0;i<last;i++) { |
| value+=a*((double)elems[i]); |
| a=a*exp; |
| } |
| value = value*(1-exp)/(1-a); |
| expComputed = true; |
| return value; |
| |
| |
| } |
| void fastclear() {first = 0; last = 0; queuesize=0; sumofqueue=0;} // to be called after restarts... Discard the queue |
| |
| int size(void) { return queuesize; } |
| |
| void clear(bool dealloc = false) { elems.clear(dealloc); first = 0; maxsize=0; queuesize=0;sumofqueue=0;} |
| |
| |
| }; |
| } |
| //================================================================================================= |
| |
| ABC_NAMESPACE_CXX_HEADER_END |
| |
| #endif |