-
Notifications
You must be signed in to change notification settings - Fork 4
/
mccresults.hpp
100 lines (81 loc) · 3.01 KB
/
mccresults.hpp
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
/*
* Copyright (c) 2013, Robert Rueger <[email protected]>
*
* This file is part of hVMC.
*
* hVMC is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* hVMC is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with hVMC. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef MCCRESULTS_H_INCLUDED
#define MCCRESULTS_H_INCLUDED
#include <vector>
#include <numeric>
#include <iosfwd>
#include <cmath>
#include <boost/optional.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/optional.hpp>
#define EIGEN_NO_AUTOMATIC_RESIZING
#include <eigen3/Eigen/Core>
template <typename Ti>
struct UncertainQuantity {
Ti mean, sigma;
UncertainQuantity() {}
UncertainQuantity( Ti mean_init, Ti sigma_init )
: mean( mean_init ), sigma( sigma_init ) { }
template< typename Te >
UncertainQuantity( const std::vector<Te>& binmeans ) {
// calculate the average of the binmeans
mean =
static_cast<Ti>(
accumulate( binmeans.begin(), binmeans.end(), Te(0) )
) / static_cast<Ti>( binmeans.size() );
// calculate the variance of the binmeans
Ti binmeans_variance =
static_cast<Ti>( binmeans.size() ) /
static_cast<Ti>( binmeans.size() - 1 ) *
(
static_cast<Ti>( accumulate(
binmeans.begin(), binmeans.end(), Te(0),
[]( Te sum, Te m ) { return sum + m * m; }
) ) / static_cast<Ti>( binmeans.size() )
- mean * mean
);
// if binmeans variance is negative this is floating point precision
// problem (cancellation when subtracting mean^2)
binmeans_variance = std::max( binmeans_variance, 0.0 );
// uncertainty of the mean is sqrt(variance / num_bins)
sigma = std::sqrt( binmeans_variance / static_cast<Ti>( binmeans.size() ) );
}
// make UncertainQuantity serializable
friend class boost::serialization::access;
template<class Archive>
void serialize( Archive& ar, const unsigned int ) {
ar & mean;
ar & sigma;
}
};
struct MCCResults {
boost::optional< UncertainQuantity<double> > E;
boost::optional< Eigen::VectorXd > Deltak;
boost::optional< Eigen::MatrixXd > Deltak_Deltakprime;
boost::optional< Eigen::VectorXd > Deltak_E;
boost::optional< UncertainQuantity<double> > dblocc;
boost::optional< Eigen::MatrixXd > nncorr;
boost::optional< Eigen::MatrixXd > sscorr;
boost::optional< std::vector<Eigen::VectorXi> > pconfs;
void write_to_files( const boost::filesystem::path& dir ) const;
};
std::ostream& operator<<( std::ostream& out, const MCCResults& res );
#endif // MCCRESULTS_H_INCLUDED