Schnelle, leichte C ++ - Tensorbibliothek für dimensionsunabhängigen Code

20

Ich suche eine C ++ - Tensorbibliothek, die dimensionsunabhängigen Code unterstützt. Insbesondere muss ich Operationen entlang jeder Dimension ausführen (bis zu 3), z. B. eine gewichtete Summe berechnen. Die Dimension ist ein Vorlagenparameter (und damit eine Konstante für die Kompilierungszeit). Eine weitere Einschränkung ist, dass die Bibliothek relativ leicht sein sollte, also eher Eigen / Boost-Stil als Trilinos / PETSc.

Irgendwelche Vorschläge?

Hinweis: Ich habe mir Eigen angesehen und denke, es passt fast genau zum Profil, wenn es nicht auf 2D-Tensoren beschränkt wäre. Wenn ich mich irre, korrigieren Sie mich bitte.

Michael Schlottke-Lakemper
quelle

Antworten:

9

FTensor ist eine kompakte Bibliothek, die nur für Header vorgesehen ist und eine ergonomische Summationsnotation enthält. Es wurde ausführlich in 2, 3 und 4 Dimensionen getestet, sollte aber für jede Anzahl von Dimensionen funktionieren.

Damaststahl
quelle
6

Eigen hat eine Tensor-Klasse als nicht unterstütztes Modul.

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

Ich habe es selbst nicht benutzt, kann also nicht mehr dazu sagen.

Die Bibliothek der Armadillo-Klasse verfügt über eine Tensor-Klasse 3. Ordnung.

http://arma.sourceforge.net/

Ich habe auch nicht die Tensorfähigkeiten von Armadillo verwendet, sondern mit den Standardmatrixklassen experimentiert, und sie scheinen relativ einfach zu verwenden und weisen eine gute Leistung auf.

Bill Greene
quelle
2
Insbesondere
6

Ich denke, diese neue tacoBibliothek ist auch wirklich gut.

Der Tensor Algebra Compiler (Taco) ist eine C ++ - Bibliothek, die Tensor-Algebra-Ausdrücke für spärliche und dichte Tensoren berechnet. Es verwendet neuartige Compilertechniken, um die Leistung von handoptimierten Kerneln in weit verbreiteten Bibliotheken sowohl für die spärliche Tensoralgebra als auch für die spärliche lineare Algebra zu verbessern.

Sie können taco als C ++ - Bibliothek verwenden, mit der Sie Tensoren laden, Tensoren aus Dateien lesen und Tensorausdrücke berechnen können. Sie können Taco auch als Codegenerator verwenden, der C-Funktionen generiert, die Tensorausdrücke berechnen.

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

Dhi Aurrahman
quelle
2
Willkommen bei SciComp.SE! Könnten Sie Ihre Antwort erweitern, um die Bibliothek zu beschreiben (Links können nicht mehr funktionieren) und insbesondere, wie sie den Anforderungen des OP entspricht? Ansonsten ist es eher ein Kommentar.
Christian Clason
Scheint eine sehr interessante Bibliothek zu sein! Es sieht jedoch so aus, als würde dies einen zusätzlichen Kompilierungsschritt erzeugen. Ich frage mich, ob es möglich wäre, dies stattdessen mithilfe von Vorlagen zu implementieren.
Hallo Auf Wiedersehen
4

Die deal.II-Bibliothek ( http://www.dealii.org ) ist zwar für viel größere Zwecke geschrieben, verfügt jedoch auch über eine Unterbibliothek von Tensorklassen, die wahrscheinlich viel von dem tun, was Sie tun möchten. Insbesondere werden Vorlagen für die Dimension verwendet.

(Haftungsausschluss: Ich bin einer der Hauptautoren dieser Bibliothek.)

Wolfgang Bangerth
quelle
2

Die Bibliothek Boost.Numeric.uBlas hat kürzlich eine Tensor-Erweiterung hinzugefügt, die mit der Boost-Version 1.70 ausgeliefert wird. Bitte werfen Sie einen Blick auf https://github.com/boostorg/ublas . Es bietet Standardmatrix- und Tensoroperationen mit laufzeitvariabler Reihenfolge (Anzahl der Dimensionen) und Dimensionen für die Speicherformate erster und letzter Ordnung (Spalten- und Zeilensprung). Sie können die Einstein-Summationskonvention auch leicht verwenden, um aribträre Tensormultiplikationen auszudrücken. Boost.Numeric.uBlas ist nur Header und einfach in bestehende Projekte zu integrieren.

Cem Bassoy
quelle
Sie können auch versuchen, mit der Bibliothek auf Godbolt herumzuspielen
Cem Bassoy
1

Ich habe es nicht selbst benutzt, aber libtensor scheint Ihre Anforderungen zu erfüllen.

Juan M. Bello-Rivas
quelle
1

LTensor ( https://code.google.com/p/ltensor/ ) ist eine SEHR einfach zu verwendende C ++ - Vorlagenbibliothek für Tensoren bis Rang 4 (basierend auf der indischen Notation), schnell und leicht. Sie müssen nichts kompilieren, nur die Haupt-Header-Datei einschließen. Ich habe es bei mehreren Projekten verwendet und es hat funktioniert.

Es hat einige eingebaute Funktionen für Tensoren des Rangs 2, wie lineare Löser, svd, LU und Cholesky-Zerlegungen usw. Ich habe keine von ihnen verwendet (ich benutze dafür andere Bibliotheken).

Mauricio Cele López Belón
quelle
0

Es gibt auch ITensor (benötigt C ++ 17).

Jakub Klinkovský
quelle