26 using Hypothesis_t = T;
30 const static char SerializationDelimiter =
'\n';
33 const static size_t MAX_N = SIZE_MAX;
37 std::atomic<size_t>
N;
46 template <
typename X,
typename =
double>
49 struct HasPosterior <
X, decltype((void)
X::posterior, 0)> : std::true_type { };
83 assert((
empty() or n >= N) &&
"*** Settting TopN size to something smaller probably won't do what you want");
91 if(N == 0) {
CERR "# *** Warning since N=0, TopN will not print the best even though you set_print_best(true)!" ENDL; }
109 return s.size() == 0;
129 return s.find(x) != s.end();
137 [[maybe_unused]]
bool add(
const T& x) {
143 if(N == 0)
return false;
146 if constexpr (HasPosterior<T>::value) {
147 if(std::isnan(x.posterior) or x.posterior == -
infinity)
151 std::lock_guard guard(lock);
155 if(s.size() < N or (
empty() or
worst() < x )) {
158 if(print_best and (
empty() or
best() < x )) {
166 while(s.size() >
N) {
197 void add(
const std::set<T>& x) {
207 void operator<<(const TopN<T>& x) {
216 s.erase( std::next(s.rbegin()).base() );
225 assert( (!s.empty()) &&
"You tried to get the max from a TopN that was empty");
234 assert( (!s.empty()) &&
"You tried to get the min from a TopN that was empty");
238 double Z(
double temp=1.0) {
245 std::lock_guard guard(lock);
246 for(
const auto& x : s)
266 std::vector<T>
sorted(
bool increasing=
true)
const {
268 std::vector<T> v(s.size());
270 std::copy(s.begin(), s.end(), v.begin());
272 std::sort(v.begin(), v.end(), std::less<T>());
288 std::lock_guard guard(lock);
289 s.erase(s.begin(), s.end());
292 template<
typename data_t>
303 h.compute_posterior(data);
310 std::string out =
str(N);
312 out += SerializationDelimiter + h.serialize();
320 auto q =
split(s, SerializationDelimiter);
321 out.
set_size(string_to<size_t>(q.front())); q.pop_front();
324 out << T::deserialize(x);
334 template<
typename HYP>
336 for(
auto h: t.values()) {
Definition: OrderedLock.h:16
bool print_best
Definition: TopN.h:36
std::vector< T > sorted(bool increasing=true) const
Sorted values.
Definition: TopN.h:266
void operator=(TopN< T > &&x)
Definition: TopN.h:72
const T & best() const
Definition: TopN.h:219
Definition: Serializable.h:4
std::string reverse(std::string x)
Definition: Strings.h:185
size_t size() const
Definition: TopN.h:95
std::deque< std::string > split(const std::string &s, const char delimiter)
Split is returns a deque of s split up at the character delimiter. It handles these special cases: sp...
Definition: str.h:50
void set_size(size_t n)
Definition: TopN.h:78
static TopN< T > deserialize(const std::string &s)
Definition: TopN.h:317
bool operator<<(const T &x)
Definition: TopN.h:178
const std::set< T > & values() const
Definition: TopN.h:112
unsigned long ntop
Definition: FleetArgs.h:15
const T & worst() const
Definition: TopN.h:228
TopN compute_posterior(data_t &data)
Definition: TopN.h:293
std::string str(BindingTree *t)
Definition: BindingTree.h:195
void pop()
Pops off the top – you usually won't want to do this and it's not efficient.
Definition: TopN.h:214
void clear()
Definition: TopN.h:283
TopN(TopN< T > &&x)
Definition: TopN.h:60
void add(const TopN< T > &x)
Definition: TopN.h:187
constexpr double infinity
Definition: Numerics.h:20
A FIFO mutex (from stackoverflow) https://stackoverflow.com/questions/14792016/creating-a-lock-that-p...
T logplusexp(const T a, const T b)
Definition: Numerics.h:131
void print(std::string prefix="")
Definition: TopN.h:251
#define CERR
Definition: IO.h:23
void set_print_best(bool b)
Definition: TopN.h:86
static const size_t MAX_N
Definition: TopN.h:33
std::set< T > s
Definition: TopN.h:35
#define ENDL
Definition: IO.h:21
bool add(const T &x)
Adds x to the TopN. This will return true if we added (false otherwise)
Definition: TopN.h:137
bool empty() const
Definition: TopN.h:103
bool contains(const T &x) const
Does this contain x?
Definition: TopN.h:127
bool top_print_best
Definition: FleetArgs.h:37
TopN(size_t n=FleetArgs::ntop)
Definition: TopN.h:52
double Z(double temp=1.0)
Definition: TopN.h:238
virtual std::string serialize() const override
Definition: TopN.h:309
void operator=(const TopN< T > &x)
Definition: TopN.h:66
void add(const std::set< T > &x)
Definition: TopN.h:197
std::atomic< size_t > N
Definition: TopN.h:37
TopN(const TopN< T > &x)
Definition: TopN.h:54