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

#include <mpo_contractor_ss.h>

Public Member Functions

 mpo_contractor_ss (MPS< Matrix, SymmGroup > const &mps_, MPO< Matrix, SymmGroup > const &mpo_, BaseParameters &parms_)
 
std::pair< double, double > sweep (int sweep)
 
void finalize ()
 
MPS< Matrix, SymmGroup > get_original_mps () const
 
MPS< Matrix, SymmGroup > get_current_mps () const
 

Detailed Description

template<class Matrix, class SymmGroup, class Storage>
class mpo_contractor_ss< Matrix, SymmGroup, Storage >

TODO: 1) implement two-site time evolution. (single-site is stuck in initial MPS structure) 2) implement zip-up compression. E. M. Stoudenmire and S. R. White, New Journal of Physics 12, 055026 (2010).

Definition at line 70 of file mpo_contractor_ss.h.

Constructor & Destructor Documentation

template<class Matrix, class SymmGroup, class Storage>
mpo_contractor_ss< Matrix, SymmGroup, Storage >::mpo_contractor_ss ( MPS< Matrix, SymmGroup > const &  mps_,
MPO< Matrix, SymmGroup > const &  mpo_,
BaseParameters parms_ 
)
inline

Definition at line 73 of file mpo_contractor_ss.h.

76  : mps(mps_)
77  , mpsp(mps_)
78  , mpo(mpo_)
79  , parms(parms_)
80  {
81  mps.canonize(0);
82  init_left_right(mpo);
83 
84  mpsp = mps;
85  }

Member Function Documentation

template<class Matrix, class SymmGroup, class Storage>
void mpo_contractor_ss< Matrix, SymmGroup, Storage >::finalize ( )
inline

Definition at line 150 of file mpo_contractor_ss.h.

151  {
152  mpsp[0].normalize_right(DefaultSolver());
153  }
template<class Matrix, class SymmGroup, class Storage>
MPS<Matrix, SymmGroup> mpo_contractor_ss< Matrix, SymmGroup, Storage >::get_current_mps ( ) const
inline

Definition at line 156 of file mpo_contractor_ss.h.

156 { return mpsp; }
template<class Matrix, class SymmGroup, class Storage>
MPS<Matrix, SymmGroup> mpo_contractor_ss< Matrix, SymmGroup, Storage >::get_original_mps ( ) const
inline

Definition at line 155 of file mpo_contractor_ss.h.

155 { return mps; }
template<class Matrix, class SymmGroup, class Storage>
std::pair<double,double> mpo_contractor_ss< Matrix, SymmGroup, Storage >::sweep ( int  sweep)
inline

Definition at line 87 of file mpo_contractor_ss.h.

88  {
89  boost::chrono::high_resolution_clock::time_point sweep_now = boost::chrono::high_resolution_clock::now();
90 
91  std::size_t L = mps.length();
92 
93  std::pair<double,double> eps;
95  norm_boudary.insert_block(Matrix(1, 1, 1), SymmGroup::IdentityCharge, SymmGroup::IdentityCharge);
96 
97  for (int _site = 0; _site < 2*L; ++_site)
98  {
99  int site, lr;
100  if (_site < L) {
101  site = _site;
102  lr = 1;
103  } else {
104  site = 2*L-_site-1;
105  lr = -1;
106  }
107 
108  SiteProblem<Matrix, SymmGroup> sp(mps[site], left_[site], right_[site+1], mpo[site]);
109  ietl::mult(sp, mps[site], mpsp[site]);
110 
111  if (lr == +1) {
112  if (site < L-1) {
114  t = mpsp[site].normalize_left(DefaultSolver());
115  mpsp[site+1].multiply_from_left(t);
116  }
117 
118  left_[site+1] = contraction::overlap_mpo_left_step(mpsp[site], mps[site], left_[site], mpo[site]);
119  norm_boudary = contraction::overlap_left_step(mpsp[site], MPSTensor<Matrix,SymmGroup>(mpsp[site]), norm_boudary);
120  } else if (lr == -1) {
121  if (site > 0) {
123  t = mpsp[site].normalize_right(DefaultSolver());
124  mpsp[site-1].multiply_from_right(t);
125  }
126 
127  right_[site] = contraction::overlap_mpo_right_step(mpsp[site], mps[site], right_[site+1], mpo[site]);
128  norm_boudary = contraction::overlap_right_step(mpsp[site], MPSTensor<Matrix,SymmGroup>(mpsp[site]), norm_boudary);
129  }
130 
131  if (_site == L-1) {
132  double nn = maquis::real( norm_boudary.trace() );
133  eps.first = nn - 2.*maquis::real(left_[L][0].trace());
134 
135  /// prepare backward sweep
136  norm_boudary = block_matrix<Matrix, SymmGroup>();
137  norm_boudary.insert_block(Matrix(1, 1, 1), mps[L-1].col_dim()[0].first, mps[L-1].col_dim()[0].first);
138  }
139 
140  if (_site == 2*L-1) {
141  double nn = maquis::real( norm_boudary.trace() );
142  eps.second = nn - 2.*maquis::real(right_[0][0].trace());
143  }
144 
145  }
146 
147  return eps; /// note: the actual eps contain a constant, which is not important here.
148  }
static block_matrix< OtherMatrix, SymmGroup > overlap_right_step(MPSTensor< Matrix, SymmGroup > const &bra_tensor, MPSTensor< Matrix, SymmGroup > const &ket_tensor, block_matrix< OtherMatrix, SymmGroup > const &right, block_matrix< OtherMatrix, SymmGroup > *localop=NULL)
Definition: contractions.h:71
size_type insert_block(Matrix const &, charge, charge)
static Boundary< OtherMatrix, SymmGroup > overlap_mpo_right_step(MPSTensor< Matrix, SymmGroup > const &bra_tensor, MPSTensor< Matrix, SymmGroup > const &ket_tensor, Boundary< OtherMatrix, SymmGroup > const &right, MPOTensor< Matrix, SymmGroup > const &mpo)
Definition: contractions.h:386
scalar_type trace() const
static block_matrix< OtherMatrix, SymmGroup > overlap_left_step(MPSTensor< Matrix, SymmGroup > const &bra_tensor, MPSTensor< Matrix, SymmGroup > const &ket_tensor, block_matrix< OtherMatrix, SymmGroup > const &left, block_matrix< OtherMatrix, SymmGroup > *localop=NULL)
Definition: contractions.h:41
block_matrix< Matrix, SymmGroup >::scalar_type trace(block_matrix< Matrix, SymmGroup > const &m)
static Boundary< OtherMatrix, SymmGroup > overlap_mpo_left_step(MPSTensor< Matrix, SymmGroup > const &bra_tensor, MPSTensor< Matrix, SymmGroup > const &ket_tensor, Boundary< OtherMatrix, SymmGroup > const &left, MPOTensor< Matrix, SymmGroup > const &mpo)
Definition: contractions.h:340
void mult(SiteProblem< Matrix, SymmGroup > const &H, MPSTensor< Matrix, SymmGroup > const &x, MPSTensor< Matrix, SymmGroup > &y)
alps::numeric::real_type< T >::type real(T f)
Definition: bindings.hpp:38

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