-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstatistics.cpp
121 lines (109 loc) · 3.88 KB
/
statistics.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <vector>
#include "statistics.hpp"
using namespace std;
//CALCULATE MEAN VALUE OF A GIVEN ARRAY WITH N VALUES
template<typename T>
double CalcMean(const vector<T>& k) {
double sum = 0.0;
for (auto i = k.begin(); i != k.end(); i++) {
sum += *i;
}
return sum/static_cast<double>(k.size());
}
template<typename T>
double CalcMean_pow(const vector<T>& k, int power) {
double sum = 0.0;
for (auto i = k.begin(); i != k.end(); i++) {
sum += pow(*i,power);
}
return sum/static_cast<double>(k.size());
}
//CREATE BINS OF EQUALLY SIZED DATASETS
template<typename T>
vector<vector<T>> create_bins(const vector<T>& data, const int& N_bin, const int& bin_size) {
vector<vector<T>> matrix(N_bin, vector<T>(bin_size));
size_t k=0;
for(int i=0; i<N_bin; i++) {
for (int j=0; j<bin_size; j++) {
matrix[i][j] = data[k];
k++;
}
}
return matrix;
}
//Calculate All Binned Data (MEAN of each Bin), POWER = 1 (FIXED)
template<typename T>
vector<T> CalcBins(const vector<vector<T>>& matrix) {
vector<T> M;
for(auto i = matrix.begin(); i != matrix.end(); i++) {
vector<T> temp;
for(auto j = i->begin(); j != i->end(); j++) {
temp.push_back(*j);
}
M.push_back(CalcMean(temp));
}
return M;
}
//Calculate Binned Data with power for Magnetization:
template<typename T>
triple<vector<T>, vector<T>, vector<T>> CalcBins_Mag(const vector<vector<T>>& matrix) {
vector<T> M1;
vector<T> M2;
vector<T> M4;
for(auto i = matrix.begin(); i != matrix.end(); i++) {
vector<T> temp;
for(auto j = i->begin(); j != i->end(); j++) {
temp.push_back(*j);
}
M1.push_back(CalcMean_pow(temp, 1));
M2.push_back(CalcMean_pow(temp, 2));
M4.push_back(CalcMean_pow(temp, 4));
}
return triple<vector<T>, vector<T>, vector<T>>(M1,M2,M4);
}
template<typename T>
pair<T,T> U4_calc(const vector<T>& M2, const vector<T>& M4) {
vector<T> f_m;
for(size_t i=0; i<M4.size(); i++) {
f_m.push_back(M4[i]/pow(M2[i],2));
}
pair<T,T> result = jack_mean_std(f_m);
return pair<T,T>(result.first, result.second);
}
//CALCULATE JACKKNIFE ESTIMATE OF A GIVEN ARRAY, POWER USED FOR <X^POWER> AVERAGE, RETURNS VECTOR WITH N ESTIMATES FOR EACH i != j
template<typename T>
vector<T> jack_avg(const vector<T>& data, const int power) {
vector<T> y;
double y_i = 1.0/(data.size()-1.0);
for (auto i=data.begin(); i!=data.end(); i++) {
T sum = 0.0;
for (auto j=data.begin(); j!=data.end(); j++) {
if(j!=i) {
sum += pow(*j,power);
}
}
y.push_back(y_i*sum);
}
return y;
}
//CALCULATE MEAN OF JACKKNIFE ESTIMATES + STD
template<typename T>
pair<T,T> jack_mean_std(const vector<T>& data) {
T mean = CalcMean(data);
T val = 0.0;
for (auto i = data.begin(); i != data.end(); i++) {
val += pow(*i - mean, 2);
}
T jack_std = sqrt(data.size()-1)/sqrt(data.size()) * sqrt(val);
return pair<T,T>(mean, jack_std);
}
// Explicit instantiations
template double CalcMean(const vector<double>& k);
template double CalcMean_pow(const vector<double>&k, int power);
template vector<vector<double>> create_bins(const vector<double>& data, const int& N_bin, const int& bin_size);
template vector<double> CalcBins(const vector<vector<double>>& matrix);
template pair<double,double> U4_calc(const vector<double>& M2, const vector<double>& M4);
template vector<double> jack_avg(const vector<double>& data, const int power);
template pair<double,double> jack_mean_std(const vector<double>& data);
template triple<vector<double>, vector<double>, vector<double>> CalcBins_Mag(const vector<vector<double>>& matrix);