Szybka, lekka biblioteka tensorów C ++ do kodu agnostycznego

20

Szukam biblioteki tensorowej C ++, która obsługuje kod zależny od wymiarów. W szczególności muszę wykonywać operacje wzdłuż każdego wymiaru (do 3), np. Obliczać sumę ważoną. Wymiary są parametrem szablonu (a zatem stałą czasową kompilacji). Innym ograniczeniem jest to, że biblioteka powinna być stosunkowo lekka, więc raczej w stylu Eigen / Boost niż Trilinos / PETSc.

Jakieś sugestie?

Uwaga: rzuciłem okiem na Eigen i sądzę, że prawie pasuje dokładnie do profilu, jeśli nie byłby ograniczony do tensorów 2D. Jeśli się mylę, popraw mnie.

Michael Schlottke-Lakemper
źródło

Odpowiedzi:

9

FTensor to lekka, w pełni szablonowa biblioteka z nagłówkiem i ergonomiczną notacją sumowania. Został on dokładnie przetestowany w 2, 3 i 4 wymiarach, ale powinien działać dobrze dla dowolnej liczby wymiarów.

Damaszek Stal
źródło
6

Za swoją wartość Eigen ma klasę Tensor jako nieobsługiwany moduł.

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

Sam go nie użyłem, więc nie mogę o tym więcej powiedzieć.

Biblioteka klas Armadillo ma klasę tensorów trzeciego rzędu.

http://arma.sourceforge.net/

Nie korzystałem też z możliwości tensora Armadillo, ale eksperymentowałem ze standardowymi klasami macierzy i wydają się one stosunkowo łatwe w użyciu i mają dobrą wydajność.

Bill Greene
źródło
2
Mówiąc dokładniej, Armadillo ma klasę Cube , która implementuje tensory trzeciego rzędu
mtall
6

Myślę, że ta nowa tacobiblioteka też jest naprawdę dobra.

Tensor Algebra Compiler (taco) to biblioteka C ++, która oblicza wyrażenia algebry tensorowej na tensorach rzadkich i gęstych. Wykorzystuje nowatorskie techniki kompilatora, aby zwiększyć wydajność dzięki ręcznie zoptymalizowanym jądrom w szeroko używanych bibliotekach zarówno dla rzadkiej algebry tensorowej, jak i rzadkiej algebry liniowej.

Możesz używać taco jako biblioteki C ++, która pozwala ładować tensory, czytać tensory z plików i obliczać wyrażenia tensorowe. Możesz także użyć taco jako generatora kodu, który generuje funkcje C, które obliczają wyrażenia tensorowe.

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

Dhi Aurrahman
źródło
2
Witamy w SciComp.SE! Czy możesz rozszerzyć swoją odpowiedź, aby opisać bibliotekę (linki mogą zniknąć), a zwłaszcza sposób, w jaki spełnia ona wymagania PO? W przeciwnym razie jest to bardziej komentarz.
Christian Clason
Wygląda na bardzo interesującą bibliotekę! Wygląda jednak na to, że generuje to dodatkowy etap kompilacji. Zastanawiam się, czy byłoby możliwe zaimplementowanie tego za pomocą szablonów?
HelloGoodbye
4

Biblioteka deal.II ( http://www.dealii.org ), choć napisana do znacznie większych celów, zawiera również pod bibliotekę klas tensorów, które prawdopodobnie wykonują wiele z tego, co chcesz zrobić. W szczególności wykorzystuje szablony dla wymiaru.

(Uwaga: Jestem jednym z głównych autorów tej biblioteki).

Wolfgang Bangerth
źródło
2

Biblioteka Boost.Numeric.uBlas ostatnio dodała rozszerzenie tensora, które jest dostarczane z Boost w wersji 1.70. Proszę spojrzeć na https://github.com/boostorg/ublas . Zapewnia standardowe operacje macierzowe i tensorowe z kolejnością zmiennych wykonawczych (liczba wymiarów), wymiarami formatów pamięci pierwszego i ostatniego rzędu (główna i rzędowa). Można również łatwo użyć konwencji sumowania Einsteina, aby wyrazić arbtrarne multiplikacje tensora. Boost.Numeric.uBlas jest tylko nagłówkiem i można go łatwo zintegrować z istniejącymi projektami.

Cem Bassoy
źródło
Możesz także spróbować pobawić się biblioteką na Godbolt: godbolt.org/z/Sf5V77
Cem Bassoy
1

Sam go nie używałem, ale libtensor wydaje się spełniać twoje wymagania.

Juan M. Bello-Rivas
źródło
1

LTensor ( https://code.google.com/p/ltensor/ ) to BARDZO łatwa w użyciu biblioteka szablonów C ++ dla tensorów do rangi 4 (na podstawie notacji indical), szybka i lekka. Nie musisz nic kompilować, wystarczy dołączyć główny plik nagłówka. Użyłem go w kilku projektach i działałem dobrze.

Ma pewne wbudowane funkcje dla tensorów rangi 2, takie jak solwery liniowe, svd, LU i dekompozycje Cholesky'ego itp. Nie korzystałem z żadnej z nich (używam do tego innych bibliotek).

Mauricio Cele López Belón
źródło
0

Istnieje również ITensor (wymaga C ++ 17).

Jakub Klinkovský
źródło