24 const std::tuple<double,double,int>& densityLimits,
25 const std::string& lmpLocation,
26 const std::string& potentialName)
try:
27 exponentialRegime(true),
32 energyLimits(energyLimits),
33 densityLimits(densityLimits),
34 numberOfEnergyStates(std::get<2>(energyLimits)),
35 numberOfDensityStates(std::get<2>(densityLimits)),
36 histogram(
Eigen::MatrixXi::Zero(numberOfEnergyStates,numberOfDensityStates)),
37 stateDensityEnergyMap(getStateDensityEnergyMap()),
38 lmpLocation(lmpLocation),
39 potentialName(potentialName),
40 mask(getMask(numberOfEnergyStates,numberOfDensityStates)),
41 theta(getTheta(mask,f))
43 std::cout <<
"Number of the mask-free histogram bins= " <<
histogram.size()-
mask.template cast<int>().sum() << std::endl;
44 spectrumFile.open(
"energyDensityLW.txt",std::ios_base::app);
46 catch(std::runtime_error& e)
48 std::cout << e.what() << std::endl;
53 const std::pair<StateType,SystemType>& currentStateSystem)
56 std::cout << countLW <<
") ";
57 const auto& currentState= currentStateSystem.first;
58 const auto& currentSystem= currentStateSystem.second;
59 const auto& proposedState= proposedStateSystem.first;
60 const auto& proposedSystem= proposedStateSystem.second;
65 const auto& temp= currentSystem.densityEnergy(lmpLocation, potentialName,
false);
67 currentDensity= currentState.density();
68 currentEnergy= std::get<1>(temp);
69 std::cout << currentState;
70 stateDensityEnergyMap[currentState]= std::make_pair(std::get<0>(temp),std::get<1>(temp));
71 spectrumFile << currentDensity <<
" " << currentEnergy <<
" " << currentState << std::endl;
74 assert(stateDensityEnergyMap.find(currentState) != stateDensityEnergyMap.end());
75 currentDensity= stateDensityEnergyMap.at(currentState).first;
76 currentEnergy= stateDensityEnergyMap.at(currentState).second;
80 double proposedEnergy, proposedDensity;
81 if (stateDensityEnergyMap.find(proposedState) != stateDensityEnergyMap.end()) {
82 std::cout <<
"found. Proposed state = " << proposedState << std::endl;
83 proposedDensity= stateDensityEnergyMap.at(proposedState).first;
84 proposedEnergy = stateDensityEnergyMap.at(proposedState).second;
85 std::cout <<
"proposedDensity = " << proposedDensity <<
"; proposedEnergy = " << proposedEnergy << std::endl;
88 std::cout <<
"new" << std::endl;
89 const auto& temp= proposedSystem.densityEnergy(lmpLocation, potentialName,
false);
91 proposedDensity= proposedState.density();
92 proposedEnergy= std::get<1>(temp);
93 stateDensityEnergyMap[proposedState]= std::make_pair(std::get<0>(temp),std::get<1>(temp));
94 spectrumFile << proposedDensity <<
" " << proposedEnergy <<
" " << proposedState << std::endl;
97 auto [currentEnergyIndex,currentDensityIndex,currentInSpectrum]= spectrumIndex(currentEnergy,currentDensity,energyLimits,densityLimits);
98 auto [proposedEnergyIndex,proposedDensityIndex,proposedInSpectrum]= spectrumIndex(proposedEnergy,proposedDensity,energyLimits,densityLimits);
103 if (!currentInSpectrum || mask(currentEnergyIndex,currentDensityIndex))
108 if (!proposedInSpectrum || mask(proposedEnergyIndex, proposedDensityIndex))
112 histogram(currentEnergyIndex,currentDensityIndex) += 1;
113 theta(currentEnergyIndex,currentDensityIndex) *= f;
114 double thetaNorm = theta.lpNorm<1>();
115 theta = theta / thetaNorm;
120 for(
int i=0; i<histogram.rows(); ++i)
122 for(
int j=0; j<histogram.cols(); ++j)
125 std::cout << histogram(i,j) <<
" ";
128 std::cout << std::endl;
131 if (exponentialRegime) {
132 if (histogramIsFlat(0.8)) {
133 std::cout <<
"Histogram is flat: f = " << f << std::endl;
139 if (f < exp(1.0 / (countLW + 1))) {
140 std::cout <<
"Beginning non-exponential regime." << std::endl;
141 exponentialRegime =
false;
143 f = exp(1.0 / (countLW + 1));
146 f = exp(1.0 / (countLW + 1));
148 return theta(currentEnergyIndex,currentDensityIndex) / theta(proposedEnergyIndex,proposedDensityIndex);
156 int sum = histogram.sum();
157 int size= histogram.size()-mask.template cast<int>().sum();
159 std::vector<double> flatnessMeasure;
167 for(
int i=0; i<histogram.rows(); ++i)
169 for(
int j=0; j<histogram.cols(); ++j)
172 flatnessMeasure.push_back(abs((
double) histogram(i,j)/ sum - 1. / size));
177 double nonFlatness= *std::max_element(flatnessMeasure.begin(), flatnessMeasure.end())*size/c;
179 std::cout <<
"Flatness measure = " << nonFlatness << std::endl;
189 const double& density,
190 const std::tuple<double,double,int>& energyLimits,
191 const std::tuple<double,double,int>& densityLimits)
193 const auto& [minEnergy,maxEnergy,numberOfEnergyStates]= energyLimits;
194 const auto& [minDensity,maxDensity,numberOfDensityStates]= densityLimits;
195 double deltaE= (maxEnergy - minEnergy) / numberOfEnergyStates;
196 double deltarho= (maxDensity - minDensity) / numberOfDensityStates;
198 int energyIndex = floor((
energy - minEnergy) / deltaE);
199 int densityIndex = floor((density- minDensity) / deltarho);
200 if (energyIndex >= 0 && energyIndex < numberOfEnergyStates &&
201 densityIndex >= 0 && densityIndex < numberOfDensityStates)
202 return std::make_tuple(energyIndex,densityIndex,
true);
204 return std::make_tuple(energyIndex,densityIndex,
false);
209 const int& numberOfDensityStates)
211 Eigen::Matrix<bool,Eigen::Dynamic,Eigen::Dynamic> output(numberOfEnergyStates,numberOfDensityStates);
214 file.open(
"mask.txt");
217 std::cout <<
"File mask.txt not found.";
220 while(std::getline(file,line)) {
221 std::stringstream s(line);
222 for (
int j = 0; j < numberOfDensityStates; ++j)
227 std::cout <<
"mask = " << std::endl;
228 std::cout << output << std::endl;
235 std::map<StateType, std::pair<double,double>> output;
237 file.open(
"energyDensityLW.txt");
244 while(std::getline(file,line)) {
245 std::stringstream s(line);
246 s >> density; s >>
energy;
248 std::vector<int> tempVector;
250 tempVector.push_back(temp);
252 StateType state(tempVector.size());
253 for (
int i=0; i<tempVector.size(); ++i)
254 state(i)= tempVector[i];
256 output[state]= std::make_pair(density,
energy);
263 std::cout <<
"Number of pre-computed states = " << output.size() << std::endl;
272 Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> outputTheta(mask.rows(),mask.cols());
274 file.open(
"theta.txt");
277 std::cout <<
"File theta.txt not found. Setting a uniform distribution for theta";
278 outputTheta.setOnes();
281 outputTheta.setZero();
283 while(std::getline(file,line)) {
284 std::stringstream s(line);
293 outputTheta(lno,j)= temp;
296 if (lno != -1 && j != mask.cols())
297 throw(std::runtime_error(
"Error reading row in theta.txt") );
300 if (lno != mask.rows())
301 throw(std::runtime_error(
"Error reading column in theta.txt") );
306 double outputThetaNorm= 0.0;
307 for(
int i=0; i<outputTheta.rows(); ++i)
309 for(
int j=0; j<outputTheta.cols(); ++j)
312 outputThetaNorm+= abs(outputTheta(i,j));
314 outputTheta(i,j)= 0.0;
317 outputTheta= outputTheta/outputThetaNorm;
318 std::cout <<
"f = " << f << std::endl;
319 std::cout <<
"theta = " << std::endl;
320 std::cout << outputTheta << std::endl;