Быстрая и легкая тензорная библиотека C ++ для независимого от измерений кода

20

Я ищу тензорную библиотеку C ++, которая поддерживает независимый от измерения код. В частности, мне нужно выполнять операции по каждому измерению (до 3), например, вычислять взвешенную сумму. Размеры - это параметр шаблона (и, следовательно, константа времени компиляции). Другое ограничение заключается в том, что библиотека должна быть относительно легкой, поэтому скорее в стиле Eigen / Boost, чем в Trilinos / PETSc.

Какие-либо предложения?

Примечание: я посмотрел на Eigen и думаю, что он почти точно соответствует профилю, если бы он не был ограничен 2D тензорами. Если я ошибаюсь, поправьте меня.

Майкл Шлотке-Лейкмпер
источник

Ответы:

9

FTensor - это легковесная библиотека с полным шаблоном только для заголовков, которая включает в себя эргономические обозначения суммирования. Он был тщательно протестирован в 2, 3 и 4 измерениях, но должен отлично работать для любого количества измерений.

Дамасская сталь
источник
6

Несмотря на это, у Eigen есть класс Tensor как неподдерживаемый модуль.

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

Я не использовал это сам, поэтому не могу сказать больше об этом.

Библиотека классов Armadillo имеет тензорный класс 3-го порядка.

http://arma.sourceforge.net/

Я также не использовал тензорные возможности Armadillo, но экспериментировал со стандартными матричными классами, и они кажутся относительно простыми в использовании и имеют хорошую производительность.

Билл Грин
источник
2
Более конкретно, у Armadillo есть класс Cube , который реализует тензоры 3-го порядка
mtall
6

Я думаю, что эта новая tacoбиблиотека действительно хороша.

Tensor Algebra Compiler (taco) - это библиотека C ++, которая вычисляет выражения тензорной алгебры на разреженных и плотных тензорах. Он использует новые методы компилятора для обеспечения конкурентоспособности производительности с оптимизированными вручную ядрами в широко используемых библиотеках как для разреженной тензорной алгебры, так и для разреженной линейной алгебры.

Вы можете использовать taco в качестве библиотеки C ++, которая позволяет загружать тензоры, читать тензоры из файлов и вычислять выражения тензоров. Вы также можете использовать taco в качестве генератора кода, который генерирует функции C, которые вычисляют тензорные выражения.

Обсуждение: https://www.youtube.com/watch?v=Kffbzf9etLE. Бумага: http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf.

Ди Ауррахман
источник
2
Добро пожаловать в SciComp.SE! Не могли бы вы расширить свой ответ, чтобы описать библиотеку (ссылки могут перестать работать) и особенно то, как она соответствует требованиям ОП? В противном случае это скорее комментарий.
Кристиан Клэйсон
Похоже, очень интересная библиотека! Похоже, что это создает дополнительный шаг компиляции. Мне интересно, возможно ли реализовать это с помощью шаблонов?
Здравствуйте, до свидания
4

Библиотека deal.II ( http://www.dealii.org ), хотя и написана для гораздо более широких целей, также содержит подбиблиотеку тензорных классов, которая, вероятно, выполняет большую часть того, что вы хотите сделать. В частности, он использует шаблоны для измерения.

(Отказ от ответственности: я являюсь одним из основных авторов этой библиотеки.)

Вольфганг Бангерт
источник
2

Библиотека Boost.Numeric.uBlas недавно добавила тензорное расширение, которое поставляется с Boost версии 1.70. Пожалуйста, посмотрите на https://github.com/boostorg/ublas . Он предоставляет стандартные матричные и тензорные операции с переменным во время выполнения порядком (количество измерений), измерения для форматов хранения первого и последнего порядка (столбец и ряд строки). Вы можете также легко использовать соглашение суммирования Эйнштейна, чтобы выразить aribtrary тензорные умножения. Boost.Numeric.uBlas является только заголовком и легко интегрируется в существующие проекты.

Джем Бассой
источник
Вы также можете попробовать поиграть с библиотекой Godbolt: godbolt.org/z/Sf5V77
Cem Bassoy
1

Я не использовал это сам, но libtensor, кажется, выполняет ваши требования.

Хуан М. Белло-Ривас
источник
1

LTensor ( https://code.google.com/p/ltensor/ ) - это ОЧЕНЬ простая в использовании библиотека шаблонов C ++ для тензоров до ранга 4 (на основе обычной записи), а также быстрая и легкая. Вам не нужно ничего компилировать, нужно только включить основной заголовочный файл. Я использовал его в нескольких проектах и ​​работал нормально.

Он имеет некоторые встроенные функции для тензоров ранга 2, таких как линейные решатели, svd, LU и разложения Холецкого, и т. Д. Я не использовал ни одну из них (я использую другие библиотеки для этого).

Маурисио Селе Лопес Белон
источник