Biblioteca de tensor C ++ rápida y liviana para código independiente de la dimensión

20

Estoy buscando una biblioteca de tensor C ++ que admita código independiente de dimensión. Específicamente, necesito realizar operaciones a lo largo de cada dimensión (hasta 3), por ejemplo, calcular una suma ponderada. Las dimensiones son un parámetro de plantilla (y, por lo tanto, una constante de tiempo de compilación). Otra restricción es que la biblioteca debería ser relativamente liviana, por lo tanto, más bien estilo Eigen / Boost que Trilinos / PETSc.

¿Alguna sugerencia?

Nota: He echado un vistazo a Eigen y creo que casi se ajusta exactamente al perfil, si no se limitara a los tensores 2D. Si me equivoco con esto, corríjame.

Michael Schlottke-Lakemper
fuente

Respuestas:

9

FTensor es una biblioteca liviana, solo con encabezado, totalmente con plantilla que incluye notación de suma ergonómica. Se ha probado ampliamente en 2, 3 y 4 dimensiones, pero debería funcionar bien para cualquier cantidad de dimensiones.

Acero de Damasco
fuente
6

Por lo que vale, Eigen tiene una clase Tensor como un módulo no compatible.

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

No lo he usado yo mismo, así que no puedo decir más al respecto.

La biblioteca de clases Armadillo tiene una clase tensorial de tercer orden.

http://arma.sourceforge.net/

Tampoco he usado las capacidades de tensor de Armadillo, pero he experimentado con las clases de matriz estándar y parecen relativamente fáciles de usar y tienen un buen rendimiento.

Bill Greene
fuente
2
Más específicamente, Armadillo tiene la clase Cube , que implementa tensores de 3er orden
mtall
6

Creo que esta nueva tacolib también es realmente buena.

El compilador de álgebra de tensor (taco) es una biblioteca de C ++ que calcula las expresiones de álgebra de tensor en tensores dispersos y densos. Utiliza nuevas técnicas de compilación para obtener un rendimiento competitivo con núcleos optimizados a mano en bibliotecas ampliamente utilizadas tanto para álgebra de tensor disperso como para álgebra lineal dispersa.

Puede usar taco como una biblioteca de C ++ que le permite cargar tensores, leer tensores de archivos y calcular expresiones de tensor. También puede usar taco como generador de código que genera funciones C que calculan expresiones tensoras.

Discusión: https://www.youtube.com/watch?v=Kffbzf9etLE Documento: http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf

Dhi Aurrahman
fuente
2
Bienvenido a SciComp.SE! ¿Podría expandir su respuesta para describir la biblioteca (los enlaces pueden fallar) y especialmente cómo cumple con los requisitos del OP? De lo contrario, es más un comentario.
Christian Clason
¡Parece una biblioteca muy interesante! Sin embargo, parece que esto genera un paso de compilación adicional. Me pregunto si sería posible implementar esto usando plantillas.
Hola
4

La biblioteca deal.II ( http://www.dealii.org ), aunque está escrita para propósitos mucho más grandes, también tiene una sub-biblioteca de clases de tensor que probablemente hace mucho de lo que quieres hacer. En particular, utiliza plantillas para la dimensión.

(Descargo de responsabilidad: soy uno de los principales autores de esta biblioteca).

Wolfgang Bangerth
fuente
2

La biblioteca Boost.Numeric.uBlas agregó recientemente una extensión de tensor que se entrega con Boost versión 1.70. Por favor, eche un vistazo a https://github.com/boostorg/ublas . Proporciona operaciones estándar de matriz y tensor con orden variable en tiempo de ejecución (número de dimensiones), dimensiones para los formatos de almacenamiento de primer y último orden (columnas y filas principales). También puede usar fácilmente la convención de suma de Einstein para expresar multiplicaciones de tensor aribtrary. Boost.Numeric.uBlas es solo encabezado y fácil de integrar en proyectos existentes.

Cem Bassoy
fuente
También puede intentar jugar con la biblioteca en Godbolt: godbolt.org/z/Sf5V77
Cem Bassoy
1

No lo he usado yo mismo pero libtensor parece cumplir con sus requisitos.

Juan M. Bello-Rivas
fuente
1

LTensor ( https://code.google.com/p/ltensor/ ) es una biblioteca de plantillas C ++ MUY fácil de usar para tensores hasta el rango 4 (basado en notación índica), rápida y liviana también. No necesita compilar nada, solo debe incluir el archivo de encabezado principal. Lo he usado en varios proyectos y funcionó bien.

Tiene algunas características integradas para tensores de rango 2 como solucionadores lineales, svd, LU y descomposiciones Cholesky, etc. No utilicé ninguna de ellas (utilizo otras bibliotecas para eso).

Mauricio Cele López Belón
fuente
0

También hay ITensor (requiere C ++ 17).

Jakub Klinkovský
fuente