From: Dariusz Murakowski Date: Thu, 25 Jun 2015 23:56:59 +0000 (-0400) Subject: Check number of inserted sites. Use unsigned int instead of size_t. X-Git-Url: http://src.murakowski.org/?a=commitdiff_plain;h=1b918d2b1b641dde3580a0793c312fea9a33d03c;p=VirEvoDyn.git Check number of inserted sites. Use unsigned int instead of size_t. --- diff --git a/ham_ss.cpp b/ham_ss.cpp index 573b355..0fb6dad 100644 --- a/ham_ss.cpp +++ b/ham_ss.cpp @@ -290,28 +290,28 @@ void PottsHamiltonian::coarse_grain(const std::vector &aa_seq, PottsState &c // some sites are // Returns the number of elements inserted into J. -int PottsHamiltonian::insertReferenceStates() +unsigned PottsHamiltonian::insertReferenceStates() { // find indices of singular states - std::vector Xidx; + std::vector Xidx; //Xidx.push_back(0); // prepend with 0, for starting interval - for (size_t i = 0; i < state2aa.size(); ++i) { + for (unsigned i = 0; i < state2aa.size(); ++i) { if (state2aa[i].size() == 1) { // state2aa[i] == {aa_X} Xidx.push_back(i); } } //Xidx.push_back(size); // append with size, for ending interval - size_t numX = Xidx.size(); // - 2; - size_t sizeOld = size - numX; + unsigned numX = Xidx.size(); // - 2; + unsigned sizeOld = size - numX; //assert(J.size() == (sizeOld+1)*(sizeOld)/2); // bail out early if no need to insert sites - //if (numX == 0) - // return 0; + if (numX == 0) + return 0; Coupling newJ; - newJ.reserve(J.size() + numX*size - numX*(numX-1)/2); - //newJ.reserve(size*(size+1)/2); + //newJ.reserve(J.size() + numX*size - numX*(numX-1)/2); + newJ.reserve(size*(size+1)/2); Coupling::iterator Jbegin = J.begin(); //Coupling::iterator end = J.begin(); @@ -323,6 +323,8 @@ int PottsHamiltonian::insertReferenceStates() // } //} + unsigned inserted = 0; + unsigned srcBeg = 0; unsigned srcEnd = 0; unsigned Xdone = 0; @@ -331,7 +333,7 @@ int PottsHamiltonian::insertReferenceStates() //unsigned dstBeg = 0; //unsigned dstEnd = 0; // iterate over regions in the destination vector - for (size_t sec = 0; sec < size; ++sec) { + for (unsigned sec = 0; sec < size; ++sec) { unsigned secLen = size - sec; // dst //dstBeg = index(sec,sec+1,size) - size + sec; //equivalently, srcBeg = srcEnd; ... but this may prevent loop unrolling? @@ -341,12 +343,13 @@ int PottsHamiltonian::insertReferenceStates() sectionBeg = srcBeg; copyToEnd = true; //dstBeg = index(sec,sec+1,size) - secLen; - for (size_t i = Xdone; i < numX; ++i) { + for (unsigned i = Xdone; i < numX; ++i) { if (sec <= Xidx[i]) { srcEnd = sectionBeg + Xidx[i] + Xdone - i - sec; // copy newJ.insert(newJ.end(), Jbegin+srcBeg, Jbegin+srcEnd); newJ.push_back(std::vector()); + inserted += 1; // copy from begin to Xidx[i]-sec // copy Xidx[i-1],Xidx[i] + i-1; srcBeg = srcEnd; @@ -354,6 +357,7 @@ int PottsHamiltonian::insertReferenceStates() else if (sec == Xidx[i]+1) { // insert a whole bunch of nothings newJ.insert(newJ.end(), secLen, std::vector()); + inserted += secLen; ++Xdone; // skip this index in subsequent blocks copyToEnd = false; break; @@ -373,7 +377,10 @@ int PottsHamiltonian::insertReferenceStates() } } - int inserted = 0; + if (inserted != numX*size - numX*(numX-1)/2) { + std::cerr << "ERROR in insertReferenceStates: incorrectly calculated padding" << std::endl; + throw "incorrectly calculated correction...."; + } //for (size_t idx = 0; idx < Xidx.size(); ++idx) { // i = Xidx[idx]; // end += i; diff --git a/ham_ss.h b/ham_ss.h index 78a4208..3a8cdec 100644 --- a/ham_ss.h +++ b/ham_ss.h @@ -97,7 +97,7 @@ public: void getCouplings(const std::string &FILENAME); void getSeq2State(const std::string &FILENAME); - int insertReferenceStates(); // XXX + unsigned insertReferenceStates(); // XXX };