てがみ: qatacri at protonmail.com | 統計 | 2019

201910301

201910300 つづき。 Blitz++ が Expression template で縮約をサポートしていた気がしたので調べてみたら、現在でもメンテされていた。

https://github.com/blitzpp/blitz
https://github.com/blitzpp/blitz/files/3031673/blitz-0.9.pdf

初めて見たときはテンプレートメタプログラミングを全く理解していなかったのもあって「人外の作ったキ○ガイライブラリだ…」みたいな印象を抱いた覚えがあるけれど、今ドキュメントを読むとバランスも悪くなく実用性のあるライブラリにみえる。

他にも気合の入った C++ ライブラリをいくつか発見した。

https://github.com/romeric/Fastor

enum {I,J,K,L,M,N};
auto C = einsum<Index<I,J,K>,Index<J,L,M,N>>(A,B);
auto G = permutation<Index<J,K,I,L>>(F);

http://www.wlandry.net/Projects/FTensor

const Index<'i',3> i;
const Index<'j',3> j;
...
R(i,j,k,l) = dG(i,j,k,l) - dG(i,l,k,j) + G(m,j,k)*G(i,m,l) - G(m,l,k)*G(i,m,j);

久しぶりにテンプレートメタプログラミングの世界を覗きこんでしまった。

実際に使うにはやはり一文字変数が食われるのは辛い。こういうのを言語レベルで支援するとしたら、どうするのがいいのだろうか。マクロ (C/C++ のではなく) になってしまうのかなあ。