/* Class for treating spins for all the possible configuration (for FIXED composition). Written by k-fleak */ #pragma warning(disable:4786) #include #include #include #include #include #ifndef __SPINBANK_CPP #define __SPINBANK_CPP class SpinBank{ private: int Nconf; std::vector configNow, configOld, configInit; std::vector spinArray; void setInitialConfiguration(std::vector &NatomArray); void printData(std::vector > inputs); static int Nflip; public: SpinBank(std::vector &spinArrayIn, std::vector &NatomArray); ~SpinBank(); int getNconf(); int getNflip(); std::vector > getNextSpin(); std::vector > getInitialSpin(); }; int SpinBank::Nflip = 0; SpinBank::SpinBank(std::vector &spinArrayIn, std::vector &NatomArray){ setInitialConfiguration(NatomArray); for (int i = 0; i < spinArrayIn.size() ; ++i){ spinArray.push_back(spinArrayIn[i]); } } SpinBank::~SpinBank(){} inline int SpinBank::getNconf(){ return Nconf; } inline int SpinBank::getNflip(){ return Nflip; } std::vector > SpinBank::getInitialSpin(){ std::vector > initSpinArray; int stmp; for ( int i = 0; i < configInit.size() ; ++i){ if (configInit[i] != 0){ stmp = spinArray[configInit[i]]; initSpinArray.push_back(std::pair(i, stmp )); } } return initSpinArray; } void SpinBank::setInitialConfiguration(std::vector &NatomArray){ int conf = 0; int ntmp = 0; Nconf = 0; for (int i = 0; i < NatomArray.size(); ++i){ ntmp = NatomArray[i]; for (int j = 0; j < ntmp; ++j){ configNow.push_back(conf); } ++conf; } sort(configNow.begin(), configNow.end()); /// Estimate num of config /// while (next_permutation(configNow.begin(), configNow.end())){ Nconf += 1; } sort(configNow.begin(), configNow.end()); for (int i = 0; i < configNow.size(); ++i){ configInit.push_back(configNow[i]); } } std::vector > SpinBank::getNextSpin(){ std::vector > nextSpinArray; int stmp; configOld.clear(); for (int i = 0; i < configNow.size(); ++i){ configOld.push_back(configNow[i]); } next_permutation(configNow.begin(), configNow.end()); for (int i = 0; i < configNow.size(); ++i){ if (configNow[i] != configOld[i]){ stmp = spinArray[configNow[i]]; nextSpinArray.push_back(std::pair(i, stmp)); Nflip += 1; } } return nextSpinArray; } void SpinBank::printData(std::vector > inputs){ std::vector >::iterator its; its = inputs.begin(); while (its != inputs.end()){ std::cout << (*its).first << " " << (*its).second << std::endl; ++its; } } #endif