[BACK]Return to gtt_ekn-ja.texi CVS log [TXT][DIR] Up to [local] / OpenXM / src / asir-contrib / packages / doc / gtt_ekn

Annotation of OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi, Revision 1.18

1.18    ! takayama    1: %% $OpenXM: OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi,v 1.17 2019/04/04 22:49:40 takayama Exp $
1.12      takayama    2: %% xetex gtt_ekn-ja.texi   (.texi までつける. )
1.6       takayama    3: %% 以下コメントは @comment で始める.  \input texinfo 以降は普通の tex 命令は使えない.
1.7       takayama    4: \input texinfo-ja
1.1       takayama    5: @iftex
                      6: @catcode`@#=6
                      7: @def@fref#1{@xrefX[#1,,@code{#1},,,]}
1.7       takayama    8: @def@b#1{{@bf #1}}
1.1       takayama    9: @catcode`@#=@other
                     10: @end iftex
                     11: @overfullrule=0pt
1.7       takayama   12: @documentlanguage ja
1.1       takayama   13: @c -*-texinfo-*-
                     14: @comment %**start of header
1.6       takayama   15: @comment --- おまじない終り ---
1.1       takayama   16:
1.6       takayama   17: @comment --- GNU info ファイルの名前 ---
1.1       takayama   18: @setfilename xyzman
                     19:
1.6       takayama   20: @comment --- タイトル ---
                     21: @settitle 2元分割表HGM
1.1       takayama   22:
                     23: @comment %**end of header
                     24: @comment %@setchapternewpage odd
                     25:
1.6       takayama   26: @comment --- おまじない ---
1.1       takayama   27: @ifinfo
                     28: @macro fref{name}
                     29: @ref{\name\,,@code{\name\}}
                     30: @end macro
                     31: @end ifinfo
                     32:
                     33: @iftex
                     34: @comment @finalout
                     35: @end iftex
                     36:
                     37: @titlepage
1.6       takayama   38: @comment --- おまじない終り ---
1.1       takayama   39:
1.6       takayama   40: @comment --- タイトル, バージョン, 著者名, 著作権表示 ---
                     41: @title 2元分割表HGM関数
                     42: @subtitle Risa/Asir 2元分割表HGM関数説明書
1.8       takayama   43: @subtitle 1.2 版
1.15      takayama   44: @subtitle 2019 年 3 月 20 日
1.1       takayama   45:
                     46: @author  by Y.Goto, Y.Tachibana, N.Takayama
                     47: @page
                     48: @vskip 0pt plus 1filll
                     49: Copyright @copyright{} Risa/Asir committers
                     50: 2004--2010. All rights reserved.
                     51: @end titlepage
                     52:
1.6       takayama   53: @comment --- おまじない ---
1.1       takayama   54: @synindex vr fn
1.6       takayama   55: @comment --- おまじない終り ---
1.1       takayama   56:
1.6       takayama   57: @comment --- @node は GNU info, HTML 用 ---
                     58: @comment --- @node  の引数は node-name,  next,  previous,  up ---
1.1       takayama   59: @node Top,, (dir), (dir)
                     60:
1.6       takayama   61: @comment --- @menu は GNU info, HTML 用 ---
                     62: @comment --- chapter 名を正確に並べる ---
                     63: @comment --- この文書では chapter XYZ, Chapter Index がある.
                     64: @comment ---  Chapter XYZ には section XYZについて, section XYZに関する関数がある.
1.1       takayama   65: @menu
1.6       takayama   66: * 2元分割表HGMの関数説明書について::
                     67: * 2元分割表HGMの関数::
                     68: * modular計算
1.1       takayama   69: * Index::
                     70: @end menu
                     71:
1.6       takayama   72: @comment --- chapter の開始 ---
                     73: @comment --- 親 chapter 名を正確に. 親がない場合は Top ---
                     74: @node 2元分割表HGMの関数説明書について,,, Top
                     75: @chapter 2元分割表HGMの関数説明書について
                     76:
                     77: この説明書では
                     78: HGM(holonomic gradient method) を用いた2元分割表の関数について説明する.
                     79: ChangeLog の項目は www.openxm.org の cvsweb で
                     80: ソースコードを読む時の助けになる情報が書かれている.
1.8       takayama   81: このパッケージは下記のようにロードする.
                     82: @example
1.13      takayama   83: load("gtt_ekn3.rr");
1.8       takayama   84: @end example
1.13      takayama   85: gtt_ekn3.rr は gtt_ekn.rr を置き換える大きく改良されたパッケージである.
                     86: 以下のモジュール名 gtt_ekn はすべて gtt_ekn3 と読み替えてほしい.
1.8       takayama   87: @noindent
                     88: 最新版の asir-contrib package を取得するには, 下記のように更新関数を呼び出す.
                     89: @example
                     90: import("names.rr");
                     91: asir_contrib_update(|update=1);
                     92: @end example
                     93: @noindent
1.6       takayama   94: 本文中で引用している文献を列挙する.
1.1       takayama   95: @itemize @bullet
                     96: @item [GM2016]
                     97: Y.Goto, K.Matsumoto, Pfaffian equations and contiguity relations of the hypergeometric function of type (k+1,k+n+2) and their applications, arxiv:1602.01637 (version 1)
                     98: @item [T2016]
1.6       takayama   99: Y.Tachibana, 差分ホロノミック勾配法のモジュラーメソッドによる計算の高速化,
                    100: 2016, 神戸大学修士論文.
1.1       takayama  101: @item [GTT2016]
1.6       takayama  102: Y.Goto, Y.Tachibana, N.Takayama, 2元分割表に対する差分ホロノミック勾配法の実装,
1.8       takayama  103: 数理研講究録.
                    104: @item [TGKT]
                    105: Y.Tachibana, Y.Goto, T.Koyama, N.Takayama,
                    106: Holonomic Gradient Method for Two Way Contingency Tables,
                    107: arxiv:1803.04170
1.1       takayama  108: @item [TKT2015]
                    109: N.Takayama, S.Kuriki, A.Takemura,
                    110:          $A$-hypergeometric distributions and Newton polytopes.
                    111:          arxiv:1510.02269
                    112: @end itemize
                    113:
1.6       takayama  114: このマニュアルで説明する関数を用いたプログラム例は
1.1       takayama  115: gtt_ekn/test-t1.rr
1.6       takayama  116: など.
1.1       takayama  117:
1.4       takayama  118:
1.6       takayama  119: @node 2元分割表HGMの関数,,, Top
                    120: @chapter 2元分割表HGMの関数
1.1       takayama  121:
1.6       takayama  122: @comment --- section ``実験的関数'' の subsection xyz_abc
                    123: @comment --- subsection xyz_pqr xyz_stu がある.
1.1       takayama  124: @menu
                    125: * gtt_ekn.gmvector::
                    126: * gtt_ekn.nc::
                    127: * gtt_ekn.lognc::
                    128: * gtt_ekn.expectation::
                    129: * gtt_ekn.setup::
                    130: * gtt_ekn.upAlpha::
1.5       takayama  131: * gtt_ekn.cmle::
1.8       takayama  132: * gtt_ekn.set_debug_level::
1.15      takayama  133: * gtt_ekn.contiguity_mat_list_2::
1.9       takayama  134: * gtt_ekn.show_path::
1.12      takayama  135: * gtt_ekn.get_svalue::
1.10      takayama  136: * gtt_ekn.assert1::
                    137: * gtt_ekn.assert2::
1.18    ! takayama  138: * gtt_ekn.assert3::
        !           139: * gtt_ekn.prob1::
1.1       takayama  140: @end menu
                    141:
1.6       takayama  142: @node 超幾何関数E(k,n),,, 2元分割表HGMの関数
                    143: @section 超幾何関数E(k,n)
1.1       takayama  144:
                    145: @comment **********************************************************
1.6       takayama  146: @comment --- ◯◯◯◯  の説明
                    147: @comment --- 個々の関数の説明の開始 ---
                    148: @comment --- section 名を正確に ---
                    149: @node gtt_ekn.gmvector,,, 超幾何関数E(k,n)
1.1       takayama  150: @subsection @code{gtt_ekn.gmvector}
1.6       takayama  151: @comment --- 索引用キーワード
1.1       takayama  152: @findex gtt_ekn.gmvector
                    153:
                    154: @table @t
                    155: @item gtt_ekn.gmvector(@var{beta},@var{p})
1.6       takayama  156: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表に付随する超幾何関数
                    157: E(k,n) の値およびその微分の値を戻す.
1.1       takayama  158: @item gtt_ekn.ekn_cBasis_2(@var{beta},@var{p})
1.6       takayama  159: の別名である.
1.1       takayama  160: @end table
                    161:
1.6       takayama  162: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  163: @table @var
                    164: @item return
1.6       takayama  165: ベクトル, 超幾何関数の値とその微分. 詳しくは下記.
1.1       takayama  166: @item beta
1.6       takayama  167: 行和, 列和のリスト. 成分はすべて正であること.
1.1       takayama  168: @item p
1.6       takayama  169: 二元分割表のセルの確率のリスト
1.1       takayama  170: @end table
                    171:
1.6       takayama  172: @comment --- ここで関数の詳しい説明 ---
                    173: @comment --- @itemize〜@end itemize は箇条書き ---
                    174: @comment --- @bullet は黒点付き ---
1.1       takayama  175: @itemize @bullet
                    176: @item
1.6       takayama  177: gmvector は Gauss-Manin vector の略である [GM2016].
1.1       takayama  178: @item
1.6       takayama  179: gmvector の戻り値は
                    180: [GM2016] の 6章 p.23 のベクトル Sである.
                    181: これは
                    182: [GM2016] の4章で定義されているベクトル F の定数倍であり,
                    183: その定数は
                    184: 第一成分が [GM2016] の6章で定義されている級数 S の値と等しく
                    185: なるように決められている.
1.1       takayama  186: @item
1.6       takayama  187:  r1 x r2 分割表を考える.
                    188:  m+1=r1, n+1=r2 とおく.
                    189:  正規化定数 Z は分割表 u を (m+1) × (n+1) 行列とするとき p^u/u! の和である.
                    190:  ここで和は行和列和が @var{beta} であるような u 全体でとる
1.1       takayama  191:  [TKT2015], [GM2016].
1.6       takayama  192:  S はこの多項式 Z の p を
1.1       takayama  193: @verbatim
                    194:   [[1,y11,...,y1n],
                    195:    [1,y21,...,y2n],...,
                    196:    [1,ym1, ...,ymn],
                    197:    [1,1, ..., 1]]
                    198: @end verbatim
1.6       takayama  199:  (1 が L 字型に並ぶ),
                    200: と正規化した級数である.
1.1       takayama  201: @item
1.6       takayama  202: 2x(n+1)分割表で, gmvector の戻り値を Lauricella  F_D で書くことが
                    203: 以下のようにできる
                    204: (b[2][1]-b[1][1] >= 0 の場合).
                    205: ここで b[1][1], b[1][2] は, それぞれ 1 行目の行和, 2 行目の行和,
                    206: b[2][i] は i 列目の列和である.
1.1       takayama  207: @comment ekn/Talks/2015-12-3-goto.tex
                    208: @verbatim
                    209: S=F_D(-b[1,1], [-b[2,2],...,-b[2,n+1]], b[2,1]-b[1,1]+1 ; y)/C,
                    210: @end verbatim
1.8       takayama  211: C=b[1,1]! b[2,2]! ... b[2,n+1]! (b[2,1]-b[1,1])!
1.6       takayama  212: とおく.
                    213: 1/C は L 字型の分割表
1.1       takayama  214: @verbatim
                    215: [[b[1,1],       0,      ..., 0       ],
                    216:  [b[2,1]-b[1,1],b[2,2], ..., b[2,n+1]]]
                    217: @end verbatim
1.6       takayama  218: に対応.
                    219: gmvector は
1.1       takayama  220: @verbatim
                    221: [S,(y11/a2) d_11 S,(y12/a3) d_12 S, ..., (y1n/a_(n+1)) d_1n S]
                    222: @end verbatim
1.6       takayama  223: である.
                    224: ここで d_ij は yij についての微分,
1.1       takayama  225: @verbatim
                    226:   [a0,     a1, ...                      ,a_(n+2)]
                    227: = [-b[1,2],-b[1,1],b[2,2], ..., b[2,n+1],b[2,1]]
                    228: @end verbatim
1.6       takayama  229: である.
1.1       takayama  230: @item
1.6       takayama  231: 周辺和 @var{beta}の時の正規化定数のセル確率 @var{p} に対する値は 多項式に退化した E(k,n) の値で表現できる. 文献 [TKT2015], [GM2016] 参照.
1.1       takayama  232: @item
1.17      takayama  233: 以下の option は expectation その他でも使える.
1.16      takayama  234: @item
1.6       takayama  235: option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう
1.1       takayama  236: [T2016].
1.6       takayama  237: 分散計算用の各種パラメータの設定は
                    238: gtt_ekn.setup で行なう.
1.16      takayama  239: @item
                    240: option bs=1.  binary splitting method で matrix factorial を計算.
                    241: 一般に 3x3 では効果あり(assert2(15|bs=1)), 5x5 (test5x5(20|bs=1))では遅くなる.
                    242: デフォールトは bs=0.
                    243: @item
                    244: option path. contiguity を適用する path をきめるアルゴリズムを指定.
1.17      takayama  245: path=2 (後藤, 松本の論文 [GM2016] の path). path=3 (論文 [TGKT] の path).
1.16      takayama  246: デフォールトは path=3.
1.17      takayama  247: @item
                    248: option interval. 通常の matrix factorial の計算では, 分母と分子をそれぞれ整数計算で計算し最後に約分をする. しかしながら数の中間膨張が一般的に発生しその中間膨張を解消するため
                    249: 約分を一定間隔で行うと計算効率がよくなる.
                    250: interval に整数値を設定することにより行列による一次変換を interval 回するたびに約分を行う.
                    251: interval の最適値は問題毎に異なるためシステムがデフォールト値を設定することはない.
1.18    ! takayama  252: @item
        !           253: option x=1. subprocess 毎に window を開く.
1.1       takayama  254: @end itemize
                    255:
1.6       takayama  256: @comment --- @example〜@end example は実行例の表示 ---
                    257: 例: 次は2 x 2 分割表で行和が [5,1],  列和が [3,3], 各セルの確率が
                    258: [[1/2,1/3],[1/7,1/5]] の場合の gmvector の値である.
1.1       takayama  259: @example
                    260: [3000] load("gtt_ekn.rr");
                    261: [3001] ekn_gtt.gmvector([[5,1],[3,3]],[[1/2,1/3],[1/7,1/5]])
                    262: [775/27783]
                    263: [200/9261]
                    264: @end example
                    265:
1.8       takayama  266: 例: N を2以上の自然数とする時, Gauss の超幾何関数(この場合は多項式となる)
                    267: F(-36N,-11N,2N,(1-1/N)/56) の値は T3 に代入される ( [TGKT] ).
                    268: @comment ekn/Prog2/2x2.rr
                    269: @example
                    270: N=2;
                    271: T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]],[[1,(1-1/N)/56],[1,1]])[0][0];
                    272: D=fac(36*N)*fac(11*N)*fac(2*N-1);
                    273: T3=T2*D;
                    274: @end example
                    275: ちなみに同じ値を Mathematica に計算させるには
                    276: @example
                    277: n=2; Hypergeometric2F1[-36*n,-11*n,2*n,(1-1/n)/56]
                    278: @end example
                    279:
1.17      takayama  280: 例: interval option
                    281: @example
                    282: [4009] P=gtt_ekn3.prob1(5,5,100);
                    283: [[[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]]]
                    284:
                    285: [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];
                    286: [cpu,72.852,gc,0,memory,4462742364,real,72.856]
                    287:
                    288: [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];
                    289: [cpu,67.484,gc,0,memory,3535280544,real,67.4844]
                    290: @end example
                    291:
1.6       takayama  292: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
                    293: 計算ができる.
                    294: 守備範囲の異なるプログラム同士の比較, debug 用参考.
1.1       takayama  295: @example
                    296: [3080] import("tk_fd.rr");
                    297: [3081] A=tk_fd.marginal2abc([4,5],[2,4,3]);
1.6       takayama  298: [-4,[-4,-3],-1]  // 2変数 FD のパラメータ. a,[b1,b2],c
1.1       takayama  299: [3082] tk_fd.fd_hessian2(A[0],A[1],A[2],[1/2,1/3]);
                    300: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                    301: [4483/124416,[ 1961/15552 185/1728 ],
                    302:  [ 79/288 259/864 ]
                    303:  [ 259/864 47/288 ]]
1.6       takayama  304: // 戻値は [F=F_D, gradient(F), Hessian(F)]
1.1       takayama  305:
1.6       takayama  306: // ekn_gt での例と同じパラメータ.
1.1       takayama  307: [3543] A=tk_fd.marginal2abc([5,1],[3,3]);
                    308: [-5,[-3],-1]
                    309: [3544] tk_fd.fd_hessian2(A[0],A[1],A[2],[(1/3)*(1/7)/((1/2)*(1/5))]);
                    310: Computing Dmat(ca) for parameters B=[-3],X=[ 10/21 ]
                    311: [775/27783,[ 20/147 ],[ 17/42 ]]
                    312: @end example
                    313:
1.6       takayama  314: 参考: 一般の A 分布の正規化定数についての Hessian の計算は実験的 package ot_hessian_ahg.rr
                    315: で実装のテストがされている. (これはまだ未完成のテスト版なので出力形式等も将来的には変更される.)
1.1       takayama  316: @example
                    317: import("ot_hgm_ahg.rr");
                    318: import("ot_hessian_ahg.rr");
                    319: def  htest4() @{
                    320:   extern C11_A;
                    321:   extern C11_Beta;
                    322:   Hess=newmat(7,7);
                    323:   A =C11_A;
                    324:   Beta0= [b0,b1,b2,b3];
                    325:   BaseIdx=[4,5,6];
                    326:   X=[x0,x1,x2,x3,x4,x5,x6];
                    327:   for (I=0; I<7; I++) for (J=0; J<7; J++) @{
                    328:     Idx = [I,J];
                    329:     H=hessian_simplify(A,Beta0,X,BaseIdx,Idx);
                    330:     Hess[I][J]=H;
                    331:     printf("[I,J]=%a, Hessian_ij=%a\n",Idx,H);
                    332:   @}
                    333:   return(Hess);
                    334: @}
                    335: [2917] C11_A;
                    336: [[0,0,0,1,1,1,1],[1,0,0,1,0,1,0],[0,1,1,0,1,0,1],[1,1,0,1,1,0,0]]
                    337: [2918] C11_Beta;
                    338: [166,36,290,214]
                    339: [2919] Ans=htest4$
                    340: [2920] Ans[0][0];
                    341: [[((b1-b0-1)*x4)/(x0^2),[4]],[((b1-b0-1)*x6)/(x0^2),[6]],
                    342:  [(b1^2+(-2*b0-1)*b1+b0^2+b0)/(x0^2),[]],[(x6)/(x0),[6,0]],[(x4)/(x0),[4,0]]]
                    343: @end example
                    344:
1.6       takayama  345: @comment --- 参照(リンク)を書く ---
1.1       takayama  346: @table @t
1.6       takayama  347: @item 参照
1.1       takayama  348: @ref{gtt_ekn.setup}
                    349: @ref{gtt_ekn.pfaffian_basis}
                    350: @end table
                    351:
1.6       takayama  352: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  353: @noindent
                    354: ChangeLog
                    355: @itemize @bullet
                    356: @item
1.6       takayama  357:  この関数は
                    358: [GM2016] のアルゴリズムおよび
1.17      takayama  359: [T2016] による modular method を用いた高速化,
                    360: [TGKT] の高速化を実装したものである.
1.1       takayama  361: @item
1.6       takayama  362:  変更を受けたファイルは
1.1       takayama  363:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1, gtt_ekn/ekn_pfaffian_8.rr
1.17      takayama  364: @item
                    365:  interval option について変更を受けたファイルは
                    366:  OpenXM/src/asir-contrib/packages/src/gtt_ekn3/ekn_eval.rr 1.6
1.1       takayama  367: @end itemize
                    368:
                    369:
                    370: @comment **********************************************************
1.6       takayama  371: @node gtt_ekn.nc,,, 超幾何関数E(k,n)
1.1       takayama  372: @subsection @code{gtt_ekn.nc}
1.6       takayama  373: @comment --- 索引用キーワード
1.1       takayama  374: @findex gtt_ekn.nc
                    375:
                    376: @table @t
                    377: @item gtt_ekn.nc(@var{beta},@var{p})
1.6       takayama  378: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表の条件付き確率の正規化定数 Z
                    379: およびその微分の値を戻す.
1.1       takayama  380: @end table
                    381:
1.6       takayama  382: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  383: @table @var
                    384: @item return
1.6       takayama  385: ベクトル [Z,[[d_11 Z, d_12 Z, ...], ..., [d_m1 Z, d_m2 Z, ...., d_mn Z]]]
1.1       takayama  386: @item beta
1.6       takayama  387: 行和, 列和のリスト. 成分はすべて正であること.
1.1       takayama  388: @item p
1.6       takayama  389: 二元分割表のセルの確率のリスト
1.1       takayama  390: @end table
                    391:
1.6       takayama  392: @comment --- ここで関数の詳しい説明 ---
                    393: @comment --- @itemize〜@end itemize は箇条書き ---
                    394: @comment --- @bullet は黒点付き ---
1.1       takayama  395: @itemize @bullet
                    396: @item
1.6       takayama  397:  r1 x r2 分割表を考える.
                    398:  m=r1, n=r2 とおく.
                    399:  正規化定数 Z は分割表 u を m × n 行列とするとき p^u/u! の和である.
                    400:  ここで和は行和列和が @var{beta} であるような u 全体でとる
1.1       takayama  401:  [TKT2015], [GM2016].
1.6       takayama  402:  p^u は p_ij^u_ij の積, u! は u_ij! の積である.
                    403:  d_ij Z で Z の変数 p_ij についての偏微分を表す.
1.1       takayama  404: @item
1.6       takayama  405: nc は gmvector の値を元に, [GM2016] の Prop
                    406:  7.1 に基づいて Z の値を計算する.
1.1       takayama  407: @item
1.6       takayama  408: option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう.
                    409: 分散計算用の各種パラメータの設定は
                    410: gtt_ekn.setup で行なう.
1.17      takayama  411: その他の option は gmvector を参照.
1.1       takayama  412: @end itemize
                    413:
1.6       takayama  414: @comment --- @example〜@end example は実行例の表示 ---
                    415: 例: 2x3 分割表での Z とその微分の計算.
1.1       takayama  416: @example
                    417: [2237] gtt_ekn.nc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]);
                    418: [4483/124416,[ 353/7776 1961/15552 185/1728 ]
                    419: [ 553/20736 1261/15552 1001/13824 ]]
                    420: @end example
                    421:
1.6       takayama  422: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
                    423: 計算ができる.
1.1       takayama  424: @example
                    425: [3076] import("tk_fd.rr");
                    426: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                    427: [-4,[-4,-3],-1]
                    428: [3078] tk_fd.ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                    429: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                    430: [ 1 1 1 ]
                    431: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                    432: [4483/124416,[[353/7776,1961/15552,185/1728],
                    433:               [553/20736,1261/15552,1001/13824]]]
1.6       takayama  434: // 戻値は [Z, [[d_11 Z, d_12 Z, d_13 Z],
                    435: //             [d_21 Z, d_22 Z, d_23 Z]]] の値.
                    436: //           ここで d_ij は i,j 成分についての微分を表す.
1.1       takayama  437: @end example
                    438:
1.6       takayama  439: @comment --- 参照(リンク)を書く ---
1.1       takayama  440: @table @t
1.6       takayama  441: @item 参照
1.1       takayama  442: @ref{gtt_ekn.setup}
                    443: @ref{gtt_ekn.lognc}
                    444: @end table
                    445:
1.6       takayama  446: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  447: @noindent
                    448: ChangeLog
                    449: @itemize @bullet
                    450: @item
1.6       takayama  451:  変更を受けたファイルは
1.1       takayama  452:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1, gtt_ekn/ekn_eval.rr
                    453: @end itemize
                    454:
                    455:
                    456: @comment **********************************************************
1.6       takayama  457: @node gtt_ekn.lognc,,, 超幾何関数E(k,n)
1.1       takayama  458: @subsection @code{gtt_ekn.lognc}
1.6       takayama  459: @comment --- 索引用キーワード
1.1       takayama  460: @findex gtt_ekn.lognc
                    461:
                    462: @table @t
                    463: @item gtt_ekn.lognc(@var{beta},@var{p})
1.6       takayama  464: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表の条件付き確率の正規化定数 Z
                    465: の log の近似値およびその微分の近似値を戻す.
1.1       takayama  466: @end table
                    467:
1.6       takayama  468: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  469: @table @var
                    470: @item return
1.6       takayama  471: ベクトル [log(Z), [[d_11 log(Z), d_12 log(Z), ...], [d_21 log(Z),...], ... ]
1.1       takayama  472: @item beta
1.6       takayama  473: 行和, 列和のリスト. 成分はすべて正であること.
1.1       takayama  474: @item p
1.6       takayama  475: 二元分割表のセルの確率のリスト
1.1       takayama  476: @end table
                    477:
1.6       takayama  478: @comment --- ここで関数の詳しい説明 ---
                    479: @comment --- @itemize〜@end itemize は箇条書き ---
                    480: @comment --- @bullet は黒点付き ---
1.1       takayama  481: @itemize @bullet
                    482: @item
1.6       takayama  483: 条件付き最尤推定に利用する [TKT2015].
                    484: @item option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう.
                    485: 分散計算用の各種パラメータの設定は
                    486: gtt_ekn.setup で行なう.
1.1       takayama  487: @end itemize
                    488:
1.6       takayama  489: @comment --- @example〜@end example は実行例の表示 ---
                    490: 例: 2 × 3 分割表での例. 第一成分のみ近似値.
1.1       takayama  491: @example
                    492: [2238] gtt_ekn.lognc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]);
                    493: [-3.32333832422461674630,[ 5648/4483 15688/4483 13320/4483 ]
                    494: [ 3318/4483 10088/4483 9009/4483 ]]
                    495: @end example
                    496:
1.6       takayama  497: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
                    498: 計算ができる.
1.1       takayama  499: @example
                    500: [3076] import("tk_fd.rr");
                    501: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                    502: [-4,[-4,-3],-1]
                    503: [3078] tk_fd.log_ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                    504: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                    505: [ 1 1 1 ]
                    506: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                    507: [-3.32333832422461674639485797719209322217260539267246045320,
                    508:  [[1.2598706, 3.499442, 2.971224],
                    509:   [0.7401293, 2.250278, 2.009591]]]
1.6       takayama  510: // 戻値は [log(Z),
1.1       takayama  511: //          [[d_11 log(Z), d_12 log(Z), d_13 log(Z)],
                    512: //           [d_21 log(Z), d_22 log(Z), d_23 log(Z)]]]
1.6       takayama  513: // の近似値.
1.1       takayama  514: @end example
                    515:
1.6       takayama  516: @comment --- 参照(リンク)を書く ---
1.1       takayama  517: @table @t
1.6       takayama  518: @item 参照
1.1       takayama  519: @ref{gtt_ekn.setup}
                    520: @ref{gtt_ekn.nc}
                    521: @end table
                    522:
1.6       takayama  523: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  524: @noindent
                    525: ChangeLog
                    526: @itemize @bullet
                    527: @item
1.6       takayama  528:  変更を受けたファイルは
1.1       takayama  529:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1.
                    530: @end itemize
                    531:
                    532: @comment **********************************************************
1.6       takayama  533: @node gtt_ekn.expectation,,, 超幾何関数E(k,n)
1.1       takayama  534: @subsection @code{gtt_ekn.expectation}
1.6       takayama  535: @comment --- 索引用キーワード
1.1       takayama  536: @findex gtt_ekn.expectation
                    537:
                    538: @table @t
                    539: @item gtt_ekn.expectation(@var{beta},@var{p})
1.6       takayama  540: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表の期待値を計算する.
1.1       takayama  541: @end table
                    542:
1.6       takayama  543: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  544: @table @var
                    545: @item return
1.6       takayama  546: 二元分割表の各セルの期待値のリスト.
1.1       takayama  547: @item beta
1.6       takayama  548: 行和, 列和のリスト. 成分はすべて正であること.
1.1       takayama  549: @item p
1.6       takayama  550: 二元分割表のセルの確率のリスト
1.1       takayama  551: @end table
                    552:
1.6       takayama  553: @comment --- ここで関数の詳しい説明 ---
                    554: @comment --- @itemize〜@end itemize は箇条書き ---
                    555: @comment --- @bullet は黒点付き ---
1.1       takayama  556: @itemize @bullet
                    557: @item
1.17      takayama  558: [GM2016] の Algorithm 7.8 の実装. [TGKT] による高速化版 (path=3) がデフォールト.
1.6       takayama  559: @item option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう.
                    560: 分散計算用の各種パラメータの設定は
                    561: gtt_ekn.setup で行なう.
                    562: @item option index を与えると, 指定された成分の期待値のみ計算する.
                    563: たとえば 2 x 2 分割表で index=[[0,0],[1,1]] と指定すると, 1 のある成分の期待値のみ計算する.
1.17      takayama  564: @item その他の option は gmvector を参照.
1.1       takayama  565: @end itemize
                    566:
1.6       takayama  567: @comment --- @example〜@end example は実行例の表示 ---
1.1       takayama  568:
1.6       takayama  569: 2×2, 3×3 の分割表の期待値計算例.
1.1       takayama  570: @example
                    571: [2235] gtt_ekn.expectation([[1,4],[2,3]],[[1,1/3],[1,1]]);
                    572: [ 2/3 1/3 ]
                    573: [ 4/3 8/3 ]
                    574: [2236] gtt_ekn.expectation([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]);
                    575: [ 5648/4483 7844/4483 4440/4483 ]
                    576: [ 3318/4483 10088/4483 9009/4483 ]
                    577:
                    578: [2442] gtt_ekn.expectation([[4,14,9],[11,6,10]],[[1,1/2,1/3],[1,1/5,1/7],[1,1,1]]);
                    579: [ 207017568232262040/147000422096729819 163140751505489940/147000422096729819
                    580:                                         217843368649167296/147000422096729819 ]
                    581: [ 1185482401011137878/147000422096729819 358095302885438604/147000422096729819
                    582:                                          514428205457640984/147000422096729819 ]
                    583: [ 224504673820628091/147000422096729819 360766478189450370/147000422096729819
                    584:                                         737732646860489910/147000422096729819 ]
                    585: @end example
                    586:
1.6       takayama  587: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
                    588: 計算ができる.
1.1       takayama  589: @example
                    590: [3076] import("tk_fd.rr");
                    591: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                    592: [-4,[-4,-3],-1]
                    593: [3078] tk_fd.expectation_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                    594: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                    595: [ 1 1 1 ]
                    596: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                    597: [[5648/4483,7844/4483,4440/4483],
                    598:  [3318/4483,10088/4483,9009/4483]]
1.6       takayama  599: // 各セルの期待値.
1.1       takayama  600: @end example
                    601:
1.6       takayama  602: 参考: 一般の A 分布の計算は ot_hgm_ahg.rr. まだ実験的なため, module 化されていない.
                    603: ot_hgm_ahg.rr についての参考文献:
1.1       takayama  604: K.Ohara, N.Takayama, Pfaffian Systems of A-Hypergeometric Systems II --- Holonomic Gradient Method, arxiv:1505.02947
                    605: @example
                    606: [3237] import("ot_hgm_ahg.rr");
1.6       takayama  607: // 2 x 2 分割表.
1.1       takayama  608: [3238] hgm_ahg_expected_values_contiguity([[0,0,1,1],[1,0,1,0],[0,1,0,1]],
                    609:         [9,6,8],[1/2,1/3,1/5,1/7],[x1,x2,x3,x4]|geometric=1);
                    610: oohg_native=0, oohg_curl=1
                    611: [1376777025/625400597,1750225960/625400597,
                    612:  2375626557/625400597,3252978816/625400597]
1.6       takayama  613: // 2 x 2 分割表の期待値.
1.1       takayama  614:
1.6       takayama  615: // 2 x 3 分割表.
1.1       takayama  616: [3238] hgm_ahg_expected_values_contiguity(
                    617:  [[0,0,0,1,1,1],[1,0,0,1,0,0],[0,1,0,0,1,0],[0,0,1,0,0,1]],
                    618:  [5,2,4,3],[1,1/2,1/3,1,1,1],[x1,x2,x3,x4,x5,x6]|geometric=1);
                    619: [5648/4483,7844/4483,4440/4483,3318/4483,10088/4483,9009/4483]
1.6       takayama  620: // 2 x 3 分割表の期待値. 上と同じ問題.
1.1       takayama  621: @end example
                    622:
1.6       takayama  623: 3 x 3 分割表. 構造的0が一つ.
1.1       takayama  624: @example
                    625: /*
1.6       takayama  626:   dojo, p.221 のデータ.  成績3以下の生徒は集めてひとつに.
1.1       takayama  627:   2 1 1
                    628:   8 3 3
                    629:   0 2 6
                    630:
                    631:   row sum: 4,14,8
                    632:   column sum: 10,6,10
1.6       takayama  633:   0 を一つ含むので, (3,6) 型の A から 7 列目を抜く.
1.1       takayama  634: */
                    635:
                    636: A=[[0,0,0,1,1,1, 0,0],
                    637:    [0,0,0,0,0,0, 1,1],
                    638:    [1,0,0,1,0,0, 0,0],
                    639:    [0,1,0,0,1,0, 1,0],
                    640:    [0,0,1,0,0,1, 0,1]];
                    641: B=[14,8,10,6,10];
                    642: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1],
1.6       takayama  643:                 [x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
1.1       takayama  644:
1.6       takayama  645: // 答.
1.1       takayama  646: [14449864949304/9556267369631,
                    647:  10262588586540/9556267369631, 13512615942680/9556267369631,
                    648:  81112808747006/9556267369631,
                    649:  21816297744346/9556267369631, 30858636683482/9556267369631,
                    650:
                    651:  25258717886900/9556267369631,51191421070148/9556267369631]
                    652: @end example
                    653:
1.6       takayama  654: 3 x 3 分割表.
1.1       takayama  655: @example
                    656: /*
1.6       takayama  657:  上のデータで 0 を 1 に変更.
1.1       takayama  658:   2 1 1
                    659:   8 3 3
                    660:   1 2 6
                    661:
                    662:   row sum: 4,14,9
                    663:   column sum: 11,6,10
                    664: */
                    665: A=[[0,0,0,1,1,1,0,0,0],
                    666:    [0,0,0,0,0,0,1,1,1],
                    667:    [1,0,0,1,0,0,1,0,0],
                    668:    [0,1,0,0,1,0,0,1,0],
                    669:    [0,0,1,0,0,1,0,0,1]];
                    670: B=[14,9,11,6,10];
                    671: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1,1],
                    672:                               [x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
                    673:
1.6       takayama  674: // 期待値, 答.   x9 を指定していないので, 9番目の期待値は出力してない.
1.1       takayama  675: [207017568232262040/147000422096729819,
                    676:  163140751505489940/147000422096729819,217843368649167296/147000422096729819,
                    677:  1185482401011137878/147000422096729819,
                    678:  358095302885438604/147000422096729819,514428205457640984/147000422096729819,
                    679:  224504673820628091/147000422096729819,360766478189450370/147000422096729819]
                    680:
1.6       takayama  681: // Z やその微分の計算は hgm_ahg_contiguity 関数がおこなうが, これの簡易インターフェースは
                    682: // まだ書いてない.
1.1       takayama  683: @end example
                    684:
                    685:
                    686:
1.6       takayama  687: @comment --- 参照(リンク)を書く ---
1.1       takayama  688: @table @t
1.6       takayama  689: @item 参照
1.1       takayama  690: @ref{gtt_ekn.setup}
                    691: @ref{gtt_ekn.nc}
                    692: @end table
                    693:
1.6       takayama  694: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  695: @noindent
                    696: ChangeLog
                    697: @itemize @bullet
                    698: @item
1.6       takayama  699:  変更を受けたファイルは
1.1       takayama  700:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1.
                    701: @end itemize
                    702:
                    703:
                    704: @comment **********************************************************
1.6       takayama  705: @comment --- ◯◯◯◯  の説明
                    706: @comment --- 個々の関数の説明の開始 ---
                    707: @comment --- section 名を正確に ---
                    708: @node gtt_ekn.setup,,, 超幾何関数E(k,n)
1.1       takayama  709: @subsection @code{gtt_ekn.setup}
1.6       takayama  710: @comment --- 索引用キーワード
1.1       takayama  711: @findex gtt_ekn.setup
                    712:
                    713: @table @t
                    714: @item gtt_ekn.setup()
1.6       takayama  715: :: 分散計算用の環境設定をおこなう. 現在の環境を報告する.
1.1       takayama  716: @end table
                    717:
1.6       takayama  718: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  719: @table @var
                    720: @item return
                    721:
                    722: @end table
                    723:
1.6       takayama  724: @comment --- ここで関数の詳しい説明 ---
                    725: @comment --- @itemize〜@end itemize は箇条書き ---
                    726: @comment --- @bullet は黒点付き ---
1.3       takayama  727: @itemize @bullet
1.6       takayama  728: @item 使用するプロセスと素数の個数, 最小の素数を表示する. 準備されていない場合はその旨を表示.
                    729: @item このパッケージでの分散計算は複数のcpuを搭載した計算機で実行されることを想定している.
                    730: @item option nps (または number_of_processes)を与えると指定した数だけプロセスを用意する.
                    731: @item option nprm (または number_of_primes)を与えるとnprmが文字列の場合指定された素数リストのファイルを読み込む. nprmが自然数の場合さらにoption minp (minp =MINimum Prime)を与えるとminpより大きな素数をnprm個生成する. その際option fgp (または file_of_generated_primes)を与えると生成した素数リストをファイル名をfgpとして保存する.
                    732: @item 上記のoption を指定しなかった場合次のデフォルト値が用いられる. nps=1. nprm=10. fgp=0.
                    733: @item option report=1を与えると現在の環境の報告のみを行う. setup(|report=1)の別名としてreport関数を使用することもできる.
                    734: @item option subprogs=[file1,file2,...] により分散計算の子供プロセスにロードすべきファイル file1, file2, ... を指定する. default は subprogs=["gtt_ekn/childprocess.rr"] である.
1.8       takayama  735: @item gtt_ekn.set_debug_level(Mode) で Ekn_debug の値を設定する.
1.1       takayama  736: @end itemize
                    737:
1.6       takayama  738: @comment --- @example〜@end example は実行例の表示 ---
                    739: 例: 素数のリストを生成してファイル p.txt へ書き出す.
1.1       takayama  740: @example
                    741: gtt_ekn.setup(|nps=2,nprm=20,minp=10^10,fgp="p.txt")$
                    742: @end example
                    743:
1.8       takayama  744: 例: chinese remainder theorem (crt) を使って gmvector を計算.
                    745: @example
                    746: [2867] gtt_ekn.setup(|nprm=20,minp=10^20);
                    747: [2868] N=2; T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]],
                    748:                                 [[1,(1-1/N)/56],[1,1]] | crt=1)$
                    749: @end example
                    750:
1.1       takayama  751:
1.6       takayama  752: @comment --- 参照(リンク)を書く ---
1.1       takayama  753: @table @t
1.6       takayama  754: @item 参照
1.1       takayama  755: @ref{gtt_ekn.nc}
                    756: @ref{gtt_ekn.gmvector}
                    757: @end table
                    758:
1.6       takayama  759: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  760: @noindent
                    761: ChangeLog
                    762: @itemize @bullet
                    763: @item
1.6       takayama  764:  変更を受けたファイルは
1.1       takayama  765:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1,
                    766:  gtt_ekn/g_mat_fac.rr
                    767:
                    768: @end itemize
                    769:
                    770: @comment **********************************************************
1.6       takayama  771: @comment --- ◯◯◯◯  の説明
                    772: @comment --- 個々の関数の説明の開始 ---
                    773: @comment --- section 名を正確に ---
                    774: @node gtt_ekn.upAlpha,,, 超幾何関数E(k,n)
1.12      takayama  775: @node gtt_ekn.downAlpha,,, 超幾何関数E(k,n)
                    776: @subsection @code{gtt_ekn.upAlpha}, @code{gtt_ekn.downAlpha}
1.6       takayama  777: @comment --- 索引用キーワード
1.1       takayama  778: @findex gtt_ekn.upAlpha
1.12      takayama  779: @findex gtt_ekn.downAlpha
1.1       takayama  780:
                    781: @table @t
                    782: @item gtt_ekn.upAlpha(@var{i},@var{k},@var{n})
1.12      takayama  783: @item gtt_ekn.downAlpha(@var{i},@var{k},@var{n})
1.1       takayama  784: ::
                    785: @end table
                    786:
1.6       takayama  787: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  788: @table @var
1.12      takayama  789: @item i  a_i を a_i+1 (a_i を a_i-1) と変化させる contiguity relation.
1.6       takayama  790: @item k  E(k+1,n+k+2)型の超幾何関数の k. 分割表では (k+1)×(n+1).
                    791: @item n  E(k+1,n+k+2)型の超幾何関数の n. 分割表では (k+1)×(n+1).
                    792: @item return  contiguity relation の pfaffian_basis についての行列表現を戻す. [GM2016] の Cor 6.3.
1.1       takayama  793: @end table
                    794:
1.6       takayama  795: @comment --- ここで関数の詳しい説明 ---
                    796: @comment --- @itemize〜@end itemize は箇条書き ---
                    797: @comment --- @bullet は黒点付き ---
1.1       takayama  798: @itemize @bullet
                    799: @item
1.6       takayama  800:  upAlpha は [GM2016] の Cor 6.3 の行列 U_i を戻す.
                    801: @item 関連する各関数の簡潔な説明と例も加える.
                    802: @item a_i を a_i-1 と変化させたい場合は関数 downAlpha を用いる.
                    803: @item a_i と分割表の周辺和を見るには, 関数 marginaltoAlpha([行和,列和]) を用いる.
1.1       takayama  804: @item
1.6       takayama  805:    pfaffian_basis は [GM2016] の4章のベクトル F に対応する偏微分を戻す.
1.12      takayama  806: @item optional 引数 arule, xrule で a_i や x_i_j を数にしたものをより効率的に求めることができる. 変化をうけるパラメータを数にしてしまっても特にエラー表示はしない. a_0 で和の条件を調整しているので注意(Todo, double check).
1.1       takayama  807: @end itemize
                    808:
1.6       takayama  809: @comment --- @example〜@end example は実行例の表示 ---
                    810: 例: 以下の例は 2×2分割表(E(2,4)), 2×3分割表(E(2,5))の場合である.
                    811: [2225] までは出力を略している.
1.1       takayama  812: @example
                    813: [2221] gtt_ekn.marginaltoAlpha([[1,4],[2,3]]);
                    814: [[a_0,-4],[a_1,-1],[a_2,3],[a_3,2]]
1.6       takayama  815: [2222] gtt_ekn.upAlpha(1,1,1);  // E(2,4) の a_1 方向の
                    816:                                 //     contiguity を表現する行列
                    817: [2223] gtt_ekn.upAlpha(2,1,1);  // E(2,4) の a_2 方向
                    818: [2224] gtt_ekn.upAlpha(3,1,1);  // E(2,4) の a_3 方向
1.1       takayama  819: [2225] function f(x_1_1);
                    820: [2232] gtt_ekn.pfaffian_basis(f(x_1_1),1,1);
                    821: [ f(x_1_1) ]
                    822: [ (f{1}(x_1_1)*x_1_1)/(a_2) ]
                    823: [2233] function f(x_1_1,x_1_2);
                    824: f() redefined.
1.6       takayama  825: [2234] gtt_ekn.pfaffian_basis(f(x_1_1,x_1_2),1,2); // E(2,5), 2*3 分割表
1.1       takayama  826: [ f(x_1_1,x_1_2) ]
                    827: [ (f{1,0}(x_1_1,x_1_2)*x_1_1)/(a_2) ]
                    828: [ (f{0,1}(x_1_1,x_1_2)*x_1_2)/(a_3) ]
1.12      takayama  829:
                    830: [2235]   RuleA=[[a_2,1/3],[a_3,1/2]]$ RuleX=[[x_1_1,1/5]]$
                    831:   base_replace(gtt_ekn.upAlpha(1,1,1),append(RuleA,RuleX))
                    832:  -gtt_ekn.upAlpha(1,1,1 | arule=RuleA, xrule=RuleX);
                    833:
                    834: [ 0 0 ]
                    835: [ 0 0 ]
                    836:
1.1       takayama  837: @end example
                    838:
                    839:
1.6       takayama  840: @comment --- 参照(リンク)を書く ---
1.1       takayama  841: @table @t
1.6       takayama  842: @item 参照
1.1       takayama  843: @ref{gtt_ekn.nc}
                    844: @ref{gtt_ekn.gmvector}
                    845: @end table
                    846:
1.6       takayama  847: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  848: @noindent
                    849: ChangeLog
                    850: @itemize @bullet
                    851: @item
1.6       takayama  852:  この関数は [GM2016]
                    853: で与えられたアルゴリズムに従い contiguity relation を導出する.
1.1       takayama  854: @item
1.6       takayama  855:  変更を受けたファイルは
1.1       takayama  856:  OpenXM/src/asir-contrib/packages/src/gtt_ekn/ekn_pfaffian_8.rr 1.1.
                    857: @end itemize
                    858:
                    859:
1.5       takayama  860: @comment **********************************************************
1.6       takayama  861: @comment --- ◯◯◯◯  の説明
                    862: @comment --- 個々の関数の説明の開始 ---
                    863: @comment --- section 名を正確に ---
                    864: @node gtt_ekn.cmle,,, 超幾何関数E(k,n)
1.5       takayama  865: @subsection @code{gtt_ekn.cmle}
1.6       takayama  866: @comment --- 索引用キーワード
1.5       takayama  867: @findex gtt_ekn.cmle
                    868:
                    869: @table @t
1.6       takayama  870: @item gtt_ekn.cmle(@var{u}) u を観測データとするとき, P(U=u | row sum, column sum = these of U) を最大化する, 各セルの確率の近似値を求める.
1.5       takayama  871: ::
                    872: @end table
                    873:
1.6       takayama  874: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.5       takayama  875: @table @var
1.6       takayama  876: @item u  観測データ(分割表)
                    877: @item return  セルの確率(分割表形式)
1.5       takayama  878: @end table
                    879:
1.6       takayama  880: @comment --- ここで関数の詳しい説明 ---
                    881: @comment --- @itemize〜@end itemize は箇条書き ---
                    882: @comment --- @bullet は黒点付き ---
1.5       takayama  883: @itemize @bullet
1.6       takayama  884: @item u を観測データとするとき, P(U=u | row sum, column sum = these of U) を最大化する, 各セルの確率の近似値を求める.
                    885: @item optional parameter で algorithm の振る舞い(たとえば有理数を近似して, 分母分子が小さい有理数にする, gradient descent の step幅)を調整すべきだが, これは作業中. 2017.03.03
1.5       takayama  886: @end itemize
                    887:
1.6       takayama  888: @comment --- @example〜@end example は実行例の表示 ---
                    889: 例: 2 x 4 分割表.
1.5       takayama  890: @example
                    891: U=[[1,1,2,3],[1,3,1,1]];
                    892: gtt_ekn.cmle(U);
                    893:  [[ 1 1 2 3 ]
                    894:   [ 1 3 1 1 ],[[7,6],[2,4,3,4]],   // Data, row sum, column sum
                    895:  [ 1 67147/183792 120403/64148 48801/17869 ]  // probability obtained.
                    896:  [ 1 1 1 1 ]]
                    897: @end example
                    898:
1.6       takayama  899: 例: 上の例は次の関数に.
1.5       takayama  900: @example
                    901: gtt_ekn.cmle_test3();
                    902: @end example
                    903:
1.6       takayama  904: @comment --- 参照(リンク)を書く ---
1.5       takayama  905: @table @t
1.6       takayama  906: @item 参照
1.5       takayama  907: @ref{gtt_ekn.expectation}
                    908: @end table
                    909:
1.6       takayama  910: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.5       takayama  911: @noindent
                    912: ChangeLog
                    913: @itemize @bullet
1.6       takayama  914: @item  gtt_ekn/mle.rr に本体がある.
                    915: @item  gtt_ekn.rr の cmle 関数は wrapper.
1.5       takayama  916: @end itemize
                    917: @comment end cmle.
                    918:
1.8       takayama  919: @comment **********************************************************
                    920: @comment --- ◯◯◯◯  の説明
                    921: @comment --- 個々の関数の説明の開始 ---
                    922: @comment --- section 名を正確に ---
                    923: @node gtt_ekn.set_debug_level,,, 超幾何関数E(k,n)
1.15      takayama  924: @node gtt_ekn.contiguity_mat_list_2,,, 超幾何関数E(k,n)
1.9       takayama  925: @node gtt_ekn.show_path,,, 超幾何関数E(k,n)
1.12      takayama  926: @node gtt_ekn.get_svalue,,, 超幾何関数E(k,n)
1.10      takayama  927: @node gtt_ekn.assert1,,, 超幾何関数E(k,n)
                    928: @node gtt_ekn.assert2,,, 超幾何関数E(k,n)
1.18    ! takayama  929: @node gtt_ekn.assert3,,, 超幾何関数E(k,n)
1.11      takayama  930: @node gtt_ekn.prob1,,, 超幾何関数E(k,n)
1.18    ! takayama  931: @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.assert3}, @code{gtt_ekn.prob1}
1.8       takayama  932: @comment --- 索引用キーワード
                    933: @findex gtt_ekn.set_debug_level
1.15      takayama  934: @findex gtt_ekn.contiguity_mat_list_2
1.9       takayama  935: @findex gtt_ekn.show_path
1.12      takayama  936: @findex gtt_ekn.get_svalue
1.10      takayama  937: @findex gtt_ekn.assert1
                    938: @findex gtt_ekn.assert2
1.18    ! takayama  939: @findex gtt_ekn.assert3
1.11      takayama  940: @findex gtt_ekn.prob1
1.8       takayama  941:
                    942: @table @t
                    943: @item gtt_ekn.set_debug_level(@var{m}) debug メッセージのレベルを設定.
1.15      takayama  944: @item gtt_ekn.contiguity_mat_list_2  使用する contiguity を構成.
1.9       takayama  945: @item gtt_ekn.show_path()  どのように contiguity を適用したかの情報.
1.12      takayama  946: @item gtt_ekn.get_svalue()  static 変数の値を得る.
1.10      takayama  947: @item gtt_ekn.assert1(@var{N})  2x2 分割表で動作チェック.
                    948: @item gtt_ekn.assert2(@var{N})  3x3 分割表で動作チェック.
1.18    ! takayama  949: @item gtt_ekn.assert3(@var{R1}, @var{R2}, @var{Size})  R1 x R2 分割表で並列動作の動作チェック.
1.11      takayama  950: @item gtt_ekn.prob1(@var{R1},@var{R2},@var{Size})  R1 x R2 分割表用のテストデータを作る.
1.8       takayama  951: ::
                    952: @end table
                    953:
                    954: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
                    955: @table @var
                    956: @item  m  レベル.
                    957: @end table
                    958:
                    959: @comment --- ここで関数の詳しい説明 ---
                    960: @comment --- @itemize〜@end itemize は箇条書き ---
                    961: @comment --- @bullet は黒点付き ---
                    962: @itemize @bullet
                    963: @item (@var{m} & 0x1) == 0x1 の時 g_mat_fac_test_plain と g_mat_fac_itor の両方を呼び出し値を比較する (gtt_ekn.setup した状態で).
1.11      takayama  964: @item (@var{m} & 0x2) == 0x2 の時 g_mat_fac_test への引数を tmp-input-数.ab として保存.
1.8       takayama  965: @item (@var{m} & 0x4) == 0x4 の時 matrix factorial の計算の呼び出し引数を表示.
1.10      takayama  966: @item @var{N} は問題の周辺和のサイズ.
1.12      takayama  967: @item @code{get_svalue} の戻り値は @code{[Ekn_plist,Ekn_IDL,Ekn_debug,Ekn_mesg,XRule,ARule,Verbose,Ekn_Rq]} の値.
1.18    ! takayama  968: @item assert3 の options:  x=1, subprocess の window を表示. nps=m, m 個のプロセスで contiguity を求める (contiguity_mat_list_3).  crt, interval などは gmvector などと共通の
        !           969: option.  timing data を表示するには load("gtt_ekn3/ekn_eval-timing.rr"); しておく.
1.8       takayama  970: @end itemize
                    971:
                    972: @comment --- @example〜@end example は実行例の表示 ---
1.10      takayama  973: 例.
1.8       takayama  974: @example
                    975: [2846] gtt_ekn.set_debug_level(0x4);
                    976: [2847] N=2; T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]],
                    977:                                 [[1,(1-1/N)/56],[1,1]])$
                    978: [2848] level&0x4: g_mat_fac_test([ 113/112 ]
                    979: [ 1/112 ],[ (t+225/112)/(t^2+4*t+4) (111/112*t+111/112)/(t^2+4*t+4) ]
                    980: [ (1/112)/(t^2+4*t+4) (111/112*t+111/112)/(t^2+4*t+4) ],0,20,1,t)
                    981: Note: we do not use g_mat_fac_itor. Call gtt_ekn.setup(); to use the crt option.
                    982: level&0x4: g_mat_fac_test([ 67/62944040755546030080000 ]
                    983: [ 1/125888081511092060160000 ],[ (t+24)/(t^2+25*t+46) (2442)/(t^2+25*t+46) ]
                    984: [ (1)/(t^2+25*t+46) (-111*t-111)/(t^2+25*t+46) ],0,73,1,t)
                    985: level&0x4: g_mat_fac_test ------  snip
                    986: @end example
                    987:
1.10      takayama  988: 例.
1.9       takayama  989: @example
                    990: [2659] gtt_ekn.nc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]])$
                    991: [2660] L=matrix_transpose(gtt_ekn.show_path())$
                    992: [2661] L[2];
                    993: [1 4 3 2]
                    994: @end example
1.10      takayama  995: [1 4 3 2] の index をもつパラメーター alpha の方向の contigity を求めそれを掛けて
1.9       takayama  996: 計算したことがわかる.  L[0] は用いた contiguity の行列.
1.10      takayama  997: L[1] はcontiguity を適用する step 数.
                    998:
                    999: 例. 値を計算せずに path のみ求めたい場合.
                   1000: @example
                   1001: A=gtt_ekn.marginaltoAlpha_list([[400,410,1011],[910,411,500]])$
                   1002: [2666] gtt_ekn.contiguity_mat_list_2(A,2,2)$
                   1003: [2667] L=matrix_transpose(gtt_ekn.show_path())$
                   1004: [2668] L[2];
                   1005: [ 2 1 5 4 3 ]
                   1006: @end example
                   1007:
1.15      takayama 1008: 例. 値を計算せずに path のみ求めたい場合.
                   1009: gtt_ekn3 による新しいアルゴリズムによる path の表示.
                   1010: @example
                   1011: A=gtt_ekn3.marginaltoAlpha_list([[10,20],[15,15]])$
                   1012: [2666] gtt_ekn3.contiguity_mat_list_3(A,1,1 | xrule=[[x_1_1,1/2]])$
                   1013: [t,[[ (-t-43/2)/(t-2) (-15/2)/(t-2) ]
                   1014: [ 1/2 -1/2 ],-9]]
                   1015: @end example
                   1016:
1.10      takayama 1017: 例. 0 が戻れば g_mat_fac_plain と指定した計算方法の結果が一致したことがわかる.
                   1018: option を書かないと g_mat_fac_int との比較となる.
                   1019: @example
                   1020: [8859] gtt_ekn.assert2(1);
                   1021: Marginal=[[130,170,353],[90,119,444]]
                   1022: P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]]
                   1023: Try g_mat_fac_test_int: Note: we do not use g_mat_fac_itor. Call gtt_ekn.setup(); to use the crt option.
                   1024: Timing (int) =0.413916 (CPU) + 0.590723 (GC) = 1.00464 (total), real time=0.990672
                   1025:
                   1026: Try g_mat_fac_test_plain: Note: we do not use g_mat_fac_itor. Call gtt_ekn.setup(); to use the crt option.
                   1027: Timing (rational) =4.51349 (CPU) + 6.32174 (GC) = 10.8352 (total)
                   1028: diff of both method =
                   1029: [ 0 0 0 ]
                   1030: [ 0 0 0 ]
                   1031: [ 0 0 0 ]
                   1032: [8860]
                   1033:
                   1034: [8863] gtt_ekn.setup(|nprm=100,minp=10^50);
                   1035: Number of processes = 1.
                   1036: Number of primes = 100.
                   1037: Min of plist = 100000000000000000000000000000000000000000000000151.
                   1038: 0
                   1039: [8864] gtt_ekn.assert2(1 | crt=1);
                   1040: Marginal=[[130,170,353],[90,119,444]]
                   1041: P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]]
                   1042: Try [[crt,1]]
                   1043: ----  snip
                   1044: @end example
                   1045: なお二番目の例の timing (total) [例では省略] は mod 計算を subprocess がやっているので正しい値ではない. real time が計算時間の目安になる.
1.9       takayama 1046:
1.11      takayama 1047: 例.
                   1048: @example
1.17      takayama 1049: 3x5 分割表. 周辺和は 10 に比例する一定の数(factor option も関係. ソースを参照).
                   1050: cell 確率は1/素数で生成される.
                   1051: @comment grep testnxn ekn/Prog2/*.rr ; grep test_nxn ekn/Prog2/*.rr も見よ.
1.11      takayama 1052: [9054] L=gtt_ekn.prob1(3,5,10 | factor=1, factor_row=3);
                   1053: [[[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]]]
                   1054: [9055] number_eval(gtt_ekn.expectation(L[0],L[1]));
                   1055: [ 0.434161208918863  ... snip ]
                   1056: @end example
                   1057:
1.18    ! takayama 1058: 例:
        !          1059: @example
        !          1060: [5779] import("gtt_ekn3.rr"); load("gtt_ekn3/ekn_eval-timing.rr");
        !          1061: [5780] gtt_ekn3.assert3(5,5,100 | nps=32, interval=100);
        !          1062:  -- snip
        !          1063: Parallel method: Number of process=32, File name tmp-gtt_ekn3/p300.txt is written.
        !          1064: Number of processes = 32.
        !          1065:   -- snip
        !          1066: initialPoly of path=3: [ 2.184 0 124341044 2.1831 ] [CPU(s),0,*,real(s)]
        !          1067: contiguity_mat_list_3 of path=3: [ 0.04 0 630644 9.6774 ] [CPU(s),0,*,real(s)]
        !          1068: Note: interval option will lead faster evaluation. We do not use g_mat_fac_itor (crt). Call gtt_ekn3.setup(); to use the crt option.
        !          1069: g_mat_fac of path=3: [ 21.644 0 1863290168 21.6457 ] [CPU(s),0,*,real(s)]
        !          1070: Done. Saved in 2.ab
        !          1071: Diff (should be 0)=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,..., 0,0,0]
        !          1072: @end example
        !          1073:
1.8       takayama 1074: @comment --- 参照(リンク)を書く ---
                   1075: @table @t
                   1076: @item 参照
                   1077: @ref{gtt_ekn.nc}
                   1078: @end table
                   1079:
                   1080: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
                   1081: @noindent
                   1082: ChangeLog
                   1083: @itemize @bullet
                   1084: @item  gtt_ekn/ekn_eval.rr で matrix factorial の計算の呼び出し引数を表示する.
                   1085: @item grep 'iand(Ekn_debug,0x1)' *.rr でソースコードの該当の位置をさがす.
                   1086: @end itemize
                   1087: @comment end set_debug_level
                   1088:
1.5       takayama 1089:
                   1090:
1.6       takayama 1091: @node modular計算,,, 2元分割表HGMの関数
                   1092: @chapter modular計算
1.4       takayama 1093:
                   1094: @menu
                   1095: * gtt_ekn.chinese_itor::
                   1096: @end menu
                   1097:
1.6       takayama 1098: @node 中国剰余定理とitor,,, modular計算
                   1099: @section 中国剰余定理とitor
1.4       takayama 1100:
                   1101: @comment **********************************************************
1.6       takayama 1102: @comment --- ◯◯◯◯  の説明
                   1103: @comment --- 個々の関数の説明の開始 ---
                   1104: @comment --- section 名を正確に ---
1.4       takayama 1105: @node gtt_ekn.chinese_itor,,,
                   1106: @subsection @code{gtt_ekn.chinese_itor}
1.6       takayama 1107: @comment --- 索引用キーワード
                   1108: @findex gtt_ekn.chinese_itor 中国剰余定理とitor
1.4       takayama 1109:
                   1110: @table @t
                   1111: @item gtt_ekn.chinese_itor(@var{data},@var{idlist})
1.6       takayama 1112: :: mod p で計算した結果(ベクトル)から chinese remainder theorem, itor(integer to rational) で有理数ベクトルを得る.
1.4       takayama 1113: @end table
                   1114:
1.6       takayama 1115: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.4       takayama 1116: @table @var
1.6       takayama 1117: @item return  [val, n]  ここで val は答え. また, n = n1*n2*...
                   1118: @item data   [[val1,n1],[val2,n2], ...], ここで val mod n1 = val1, val mod n2 = val2,...
                   1119: @item idlist  chinese, itor を実行するサーバIDのリスト.
1.4       takayama 1120: @end table
                   1121:
1.6       takayama 1122: @comment --- ここで関数の詳しい説明 ---
                   1123: @comment --- @itemize〜@end itemize は箇条書き ---
                   1124: @comment --- @bullet は黒点付き ---
1.4       takayama 1125: @itemize @bullet
1.6       takayama 1126: @item 中国剰余定理を用いて val0 mod n1 = val1, val0 mod n2 = val2, ... となる val0 を求める. val に algorithm itor を適用する.
                   1127: @item sqrt(n) より val0 が大きい時は itor が適用されて val0 が有理数 val=a/b に変換される. つまり b*x =1 mod n となる逆数 x を考えて, x*a % n = val0 となる数 val を戻す. 見つからないときは failure を戻す.
1.4       takayama 1128: @end itemize
                   1129:
1.6       takayama 1130: @comment --- @example〜@end example は実行例の表示 ---
                   1131: 例: [3!, 5^3*3!]=[6,750] が戻り値.
                   1132: 6 mod 109 =6, 750 mod 109=96 が最初の引数の [[6,96],109]. 以下同様.
1.4       takayama 1133: @example
                   1134: gtt_ekn.setup(|nps=2,nprm=3,minp=101,fgp="p_small.txt");
                   1135: SS=gtt_ekn.get_svalue();
                   1136: SS[0];
                   1137:   [103,107,109]   // list of primes
                   1138: SS[1];
                   1139:   [0,2]           // list of server ID's
                   1140: gtt_ekn.chinese_itor([[[ 6,96 ],109],[[ 6,29 ],103],[[ 6,1 ],107]],SS[1]);
                   1141:   [[ 6 750 ],1201289]
                   1142:
1.6       takayama 1143: // 引数はスカラーでもよい.
1.4       takayama 1144: gtt_ekn.chinese_itor([[96,109],[29,103]],SS[1]);
                   1145:   [[ 750 ],11227]
                   1146: @end example
                   1147:
                   1148:
1.6       takayama 1149: @comment --- @example〜@end example は実行例の表示 ---
                   1150: 例: gtt_ekn/childprocess.rr (server で実行される) の関数 chinese (chinese remainder theorem) と euclid.
1.4       takayama 1151: @example
                   1152: load("gtt_ekn/childprocess.rr");
                   1153: chinese([newvect(2,[6,29]),103],[newvect(2,[6,750]),107*109]);
1.6       takayama 1154:   // mod 103 で [6,29], mod (107*109) で [6,750] となる数を mod 103*(107*109)
                   1155:   // で求めると,
1.4       takayama 1156:   [[ 6 750 ],1201289]
1.6       takayama 1157: euclid(3,103);  // mod 103 での 3 の逆数. つまり 1/3
1.4       takayama 1158:   -34
1.6       takayama 1159: 3*(-34) % 103; // 確かに逆数.
1.4       takayama 1160:    1
                   1161: @end example
                   1162:
1.6       takayama 1163: @comment --- @example〜@end example は実行例の表示 ---
                   1164: 例: gtt_ekn/childprocess.rr (server で実行される) の関数 itor (integer to rational) の例.
                   1165: itor(Y,Q,Q2,Idx) では Y < Q2 なら Y がそのまま戻る.  Idx は 内部用の index で好きな数でよい. 戻り値の第2成分となる.
1.4       takayama 1166: @example
                   1167: load("gtt_ekn/childprocess.rr");
                   1168: for (I=1;I<11; I++) print([I,itor(I,11,3,0)]);
                   1169: [1,[1,0]]
                   1170: [2,[2,0]]
1.6       takayama 1171: [3,[-2/3,0]] //euclid(3,11); ->4,  4*(-2)%11 -> 3 なので確かに -2/3 は元の数の候補
1.4       takayama 1172: [4,[failure,0]]
                   1173: [5,[-1/2,0]]
                   1174: [6,[1/2,0]]
                   1175: [7,[-1/3,0]]
                   1176: [8,[failure,0]]
                   1177: [9,[-2,0]]
                   1178: [10,[-1,0]]
                   1179: @end example
                   1180:
                   1181:
1.6       takayama 1182: @comment --- 参照(リンク)を書く ---
1.4       takayama 1183: @table @t
1.6       takayama 1184: @item 参照
1.4       takayama 1185: @ref{gtt_ekn.setup}
                   1186: @end table
                   1187:
1.6       takayama 1188: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.4       takayama 1189: @noindent
                   1190: ChangeLog
                   1191: @itemize @bullet
                   1192: @item
1.6       takayama 1193:  関連ファイルは
1.4       takayama 1194:  gtt_ekn/g_mat_fac.rr
                   1195:  gtt_ekn/childprocess.rr
                   1196: @end itemize
                   1197:
1.14      takayama 1198: @node binary splitting,,, 2元分割表HGMの関数
                   1199: @chapter binary splitting
                   1200:
                   1201: @menu
                   1202: * gtt_ekn3.init_dm_bsplit::
                   1203: * gtt_ekn3.setup_dm_bsplit::
                   1204: * gtt_ekn3.init_bsplit::
                   1205: @end menu
                   1206:
                   1207: @node matrix factorial,,, binary splitting
                   1208: @section matrix factorial
                   1209:
                   1210: @comment **********************************************************
                   1211: @comment --- ◯◯◯◯  の説明
                   1212: @comment --- 個々の関数の説明の開始 ---
                   1213: @comment --- section 名を正確に ---
                   1214: @node gtt_ekn3.init_bsplit,,,
                   1215: @node gtt_ekn3.init_dm_bsplit,,,
                   1216: @node gtt_ekn3.setup_dm_bsplit,,,
                   1217: @subsection @code{gtt_ekn3.init_bsplit, gtt_ekn3.init_dm_bsplit, gtt_ekn3.setup_dm_bsplit}
                   1218: @comment --- 索引用キーワード
                   1219: @findex gtt_ekn3.init_dm_bsplit matrix factorial
                   1220: @findex gtt_ekn3.setup_dm_bsplit matrix factorial
                   1221: @findex gtt_ekn3.init_bsplit matrix factorial
                   1222:
                   1223: @table @t
                   1224: @item gtt_ekn3.init_bsplit(|minsize=16,levelmax=1);
                   1225: :: binary split の実行のためのパラメータを設定する.
                   1226: @item gtt_ekn3.init_dm_bsplit(|bsplit_x=0, bsplit_reduce=0)
                   1227: :: binary split の分散実行のためのパラメータを設定する.
                   1228: @item gtt_ekn3.setup_dm_bsplit(C)
                   1229: :: binary split の分散実行のために C 個のプロセスを立ち上げる.
                   1230: @end table
                   1231:
                   1232: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
                   1233: @table @var
1.15      takayama 1234: @item C はlevelmax-1 に設定する. 特に levalmax=1 のときは分散計算を行わない.
                   1235: @item bsplit_x=1 のとき, debug 用に各プロセスを xterm で表示.
1.14      takayama 1236: @end table
                   1237:
                   1238: @comment --- ここで関数の詳しい説明 ---
                   1239: @comment --- @itemize〜@end itemize は箇条書き ---
                   1240: @comment --- @bullet は黒点付き ---
                   1241: @itemize @bullet
                   1242: @item expectation などの関数に bs=1 オプションを与えると matrix factorial を binary
                   1243: splitting method で計算する.
                   1244: @end itemize
                   1245:
                   1246: @comment --- @example〜@end example は実行例の表示 ---
1.15      takayama 1247: 例: bs=1 と無い場合の比較.
1.14      takayama 1248: @example
                   1249: [4618] cputime(1)$
                   1250: [4619] gtt_ekn3.expectation(Marginal=[[1950,2550,5295],[1350,1785,6660]],
                   1251:                           P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]]|bs=1)$
                   1252: 4.912sec(4.914sec)
                   1253: [4621] V2=gtt_ekn3.expectation(Marginal=[[1950,2550,5295],[1350,1785,6660]],
                   1254:                           P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]])$
                   1255: 6.752sec(6.756sec)
                   1256: @end example
                   1257:
                   1258:
                   1259: @comment --- @example〜@end example は実行例の表示 ---
1.15      takayama 1260: 例: 分散計算する場合.
                   1261: 分散計算はかえって遅くなる場合が多いので注意.
                   1262: 下記の例での bsplit_x=1 option は
                   1263: debug windows を開くのでさらに遅くなる.
                   1264: gtt_ekn3.test_bs_dist(); でもテストできる.
1.14      takayama 1265: @example
1.15      takayama 1266: [3669] C=4$ gtt_ekn3.init_bsplit(|minsize=16,levelmax=C+1)$ gtt_ekn3.init_dm_bsplit(|bsplit_x=1)$
1.14      takayama 1267: [3670] [3671] [3672] gtt_ekn3.setup_dm_bsplit(C);
                   1268: [0,0]
                   1269: [3673] gtt_ekn3.assert2(10|bs=1)$
                   1270: @end example
                   1271:
                   1272: @comment --- 参照(リンク)を書く ---
                   1273: @table @t
                   1274: @item 参照
                   1275: @ref{gtt_ekn3.gmvector}
                   1276: @ref{gtt_ekn3.expectation}
                   1277: @ref{gtt_ekn3.assert1}
                   1278: @ref{gtt_ekn3.assert2}
                   1279: @end table
                   1280:
                   1281: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
                   1282: @noindent
                   1283: ChangeLog
                   1284: @itemize @bullet
                   1285: @item
                   1286:  関連ファイルは
                   1287:  gtt_ekn3/mfac_bs.rr
                   1288:  gtt_ekn3/dm_bsplit.rr
                   1289: @end itemize
                   1290:
1.4       takayama 1291:
1.1       takayama 1292:
1.6       takayama 1293: @comment --- おまじない ---
1.1       takayama 1294: @node Index,,, Top
                   1295: @unnumbered Index
                   1296: @printindex fn
                   1297: @printindex cp
                   1298: @iftex
                   1299: @vfill @eject
                   1300: @end iftex
                   1301: @summarycontents
                   1302: @contents
                   1303: @bye
1.6       takayama 1304: @comment --- おまじない終り ---
1.1       takayama 1305:
                   1306:
1.6       takayama 1307: @comment テンプレート.  start_of_template.
1.5       takayama 1308: @comment **********************************************************
1.6       takayama 1309: @comment --- ◯◯◯◯  の説明
                   1310: @comment --- 個々の関数の説明の開始 ---
                   1311: @comment --- section 名を正確に ---
                   1312: @node gtt_ekn.hoge,,, 超幾何関数E(k,n)
1.5       takayama 1313: @subsection @code{gtt_ekn.hoge}
1.6       takayama 1314: @comment --- 索引用キーワード
1.5       takayama 1315: @findex gtt_ekn.hoge
                   1316:
                   1317: @table @t
                   1318: @item gtt_ekn.hoge(@var{i})
                   1319: ::
                   1320: @end table
                   1321:
1.6       takayama 1322: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.5       takayama 1323: @table @var
                   1324: @item i  hage
                   1325: @item return
                   1326: @end table
                   1327:
1.6       takayama 1328: @comment --- ここで関数の詳しい説明 ---
                   1329: @comment --- @itemize〜@end itemize は箇条書き ---
                   1330: @comment --- @bullet は黒点付き ---
1.5       takayama 1331: @itemize @bullet
1.6       takayama 1332: @item 説明.
1.5       takayama 1333: @end itemize
                   1334:
1.6       takayama 1335: @comment --- @example〜@end example は実行例の表示 ---
                   1336: 例:
1.5       takayama 1337: @example
                   1338: [2221] gtt_ekn.hoge([[1,4],[2,3]]);
                   1339: @end example
                   1340:
                   1341:
1.6       takayama 1342: @comment --- 参照(リンク)を書く ---
1.5       takayama 1343: @table @t
1.6       takayama 1344: @item 参照
1.5       takayama 1345: @ref{gtt_ekn.nc}
                   1346: @ref{gtt_ekn.gmvector}
                   1347: @end table
                   1348:
1.6       takayama 1349: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.5       takayama 1350: @noindent
                   1351: ChangeLog
                   1352: @itemize @bullet
                   1353: @item
                   1354: @end itemize
                   1355: @comment end_of_template
                   1356:
                   1357:
1.6       takayama 1358: // 2 x m 分割表において似た機能を有する関数の利用例を参考までに記載する;
                   1359: // 正規化定数とその微分関連.
                   1360: // その1.
1.1       takayama 1361: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                   1362: [-4,[-4,-3],-1]
                   1363: [3078] tk_fd.ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                   1364: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                   1365: [ 1 1 1 ]
                   1366: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                   1367: [4483/124416,[[353/7776,1961/15552,185/1728],[553/20736,1261/15552,1001/13824]]]
1.6       takayama 1368: // 戻値は [Z, [[d_11 Z, d_12 Z, d_13 Z],[d_21 Z, d_22 Z, d_23 Z]]] の値.
1.1       takayama 1369:
1.6       takayama 1370: // その2.
1.1       takayama 1371: [3079] tk_fd.log_ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                   1372: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                   1373: [ 1 1 1 ]
                   1374: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                   1375: [-3.32333832422461674639485797719209322217260539267246045320,
                   1376:  [[1.25987062235110417131385233102832924380994869507026544724,3.49944233772027660049074280615659156814633058219942003122,2.97122462636627258532232879768012491635065804149007361142],
                   1377:   [0.740129377648895828686147668971670756190051304929734552754,2.25027883113986169975462859692170421592683470890028998438,2.00959179121124247155922373410662502788311398616997546285]]]
1.6       takayama 1378: // 戻値は [log(Z),
1.1       takayama 1379: //          [[d_11 log(Z), d_12 log(Z), d_13 log(Z)],
                   1380: //           [d_21 log(Z), d_22 log(Z), d_23 log(Z)]]]
1.6       takayama 1381: // の近似値.
1.1       takayama 1382:
1.6       takayama 1383: // その3.
1.1       takayama 1384: [3082] fd_hessian2(A[0],A[1],A[2],[1/2,1/3]);
                   1385: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                   1386: [4483/124416,[ 1961/15552 185/1728 ],
                   1387:  [ 79/288 259/864 ]
                   1388:  [ 259/864 47/288 ]]
1.6       takayama 1389: // 戻値は [F=F_D, gradient(F), Hessian(F)]
1.1       takayama 1390:
1.6       takayama 1391: // 参考.
                   1392: // ygahvec で巾関数分の調整. 独立した関数はないようだ.
1.1       takayama 1393:
                   1394: //-----------------------------------------------------------------------
1.6       takayama 1395: // 2 x m 分割表において似た機能を有する関数の利用例を参考までに記載する;
                   1396: // 期待値関連.
1.1       takayama 1397: [3079] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                   1398: [-4,[-4,-3],-1]
                   1399: [3080] tk_fd.expectation_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                   1400: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                   1401: [ 1 1 1 ]
                   1402: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                   1403: [[5648/4483,7844/4483,4440/4483],
                   1404:  [3318/4483,10088/4483,9009/4483]]
1.6       takayama 1405: // 各セルの期待値.
1.1       takayama 1406:
                   1407: //-----------------------------------------------------------------------
1.6       takayama 1408: // ot_hgm_ahg.rr の例.  実験的なため module 化されていない.
1.1       takayama 1409: [3237] import("ot_hgm_ahg.rr");
1.6       takayama 1410: // 2 x 2 分割表.
1.1       takayama 1411: [3238] hgm_ahg_expected_values_contiguity([[0,0,1,1],[1,0,1,0],[0,1,0,1]],
                   1412:         [9,6,8],[1/2,1/3,1/5,1/7],[x1,x2,x3,x4]|geometric=1);
                   1413: oohg_native=0, oohg_curl=1
                   1414: [1376777025/625400597,1750225960/625400597,2375626557/625400597,3252978816/625400597]
1.6       takayama 1415: // 2 x 2 分割表の期待値.
1.1       takayama 1416:
1.6       takayama 1417: // 2 x 3 分割表.
1.1       takayama 1418: [3238] hgm_ahg_expected_values_contiguity(
                   1419:  [[0,0,0,1,1,1],[1,0,0,1,0,0],[0,1,0,0,1,0],[0,0,1,0,0,1]],
                   1420:  [5,2,4,3],[1,1/2,1/3,1,1,1],[x1,x2,x3,x4,x5,x6]|geometric=1);
                   1421: [5648/4483,7844/4483,4440/4483,3318/4483,10088/4483,9009/4483]
1.6       takayama 1422: // 2 x 3 分割表の期待値. 上と同じ問題.
1.1       takayama 1423:
                   1424: /*
1.6       takayama 1425:   dojo, p.221.  成績3以下の生徒は集めてひとつに.
1.1       takayama 1426:   2 1 1
                   1427:   8 3 3
                   1428:   0 2 6
                   1429:
                   1430:   row sum: 4,14,8
                   1431:   column sum: 10,6,10
1.6       takayama 1432:   0 を一つ含むので, (3,6) 型の A から 7 列目を抜く.
1.1       takayama 1433: */
1.6       takayama 1434: // 3 x 3 分割表. 構造的0が一つ.
1.1       takayama 1435:
                   1436: A=[[0,0,0,1,1,1, 0,0],
                   1437:    [0,0,0,0,0,0, 1,1],
                   1438:    [1,0,0,1,0,0, 0,0],
                   1439:    [0,1,0,0,1,0, 1,0],
                   1440:    [0,0,1,0,0,1, 0,1]];
                   1441: B=[14,8,10,6,10];
                   1442: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1],[x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
                   1443:
1.6       takayama 1444: // 答.
1.1       takayama 1445: [14449864949304/9556267369631,10262588586540/9556267369631,13512615942680/9556267369631,
                   1446:  81112808747006/9556267369631,21816297744346/9556267369631,30858636683482/9556267369631,
                   1447:                               25258717886900/9556267369631,51191421070148/9556267369631]
                   1448:
                   1449:
                   1450: /*
1.6       takayama 1451:  上のデータで 0 を 1 に変更.
1.1       takayama 1452:   2 1 1
                   1453:   8 3 3
                   1454:   1 2 6
                   1455:
                   1456:   row sum: 4,14,9
                   1457:   column sum: 11,6,10
                   1458: */
1.6       takayama 1459: // 3 x 3 分割表.
1.1       takayama 1460: A=[[0,0,0,1,1,1,0,0,0],
                   1461:    [0,0,0,0,0,0,1,1,1],
                   1462:    [1,0,0,1,0,0,1,0,0],
                   1463:    [0,1,0,0,1,0,0,1,0],
                   1464:    [0,0,1,0,0,1,0,0,1]];
                   1465: B=[14,9,11,6,10];
                   1466: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1,1],[x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
                   1467:
1.6       takayama 1468: // 期待値, 答.
1.1       takayama 1469: [207017568232262040/147000422096729819,163140751505489940/147000422096729819,217843368649167296/147000422096729819,
                   1470:  1185482401011137878/147000422096729819,358095302885438604/147000422096729819,514428205457640984/147000422096729819,
                   1471:  224504673820628091/147000422096729819,360766478189450370/147000422096729819]
                   1472:
1.6       takayama 1473: // Z やその微分の計算は hgm_ahg_contiguity 関数がおこなうが, これの簡易インターフェースは
                   1474: // まだ書いてない.
1.1       takayama 1475:
                   1476:
1.6       takayama 1477: 4. x_ij は [GM2016] の1章で,
                   1478:  たとえば 3x3 の時 [[1,1,1],[x_11,x_12,1],[x_21,x_22,1]]
                   1479: となっているが, [GM2016] の Prop 7.1 の対応では,
                   1480:    p = [[1,x_11,x_12],[1,x_21,x_22],[1,1,1]] となっているので注意.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>