Hi Matt and Miles,
I have been looking into the linsolve(A,b,x_0;…) function in ITensorTDVP
that solves the A|x>=|b>
problem using alternating_update
(which basically replaces the eigsolve_updater
in DMRG with a linsolve_updater
) with @srwhite. If we understand correctly based on reducedlinearproblem.jl and reducedconstantterm.jl, the algorithm projects both the operator A
and the constant term |b>
under the basis of |x>
that is being optimized. Graphically the reduced problem is defined as:
*--*--*- -*--*--*--*--*--* <x|
| | | | | | | | | | |
o--o--o--o--o--o--o--o--o--o--o A (A_reduced)
| | | | | | | | | | |
*--*--*- -*--*--*--*--*--* |x>
o--o--o--o--o--o--o--o--o--o--o <b|
| | | | | | | | | | | (|b_reduced>)
*--*--*- -*--*--*--*--*--* |x>
Then A_reduced
and |b_reduced>
is fed into the KrylovKit.linsolve()
together with an initial guess |x_0_reduced>
. It seems to us this algorithm requires that |b>
and the final |x>
share the same MPS basis to some degree. For example, if A
changes the quantum number by a definite amount, say being a C^+
, then either the basis of |x>
needs to be expanded to include a different quantum number sector (which is not necessary since |x>
also has a definite quantum number), or A_reduced
will be zero.
It seems to us more natural to set up the problem in the framework of reducedcontractproblem.jl, such that the reduced problem is:
o--o--o- -o--o--o--o--o--o <b|
| | | | | | | | | | |
o--o--o--o--o--o--o--o--o--o--o A (A_reduced)
| | | | | | | | | | |
*--*--*- -*--*--*--*--*--* |x>
-o--o- (|b_reduced> that is taken out of the sandwich above)
| |
In this way, one seems to avoid the above problem.
Best,
Shengtao