示例#1
0
文件: csf.C 项目: sanshar/StackBlock
//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;
   
}
示例#2
0
	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;
	}
示例#3
0
文件: csf.C 项目: sanshar/StackBlock
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;
   
}