9 const std::string& name,
11 std::ios_base::fmtflags& format) {
20 double fixed_size = 0.0;
22 fixed_size =
ceil(
log10(x.maxCoeff()+0.001)) + padding;
24 fixed_size =
max(fixed_size,
ceil(
log10(-x.minCoeff()+0.01))+(padding+1));
25 format = std::ios_base::fixed;
27 return max(fixed_size,
28 max(name.length(), std::string(
"-0.0").length())+0.0);
31 double scientific_size = 0;
32 scientific_size += 4.0;
33 scientific_size += 1.0;
34 double exponent_size = 0;
38 exponent_size =
max(exponent_size,
40 scientific_size +=
fmin(exponent_size, 3);
41 format = std::ios_base::scientific;
42 return scientific_size;
46 const Eigen::Matrix<std::string, Eigen::Dynamic, 1>& headers,
47 const Eigen::VectorXi& digits,
48 Eigen::Matrix<std::ios_base::fmtflags, Eigen::Dynamic, 1>& formats) {
49 int n = values.cols();
50 Eigen::VectorXi column_lengths(n);
52 for (
int i = 0; i < n; i++) {
53 column_lengths(i) =
calculate_size(values.col(i), headers(i), digits(i), formats(i)) + 1;
55 return column_lengths;
60 std::cout <<
"USAGE: print <filename 1> [<filename 2> ... <filename N>]"
64 std::cout <<
"OPTIONS:" << std::endl << std::endl;
65 std::cout <<
" --autocorr=<chain_index>\tAppend the autocorrelations for the given chain"
81 int main(
int argc,
const char* argv[]) {
87 std::vector<std::string> filenames;
88 for (
int i = 1; i < argc; i++) {
90 if (std::string(argv[i]).find(
"--autocorr=") != std::string::npos)
93 filenames.push_back(argv[i]);
95 if (std::string(
"--help") == std::string(argv[i])) {
102 Eigen::VectorXi thin(filenames.size());
104 std::ifstream ifstream;
105 ifstream.open(filenames[0].c_str());
112 for (
int chain = 1; chain < filenames.size(); chain++) {
113 ifstream.open(filenames[chain].c_str());
115 chains.
add(stan_csv);
122 std::string model_name =
"";
123 int max_name_length = 0;
124 for (
int i = skip; i < chains.
num_params(); i++)
125 if (chains.
param_name(i).length() > max_name_length)
126 max_name_length = chains.
param_name(i).length();
127 for (
int i = 0; i < 2; i++)
128 if (chains.
param_name(i).length() > max_name_length)
129 max_name_length = chains.
param_name(i).length();
132 Eigen::MatrixXd values(chains.
num_params(),10);
134 Eigen::VectorXd probs(5);
135 probs << 0.025, 0.25, 0.5, 0.75, 0.975;
137 for (
int i = 0; i < chains.
num_params(); i++) {
138 double sd = chains.sd(i);
139 double n_eff = chains.effective_sample_size(i);
140 values(i,0) = chains.mean(i);
141 values(i,1) = sd /
sqrt(n_eff);
143 Eigen::VectorXd quantiles = chains.quantiles(i,probs);
144 for (
int j = 0; j < 5; j++)
145 values(i,3+j) = quantiles(j);
147 values(i,9) = chains.split_potential_scale_reduction(i);
151 Eigen::Matrix<std::string, Eigen::Dynamic, 1> headers(n);
153 "mean",
"se_mean",
"sd",
154 "2.5%",
"25%",
"50%",
"75%",
"97.5%",
156 Eigen::VectorXi digits(n);
157 digits.setConstant(1);
160 Eigen::VectorXi column_lengths(n);
161 Eigen::Matrix<std::ios_base::fmtflags, Eigen::Dynamic, 1> formats(n);
164 std::cout <<
"Inference for Stan model: " << model_name << std::endl
166 for (
int chain = 1; chain < chains.
num_chains(); chain++)
169 std::cout <<
"; warmup=(" << chains.
warmup(0);
170 for (
int chain = 1; chain < chains.
num_chains(); chain++)
171 std::cout <<
"," << chains.
warmup(chain);
173 std::cout <<
"; thin=(" << thin(0);
174 for (
int chain = 1; chain < chains.
num_chains(); chain++)
175 std::cout <<
"," << thin(chain);
177 std::cout <<
"; " << chains.
num_samples() <<
" iterations saved."
178 << std::endl << std::endl;
180 using std::setprecision;
184 std::cout << std::setw(max_name_length+1) <<
"";
185 for (
int i = 0; i < n; i++) {
186 std::cout << setw(column_lengths(i)) << headers(i);
188 std::cout << std::endl;
190 for (
int i = skip; i < chains.
num_params(); i++) {
191 std::cout << setw(max_name_length+1) << std::left << chains.
param_name(i);
192 std::cout << std::right;
193 for (
int j = 0; j < n; j++) {
194 std::cout.setf(formats(j), std::ios::floatfield);
195 std::cout << setprecision(digits(j)) << setw(column_lengths(j)) << values(i,j);
197 std::cout << std::endl;
200 for (
int i = 0; i < 2; i++) {
201 std::cout << setw(max_name_length+1) << std::left << chains.
param_name(i);
202 std::cout << std::right;
203 for (
int j = 0; j < n; j++) {
204 std::cout.setf(formats(j), std::ios::floatfield);
205 std::cout << setprecision(digits(j)) << setw(column_lengths(j)) << values(i,j);
207 std::cout << std::endl;
210 std::cout << std::endl;
211 std::cout <<
"Samples were drawn using " << stan_csv.
adaptation.
sampler <<
"." << std::endl
212 <<
"For each parameter, n_eff is a crude measure of effective sample size," << std::endl
213 <<
"and Rhat is the potential scale reduction factor on split chains (at " << std::endl
214 <<
"convergence, Rhat=1)." << std::endl
217 for (
int k = 1; k < argc; k++) {
219 if (std::string(argv[k]).find(
"--autocorr=") != std::string::npos) {
221 const int c = atoi(std::string(argv[k]).substr(11).c_str());
224 std::cout <<
"Bad chain index " << c <<
", aborting autocorrelation display." << std::endl;
230 for (
int i = 0; i < chains.
num_params(); i++) {
231 autocorr.row(i) = chains.autocorrelation(c, i);
235 std::cout <<
"Displaying the autocorrelations for chain " << c <<
":" << std::endl;
236 std::cout << std::endl;
238 const int n_autocorr = autocorr.row(0).size();
241 int number = n_autocorr;
242 while ( number != 0) { number /= 10; lag_width++; }
244 std::cout << setw(lag_width > 4 ? lag_width : 4) <<
"Lag";
245 for (
int i = 0; i < chains.
num_params(); ++i) {
246 std::cout << setw(max_name_length + 1) << std::right << chains.
param_name(i);
248 std::cout << std::endl;
251 for (
int n = 0; n < n_autocorr; ++n) {
252 std::cout << setw(lag_width) << std::right << n;
253 for (
int i = 0; i < chains.
num_params(); ++i) {
254 std::cout << setw(max_name_length + 1) << std::right << autocorr(i, n);
256 std::cout << std::endl;