Estou procurando uma biblioteca de tensores C ++ que suporte código independente de dimensão. Especificamente, preciso executar operações ao longo de cada dimensão (até 3), por exemplo, calcular uma soma ponderada. As dimensões são um parâmetro de modelo (e, portanto, uma constante em tempo de compilação). Outra restrição é que a biblioteca deve ser relativamente leve, mais no estilo Eigen / Boost do que no Trilinos / PETSc.
Alguma sugestão?
Nota: dei uma olhada no Eigen e acho que ele quase se encaixa exatamente no perfil, se não estivesse limitado aos tensores 2D. Se eu estiver enganado, corrija-me.
Eu acho que essa nova
taco
lib também é muito boa.O Tensor Algebra Compiler (taco) é uma biblioteca C ++ que calcula expressões de álgebra tensorial em tensores esparsos e densos. Ele usa técnicas inovadoras de compilador para obter desempenho competitivo com kernels otimizados manualmente em bibliotecas amplamente usadas para álgebra de tensor esparso e álgebra linear esparsa.
Você pode usar o taco como uma biblioteca C ++ que permite carregar tensores, ler tensores de arquivos e calcular expressões tensoras. Você também pode usar o taco como um gerador de código que gera funções C que calculam expressões de tensor.
Discussão: https://www.youtube.com/watch?v=Kffbzf9etLE Paper: http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf
fonte
O XTensor é uma abordagem moderna e está se tornando cada vez mais popular. https://github.com/QuantStack/xtensor
fonte
A biblioteca deal.II ( http://www.dealii.org ), embora escrita para propósitos muito maiores, também possui uma sub-biblioteca de classes de tensores que provavelmente faz muito do que você deseja fazer. Em particular, ele usa modelos para a dimensão.
(Aviso: sou um dos principais autores desta biblioteca.)
fonte
A biblioteca Boost.Numeric.uBlas adicionou recentemente uma extensão de tensor fornecida com a versão 1.70 do Boost. Veja https://github.com/boostorg/ublas . Ele fornece operações padrão de matriz e tensor com ordem variável de tempo de execução (número de dimensões), dimensões para os formatos de armazenamento de primeira e última ordem (coluna e linha principais). Você também pode usar facilmente a convenção de somatória de Einstein para expressar multiplicações arteriais de tensores. O Boost.Numeric.uBlas é apenas um cabeçalho e fácil de integrar em projetos existentes.
fonte
Eu não o usei, mas o libtensor parece atender aos seus requisitos.
fonte
esta é uma biblioteca C ++ de matriz multidimensional https://github.com/ContinuumIO/libdynd
fonte
LTensor ( https://code.google.com/p/ltensor/ ) é uma biblioteca de modelos C ++ MUITO fácil de usar para tensores até a classificação 4 (com base em notação indical), rápida e leve também. Você não precisa compilar nada, apenas incluir o arquivo de cabeçalho principal. Eu usei em vários projetos e funcionou bem.
Ele possui alguns recursos internos para tensores de nível 2, como solucionadores lineares, decomposições de svd, LU e Cholesky etc. Não usei nenhum deles (usei outras bibliotecas para isso).
fonte
Há também ITensor (requer C ++ 17).
fonte