55 {
56 if(argc < 8) {
57 std::cerr << "Usage: 1.This 2.Directory 3.Nmax 4.Nmin 5.dE 6.Emin 7.Emax 8.minNdata (Op1).SampleMin (Op2).SampleMax" << std::endl;
58 std::exit(EX_USAGE);
59 }
60 int const Nmax = (argc>=3 ? std::stoi(argv[2]) :16);
61 int const Nmin = (argc>=4 ? std::stoi(argv[3]) :16);
62 double const dE = (argc>=5 ? std::stod(argv[4]) :0.02);
63 double const Emin = (argc>=6 ? std::stod(argv[5]) :0.45);
64 double const Emax = (argc>=7 ? std::stod(argv[6]) :0.55);
65 int const minNdata = (argc>=8 ? std::stod(argv[7]) :2);
66 int const SampleMin = (argc>=9 ? std::stod(argv[8]) :-1);
67 int const SampleMax = (argc>=10? std::stod(argv[9]) :-1);
68 if(Nmax < Nmin) {
69 std::cerr << "Error: Nmax(" << Nmax << ") < Nmin(" << Nmin << ")" << std::endl;
70 std::exit(EX_USAGE);
71 }
72 std::cout << "# Input: Nmax=" << Nmax
73 << ", Nmin=" << Nmin
77 << ", minNdata=" << minNdata
78 << std::endl;
79
80 std::string const baseDir(argv[1]);
81 std::cout << "# Directory: " << baseDir << "\n";
82 std::string InDataDir(baseDir+"/RawData");
83 std::vector<std::string> dirList;
84 {
85 std::string str;
86 int dataNo;
87 int const idShift=(SampleMin>=0? SampleMin: 0);
88 if(SampleMin>=0 && SampleMax>0) dirList.resize(SampleMax-idShift+1);
89 for(
const filesystem::directory_entry &entry :
filesystem::directory_iterator(InDataDir)) {
90 if ( entry.is_directory() ) {
91 str = entry.path().string();
92 dataNo = std::atoi(str.substr(str.find("_No")+3).c_str());
93 if((SampleMin>=0 || SampleMax>0) && (dataNo<SampleMin || SampleMax<dataNo)) continue;
94 debug_print(
"# dir=" << str <<
", dataNo=" << dataNo);
95 if( (SampleMin<0 || SampleMax<=0) && dirList.size()<=dataNo) dirList.resize(dataNo+1);
96 debug_print(
"dataNo-idShift=" << dataNo-idShift <<
", dataNo=" << dataNo <<
", idShift=" << idShift);
97 dirList.at(dataNo-idShift) = str;
98 }
99 }
100 }
101
102 debug_print(
"# dirList.size() = " << dirList.size() <<
", Nmax=" << Nmax);
103
104
105 matrix<double> L2norm(Nmax+1, dirList.size(), NAN);
106 matrix<double> L2norm_err(Nmax+1, dirList.size(), NAN);
107 matrix<double> KLdive(Nmax+1, dirList.size(), NAN);
108 matrix<double> KLdive_err(Nmax+1, dirList.size(), NAN);
109 matrix<Integer_t> dataNum(Nmax+1, dirList.size(), -1);
110 matrix<std::vector<double>> varR(Nmax+1, dirList.size());
111 std::vector<std::vector<double>> varRmin(Nmax+1, std::vector<double>(dirList.size(), NAN));
112 std::vector<std::vector<double>> varRmax(Nmax+1, std::vector<double>(dirList.size(), NAN));
113
114 #pragma omp parallel for schedule(dynamic, 10)
115 for(size_t sample = 0;sample < dirList.size(); ++sample) {
116
117
118
119 int n, idMin, idMax;
121 std::string command;
122 double OpRange, shellMin, shellMax, dtemp;
123 std::vector<double> eigenEnergy, eigenExpValue, MCAverage, Stddev;
124 std::vector<Integer_t> NdataInShell,
Histogram;
125 std::string InExpValueFname, InEnergyFname, InMatElemsFname, str;
126 std::ifstream InExpValueFs, InEnergyFs, InMatElemsFs;
127 std::string OutFname;
128 std::ofstream OutFs;
129 std::vector<std::string> candidateFileNames;
130
131
132
133 std::string OutDir(std::regex_replace(dirList[sample], std::regex("/RawData"), "/ProcessedData"));
134 filesystem::create_directories(OutDir);
135
136 bool flag = false;
137 for(n = Nmax;n >= Nmin; --n) {
138 dim = 0;
139 std::stringstream
buff(
"");
buff <<
"_N" << n <<
".txt";
140 {
141 std::stringstream ss;
142 candidateFileNames.resize(3);
143 candidateFileNames[0] = dirList[sample] +
"/EigenExpValueZ" +
buff.str();
144 candidateFileNames[1] = dirList[sample] +
"/EigenExpValueC" +
buff.str();
145 candidateFileNames[2] = dirList[sample] +
"/EigenExpValue" +
buff.str();
146 if( InExpValueFs.is_open() ) { InExpValueFs.close(); InExpValueFs.clear(); }
147 for(auto name : candidateFileNames) {
148 InExpValueFname = name;
149 InExpValueFs.open(InExpValueFname);
150 if( InExpValueFs.is_open() ) break;
151 }
152 if( !InExpValueFs.is_open() ) continue;
153 flag = true;
154 InExpValueFs.exceptions(std::ios::badbit | std::ios::failbit);
155 while( std::getline(InExpValueFs, str) ) if(str.find("OpRange") != std::string::npos) break;
156 OpRange = std::stod(str.substr(str.find("OpRange=")+8));
157
158 eigenEnergy.resize(0);
159 eigenExpValue.resize(0);
160 try{
161 skip_header(InExpValueFs);
162 for(getline(InExpValueFs, str); !InExpValueFs.eof(); getline(InExpValueFs, str)) {
163 ss.str(str); ss.clear(std::stringstream::goodbit);
164 ss >> dtemp; eigenEnergy.push_back(dtemp);
165 ss >> dtemp;
166 ss >> dtemp; eigenExpValue.push_back(dtemp/OpRange);
167 }
168 } catch(std::exception& e) {
169 if( !InExpValueFs.eof() )
170 std::cerr << "Error(" << InExpValueFs.eof() << InExpValueFs.fail() << InExpValueFs.bad() << "):" << e.what() << std::endl;
171 }
172 InExpValueFs.close(); InExpValueFs.clear();
173 if(eigenEnergy.size() != eigenExpValue.size()) {
174 std::cerr << "Error: eigenEnergy.size() != eigenExpValue.size() for a file\n"
175 << "\t" << InExpValueFname << std::endl;
176 continue;
177 }
178 dim = eigenEnergy.size();
179 }
180
181 #ifndef NDEBUG
182 std::cout << std::scientific;
183 std::cout << "# OpRange = " << OpRange << std::endl;
184
185
186 #endif
188
189 for(idMin=0; idMin<dim && eigenEnergy.at(idMin)<
Emin; ++idMin) { };
190 for(idMax=dim-1; idMax>=0 && eigenEnergy.at(idMax)>
Emax; --idMax) { };
191 debug_print(
"# eigenEnergy[" << idMin <<
"]=" << eigenEnergy[idMin] <<
", eigenEnergy[" << idMax <<
"]=" << eigenEnergy[idMax]);
192
193 MCAverage.resize(dim); NdataInShell.resize(dim);
194 std::fill( MCAverage.begin(), MCAverage.end(), 0.0);
195 std::fill(NdataInShell.begin(), NdataInShell.end(), 0.0);
198 }
199
200 debug_print(
"# Calculating the standard deviation of eigenstate expectation values within a shell.");
201 Stddev.resize(dim);
202 std::fill(Stddev.begin(), Stddev.end(), NAN);
203
204 for(size_t i = idMin;i <= idMax; ++i) {
205 if(NdataInShell[i] < minNdata) { Stddev[i] = NAN; continue; }
206 shellMin = eigenEnergy[i] -
dE;
207 shellMax = eigenEnergy[i] +
dE;
208 if(NdataInShell[i] != (Ndata =
MeasureOfETH(Stddev[i], dtemp, dtemp, shellMin, shellMax, dim, eigenEnergy, eigenExpValue, MCAverage)) ) {
209 std::cerr << "Warning: NdataInShell[" << i << "](" << NdataInShell[i] << ") != Ndata(" << Ndata <<")." << std::endl;
210
211 }
212
213
214
215 }
216
217 debug_print(
"# Calculating variable R and its average and standard deviation.");
218 varR.at(n,sample).resize(0);
219 std::fill(varR.at(n,sample).begin(), varR.at(n,sample).end(), NAN);
220 double ave = 0, var = 0;
221 Ndata = 0;
222 for(size_t i = idMin;i <= idMax; ++i) {
223 if( isnan(Stddev[i]) ) continue;
224 dtemp = (Stddev[i] == 0 ? 0 : (eigenExpValue[i] - MCAverage[i])/Stddev[i] );
225 ave += dtemp;
226 Ndata += 1;
227 varRmin[n][sample] = std::fmin(dtemp,varRmin[n][sample]);
228 varRmax[n][sample] = std::fmax(dtemp,varRmax[n][sample]);
229 varR.at(n,sample).push_back(dtemp);
230 }
231
232 ave /= Ndata;
233 for(
size_t i = 0;i < varR.at(n,sample).
size(); ++i) {
234 if( isnan(varR.at(n,sample)[i]) ) continue;
235 var += (varR.at(n,sample)[i] - ave)*(varR.at(n,sample)[i] - ave)/(Ndata-1);
236 }
237
238 debug_print(
"# n=" << n <<
", Ndata=" << Ndata <<
", ave=" << ave <<
", var=" << var);
239 if( !(var > 0) ) continue;
240 double binwidth = 0.1;
241 varRmin[n][sample] = std::floor(varRmin[n][sample]/binwidth)*binwidth;
242 varRmax[n][sample] = std::ceil( varRmax[n][sample]/binwidth)*binwidth;
245
246 debug_print(
"# varRmin=" << varRmin[n][sample] <<
", varRmax=" << varRmax[n][sample] <<
", binwidth=" << binwidth <<
", Nbin=" <<
Nbin <<
", Ndata=" << Ndata);
247 debug_print(
"# Calculate the probability density (Nbin=" <<
Nbin <<
")");
250 for(
size_t i = 0;i < varR.at(n,sample).
size(); ++i) {
251 if( isnan(varR.at(n,sample)[i]) ) continue;
253 }
254
255 debug_print(
"# Calculate the L2-norm and the KL-divergence.");
256 Measure(L2norm.at(n,sample), L2norm_err.at(n,sample), KLdive.at(n,sample), KLdive_err.at(n,sample), dataNum.at(n,sample),
Histogram, binwidth, varRmin[n][sample]);
257 if( L2norm.at(n,sample) > 1.0E+3 || Ndata == 2 ) {
258 std::cerr <<
"# (sample=" << sample <<
", n=" << n <<
") Nbin=" <<
Nbin <<
", Ndata=" << dataNum.at(n,sample) <<
", delta=" << L2norm.at(n,sample) <<
", binwidth=" << binwidth <<
", binwidth*Ndata=" << binwidth*dataNum.at(n,sample) <<
", var=" << var << std::endl;
259 }
260 debug_print(
"########## (END)Some process ##########\n");
261
262 {
263 std::stringstream
buff(
"");
buff <<
"_minNdata" << minNdata <<
"_N" << n <<
".txt";
264 OutFname = OutDir +
"/SrednickiAnsatz_varR" +
buff.str();
265 }
266 if( OutFs.is_open() ) { OutFs.close(); OutFs.clear(); }
268 OutFs << std::scientific << std::showpos << std::setprecision(6);
269 OutFs <<
"# shellWidth= " <<
dE <<
"\n"
270 << "# L2norm= " << L2norm.at(n,sample) << "\n"
271 << "# L2norm_err= " << L2norm_err.at(n,sample) << "\n"
272 << "# KLdive= " << KLdive.at(n,sample) << "\n"
273 << "# KLdive_err= " << KLdive_err.at(n,sample) << "\n"
274 << "# Ndata= " << dataNum.at(n,sample) << "\n"
275 << "# 1.(varR) 2.(PDF) 3.(Histogram)" << "\n\n";
276 for(
size_t bin = 0;bin <
Nbin; ++bin) {
277 OutFs << (bin+0.5)*binwidth + varRmin[n][sample] << " "
278 <<
Histogram[bin]/(binwidth*dataNum.at(n,sample)) <<
" "
280 << std::endl;
281 }
282 OutFs.close();
283
284
285 {
286 std::stringstream
buff(
"");
buff <<
"_minNdata" << minNdata <<
"_N" << n <<
".txt";
287 OutFname = OutDir +
"/MCAverage" +
buff.str();
288 }
289 if( OutFs.is_open() ) { OutFs.close(); OutFs.clear(); }
291 OutFs << std::scientific << std::showpos << std::setprecision(6);
292 OutFs <<
"# shellWidth= " <<
dE <<
"\n"
293 << "# 1.(eigenEnergy) 2.(eigenExpValue) 3.(MCAverage) 4.(Stddev)" << "\n\n";
295 OutFs << eigenEnergy[i] << " "
296 << eigenExpValue[i] << " "
297 << MCAverage[i] << " "
298 << Stddev[i] << std::endl;
299 }
300 OutFs.close();
301 }
302
303 if(flag) {
304 #pragma omp critical
305 std::cout << "# " << dirList[sample] << std::endl;
306 }
307 }
308
309
311 std::string OutDir(baseDir);
312 {
313 std::stringstream
buff(
"");
314 buff <<
"/Measure_Emin" <<
Emin <<
"_Emax" <<
Emax <<
"_dE" <<
dE;
315 OutDir = baseDir+
buff.str();
316 filesystem::create_directories(OutDir);
317 filesystem::create_directories(OutDir+"/Output");
318 }
319 {
320 std::string OutStatFname;
321 std::stringstream
buff(
"");
buff <<
"_minNdata" << minNdata <<
".txt";
322 OutStatFname = OutDir +
"/Output/SrednickiAnsatz_varR_L2norm" +
buff.str();
323 std::ofstream OutStat(OutStatFname);
checkIsFileOpen(OutStat, OutStatFname);
324 OutStat <<
"# shellWidth= " <<
dE <<
", minNdata=" << minNdata <<
"\n"
325 << "# 1.(System size) 2.(average L2norm) 3.(L2norm_err) 4.(stddev of L2norm) 5.(NdataL2) 6.(average KLdive) 7.(KLdive_err) 8.(stddev of KLdive) 9.(NdataKL)" << "\n\n";
326 OutStat << std::scientific << std::setprecision(6);
327 std::string OutFname;
328 for(int n = Nmax;n >= Nmin; --n) {
329 int NdataL2=0, NdataKL=0;
330 double meanL2=0, stddevL2=0, meanKL=0, stddevKL=0;
331 double meanL2_err=0, meanKL_err=0;
332 for(size_t sample = 0;sample < dirList.size(); ++sample) {
333 if( !isnan(L2norm.at(n,sample)) ) { meanL2 += L2norm.at(n,sample); NdataL2 += 1; }
334 if( !isnan(KLdive.at(n,sample)) ) { meanKL += KLdive.at(n,sample); NdataKL += 1; }
335 }
336 meanL2 /= NdataL2; meanKL /= NdataKL;
337 for(size_t sample = 0;sample < dirList.size(); ++sample) {
338 if( !isnan(L2norm.at(n,sample)) ) { stddevL2 += (meanL2 - L2norm.at(n,sample))*(meanL2 - L2norm.at(n,sample)); }
339 if( !isnan(KLdive.at(n,sample)) ) { stddevKL += (meanKL - KLdive.at(n,sample))*(meanKL - KLdive.at(n,sample)); }
340 if( !isnan(L2norm_err.at(n,sample)) ) { meanL2_err += L2norm_err.at(n,sample)*L2norm_err.at(n,sample) / NdataL2; }
341 if( !isnan(KLdive_err.at(n,sample)) ) { meanKL_err += KLdive_err.at(n,sample)*KLdive_err.at(n,sample) / NdataKL; }
342 }
343 stddevL2 = sqrt(stddevL2/(NdataL2-1)); stddevKL = sqrt(stddevKL/(NdataKL-1));
344 meanL2_err = sqrt(meanL2_err+stddevL2*stddevL2)/sqrt(NdataL2);
345 meanKL_err = sqrt(meanKL_err+stddevKL*stddevKL)/sqrt(NdataKL);
346
347 OutStat << n << " "
348 << meanL2 << " " << meanL2_err << " " << stddevL2 << " " << NdataL2 << " "
349 << meanKL << " " << meanKL_err << " " << stddevKL << " " << NdataKL << std::endl;
350
351 {
352 std::stringstream
buff(
"");
buff <<
"_minNdata" << minNdata <<
"_N" << n <<
".txt";
353 OutFname = OutDir +
"/SrednickiAnsatz_varR_L2norm" +
buff.str();
354 }
356 OutFs <<
"# shellWidth= " <<
dE <<
", minNdata=" << minNdata <<
"\n"
357 << "# 1.(sample) 2.(L2norm) 3.(KLdive) 4.(dataNum)" << "\n\n";
358 OutFs << std::scientific << std::setprecision(6);
359 for(size_t sample = 0;sample < dirList.size(); ++sample) {
360 OutFs << sample << " "
361 << L2norm.at(n,sample) << " "
362 << KLdive.at(n,sample) << " "
363 << dataNum.at(n,sample) << "\n";
364 }
365 }
366 }
367
369 {
370 double binwidth = 0.1;
371 std::string OutFname;
372 for(int n = Nmax;n >= Nmin; --n) {
373 debug_print(
"# Calculate the ensemble average. (N=" << n <<
")");
374
375
376 double VarRMin = *std::min_element(varRmin[n].begin(), varRmin[n].end());
377 double VarRMax = *std::max_element(varRmax[n].begin(), varRmax[n].end());
378
379 if( isnan(VarRMin) || isnan(VarRMax) ) continue;
382
383 std::cout <<
"VarRMin = " << VarRMin <<
", VarRmax = " << VarRMax <<
", Nbin = " <<
Nbin << std::endl;
387 for(size_t sample = 0;sample < dirList.size(); ++sample) {
388 for(
size_t j = 0;j < varR.at(n,sample).
size(); ++j) {
389 if( isnan(varR.at(n,sample)[j]) ) continue;
390
391 if(
Bin(varR.at(n,sample)[j]) >=
Nbin ) {
392 std::cerr <<
"Error: Bin(varR.at(" << n <<
"," << sample <<
")[" << j <<
"]) = " <<
Bin(varR.at(n,sample)[j]) <<
" >= " <<
Nbin << std::endl;
393 }
395 Ndata += 1;
396 }
397 }
398
399 debug_print(
"# Calculate the L2-norm and the KL-divergence.");
400 double L2=0, KL=0, L2_err=0, KL_err=0;
401 Measure(L2, L2_err, KL, KL_err, Ndata,
Histogram, binwidth, VarRMin);
402
403 {
404 std::stringstream
buff(
"");
buff <<
"_minNdata" << minNdata <<
"_N" << n <<
".txt";
405 OutFname = OutDir +
"/SrednickiAnsatz_varR_AverageHist" +
buff.str();
406 }
408 OutFs << std::scientific << std::showpos << std::setprecision(6);
409 OutFs <<
"# shellWidth= " <<
dE <<
"\n"
410 << "# L2norm= " << L2 << "\n"
411 << "# L2norm_err= " << L2_err<< "\n"
412 << "# KLdive= " << KL << "\n"
413 << "# KLdive_err= " << KL_err<< "\n"
414 << "# Ndata= " << Ndata << "\n"
415 << "# 1.(varR) 2.(PDF) 3.(Histogram)" << "\n\n";
416 for(
size_t bin = 0;bin <
Histogram.size(); ++bin) {
417 OutFs << (bin+0.5)*binwidth + VarRMin << " "
418 <<
Histogram[bin]/(binwidth*Ndata) <<
" "
420 << std::endl;
421 }
422 OutFs.close();
423 }
424 }
425
426 return EXIT_SUCCESS;
427}
Integer_t const Nbin
Definition OpErgodicity_Compare.cpp:13
Integer_t Bin(double x)
Definition Overlap.cpp:59
namespace filesystem
Definition SrednickiAnsatz_varR.cpp:18
Definition OpAverage.cpp:21
Calculate the microcanonical averages with respect to a given sorted vector 'eigVal'.
Definition MicroCanonicalAverage.hpp:25
bool checkIsFileOpen(std::ifstream &file, std::string const &filename)
Definition file_util.hpp:22
debug_print("# Determining GPU configuration.")
MKL_INT Integer_t
Definition mytypes.hpp:359
constexpr double Emin
Definition setVariablesForMCAverage.cpp:4
constexpr double Emax
Definition setVariablesForMCAverage.cpp:5
double const dE
Definition setVariablesForMCAverage.cpp:2
Integer_t MeasureOfETH(double &Fluc_2, double &Fluc_inf, double &MaxPos, double const Emin, double const Emax, Integer_t const dim, const std::vector< double > &eigenEnergy, const std::vector< double > &EXPvalue, const std::vector< double > &MCAverage)
Definition statmech.cpp:244
__constant__ int size
Definition testEigenOnGPU.cu:4
std::stringstream buff("")