=================================================================== RCS file: /home/cvs/OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi,v retrieving revision 1.9 retrieving revision 1.17 diff -u -p -r1.9 -r1.17 --- OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi 2019/02/14 02:22:09 1.9 +++ OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi 2019/04/04 22:49:40 1.17 @@ -1,5 +1,5 @@ -%% $OpenXM: OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi,v 1.8 2019/02/14 00:18:40 takayama Exp $ -%% xetex gtt_ekn.texi (.texi までつける. ) +%% $OpenXM: OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi,v 1.16 2019/03/21 00:33:45 takayama Exp $ +%% xetex gtt_ekn-ja.texi (.texi までつける. ) %% 以下コメントは @comment で始める. \input texinfo 以降は普通の tex 命令は使えない. \input texinfo-ja @iftex @@ -41,7 +41,7 @@ @title 2元分割表HGM関数 @subtitle Risa/Asir 2元分割表HGM関数説明書 @subtitle 1.2 版 -@subtitle 2019 年 2 月 14 日 +@subtitle 2019 年 3 月 20 日 @author by Y.Goto, Y.Tachibana, N.Takayama @page @@ -80,8 +80,10 @@ ChangeLog の項目は www.openxm.org の cvsweb で ソースコードを読む時の助けになる情報が書かれている. このパッケージは下記のようにロードする. @example -load("gtt_ekn.rr"); +load("gtt_ekn3.rr"); @end example +gtt_ekn3.rr は gtt_ekn.rr を置き換える大きく改良されたパッケージである. +以下のモジュール名 gtt_ekn はすべて gtt_ekn3 と読み替えてほしい. @noindent 最新版の asir-contrib package を取得するには, 下記のように更新関数を呼び出す. @example @@ -128,7 +130,12 @@ gtt_ekn/test-t1.rr * gtt_ekn.upAlpha:: * gtt_ekn.cmle:: * gtt_ekn.set_debug_level:: +* gtt_ekn.contiguity_mat_list_2:: * gtt_ekn.show_path:: +* gtt_ekn.get_svalue:: +* gtt_ekn.assert1:: +* gtt_ekn.assert2:: +* gtt_ekn.prob2:: @end menu @node 超幾何関数E(k,n),,, 2元分割表HGMの関数 @@ -222,10 +229,25 @@ gmvector は @item 周辺和 @var{beta}の時の正規化定数のセル確率 @var{p} に対する値は 多項式に退化した E(k,n) の値で表現できる. 文献 [TKT2015], [GM2016] 参照. @item +以下の option は expectation その他でも使える. +@item option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう [T2016]. 分散計算用の各種パラメータの設定は gtt_ekn.setup で行なう. +@item +option bs=1. binary splitting method で matrix factorial を計算. +一般に 3x3 では効果あり(assert2(15|bs=1)), 5x5 (test5x5(20|bs=1))では遅くなる. +デフォールトは bs=0. +@item +option path. contiguity を適用する path をきめるアルゴリズムを指定. +path=2 (後藤, 松本の論文 [GM2016] の path). path=3 (論文 [TGKT] の path). +デフォールトは path=3. +@item +option interval. 通常の matrix factorial の計算では, 分母と分子をそれぞれ整数計算で計算し最後に約分をする. しかしながら数の中間膨張が一般的に発生しその中間膨張を解消するため +約分を一定間隔で行うと計算効率がよくなる. +interval に整数値を設定することにより行列による一次変換を interval 回するたびに約分を行う. +interval の最適値は問題毎に異なるためシステムがデフォールト値を設定することはない. @end itemize @comment --- @example〜@end example は実行例の表示 --- @@ -252,6 +274,18 @@ T3=T2*D; n=2; Hypergeometric2F1[-36*n,-11*n,2*n,(1-1/n)/56] @end example +例: interval option +@example +[4009] P=gtt_ekn3.prob1(5,5,100); +[[[100,200,300,400,500],[100,200,300,400,500]],[[1,1/2,1/3,1/5,1/7],[1,1/11,1/13,1/17,1/19],[1,1/23,1/29,1/31,1/37],[1,1/41,1/43,1/47,1/53],[1,1,1,1,1]]] + +[4010] util_timing(quote(gtt_ekn3.gmvector([[100,200,300,400,500],[100,200,300,400,500]], [[1,1/2,1/3,1/5,1/7],[1,1/11,1/13,1/17,1/19],[1,1/23,1/29,1/31,1/37],[1,1/41,1/43,1/47,1/53],[1,1,1,1,1]])))[1]; +[cpu,72.852,gc,0,memory,4462742364,real,72.856] + +[4011] util_timing(quote(gtt_ekn3.gmvector([[100,200,300,400,500],[100,200,300,400,500]], [[1,1/2,1/3,1/5,1/7],[1,1/11,1/13,1/17,1/19],[1,1/23,1/29,1/31,1/37],[1,1/41,1/43,1/47,1/53],[1,1,1,1,1]]|interval=100)))[1]; +[cpu,67.484,gc,0,memory,3535280544,real,67.4844] +@end example + 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な 計算ができる. 守備範囲の異なるプログラム同士の比較, debug 用参考. @@ -319,10 +353,14 @@ ChangeLog @item この関数は [GM2016] のアルゴリズムおよび -[T2016] による modular method を用いた高速化を実装したものである. +[T2016] による modular method を用いた高速化, +[TGKT] の高速化を実装したものである. @item 変更を受けたファイルは OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1, gtt_ekn/ekn_pfaffian_8.rr +@item + interval option について変更を受けたファイルは + OpenXM/src/asir-contrib/packages/src/gtt_ekn3/ekn_eval.rr 1.6 @end itemize @@ -367,6 +405,7 @@ nc は gmvector の値を元に, [GM2016] の Prop option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう. 分散計算用の各種パラメータの設定は gtt_ekn.setup で行なう. +その他の option は gmvector を参照. @end itemize @comment --- @example〜@end example は実行例の表示 --- @@ -513,12 +552,13 @@ ChangeLog @comment --- @bullet は黒点付き --- @itemize @bullet @item -[GM2016] の Algorithm 7.8 の実装. +[GM2016] の Algorithm 7.8 の実装. [TGKT] による高速化版 (path=3) がデフォールト. @item option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう. 分散計算用の各種パラメータの設定は gtt_ekn.setup で行なう. @item option index を与えると, 指定された成分の期待値のみ計算する. たとえば 2 x 2 分割表で index=[[0,0],[1,1]] と指定すると, 1 のある成分の期待値のみ計算する. +@item その他の option は gmvector を参照. @end itemize @comment --- @example〜@end example は実行例の表示 --- @@ -729,18 +769,21 @@ ChangeLog @comment --- 個々の関数の説明の開始 --- @comment --- section 名を正確に --- @node gtt_ekn.upAlpha,,, 超幾何関数E(k,n) -@subsection @code{gtt_ekn.upAlpha} +@node gtt_ekn.downAlpha,,, 超幾何関数E(k,n) +@subsection @code{gtt_ekn.upAlpha}, @code{gtt_ekn.downAlpha} @comment --- 索引用キーワード @findex gtt_ekn.upAlpha +@findex gtt_ekn.downAlpha @table @t @item gtt_ekn.upAlpha(@var{i},@var{k},@var{n}) +@item gtt_ekn.downAlpha(@var{i},@var{k},@var{n}) :: @end table @comment --- 引数の簡単な説明 --- 以下まだ書いてない. @table @var -@item i a_i を a_i+1 と変化させる contiguity relation. +@item i a_i を a_i+1 (a_i を a_i-1) と変化させる contiguity relation. @item k E(k+1,n+k+2)型の超幾何関数の k. 分割表では (k+1)×(n+1). @item n E(k+1,n+k+2)型の超幾何関数の n. 分割表では (k+1)×(n+1). @item return contiguity relation の pfaffian_basis についての行列表現を戻す. [GM2016] の Cor 6.3. @@ -757,6 +800,7 @@ ChangeLog @item a_i と分割表の周辺和を見るには, 関数 marginaltoAlpha([行和,列和]) を用いる. @item pfaffian_basis は [GM2016] の4章のベクトル F に対応する偏微分を戻す. +@item optional 引数 arule, xrule で a_i や x_i_j を数にしたものをより効率的に求めることができる. 変化をうけるパラメータを数にしてしまっても特にエラー表示はしない. a_0 で和の条件を調整しているので注意(Todo, double check). @end itemize @comment --- @example〜@end example は実行例の表示 --- @@ -779,6 +823,14 @@ f() redefined. [ f(x_1_1,x_1_2) ] [ (f{1,0}(x_1_1,x_1_2)*x_1_1)/(a_2) ] [ (f{0,1}(x_1_1,x_1_2)*x_1_2)/(a_3) ] + +[2235] RuleA=[[a_2,1/3],[a_3,1/2]]$ RuleX=[[x_1_1,1/5]]$ + base_replace(gtt_ekn.upAlpha(1,1,1),append(RuleA,RuleX)) + -gtt_ekn.upAlpha(1,1,1 | arule=RuleA, xrule=RuleX); + +[ 0 0 ] +[ 0 0 ] + @end example @@ -866,15 +918,30 @@ ChangeLog @comment --- 個々の関数の説明の開始 --- @comment --- section 名を正確に --- @node gtt_ekn.set_debug_level,,, 超幾何関数E(k,n) +@node gtt_ekn.contiguity_mat_list_2,,, 超幾何関数E(k,n) @node gtt_ekn.show_path,,, 超幾何関数E(k,n) -@subsection @code{gtt_ekn.set_debug_level}, @code{gtt_ekn.show_path} +@node gtt_ekn.get_svalue,,, 超幾何関数E(k,n) +@node gtt_ekn.assert1,,, 超幾何関数E(k,n) +@node gtt_ekn.assert2,,, 超幾何関数E(k,n) +@node gtt_ekn.prob1,,, 超幾何関数E(k,n) +@subsection @code{gtt_ekn.set_debug_level}, @code{gtt_ekn.show_path}, @code{gtt_ekn.get_svalue}, @code{gtt_ekn.assert1}, @code{gtt_ekn.assert2}, @code{gtt_ekn.prob1} @comment --- 索引用キーワード @findex gtt_ekn.set_debug_level +@findex gtt_ekn.contiguity_mat_list_2 @findex gtt_ekn.show_path +@findex gtt_ekn.get_svalue +@findex gtt_ekn.assert1 +@findex gtt_ekn.assert2 +@findex gtt_ekn.prob1 @table @t @item gtt_ekn.set_debug_level(@var{m}) debug メッセージのレベルを設定. +@item gtt_ekn.contiguity_mat_list_2 使用する contiguity を構成. @item gtt_ekn.show_path() どのように contiguity を適用したかの情報. +@item gtt_ekn.get_svalue() static 変数の値を得る. +@item gtt_ekn.assert1(@var{N}) 2x2 分割表で動作チェック. +@item gtt_ekn.assert2(@var{N}) 3x3 分割表で動作チェック. +@item gtt_ekn.prob1(@var{R1},@var{R2},@var{Size}) R1 x R2 分割表用のテストデータを作る. :: @end table @@ -888,11 +955,14 @@ ChangeLog @comment --- @bullet は黒点付き --- @itemize @bullet @item (@var{m} & 0x1) == 0x1 の時 g_mat_fac_test_plain と g_mat_fac_itor の両方を呼び出し値を比較する (gtt_ekn.setup した状態で). -@item (@var{m} & 0x2) == 0x2 の時 g_mat_fac_itor への引数を tmp-input.ab として保存. +@item (@var{m} & 0x2) == 0x2 の時 g_mat_fac_test への引数を tmp-input-数.ab として保存. @item (@var{m} & 0x4) == 0x4 の時 matrix factorial の計算の呼び出し引数を表示. +@item @var{N} は問題の周辺和のサイズ. +@item @code{get_svalue} の戻り値は @code{[Ekn_plist,Ekn_IDL,Ekn_debug,Ekn_mesg,XRule,ARule,Verbose,Ekn_Rq]} の値. @end itemize @comment --- @example〜@end example は実行例の表示 --- +例. @example [2846] gtt_ekn.set_debug_level(0x4); [2847] N=2; T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]], @@ -907,15 +977,76 @@ level&0x4: g_mat_fac_test([ 67/62944040755546030080000 level&0x4: g_mat_fac_test ------ snip @end example +例. @example [2659] gtt_ekn.nc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]])$ [2660] L=matrix_transpose(gtt_ekn.show_path())$ [2661] L[2]; [1 4 3 2] @end example -[1 4 3 2] の index をもつパラメーターの方向の contigity を求めそれを掛けて +[1 4 3 2] の index をもつパラメーター alpha の方向の contigity を求めそれを掛けて 計算したことがわかる. L[0] は用いた contiguity の行列. +L[1] はcontiguity を適用する step 数. +例. 値を計算せずに path のみ求めたい場合. +@example +A=gtt_ekn.marginaltoAlpha_list([[400,410,1011],[910,411,500]])$ +[2666] gtt_ekn.contiguity_mat_list_2(A,2,2)$ +[2667] L=matrix_transpose(gtt_ekn.show_path())$ +[2668] L[2]; +[ 2 1 5 4 3 ] +@end example + +例. 値を計算せずに path のみ求めたい場合. +gtt_ekn3 による新しいアルゴリズムによる path の表示. +@example +A=gtt_ekn3.marginaltoAlpha_list([[10,20],[15,15]])$ +[2666] gtt_ekn3.contiguity_mat_list_3(A,1,1 | xrule=[[x_1_1,1/2]])$ +[t,[[ (-t-43/2)/(t-2) (-15/2)/(t-2) ] +[ 1/2 -1/2 ],-9]] +@end example + +例. 0 が戻れば g_mat_fac_plain と指定した計算方法の結果が一致したことがわかる. +option を書かないと g_mat_fac_int との比較となる. +@example +[8859] gtt_ekn.assert2(1); +Marginal=[[130,170,353],[90,119,444]] +P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]] +Try g_mat_fac_test_int: Note: we do not use g_mat_fac_itor. Call gtt_ekn.setup(); to use the crt option. +Timing (int) =0.413916 (CPU) + 0.590723 (GC) = 1.00464 (total), real time=0.990672 + +Try g_mat_fac_test_plain: Note: we do not use g_mat_fac_itor. Call gtt_ekn.setup(); to use the crt option. +Timing (rational) =4.51349 (CPU) + 6.32174 (GC) = 10.8352 (total) +diff of both method = +[ 0 0 0 ] +[ 0 0 0 ] +[ 0 0 0 ] +[8860] + +[8863] gtt_ekn.setup(|nprm=100,minp=10^50); +Number of processes = 1. +Number of primes = 100. +Min of plist = 100000000000000000000000000000000000000000000000151. +0 +[8864] gtt_ekn.assert2(1 | crt=1); +Marginal=[[130,170,353],[90,119,444]] +P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]] +Try [[crt,1]] +---- snip +@end example +なお二番目の例の timing (total) [例では省略] は mod 計算を subprocess がやっているので正しい値ではない. real time が計算時間の目安になる. + +例. +@example +3x5 分割表. 周辺和は 10 に比例する一定の数(factor option も関係. ソースを参照). +cell 確率は1/素数で生成される. +@comment grep testnxn ekn/Prog2/*.rr ; grep test_nxn ekn/Prog2/*.rr も見よ. +[9054] L=gtt_ekn.prob1(3,5,10 | factor=1, factor_row=3); +[[[10,20,420],[30,60,90,120,150]],[[1,1/2,1/3,1/5,1/7],[1,1/11,1/13,1/17,1/19],[1,1,1,1,1]]] +[9055] number_eval(gtt_ekn.expectation(L[0],L[1])); +[ 0.434161208918863 ... snip ] +@end example + @comment --- 参照(リンク)を書く --- @table @t @item 参照 @@ -1038,6 +1169,99 @@ ChangeLog 関連ファイルは gtt_ekn/g_mat_fac.rr gtt_ekn/childprocess.rr +@end itemize + +@node binary splitting,,, 2元分割表HGMの関数 +@chapter binary splitting + +@menu +* gtt_ekn3.init_dm_bsplit:: +* gtt_ekn3.setup_dm_bsplit:: +* gtt_ekn3.init_bsplit:: +@end menu + +@node matrix factorial,,, binary splitting +@section matrix factorial + +@comment ********************************************************** +@comment --- ◯◯◯◯ の説明 +@comment --- 個々の関数の説明の開始 --- +@comment --- section 名を正確に --- +@node gtt_ekn3.init_bsplit,,, +@node gtt_ekn3.init_dm_bsplit,,, +@node gtt_ekn3.setup_dm_bsplit,,, +@subsection @code{gtt_ekn3.init_bsplit, gtt_ekn3.init_dm_bsplit, gtt_ekn3.setup_dm_bsplit} +@comment --- 索引用キーワード +@findex gtt_ekn3.init_dm_bsplit matrix factorial +@findex gtt_ekn3.setup_dm_bsplit matrix factorial +@findex gtt_ekn3.init_bsplit matrix factorial + +@table @t +@item gtt_ekn3.init_bsplit(|minsize=16,levelmax=1); +:: binary split の実行のためのパラメータを設定する. +@item gtt_ekn3.init_dm_bsplit(|bsplit_x=0, bsplit_reduce=0) +:: binary split の分散実行のためのパラメータを設定する. +@item gtt_ekn3.setup_dm_bsplit(C) +:: binary split の分散実行のために C 個のプロセスを立ち上げる. +@end table + +@comment --- 引数の簡単な説明 --- 以下まだ書いてない. +@table @var +@item C はlevelmax-1 に設定する. 特に levalmax=1 のときは分散計算を行わない. +@item bsplit_x=1 のとき, debug 用に各プロセスを xterm で表示. +@end table + +@comment --- ここで関数の詳しい説明 --- +@comment --- @itemize〜@end itemize は箇条書き --- +@comment --- @bullet は黒点付き --- +@itemize @bullet +@item expectation などの関数に bs=1 オプションを与えると matrix factorial を binary +splitting method で計算する. +@end itemize + +@comment --- @example〜@end example は実行例の表示 --- +例: bs=1 と無い場合の比較. +@example +[4618] cputime(1)$ +[4619] gtt_ekn3.expectation(Marginal=[[1950,2550,5295],[1350,1785,6660]], + P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]]|bs=1)$ +4.912sec(4.914sec) +[4621] V2=gtt_ekn3.expectation(Marginal=[[1950,2550,5295],[1350,1785,6660]], + P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]])$ +6.752sec(6.756sec) +@end example + + +@comment --- @example〜@end example は実行例の表示 --- +例: 分散計算する場合. +分散計算はかえって遅くなる場合が多いので注意. +下記の例での bsplit_x=1 option は +debug windows を開くのでさらに遅くなる. +gtt_ekn3.test_bs_dist(); でもテストできる. +@example +[3669] C=4$ gtt_ekn3.init_bsplit(|minsize=16,levelmax=C+1)$ gtt_ekn3.init_dm_bsplit(|bsplit_x=1)$ +[3670] [3671] [3672] gtt_ekn3.setup_dm_bsplit(C); +[0,0] +[3673] gtt_ekn3.assert2(10|bs=1)$ +@end example + +@comment --- 参照(リンク)を書く --- +@table @t +@item 参照 +@ref{gtt_ekn3.gmvector} +@ref{gtt_ekn3.expectation} +@ref{gtt_ekn3.assert1} +@ref{gtt_ekn3.assert2} +@end table + +@comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため +@noindent +ChangeLog +@itemize @bullet +@item + 関連ファイルは + gtt_ekn3/mfac_bs.rr + gtt_ekn3/dm_bsplit.rr @end itemize