Fleet  0.0.9
Inference in the LOT
FiniteHistory.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <mutex>
4 #include <pthread.h>
5 #include "OrderedLock.h"
6 
7 
16 template<typename T>
18  // store a finite set of previous samples of T
19  // allowing us to compute prior means, etc
20 public:
21  std::vector<T> history;
22  std::atomic<size_t> history_size;
23  std::atomic<size_t> history_index;
24  std::atomic<unsigned long> N;
25 
27 
28  FiniteHistory(size_t n) : history_size(n), history_index(0), N(0) { }
29 
30  // default size
31  FiniteHistory() : history_size(100), history_index(0), N(0) { }
32 
34  history = fh.history;
35  history_size = (size_t)fh.history_size;
36  history_index = (size_t)fh.history_index;
37  N = (unsigned long)fh.N;
38  }
39 
41  history = fh.history;
42  history_size = (size_t)fh.history_size;
43  history_index = (size_t)fh.history_index;
44  N = (unsigned long)fh.N;
45  }
46 
47  void operator=(const FiniteHistory &fh) {
48  history = fh.history;
49  history_size = (size_t)fh.history_size;
50  history_index = (size_t)fh.history_index;
51  N = (unsigned long)fh.N;
52  }
53 
54  void operator=(FiniteHistory&& fh) {
55  history = std::move(fh.history);
56  history_size = (size_t)fh.history_size;
57  history_index = (size_t)fh.history_index;
58  N = (unsigned long)fh.N;
59  }
60 
61  void reset() {
62  std::lock_guard guard(mutex);
63  history.clear();
64  history_index = 0;
65  N = 0;
66  }
67 
72  void add(T x) {
73  std::lock_guard guard(mutex);
74  ++N;
75  if(history.size() < history_size){
76  history.push_back(x);
77  history_index++;
78  }
79  else {
80  history[history_index++ % history_size] = x;
81  }
82  }
83 
88  void operator<<(T x) { add(x); }
89 
94  double mean() {
95  std::lock_guard guard(mutex);
96  double sm=0;
97  for(const auto& a: history)
98  sm += a;
99 
100  return double(sm) / history.size();
101  }
102 
103 };
104 
Definition: OrderedLock.h:16
OrderedLock mutex
Definition: FiniteHistory.h:26
FiniteHistory(FiniteHistory &&fh)
Definition: FiniteHistory.h:40
void operator=(FiniteHistory &&fh)
Definition: FiniteHistory.h:54
void operator=(const FiniteHistory &fh)
Definition: FiniteHistory.h:47
std::vector< T > history
Definition: FiniteHistory.h:21
FiniteHistory(size_t n)
Definition: FiniteHistory.h:28
FiniteHistory(const FiniteHistory &fh)
Definition: FiniteHistory.h:33
void operator<<(T x)
Convenient adding.
Definition: FiniteHistory.h:88
A FIFO mutex (from stackoverflow) https://stackoverflow.com/questions/14792016/creating-a-lock-that-p...
Definition: FiniteHistory.h:17
void reset()
Definition: FiniteHistory.h:61
void add(T x)
Add x to this history.
Definition: FiniteHistory.h:72
std::atomic< size_t > history_index
Definition: FiniteHistory.h:23
FiniteHistory()
Definition: FiniteHistory.h:31
std::atomic< size_t > history_size
Definition: FiniteHistory.h:22
std::atomic< unsigned long > N
Definition: FiniteHistory.h:24
double mean()
Compute the average.
Definition: FiniteHistory.h:94