Jutho/TensorKit.jl

Vectors/Covectors

jack-dunham opened this issue · 2 comments

Hi there,

Thanks for all your work producing this package. Forgive me if this is a silly question as I am fairly new to tensor networks and my maths knowledge is very lacking.
I wish to construct what is effectively a vector that lives in some representation space of a certain group. Specifically, I would like to construct a vector living in the space

space = (U1Space(-1=>1)  U1Space(1=>1))  (U1Space(-1=>1)  U1Space(1=>1))

Of course this product space is isomorphic to the space U1Space(-2=>1, 0=>2, 2=>1), however I require the product structure.

Using the Tensor constructer like Tensor(data, space) does not allow me to have elements of charge 2 or -2, only of charge 0. The underlying data I want in my tensor is something like

TensorKit.SortedVectorDict{U1Irrep, Matrix{ComplexF64}} with 3 entries:
  0  => [0.0+0.0im; 0.0 + 0.0im;;]
  2  => [0.0+0.0im;;]
  -2 => [0.0+0.0im;;]

however when providing this data as data to Tensor(data, space), the data in the blocks corresponding to charge -2 and 2 are lost without warning. To be honest, I don't really understand what a Tensor (i.e. TensorMap with no domain) is in the context of symmetric tensors, so please let me know if there is a good reason for this (something to do with conservation of charge?)

So my question is, is this the intended behaviour? And if so, is there anyway to achieve what I want using the tools provided by TensorKit? If the first is true and the second false, do you think adding new data types like Vector and Covector would be a worthwhile endeavour?

Cheers,
Jack

Jutho commented

Dear @jack-dunham , thanks for your detailed and valid question. It seems to me that you understand most of the notation and underlying theory perfectly fine, so no need to blame your question on a lack of knowledge.

The main point in answering your question is that tensors are constrained to be invariant under the action of the symmetry. As you say correctly, the space in which your tensor lives is equivalent to U1Space(-2=>1, 0=>2, 2=>1). However, in order to be invariant, it can only have a component in the representation 0 subspace of this space. Some other tensor packages allow a tensor to have a global charge. With those, you could choose for your tensor to have charge -2, charge 0, or charge 2. Still, you would only be able to store only one of the blocks, not all three of them. The reason that TensorKit.jl does not have this functionality, is that it does not extend well to non-abelian symmetries or beyond-group symmetries (fusion categories). Having a charge is like having an extra one-dimensional index in the tensor, for example in the domain, which carries that charge. But as soon as this is a higher-dimensional irrep of some non-abelian group, that index is no longer one-dimensional and can thus not be 'ignored'.

But as mentioned, even giving tensors an intrinsic "charge" would not suffice for your use case. I am curious, as to what it is you want to do exactly. It seems like you do want to have the structure that comes from the symmetry explicitly available, but without being able to benefit from the reduced cost that you can gain by restricting to symmetric tensors explicitly.

Thank you!

Your reply and detailed explanation has dug me out of a hole and helped me see the bigger picture. I am indeed interested in symmetric tensors as these are the ones belonging to the trivial irrep subspace. My use case is finding steady states of Louivillian super-operators; these belong to the trivial irrep subspace, and thus are symmetric.

I basically got hung up thinking about sectors and blocks in isolation, rather than considering the underlying symmetry that those are a consequence of.

Cheers, I will close this now.