ADAPTの更新情報である。本ライブラリを私個人も研究の中で本格的に導入し、その都度欲しくなった機能の追加などを行ってきたので、そのまとめだ。
ADAPTについての説明はこちらへ。
ADAPTのGitHubリポジトリはこちらへ。
条件指定可能な階層関数の追加
ADAPTはgreatest(population / area)
のように下層要素を集計した結果を返す階層関数を用意している1。ExcelのSUM、MAX関数などに似た機能である。ここにsum_if
、greatest_if
のような条件指定可能な関数を用意した。例えばgreatest_if(population / area, area < 100)
としたとき、area < 100
を満たすものだけを対象にpopulation / area
の最大値を求めその値を返す。
同様に、isgreatest_if
のようにis関数に対しても条件指定機能を設けた関数を用意している。関数名がよく分からないことになっている気がするが……まあ気にしたら負けだろう。
Extractの高速化
Filter
による条件指定がなく、かつシングルスレッド動作の場合で、Extractの動作を20~40%高速化した。マルチスレッドの場合はそれほど速度は上昇しない(CPU使用率を下げる効果は多少あるかもしれない)、Filter
条件指定がある場合も効果は薄い。
とはいえ高速化についてはまだ作業途中で、今後もっと効率化を進めるつもりだ。
ラムダ関数用のtryjoinの追加
連結コンテナはTryJoin関数という下位コンテナの連結を試みる関数を持つが、これをラムダ関数中でも使用できるようにした。ちょっと呼び出し方が特殊で、JoinedContainer
オブジェクトc
があるとき、if_(c.tryjoin(1_rank), x, y)
のようにコンテナオブジェクトのメンバ関数tryjoin
関数を呼ぶことで使用する。動作はTryJoin
と同じで、連結可能なら連結したうえでtrueを返し、不可能な場合は連結をせずfalseを返す。
細かなバグ修正
バグは使っているうちに色々と見つかってくるので、その都度修正している。JoinedContainerと階層関数を組み合わせて使用したときに起こるバグ、空要素を持つ場合にTraverserが無限ループを起こす可能性のあるバグなどを修正した。
その他現状報告
何とかSIMDを有効化しようと奮闘している。のだが、階層構造や行指向データ構造とSIMDはあまり相性が良くないことに頭を悩ませている。いやまあ、相性の悪さを理解した上で、それでもこのデータ構造を採用したい背景があったのだが。
一応、不可能ではないことは分かっているし、SIMDによる計算量削減だけでなく仮想関数呼び出しオーバーヘッドの削減にも繋がるので、効果は少なからずあるはずだ。ただ場合によっては、やはり行指向を諦めて列指向の設計を始めるかもしれない。こうなると用途上色々と問題が出てくるかもしれないが、逆に列指向のメリットを押し付けることもできるかもしれない。
何にせよ、実装にはまだ時間がかかりそうだ。
- population、areaはそれぞれ市町村の人口と面積とする。↩