Biblioteca de tensores C ++ rápida e leve para código independente de dimensão

20

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.

Michael Schlottke-Lakemper
fonte

Respostas:

9

O FTensor é uma biblioteca leve, apenas de cabeçalho e totalmente modelo, que inclui notação de soma ergonômica. Foi testado extensivamente nas dimensões 2, 3 e 4, mas deve funcionar bem para qualquer número de dimensões.

Aço de Damasco
fonte
6

Pelo que vale, Eigen tem uma classe Tensor como um módulo não suportado.

http://eigen.tuxfamily.org/dox-devel/unsupported/group_ CXX11 _Tensor__Module.html

Eu não o usei, então não posso dizer mais sobre isso.

A biblioteca de classes do Armadillo possui uma classe de tensores de terceira ordem.

http://arma.sourceforge.net/

Também não usei os recursos tensoriais do Armadillo, mas experimentei as classes matriciais padrão e elas parecem relativamente fáceis de usar e têm bom desempenho.

Bill Greene
fonte
2
Mais especificamente, Armadillo tem a classe Cube , que implementa 3º tensores de ordem
Mtall
6

Eu acho que essa nova tacolib 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

Dhi Aurrahman
fonte
2
Bem-vindo ao SciComp.SE! Você poderia expandir sua resposta para descrever a biblioteca (os links podem ficar inoperantes) e especialmente como ela atende aos requisitos do OP? Caso contrário, é mais um comentário.
Christian Clason
Parece uma biblioteca muito interessante! Parece que isso gera uma etapa extra de compilação, no entanto. Gostaria de saber se seria possível implementar isso usando modelos em vez disso?
HelloGoodbye 27/03
4

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.)

Wolfgang Bangerth
fonte
2

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.

Cem Bassoy
fonte
Você também pode tentar brincar com a biblioteca do Godbolt: godbolt.org/z/Sf5V77
Cem Bassoy
1

Eu não o usei, mas o libtensor parece atender aos seus requisitos.

Juan M. Bello-Rivas
fonte
1

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).

Mauricio Cele López Belón
fonte
0

Há também ITensor (requer C ++ 17).

Jakub Klinkovský
fonte