339 assert(coeff.size() == mps.
length());
340 if (phys_rho_dims[0].size() != 1)
throw std::runtime_error(
"coherent_dm_mps_init only for TrivialGroup.");
342 std::vector<Index<SymmGroup> > phys_psi_dims(phys_rho_dims.size());
343 for (
int type=0; type<phys_rho_dims.size(); ++type)
344 phys_psi_dims[type].insert( std::make_pair( SymmGroup::IdentityCharge, static_cast<size_t>(
sqrt(
double(phys_rho_dims[type][0].second))) ) );
346 typedef typename SymmGroup::charge charge;
348 using std::exp;
using std::sqrt;
using std::pow;
349 using boost::math::factorial;
351 size_t L = coeff.size();
354 trivial_i.
insert(std::make_pair(SymmGroup::IdentityCharge, 1));
356 for (
int p=0; p<L; ++p) {
358 Matrix m(phys_rho_dims[site_type[p]][s].second, 1, 0.);
359 for (
int ss1=0; ss1<phys_psi_dims[site_type[p]][s].second; ++ss1)
360 for (
int ss2=0; ss2<phys_psi_dims[site_type[p]][s].second; ++ss2) {
361 m(ss1*phys_psi_dims[site_type[p]][s].second+ss2, 0) = pow(coeff[p], ss1) *
sqrt(factorial<double>(ss1)) / factorial<double>(ss1);
362 m(ss1*phys_psi_dims[site_type[p]][s].second+ss2, 0) *= pow(coeff[p], ss2) *
sqrt(factorial<double>(ss2)) / factorial<double>(ss2);
365 block.
insert_block(m, SymmGroup::IdentityCharge, SymmGroup::IdentityCharge);
void swap(MPSTensor< Matrix, SymmGroup > &x, MPSTensor< Matrix, SymmGroup > &y)
size_type insert_block(Matrix const &, charge, charge)
block_matrix< Matrix, SymmGroup > sqrt(block_matrix< Matrix, SymmGroup > m)
std::size_t insert(std::pair< charge, std::size_t > const &x)