2015/10/05(月)kv-0.4.24
今回の主な変更点は、
- ライセンスを明記し、MITライセンスとした。
- interval.hppのproper_subsetを修正し、proper_subset([0,1],[0,2])が真になるようにした。
- beta.hppを追加。
- eig.hppを追加(高安 亮紀氏の提供による)。
ライセンスは今まで曖昧にしていましたが、某所から問い合わせがあって、MITライセンスと明記することにしました。大雑把に言えば、著作権表示を残しさえすれば自由にしていいよ、責任は取らないよ、というライセンスと理解しています。「煮るなり焼くなり好きにして」という気分だったのですが、やはり明記されていないと使いにくいということはありそうです。
proper_subset(X,Y)は、XがYの真部分集合のとき真、という関数ですが、X=[0,1], Y=[0,2]のようなとき偽を返していたという問題がありました(X=[0.5,1]なら真、すなわち両側に余裕がないと真になっていなかった)。この関数を使っていたのはKrawczyk法の部分だけですが、今まではこのバグによりわずかに性能が低下していた可能性があります。
eig.hppは、非対称実行列の固有値と固有ベクトルを(近似的に)計算するeig関数と、非対称実行列の固有値を精度保証付きで計算するveig関数を含んでいます。高安 亮紀氏に提供していただきました。ありがとうございます。
(2015年10月6日 追記)
kv-0.4.15、シンプルな区間演算ライブラリで公開した簡単な区間演算ライブラリを、0.4.24相当にアップデートしました。interval-simple-0.4.24.tar.gz
特徴を再掲しておきます。
- kvライブラリの区間演算の部分を切り出して、簡単な区間演算ライブラリを作ってみました。
- テンプレートを排除しました。従って内部型はdoubleのみですが、プログラムが読みやすくなっています。
- テンプレートを排除したおかげでboostに依存しません。単体で使えます。
- 必要なファイルはinterval.hpp一つです。
- 内部型のカスタマイズが出来ないこと以外は、kvライブラリに含まれるinterval.hppと機能は同等です。数学関数も多数あります。
- 丸めの変更は単純にfesetroundを使っています。
- 文字列との方向丸め付き相互変換機能もあります。従って、文字列からその文字列の表す数値を含むように区間を初期化できるし、表示も真の値を含むように外側に丸めるようになっています。
- volatileを使った最適化対策はきちんとやってます。
2015/09/10(木)応用数理学会年会
2015/08/06(木)kv-0.4.23
今回は、allsol.hppにある非線形方程式の全解を探索するプログラムに、[0,∞]や[-∞,∞]などの無限大を含む領域を探索区間として指定できるようにしました。もっとも、必ず全ての解を求めて停止するわけでは無く、「求まる問題なら求まる」といったレベルです。ある問題を解いていてたまたま必要になったので実装したのですが、まだまだ改良が必要と思います。こうして文章にすると簡単そうですが、実は結構苦戦しました。無限大は難しい。
その他、vleq.hppの仕様を少し変更したり、区間のmidを精密にしたりしました。ベキ級数演算のpdfのドキュメントにも少し加筆しました。
2015/06/29(月)kv-0.4.22
今回は、defint_power_r, defint_log_r, defint_power_autostep_r, defint_log_autostep_rの4つの端点特異性を持つ積分の関数のbug fixです。これら右側の端点特異性を扱う関数は、時間を反転させて左側versionに任せているのですが、その時間反転部分にバグがありました。これらの関数を使う例題を作っていなかったので、気付きませんでした。
その他、細かいところをいくつか修正しています。
2015/06/28(日)octave+openblas+intlabで丸め変更を検証
行列積はn3回の乗算とn2(n-1)回の加算を含んでいますが、これらの全ての演算について、上向き丸めと下向き丸めで結果が異なる筈であるような入力値を与え、計算結果が同一になる(すなわち丸め変更が効いていない)ことが発生することがないかどうか試すプログラムを作ってみました。matlabのプログラムは書いたことがないのでこれが普通の書き方かどうかはよく分かりません。
function testmm(n) disp('testing multiplication...') flag = 1; for k=1:n a=zeros(n); a(:,k)=ones(n,1)*1/3; b=zeros(n); b(k,:)=ones(1,n)*1/3; c = (rad(intval(a) * b) ~= 0) + 0.0; if prod(prod(c)) == 0 disp('multiplication error!') flag = 0; break end end if flag == 1 disp('multiplication OK!') end disp('testing addition...') flag = 1; for k=2:n a=zeros(n); a(:,1)=ones(n,1); a(:,k)=ones(n,1)*2^(-27); b=zeros(n); b(1,:)=ones(1,n); b(k,:)=ones(1,n)*2^(-27); c = (rad(intval(a) * b) ~= 0) + 0.0; if prod(prod(c)) == 0 disp('addition error!') flag = 0; break end end if flag == 1 disp('addition OK!') end endこれをtestmm.mという名前で作成し、testmm(100)などとintlab上で実行してみました。なお、数値は行列サイズで、このプログラムはn4に比例した時間がかかるのであまり大きな行列ではテストできません。実行結果は、次のようになりました。
ubuntu 14.04 | windows + octave 3.8.2 | windows + octave 4.0.0 | |
---|---|---|---|
シングルコア | OK | OK | OK |
マルチコア | NG | OK | NG |
ubuntu 14.04 | 前記事で書いたubuntu 14.04 + パッケージで入れたoctave, openblas |
---|---|
windows + octave 3.8.2 | windows7 + INTLAB公式のoctaveページからダウンロードしたoctave 3.8.2 |
windows + octave 4.0.0 | windows7 + Octave公式ページからダウンロードしたoctave 4.0.0 |
# CONSISTENT_FPCSR = 1という行があります。これは、マルチスレッド環境において浮動小数点数のControl/Statusレジスタをコピーするか否かを決めていて、ここをuncommentするとopenblasが起動されたときの丸めの向きの状態がマルチスレッド時の全てのスレッドに伝わるようになります。この結果から、ubuntuのパッケージとoctave公式のopenblasはここがコメントのままmakeされていて、INTLABページのものはここのコメントが外されてmakeされていると推定できます。
ここからは、ubuntu 14.04の場合について、openblasのパッケージを作りなおしてマルチコア環境でも丸めの向きの変更が全てのスレッドに伝わるようにします。野良ビルドでも良いのですが、ubuntuのパッケージシステムとなるべく合わせた形で作ってみました。
- sudo apt-get install devscripts
- 適当な作業directoryを作ってそこに移動
- sudo apt-get source openblas でソースコードを取得。
- sudo apt-get build-dep openblas でmakeするのに必要なものをインストール。
- cd openblas-0.2.8/ でソースdirectoryに入る。
- Makefile.ruleを編集し、コメントアウトされている
CONSISTENT_FPCSR = 1
を有効化する。 - dch -i で、version番号を例えば0.2.8-6ubuntu2のように進め、changelogを適当に書く。
- dpkg-buildpackage -b -uc -us でmake。
- これで必要なdebファイルが生成されたので、cd .. で一つ上に上がり、
- sudo dpkg -i libopenblas-base_0.2.8-6ubuntu2_amd64.deb
- sudo dpkg -i libopenblas-dev_0.2.8-6ubuntu2_amd64.deb
ところで、INTLAB公式のoctaveページからダウンロードしたoctave-3.8.2-installer.exe、Aviraさんが
みたいに反応するんだが、大丈夫だろうか (自分は仮想環境で実行してすぐに消しました)。Aviraさんはときどき過剰に反応するからそのせいだと信じよう。