QuantumKitHub / MPSKit.jl

A Julia package dedicated to simulating quantum many-body systems using Matrix Product States (MPS)
MIT License
126 stars 28 forks source link

How to apply a single creation/annihilation operator to a finite MPS ? #160

Open Jason-zo opened 1 month ago

Jason-zo commented 1 month ago

Dear Maartenvd,

Thanks for you and other contributors' great work! I have a problem that how to apply a single creation/annihilation operator to a finite MPS and get a new MPS?

Usually, we need not to consider this issue because the creation operator and the annihilation operator's auxiliary legs A are connected (TensorMap(..., V ← V $\otimes$ A) and TensorMap(..., A $\otimes$ V ← V) ) that constructs a single site or two sites operator like $\hat{O_i}=c^\dagger_i ci$ or $\hat{O{ij}} = c^\dagger_i c_j$. In this case, it is easy to calculate expectation or correlation value $\langle 0|\hat{O}|0\rangle$.

However, when it comes to the time evolution, such as $\langle 0|S^+(t) S^-(0) |0\rangle$ or $\langle 0|c(t) c^\dagger(0) |0\rangle$, the above question makes sense that we need to evolve the MPS $S^- |0\rangle$ or $c^\dagger |0\rangle$ into $e^{-iHt} S^- |0\rangle$ or $e^{-iHt}c^\dagger|0\rangle$.

To obtain the new MPS ($S^- |0\rangle$ or $c^\dagger |0\rangle$), one need to deal with the single auxiliary vector space A of the creation/annihilation operator. Please forgive me as a beginner, my naive idea is to add identity operators on the other sites, where the left and right virtual spaces of the identity operators are the auxiliary vector space A. I construct

$c^\dagger_1 \mathbb{1}_2$ $c_1 \mathbb{1}_2$

as

    ID1 = TensorMap(ones, ComplexF64, As ⊗ Ps ← Ps)
    ID2 = TensorMap(ones, ComplexF64, Ps ← As ⊗ Ps)
    if ifdagger
        @planar twosite[-1 -2; -3 -4] := c⁺[-1; -3 1] * ID1[1 -2; -4]
    else
        @planar twosite[-1 -2; -3 -4] := c[-1 1; -3] * ID2[-2; 1 -4]
    end
    return FiniteMPO(twosite)

and

$c^\dagger_1 \mathbb{1}_2 \mathbb{1}_3 \mathbb{1}_4$ $c_1 \mathbb{1}_2 \mathbb{1}_3 \mathbb{1}_4$

as

    ID1 = TensorMap(ones, ComplexF64, As ⊗ Ps ← Ps)
    ID14 = TensorMap(ones, ComplexF64, As ⊗ Ps ← Ps ⊗ As)
    ID2 = TensorMap(ones, ComplexF64, Ps ← As ⊗ Ps)
    ID24 = TensorMap(ones, ComplexF64, Ps ⊗ As ← As ⊗ Ps)
    if ifdagger
        @planar foursite[-1 -2 -3 -4; -5 -6 -7 -8] := c⁺[-1; -5 1] * ID14[1 -2; -6 2] * ID14[2 -3; -7 3] * ID1[3 -4; -8]
    else
        @planar foursite[-1 -2 -3 -4; -5 -6 -7 -8] := c[-1 1; -5] * ID24[-2 2; 1 -6] * ID24[-3 3; 2 -7] * ID2[-4; 3 -8]
    end
    return FiniteMPO(foursite)

I check it by taking the inner product: I wish dot(ψ₀2, $c^\dagger_1 \mathbb{1}_2$ $c_1 \mathbb{1}_2$, ψ₀2)=1 and dot(ψ₀4, $c^\dagger_1 \mathbb{1}_2 \mathbb{1}_3 \mathbb{1}_4$ $c_1 \mathbb{1}_2 \mathbb{1}_3 \mathbb{1}_4$, ψ₀4)=1 (both ψ₀2 and ψ₀4 have one particle per site), however, I got dot(ψ₀2, $c^\dagger_1 \mathbb{1}_2$ $c_1 \mathbb{1}_2$, ψ₀2)=1 and dot(ψ₀4, $c^\dagger_1 \mathbb{1}_2 \mathbb{1}_3 \mathbb{1}_4$ $c_1 \mathbb{1}_2 \mathbb{1}_3 \mathbb{1}_4$, ψ₀4) $\neq$ 1.

I am not sure if this is the right way to deal with this problem and I would be very grateful for your help.

Thanks!

lkdvos commented 1 month ago

Hi Jason,

This is a good question, as it has quite a lot of subtle details. Let me start by mentioning that while your approach is a good attempt, but will not produce the correct results. The problem is that this auxiliary space really does change the structure of the tensors, and it is not possible to create an identity operator that has an odd auxiliary charge. The reason is that the total charge of a tensor needs to be trivial, such that this "identity" you created actually will exchange even with odd, and is actually some kind of flip operator.

I don't think we currently have a good system to deal with these kind of setups. In principle, the state you try to create is charged, i.e. the total charge is not trivial. Thus, to create these MPSs, the MPS should have an auxiliary index that carries this charge, i.e. one of the mps tensors should have an additional charged index. In MPSKit, we can absorb this charged index in the last index of the final mps tensor, or the first index of the first mps tensor, as these already are auxiliary spaces, but there is currently no automated method to create these states. I attached a small drawing to clarify what I mean.

This is definitely something that is on my to-do list, but I currently have some other things I need done first, so it might take me a while to get back to this (say a couple weeks). If you manage to implement it yourself, I would be more than happy to check, or answer additional questions to help out. I'll definitely keep this issue open, such that I am reminded to get this done.

Notebook 7 - page 41

Jason-zo commented 1 month ago

Hi Lukas,

Thank you for the prompt and kind response, and the ideas you conceived! I will try to resolve this issue and share with you my difficulties or progress.