ALPS MPS Codes
Reference documentation.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | List of all members
coherent_dm_mps_init< Matrix, SymmGroup > Class Template Reference

#include <mps_initializers.h>

Inheritance diagram for coherent_dm_mps_init< Matrix, SymmGroup >:
mps_initializer< Matrix, SymmGroup >

Public Member Functions

 coherent_dm_mps_init (BaseParameters &params, std::vector< Index< SymmGroup > > const &phys_dims_, std::vector< int > const &site_type_)
 
void operator() (MPS< Matrix, SymmGroup > &mps)
 

Detailed Description

template<class Matrix, class SymmGroup>
class coherent_dm_mps_init< Matrix, SymmGroup >

Definition at line 324 of file mps_initializers.h.

Constructor & Destructor Documentation

template<class Matrix , class SymmGroup >
coherent_dm_mps_init< Matrix, SymmGroup >::coherent_dm_mps_init ( BaseParameters params,
std::vector< Index< SymmGroup > > const &  phys_dims_,
std::vector< int > const &  site_type_ 
)
inline

Definition at line 327 of file mps_initializers.h.

330  : coeff(params["init_coeff"].as<std::vector<double> >())
331  , phys_rho_dims(phys_dims_)
332  , site_type(site_type_)
333  { }

Member Function Documentation

template<class Matrix , class SymmGroup >
void coherent_dm_mps_init< Matrix, SymmGroup >::operator() ( MPS< Matrix, SymmGroup > &  mps)
inlinevirtual

Implements mps_initializer< Matrix, SymmGroup >.

Definition at line 335 of file mps_initializers.h.

336  {
337  using std::sqrt;
338 
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.");
341 
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))) ) );
345 
346  typedef typename SymmGroup::charge charge;
347 
348  using std::exp; using std::sqrt; using std::pow;
349  using boost::math::factorial;
350 
351  size_t L = coeff.size();
352 
353  Index<SymmGroup> trivial_i;
354  trivial_i.insert(std::make_pair(SymmGroup::IdentityCharge, 1));
355 
356  for (int p=0; p<L; ++p) {
357  int s=0;
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);
363  }
365  block.insert_block(m, SymmGroup::IdentityCharge, SymmGroup::IdentityCharge);
366 
367  MPSTensor<Matrix, SymmGroup> t(phys_rho_dims[site_type[p]], trivial_i, trivial_i);
368  t.data() = block;
369 
370  swap(mps[p], t);
371  }
372  }
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)
size_t length() const
Definition: mps.h:58
std::size_t insert(std::pair< charge, std::size_t > const &x)

The documentation for this class was generated from the following file: