31#ifndef ETL_CORRELATION_INCLUDED
32#define ETL_CORRELATION_INCLUDED
43 namespace private_correlation
48 template <
typename TInput,
typename TCalc>
57 template <
typename TCalc>
66 template <
typename TCalc>
69 typedef double calc_t;
76 namespace private_correlation
78 template<
typename T =
void>
81 static ETL_CONSTANT
bool Sample =
false;
82 static ETL_CONSTANT
bool Population =
true;
99 template <
bool Correlation_Type,
typename TInput,
typename TCalc = TInput>
106 static ETL_CONSTANT
int Adjustment = (Correlation_Type == correlation_type::Population) ? 0 : 1;
108 typedef typename private_correlation::correlation_traits<TInput, TCalc>::calc_t calc_t;
123 template <
typename TIterator>
127 add(first1, last1, first2);
133 void add(TInput value1, TInput value2)
135 inner_product += TCalc(value1 * value2);
136 sum_of_squares1 += TCalc(value1 * value1);
137 sum_of_squares2 += TCalc(value2 * value2);
138 sum1 += TCalc(value1);
139 sum2 += TCalc(value2);
147 template <
typename TIterator>
148 void add(TIterator first1, TIterator last1, TIterator first2)
150 while (first1 != last1)
152 add(*first1, *first2);
171 template <
typename TIterator>
172 void operator ()(TIterator first1, TIterator last1, TIterator first2)
174 add(first1, last1, first2);
184 return covariance_value;
194 return correlation_value;
200 operator double()
const
210 return size_t(counter);
218 inner_product = calc_t(0);
219 sum_of_squares1 = calc_t(0);
220 sum_of_squares2 = calc_t(0);
224 covariance_value = 0.0;
225 correlation_value = 0.0;
234 void calculate()
const
238 correlation_value = 0.0;
239 covariance_value = 0.0;
243 double n = double(counter);
244 double adjustment = 1.0 / (n * (n - Adjustment));
246 double square_of_sum1 = (sum1 * sum1);
247 double square_of_sum2 = (sum2 * sum2);
249 double variance1 = ((n * sum_of_squares1) - square_of_sum1) * adjustment;
250 double variance2 = ((n * sum_of_squares2) - square_of_sum2) * adjustment;
252 double stddev1 = 0.0;
253 double stddev2 = 0.0;
257 stddev1 =
sqrt(variance1);
262 stddev2 = sqrt(variance2);
265 covariance_value = ((n * inner_product) - (sum1 * sum2)) * adjustment;
267 if ((stddev1 > 0.0) && (stddev2 > 0.0))
269 correlation_value = covariance_value / (stddev1 * stddev2);
277 calc_t inner_product;
278 calc_t sum_of_squares1;
279 calc_t sum_of_squares2;
283 mutable double covariance_value;
284 mutable double correlation_value;
285 mutable bool recalculate;
288 template <
bool Correlation_Type,
typename TInput,
typename TCalc>
289 ETL_CONSTANT
int correlation<Correlation_Type, TInput, TCalc>::Adjustment;
Correlation.
Definition: correlation.h:103
double get_covariance() const
Get the correlation.
Definition: correlation.h:180
void add(TIterator first1, TIterator last1, TIterator first2)
Add a range.
Definition: correlation.h:148
void add(TInput value1, TInput value2)
Add a pair of values.
Definition: correlation.h:133
void clear()
Clear the correlation.
Definition: correlation.h:216
double get_correlation() const
Get the correlation.
Definition: correlation.h:190
void operator()(TInput value1, TInput value2)
Definition: correlation.h:162
correlation(TIterator first1, TIterator last1, TIterator first2)
Constructor.
Definition: correlation.h:124
size_t count() const
Get the total number added entries.
Definition: correlation.h:208
correlation()
Constructor.
Definition: correlation.h:115
bitset_ext
Definition: absolute.h:38
Definition: functional.h:125
Definition: correlation.h:93
Types for generic correlation.
Definition: correlation.h:50
Definition: correlation.h:80
Calculates the smallest value that, when squared, will be not greater than VALUE.
Definition: sqrt.h:47