Jpp 20.0.0-27-g39925593c-D
the software that should make you happy
Loading...
Searching...
No Matches
JGarage.hh
Go to the documentation of this file.
1#ifndef __JASTRONOMY__JGARAGE__
2#define __JASTRONOMY__JGARAGE__
3
4#include <vector>
5#include <numeric>
6#include <algorithm>
7#include <stdexcept>
8
9
10/**
11 * \author mdejong
12 */
13
14namespace JASTRONOMY {}
15namespace JPP { using namespace JASTRONOMY; }
16
17namespace JASTRONOMY {
18
19 /**
20 * Auxiliary container for statistical analysis of a large number of positive (or zero) values.
21 *
22 * The data are organised in groups according to a numerical hash key
23 * so that the computation involving quantiles can be made faster.\n
24 * The numerical hash key is obtained by multiplying the input value with the given factor and then taking the unsigned integer value of the result.\n
25 * The computed quantiles correspond to a distribution with ascending values.
26 */
27 template<class T, const size_t factor = 0>
28 struct JGarage :
29 public std::vector< std::vector<T> >
30 {
32 typedef typename map_type::value_type value_type;
33 typedef typename map_type::const_iterator const_iterator;
34 typedef typename map_type::const_reverse_iterator const_reverse_iterator;
35
36
37 /**
38 * Get total number of values.
39 *
40 * \return number of values
41 */
42 size_t getN() const
43 {
44 using namespace std;
45
46 return accumulate(this->begin(), this->end(), 0, [](const size_t n, const value_type& buffer) { return n + buffer.size(); });
47 }
48
49
50 /**
51 * Get minimal value.
52 *
53 * \return value
54 */
55 T getMin() const
56 {
57 using namespace std;
58
59 for (const_iterator i = this->begin(); i != this->end(); ++i) {
60 if (!i->empty()) {
61 return *min_element(i->begin(), i->end());
62 }
63 }
64
65 throw length_error("No data.");
66 }
67
68
69 /**
70 * Get maximal value.
71 *
72 * \return value
73 */
74 T getMax() const
75 {
76 using namespace std;
77
78 for (const_reverse_iterator i = this->rbegin(); i != this->rend(); ++i) {
79 if (!i->empty()) {
80 return *max_element(i->begin(), i->end());
81 }
82 }
83
84 throw length_error("No data.");
85 }
86
87
88 /**
89 * Get hash key corresponding to given value.
90 *
91 * \param value value
92 * \return key
93 */
94 static size_t getKey(const T value)
95 {
96 if (value > 0.0)
97 return value * factor;
98 else
99 return 0;
100 }
101
102
103 /**
104 * Add value to container.
105 *
106 * \param value value
107 */
108 void put(const T value)
109 {
110 const size_t index = getKey(value);
111
112 if (index >= this->size()) {
113 this->resize(index + 1);
114 }
115
116 (*this)[index].push_back(value);
117 }
118
119
120 /**
121 * Add values to container.
122 *
123 * \param N number of values
124 * \param object function object returning value
125 */
126 template<class JFunction_t>
127 void put(const size_t N, const JFunction_t& object)
128 {
129 for (size_t i = 0; i != N; ++i) {
130 this->put(object());
131 }
132 }
133
134
135 /**
136 * For-each method.
137 *
138 * \param object function object
139 */
140 template<class JFunction_t>
141 inline void operator()(const JFunction_t& object) const
142 {
143 for (const_iterator i = this->begin(); i != this->end(); ++i) {
144 for (const T x : *i) {
145 object(x);
146 }
147 }
148 }
149
150
151 /**
152 * Get minimal value corresponding given maximal probability.
153 *
154 * \param P probability [0,1>
155 * \return value
156 */
157 T getValue(const double P) const
158 {
159 using namespace std;
160
161 if (P < 0.0 || P > 1.0) {
162 throw out_of_range("Invalid probability.");
163 }
164
165 const size_t N = this->getN();
166 const size_t M = N - (P * N);
167
168 if (N == 0) {
169 throw length_error("No data.");
170 }
171
172 if (M == 0) { return getMin(); }
173 if (M == N) { return getMax(); }
174
175 size_t n = N;
176
177 const_reverse_iterator q = this->rbegin();
178
179 while ((n -= q->size()) > M) {
180 ++q;
181 }
182
183 value_type buffer(q->begin(), q->end());
184
185 typename value_type::iterator p = next(buffer.begin(), M - n);
186
187 nth_element(buffer.begin(), p, buffer.end());
188
189 return *p;
190 }
191
192
193 /**
194 * Get maximal probability corresponding given minimal value.
195 *
196 * \param value value
197 * \return probability
198 */
199 double getProbability(const T value) const
200 {
201 using namespace std;
202
203 const size_t N = this->getN();
204 const int M = getKey(value);
205
206 if (N == 0) {
207 throw length_error("No data.");
208 }
209
210 size_t n = 0;
211 int i = this->size() - 1;
212
213 for ( ; i != -1 && i > M; --i) {
214 n += (*this)[i].size();
215 }
216
217 if (i != -1) {
218 for (const T x : (*this)[i]) {
219 if (x >= value) {
220 n += 1;
221 }
222 }
223 }
224
225 return (double) n / (double) N;
226 }
227 };
228}
229
230#endif
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary container for statistical analysis of a large number of positive (or zero) values.
Definition JGarage.hh:30
map_type::const_reverse_iterator const_reverse_iterator
Definition JGarage.hh:34
map_type::const_iterator const_iterator
Definition JGarage.hh:33
void put(const size_t N, const JFunction_t &object)
Add values to container.
Definition JGarage.hh:127
T getMax() const
Get maximal value.
Definition JGarage.hh:74
static size_t getKey(const T value)
Get hash key corresponding to given value.
Definition JGarage.hh:94
double getProbability(const T value) const
Get maximal probability corresponding given minimal value.
Definition JGarage.hh:199
T getValue(const double P) const
Get minimal value corresponding given maximal probability.
Definition JGarage.hh:157
std::vector< std::vector< T > > map_type
Definition JGarage.hh:31
map_type::value_type value_type
Definition JGarage.hh:32
size_t getN() const
Get total number of values.
Definition JGarage.hh:42
void operator()(const JFunction_t &object) const
For-each method.
Definition JGarage.hh:141
T getMin() const
Get minimal value.
Definition JGarage.hh:55
void put(const T value)
Add value to container.
Definition JGarage.hh:108