SyTen

◆ apply_op_itrunc() [2/2]

SRDef syten::MPS::apply_op_itrunc ( State a,
Operator const &  op,
Truncation  trunc,
bool const  relax = true,
bool const  final_rightnorm = true 
)

Applies the MPO op to the MPS a, immediately truncating during the application.

Parameters
[in,out]athe MPS to which the operator is applied
[in]opthe MPO which is applied to the state
[in]truncTruncation specification
[in]relaxwhether to relax the truncation spec during the initial left-to-right sweep
[in]final_rightnormif false, don't do a right-normalisation at the end
Returns
the error incurred during truncation. Only a rough estimate.

Steps taken:

  • Right-normalise the state without truncation
  • On the first site, contract the MPS and MPO, then left-normalise using a (relaxed) truncation spec.
  • On every other site, multiply the left-over truncator from the previous site into the left isometry before contracting MPO and MPS components on that site, then normalise with the same procedure as on the first site.
  • On the last site, do not normalise the state.
  • Right-normalise and truncate with the supplied truncation specification.
Remarks
In principle, it would be possible to insert further SVDs, in particular on the two legs of (FAW) to the right. The singular value tensors could then be multiplied into the splitting coming from the right and another SVD could work on the splitting tensor instead of the whole tensor. However, this does require three SVDs of comparable cost instead of a single one, so it’s unlikely to be any faster.

References syten::MPS::Operator::dIdx, syten::MPS::State::dropUnmatched(), syten::genCombinator(), syten::genFuse(), syten::genSplit(), syten::MPS::Operator::lIdx, syten::MPS::State::lIdx, syten::MPS::State::lInt, syten::Truncation::maxBlocksize, syten::Truncation::maxStates, syten::MPS::State::maybeCache(), norm(), syten::MPS::Operator::rIdx, syten::MPS::State::rIdx, syten::MPS::State::rightnorm(), syten::MPS::State::rInt, syten::MPS::State::size(), syten::SVD::svd(), SYTEN_ASSERT, syten::Truncation::threshold, syten::MPS::Operator::uIdx, syten::MPS::State::uInt, and syten::validateTensorEdge().

+ Here is the call graph for this function: