//this version of the code is used when DMRG is no spin adapted std::vector<SpinAdapted::Csf > SpinAdapted::CSFUTIL::spinfockstrings(const std::vector<int>& orbs) { std::vector<Csf > singleSiteCsf; std::vector<int> numcsfs; std::vector< std::vector<Csf> > singleSiteLadder; int numCsfSoFar = 0; for (int i=0; i<orbs.size(); i++) { std::vector< Csf> thisSiteCsf; int I = orbs[i]; IrrepSpace Irrep = SymmetryOfSpatialOrb(orbs[i]); SpinQuantum sQ(1, SpinSpace(1), Irrep); int irrepsize = Symmetry::sizeofIrrep(Irrep.getirrep()); std::vector<Csf> ladderentry; std::map<Csf, std::vector<Csf> > laddermap; std::vector<bool> occ_rep1(Slater().size(),0), occ_rep2(Slater().size(),0), occ_rep3(Slater().size(), 0), occ_rep4(Slater().size(), 0); occ_rep2[dmrginp.spatial_to_spin()[I]] = 1; occ_rep3[dmrginp.spatial_to_spin()[I]+1] = 1; occ_rep4[dmrginp.spatial_to_spin()[I]] = 1;occ_rep4[dmrginp.spatial_to_spin()[I]+1] = 1; Slater s1(occ_rep1, 1), s2(occ_rep2, 1), s3(occ_rep3, 1), s4(occ_rep4, 1); map<Slater, double > m1, m2, m3, m4; m1[s1]= 1.0; m2[s2] = 1.0; m3[s3]= 1.0; m4[s4] = 1.0; thisSiteCsf.push_back( Csf(m1, 0, SpinSpace(0), 0, IrrepVector(0,0))); //0,0,0 thisSiteCsf.push_back( Csf(m2, 1, SpinSpace(1), 1, IrrepVector(Irrep.getirrep(), irrepsize-1))); //1,1,L thisSiteCsf.push_back( Csf(m3, 1, SpinSpace(-1), -1, IrrepVector(Irrep.getirrep(), irrepsize-1))); //1,1,L thisSiteCsf.push_back( Csf(m4, 2, SpinSpace(0), 0, IrrepVector(0, 0))); //2,0,0 numcsfs.push_back(thisSiteCsf.size()); for (int i=0; i<thisSiteCsf.size(); i++) singleSiteCsf.push_back( thisSiteCsf[i]); } std::vector<Csf> prevoutput, output; for (int i=0; i<numcsfs[0]; i++) output.push_back(singleSiteCsf[i]); int csfindex = numcsfs[0]; for (int i2=1; i2<orbs.size(); i2++) { for (int i=0; i<output.size(); i++) { prevoutput.push_back(output[i]); } output.clear(); for (int j=0; j<prevoutput.size(); j++) { for (int k=0; k<numcsfs[i2]; k++) { CSFUTIL::TensorProduct(prevoutput[j], singleSiteCsf[csfindex+k], output); } } prevoutput.clear(); csfindex += numcsfs[i2]; } std::vector<int> sortvec(output.size()); for (int i=0; i<output.size(); i++) sortvec[i] = i; std::sort(sortvec.begin(), sortvec.end(), sorter<Csf>(output)); std::sort(output.begin(), output.end()); return output; }
std::ostream & toStream( std::ostream & out, uint64_t refpos, std::string const & refidname, int const refbase, ConsensusAux & caux, ConsensusAccuracy * consacc = 0, std::ostream * consostr = 0 ) { // insertions if ( I.size() ) { uint64_t const cov = V.size() + iadd; uint64_t maxi = 0; for ( uint64_t i = 0; i < I.size(); ++i ) maxi = std::max(maxi,static_cast<uint64_t>(I[i].size())); // vector of active indices std::vector<uint64_t> active(I.size()); for ( uint64_t i = 0; i < active.size(); ++i ) active[i] = i; // vector for symbol sorting std::vector< std::pair<char,uint8_t> > sortvec(active.size()); for ( uint64_t j = 0; active.size(); ++j ) { // number still active in next round uint64_t o = 0; sortvec.resize(active.size()); for ( uint64_t i = 0; i < active.size(); ++i ) { sortvec[i] = I[active[i]][j]; if ( j+1 < I[active[i]].size() ) active[o++] = active[i]; } active.resize(o); std::sort(sortvec.begin(),sortvec.end()); out << refidname << '\t' << refpos << '\t' << (-static_cast<int64_t>(maxi))+static_cast<int64_t>(j) << '\t'; if ( cov > sortvec.size() ) for ( uint64_t i = 0; i < cov-sortvec.size(); ++i ) { out.put(padsym); caux.C[padsym] += caux.M[padsym]; } for ( uint64_t i = 0; i < sortvec.size(); ++i ) { out.put(sortvec[i].first); caux.C[sortvec[i].first] += caux.M[sortvec[i].first]; } out.put('\t'); uint8_t const consbase = getConsensusBase(caux); out.put(consbase); if ( consostr && consbase != padsym ) consostr->put(consbase); if ( consacc && consbase != padsym ) consacc->insertions++; out.put('\n'); if ( cov > sortvec.size() ) for ( uint64_t i = 0; i < cov-sortvec.size(); ++i ) caux.C[padsym] -= caux.M[padsym]; for ( uint64_t i = 0; i < sortvec.size(); ++i ) caux.C[sortvec[i].first] -= caux.M[sortvec[i].first]; } } std::sort(V.begin(),V.end()); out << refidname << '\t' << refpos << '\t' << 0 << '\t'; for ( uint64_t i = 0; i < V.size(); ++i ) { out.put(V[i].first); caux.C[V[i].first] += caux.M[V[i].first]; } out << "\t"; if ( refbase != -1 ) out.put(refbase); out.put('\t'); uint8_t const consbase = getConsensusBase(caux); if ( consacc && (consbase == padsym) ) { consacc->deletions++; consacc->depthhistogram(0); } if ( refbase != -1 && consacc && (consbase != padsym) ) { if ( consbase == refbase && ( consbase == 'a' || consbase == 'A' || consbase == 'c' || consbase == 'C' || consbase == 'g' || consbase == 'G' || consbase == 't' || consbase == 'T' ) ) consacc->matches++; else consacc->mismatches++; consacc->depthhistogram(V.size()); } out.put(consbase); if ( consostr && consbase != padsym ) consostr->put(consbase); out.put('\n'); for ( uint64_t i = 0; i < V.size(); ++i ) caux.C[V[i].first] -= caux.M[V[i].first]; for ( uint64_t i = 0; i < caux.C.size(); ++i ) assert ( caux.C[i] == 0 ); if ( consacc ) consacc->refbasesprocessed++; return out; }
std::vector<SpinAdapted::Csf > SpinAdapted::CSFUTIL::spinfockstrings(const std::vector<int>& orbs, std::vector< std::vector<Csf> >& ladders) { std::vector<Csf > singleSiteCsf; std::vector<int> numcsfs; std::vector< std::vector<Csf> > singleSiteLadder; int numCsfSoFar = 0; for (int i=0; i<orbs.size(); i++) { std::vector< Csf> thisSiteCsf; int I = orbs[i]; std::vector<TensorOp> tensorops(1, TensorOp(I, 1)); IrrepSpace Irrep = SymmetryOfSpatialOrb(orbs[i]); SpinQuantum sQ(1, SpinSpace(1), Irrep); int irrepsize = Symmetry::sizeofIrrep(Irrep.getirrep()); std::vector<Csf> ladderentry; std::map<Csf, std::vector<Csf> > laddermap; std::vector<bool> occ_rep1(Slater().size(),0), occ_rep2(Slater().size(),0); occ_rep2[dmrginp.spatial_to_spin()[I]+2*irrepsize-2] = 1; Slater s1(occ_rep1, 1), s2(occ_rep2, 1); map<Slater, double > m1, m2; m1[s1]= 1.0; m2[s2] = 1.0; if ( (dmrginp.calc_type() != RESPONSELCC && dmrginp.calc_type() != RESPONSEAAAV && dmrginp.calc_type() != RESPONSEAAAC) && find(dmrginp.get_openorbs().begin(), dmrginp.get_openorbs().end(), I) != dmrginp.get_openorbs().end() ) { thisSiteCsf.push_back( Csf(m1, 0, SpinSpace(0), 0, IrrepVector(0,0))); //0,0,0 ladderentry.push_back(Csf(m1, 0, SpinSpace(0), 0, IrrepVector(0,0))); singleSiteLadder.push_back(ladderentry); numcsfs.push_back(thisSiteCsf.size()); for (int i=0; i<thisSiteCsf.size(); i++) singleSiteCsf.push_back( thisSiteCsf[i]); continue; } else if ( (dmrginp.calc_type() != RESPONSELCC && dmrginp.calc_type() != RESPONSEAAAV && dmrginp.calc_type() != RESPONSEAAAC)&& find(dmrginp.get_closedorbs().begin(), dmrginp.get_closedorbs().end(), I) != dmrginp.get_closedorbs().end()) { std::vector<bool> occ_rep(Slater().size(),0); occ_rep[dmrginp.spatial_to_spin()[I]+2*irrepsize-2] = 1; occ_rep[dmrginp.spatial_to_spin()[I]+2*irrepsize-1] = 1; Slater s(occ_rep, 1); map<Slater, double > m; m[s]= 1.0; thisSiteCsf.push_back( Csf(m, 2, SpinSpace(0), 0, IrrepVector(0,0))); //2,0,0 ladderentry.push_back(Csf(m, 2, SpinSpace(0), 0, IrrepVector(0,0))); singleSiteLadder.push_back(ladderentry); numcsfs.push_back(thisSiteCsf.size()); for (int i=0; i<thisSiteCsf.size(); i++) singleSiteCsf.push_back( thisSiteCsf[i]); continue; } else if(dmrginp.hamiltonian() == HEISENBERG) { thisSiteCsf.push_back( Csf(m2, 1, SpinSpace(1), 1, IrrepVector(Irrep.getirrep(), irrepsize-1))); //1,1,L for (int i=tensorops[0].Szops.size(); i> 0; i--) ladderentry.push_back(applyTensorOp(tensorops[0], i-1)); singleSiteLadder.push_back(ladderentry); numcsfs.push_back(thisSiteCsf.size()); for (int i=0; i<thisSiteCsf.size(); i++) singleSiteCsf.push_back( thisSiteCsf[i]); continue; } thisSiteCsf.push_back( Csf(m1, 0, SpinSpace(0), 0, IrrepVector(0,0))); //0,0,0 thisSiteCsf.push_back( Csf(m2, 1, SpinSpace(1), 1, IrrepVector(Irrep.getirrep(), irrepsize-1))); //1,1,L ladderentry.push_back(Csf(m1, 0, SpinSpace(0), 0, IrrepVector(0,0))); singleSiteLadder.push_back(ladderentry); ladderentry.clear(); for (int i=tensorops[0].Szops.size(); i> 0; i--) ladderentry.push_back(applyTensorOp(tensorops[0], i-1)); singleSiteLadder.push_back(ladderentry); //laddermap[singleSiteCsf.back()] = ladderentry; for (int nele = 2; nele < 2*irrepsize+1; nele++) { std::vector<SpinQuantum> quanta; std::vector<TensorOp> newtensorops; for (int i=0; i<tensorops.size(); i++) { quanta = SpinQuantum(nele-1, SpinSpace(tensorops[i].Spin), IrrepSpace(tensorops[i].irrep)) + sQ; for (int j=0; j<quanta.size(); j++) { TensorOp newop = TensorOp(I,1).product(tensorops[i], quanta[j].totalSpin.getirrep(), quanta[j].get_symm().getirrep()); Csf csf = applyTensorOp(newop, newop.Szops.size()-1-newop.Spin); if (!csf.isempty() && csf.norm() >1e-10) { csf.normalize(); if (find(thisSiteCsf.begin(), thisSiteCsf.end(), csf) == thisSiteCsf.end()) { thisSiteCsf.push_back( csf); newtensorops.push_back(newop); std::vector<Csf> ladderentry; for (int k=newop.Szops.size(); k>0 ; k--) ladderentry.push_back(applyTensorOp(newop, k-1)); singleSiteLadder.push_back(ladderentry); //laddermap[csf] = ladderentry; } } } } tensorops = newtensorops; } numcsfs.push_back(thisSiteCsf.size()); for (int i=0; i<thisSiteCsf.size(); i++) singleSiteCsf.push_back( thisSiteCsf[i]); } std::vector<Csf> prevoutput, output; std::vector< std::vector<Csf> > prevladder, ladder; for (int i=0; i<numcsfs[0]; i++) { output.push_back(singleSiteCsf[i]); ladder.push_back(singleSiteLadder[i]); } int csfindex = numcsfs[0]; for (int i2=1; i2<orbs.size(); i2++) { for (int i=0; i<output.size(); i++) { prevoutput.push_back(output[i]); prevladder.push_back(ladder[i]); } output.clear(); ladder.clear(); for (int j=0; j<prevoutput.size(); j++) { for (int k=0; k<numcsfs[i2]; k++) { CSFUTIL::TensorProduct(prevoutput[j], prevladder[j], singleSiteCsf[csfindex+k], singleSiteLadder[csfindex+k], output, ladder); } } prevoutput.clear(); prevladder.clear(); csfindex += numcsfs[i2]; } std::vector<int> sortvec(output.size()); for (int i=0; i<output.size(); i++) sortvec[i] = i; std::sort(sortvec.begin(), sortvec.end(), sorter<Csf>(output)); std::sort(output.begin(), output.end()); for (int i=0; i<output.size(); i++) ladders.push_back(ladder[sortvec[i]]); return output; }