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