-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cc
112 lines (100 loc) · 3.72 KB
/
main.cc
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
#include "montecarlo.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <limits>
void Print(std::ofstream &file, const int n) {
file << n << '\n';
}
void Print(std::ofstream &file, const long double d) {
file << d << '\n';
}
void Print (std::ofstream &file, const NumericVector &v) {
for (int i = 0; i < int(v.size()); ++i) {
file << v[i] << ' ';
}
file << '\n';
}
void Print (std::ofstream &file, const ComplexMatrices &m) {
for (int i = 0; i < int(m.size()); ++i) {
for (int j = 0; j < int(m[i].size()); ++j) {
for (int k = 0; k < int(m[i][j].size()); ++k) {
file << std::real(m[i][j][k]);
long double imag = std::imag(m[i][j][k]);
if (imag >= 0.0) {
file << '+';
}
file << imag << 'j' << ' ';
}
file << '\n';
}
file << '\n';
}
file << '\n';
}
void Print (std::ofstream &file, const NumericMatrixOfMatrices &m) {
for (int i = 0; i < int(m.size()); ++i) {
for (int j = 0; j < int(m[i].size()); ++j) {
for (int k = 0; k < int(m[i][j].size()); ++k) {
for (int l = 0; l < int(m[i][j][k].size()); ++l) {
file << m[i][j][k][l] << ' ';
}
file << '\n';
}
file << '\n';
}
file << '\n';
}
file << '\n';
}
void PrintResults(std::ofstream &file, const Results &results) {
Print(file, results.n);
Print(file, results.d);
Print(file, results.min_epsilon);
Print(file, results.initial_epsilon);
Print(file, results.acceptation_rate);
Print(file, results.n_attempts);
Print(file, results.min_beta);
Print(file, results.max_beta);
Print(file, results.num_beta);
Print(file, results.initial_states);
Print(file, results.time_beta_finite);
Print(file, results.time_beta_infinite);
Print(file, results.beta_values);
Print(file, results.mean_values);
Print(file, results.result);
Print(file, results.existence_result);
Print(file, results.best_states);
Print(file, results.pairwise_scalar_products);
}
void usage(const std::string &name) {
std::cerr << "usage: " << '\n';
std::cerr << " " << name << " d n epsilon min_epsilon acceptation_rate";
std::cerr << " n_attempts min_beta max_beta num_beta repetitions_beta_infinite results_filename" << '\n';
}
int main(int argc, char** argv) {
if (argc != 12) {
usage(std::string(argv[0]));
return 1;
}
int d = std::stoi(argv[1]);
int n = std::stoi(argv[2]);
long double epsilon = std::stod(argv[3]);
long double min_epsilon = std::stod(argv[4]);
long double acceptation_rate = std::stod(argv[5]);
long double n_attempts = std::stod(argv[6]);
long double min_beta = std::stod(argv[7]);
long double max_beta = std::stod(argv[8]);
long double num_beta = std::stod(argv[9]);
long double repetitions_beta_infinite = std::stod(argv[10]);
std::string results_filename = argv[11];
Results results = optimize(n, d, epsilon, min_epsilon, acceptation_rate, n_attempts, min_beta, max_beta, num_beta, repetitions_beta_infinite);
std::cout << std::setprecision(std::numeric_limits<long double>::max_digits10) << std::fixed;
std::cout << "value obtained: " << results.result << '\n';
std::cout << "existence value: " << results.existence_result << '\n';
std::cout << "time: " << results.time_beta_finite + results.time_beta_infinite << 's' << '\n';
std::ofstream file(results_filename, std::ofstream::out);
file << std::setprecision(std::numeric_limits<long double>::max_digits10) << std::fixed;
PrintResults(file, results);
file.close();
}