Open ejmeitz opened 2 weeks ago
Sorry that this issue flew a bit under the radar. I have to agree with you that translating the language used in the different fields is typically not straightforward, and the biggest headache. My experience with crystal groups is rather limited, and we might try and investigate this a bit further, but let me make a few notes about the kinds of symmetry that TensorKit supports and exploits, such that hopefully you can let me know if these apply to your use-case.
TensorKit specifically constructs tensors that have some "internal" symmetry, rather than "external", in the sense that the symmetry operations act on the individual indices of the tensor (vector spaces), rather than their combination (such as invariance under permutation of indices). In these cases, you can identify a basis for each of the vector spaces that respects the constraints imposed by the symmetry operations, and write more performant algorithms.
This means that in order to build the initial tensor, you would need to identify what parts of the vector space transform according to what irrep of the group, and then fill it up accordingly. (This does not mean that the symmetry has to apply to all elements, the trivial irrep can be used for this)
Afterwards, if all input tensors are constructed in this form, indeed, TensorKit will make use of this structure to speed up your computations, as this structure is preserved under most of the operations you can apply to tensors. (Typically, the ones that can be formulated in a basis-independent way, which precludes things like element-wise (Hadamard) products).
If this sounds like it's applicable, it should indeed be the case that TensorKit might speed up your calculations. We can probably discuss this in a bit more detail then to figure out the correct mapping for your specific problem.
Is there a way that you could provide an explicit example of what you are trying to accomplish.
Does "tensor" in your use case refer to an actual multi-index (i.e. more than 2) object, or is it the notion of tensor as a matrix/linear operator that transforms in a particular way, as is often used in physics, e.g.: energy-momentum tensor, metric tensor, diffusion tensor, electric permittivity tensor, … . These are all two-index objects with indices that range over the basis vectors of 3-dimensional space or 4-dimensional spacetime. If you want to construct such objects, with the imposed constraint that they are invariant under a discrete crystalline subgroup of the SO(3) rotation group, then I am not sure if you are going to gain much. Yes, TensorKit can be used to represent such objects, but you will need to identify how the fundamental SO(3) representation (i.e. the 3-dimensional vector representation) decomposes into the irreps of the subgroup that you want to impose as a symmetry.
This probably belongs on a discussion page....but I work in solid state physics and often have to calculate sparse tensors with very few irreducible entries and I was hoping to use this package to speed up some calculations. The matrix I have is the hessian of potential energy and has very similar structure to the Ising Hamiltonian example in your juliacon talk. However, I am having trouble finding a one-one correspondence between the language used with crystals and the symmetries in this package. There's plenty of libraries for generating the " (discrete) symmetry operations" that a crystal satisfies (e.g. spglib, crystalline.jl), however, the symmetries are usually just returned as 3x3 rotation matrices and 3x1 translation vectors which certain entries in my tensor are invariant to (they do not apply to all entries in the tensor). Then you can write a system of equations from all the symmetry operations and treat the free-parameters as your irreducible components. I do not have a group theory background so I'm sure I'm missing some key language but does this sound like a problem TensorKit can be used to speed up?
From what I understand, TensorKit cannot help me build the initial tensor (i.e. show me how the irreps populate the tensor), but if I can tell TensorKit what symmetries the tensor satisfies contractions etc. will be faster?