Bibliothèque de tenseurs C ++ rapide et légère pour le code indépendant de la dimension

20

Je recherche une bibliothèque de tenseurs C ++ qui prend en charge le code indépendant de la dimension. Plus précisément, je dois effectuer des opérations le long de chaque dimension (jusqu'à 3), par exemple calculer une somme pondérée. Les dimensions sont un paramètre de modèle (et donc une constante de temps de compilation). Une autre contrainte est que la bibliothèque doit être relativement légère, donc plutôt de style Eigen / Boost que Trilinos / PETSc.

Aucune suggestion?

Remarque: j'ai jeté un œil à Eigen et je pense qu'il correspond presque exactement au profil, s'il n'était pas limité aux tenseurs 2D. Si je me trompe, corrigez-moi.

Michael Schlottke-Lakemper
la source

Réponses:

9

FTensor est une bibliothèque légère, entièrement en-tête et entièrement basée sur des modèles, qui comprend une notation de sommation ergonomique. Il a été largement testé en 2, 3 et 4 dimensions, mais devrait fonctionner correctement pour n'importe quel nombre de dimensions.

Acier Damas
la source
6

Pour ce que ça vaut, Eigen a une classe Tensor comme module non pris en charge.

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

Je ne l'ai pas utilisé moi-même, je ne peux donc pas en dire plus.

La bibliothèque de classes Armadillo a une classe tenseur d'ordre 3.

http://arma.sourceforge.net/

Je n'ai pas non plus utilisé les capacités de tenseur d'Armadillo, mais j'ai expérimenté avec les classes de matrice standard et elles semblent relativement faciles à utiliser et ont de bonnes performances.

Bill Greene
la source
2
Plus précisément, Armadillo a la classe Cube , qui implémente des tenseurs de 3e ordre
mtall
6

Je pense que cette nouvelle tacobibliothèque est vraiment bien aussi.

Le compilateur d'algèbre tenseur (taco) est une bibliothèque C ++ qui calcule les expressions d'algèbre tensorielle sur des tenseurs clairsemés et denses. Il utilise de nouvelles techniques de compilation pour obtenir des performances compétitives avec des noyaux optimisés à la main dans des bibliothèques largement utilisées pour l'algèbre tensorielle clairsemée et l'algèbre linéaire clairsemée.

Vous pouvez utiliser taco comme une bibliothèque C ++ qui vous permet de charger des tenseurs, de lire des tenseurs à partir de fichiers et de calculer des expressions de tenseurs. Vous pouvez également utiliser taco comme générateur de code qui génère des fonctions C qui calculent des expressions tensorielles.

Discuter: https://www.youtube.com/watch?v=Kffbzf9etLE Papier: http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf

Dhi Aurrahman
la source
2
Bienvenue sur SciComp.SE! Pourriez-vous développer votre réponse pour décrire la bibliothèque (les liens peuvent disparaître) et surtout comment elle répond aux exigences de l'OP? Sinon, c'est plus un commentaire.
Christian Clason
On dirait une bibliothèque très intéressante! Il semble cependant que cela génère une étape de compilation supplémentaire. Je me demande s'il serait possible d'implémenter cela à l'aide de modèles à la place?
HelloGoodbye
4

La bibliothèque deal.II ( http://www.dealii.org ), bien qu'écrite à des fins beaucoup plus importantes, possède également une sous-bibliothèque de classes de tenseurs qui fait probablement beaucoup de ce que vous voulez faire. En particulier, il utilise des modèles pour la dimension.

(Avertissement: je suis l'un des principaux auteurs de cette bibliothèque.)

Wolfgang Bangerth
la source
2

La bibliothèque Boost.Numeric.uBlas a récemment ajouté une extension de tensor qui est livrée avec Boost version 1.70. Veuillez consulter https://github.com/boostorg/ublas . Il fournit des opérations matricielles et tensorielles standard avec un ordre variable à l'exécution (nombre de dimensions), des dimensions pour les formats de stockage de premier et dernier ordre (colonnes et lignes principales). Vous pouvez également facilement utiliser la convention de sommation d'Einstein pour exprimer des multiplications de tenseurs aribtraires. Boost.Numeric.uBlas est uniquement en-tête et facile à intégrer dans les projets existants.

Cem Bassoy
la source
Vous pouvez également essayer de jouer avec la bibliothèque sur Godbolt: godbolt.org/z/Sf5V77
Cem Bassoy
1

Je ne l'ai pas utilisé moi-même mais libtensor semble répondre à vos exigences.

Juan M. Bello-Rivas
la source
1

LTensor ( https://code.google.com/p/ltensor/ ) est une bibliothèque de modèles C ++ TRÈS facile à utiliser pour les tenseurs jusqu'au rang 4 (basé sur la notation indicale), rapide et légère également. Vous n'avez pas besoin de compiler quoi que ce soit, il suffit d'inclure le fichier d'en-tête principal. Je l'ai utilisé sur plusieurs projets et j'ai bien fonctionné.

Il a des fonctionnalités intégrées pour les tenseurs de rang 2 comme les solveurs linéaires, les décompositions svd, LU et Cholesky, etc. Je n'en ai utilisé aucune (j'utilise d'autres bibliothèques pour cela).

Mauricio Cele López Belón
la source
0

Il existe également ITensor (nécessite C ++ 17).

Jakub Klinkovský
la source